mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-30 23:51:03 +01:00 
			
		
		
		
	types/authkey: include user object in response (#2542)
* types/authkey: include user object, not string Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> * make preauthkeys use id Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> * changelog Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> * integration: wire up user id for auth keys Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> --------- Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
		
							parent
							
								
									f1206328dc
								
							
						
					
					
						commit
						8f9fbf16f1
					
				| @ -76,6 +76,13 @@ working in v1 and not tested might be broken in v2 (and vice versa). | |||||||
| - Disallow `server_url` and `base_domain` to be equal | - Disallow `server_url` and `base_domain` to be equal | ||||||
|   [#2544](https://github.com/juanfont/headscale/pull/2544) |   [#2544](https://github.com/juanfont/headscale/pull/2544) | ||||||
| 
 | 
 | ||||||
|  | #### Other breaking changes | ||||||
|  | 
 | ||||||
|  | - Return full user in API for pre auth keys instead of string | ||||||
|  |   [#2542](https://github.com/juanfont/headscale/pull/2542) | ||||||
|  | - Pre auth key API/CLI now uses ID over username | ||||||
|  |   [#2542](https://github.com/juanfont/headscale/pull/2542) | ||||||
|  | 
 | ||||||
| ### Changes | ### Changes | ||||||
| 
 | 
 | ||||||
| - Use Go 1.24 [#2427](https://github.com/juanfont/headscale/pull/2427) | - Use Go 1.24 [#2427](https://github.com/juanfont/headscale/pull/2427) | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ const ( | |||||||
| 
 | 
 | ||||||
| func init() { | func init() { | ||||||
| 	rootCmd.AddCommand(preauthkeysCmd) | 	rootCmd.AddCommand(preauthkeysCmd) | ||||||
| 	preauthkeysCmd.PersistentFlags().StringP("user", "u", "", "User") | 	preauthkeysCmd.PersistentFlags().Uint64P("user", "u", 0, "User identifier (ID)") | ||||||
| 
 | 
 | ||||||
| 	preauthkeysCmd.PersistentFlags().StringP("namespace", "n", "", "User") | 	preauthkeysCmd.PersistentFlags().StringP("namespace", "n", "", "User") | ||||||
| 	pakNamespaceFlag := preauthkeysCmd.PersistentFlags().Lookup("namespace") | 	pakNamespaceFlag := preauthkeysCmd.PersistentFlags().Lookup("namespace") | ||||||
| @ -57,7 +57,7 @@ var listPreAuthKeys = &cobra.Command{ | |||||||
| 	Run: func(cmd *cobra.Command, args []string) { | 	Run: func(cmd *cobra.Command, args []string) { | ||||||
| 		output, _ := cmd.Flags().GetString("output") | 		output, _ := cmd.Flags().GetString("output") | ||||||
| 
 | 
 | ||||||
| 		user, err := cmd.Flags().GetString("user") | 		user, err := cmd.Flags().GetUint64("user") | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			ErrorOutput(err, fmt.Sprintf("Error getting user: %s", err), output) | 			ErrorOutput(err, fmt.Sprintf("Error getting user: %s", err), output) | ||||||
| 		} | 		} | ||||||
| @ -112,7 +112,7 @@ var listPreAuthKeys = &cobra.Command{ | |||||||
| 			aclTags = strings.TrimLeft(aclTags, ",") | 			aclTags = strings.TrimLeft(aclTags, ",") | ||||||
| 
 | 
 | ||||||
| 			tableData = append(tableData, []string{ | 			tableData = append(tableData, []string{ | ||||||
| 				key.GetId(), | 				strconv.FormatUint(key.GetId(), 64), | ||||||
| 				key.GetKey(), | 				key.GetKey(), | ||||||
| 				strconv.FormatBool(key.GetReusable()), | 				strconv.FormatBool(key.GetReusable()), | ||||||
| 				strconv.FormatBool(key.GetEphemeral()), | 				strconv.FormatBool(key.GetEphemeral()), | ||||||
| @ -141,7 +141,7 @@ var createPreAuthKeyCmd = &cobra.Command{ | |||||||
| 	Run: func(cmd *cobra.Command, args []string) { | 	Run: func(cmd *cobra.Command, args []string) { | ||||||
| 		output, _ := cmd.Flags().GetString("output") | 		output, _ := cmd.Flags().GetString("output") | ||||||
| 
 | 
 | ||||||
| 		user, err := cmd.Flags().GetString("user") | 		user, err := cmd.Flags().GetUint64("user") | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			ErrorOutput(err, fmt.Sprintf("Error getting user: %s", err), output) | 			ErrorOutput(err, fmt.Sprintf("Error getting user: %s", err), output) | ||||||
| 		} | 		} | ||||||
| @ -206,7 +206,7 @@ var expirePreAuthKeyCmd = &cobra.Command{ | |||||||
| 	}, | 	}, | ||||||
| 	Run: func(cmd *cobra.Command, args []string) { | 	Run: func(cmd *cobra.Command, args []string) { | ||||||
| 		output, _ := cmd.Flags().GetString("output") | 		output, _ := cmd.Flags().GetString("output") | ||||||
| 		user, err := cmd.Flags().GetString("user") | 		user, err := cmd.Flags().GetUint64("user") | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			ErrorOutput(err, fmt.Sprintf("Error getting user: %s", err), output) | 			ErrorOutput(err, fmt.Sprintf("Error getting user: %s", err), output) | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | // Code generated by protoc-gen-go. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // 	protoc-gen-go v1.36.5 | // 	protoc-gen-go v1.36.6 | ||||||
| // 	protoc        (unknown) | // 	protoc        (unknown) | ||||||
| // source: headscale/v1/apikey.proto | // source: headscale/v1/apikey.proto | ||||||
| 
 | 
 | ||||||
| @ -428,53 +428,33 @@ func (*DeleteApiKeyResponse) Descriptor() ([]byte, []int) { | |||||||
| 
 | 
 | ||||||
| var File_headscale_v1_apikey_proto protoreflect.FileDescriptor | var File_headscale_v1_apikey_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_headscale_v1_apikey_proto_rawDesc = string([]byte{ | const file_headscale_v1_apikey_proto_rawDesc = "" + | ||||||
| 	0x0a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, | 	"\n" + | ||||||
| 	0x70, 0x69, 0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x68, 0x65, 0x61, | 	"\x19headscale/v1/apikey.proto\x12\fheadscale.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"\xe0\x01\n" + | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, | 	"\x06ApiKey\x12\x0e\n" + | ||||||
| 	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, | 	"\x02id\x18\x01 \x01(\x04R\x02id\x12\x16\n" + | ||||||
| 	0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe0, 0x01, 0x0a, 0x06, 0x41, | 	"\x06prefix\x18\x02 \x01(\tR\x06prefix\x12:\n" + | ||||||
| 	0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, | 	"\n" + | ||||||
| 	0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, | 	"expiration\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\n" + | ||||||
| 	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x3a, 0x0a, | 	"expiration\x129\n" + | ||||||
| 	0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, | 	"\n" + | ||||||
| 	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | 	"created_at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x127\n" + | ||||||
| 	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, | 	"\tlast_seen\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\blastSeen\"Q\n" + | ||||||
| 	0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, | 	"\x13CreateApiKeyRequest\x12:\n" + | ||||||
| 	0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, | 	"\n" + | ||||||
| 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, | 	"expiration\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\n" + | ||||||
| 	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, | 	"expiration\"/\n" + | ||||||
| 	0x65, 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, | 	"\x14CreateApiKeyResponse\x12\x17\n" + | ||||||
| 	0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, | 	"\aapi_key\x18\x01 \x01(\tR\x06apiKey\"-\n" + | ||||||
| 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, | 	"\x13ExpireApiKeyRequest\x12\x16\n" + | ||||||
| 	0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x22, 0x51, 0x0a, | 	"\x06prefix\x18\x01 \x01(\tR\x06prefix\"\x16\n" + | ||||||
| 	0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, | 	"\x14ExpireApiKeyResponse\"\x14\n" + | ||||||
| 	0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, | 	"\x12ListApiKeysRequest\"F\n" + | ||||||
| 	0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, | 	"\x13ListApiKeysResponse\x12/\n" + | ||||||
| 	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, | 	"\bapi_keys\x18\x01 \x03(\v2\x14.headscale.v1.ApiKeyR\aapiKeys\"-\n" + | ||||||
| 	0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, | 	"\x13DeleteApiKeyRequest\x12\x16\n" + | ||||||
| 	0x22, 0x2f, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, | 	"\x06prefix\x18\x01 \x01(\tR\x06prefix\"\x16\n" + | ||||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x70, 0x69, 0x5f, | 	"\x14DeleteApiKeyResponseB)Z'github.com/juanfont/headscale/gen/go/v1b\x06proto3" | ||||||
| 	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x70, 0x69, 0x4b, 0x65, |  | ||||||
| 	0x79, 0x22, 0x2d, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, |  | ||||||
| 	0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, |  | ||||||
| 	0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, |  | ||||||
| 	0x22, 0x16, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, |  | ||||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, |  | ||||||
| 	0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x46, |  | ||||||
| 	0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, |  | ||||||
| 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, |  | ||||||
| 	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, |  | ||||||
| 	0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x61, |  | ||||||
| 	0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, |  | ||||||
| 	0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, |  | ||||||
| 	0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, |  | ||||||
| 	0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, |  | ||||||
| 	0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x29, 0x5a, |  | ||||||
| 	0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, |  | ||||||
| 	0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, |  | ||||||
| 	0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, |  | ||||||
| }) |  | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	file_headscale_v1_apikey_proto_rawDescOnce sync.Once | 	file_headscale_v1_apikey_proto_rawDescOnce sync.Once | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | // Code generated by protoc-gen-go. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // 	protoc-gen-go v1.36.5 | // 	protoc-gen-go v1.36.6 | ||||||
| // 	protoc        (unknown) | // 	protoc        (unknown) | ||||||
| // source: headscale/v1/device.proto | // source: headscale/v1/device.proto | ||||||
| 
 | 
 | ||||||
| @ -756,130 +756,71 @@ func (x *EnableDeviceRoutesResponse) GetAdvertisedRoutes() []string { | |||||||
| 
 | 
 | ||||||
| var File_headscale_v1_device_proto protoreflect.FileDescriptor | var File_headscale_v1_device_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_headscale_v1_device_proto_rawDesc = string([]byte{ | const file_headscale_v1_device_proto_rawDesc = "" + | ||||||
| 	0x0a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, | 	"\n" + | ||||||
| 	0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x68, 0x65, 0x61, | 	"\x19headscale/v1/device.proto\x12\fheadscale.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"F\n" + | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, | 	"\aLatency\x12\x1d\n" + | ||||||
| 	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, | 	"\n" + | ||||||
| 	0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x46, 0x0a, 0x07, 0x4c, 0x61, | 	"latency_ms\x18\x01 \x01(\x02R\tlatencyMs\x12\x1c\n" + | ||||||
| 	0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, | 	"\tpreferred\x18\x02 \x01(\bR\tpreferred\"\x91\x01\n" + | ||||||
| 	0x5f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x61, 0x74, 0x65, 0x6e, | 	"\x0eClientSupports\x12!\n" + | ||||||
| 	0x63, 0x79, 0x4d, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, | 	"\fhair_pinning\x18\x01 \x01(\bR\vhairPinning\x12\x12\n" + | ||||||
| 	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, | 	"\x04ipv6\x18\x02 \x01(\bR\x04ipv6\x12\x10\n" + | ||||||
| 	0x65, 0x64, 0x22, 0x91, 0x01, 0x0a, 0x0e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x70, | 	"\x03pcp\x18\x03 \x01(\bR\x03pcp\x12\x10\n" + | ||||||
| 	0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x69, 0x72, 0x5f, 0x70, 0x69, | 	"\x03pmp\x18\x04 \x01(\bR\x03pmp\x12\x10\n" + | ||||||
| 	0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x69, | 	"\x03udp\x18\x05 \x01(\bR\x03udp\x12\x12\n" + | ||||||
| 	0x72, 0x50, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36, | 	"\x04upnp\x18\x06 \x01(\bR\x04upnp\"\xe3\x02\n" + | ||||||
| 	0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x69, 0x70, 0x76, 0x36, 0x12, 0x10, 0x0a, 0x03, | 	"\x12ClientConnectivity\x12\x1c\n" + | ||||||
| 	0x70, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x70, 0x63, 0x70, 0x12, 0x10, | 	"\tendpoints\x18\x01 \x03(\tR\tendpoints\x12\x12\n" + | ||||||
| 	0x0a, 0x03, 0x70, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x70, 0x6d, 0x70, | 	"\x04derp\x18\x02 \x01(\tR\x04derp\x128\n" + | ||||||
| 	0x12, 0x10, 0x0a, 0x03, 0x75, 0x64, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x75, | 	"\x19mapping_varies_by_dest_ip\x18\x03 \x01(\bR\x15mappingVariesByDestIp\x12G\n" + | ||||||
| 	0x64, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x70, 0x6e, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, | 	"\alatency\x18\x04 \x03(\v2-.headscale.v1.ClientConnectivity.LatencyEntryR\alatency\x12E\n" + | ||||||
| 	0x52, 0x04, 0x75, 0x70, 0x6e, 0x70, 0x22, 0xe3, 0x02, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, | 	"\x0fclient_supports\x18\x05 \x01(\v2\x1c.headscale.v1.ClientSupportsR\x0eclientSupports\x1aQ\n" + | ||||||
| 	0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, | 	"\fLatencyEntry\x12\x10\n" + | ||||||
| 	0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, | 	"\x03key\x18\x01 \x01(\tR\x03key\x12+\n" + | ||||||
| 	0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, | 	"\x05value\x18\x02 \x01(\v2\x15.headscale.v1.LatencyR\x05value:\x028\x01\"\"\n" + | ||||||
| 	0x65, 0x72, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x72, 0x70, 0x12, | 	"\x10GetDeviceRequest\x12\x0e\n" + | ||||||
| 	0x38, 0x0a, 0x19, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x65, | 	"\x02id\x18\x01 \x01(\tR\x02id\"\xa0\x06\n" + | ||||||
| 	0x73, 0x5f, 0x62, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, | 	"\x11GetDeviceResponse\x12\x1c\n" + | ||||||
| 	0x28, 0x08, 0x52, 0x15, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x72, 0x69, 0x65, | 	"\taddresses\x18\x01 \x03(\tR\taddresses\x12\x0e\n" + | ||||||
| 	0x73, 0x42, 0x79, 0x44, 0x65, 0x73, 0x74, 0x49, 0x70, 0x12, 0x47, 0x0a, 0x07, 0x6c, 0x61, 0x74, | 	"\x02id\x18\x02 \x01(\tR\x02id\x12\x12\n" + | ||||||
| 	0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x65, 0x61, | 	"\x04user\x18\x03 \x01(\tR\x04user\x12\x12\n" + | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, | 	"\x04name\x18\x04 \x01(\tR\x04name\x12\x1a\n" + | ||||||
| 	0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2e, 0x4c, 0x61, 0x74, | 	"\bhostname\x18\x05 \x01(\tR\bhostname\x12%\n" + | ||||||
| 	0x65, 0x6e, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6c, 0x61, 0x74, 0x65, 0x6e, | 	"\x0eclient_version\x18\x06 \x01(\tR\rclientVersion\x12)\n" + | ||||||
| 	0x63, 0x79, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x70, | 	"\x10update_available\x18\a \x01(\bR\x0fupdateAvailable\x12\x0e\n" + | ||||||
| 	0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x68, 0x65, | 	"\x02os\x18\b \x01(\tR\x02os\x124\n" + | ||||||
| 	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, | 	"\acreated\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\acreated\x127\n" + | ||||||
| 	0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, | 	"\tlast_seen\x18\n" + | ||||||
| 	0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0c, 0x4c, 0x61, 0x74, | 	" \x01(\v2\x1a.google.protobuf.TimestampR\blastSeen\x12.\n" + | ||||||
| 	0x65, 0x6e, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, | 	"\x13key_expiry_disabled\x18\v \x01(\bR\x11keyExpiryDisabled\x124\n" + | ||||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, | 	"\aexpires\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\aexpires\x12\x1e\n" + | ||||||
| 	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, | 	"\n" + | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, | 	"authorized\x18\r \x01(\bR\n" + | ||||||
| 	0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x22, 0x0a, 0x10, | 	"authorized\x12\x1f\n" + | ||||||
| 	0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | 	"\vis_external\x18\x0e \x01(\bR\n" + | ||||||
| 	0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, | 	"isExternal\x12\x1f\n" + | ||||||
| 	0x22, 0xa0, 0x06, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, | 	"\vmachine_key\x18\x0f \x01(\tR\n" + | ||||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, | 	"machineKey\x12\x19\n" + | ||||||
| 	0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, | 	"\bnode_key\x18\x10 \x01(\tR\anodeKey\x12>\n" + | ||||||
| 	0x73, 0x73, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, | 	"\x1bblocks_incoming_connections\x18\x11 \x01(\bR\x19blocksIncomingConnections\x12%\n" + | ||||||
| 	0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, | 	"\x0eenabled_routes\x18\x12 \x03(\tR\renabledRoutes\x12+\n" + | ||||||
| 	0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, | 	"\x11advertised_routes\x18\x13 \x03(\tR\x10advertisedRoutes\x12Q\n" + | ||||||
| 	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, | 	"\x13client_connectivity\x18\x14 \x01(\v2 .headscale.v1.ClientConnectivityR\x12clientConnectivity\"%\n" + | ||||||
| 	0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, | 	"\x13DeleteDeviceRequest\x12\x0e\n" + | ||||||
| 	0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6c, 0x69, 0x65, | 	"\x02id\x18\x01 \x01(\tR\x02id\"\x16\n" + | ||||||
| 	0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, | 	"\x14DeleteDeviceResponse\"(\n" + | ||||||
| 	0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, | 	"\x16GetDeviceRoutesRequest\x12\x0e\n" + | ||||||
| 	0x29, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, | 	"\x02id\x18\x01 \x01(\tR\x02id\"m\n" + | ||||||
| 	0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, | 	"\x17GetDeviceRoutesResponse\x12%\n" + | ||||||
| 	0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, | 	"\x0eenabled_routes\x18\x01 \x03(\tR\renabledRoutes\x12+\n" + | ||||||
| 	0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, | 	"\x11advertised_routes\x18\x02 \x03(\tR\x10advertisedRoutes\"C\n" + | ||||||
| 	0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, | 	"\x19EnableDeviceRoutesRequest\x12\x0e\n" + | ||||||
| 	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, | 	"\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n" + | ||||||
| 	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, | 	"\x06routes\x18\x02 \x03(\tR\x06routes\"p\n" + | ||||||
| 	0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x0a, 0x20, | 	"\x1aEnableDeviceRoutesResponse\x12%\n" + | ||||||
| 	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, | 	"\x0eenabled_routes\x18\x01 \x03(\tR\renabledRoutes\x12+\n" + | ||||||
| 	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, | 	"\x11advertised_routes\x18\x02 \x03(\tR\x10advertisedRoutesB)Z'github.com/juanfont/headscale/gen/go/v1b\x06proto3" | ||||||
| 	0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x6b, 0x65, 0x79, |  | ||||||
| 	0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, |  | ||||||
| 	0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x69, 0x72, |  | ||||||
| 	0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x78, 0x70, |  | ||||||
| 	0x69, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, |  | ||||||
| 	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, |  | ||||||
| 	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, |  | ||||||
| 	0x1e, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x0d, 0x20, |  | ||||||
| 	0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x12, |  | ||||||
| 	0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x0e, |  | ||||||
| 	0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, |  | ||||||
| 	0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, |  | ||||||
| 	0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, |  | ||||||
| 	0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x10, 0x20, |  | ||||||
| 	0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x1b, |  | ||||||
| 	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, |  | ||||||
| 	0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, |  | ||||||
| 	0x08, 0x52, 0x19, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, |  | ||||||
| 	0x67, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, |  | ||||||
| 	0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x12, |  | ||||||
| 	0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x75, |  | ||||||
| 	0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, |  | ||||||
| 	0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, |  | ||||||
| 	0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, |  | ||||||
| 	0x12, 0x51, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, |  | ||||||
| 	0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, |  | ||||||
| 	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, |  | ||||||
| 	0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, |  | ||||||
| 	0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, |  | ||||||
| 	0x69, 0x74, 0x79, 0x22, 0x25, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, |  | ||||||
| 	0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, |  | ||||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, |  | ||||||
| 	0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, |  | ||||||
| 	0x73, 0x65, 0x22, 0x28, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, |  | ||||||
| 	0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, |  | ||||||
| 	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6d, 0x0a, 0x17, |  | ||||||
| 	0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, |  | ||||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x61, 0x62, 0x6c, |  | ||||||
| 	0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, |  | ||||||
| 	0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2b, |  | ||||||
| 	0x0a, 0x11, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, |  | ||||||
| 	0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, |  | ||||||
| 	0x74, 0x69, 0x73, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x19, 0x45, |  | ||||||
| 	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, |  | ||||||
| 	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, |  | ||||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, |  | ||||||
| 	0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, |  | ||||||
| 	0x22, 0x70, 0x0a, 0x1a, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, |  | ||||||
| 	0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, |  | ||||||
| 	0x0a, 0x0e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, |  | ||||||
| 	0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, |  | ||||||
| 	0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, |  | ||||||
| 	0x73, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, |  | ||||||
| 	0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, |  | ||||||
| 	0x65, 0x73, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, |  | ||||||
| 	0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, |  | ||||||
| 	0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, |  | ||||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x33, |  | ||||||
| }) |  | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	file_headscale_v1_device_proto_rawDescOnce sync.Once | 	file_headscale_v1_device_proto_rawDescOnce sync.Once | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | // Code generated by protoc-gen-go. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // 	protoc-gen-go v1.36.5 | // 	protoc-gen-go v1.36.6 | ||||||
| // 	protoc        (unknown) | // 	protoc        (unknown) | ||||||
| // source: headscale/v1/headscale.proto | // source: headscale/v1/headscale.proto | ||||||
| 
 | 
 | ||||||
| @ -23,203 +23,40 @@ const ( | |||||||
| 
 | 
 | ||||||
| var File_headscale_v1_headscale_proto protoreflect.FileDescriptor | var File_headscale_v1_headscale_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_headscale_v1_headscale_proto_rawDesc = string([]byte{ | const file_headscale_v1_headscale_proto_rawDesc = "" + | ||||||
| 	0x0a, 0x1c, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x68, | 	"\n" + | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, | 	"\x1cheadscale/v1/headscale.proto\x12\fheadscale.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17headscale/v1/user.proto\x1a\x1dheadscale/v1/preauthkey.proto\x1a\x17headscale/v1/node.proto\x1a\x19headscale/v1/apikey.proto\x1a\x19headscale/v1/policy.proto2\xa3\x16\n" + | ||||||
| 	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, | 	"\x10HeadscaleService\x12h\n" + | ||||||
| 	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, | 	"\n" + | ||||||
| 	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x68, 0x65, 0x61, 0x64, | 	"CreateUser\x12\x1f.headscale.v1.CreateUserRequest\x1a .headscale.v1.CreateUserResponse\"\x17\x82\xd3\xe4\x93\x02\x11:\x01*\"\f/api/v1/user\x12\x80\x01\n" + | ||||||
| 	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, | 	"\n" + | ||||||
| 	0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, | 	"RenameUser\x12\x1f.headscale.v1.RenameUserRequest\x1a .headscale.v1.RenameUserResponse\"/\x82\xd3\xe4\x93\x02)\"'/api/v1/user/{old_id}/rename/{new_name}\x12j\n" + | ||||||
| 	0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, | 	"\n" + | ||||||
| 	0x74, 0x6f, 0x1a, 0x17, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, | 	"DeleteUser\x12\x1f.headscale.v1.DeleteUserRequest\x1a .headscale.v1.DeleteUserResponse\"\x19\x82\xd3\xe4\x93\x02\x13*\x11/api/v1/user/{id}\x12b\n" + | ||||||
| 	0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x68, 0x65, 0x61, | 	"\tListUsers\x12\x1e.headscale.v1.ListUsersRequest\x1a\x1f.headscale.v1.ListUsersResponse\"\x14\x82\xd3\xe4\x93\x02\x0e\x12\f/api/v1/user\x12\x80\x01\n" + | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, | 	"\x10CreatePreAuthKey\x12%.headscale.v1.CreatePreAuthKeyRequest\x1a&.headscale.v1.CreatePreAuthKeyResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/api/v1/preauthkey\x12\x87\x01\n" + | ||||||
| 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, | 	"\x10ExpirePreAuthKey\x12%.headscale.v1.ExpirePreAuthKeyRequest\x1a&.headscale.v1.ExpirePreAuthKeyResponse\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/api/v1/preauthkey/expire\x12z\n" + | ||||||
| 	0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, | 	"\x0fListPreAuthKeys\x12$.headscale.v1.ListPreAuthKeysRequest\x1a%.headscale.v1.ListPreAuthKeysResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\x12\x12/api/v1/preauthkey\x12}\n" + | ||||||
| 	0x6f, 0x32, 0xa3, 0x16, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x53, | 	"\x0fDebugCreateNode\x12$.headscale.v1.DebugCreateNodeRequest\x1a%.headscale.v1.DebugCreateNodeResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/api/v1/debug/node\x12f\n" + | ||||||
| 	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x68, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, | 	"\aGetNode\x12\x1c.headscale.v1.GetNodeRequest\x1a\x1d.headscale.v1.GetNodeResponse\"\x1e\x82\xd3\xe4\x93\x02\x18\x12\x16/api/v1/node/{node_id}\x12n\n" + | ||||||
| 	0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, | 	"\aSetTags\x12\x1c.headscale.v1.SetTagsRequest\x1a\x1d.headscale.v1.SetTagsResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/api/v1/node/{node_id}/tags\x12\x96\x01\n" + | ||||||
| 	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, | 	"\x11SetApprovedRoutes\x12&.headscale.v1.SetApprovedRoutesRequest\x1a'.headscale.v1.SetApprovedRoutesResponse\"0\x82\xd3\xe4\x93\x02*:\x01*\"%/api/v1/node/{node_id}/approve_routes\x12t\n" + | ||||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, | 	"\fRegisterNode\x12!.headscale.v1.RegisterNodeRequest\x1a\".headscale.v1.RegisterNodeResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\"\x15/api/v1/node/register\x12o\n" + | ||||||
| 	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, | 	"\n" + | ||||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, | 	"DeleteNode\x12\x1f.headscale.v1.DeleteNodeRequest\x1a .headscale.v1.DeleteNodeResponse\"\x1e\x82\xd3\xe4\x93\x02\x18*\x16/api/v1/node/{node_id}\x12v\n" + | ||||||
| 	0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, | 	"\n" + | ||||||
| 	0x12, 0x80, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, | 	"ExpireNode\x12\x1f.headscale.v1.ExpireNodeRequest\x1a .headscale.v1.ExpireNodeResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1d/api/v1/node/{node_id}/expire\x12\x81\x01\n" + | ||||||
| 	0x1f, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, | 	"\n" + | ||||||
| 	0x65, 0x6e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | 	"RenameNode\x12\x1f.headscale.v1.RenameNodeRequest\x1a .headscale.v1.RenameNodeResponse\"0\x82\xd3\xe4\x93\x02*\"(/api/v1/node/{node_id}/rename/{new_name}\x12b\n" + | ||||||
| 	0x1a, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, | 	"\tListNodes\x12\x1e.headscale.v1.ListNodesRequest\x1a\x1f.headscale.v1.ListNodesResponse\"\x14\x82\xd3\xe4\x93\x02\x0e\x12\f/api/v1/node\x12q\n" + | ||||||
| 	0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | 	"\bMoveNode\x12\x1d.headscale.v1.MoveNodeRequest\x1a\x1e.headscale.v1.MoveNodeResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/api/v1/node/{node_id}/user\x12\x80\x01\n" + | ||||||
| 	0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, | 	"\x0fBackfillNodeIPs\x12$.headscale.v1.BackfillNodeIPsRequest\x1a%.headscale.v1.BackfillNodeIPsResponse\" \x82\xd3\xe4\x93\x02\x1a\"\x18/api/v1/node/backfillips\x12p\n" + | ||||||
| 	0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x7b, 0x6f, 0x6c, 0x64, 0x5f, 0x69, 0x64, | 	"\fCreateApiKey\x12!.headscale.v1.CreateApiKeyRequest\x1a\".headscale.v1.CreateApiKeyResponse\"\x19\x82\xd3\xe4\x93\x02\x13:\x01*\"\x0e/api/v1/apikey\x12w\n" + | ||||||
| 	0x7d, 0x2f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, | 	"\fExpireApiKey\x12!.headscale.v1.ExpireApiKeyRequest\x1a\".headscale.v1.ExpireApiKeyResponse\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/api/v1/apikey/expire\x12j\n" + | ||||||
| 	0x6d, 0x65, 0x7d, 0x12, 0x6a, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, | 	"\vListApiKeys\x12 .headscale.v1.ListApiKeysRequest\x1a!.headscale.v1.ListApiKeysResponse\"\x16\x82\xd3\xe4\x93\x02\x10\x12\x0e/api/v1/apikey\x12v\n" + | ||||||
| 	0x72, 0x12, 0x1f, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, | 	"\fDeleteApiKey\x12!.headscale.v1.DeleteApiKeyRequest\x1a\".headscale.v1.DeleteApiKeyResponse\"\x1f\x82\xd3\xe4\x93\x02\x19*\x17/api/v1/apikey/{prefix}\x12d\n" + | ||||||
| 	0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, | 	"\tGetPolicy\x12\x1e.headscale.v1.GetPolicyRequest\x1a\x1f.headscale.v1.GetPolicyResponse\"\x16\x82\xd3\xe4\x93\x02\x10\x12\x0e/api/v1/policy\x12g\n" + | ||||||
| 	0x73, 0x74, 0x1a, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, | 	"\tSetPolicy\x12\x1e.headscale.v1.SetPolicyRequest\x1a\x1f.headscale.v1.SetPolicyResponse\"\x19\x82\xd3\xe4\x93\x02\x13:\x01*\x1a\x0e/api/v1/policyB)Z'github.com/juanfont/headscale/gen/go/v1b\x06proto3" | ||||||
| 	0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, |  | ||||||
| 	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, 0x61, |  | ||||||
| 	0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, |  | ||||||
| 	0x62, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x68, |  | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, |  | ||||||
| 	0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x68, |  | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, |  | ||||||
| 	0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, |  | ||||||
| 	0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, |  | ||||||
| 	0x73, 0x65, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, |  | ||||||
| 	0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, |  | ||||||
| 	0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, |  | ||||||
| 	0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, |  | ||||||
| 	0x26, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, |  | ||||||
| 	0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, |  | ||||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, |  | ||||||
| 	0x01, 0x2a, 0x22, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, |  | ||||||
| 	0x75, 0x74, 0x68, 0x6b, 0x65, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x69, 0x72, |  | ||||||
| 	0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x68, 0x65, |  | ||||||
| 	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, |  | ||||||
| 	0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, |  | ||||||
| 	0x73, 0x74, 0x1a, 0x26, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, |  | ||||||
| 	0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, |  | ||||||
| 	0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, |  | ||||||
| 	0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, |  | ||||||
| 	0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65, 0x79, 0x2f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, |  | ||||||
| 	0x12, 0x7a, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, |  | ||||||
| 	0x65, 0x79, 0x73, 0x12, 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, |  | ||||||
| 	0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, |  | ||||||
| 	0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, |  | ||||||
| 	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, |  | ||||||
| 	0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, |  | ||||||
| 	0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, |  | ||||||
| 	0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65, 0x79, 0x12, 0x7d, 0x0a, 0x0f, |  | ||||||
| 	0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, |  | ||||||
| 	0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, |  | ||||||
| 	0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, |  | ||||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, |  | ||||||
| 	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, |  | ||||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, |  | ||||||
| 	0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, |  | ||||||
| 	0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x66, 0x0a, 0x07, 0x47, |  | ||||||
| 	0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, |  | ||||||
| 	0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, |  | ||||||
| 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, |  | ||||||
| 	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, |  | ||||||
| 	0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, |  | ||||||
| 	0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, |  | ||||||
| 	0x69, 0x64, 0x7d, 0x12, 0x6e, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1c, |  | ||||||
| 	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, |  | ||||||
| 	0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x68, |  | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, |  | ||||||
| 	0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, |  | ||||||
| 	0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, |  | ||||||
| 	0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, |  | ||||||
| 	0x61, 0x67, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x72, 0x6f, |  | ||||||
| 	0x76, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x68, 0x65, 0x61, 0x64, |  | ||||||
| 	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x72, |  | ||||||
| 	0x6f, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, |  | ||||||
| 	0x74, 0x1a, 0x27, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, |  | ||||||
| 	0x2e, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, |  | ||||||
| 	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, |  | ||||||
| 	0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, |  | ||||||
| 	0x70, 0x72, 0x6f, 0x76, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x74, 0x0a, 0x0c, |  | ||||||
| 	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x68, |  | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, |  | ||||||
| 	0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, |  | ||||||
| 	0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, |  | ||||||
| 	0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, |  | ||||||
| 	0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x15, 0x2f, 0x61, 0x70, |  | ||||||
| 	0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, |  | ||||||
| 	0x65, 0x72, 0x12, 0x6f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, |  | ||||||
| 	0x12, 0x1f, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, |  | ||||||
| 	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, |  | ||||||
| 	0x74, 0x1a, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, |  | ||||||
| 	0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, |  | ||||||
| 	0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, |  | ||||||
| 	0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, |  | ||||||
| 	0x69, 0x64, 0x7d, 0x12, 0x76, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4e, 0x6f, 0x64, |  | ||||||
| 	0x65, 0x12, 0x1f, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, |  | ||||||
| 	0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, |  | ||||||
| 	0x73, 0x74, 0x1a, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, |  | ||||||
| 	0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, |  | ||||||
| 	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, 0x2f, 0x61, |  | ||||||
| 	0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, |  | ||||||
| 	0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x0a, |  | ||||||
| 	0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x68, 0x65, 0x61, |  | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, |  | ||||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x68, 0x65, |  | ||||||
| 	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, |  | ||||||
| 	0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, |  | ||||||
| 	0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x28, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, |  | ||||||
| 	0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, |  | ||||||
| 	0x62, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x68, |  | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, |  | ||||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x68, |  | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, |  | ||||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, |  | ||||||
| 	0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x12, 0x71, 0x0a, 0x08, 0x4d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, |  | ||||||
| 	0x1d, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, |  | ||||||
| 	0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, |  | ||||||
| 	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, |  | ||||||
| 	0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, |  | ||||||
| 	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, |  | ||||||
| 	0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, |  | ||||||
| 	0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x42, 0x61, 0x63, 0x6b, 0x66, |  | ||||||
| 	0x69, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x50, 0x73, 0x12, 0x24, 0x2e, 0x68, 0x65, 0x61, |  | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, |  | ||||||
| 	0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x50, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, |  | ||||||
| 	0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, |  | ||||||
| 	0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x50, 0x73, 0x52, |  | ||||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, |  | ||||||
| 	0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x62, 0x61, |  | ||||||
| 	0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x12, 0x70, 0x0a, 0x0c, 0x43, 0x72, 0x65, |  | ||||||
| 	0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, |  | ||||||
| 	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, |  | ||||||
| 	0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, |  | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, |  | ||||||
| 	0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, |  | ||||||
| 	0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x61, 0x70, |  | ||||||
| 	0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x12, 0x77, 0x0a, 0x0c, 0x45, |  | ||||||
| 	0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x2e, 0x68, 0x65, |  | ||||||
| 	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, |  | ||||||
| 	0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, |  | ||||||
| 	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, |  | ||||||
| 	0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, |  | ||||||
| 	0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, |  | ||||||
| 	0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x2f, 0x65, 0x78, |  | ||||||
| 	0x70, 0x69, 0x72, 0x65, 0x12, 0x6a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, |  | ||||||
| 	0x65, 0x79, 0x73, 0x12, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, |  | ||||||
| 	0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, |  | ||||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, |  | ||||||
| 	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, |  | ||||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, |  | ||||||
| 	0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, |  | ||||||
| 	0x12, 0x76, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, |  | ||||||
| 	0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, |  | ||||||
| 	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, |  | ||||||
| 	0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, |  | ||||||
| 	0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, |  | ||||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x2a, |  | ||||||
| 	0x17, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x2f, |  | ||||||
| 	0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x64, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x50, |  | ||||||
| 	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1e, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, |  | ||||||
| 	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, |  | ||||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, |  | ||||||
| 	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, |  | ||||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, |  | ||||||
| 	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x67, |  | ||||||
| 	0x0a, 0x09, 0x53, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1e, 0x2e, 0x68, 0x65, |  | ||||||
| 	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x6f, |  | ||||||
| 	0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x68, 0x65, |  | ||||||
| 	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x6f, |  | ||||||
| 	0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, |  | ||||||
| 	0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x1a, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, |  | ||||||
| 	0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, |  | ||||||
| 	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, |  | ||||||
| 	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, |  | ||||||
| 	0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, |  | ||||||
| }) |  | ||||||
| 
 | 
 | ||||||
| var file_headscale_v1_headscale_proto_goTypes = []any{ | var file_headscale_v1_headscale_proto_goTypes = []any{ | ||||||
| 	(*CreateUserRequest)(nil),         // 0: headscale.v1.CreateUserRequest | 	(*CreateUserRequest)(nil),         // 0: headscale.v1.CreateUserRequest | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | // Code generated by protoc-gen-go. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // 	protoc-gen-go v1.36.5 | // 	protoc-gen-go v1.36.6 | ||||||
| // 	protoc        (unknown) | // 	protoc        (unknown) | ||||||
| // source: headscale/v1/node.proto | // source: headscale/v1/node.proto | ||||||
| 
 | 
 | ||||||
| @ -1296,160 +1296,94 @@ func (x *BackfillNodeIPsResponse) GetChanges() []string { | |||||||
| 
 | 
 | ||||||
| var File_headscale_v1_node_proto protoreflect.FileDescriptor | var File_headscale_v1_node_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_headscale_v1_node_proto_rawDesc = string([]byte{ | const file_headscale_v1_node_proto_rawDesc = "" + | ||||||
| 	0x0a, 0x17, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6e, | 	"\n" + | ||||||
| 	0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x73, | 	"\x17headscale/v1/node.proto\x12\fheadscale.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1dheadscale/v1/preauthkey.proto\x1a\x17headscale/v1/user.proto\"\x98\x06\n" + | ||||||
| 	0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, | 	"\x04Node\x12\x0e\n" + | ||||||
| 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, | 	"\x02id\x18\x01 \x01(\x04R\x02id\x12\x1f\n" + | ||||||
| 	0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, | 	"\vmachine_key\x18\x02 \x01(\tR\n" + | ||||||
| 	0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65, | 	"machineKey\x12\x19\n" + | ||||||
| 	0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, | 	"\bnode_key\x18\x03 \x01(\tR\anodeKey\x12\x1b\n" + | ||||||
| 	0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | 	"\tdisco_key\x18\x04 \x01(\tR\bdiscoKey\x12!\n" + | ||||||
| 	0x22, 0x98, 0x06, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, | 	"\fip_addresses\x18\x05 \x03(\tR\vipAddresses\x12\x12\n" + | ||||||
| 	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x63, | 	"\x04name\x18\x06 \x01(\tR\x04name\x12&\n" + | ||||||
| 	0x68, 0x69, 0x6e, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, | 	"\x04user\x18\a \x01(\v2\x12.headscale.v1.UserR\x04user\x127\n" + | ||||||
| 	0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x6f, | 	"\tlast_seen\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\blastSeen\x122\n" + | ||||||
| 	0x64, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x6f, | 	"\x06expiry\x18\n" + | ||||||
| 	0x64, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x5f, 0x6b, | 	" \x01(\v2\x1a.google.protobuf.TimestampR\x06expiry\x12:\n" + | ||||||
| 	0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x4b, | 	"\fpre_auth_key\x18\v \x01(\v2\x18.headscale.v1.PreAuthKeyR\n" + | ||||||
| 	0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, | 	"preAuthKey\x129\n" + | ||||||
| 	0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, | 	"\n" + | ||||||
| 	0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, | 	"created_at\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12E\n" + | ||||||
| 	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, | 	"\x0fregister_method\x18\r \x01(\x0e2\x1c.headscale.v1.RegisterMethodR\x0eregisterMethod\x12\x1f\n" + | ||||||
| 	0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, | 	"\vforced_tags\x18\x12 \x03(\tR\n" + | ||||||
| 	0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, | 	"forcedTags\x12!\n" + | ||||||
| 	0x72, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x08, | 	"\finvalid_tags\x18\x13 \x03(\tR\vinvalidTags\x12\x1d\n" + | ||||||
| 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, | 	"\n" + | ||||||
| 	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, | 	"valid_tags\x18\x14 \x03(\tR\tvalidTags\x12\x1d\n" + | ||||||
| 	0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x06, 0x65, 0x78, | 	"\n" + | ||||||
| 	0x70, 0x69, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, | 	"given_name\x18\x15 \x01(\tR\tgivenName\x12\x16\n" + | ||||||
| 	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, | 	"\x06online\x18\x16 \x01(\bR\x06online\x12'\n" + | ||||||
| 	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x3a, | 	"\x0fapproved_routes\x18\x17 \x03(\tR\x0eapprovedRoutes\x12)\n" + | ||||||
| 	0x0a, 0x0c, 0x70, 0x72, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0b, | 	"\x10available_routes\x18\x18 \x03(\tR\x0favailableRoutes\x12#\n" + | ||||||
| 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, | 	"\rsubnet_routes\x18\x19 \x03(\tR\fsubnetRoutesJ\x04\b\t\x10\n" + | ||||||
| 	0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x0a, | 	"J\x04\b\x0e\x10\x12\";\n" + | ||||||
| 	0x70, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, | 	"\x13RegisterNodeRequest\x12\x12\n" + | ||||||
| 	0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, | 	"\x04user\x18\x01 \x01(\tR\x04user\x12\x10\n" + | ||||||
| 	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, | 	"\x03key\x18\x02 \x01(\tR\x03key\">\n" + | ||||||
| 	0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, | 	"\x14RegisterNodeResponse\x12&\n" + | ||||||
| 	0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, | 	"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\")\n" + | ||||||
| 	0x72, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, | 	"\x0eGetNodeRequest\x12\x17\n" + | ||||||
| 	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, | 	"\anode_id\x18\x01 \x01(\x04R\x06nodeId\"9\n" + | ||||||
| 	0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0e, 0x72, 0x65, | 	"\x0fGetNodeResponse\x12&\n" + | ||||||
| 	0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1f, 0x0a, 0x0b, | 	"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"=\n" + | ||||||
| 	0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, | 	"\x0eSetTagsRequest\x12\x17\n" + | ||||||
| 	0x09, 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x54, 0x61, 0x67, 0x73, 0x12, 0x21, 0x0a, | 	"\anode_id\x18\x01 \x01(\x04R\x06nodeId\x12\x12\n" + | ||||||
| 	0x0c, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x13, 0x20, | 	"\x04tags\x18\x02 \x03(\tR\x04tags\"9\n" + | ||||||
| 	0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x61, 0x67, 0x73, | 	"\x0fSetTagsResponse\x12&\n" + | ||||||
| 	0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x14, | 	"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"K\n" + | ||||||
| 	0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x61, 0x67, 0x73, 0x12, | 	"\x18SetApprovedRoutesRequest\x12\x17\n" + | ||||||
| 	0x1d, 0x0a, 0x0a, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x15, 0x20, | 	"\anode_id\x18\x01 \x01(\x04R\x06nodeId\x12\x16\n" + | ||||||
| 	0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, | 	"\x06routes\x18\x02 \x03(\tR\x06routes\"C\n" + | ||||||
| 	0x0a, 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, | 	"\x19SetApprovedRoutesResponse\x12&\n" + | ||||||
| 	0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, | 	"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\",\n" + | ||||||
| 	0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, | 	"\x11DeleteNodeRequest\x12\x17\n" + | ||||||
| 	0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, | 	"\anode_id\x18\x01 \x01(\x04R\x06nodeId\"\x14\n" + | ||||||
| 	0x29, 0x0a, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x75, | 	"\x12DeleteNodeResponse\",\n" + | ||||||
| 	0x74, 0x65, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x76, 0x61, 0x69, 0x6c, | 	"\x11ExpireNodeRequest\x12\x17\n" + | ||||||
| 	0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, | 	"\anode_id\x18\x01 \x01(\x04R\x06nodeId\"<\n" + | ||||||
| 	0x62, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, | 	"\x12ExpireNodeResponse\x12&\n" + | ||||||
| 	0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x4a, | 	"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"G\n" + | ||||||
| 	0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x12, 0x22, 0x3b, 0x0a, 0x13, 0x52, | 	"\x11RenameNodeRequest\x12\x17\n" + | ||||||
| 	0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, | 	"\anode_id\x18\x01 \x01(\x04R\x06nodeId\x12\x19\n" + | ||||||
| 	0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, | 	"\bnew_name\x18\x02 \x01(\tR\anewName\"<\n" + | ||||||
| 	0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, | 	"\x12RenameNodeResponse\x12&\n" + | ||||||
| 	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3e, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69, | 	"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"&\n" + | ||||||
| 	0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, | 	"\x10ListNodesRequest\x12\x12\n" + | ||||||
| 	0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, | 	"\x04user\x18\x01 \x01(\tR\x04user\"=\n" + | ||||||
| 	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, | 	"\x11ListNodesResponse\x12(\n" + | ||||||
| 	0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, | 	"\x05nodes\x18\x01 \x03(\v2\x12.headscale.v1.NodeR\x05nodes\">\n" + | ||||||
| 	0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, | 	"\x0fMoveNodeRequest\x12\x17\n" + | ||||||
| 	0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x6f, 0x64, | 	"\anode_id\x18\x01 \x01(\x04R\x06nodeId\x12\x12\n" + | ||||||
| 	0x65, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, | 	"\x04user\x18\x02 \x01(\tR\x04user\":\n" + | ||||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, | 	"\x10MoveNodeResponse\x12&\n" + | ||||||
| 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, | 	"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"j\n" + | ||||||
| 	0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x3d, | 	"\x16DebugCreateNodeRequest\x12\x12\n" + | ||||||
| 	0x0a, 0x0e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | 	"\x04user\x18\x01 \x01(\tR\x04user\x12\x10\n" + | ||||||
| 	0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, | 	"\x03key\x18\x02 \x01(\tR\x03key\x12\x12\n" + | ||||||
| 	0x04, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, | 	"\x04name\x18\x03 \x01(\tR\x04name\x12\x16\n" + | ||||||
| 	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x39, 0x0a, | 	"\x06routes\x18\x04 \x03(\tR\x06routes\"A\n" + | ||||||
| 	0x0f, 0x53, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, | 	"\x17DebugCreateNodeResponse\x12&\n" + | ||||||
| 	0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, | 	"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"6\n" + | ||||||
| 	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, | 	"\x16BackfillNodeIPsRequest\x12\x1c\n" + | ||||||
| 	0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x4b, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x41, | 	"\tconfirmed\x18\x01 \x01(\bR\tconfirmed\"3\n" + | ||||||
| 	0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, | 	"\x17BackfillNodeIPsResponse\x12\x18\n" + | ||||||
| 	0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, | 	"\achanges\x18\x01 \x03(\tR\achanges*\x82\x01\n" + | ||||||
| 	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, | 	"\x0eRegisterMethod\x12\x1f\n" + | ||||||
| 	0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, | 	"\x1bREGISTER_METHOD_UNSPECIFIED\x10\x00\x12\x1c\n" + | ||||||
| 	0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x72, | 	"\x18REGISTER_METHOD_AUTH_KEY\x10\x01\x12\x17\n" + | ||||||
| 	0x6f, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | 	"\x13REGISTER_METHOD_CLI\x10\x02\x12\x18\n" + | ||||||
| 	0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, | 	"\x14REGISTER_METHOD_OIDC\x10\x03B)Z'github.com/juanfont/headscale/gen/go/v1b\x06proto3" | ||||||
| 	0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, |  | ||||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x2c, 0x0a, 0x11, 0x44, 0x65, |  | ||||||
| 	0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, |  | ||||||
| 	0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, |  | ||||||
| 	0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, |  | ||||||
| 	0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, |  | ||||||
| 	0x0a, 0x11, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, |  | ||||||
| 	0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, |  | ||||||
| 	0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x12, |  | ||||||
| 	0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, |  | ||||||
| 	0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, |  | ||||||
| 	0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, |  | ||||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x47, 0x0a, 0x11, 0x52, 0x65, |  | ||||||
| 	0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, |  | ||||||
| 	0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, |  | ||||||
| 	0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, |  | ||||||
| 	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, |  | ||||||
| 	0x61, 0x6d, 0x65, 0x22, 0x3c, 0x0a, 0x12, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x6f, 0x64, |  | ||||||
| 	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, |  | ||||||
| 	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, |  | ||||||
| 	0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, |  | ||||||
| 	0x65, 0x22, 0x26, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, |  | ||||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, |  | ||||||
| 	0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3d, 0x0a, 0x11, 0x4c, 0x69, 0x73, |  | ||||||
| 	0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, |  | ||||||
| 	0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, |  | ||||||
| 	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, |  | ||||||
| 	0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x0f, 0x4d, 0x6f, 0x76, 0x65, |  | ||||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x6f, |  | ||||||
| 	0x64, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, |  | ||||||
| 	0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, |  | ||||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, |  | ||||||
| 	0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, |  | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, |  | ||||||
| 	0x6e, 0x6f, 0x64, 0x65, 0x22, 0x6a, 0x0a, 0x16, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, |  | ||||||
| 	0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, |  | ||||||
| 	0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, |  | ||||||
| 	0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, |  | ||||||
| 	0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, |  | ||||||
| 	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, |  | ||||||
| 	0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, |  | ||||||
| 	0x22, 0x41, 0x0a, 0x17, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, 0x64, |  | ||||||
| 	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x22, 0x36, 0x0a, 0x16, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x4e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x49, 0x50, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, |  | ||||||
| 	0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, |  | ||||||
| 	0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x33, 0x0a, 0x17, 0x42, |  | ||||||
| 	0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x50, 0x73, 0x52, 0x65, |  | ||||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, |  | ||||||
| 	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, |  | ||||||
| 	0x2a, 0x82, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, |  | ||||||
| 	0x68, 0x6f, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, |  | ||||||
| 	0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, |  | ||||||
| 	0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, |  | ||||||
| 	0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4b, 0x45, 0x59, |  | ||||||
| 	0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, |  | ||||||
| 	0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4c, 0x49, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x52, |  | ||||||
| 	0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4f, |  | ||||||
| 	0x49, 0x44, 0x43, 0x10, 0x03, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, |  | ||||||
| 	0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, |  | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, |  | ||||||
| 	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, |  | ||||||
| }) |  | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	file_headscale_v1_node_proto_rawDescOnce sync.Once | 	file_headscale_v1_node_proto_rawDescOnce sync.Once | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | // Code generated by protoc-gen-go. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // 	protoc-gen-go v1.36.5 | // 	protoc-gen-go v1.36.6 | ||||||
| // 	protoc        (unknown) | // 	protoc        (unknown) | ||||||
| // source: headscale/v1/policy.proto | // source: headscale/v1/policy.proto | ||||||
| 
 | 
 | ||||||
| @ -208,33 +208,20 @@ func (x *GetPolicyResponse) GetUpdatedAt() *timestamppb.Timestamp { | |||||||
| 
 | 
 | ||||||
| var File_headscale_v1_policy_proto protoreflect.FileDescriptor | var File_headscale_v1_policy_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_headscale_v1_policy_proto_rawDesc = string([]byte{ | const file_headscale_v1_policy_proto_rawDesc = "" + | ||||||
| 	0x0a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, | 	"\n" + | ||||||
| 	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x68, 0x65, 0x61, | 	"\x19headscale/v1/policy.proto\x12\fheadscale.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"*\n" + | ||||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, | 	"\x10SetPolicyRequest\x12\x16\n" + | ||||||
| 	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, | 	"\x06policy\x18\x01 \x01(\tR\x06policy\"f\n" + | ||||||
| 	0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2a, 0x0a, 0x10, 0x53, 0x65, | 	"\x11SetPolicyResponse\x12\x16\n" + | ||||||
| 	0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, | 	"\x06policy\x18\x01 \x01(\tR\x06policy\x129\n" + | ||||||
| 	0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, | 	"\n" + | ||||||
| 	0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x66, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x50, 0x6f, 0x6c, | 	"updated_at\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\"\x12\n" + | ||||||
| 	0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, | 	"\x10GetPolicyRequest\"f\n" + | ||||||
| 	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x6c, | 	"\x11GetPolicyResponse\x12\x16\n" + | ||||||
| 	0x69, 0x63, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, | 	"\x06policy\x18\x01 \x01(\tR\x06policy\x129\n" + | ||||||
| 	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, | 	"\n" + | ||||||
| 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, | 	"updated_at\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAtB)Z'github.com/juanfont/headscale/gen/go/v1b\x06proto3" | ||||||
| 	0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x12, |  | ||||||
| 	0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, |  | ||||||
| 	0x73, 0x74, 0x22, 0x66, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, |  | ||||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, |  | ||||||
| 	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, |  | ||||||
| 	0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, |  | ||||||
| 	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, |  | ||||||
| 	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, |  | ||||||
| 	0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, |  | ||||||
| 	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, |  | ||||||
| 	0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, |  | ||||||
| 	0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, |  | ||||||
| }) |  | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	file_headscale_v1_policy_proto_rawDescOnce sync.Once | 	file_headscale_v1_policy_proto_rawDescOnce sync.Once | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | // Code generated by protoc-gen-go. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // 	protoc-gen-go v1.36.5 | // 	protoc-gen-go v1.36.6 | ||||||
| // 	protoc        (unknown) | // 	protoc        (unknown) | ||||||
| // source: headscale/v1/preauthkey.proto | // source: headscale/v1/preauthkey.proto | ||||||
| 
 | 
 | ||||||
| @ -24,8 +24,8 @@ const ( | |||||||
| 
 | 
 | ||||||
| type PreAuthKey struct { | type PreAuthKey struct { | ||||||
| 	state         protoimpl.MessageState `protogen:"open.v1"` | 	state         protoimpl.MessageState `protogen:"open.v1"` | ||||||
| 	User          string                 `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` | 	User          *User                  `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` | ||||||
| 	Id            string                 `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` | 	Id            uint64                 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` | ||||||
| 	Key           string                 `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` | 	Key           string                 `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` | ||||||
| 	Reusable      bool                   `protobuf:"varint,4,opt,name=reusable,proto3" json:"reusable,omitempty"` | 	Reusable      bool                   `protobuf:"varint,4,opt,name=reusable,proto3" json:"reusable,omitempty"` | ||||||
| 	Ephemeral     bool                   `protobuf:"varint,5,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"` | 	Ephemeral     bool                   `protobuf:"varint,5,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"` | ||||||
| @ -67,18 +67,18 @@ func (*PreAuthKey) Descriptor() ([]byte, []int) { | |||||||
| 	return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{0} | 	return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{0} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *PreAuthKey) GetUser() string { | func (x *PreAuthKey) GetUser() *User { | ||||||
| 	if x != nil { | 	if x != nil { | ||||||
| 		return x.User | 		return x.User | ||||||
| 	} | 	} | ||||||
| 	return "" | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *PreAuthKey) GetId() string { | func (x *PreAuthKey) GetId() uint64 { | ||||||
| 	if x != nil { | 	if x != nil { | ||||||
| 		return x.Id | 		return x.Id | ||||||
| 	} | 	} | ||||||
| 	return "" | 	return 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *PreAuthKey) GetKey() string { | func (x *PreAuthKey) GetKey() string { | ||||||
| @ -132,7 +132,7 @@ func (x *PreAuthKey) GetAclTags() []string { | |||||||
| 
 | 
 | ||||||
| type CreatePreAuthKeyRequest struct { | type CreatePreAuthKeyRequest struct { | ||||||
| 	state         protoimpl.MessageState `protogen:"open.v1"` | 	state         protoimpl.MessageState `protogen:"open.v1"` | ||||||
| 	User          string                 `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` | 	User          uint64                 `protobuf:"varint,1,opt,name=user,proto3" json:"user,omitempty"` | ||||||
| 	Reusable      bool                   `protobuf:"varint,2,opt,name=reusable,proto3" json:"reusable,omitempty"` | 	Reusable      bool                   `protobuf:"varint,2,opt,name=reusable,proto3" json:"reusable,omitempty"` | ||||||
| 	Ephemeral     bool                   `protobuf:"varint,3,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"` | 	Ephemeral     bool                   `protobuf:"varint,3,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"` | ||||||
| 	Expiration    *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expiration,proto3" json:"expiration,omitempty"` | 	Expiration    *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expiration,proto3" json:"expiration,omitempty"` | ||||||
| @ -171,11 +171,11 @@ func (*CreatePreAuthKeyRequest) Descriptor() ([]byte, []int) { | |||||||
| 	return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{1} | 	return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{1} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *CreatePreAuthKeyRequest) GetUser() string { | func (x *CreatePreAuthKeyRequest) GetUser() uint64 { | ||||||
| 	if x != nil { | 	if x != nil { | ||||||
| 		return x.User | 		return x.User | ||||||
| 	} | 	} | ||||||
| 	return "" | 	return 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *CreatePreAuthKeyRequest) GetReusable() bool { | func (x *CreatePreAuthKeyRequest) GetReusable() bool { | ||||||
| @ -252,7 +252,7 @@ func (x *CreatePreAuthKeyResponse) GetPreAuthKey() *PreAuthKey { | |||||||
| 
 | 
 | ||||||
| type ExpirePreAuthKeyRequest struct { | type ExpirePreAuthKeyRequest struct { | ||||||
| 	state         protoimpl.MessageState `protogen:"open.v1"` | 	state         protoimpl.MessageState `protogen:"open.v1"` | ||||||
| 	User          string                 `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` | 	User          uint64                 `protobuf:"varint,1,opt,name=user,proto3" json:"user,omitempty"` | ||||||
| 	Key           string                 `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` | 	Key           string                 `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` | ||||||
| 	unknownFields protoimpl.UnknownFields | 	unknownFields protoimpl.UnknownFields | ||||||
| 	sizeCache     protoimpl.SizeCache | 	sizeCache     protoimpl.SizeCache | ||||||
| @ -288,11 +288,11 @@ func (*ExpirePreAuthKeyRequest) Descriptor() ([]byte, []int) { | |||||||
| 	return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{3} | 	return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{3} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *ExpirePreAuthKeyRequest) GetUser() string { | func (x *ExpirePreAuthKeyRequest) GetUser() uint64 { | ||||||
| 	if x != nil { | 	if x != nil { | ||||||
| 		return x.User | 		return x.User | ||||||
| 	} | 	} | ||||||
| 	return "" | 	return 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *ExpirePreAuthKeyRequest) GetKey() string { | func (x *ExpirePreAuthKeyRequest) GetKey() string { | ||||||
| @ -340,7 +340,7 @@ func (*ExpirePreAuthKeyResponse) Descriptor() ([]byte, []int) { | |||||||
| 
 | 
 | ||||||
| type ListPreAuthKeysRequest struct { | type ListPreAuthKeysRequest struct { | ||||||
| 	state         protoimpl.MessageState `protogen:"open.v1"` | 	state         protoimpl.MessageState `protogen:"open.v1"` | ||||||
| 	User          string                 `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` | 	User          uint64                 `protobuf:"varint,1,opt,name=user,proto3" json:"user,omitempty"` | ||||||
| 	unknownFields protoimpl.UnknownFields | 	unknownFields protoimpl.UnknownFields | ||||||
| 	sizeCache     protoimpl.SizeCache | 	sizeCache     protoimpl.SizeCache | ||||||
| } | } | ||||||
| @ -375,11 +375,11 @@ func (*ListPreAuthKeysRequest) Descriptor() ([]byte, []int) { | |||||||
| 	return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{5} | 	return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{5} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *ListPreAuthKeysRequest) GetUser() string { | func (x *ListPreAuthKeysRequest) GetUser() uint64 { | ||||||
| 	if x != nil { | 	if x != nil { | ||||||
| 		return x.User | 		return x.User | ||||||
| 	} | 	} | ||||||
| 	return "" | 	return 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type ListPreAuthKeysResponse struct { | type ListPreAuthKeysResponse struct { | ||||||
| @ -428,67 +428,42 @@ func (x *ListPreAuthKeysResponse) GetPreAuthKeys() []*PreAuthKey { | |||||||
| 
 | 
 | ||||||
| var File_headscale_v1_preauthkey_proto protoreflect.FileDescriptor | var File_headscale_v1_preauthkey_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_headscale_v1_preauthkey_proto_rawDesc = string([]byte{ | const file_headscale_v1_preauthkey_proto_rawDesc = "" + | ||||||
| 	0x0a, 0x1d, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, | 	"\n" + | ||||||
| 	0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, | 	"\x1dheadscale/v1/preauthkey.proto\x12\fheadscale.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17headscale/v1/user.proto\"\xb6\x02\n" + | ||||||
| 	0x0c, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, | 	"\n" + | ||||||
| 	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, | 	"PreAuthKey\x12&\n" + | ||||||
| 	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, | 	"\x04user\x18\x01 \x01(\v2\x12.headscale.v1.UserR\x04user\x12\x0e\n" + | ||||||
| 	0x02, 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, | 	"\x02id\x18\x02 \x01(\x04R\x02id\x12\x10\n" + | ||||||
| 	0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, | 	"\x03key\x18\x03 \x01(\tR\x03key\x12\x1a\n" + | ||||||
| 	0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, | 	"\breusable\x18\x04 \x01(\bR\breusable\x12\x1c\n" + | ||||||
| 	0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, | 	"\tephemeral\x18\x05 \x01(\bR\tephemeral\x12\x12\n" + | ||||||
| 	0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, | 	"\x04used\x18\x06 \x01(\bR\x04used\x12:\n" + | ||||||
| 	0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, | 	"\n" + | ||||||
| 	0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, | 	"expiration\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + | ||||||
| 	0x28, 0x08, 0x52, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x12, 0x0a, | 	"expiration\x129\n" + | ||||||
| 	0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x75, 0x73, 0x65, | 	"\n" + | ||||||
| 	0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, | 	"created_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12\x19\n" + | ||||||
| 	0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, | 	"\bacl_tags\x18\t \x03(\tR\aaclTags\"\xbe\x01\n" + | ||||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, | 	"\x17CreatePreAuthKeyRequest\x12\x12\n" + | ||||||
| 	0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, | 	"\x04user\x18\x01 \x01(\x04R\x04user\x12\x1a\n" + | ||||||
| 	0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, | 	"\breusable\x18\x02 \x01(\bR\breusable\x12\x1c\n" + | ||||||
| 	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | 	"\tephemeral\x18\x03 \x01(\bR\tephemeral\x12:\n" + | ||||||
| 	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, | 	"\n" + | ||||||
| 	0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x6c, 0x5f, | 	"expiration\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\n" + | ||||||
| 	0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x6c, 0x54, | 	"expiration\x12\x19\n" + | ||||||
| 	0x61, 0x67, 0x73, 0x22, 0xbe, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, | 	"\bacl_tags\x18\x05 \x03(\tR\aaclTags\"V\n" + | ||||||
| 	0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, | 	"\x18CreatePreAuthKeyResponse\x12:\n" + | ||||||
| 	0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, | 	"\fpre_auth_key\x18\x01 \x01(\v2\x18.headscale.v1.PreAuthKeyR\n" + | ||||||
| 	0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, | 	"preAuthKey\"?\n" + | ||||||
| 	0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, | 	"\x17ExpirePreAuthKeyRequest\x12\x12\n" + | ||||||
| 	0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, | 	"\x04user\x18\x01 \x01(\x04R\x04user\x12\x10\n" + | ||||||
| 	0x28, 0x08, 0x52, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x3a, 0x0a, | 	"\x03key\x18\x02 \x01(\tR\x03key\"\x1a\n" + | ||||||
| 	0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, | 	"\x18ExpirePreAuthKeyResponse\",\n" + | ||||||
| 	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | 	"\x16ListPreAuthKeysRequest\x12\x12\n" + | ||||||
| 	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, | 	"\x04user\x18\x01 \x01(\x04R\x04user\"W\n" + | ||||||
| 	0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x6c, | 	"\x17ListPreAuthKeysResponse\x12<\n" + | ||||||
| 	0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x6c, | 	"\rpre_auth_keys\x18\x01 \x03(\v2\x18.headscale.v1.PreAuthKeyR\vpreAuthKeysB)Z'github.com/juanfont/headscale/gen/go/v1b\x06proto3" | ||||||
| 	0x54, 0x61, 0x67, 0x73, 0x22, 0x56, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, |  | ||||||
| 	0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, |  | ||||||
| 	0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, |  | ||||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, |  | ||||||
| 	0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, |  | ||||||
| 	0x52, 0x0a, 0x70, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x3f, 0x0a, 0x17, |  | ||||||
| 	0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, |  | ||||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, |  | ||||||
| 	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, |  | ||||||
| 	0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x1a, 0x0a, |  | ||||||
| 	0x18, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, |  | ||||||
| 	0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4c, 0x69, 0x73, |  | ||||||
| 	0x74, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, |  | ||||||
| 	0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, |  | ||||||
| 	0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x57, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, |  | ||||||
| 	0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, |  | ||||||
| 	0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, |  | ||||||
| 	0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x68, 0x65, 0x61, 0x64, |  | ||||||
| 	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, |  | ||||||
| 	0x4b, 0x65, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x73, |  | ||||||
| 	0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, |  | ||||||
| 	0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, |  | ||||||
| 	0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, |  | ||||||
| 	0x74, 0x6f, 0x33, |  | ||||||
| }) |  | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	file_headscale_v1_preauthkey_proto_rawDescOnce sync.Once | 	file_headscale_v1_preauthkey_proto_rawDescOnce sync.Once | ||||||
| @ -511,19 +486,21 @@ var file_headscale_v1_preauthkey_proto_goTypes = []any{ | |||||||
| 	(*ExpirePreAuthKeyResponse)(nil), // 4: headscale.v1.ExpirePreAuthKeyResponse | 	(*ExpirePreAuthKeyResponse)(nil), // 4: headscale.v1.ExpirePreAuthKeyResponse | ||||||
| 	(*ListPreAuthKeysRequest)(nil),   // 5: headscale.v1.ListPreAuthKeysRequest | 	(*ListPreAuthKeysRequest)(nil),   // 5: headscale.v1.ListPreAuthKeysRequest | ||||||
| 	(*ListPreAuthKeysResponse)(nil),  // 6: headscale.v1.ListPreAuthKeysResponse | 	(*ListPreAuthKeysResponse)(nil),  // 6: headscale.v1.ListPreAuthKeysResponse | ||||||
| 	(*timestamppb.Timestamp)(nil),    // 7: google.protobuf.Timestamp | 	(*User)(nil),                     // 7: headscale.v1.User | ||||||
|  | 	(*timestamppb.Timestamp)(nil),    // 8: google.protobuf.Timestamp | ||||||
| } | } | ||||||
| var file_headscale_v1_preauthkey_proto_depIdxs = []int32{ | var file_headscale_v1_preauthkey_proto_depIdxs = []int32{ | ||||||
| 	7, // 0: headscale.v1.PreAuthKey.expiration:type_name -> google.protobuf.Timestamp | 	7, // 0: headscale.v1.PreAuthKey.user:type_name -> headscale.v1.User | ||||||
| 	7, // 1: headscale.v1.PreAuthKey.created_at:type_name -> google.protobuf.Timestamp | 	8, // 1: headscale.v1.PreAuthKey.expiration:type_name -> google.protobuf.Timestamp | ||||||
| 	7, // 2: headscale.v1.CreatePreAuthKeyRequest.expiration:type_name -> google.protobuf.Timestamp | 	8, // 2: headscale.v1.PreAuthKey.created_at:type_name -> google.protobuf.Timestamp | ||||||
| 	0, // 3: headscale.v1.CreatePreAuthKeyResponse.pre_auth_key:type_name -> headscale.v1.PreAuthKey | 	8, // 3: headscale.v1.CreatePreAuthKeyRequest.expiration:type_name -> google.protobuf.Timestamp | ||||||
| 	0, // 4: headscale.v1.ListPreAuthKeysResponse.pre_auth_keys:type_name -> headscale.v1.PreAuthKey | 	0, // 4: headscale.v1.CreatePreAuthKeyResponse.pre_auth_key:type_name -> headscale.v1.PreAuthKey | ||||||
| 	5, // [5:5] is the sub-list for method output_type | 	0, // 5: headscale.v1.ListPreAuthKeysResponse.pre_auth_keys:type_name -> headscale.v1.PreAuthKey | ||||||
| 	5, // [5:5] is the sub-list for method input_type | 	6, // [6:6] is the sub-list for method output_type | ||||||
| 	5, // [5:5] is the sub-list for extension type_name | 	6, // [6:6] is the sub-list for method input_type | ||||||
| 	5, // [5:5] is the sub-list for extension extendee | 	6, // [6:6] is the sub-list for extension type_name | ||||||
| 	0, // [0:5] is the sub-list for field type_name | 	6, // [6:6] is the sub-list for extension extendee | ||||||
|  | 	0, // [0:6] is the sub-list for field type_name | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func init() { file_headscale_v1_preauthkey_proto_init() } | func init() { file_headscale_v1_preauthkey_proto_init() } | ||||||
| @ -531,6 +508,7 @@ func file_headscale_v1_preauthkey_proto_init() { | |||||||
| 	if File_headscale_v1_preauthkey_proto != nil { | 	if File_headscale_v1_preauthkey_proto != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | 	file_headscale_v1_user_proto_init() | ||||||
| 	type x struct{} | 	type x struct{} | ||||||
| 	out := protoimpl.TypeBuilder{ | 	out := protoimpl.TypeBuilder{ | ||||||
| 		File: protoimpl.DescBuilder{ | 		File: protoimpl.DescBuilder{ | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | // Code generated by protoc-gen-go. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // 	protoc-gen-go v1.36.5 | // 	protoc-gen-go v1.36.6 | ||||||
| // 	protoc        (unknown) | // 	protoc        (unknown) | ||||||
| // source: headscale/v1/user.proto | // source: headscale/v1/user.proto | ||||||
| 
 | 
 | ||||||
| @ -516,65 +516,42 @@ func (x *ListUsersResponse) GetUsers() []*User { | |||||||
| 
 | 
 | ||||||
| var File_headscale_v1_user_proto protoreflect.FileDescriptor | var File_headscale_v1_user_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_headscale_v1_user_proto_rawDesc = string([]byte{ | const file_headscale_v1_user_proto_rawDesc = "" + | ||||||
| 	0x0a, 0x17, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x75, | 	"\n" + | ||||||
| 	0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x73, | 	"\x17headscale/v1/user.proto\x12\fheadscale.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"\x83\x02\n" + | ||||||
| 	0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, | 	"\x04User\x12\x0e\n" + | ||||||
| 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, | 	"\x02id\x18\x01 \x01(\x04R\x02id\x12\x12\n" + | ||||||
| 	0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x83, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, | 	"\x04name\x18\x02 \x01(\tR\x04name\x129\n" + | ||||||
| 	0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, | 	"\n" + | ||||||
| 	0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, | 	"created_at\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12!\n" + | ||||||
| 	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, | 	"\fdisplay_name\x18\x04 \x01(\tR\vdisplayName\x12\x14\n" + | ||||||
| 	0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, | 	"\x05email\x18\x05 \x01(\tR\x05email\x12\x1f\n" + | ||||||
| 	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, | 	"\vprovider_id\x18\x06 \x01(\tR\n" + | ||||||
| 	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, | 	"providerId\x12\x1a\n" + | ||||||
| 	0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, | 	"\bprovider\x18\a \x01(\tR\bprovider\x12&\n" + | ||||||
| 	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, | 	"\x0fprofile_pic_url\x18\b \x01(\tR\rprofilePicUrl\"\x81\x01\n" + | ||||||
| 	0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, | 	"\x11CreateUserRequest\x12\x12\n" + | ||||||
| 	0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, | 	"\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + | ||||||
| 	0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, | 	"\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12\x14\n" + | ||||||
| 	0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, | 	"\x05email\x18\x03 \x01(\tR\x05email\x12\x1f\n" + | ||||||
| 	0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, | 	"\vpicture_url\x18\x04 \x01(\tR\n" + | ||||||
| 	0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, | 	"pictureUrl\"<\n" + | ||||||
| 	0x65, 0x5f, 0x70, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, | 	"\x12CreateUserResponse\x12&\n" + | ||||||
| 	0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x22, 0x81, | 	"\x04user\x18\x01 \x01(\v2\x12.headscale.v1.UserR\x04user\"E\n" + | ||||||
| 	0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, | 	"\x11RenameUserRequest\x12\x15\n" + | ||||||
| 	0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, | 	"\x06old_id\x18\x01 \x01(\x04R\x05oldId\x12\x19\n" + | ||||||
| 	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, | 	"\bnew_name\x18\x02 \x01(\tR\anewName\"<\n" + | ||||||
| 	0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, | 	"\x12RenameUserResponse\x12&\n" + | ||||||
| 	0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, | 	"\x04user\x18\x01 \x01(\v2\x12.headscale.v1.UserR\x04user\"#\n" + | ||||||
| 	0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, | 	"\x11DeleteUserRequest\x12\x0e\n" + | ||||||
| 	0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x75, 0x72, 0x6c, | 	"\x02id\x18\x01 \x01(\x04R\x02id\"\x14\n" + | ||||||
| 	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x55, | 	"\x12DeleteUserResponse\"L\n" + | ||||||
| 	0x72, 0x6c, 0x22, 0x3c, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, | 	"\x10ListUsersRequest\x12\x0e\n" + | ||||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, | 	"\x02id\x18\x01 \x01(\x04R\x02id\x12\x12\n" + | ||||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, | 	"\x04name\x18\x02 \x01(\tR\x04name\x12\x14\n" + | ||||||
| 	0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, | 	"\x05email\x18\x03 \x01(\tR\x05email\"=\n" + | ||||||
| 	0x22, 0x45, 0x0a, 0x11, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, | 	"\x11ListUsersResponse\x12(\n" + | ||||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, | 	"\x05users\x18\x01 \x03(\v2\x12.headscale.v1.UserR\x05usersB)Z'github.com/juanfont/headscale/gen/go/v1b\x06proto3" | ||||||
| 	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6f, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, |  | ||||||
| 	0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, |  | ||||||
| 	0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3c, 0x0a, 0x12, 0x52, 0x65, 0x6e, 0x61, 0x6d, |  | ||||||
| 	0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, |  | ||||||
| 	0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x68, 0x65, |  | ||||||
| 	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, |  | ||||||
| 	0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x23, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, |  | ||||||
| 	0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, |  | ||||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, |  | ||||||
| 	0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, |  | ||||||
| 	0x22, 0x4c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, |  | ||||||
| 	0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, |  | ||||||
| 	0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, |  | ||||||
| 	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, |  | ||||||
| 	0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x3d, |  | ||||||
| 	0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, |  | ||||||
| 	0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, |  | ||||||
| 	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, |  | ||||||
| 	0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x42, 0x29, 0x5a, |  | ||||||
| 	0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, |  | ||||||
| 	0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, |  | ||||||
| 	0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, |  | ||||||
| }) |  | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	file_headscale_v1_user_proto_rawDescOnce sync.Once | 	file_headscale_v1_user_proto_rawDescOnce sync.Once | ||||||
|  | |||||||
| @ -580,7 +580,8 @@ | |||||||
|             "name": "user", |             "name": "user", | ||||||
|             "in": "query", |             "in": "query", | ||||||
|             "required": false, |             "required": false, | ||||||
|             "type": "string" |             "type": "string", | ||||||
|  |             "format": "uint64" | ||||||
|           } |           } | ||||||
|         ], |         ], | ||||||
|         "tags": [ |         "tags": [ | ||||||
| @ -909,7 +910,8 @@ | |||||||
|       "type": "object", |       "type": "object", | ||||||
|       "properties": { |       "properties": { | ||||||
|         "user": { |         "user": { | ||||||
|           "type": "string" |           "type": "string", | ||||||
|  |           "format": "uint64" | ||||||
|         }, |         }, | ||||||
|         "reusable": { |         "reusable": { | ||||||
|           "type": "boolean" |           "type": "boolean" | ||||||
| @ -1022,7 +1024,8 @@ | |||||||
|       "type": "object", |       "type": "object", | ||||||
|       "properties": { |       "properties": { | ||||||
|         "user": { |         "user": { | ||||||
|           "type": "string" |           "type": "string", | ||||||
|  |           "format": "uint64" | ||||||
|         }, |         }, | ||||||
|         "key": { |         "key": { | ||||||
|           "type": "string" |           "type": "string" | ||||||
| @ -1202,10 +1205,11 @@ | |||||||
|       "type": "object", |       "type": "object", | ||||||
|       "properties": { |       "properties": { | ||||||
|         "user": { |         "user": { | ||||||
|           "type": "string" |           "$ref": "#/definitions/v1User" | ||||||
|         }, |         }, | ||||||
|         "id": { |         "id": { | ||||||
|           "type": "string" |           "type": "string", | ||||||
|  |           "format": "uint64" | ||||||
|         }, |         }, | ||||||
|         "key": { |         "key": { | ||||||
|           "type": "string" |           "type": "string" | ||||||
|  | |||||||
| @ -652,7 +652,7 @@ AND auth_key_id NOT IN ( | |||||||
| 
 | 
 | ||||||
| 					for nodeID, routes := range nodeRoutes { | 					for nodeID, routes := range nodeRoutes { | ||||||
| 						tsaddr.SortPrefixes(routes) | 						tsaddr.SortPrefixes(routes) | ||||||
| 						slices.Compact(routes) | 						routes = slices.Compact(routes) | ||||||
| 
 | 
 | ||||||
| 						data, err := json.Marshal(routes) | 						data, err := json.Marshal(routes) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -161,7 +161,7 @@ func (api headscaleV1APIServer) CreatePreAuthKey( | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	user, err := api.h.db.GetUserByName(request.GetUser()) | 	user, err := api.h.db.GetUserByID(types.UserID(request.GetUser())) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @ -190,7 +190,7 @@ func (api headscaleV1APIServer) ExpirePreAuthKey( | |||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if preAuthKey.User.Name != request.GetUser() { | 		if uint64(preAuthKey.User.ID) != request.GetUser() { | ||||||
| 			return fmt.Errorf("preauth key does not belong to user") | 			return fmt.Errorf("preauth key does not belong to user") | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| @ -207,7 +207,7 @@ func (api headscaleV1APIServer) ListPreAuthKeys( | |||||||
| 	ctx context.Context, | 	ctx context.Context, | ||||||
| 	request *v1.ListPreAuthKeysRequest, | 	request *v1.ListPreAuthKeysRequest, | ||||||
| ) (*v1.ListPreAuthKeysResponse, error) { | ) (*v1.ListPreAuthKeysResponse, error) { | ||||||
| 	user, err := api.h.db.GetUserByName(request.GetUser()) | 	user, err := api.h.db.GetUserByID(types.UserID(request.GetUser())) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -111,7 +111,7 @@ func generateUserProfiles( | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	slices.Sort(ids) | 	slices.Sort(ids) | ||||||
| 	slices.Compact(ids) | 	ids = slices.Compact(ids) | ||||||
| 	var profiles []tailcfg.UserProfile | 	var profiles []tailcfg.UserProfile | ||||||
| 	for _, id := range ids { | 	for _, id := range ids { | ||||||
| 		if userMap[id] != nil { | 		if userMap[id] != nil { | ||||||
|  | |||||||
| @ -1,11 +1,9 @@ | |||||||
| package types | package types | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"strconv" |  | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||||
| 	"github.com/juanfont/headscale/hscontrol/util" |  | ||||||
| 	"google.golang.org/protobuf/types/known/timestamppb" | 	"google.golang.org/protobuf/types/known/timestamppb" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -31,8 +29,8 @@ type PreAuthKey struct { | |||||||
| 
 | 
 | ||||||
| func (key *PreAuthKey) Proto() *v1.PreAuthKey { | func (key *PreAuthKey) Proto() *v1.PreAuthKey { | ||||||
| 	protoKey := v1.PreAuthKey{ | 	protoKey := v1.PreAuthKey{ | ||||||
| 		User:      key.User.Username(), | 		User:      key.User.Proto(), | ||||||
| 		Id:        strconv.FormatUint(key.ID, util.Base10), | 		Id:        key.ID, | ||||||
| 		Key:       key.Key, | 		Key:       key.Key, | ||||||
| 		Ephemeral: key.Ephemeral, | 		Ephemeral: key.Ephemeral, | ||||||
| 		Reusable:  key.Reusable, | 		Reusable:  key.Reusable, | ||||||
|  | |||||||
| @ -3,9 +3,12 @@ package integration | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/netip" | 	"net/netip" | ||||||
|  | 	"strconv" | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | 	"slices" | ||||||
|  | 
 | ||||||
| 	"github.com/juanfont/headscale/integration/hsic" | 	"github.com/juanfont/headscale/integration/hsic" | ||||||
| 	"github.com/juanfont/headscale/integration/tsic" | 	"github.com/juanfont/headscale/integration/tsic" | ||||||
| 	"github.com/samber/lo" | 	"github.com/samber/lo" | ||||||
| @ -84,8 +87,11 @@ func TestAuthKeyLogoutAndReloginSameUser(t *testing.T) { | |||||||
| 				time.Sleep(5 * time.Minute) | 				time.Sleep(5 * time.Minute) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			userMap, err := headscale.MapUsers() | ||||||
|  | 			assertNoErr(t, err) | ||||||
|  | 
 | ||||||
| 			for _, userName := range spec.Users { | 			for _, userName := range spec.Users { | ||||||
| 				key, err := scenario.CreatePreAuthKey(userName, true, false) | 				key, err := scenario.CreatePreAuthKey(userMap[userName].GetId(), true, false) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					t.Fatalf("failed to create pre-auth key for user %s: %s", userName, err) | 					t.Fatalf("failed to create pre-auth key for user %s: %s", userName, err) | ||||||
| 				} | 				} | ||||||
| @ -121,16 +127,7 @@ func TestAuthKeyLogoutAndReloginSameUser(t *testing.T) { | |||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				for _, ip := range ips { | 				for _, ip := range ips { | ||||||
| 					found := false | 					if !slices.Contains(clientIPs[client], ip) { | ||||||
| 					for _, oldIP := range clientIPs[client] { |  | ||||||
| 						if ip == oldIP { |  | ||||||
| 							found = true |  | ||||||
| 
 |  | ||||||
| 							break |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					if !found { |  | ||||||
| 						t.Fatalf( | 						t.Fatalf( | ||||||
| 							"IPs changed for client %s. Used to be %v now %v", | 							"IPs changed for client %s. Used to be %v now %v", | ||||||
| 							client.Hostname(), | 							client.Hostname(), | ||||||
| @ -195,8 +192,11 @@ func TestAuthKeyLogoutAndReloginNewUser(t *testing.T) { | |||||||
| 
 | 
 | ||||||
| 	t.Logf("all clients logged out") | 	t.Logf("all clients logged out") | ||||||
| 
 | 
 | ||||||
|  | 	userMap, err := headscale.MapUsers() | ||||||
|  | 	assertNoErr(t, err) | ||||||
|  | 
 | ||||||
| 	// Create a new authkey for user1, to be used for all clients | 	// Create a new authkey for user1, to be used for all clients | ||||||
| 	key, err := scenario.CreatePreAuthKey("user1", true, false) | 	key, err := scenario.CreatePreAuthKey(userMap["user1"].GetId(), true, false) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("failed to create pre-auth key for user1: %s", err) | 		t.Fatalf("failed to create pre-auth key for user1: %s", err) | ||||||
| 	} | 	} | ||||||
| @ -300,8 +300,11 @@ func TestAuthKeyLogoutAndReloginSameUserExpiredKey(t *testing.T) { | |||||||
| 				time.Sleep(5 * time.Minute) | 				time.Sleep(5 * time.Minute) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			userMap, err := headscale.MapUsers() | ||||||
|  | 			assertNoErr(t, err) | ||||||
|  | 
 | ||||||
| 			for _, userName := range spec.Users { | 			for _, userName := range spec.Users { | ||||||
| 				key, err := scenario.CreatePreAuthKey(userName, true, false) | 				key, err := scenario.CreatePreAuthKey(userMap[userName].GetId(), true, false) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					t.Fatalf("failed to create pre-auth key for user %s: %s", userName, err) | 					t.Fatalf("failed to create pre-auth key for user %s: %s", userName, err) | ||||||
| 				} | 				} | ||||||
| @ -312,7 +315,7 @@ func TestAuthKeyLogoutAndReloginSameUserExpiredKey(t *testing.T) { | |||||||
| 						"headscale", | 						"headscale", | ||||||
| 						"preauthkeys", | 						"preauthkeys", | ||||||
| 						"--user", | 						"--user", | ||||||
| 						userName, | 						strconv.FormatUint(userMap[userName].GetId(), 10), | ||||||
| 						"expire", | 						"expire", | ||||||
| 						key.Key, | 						key.Key, | ||||||
| 					}) | 					}) | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ import ( | |||||||
| 	"cmp" | 	"cmp" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| @ -271,7 +272,7 @@ func TestPreAuthKeyCommand(t *testing.T) { | |||||||
| 				"headscale", | 				"headscale", | ||||||
| 				"preauthkeys", | 				"preauthkeys", | ||||||
| 				"--user", | 				"--user", | ||||||
| 				user, | 				"1", | ||||||
| 				"create", | 				"create", | ||||||
| 				"--reusable", | 				"--reusable", | ||||||
| 				"--expiration", | 				"--expiration", | ||||||
| @ -297,7 +298,7 @@ func TestPreAuthKeyCommand(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user, | 			"1", | ||||||
| 			"list", | 			"list", | ||||||
| 			"--output", | 			"--output", | ||||||
| 			"json", | 			"json", | ||||||
| @ -311,8 +312,8 @@ func TestPreAuthKeyCommand(t *testing.T) { | |||||||
| 
 | 
 | ||||||
| 	assert.Equal( | 	assert.Equal( | ||||||
| 		t, | 		t, | ||||||
| 		[]string{keys[0].GetId(), keys[1].GetId(), keys[2].GetId()}, | 		[]uint64{keys[0].GetId(), keys[1].GetId(), keys[2].GetId()}, | ||||||
| 		[]string{ | 		[]uint64{ | ||||||
| 			listedPreAuthKeys[1].GetId(), | 			listedPreAuthKeys[1].GetId(), | ||||||
| 			listedPreAuthKeys[2].GetId(), | 			listedPreAuthKeys[2].GetId(), | ||||||
| 			listedPreAuthKeys[3].GetId(), | 			listedPreAuthKeys[3].GetId(), | ||||||
| @ -354,7 +355,7 @@ func TestPreAuthKeyCommand(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user, | 			"1", | ||||||
| 			"expire", | 			"expire", | ||||||
| 			listedPreAuthKeys[1].GetKey(), | 			listedPreAuthKeys[1].GetKey(), | ||||||
| 		}, | 		}, | ||||||
| @ -368,7 +369,7 @@ func TestPreAuthKeyCommand(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user, | 			"1", | ||||||
| 			"list", | 			"list", | ||||||
| 			"--output", | 			"--output", | ||||||
| 			"json", | 			"json", | ||||||
| @ -408,7 +409,7 @@ func TestPreAuthKeyCommandWithoutExpiry(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user, | 			"1", | ||||||
| 			"create", | 			"create", | ||||||
| 			"--reusable", | 			"--reusable", | ||||||
| 			"--output", | 			"--output", | ||||||
| @ -425,7 +426,7 @@ func TestPreAuthKeyCommandWithoutExpiry(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user, | 			"1", | ||||||
| 			"list", | 			"list", | ||||||
| 			"--output", | 			"--output", | ||||||
| 			"json", | 			"json", | ||||||
| @ -470,7 +471,7 @@ func TestPreAuthKeyCommandReusableEphemeral(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user, | 			"1", | ||||||
| 			"create", | 			"create", | ||||||
| 			"--reusable=true", | 			"--reusable=true", | ||||||
| 			"--output", | 			"--output", | ||||||
| @ -487,7 +488,7 @@ func TestPreAuthKeyCommandReusableEphemeral(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user, | 			"1", | ||||||
| 			"create", | 			"create", | ||||||
| 			"--ephemeral=true", | 			"--ephemeral=true", | ||||||
| 			"--output", | 			"--output", | ||||||
| @ -507,7 +508,7 @@ func TestPreAuthKeyCommandReusableEphemeral(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user, | 			"1", | ||||||
| 			"list", | 			"list", | ||||||
| 			"--output", | 			"--output", | ||||||
| 			"json", | 			"json", | ||||||
| @ -547,7 +548,7 @@ func TestPreAuthKeyCorrectUserLoggedInCommand(t *testing.T) { | |||||||
| 	headscale, err := scenario.Headscale() | 	headscale, err := scenario.Headscale() | ||||||
| 	assertNoErr(t, err) | 	assertNoErr(t, err) | ||||||
| 
 | 
 | ||||||
| 	err = headscale.CreateUser(user2) | 	u2, err := headscale.CreateUser(user2) | ||||||
| 	assertNoErr(t, err) | 	assertNoErr(t, err) | ||||||
| 
 | 
 | ||||||
| 	var user2Key v1.PreAuthKey | 	var user2Key v1.PreAuthKey | ||||||
| @ -558,7 +559,7 @@ func TestPreAuthKeyCorrectUserLoggedInCommand(t *testing.T) { | |||||||
| 			"headscale", | 			"headscale", | ||||||
| 			"preauthkeys", | 			"preauthkeys", | ||||||
| 			"--user", | 			"--user", | ||||||
| 			user2, | 			strconv.FormatUint(u2.GetId(), 10), | ||||||
| 			"create", | 			"create", | ||||||
| 			"--reusable", | 			"--reusable", | ||||||
| 			"--expiration", | 			"--expiration", | ||||||
|  | |||||||
| @ -18,10 +18,11 @@ type ControlServer interface { | |||||||
| 	GetHealthEndpoint() string | 	GetHealthEndpoint() string | ||||||
| 	GetEndpoint() string | 	GetEndpoint() string | ||||||
| 	WaitForRunning() error | 	WaitForRunning() error | ||||||
| 	CreateUser(user string) error | 	CreateUser(user string) (*v1.User, error) | ||||||
| 	CreateAuthKey(user string, reusable bool, ephemeral bool) (*v1.PreAuthKey, error) | 	CreateAuthKey(user uint64, reusable bool, ephemeral bool) (*v1.PreAuthKey, error) | ||||||
| 	ListNodes(users ...string) ([]*v1.Node, error) | 	ListNodes(users ...string) ([]*v1.Node, error) | ||||||
| 	ListUsers() ([]*v1.User, error) | 	ListUsers() ([]*v1.User, error) | ||||||
|  | 	MapUsers() (map[string]*v1.User, error) | ||||||
| 	ApproveRoutes(uint64, []netip.Prefix) (*v1.Node, error) | 	ApproveRoutes(uint64, []netip.Prefix) (*v1.Node, error) | ||||||
| 	GetCert() []byte | 	GetCert() []byte | ||||||
| 	GetHostname() string | 	GetHostname() string | ||||||
|  | |||||||
| @ -133,7 +133,7 @@ func testEphemeralWithOptions(t *testing.T, opts ...hsic.Option) { | |||||||
| 	assertNoErrHeadscaleEnv(t, err) | 	assertNoErrHeadscaleEnv(t, err) | ||||||
| 
 | 
 | ||||||
| 	for _, userName := range spec.Users { | 	for _, userName := range spec.Users { | ||||||
| 		err = scenario.CreateUser(userName) | 		user, err := scenario.CreateUser(userName) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.Fatalf("failed to create user %s: %s", userName, err) | 			t.Fatalf("failed to create user %s: %s", userName, err) | ||||||
| 		} | 		} | ||||||
| @ -143,7 +143,7 @@ func testEphemeralWithOptions(t *testing.T, opts ...hsic.Option) { | |||||||
| 			t.Fatalf("failed to create tailscale nodes in user %s: %s", userName, err) | 			t.Fatalf("failed to create tailscale nodes in user %s: %s", userName, err) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		key, err := scenario.CreatePreAuthKey(userName, true, true) | 		key, err := scenario.CreatePreAuthKey(user.GetId(), true, true) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.Fatalf("failed to create pre-auth key for user %s: %s", userName, err) | 			t.Fatalf("failed to create pre-auth key for user %s: %s", userName, err) | ||||||
| 		} | 		} | ||||||
| @ -211,7 +211,7 @@ func TestEphemeral2006DeletedTooQuickly(t *testing.T) { | |||||||
| 	assertNoErrHeadscaleEnv(t, err) | 	assertNoErrHeadscaleEnv(t, err) | ||||||
| 
 | 
 | ||||||
| 	for _, userName := range spec.Users { | 	for _, userName := range spec.Users { | ||||||
| 		err = scenario.CreateUser(userName) | 		user, err := scenario.CreateUser(userName) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.Fatalf("failed to create user %s: %s", userName, err) | 			t.Fatalf("failed to create user %s: %s", userName, err) | ||||||
| 		} | 		} | ||||||
| @ -221,7 +221,7 @@ func TestEphemeral2006DeletedTooQuickly(t *testing.T) { | |||||||
| 			t.Fatalf("failed to create tailscale nodes in user %s: %s", userName, err) | 			t.Fatalf("failed to create tailscale nodes in user %s: %s", userName, err) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		key, err := scenario.CreatePreAuthKey(userName, true, true) | 		key, err := scenario.CreatePreAuthKey(user.GetId(), true, true) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.Fatalf("failed to create pre-auth key for user %s: %s", userName, err) | 			t.Fatalf("failed to create pre-auth key for user %s: %s", userName, err) | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -28,6 +28,7 @@ import ( | |||||||
| 	"github.com/ory/dockertest/v3/docker" | 	"github.com/ory/dockertest/v3/docker" | ||||||
| 	"gopkg.in/yaml.v3" | 	"gopkg.in/yaml.v3" | ||||||
| 	"tailscale.com/tailcfg" | 	"tailscale.com/tailcfg" | ||||||
|  | 	"tailscale.com/util/mak" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -703,32 +704,38 @@ func (t *HeadscaleInContainer) WaitForRunning() error { | |||||||
| // CreateUser adds a new user to the Headscale instance. | // CreateUser adds a new user to the Headscale instance. | ||||||
| func (t *HeadscaleInContainer) CreateUser( | func (t *HeadscaleInContainer) CreateUser( | ||||||
| 	user string, | 	user string, | ||||||
| ) error { | ) (*v1.User, error) { | ||||||
| 	command := []string{"headscale", "users", "create", user, fmt.Sprintf("--email=%s@test.no", user)} | 	command := []string{"headscale", "users", "create", user, fmt.Sprintf("--email=%s@test.no", user), "--output", "json"} | ||||||
| 
 | 
 | ||||||
| 	_, _, err := dockertestutil.ExecuteCommand( | 	result, _, err := dockertestutil.ExecuteCommand( | ||||||
| 		t.container, | 		t.container, | ||||||
| 		command, | 		command, | ||||||
| 		[]string{}, | 		[]string{}, | ||||||
| 	) | 	) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return nil | 	var u v1.User | ||||||
|  | 	err = json.Unmarshal([]byte(result), &u) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to unmarshal user: %w", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return &u, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CreateAuthKey creates a new "authorisation key" for a User that can be used | // CreateAuthKey creates a new "authorisation key" for a User that can be used | ||||||
| // to authorise a TailscaleClient with the Headscale instance. | // to authorise a TailscaleClient with the Headscale instance. | ||||||
| func (t *HeadscaleInContainer) CreateAuthKey( | func (t *HeadscaleInContainer) CreateAuthKey( | ||||||
| 	user string, | 	user uint64, | ||||||
| 	reusable bool, | 	reusable bool, | ||||||
| 	ephemeral bool, | 	ephemeral bool, | ||||||
| ) (*v1.PreAuthKey, error) { | ) (*v1.PreAuthKey, error) { | ||||||
| 	command := []string{ | 	command := []string{ | ||||||
| 		"headscale", | 		"headscale", | ||||||
| 		"--user", | 		"--user", | ||||||
| 		user, | 		strconv.FormatUint(user, 10), | ||||||
| 		"preauthkeys", | 		"preauthkeys", | ||||||
| 		"create", | 		"create", | ||||||
| 		"--expiration", | 		"--expiration", | ||||||
| @ -834,6 +841,22 @@ func (t *HeadscaleInContainer) ListUsers() ([]*v1.User, error) { | |||||||
| 	return users, nil | 	return users, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // MapUsers returns a map of users from Headscale. It is keyed by the | ||||||
|  | // user name. | ||||||
|  | func (t *HeadscaleInContainer) MapUsers() (map[string]*v1.User, error) { | ||||||
|  | 	users, err := t.ListUsers() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var userMap map[string]*v1.User | ||||||
|  | 	for _, user := range users { | ||||||
|  | 		mak.Set(&userMap, user.Name, user) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return userMap, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (h *HeadscaleInContainer) SetPolicy(pol *policyv1.ACLPolicy) error { | func (h *HeadscaleInContainer) SetPolicy(pol *policyv1.ACLPolicy) error { | ||||||
| 	err := h.writePolicy(pol) | 	err := h.writePolicy(pol) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
| @ -1680,7 +1680,10 @@ func TestAutoApproveMultiNetwork(t *testing.T) { | |||||||
| 
 | 
 | ||||||
| 						scenario.runHeadscaleRegister("user1", body) | 						scenario.runHeadscaleRegister("user1", body) | ||||||
| 					} else { | 					} else { | ||||||
| 						pak, err := scenario.CreatePreAuthKey("user1", false, false) | 						userMap, err := headscale.MapUsers() | ||||||
|  | 						assertNoErr(t, err) | ||||||
|  | 
 | ||||||
|  | 						pak, err := scenario.CreatePreAuthKey(userMap["user1"].GetId(), false, false) | ||||||
| 						assertNoErr(t, err) | 						assertNoErr(t, err) | ||||||
| 
 | 
 | ||||||
| 						err = routerUsernet1.Login(headscale.GetEndpoint(), pak.Key) | 						err = routerUsernet1.Login(headscale.GetEndpoint(), pak.Key) | ||||||
|  | |||||||
| @ -436,7 +436,7 @@ func (s *Scenario) Headscale(opts ...hsic.Option) (ControlServer, error) { | |||||||
| // CreatePreAuthKey creates a "pre authentorised key" to be created in the | // CreatePreAuthKey creates a "pre authentorised key" to be created in the | ||||||
| // Headscale instance on behalf of the Scenario. | // Headscale instance on behalf of the Scenario. | ||||||
| func (s *Scenario) CreatePreAuthKey( | func (s *Scenario) CreatePreAuthKey( | ||||||
| 	user string, | 	user uint64, | ||||||
| 	reusable bool, | 	reusable bool, | ||||||
| 	ephemeral bool, | 	ephemeral bool, | ||||||
| ) (*v1.PreAuthKey, error) { | ) (*v1.PreAuthKey, error) { | ||||||
| @ -454,21 +454,21 @@ func (s *Scenario) CreatePreAuthKey( | |||||||
| 
 | 
 | ||||||
| // CreateUser creates a User to be created in the | // CreateUser creates a User to be created in the | ||||||
| // Headscale instance on behalf of the Scenario. | // Headscale instance on behalf of the Scenario. | ||||||
| func (s *Scenario) CreateUser(user string) error { | func (s *Scenario) CreateUser(user string) (*v1.User, error) { | ||||||
| 	if headscale, err := s.Headscale(); err == nil { | 	if headscale, err := s.Headscale(); err == nil { | ||||||
| 		err := headscale.CreateUser(user) | 		u, err := headscale.CreateUser(user) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("failed to create user: %w", err) | 			return nil, fmt.Errorf("failed to create user: %w", err) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		s.users[user] = &User{ | 		s.users[user] = &User{ | ||||||
| 			Clients: make(map[string]TailscaleClient), | 			Clients: make(map[string]TailscaleClient), | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return nil | 		return u, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return fmt.Errorf("failed to create user: %w", errNoHeadscaleAvailable) | 	return nil, fmt.Errorf("failed to create user: %w", errNoHeadscaleAvailable) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Client related stuff | /// Client related stuff | ||||||
| @ -703,7 +703,7 @@ func (s *Scenario) createHeadscaleEnv( | |||||||
| 
 | 
 | ||||||
| 	sort.Strings(s.spec.Users) | 	sort.Strings(s.spec.Users) | ||||||
| 	for _, user := range s.spec.Users { | 	for _, user := range s.spec.Users { | ||||||
| 		err = s.CreateUser(user) | 		u, err := s.CreateUser(user) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @ -726,7 +726,7 @@ func (s *Scenario) createHeadscaleEnv( | |||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			key, err := s.CreatePreAuthKey(user, true, false) | 			key, err := s.CreatePreAuthKey(u.GetId(), true, false) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ func TestHeadscale(t *testing.T) { | |||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	t.Run("create-user", func(t *testing.T) { | 	t.Run("create-user", func(t *testing.T) { | ||||||
| 		err := scenario.CreateUser(user) | 		_, err := scenario.CreateUser(user) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.Fatalf("failed to create user: %s", err) | 			t.Fatalf("failed to create user: %s", err) | ||||||
| 		} | 		} | ||||||
| @ -62,7 +62,7 @@ func TestHeadscale(t *testing.T) { | |||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	t.Run("create-auth-key", func(t *testing.T) { | 	t.Run("create-auth-key", func(t *testing.T) { | ||||||
| 		_, err := scenario.CreatePreAuthKey(user, true, false) | 		_, err := scenario.CreatePreAuthKey(1, true, false) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.Fatalf("failed to create preauthkey: %s", err) | 			t.Fatalf("failed to create preauthkey: %s", err) | ||||||
| 		} | 		} | ||||||
| @ -100,7 +100,7 @@ func TestTailscaleNodesJoiningHeadcale(t *testing.T) { | |||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	t.Run("create-user", func(t *testing.T) { | 	t.Run("create-user", func(t *testing.T) { | ||||||
| 		err := scenario.CreateUser(user) | 		_, err := scenario.CreateUser(user) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.Fatalf("failed to create user: %s", err) | 			t.Fatalf("failed to create user: %s", err) | ||||||
| 		} | 		} | ||||||
| @ -122,7 +122,7 @@ func TestTailscaleNodesJoiningHeadcale(t *testing.T) { | |||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	t.Run("join-headscale", func(t *testing.T) { | 	t.Run("join-headscale", func(t *testing.T) { | ||||||
| 		key, err := scenario.CreatePreAuthKey(user, true, false) | 		key, err := scenario.CreatePreAuthKey(1, true, false) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.Fatalf("failed to create preauthkey: %s", err) | 			t.Fatalf("failed to create preauthkey: %s", err) | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -3,10 +3,11 @@ package headscale.v1; | |||||||
| option go_package = "github.com/juanfont/headscale/gen/go/v1"; | option go_package = "github.com/juanfont/headscale/gen/go/v1"; | ||||||
| 
 | 
 | ||||||
| import "google/protobuf/timestamp.proto"; | import "google/protobuf/timestamp.proto"; | ||||||
|  | import "headscale/v1/user.proto"; | ||||||
| 
 | 
 | ||||||
| message PreAuthKey { | message PreAuthKey { | ||||||
|   string user = 1; |   User user = 1; | ||||||
|   string id = 2; |   uint64 id = 2; | ||||||
|   string key = 3; |   string key = 3; | ||||||
|   bool reusable = 4; |   bool reusable = 4; | ||||||
|   bool ephemeral = 5; |   bool ephemeral = 5; | ||||||
| @ -17,7 +18,7 @@ message PreAuthKey { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message CreatePreAuthKeyRequest { | message CreatePreAuthKeyRequest { | ||||||
|   string user = 1; |   uint64 user = 1; | ||||||
|   bool reusable = 2; |   bool reusable = 2; | ||||||
|   bool ephemeral = 3; |   bool ephemeral = 3; | ||||||
|   google.protobuf.Timestamp expiration = 4; |   google.protobuf.Timestamp expiration = 4; | ||||||
| @ -27,12 +28,12 @@ message CreatePreAuthKeyRequest { | |||||||
| message CreatePreAuthKeyResponse { PreAuthKey pre_auth_key = 1; } | message CreatePreAuthKeyResponse { PreAuthKey pre_auth_key = 1; } | ||||||
| 
 | 
 | ||||||
| message ExpirePreAuthKeyRequest { | message ExpirePreAuthKeyRequest { | ||||||
|   string user = 1; |   uint64 user = 1; | ||||||
|   string key = 2; |   string key = 2; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message ExpirePreAuthKeyResponse {} | message ExpirePreAuthKeyResponse {} | ||||||
| 
 | 
 | ||||||
| message ListPreAuthKeysRequest { string user = 1; } | message ListPreAuthKeysRequest { uint64 user = 1; } | ||||||
| 
 | 
 | ||||||
| message ListPreAuthKeysResponse { repeated PreAuthKey pre_auth_keys = 1; } | message ListPreAuthKeysResponse { repeated PreAuthKey pre_auth_keys = 1; } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user