mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +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…
	
		Reference in New Issue
	
	Block a user