mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	✨ feat(apikey): adds command to delete api keys (#1702)
We currently do not have a way to clean up api keys. There may be cases where users of headscale may generate a lot of api keys and these may end up accumulating in the database. This commit adds the command to delete an api key given a prefix.
This commit is contained in:
		
							parent
							
								
									c4beb0b8af
								
							
						
					
					
						commit
						47405931c6
					
				| @ -47,6 +47,7 @@ after improving the test harness as part of adopting [#1460](https://github.com/ | ||||
| - Change the structure of database configuration, see [config-example.yaml](./config-example.yaml) for the new structure. [#1700](https://github.com/juanfont/headscale/pull/1700) | ||||
|   - Old structure is now considered deprecated and will be removed in the future. | ||||
|   - Adds additional configuration for PostgreSQL for setting max open, idle conection and idle connection lifetime. | ||||
| - Add support for deleting api keys [#1702](https://github.com/juanfont/headscale/pull/1702) | ||||
| 
 | ||||
| ## 0.22.3 (2023-05-12) | ||||
| 
 | ||||
|  | ||||
| @ -5,13 +5,14 @@ import ( | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| 
 | ||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||
| 	"github.com/juanfont/headscale/hscontrol/util" | ||||
| 	"github.com/prometheus/common/model" | ||||
| 	"github.com/pterm/pterm" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"google.golang.org/protobuf/types/known/timestamppb" | ||||
| 
 | ||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||
| 	"github.com/juanfont/headscale/hscontrol/util" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @ -29,11 +30,16 @@ func init() { | ||||
| 	apiKeysCmd.AddCommand(createAPIKeyCmd) | ||||
| 
 | ||||
| 	expireAPIKeyCmd.Flags().StringP("prefix", "p", "", "ApiKey prefix") | ||||
| 	err := expireAPIKeyCmd.MarkFlagRequired("prefix") | ||||
| 	if err != nil { | ||||
| 	if err := expireAPIKeyCmd.MarkFlagRequired("prefix"); err != nil { | ||||
| 		log.Fatal().Err(err).Msg("") | ||||
| 	} | ||||
| 	apiKeysCmd.AddCommand(expireAPIKeyCmd) | ||||
| 
 | ||||
| 	deleteAPIKeyCmd.Flags().StringP("prefix", "p", "", "ApiKey prefix") | ||||
| 	if err := deleteAPIKeyCmd.MarkFlagRequired("prefix"); err != nil { | ||||
| 		log.Fatal().Err(err).Msg("") | ||||
| 	} | ||||
| 	apiKeysCmd.AddCommand(deleteAPIKeyCmd) | ||||
| } | ||||
| 
 | ||||
| var apiKeysCmd = &cobra.Command{ | ||||
| @ -199,3 +205,44 @@ var expireAPIKeyCmd = &cobra.Command{ | ||||
| 		SuccessOutput(response, "Key expired", output) | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
| var deleteAPIKeyCmd = &cobra.Command{ | ||||
| 	Use:     "delete", | ||||
| 	Short:   "Delete an ApiKey", | ||||
| 	Aliases: []string{"remove", "del"}, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		output, _ := cmd.Flags().GetString("output") | ||||
| 
 | ||||
| 		prefix, err := cmd.Flags().GetString("prefix") | ||||
| 		if err != nil { | ||||
| 			ErrorOutput( | ||||
| 				err, | ||||
| 				fmt.Sprintf("Error getting prefix from CLI flag: %s", err), | ||||
| 				output, | ||||
| 			) | ||||
| 
 | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		ctx, client, conn, cancel := getHeadscaleCLIClient() | ||||
| 		defer cancel() | ||||
| 		defer conn.Close() | ||||
| 
 | ||||
| 		request := &v1.DeleteApiKeyRequest{ | ||||
| 			Prefix: prefix, | ||||
| 		} | ||||
| 
 | ||||
| 		response, err := client.DeleteApiKey(ctx, request) | ||||
| 		if err != nil { | ||||
| 			ErrorOutput( | ||||
| 				err, | ||||
| 				fmt.Sprintf("Cannot delete Api Key: %s\n", err), | ||||
| 				output, | ||||
| 			) | ||||
| 
 | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		SuccessOutput(response, "Key deleted", output) | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.31.0
 | ||||
| // 	protoc-gen-go v1.32.0
 | ||||
| // 	protoc        (unknown)
 | ||||
| // source: headscale/v1/apikey.proto
 | ||||
| 
 | ||||
| @ -364,6 +364,91 @@ func (x *ListApiKeysResponse) GetApiKeys() []*ApiKey { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| type DeleteApiKeyRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
| 
 | ||||
| 	Prefix string `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` | ||||
| } | ||||
| 
 | ||||
| func (x *DeleteApiKeyRequest) Reset() { | ||||
| 	*x = DeleteApiKeyRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_headscale_v1_apikey_proto_msgTypes[7] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (x *DeleteApiKeyRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
| 
 | ||||
| func (*DeleteApiKeyRequest) ProtoMessage() {} | ||||
| 
 | ||||
| func (x *DeleteApiKeyRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_headscale_v1_apikey_proto_msgTypes[7] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
| 
 | ||||
| // Deprecated: Use DeleteApiKeyRequest.ProtoReflect.Descriptor instead.
 | ||||
| func (*DeleteApiKeyRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_headscale_v1_apikey_proto_rawDescGZIP(), []int{7} | ||||
| } | ||||
| 
 | ||||
| func (x *DeleteApiKeyRequest) GetPrefix() string { | ||||
| 	if x != nil { | ||||
| 		return x.Prefix | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
| 
 | ||||
| type DeleteApiKeyResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
| } | ||||
| 
 | ||||
| func (x *DeleteApiKeyResponse) Reset() { | ||||
| 	*x = DeleteApiKeyResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_headscale_v1_apikey_proto_msgTypes[8] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (x *DeleteApiKeyResponse) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
| 
 | ||||
| func (*DeleteApiKeyResponse) ProtoMessage() {} | ||||
| 
 | ||||
| func (x *DeleteApiKeyResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_headscale_v1_apikey_proto_msgTypes[8] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
| 
 | ||||
| // Deprecated: Use DeleteApiKeyResponse.ProtoReflect.Descriptor instead.
 | ||||
| func (*DeleteApiKeyResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_headscale_v1_apikey_proto_rawDescGZIP(), []int{8} | ||||
| } | ||||
| 
 | ||||
| var File_headscale_v1_apikey_proto protoreflect.FileDescriptor | ||||
| 
 | ||||
| var file_headscale_v1_apikey_proto_rawDesc = []byte{ | ||||
| @ -404,10 +489,14 @@ var file_headscale_v1_apikey_proto_rawDesc = []byte{ | ||||
| 	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, 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, | ||||
| 	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 ( | ||||
| @ -422,7 +511,7 @@ func file_headscale_v1_apikey_proto_rawDescGZIP() []byte { | ||||
| 	return file_headscale_v1_apikey_proto_rawDescData | ||||
| } | ||||
| 
 | ||||
| var file_headscale_v1_apikey_proto_msgTypes = make([]protoimpl.MessageInfo, 7) | ||||
| var file_headscale_v1_apikey_proto_msgTypes = make([]protoimpl.MessageInfo, 9) | ||||
| var file_headscale_v1_apikey_proto_goTypes = []interface{}{ | ||||
| 	(*ApiKey)(nil),                // 0: headscale.v1.ApiKey
 | ||||
| 	(*CreateApiKeyRequest)(nil),   // 1: headscale.v1.CreateApiKeyRequest
 | ||||
| @ -431,13 +520,15 @@ var file_headscale_v1_apikey_proto_goTypes = []interface{}{ | ||||
| 	(*ExpireApiKeyResponse)(nil),  // 4: headscale.v1.ExpireApiKeyResponse
 | ||||
| 	(*ListApiKeysRequest)(nil),    // 5: headscale.v1.ListApiKeysRequest
 | ||||
| 	(*ListApiKeysResponse)(nil),   // 6: headscale.v1.ListApiKeysResponse
 | ||||
| 	(*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp
 | ||||
| 	(*DeleteApiKeyRequest)(nil),   // 7: headscale.v1.DeleteApiKeyRequest
 | ||||
| 	(*DeleteApiKeyResponse)(nil),  // 8: headscale.v1.DeleteApiKeyResponse
 | ||||
| 	(*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp
 | ||||
| } | ||||
| var file_headscale_v1_apikey_proto_depIdxs = []int32{ | ||||
| 	7, // 0: headscale.v1.ApiKey.expiration:type_name -> google.protobuf.Timestamp
 | ||||
| 	7, // 1: headscale.v1.ApiKey.created_at:type_name -> google.protobuf.Timestamp
 | ||||
| 	7, // 2: headscale.v1.ApiKey.last_seen:type_name -> google.protobuf.Timestamp
 | ||||
| 	7, // 3: headscale.v1.CreateApiKeyRequest.expiration:type_name -> google.protobuf.Timestamp
 | ||||
| 	9, // 0: headscale.v1.ApiKey.expiration:type_name -> google.protobuf.Timestamp
 | ||||
| 	9, // 1: headscale.v1.ApiKey.created_at:type_name -> google.protobuf.Timestamp
 | ||||
| 	9, // 2: headscale.v1.ApiKey.last_seen:type_name -> google.protobuf.Timestamp
 | ||||
| 	9, // 3: headscale.v1.CreateApiKeyRequest.expiration:type_name -> google.protobuf.Timestamp
 | ||||
| 	0, // 4: headscale.v1.ListApiKeysResponse.api_keys:type_name -> headscale.v1.ApiKey
 | ||||
| 	5, // [5:5] is the sub-list for method output_type
 | ||||
| 	5, // [5:5] is the sub-list for method input_type
 | ||||
| @ -536,6 +627,30 @@ func file_headscale_v1_apikey_proto_init() { | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_apikey_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DeleteApiKeyRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_apikey_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DeleteApiKeyResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	type x struct{} | ||||
| 	out := protoimpl.TypeBuilder{ | ||||
| @ -543,7 +658,7 @@ func file_headscale_v1_apikey_proto_init() { | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_headscale_v1_apikey_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   7, | ||||
| 			NumMessages:   9, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   0, | ||||
| 		}, | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.31.0
 | ||||
| // 	protoc-gen-go v1.32.0
 | ||||
| // 	protoc        (unknown)
 | ||||
| // source: headscale/v1/device.proto
 | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.31.0
 | ||||
| // 	protoc-gen-go v1.32.0
 | ||||
| // 	protoc        (unknown)
 | ||||
| // source: headscale/v1/headscale.proto
 | ||||
| 
 | ||||
| @ -36,7 +36,7 @@ var file_headscale_v1_headscale_proto_rawDesc = []byte{ | ||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, | ||||
| 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, | ||||
| 	0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, | ||||
| 	0x6f, 0x32, 0x85, 0x17, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x53, | ||||
| 	0x6f, 0x32, 0xfd, 0x17, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x53, | ||||
| 	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x63, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, | ||||
| 	0x72, 0x12, 0x1c, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, | ||||
| 	0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, | ||||
| @ -220,10 +220,18 @@ var file_headscale_v1_headscale_proto_rawDesc = []byte{ | ||||
| 	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, 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, | ||||
| 	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, 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 = []interface{}{ | ||||
| @ -252,31 +260,33 @@ var file_headscale_v1_headscale_proto_goTypes = []interface{}{ | ||||
| 	(*CreateApiKeyRequest)(nil),      // 22: headscale.v1.CreateApiKeyRequest
 | ||||
| 	(*ExpireApiKeyRequest)(nil),      // 23: headscale.v1.ExpireApiKeyRequest
 | ||||
| 	(*ListApiKeysRequest)(nil),       // 24: headscale.v1.ListApiKeysRequest
 | ||||
| 	(*GetUserResponse)(nil),          // 25: headscale.v1.GetUserResponse
 | ||||
| 	(*CreateUserResponse)(nil),       // 26: headscale.v1.CreateUserResponse
 | ||||
| 	(*RenameUserResponse)(nil),       // 27: headscale.v1.RenameUserResponse
 | ||||
| 	(*DeleteUserResponse)(nil),       // 28: headscale.v1.DeleteUserResponse
 | ||||
| 	(*ListUsersResponse)(nil),        // 29: headscale.v1.ListUsersResponse
 | ||||
| 	(*CreatePreAuthKeyResponse)(nil), // 30: headscale.v1.CreatePreAuthKeyResponse
 | ||||
| 	(*ExpirePreAuthKeyResponse)(nil), // 31: headscale.v1.ExpirePreAuthKeyResponse
 | ||||
| 	(*ListPreAuthKeysResponse)(nil),  // 32: headscale.v1.ListPreAuthKeysResponse
 | ||||
| 	(*DebugCreateNodeResponse)(nil),  // 33: headscale.v1.DebugCreateNodeResponse
 | ||||
| 	(*GetNodeResponse)(nil),          // 34: headscale.v1.GetNodeResponse
 | ||||
| 	(*SetTagsResponse)(nil),          // 35: headscale.v1.SetTagsResponse
 | ||||
| 	(*RegisterNodeResponse)(nil),     // 36: headscale.v1.RegisterNodeResponse
 | ||||
| 	(*DeleteNodeResponse)(nil),       // 37: headscale.v1.DeleteNodeResponse
 | ||||
| 	(*ExpireNodeResponse)(nil),       // 38: headscale.v1.ExpireNodeResponse
 | ||||
| 	(*RenameNodeResponse)(nil),       // 39: headscale.v1.RenameNodeResponse
 | ||||
| 	(*ListNodesResponse)(nil),        // 40: headscale.v1.ListNodesResponse
 | ||||
| 	(*MoveNodeResponse)(nil),         // 41: headscale.v1.MoveNodeResponse
 | ||||
| 	(*GetRoutesResponse)(nil),        // 42: headscale.v1.GetRoutesResponse
 | ||||
| 	(*EnableRouteResponse)(nil),      // 43: headscale.v1.EnableRouteResponse
 | ||||
| 	(*DisableRouteResponse)(nil),     // 44: headscale.v1.DisableRouteResponse
 | ||||
| 	(*GetNodeRoutesResponse)(nil),    // 45: headscale.v1.GetNodeRoutesResponse
 | ||||
| 	(*DeleteRouteResponse)(nil),      // 46: headscale.v1.DeleteRouteResponse
 | ||||
| 	(*CreateApiKeyResponse)(nil),     // 47: headscale.v1.CreateApiKeyResponse
 | ||||
| 	(*ExpireApiKeyResponse)(nil),     // 48: headscale.v1.ExpireApiKeyResponse
 | ||||
| 	(*ListApiKeysResponse)(nil),      // 49: headscale.v1.ListApiKeysResponse
 | ||||
| 	(*DeleteApiKeyRequest)(nil),      // 25: headscale.v1.DeleteApiKeyRequest
 | ||||
| 	(*GetUserResponse)(nil),          // 26: headscale.v1.GetUserResponse
 | ||||
| 	(*CreateUserResponse)(nil),       // 27: headscale.v1.CreateUserResponse
 | ||||
| 	(*RenameUserResponse)(nil),       // 28: headscale.v1.RenameUserResponse
 | ||||
| 	(*DeleteUserResponse)(nil),       // 29: headscale.v1.DeleteUserResponse
 | ||||
| 	(*ListUsersResponse)(nil),        // 30: headscale.v1.ListUsersResponse
 | ||||
| 	(*CreatePreAuthKeyResponse)(nil), // 31: headscale.v1.CreatePreAuthKeyResponse
 | ||||
| 	(*ExpirePreAuthKeyResponse)(nil), // 32: headscale.v1.ExpirePreAuthKeyResponse
 | ||||
| 	(*ListPreAuthKeysResponse)(nil),  // 33: headscale.v1.ListPreAuthKeysResponse
 | ||||
| 	(*DebugCreateNodeResponse)(nil),  // 34: headscale.v1.DebugCreateNodeResponse
 | ||||
| 	(*GetNodeResponse)(nil),          // 35: headscale.v1.GetNodeResponse
 | ||||
| 	(*SetTagsResponse)(nil),          // 36: headscale.v1.SetTagsResponse
 | ||||
| 	(*RegisterNodeResponse)(nil),     // 37: headscale.v1.RegisterNodeResponse
 | ||||
| 	(*DeleteNodeResponse)(nil),       // 38: headscale.v1.DeleteNodeResponse
 | ||||
| 	(*ExpireNodeResponse)(nil),       // 39: headscale.v1.ExpireNodeResponse
 | ||||
| 	(*RenameNodeResponse)(nil),       // 40: headscale.v1.RenameNodeResponse
 | ||||
| 	(*ListNodesResponse)(nil),        // 41: headscale.v1.ListNodesResponse
 | ||||
| 	(*MoveNodeResponse)(nil),         // 42: headscale.v1.MoveNodeResponse
 | ||||
| 	(*GetRoutesResponse)(nil),        // 43: headscale.v1.GetRoutesResponse
 | ||||
| 	(*EnableRouteResponse)(nil),      // 44: headscale.v1.EnableRouteResponse
 | ||||
| 	(*DisableRouteResponse)(nil),     // 45: headscale.v1.DisableRouteResponse
 | ||||
| 	(*GetNodeRoutesResponse)(nil),    // 46: headscale.v1.GetNodeRoutesResponse
 | ||||
| 	(*DeleteRouteResponse)(nil),      // 47: headscale.v1.DeleteRouteResponse
 | ||||
| 	(*CreateApiKeyResponse)(nil),     // 48: headscale.v1.CreateApiKeyResponse
 | ||||
| 	(*ExpireApiKeyResponse)(nil),     // 49: headscale.v1.ExpireApiKeyResponse
 | ||||
| 	(*ListApiKeysResponse)(nil),      // 50: headscale.v1.ListApiKeysResponse
 | ||||
| 	(*DeleteApiKeyResponse)(nil),     // 51: headscale.v1.DeleteApiKeyResponse
 | ||||
| } | ||||
| var file_headscale_v1_headscale_proto_depIdxs = []int32{ | ||||
| 	0,  // 0: headscale.v1.HeadscaleService.GetUser:input_type -> headscale.v1.GetUserRequest
 | ||||
| @ -304,33 +314,35 @@ var file_headscale_v1_headscale_proto_depIdxs = []int32{ | ||||
| 	22, // 22: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest
 | ||||
| 	23, // 23: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest
 | ||||
| 	24, // 24: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest
 | ||||
| 	25, // 25: headscale.v1.HeadscaleService.GetUser:output_type -> headscale.v1.GetUserResponse
 | ||||
| 	26, // 26: headscale.v1.HeadscaleService.CreateUser:output_type -> headscale.v1.CreateUserResponse
 | ||||
| 	27, // 27: headscale.v1.HeadscaleService.RenameUser:output_type -> headscale.v1.RenameUserResponse
 | ||||
| 	28, // 28: headscale.v1.HeadscaleService.DeleteUser:output_type -> headscale.v1.DeleteUserResponse
 | ||||
| 	29, // 29: headscale.v1.HeadscaleService.ListUsers:output_type -> headscale.v1.ListUsersResponse
 | ||||
| 	30, // 30: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse
 | ||||
| 	31, // 31: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse
 | ||||
| 	32, // 32: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse
 | ||||
| 	33, // 33: headscale.v1.HeadscaleService.DebugCreateNode:output_type -> headscale.v1.DebugCreateNodeResponse
 | ||||
| 	34, // 34: headscale.v1.HeadscaleService.GetNode:output_type -> headscale.v1.GetNodeResponse
 | ||||
| 	35, // 35: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse
 | ||||
| 	36, // 36: headscale.v1.HeadscaleService.RegisterNode:output_type -> headscale.v1.RegisterNodeResponse
 | ||||
| 	37, // 37: headscale.v1.HeadscaleService.DeleteNode:output_type -> headscale.v1.DeleteNodeResponse
 | ||||
| 	38, // 38: headscale.v1.HeadscaleService.ExpireNode:output_type -> headscale.v1.ExpireNodeResponse
 | ||||
| 	39, // 39: headscale.v1.HeadscaleService.RenameNode:output_type -> headscale.v1.RenameNodeResponse
 | ||||
| 	40, // 40: headscale.v1.HeadscaleService.ListNodes:output_type -> headscale.v1.ListNodesResponse
 | ||||
| 	41, // 41: headscale.v1.HeadscaleService.MoveNode:output_type -> headscale.v1.MoveNodeResponse
 | ||||
| 	42, // 42: headscale.v1.HeadscaleService.GetRoutes:output_type -> headscale.v1.GetRoutesResponse
 | ||||
| 	43, // 43: headscale.v1.HeadscaleService.EnableRoute:output_type -> headscale.v1.EnableRouteResponse
 | ||||
| 	44, // 44: headscale.v1.HeadscaleService.DisableRoute:output_type -> headscale.v1.DisableRouteResponse
 | ||||
| 	45, // 45: headscale.v1.HeadscaleService.GetNodeRoutes:output_type -> headscale.v1.GetNodeRoutesResponse
 | ||||
| 	46, // 46: headscale.v1.HeadscaleService.DeleteRoute:output_type -> headscale.v1.DeleteRouteResponse
 | ||||
| 	47, // 47: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse
 | ||||
| 	48, // 48: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse
 | ||||
| 	49, // 49: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse
 | ||||
| 	25, // [25:50] is the sub-list for method output_type
 | ||||
| 	0,  // [0:25] is the sub-list for method input_type
 | ||||
| 	25, // 25: headscale.v1.HeadscaleService.DeleteApiKey:input_type -> headscale.v1.DeleteApiKeyRequest
 | ||||
| 	26, // 26: headscale.v1.HeadscaleService.GetUser:output_type -> headscale.v1.GetUserResponse
 | ||||
| 	27, // 27: headscale.v1.HeadscaleService.CreateUser:output_type -> headscale.v1.CreateUserResponse
 | ||||
| 	28, // 28: headscale.v1.HeadscaleService.RenameUser:output_type -> headscale.v1.RenameUserResponse
 | ||||
| 	29, // 29: headscale.v1.HeadscaleService.DeleteUser:output_type -> headscale.v1.DeleteUserResponse
 | ||||
| 	30, // 30: headscale.v1.HeadscaleService.ListUsers:output_type -> headscale.v1.ListUsersResponse
 | ||||
| 	31, // 31: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse
 | ||||
| 	32, // 32: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse
 | ||||
| 	33, // 33: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse
 | ||||
| 	34, // 34: headscale.v1.HeadscaleService.DebugCreateNode:output_type -> headscale.v1.DebugCreateNodeResponse
 | ||||
| 	35, // 35: headscale.v1.HeadscaleService.GetNode:output_type -> headscale.v1.GetNodeResponse
 | ||||
| 	36, // 36: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse
 | ||||
| 	37, // 37: headscale.v1.HeadscaleService.RegisterNode:output_type -> headscale.v1.RegisterNodeResponse
 | ||||
| 	38, // 38: headscale.v1.HeadscaleService.DeleteNode:output_type -> headscale.v1.DeleteNodeResponse
 | ||||
| 	39, // 39: headscale.v1.HeadscaleService.ExpireNode:output_type -> headscale.v1.ExpireNodeResponse
 | ||||
| 	40, // 40: headscale.v1.HeadscaleService.RenameNode:output_type -> headscale.v1.RenameNodeResponse
 | ||||
| 	41, // 41: headscale.v1.HeadscaleService.ListNodes:output_type -> headscale.v1.ListNodesResponse
 | ||||
| 	42, // 42: headscale.v1.HeadscaleService.MoveNode:output_type -> headscale.v1.MoveNodeResponse
 | ||||
| 	43, // 43: headscale.v1.HeadscaleService.GetRoutes:output_type -> headscale.v1.GetRoutesResponse
 | ||||
| 	44, // 44: headscale.v1.HeadscaleService.EnableRoute:output_type -> headscale.v1.EnableRouteResponse
 | ||||
| 	45, // 45: headscale.v1.HeadscaleService.DisableRoute:output_type -> headscale.v1.DisableRouteResponse
 | ||||
| 	46, // 46: headscale.v1.HeadscaleService.GetNodeRoutes:output_type -> headscale.v1.GetNodeRoutesResponse
 | ||||
| 	47, // 47: headscale.v1.HeadscaleService.DeleteRoute:output_type -> headscale.v1.DeleteRouteResponse
 | ||||
| 	48, // 48: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse
 | ||||
| 	49, // 49: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse
 | ||||
| 	50, // 50: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse
 | ||||
| 	51, // 51: headscale.v1.HeadscaleService.DeleteApiKey:output_type -> headscale.v1.DeleteApiKeyResponse
 | ||||
| 	26, // [26:52] is the sub-list for method output_type
 | ||||
| 	0,  // [0:26] is the sub-list for method input_type
 | ||||
| 	0,  // [0:0] is the sub-list for extension type_name
 | ||||
| 	0,  // [0:0] is the sub-list for extension extendee
 | ||||
| 	0,  // [0:0] is the sub-list for field type_name
 | ||||
|  | ||||
| @ -1147,6 +1147,58 @@ func local_request_HeadscaleService_ListApiKeys_0(ctx context.Context, marshaler | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func request_HeadscaleService_DeleteApiKey_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq DeleteApiKeyRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| 
 | ||||
| 	var ( | ||||
| 		val string | ||||
| 		ok  bool | ||||
| 		err error | ||||
| 		_   = err | ||||
| 	) | ||||
| 
 | ||||
| 	val, ok = pathParams["prefix"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "prefix") | ||||
| 	} | ||||
| 
 | ||||
| 	protoReq.Prefix, err = runtime.String(val) | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "prefix", err) | ||||
| 	} | ||||
| 
 | ||||
| 	msg, err := client.DeleteApiKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func local_request_HeadscaleService_DeleteApiKey_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq DeleteApiKeyRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| 
 | ||||
| 	var ( | ||||
| 		val string | ||||
| 		ok  bool | ||||
| 		err error | ||||
| 		_   = err | ||||
| 	) | ||||
| 
 | ||||
| 	val, ok = pathParams["prefix"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "prefix") | ||||
| 	} | ||||
| 
 | ||||
| 	protoReq.Prefix, err = runtime.String(val) | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "prefix", err) | ||||
| 	} | ||||
| 
 | ||||
| 	msg, err := server.DeleteApiKey(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // RegisterHeadscaleServiceHandlerServer registers the http handlers for service HeadscaleService to "mux".
 | ||||
| // UnaryRPC     :call HeadscaleServiceServer directly.
 | ||||
| // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
 | ||||
| @ -1778,6 +1830,31 @@ func RegisterHeadscaleServiceHandlerServer(ctx context.Context, mux *runtime.Ser | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	mux.Handle("DELETE", pattern_HeadscaleService_DeleteApiKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		var stream runtime.ServerTransportStream | ||||
| 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		var err error | ||||
| 		var annotatedContext context.Context | ||||
| 		annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DeleteApiKey", runtime.WithHTTPPathPattern("/api/v1/apikey/{prefix}")) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := local_request_HeadscaleService_DeleteApiKey_0(annotatedContext, inboundMarshaler, server, req, pathParams) | ||||
| 		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) | ||||
| 		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		forward_HeadscaleService_DeleteApiKey_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| @ -2369,6 +2446,28 @@ func RegisterHeadscaleServiceHandlerClient(ctx context.Context, mux *runtime.Ser | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	mux.Handle("DELETE", pattern_HeadscaleService_DeleteApiKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		var err error | ||||
| 		var annotatedContext context.Context | ||||
| 		annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DeleteApiKey", runtime.WithHTTPPathPattern("/api/v1/apikey/{prefix}")) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := request_HeadscaleService_DeleteApiKey_0(annotatedContext, inboundMarshaler, client, req, pathParams) | ||||
| 		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		forward_HeadscaleService_DeleteApiKey_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| @ -2422,6 +2521,8 @@ var ( | ||||
| 	pattern_HeadscaleService_ExpireApiKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "apikey", "expire"}, "")) | ||||
| 
 | ||||
| 	pattern_HeadscaleService_ListApiKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "apikey"}, "")) | ||||
| 
 | ||||
| 	pattern_HeadscaleService_DeleteApiKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "apikey", "prefix"}, "")) | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -2474,4 +2575,6 @@ var ( | ||||
| 	forward_HeadscaleService_ExpireApiKey_0 = runtime.ForwardResponseMessage | ||||
| 
 | ||||
| 	forward_HeadscaleService_ListApiKeys_0 = runtime.ForwardResponseMessage | ||||
| 
 | ||||
| 	forward_HeadscaleService_DeleteApiKey_0 = runtime.ForwardResponseMessage | ||||
| ) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // - protoc-gen-go-grpc v1.3.0
 | ||||
| // - protoc-gen-go-grpc v1.2.0
 | ||||
| // - protoc             (unknown)
 | ||||
| // source: headscale/v1/headscale.proto
 | ||||
| 
 | ||||
| @ -18,34 +18,6 @@ import ( | ||||
| // Requires gRPC-Go v1.32.0 or later.
 | ||||
| const _ = grpc.SupportPackageIsVersion7 | ||||
| 
 | ||||
| const ( | ||||
| 	HeadscaleService_GetUser_FullMethodName          = "/headscale.v1.HeadscaleService/GetUser" | ||||
| 	HeadscaleService_CreateUser_FullMethodName       = "/headscale.v1.HeadscaleService/CreateUser" | ||||
| 	HeadscaleService_RenameUser_FullMethodName       = "/headscale.v1.HeadscaleService/RenameUser" | ||||
| 	HeadscaleService_DeleteUser_FullMethodName       = "/headscale.v1.HeadscaleService/DeleteUser" | ||||
| 	HeadscaleService_ListUsers_FullMethodName        = "/headscale.v1.HeadscaleService/ListUsers" | ||||
| 	HeadscaleService_CreatePreAuthKey_FullMethodName = "/headscale.v1.HeadscaleService/CreatePreAuthKey" | ||||
| 	HeadscaleService_ExpirePreAuthKey_FullMethodName = "/headscale.v1.HeadscaleService/ExpirePreAuthKey" | ||||
| 	HeadscaleService_ListPreAuthKeys_FullMethodName  = "/headscale.v1.HeadscaleService/ListPreAuthKeys" | ||||
| 	HeadscaleService_DebugCreateNode_FullMethodName  = "/headscale.v1.HeadscaleService/DebugCreateNode" | ||||
| 	HeadscaleService_GetNode_FullMethodName          = "/headscale.v1.HeadscaleService/GetNode" | ||||
| 	HeadscaleService_SetTags_FullMethodName          = "/headscale.v1.HeadscaleService/SetTags" | ||||
| 	HeadscaleService_RegisterNode_FullMethodName     = "/headscale.v1.HeadscaleService/RegisterNode" | ||||
| 	HeadscaleService_DeleteNode_FullMethodName       = "/headscale.v1.HeadscaleService/DeleteNode" | ||||
| 	HeadscaleService_ExpireNode_FullMethodName       = "/headscale.v1.HeadscaleService/ExpireNode" | ||||
| 	HeadscaleService_RenameNode_FullMethodName       = "/headscale.v1.HeadscaleService/RenameNode" | ||||
| 	HeadscaleService_ListNodes_FullMethodName        = "/headscale.v1.HeadscaleService/ListNodes" | ||||
| 	HeadscaleService_MoveNode_FullMethodName         = "/headscale.v1.HeadscaleService/MoveNode" | ||||
| 	HeadscaleService_GetRoutes_FullMethodName        = "/headscale.v1.HeadscaleService/GetRoutes" | ||||
| 	HeadscaleService_EnableRoute_FullMethodName      = "/headscale.v1.HeadscaleService/EnableRoute" | ||||
| 	HeadscaleService_DisableRoute_FullMethodName     = "/headscale.v1.HeadscaleService/DisableRoute" | ||||
| 	HeadscaleService_GetNodeRoutes_FullMethodName    = "/headscale.v1.HeadscaleService/GetNodeRoutes" | ||||
| 	HeadscaleService_DeleteRoute_FullMethodName      = "/headscale.v1.HeadscaleService/DeleteRoute" | ||||
| 	HeadscaleService_CreateApiKey_FullMethodName     = "/headscale.v1.HeadscaleService/CreateApiKey" | ||||
| 	HeadscaleService_ExpireApiKey_FullMethodName     = "/headscale.v1.HeadscaleService/ExpireApiKey" | ||||
| 	HeadscaleService_ListApiKeys_FullMethodName      = "/headscale.v1.HeadscaleService/ListApiKeys" | ||||
| ) | ||||
| 
 | ||||
| // HeadscaleServiceClient is the client API for HeadscaleService service.
 | ||||
| //
 | ||||
| // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 | ||||
| @ -80,6 +52,7 @@ type HeadscaleServiceClient interface { | ||||
| 	CreateApiKey(ctx context.Context, in *CreateApiKeyRequest, opts ...grpc.CallOption) (*CreateApiKeyResponse, error) | ||||
| 	ExpireApiKey(ctx context.Context, in *ExpireApiKeyRequest, opts ...grpc.CallOption) (*ExpireApiKeyResponse, error) | ||||
| 	ListApiKeys(ctx context.Context, in *ListApiKeysRequest, opts ...grpc.CallOption) (*ListApiKeysResponse, error) | ||||
| 	DeleteApiKey(ctx context.Context, in *DeleteApiKeyRequest, opts ...grpc.CallOption) (*DeleteApiKeyResponse, error) | ||||
| } | ||||
| 
 | ||||
| type headscaleServiceClient struct { | ||||
| @ -92,7 +65,7 @@ func NewHeadscaleServiceClient(cc grpc.ClientConnInterface) HeadscaleServiceClie | ||||
| 
 | ||||
| func (c *headscaleServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) { | ||||
| 	out := new(GetUserResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_GetUser_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/GetUser", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -101,7 +74,7 @@ func (c *headscaleServiceClient) GetUser(ctx context.Context, in *GetUserRequest | ||||
| 
 | ||||
| func (c *headscaleServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error) { | ||||
| 	out := new(CreateUserResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_CreateUser_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/CreateUser", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -110,7 +83,7 @@ func (c *headscaleServiceClient) CreateUser(ctx context.Context, in *CreateUserR | ||||
| 
 | ||||
| func (c *headscaleServiceClient) RenameUser(ctx context.Context, in *RenameUserRequest, opts ...grpc.CallOption) (*RenameUserResponse, error) { | ||||
| 	out := new(RenameUserResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_RenameUser_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/RenameUser", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -119,7 +92,7 @@ func (c *headscaleServiceClient) RenameUser(ctx context.Context, in *RenameUserR | ||||
| 
 | ||||
| func (c *headscaleServiceClient) DeleteUser(ctx context.Context, in *DeleteUserRequest, opts ...grpc.CallOption) (*DeleteUserResponse, error) { | ||||
| 	out := new(DeleteUserResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_DeleteUser_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DeleteUser", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -128,7 +101,7 @@ func (c *headscaleServiceClient) DeleteUser(ctx context.Context, in *DeleteUserR | ||||
| 
 | ||||
| func (c *headscaleServiceClient) ListUsers(ctx context.Context, in *ListUsersRequest, opts ...grpc.CallOption) (*ListUsersResponse, error) { | ||||
| 	out := new(ListUsersResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_ListUsers_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ListUsers", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -137,7 +110,7 @@ func (c *headscaleServiceClient) ListUsers(ctx context.Context, in *ListUsersReq | ||||
| 
 | ||||
| func (c *headscaleServiceClient) CreatePreAuthKey(ctx context.Context, in *CreatePreAuthKeyRequest, opts ...grpc.CallOption) (*CreatePreAuthKeyResponse, error) { | ||||
| 	out := new(CreatePreAuthKeyResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_CreatePreAuthKey_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/CreatePreAuthKey", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -146,7 +119,7 @@ func (c *headscaleServiceClient) CreatePreAuthKey(ctx context.Context, in *Creat | ||||
| 
 | ||||
| func (c *headscaleServiceClient) ExpirePreAuthKey(ctx context.Context, in *ExpirePreAuthKeyRequest, opts ...grpc.CallOption) (*ExpirePreAuthKeyResponse, error) { | ||||
| 	out := new(ExpirePreAuthKeyResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_ExpirePreAuthKey_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ExpirePreAuthKey", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -155,7 +128,7 @@ func (c *headscaleServiceClient) ExpirePreAuthKey(ctx context.Context, in *Expir | ||||
| 
 | ||||
| func (c *headscaleServiceClient) ListPreAuthKeys(ctx context.Context, in *ListPreAuthKeysRequest, opts ...grpc.CallOption) (*ListPreAuthKeysResponse, error) { | ||||
| 	out := new(ListPreAuthKeysResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_ListPreAuthKeys_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ListPreAuthKeys", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -164,7 +137,7 @@ func (c *headscaleServiceClient) ListPreAuthKeys(ctx context.Context, in *ListPr | ||||
| 
 | ||||
| func (c *headscaleServiceClient) DebugCreateNode(ctx context.Context, in *DebugCreateNodeRequest, opts ...grpc.CallOption) (*DebugCreateNodeResponse, error) { | ||||
| 	out := new(DebugCreateNodeResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_DebugCreateNode_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DebugCreateNode", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -173,7 +146,7 @@ func (c *headscaleServiceClient) DebugCreateNode(ctx context.Context, in *DebugC | ||||
| 
 | ||||
| func (c *headscaleServiceClient) GetNode(ctx context.Context, in *GetNodeRequest, opts ...grpc.CallOption) (*GetNodeResponse, error) { | ||||
| 	out := new(GetNodeResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_GetNode_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/GetNode", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -182,7 +155,7 @@ func (c *headscaleServiceClient) GetNode(ctx context.Context, in *GetNodeRequest | ||||
| 
 | ||||
| func (c *headscaleServiceClient) SetTags(ctx context.Context, in *SetTagsRequest, opts ...grpc.CallOption) (*SetTagsResponse, error) { | ||||
| 	out := new(SetTagsResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_SetTags_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/SetTags", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -191,7 +164,7 @@ func (c *headscaleServiceClient) SetTags(ctx context.Context, in *SetTagsRequest | ||||
| 
 | ||||
| func (c *headscaleServiceClient) RegisterNode(ctx context.Context, in *RegisterNodeRequest, opts ...grpc.CallOption) (*RegisterNodeResponse, error) { | ||||
| 	out := new(RegisterNodeResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_RegisterNode_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/RegisterNode", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -200,7 +173,7 @@ func (c *headscaleServiceClient) RegisterNode(ctx context.Context, in *RegisterN | ||||
| 
 | ||||
| func (c *headscaleServiceClient) DeleteNode(ctx context.Context, in *DeleteNodeRequest, opts ...grpc.CallOption) (*DeleteNodeResponse, error) { | ||||
| 	out := new(DeleteNodeResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_DeleteNode_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DeleteNode", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -209,7 +182,7 @@ func (c *headscaleServiceClient) DeleteNode(ctx context.Context, in *DeleteNodeR | ||||
| 
 | ||||
| func (c *headscaleServiceClient) ExpireNode(ctx context.Context, in *ExpireNodeRequest, opts ...grpc.CallOption) (*ExpireNodeResponse, error) { | ||||
| 	out := new(ExpireNodeResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_ExpireNode_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ExpireNode", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -218,7 +191,7 @@ func (c *headscaleServiceClient) ExpireNode(ctx context.Context, in *ExpireNodeR | ||||
| 
 | ||||
| func (c *headscaleServiceClient) RenameNode(ctx context.Context, in *RenameNodeRequest, opts ...grpc.CallOption) (*RenameNodeResponse, error) { | ||||
| 	out := new(RenameNodeResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_RenameNode_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/RenameNode", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -227,7 +200,7 @@ func (c *headscaleServiceClient) RenameNode(ctx context.Context, in *RenameNodeR | ||||
| 
 | ||||
| func (c *headscaleServiceClient) ListNodes(ctx context.Context, in *ListNodesRequest, opts ...grpc.CallOption) (*ListNodesResponse, error) { | ||||
| 	out := new(ListNodesResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_ListNodes_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ListNodes", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -236,7 +209,7 @@ func (c *headscaleServiceClient) ListNodes(ctx context.Context, in *ListNodesReq | ||||
| 
 | ||||
| func (c *headscaleServiceClient) MoveNode(ctx context.Context, in *MoveNodeRequest, opts ...grpc.CallOption) (*MoveNodeResponse, error) { | ||||
| 	out := new(MoveNodeResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_MoveNode_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/MoveNode", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -245,7 +218,7 @@ func (c *headscaleServiceClient) MoveNode(ctx context.Context, in *MoveNodeReque | ||||
| 
 | ||||
| func (c *headscaleServiceClient) GetRoutes(ctx context.Context, in *GetRoutesRequest, opts ...grpc.CallOption) (*GetRoutesResponse, error) { | ||||
| 	out := new(GetRoutesResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_GetRoutes_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/GetRoutes", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -254,7 +227,7 @@ func (c *headscaleServiceClient) GetRoutes(ctx context.Context, in *GetRoutesReq | ||||
| 
 | ||||
| func (c *headscaleServiceClient) EnableRoute(ctx context.Context, in *EnableRouteRequest, opts ...grpc.CallOption) (*EnableRouteResponse, error) { | ||||
| 	out := new(EnableRouteResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_EnableRoute_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/EnableRoute", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -263,7 +236,7 @@ func (c *headscaleServiceClient) EnableRoute(ctx context.Context, in *EnableRout | ||||
| 
 | ||||
| func (c *headscaleServiceClient) DisableRoute(ctx context.Context, in *DisableRouteRequest, opts ...grpc.CallOption) (*DisableRouteResponse, error) { | ||||
| 	out := new(DisableRouteResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_DisableRoute_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DisableRoute", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -272,7 +245,7 @@ func (c *headscaleServiceClient) DisableRoute(ctx context.Context, in *DisableRo | ||||
| 
 | ||||
| func (c *headscaleServiceClient) GetNodeRoutes(ctx context.Context, in *GetNodeRoutesRequest, opts ...grpc.CallOption) (*GetNodeRoutesResponse, error) { | ||||
| 	out := new(GetNodeRoutesResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_GetNodeRoutes_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/GetNodeRoutes", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -281,7 +254,7 @@ func (c *headscaleServiceClient) GetNodeRoutes(ctx context.Context, in *GetNodeR | ||||
| 
 | ||||
| func (c *headscaleServiceClient) DeleteRoute(ctx context.Context, in *DeleteRouteRequest, opts ...grpc.CallOption) (*DeleteRouteResponse, error) { | ||||
| 	out := new(DeleteRouteResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_DeleteRoute_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DeleteRoute", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -290,7 +263,7 @@ func (c *headscaleServiceClient) DeleteRoute(ctx context.Context, in *DeleteRout | ||||
| 
 | ||||
| func (c *headscaleServiceClient) CreateApiKey(ctx context.Context, in *CreateApiKeyRequest, opts ...grpc.CallOption) (*CreateApiKeyResponse, error) { | ||||
| 	out := new(CreateApiKeyResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_CreateApiKey_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/CreateApiKey", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -299,7 +272,7 @@ func (c *headscaleServiceClient) CreateApiKey(ctx context.Context, in *CreateApi | ||||
| 
 | ||||
| func (c *headscaleServiceClient) ExpireApiKey(ctx context.Context, in *ExpireApiKeyRequest, opts ...grpc.CallOption) (*ExpireApiKeyResponse, error) { | ||||
| 	out := new(ExpireApiKeyResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_ExpireApiKey_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ExpireApiKey", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -308,7 +281,16 @@ func (c *headscaleServiceClient) ExpireApiKey(ctx context.Context, in *ExpireApi | ||||
| 
 | ||||
| func (c *headscaleServiceClient) ListApiKeys(ctx context.Context, in *ListApiKeysRequest, opts ...grpc.CallOption) (*ListApiKeysResponse, error) { | ||||
| 	out := new(ListApiKeysResponse) | ||||
| 	err := c.cc.Invoke(ctx, HeadscaleService_ListApiKeys_FullMethodName, in, out, opts...) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ListApiKeys", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
| 
 | ||||
| func (c *headscaleServiceClient) DeleteApiKey(ctx context.Context, in *DeleteApiKeyRequest, opts ...grpc.CallOption) (*DeleteApiKeyResponse, error) { | ||||
| 	out := new(DeleteApiKeyResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DeleteApiKey", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -349,6 +331,7 @@ type HeadscaleServiceServer interface { | ||||
| 	CreateApiKey(context.Context, *CreateApiKeyRequest) (*CreateApiKeyResponse, error) | ||||
| 	ExpireApiKey(context.Context, *ExpireApiKeyRequest) (*ExpireApiKeyResponse, error) | ||||
| 	ListApiKeys(context.Context, *ListApiKeysRequest) (*ListApiKeysResponse, error) | ||||
| 	DeleteApiKey(context.Context, *DeleteApiKeyRequest) (*DeleteApiKeyResponse, error) | ||||
| 	mustEmbedUnimplementedHeadscaleServiceServer() | ||||
| } | ||||
| 
 | ||||
| @ -431,6 +414,9 @@ func (UnimplementedHeadscaleServiceServer) ExpireApiKey(context.Context, *Expire | ||||
| func (UnimplementedHeadscaleServiceServer) ListApiKeys(context.Context, *ListApiKeysRequest) (*ListApiKeysResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method ListApiKeys not implemented") | ||||
| } | ||||
| func (UnimplementedHeadscaleServiceServer) DeleteApiKey(context.Context, *DeleteApiKeyRequest) (*DeleteApiKeyResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method DeleteApiKey not implemented") | ||||
| } | ||||
| func (UnimplementedHeadscaleServiceServer) mustEmbedUnimplementedHeadscaleServiceServer() {} | ||||
| 
 | ||||
| // UnsafeHeadscaleServiceServer may be embedded to opt out of forward compatibility for this service.
 | ||||
| @ -454,7 +440,7 @@ func _HeadscaleService_GetUser_Handler(srv interface{}, ctx context.Context, dec | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_GetUser_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/GetUser", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).GetUser(ctx, req.(*GetUserRequest)) | ||||
| @ -472,7 +458,7 @@ func _HeadscaleService_CreateUser_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_CreateUser_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/CreateUser", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).CreateUser(ctx, req.(*CreateUserRequest)) | ||||
| @ -490,7 +476,7 @@ func _HeadscaleService_RenameUser_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_RenameUser_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/RenameUser", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).RenameUser(ctx, req.(*RenameUserRequest)) | ||||
| @ -508,7 +494,7 @@ func _HeadscaleService_DeleteUser_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_DeleteUser_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/DeleteUser", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).DeleteUser(ctx, req.(*DeleteUserRequest)) | ||||
| @ -526,7 +512,7 @@ func _HeadscaleService_ListUsers_Handler(srv interface{}, ctx context.Context, d | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_ListUsers_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/ListUsers", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).ListUsers(ctx, req.(*ListUsersRequest)) | ||||
| @ -544,7 +530,7 @@ func _HeadscaleService_CreatePreAuthKey_Handler(srv interface{}, ctx context.Con | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_CreatePreAuthKey_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/CreatePreAuthKey", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).CreatePreAuthKey(ctx, req.(*CreatePreAuthKeyRequest)) | ||||
| @ -562,7 +548,7 @@ func _HeadscaleService_ExpirePreAuthKey_Handler(srv interface{}, ctx context.Con | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_ExpirePreAuthKey_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/ExpirePreAuthKey", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).ExpirePreAuthKey(ctx, req.(*ExpirePreAuthKeyRequest)) | ||||
| @ -580,7 +566,7 @@ func _HeadscaleService_ListPreAuthKeys_Handler(srv interface{}, ctx context.Cont | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_ListPreAuthKeys_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/ListPreAuthKeys", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).ListPreAuthKeys(ctx, req.(*ListPreAuthKeysRequest)) | ||||
| @ -598,7 +584,7 @@ func _HeadscaleService_DebugCreateNode_Handler(srv interface{}, ctx context.Cont | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_DebugCreateNode_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/DebugCreateNode", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).DebugCreateNode(ctx, req.(*DebugCreateNodeRequest)) | ||||
| @ -616,7 +602,7 @@ func _HeadscaleService_GetNode_Handler(srv interface{}, ctx context.Context, dec | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_GetNode_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/GetNode", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).GetNode(ctx, req.(*GetNodeRequest)) | ||||
| @ -634,7 +620,7 @@ func _HeadscaleService_SetTags_Handler(srv interface{}, ctx context.Context, dec | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_SetTags_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/SetTags", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).SetTags(ctx, req.(*SetTagsRequest)) | ||||
| @ -652,7 +638,7 @@ func _HeadscaleService_RegisterNode_Handler(srv interface{}, ctx context.Context | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_RegisterNode_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/RegisterNode", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).RegisterNode(ctx, req.(*RegisterNodeRequest)) | ||||
| @ -670,7 +656,7 @@ func _HeadscaleService_DeleteNode_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_DeleteNode_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/DeleteNode", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).DeleteNode(ctx, req.(*DeleteNodeRequest)) | ||||
| @ -688,7 +674,7 @@ func _HeadscaleService_ExpireNode_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_ExpireNode_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/ExpireNode", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).ExpireNode(ctx, req.(*ExpireNodeRequest)) | ||||
| @ -706,7 +692,7 @@ func _HeadscaleService_RenameNode_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_RenameNode_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/RenameNode", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).RenameNode(ctx, req.(*RenameNodeRequest)) | ||||
| @ -724,7 +710,7 @@ func _HeadscaleService_ListNodes_Handler(srv interface{}, ctx context.Context, d | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_ListNodes_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/ListNodes", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).ListNodes(ctx, req.(*ListNodesRequest)) | ||||
| @ -742,7 +728,7 @@ func _HeadscaleService_MoveNode_Handler(srv interface{}, ctx context.Context, de | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_MoveNode_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/MoveNode", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).MoveNode(ctx, req.(*MoveNodeRequest)) | ||||
| @ -760,7 +746,7 @@ func _HeadscaleService_GetRoutes_Handler(srv interface{}, ctx context.Context, d | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_GetRoutes_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/GetRoutes", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).GetRoutes(ctx, req.(*GetRoutesRequest)) | ||||
| @ -778,7 +764,7 @@ func _HeadscaleService_EnableRoute_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_EnableRoute_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/EnableRoute", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).EnableRoute(ctx, req.(*EnableRouteRequest)) | ||||
| @ -796,7 +782,7 @@ func _HeadscaleService_DisableRoute_Handler(srv interface{}, ctx context.Context | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_DisableRoute_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/DisableRoute", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).DisableRoute(ctx, req.(*DisableRouteRequest)) | ||||
| @ -814,7 +800,7 @@ func _HeadscaleService_GetNodeRoutes_Handler(srv interface{}, ctx context.Contex | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_GetNodeRoutes_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/GetNodeRoutes", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).GetNodeRoutes(ctx, req.(*GetNodeRoutesRequest)) | ||||
| @ -832,7 +818,7 @@ func _HeadscaleService_DeleteRoute_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_DeleteRoute_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/DeleteRoute", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).DeleteRoute(ctx, req.(*DeleteRouteRequest)) | ||||
| @ -850,7 +836,7 @@ func _HeadscaleService_CreateApiKey_Handler(srv interface{}, ctx context.Context | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_CreateApiKey_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/CreateApiKey", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).CreateApiKey(ctx, req.(*CreateApiKeyRequest)) | ||||
| @ -868,7 +854,7 @@ func _HeadscaleService_ExpireApiKey_Handler(srv interface{}, ctx context.Context | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_ExpireApiKey_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/ExpireApiKey", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).ExpireApiKey(ctx, req.(*ExpireApiKeyRequest)) | ||||
| @ -886,7 +872,7 @@ func _HeadscaleService_ListApiKeys_Handler(srv interface{}, ctx context.Context, | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: HeadscaleService_ListApiKeys_FullMethodName, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/ListApiKeys", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).ListApiKeys(ctx, req.(*ListApiKeysRequest)) | ||||
| @ -894,6 +880,24 @@ func _HeadscaleService_ListApiKeys_Handler(srv interface{}, ctx context.Context, | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
| 
 | ||||
| func _HeadscaleService_DeleteApiKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(DeleteApiKeyRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(HeadscaleServiceServer).DeleteApiKey(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/DeleteApiKey", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).DeleteApiKey(ctx, req.(*DeleteApiKeyRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
| 
 | ||||
| // HeadscaleService_ServiceDesc is the grpc.ServiceDesc for HeadscaleService service.
 | ||||
| // It's only intended for direct use with grpc.RegisterService,
 | ||||
| // and not to be introspected or modified (even as a copy)
 | ||||
| @ -1001,6 +1005,10 @@ var HeadscaleService_ServiceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "ListApiKeys", | ||||
| 			Handler:    _HeadscaleService_ListApiKeys_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "DeleteApiKey", | ||||
| 			Handler:    _HeadscaleService_DeleteApiKey_Handler, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Streams:  []grpc.StreamDesc{}, | ||||
| 	Metadata: "headscale/v1/headscale.proto", | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.31.0
 | ||||
| // 	protoc-gen-go v1.32.0
 | ||||
| // 	protoc        (unknown)
 | ||||
| // source: headscale/v1/node.proto
 | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.31.0
 | ||||
| // 	protoc-gen-go v1.32.0
 | ||||
| // 	protoc        (unknown)
 | ||||
| // source: headscale/v1/preauthkey.proto
 | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.31.0
 | ||||
| // 	protoc-gen-go v1.32.0
 | ||||
| // 	protoc        (unknown)
 | ||||
| // source: headscale/v1/routes.proto
 | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.31.0
 | ||||
| // 	protoc-gen-go v1.32.0
 | ||||
| // 	protoc        (unknown)
 | ||||
| // source: headscale/v1/user.proto
 | ||||
| 
 | ||||
|  | ||||
| @ -101,6 +101,36 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/api/v1/apikey/{prefix}": { | ||||
|       "delete": { | ||||
|         "operationId": "HeadscaleService_DeleteApiKey", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/v1DeleteApiKeyResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/rpcStatus" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "prefix", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "HeadscaleService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/api/v1/debug/node": { | ||||
|       "post": { | ||||
|         "summary": "--- Node start ---", | ||||
| @ -945,6 +975,9 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "v1DeleteApiKeyResponse": { | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "v1DeleteNodeResponse": { | ||||
|       "type": "object" | ||||
|     }, | ||||
|  | ||||
| @ -7,16 +7,17 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||
| 	"github.com/juanfont/headscale/hscontrol/db" | ||||
| 	"github.com/juanfont/headscale/hscontrol/types" | ||||
| 	"github.com/juanfont/headscale/hscontrol/util" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 	"gorm.io/gorm" | ||||
| 	"tailscale.com/tailcfg" | ||||
| 	"tailscale.com/types/key" | ||||
| 
 | ||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||
| 	"github.com/juanfont/headscale/hscontrol/db" | ||||
| 	"github.com/juanfont/headscale/hscontrol/types" | ||||
| 	"github.com/juanfont/headscale/hscontrol/util" | ||||
| ) | ||||
| 
 | ||||
| type headscaleV1APIServer struct { // v1.HeadscaleServiceServer
 | ||||
| @ -608,6 +609,27 @@ func (api headscaleV1APIServer) ListApiKeys( | ||||
| 	return &v1.ListApiKeysResponse{ApiKeys: response}, nil | ||||
| } | ||||
| 
 | ||||
| func (api headscaleV1APIServer) DeleteApiKey( | ||||
| 	ctx context.Context, | ||||
| 	request *v1.DeleteApiKeyRequest, | ||||
| ) (*v1.DeleteApiKeyResponse, error) { | ||||
| 	var ( | ||||
| 		apiKey *types.APIKey | ||||
| 		err    error | ||||
| 	) | ||||
| 
 | ||||
| 	apiKey, err = api.h.db.GetAPIKey(request.Prefix) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := api.h.db.DestroyAPIKey(*apiKey); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return &v1.DeleteApiKeyResponse{}, nil | ||||
| } | ||||
| 
 | ||||
| // The following service calls are for testing and debugging
 | ||||
| func (api headscaleV1APIServer) DebugCreateNode( | ||||
| 	ctx context.Context, | ||||
|  | ||||
| @ -7,11 +7,12 @@ import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 
 | ||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||
| 	"github.com/juanfont/headscale/hscontrol/policy" | ||||
| 	"github.com/juanfont/headscale/integration/hsic" | ||||
| 	"github.com/juanfont/headscale/integration/tsic" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
| 
 | ||||
| func executeAndUnmarshal[T any](headscale ControlServer, command []string, result T) error { | ||||
| @ -531,6 +532,31 @@ func TestApiKeyCommand(t *testing.T) { | ||||
| 			) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	_, err = headscale.Execute( | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"apikeys", | ||||
| 			"delete", | ||||
| 			"--prefix", | ||||
| 			listedAPIKeys[0].GetPrefix(), | ||||
| 		}) | ||||
| 	assert.Nil(t, err) | ||||
| 
 | ||||
| 	var listedAPIKeysAfterDelete []v1.ApiKey | ||||
| 	err = executeAndUnmarshal(headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"apikeys", | ||||
| 			"list", | ||||
| 			"--output", | ||||
| 			"json", | ||||
| 		}, | ||||
| 		&listedAPIKeysAfterDelete, | ||||
| 	) | ||||
| 	assert.Nil(t, err) | ||||
| 
 | ||||
| 	assert.Len(t, listedAPIKeysAfterDelete, 4) | ||||
| } | ||||
| 
 | ||||
| func TestNodeTagCommand(t *testing.T) { | ||||
|  | ||||
| @ -33,3 +33,10 @@ message ListApiKeysRequest { | ||||
| message ListApiKeysResponse { | ||||
|     repeated ApiKey api_keys = 1; | ||||
| } | ||||
| 
 | ||||
| message DeleteApiKeyRequest { | ||||
|     string prefix = 1; | ||||
| } | ||||
| 
 | ||||
| message DeleteApiKeyResponse { | ||||
| } | ||||
|  | ||||
| @ -178,6 +178,12 @@ service HeadscaleService { | ||||
|             get : "/api/v1/apikey" | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     rpc DeleteApiKey(DeleteApiKeyRequest) returns(DeleteApiKeyResponse) { | ||||
|         option(google.api.http) = { | ||||
|             delete : "/api/v1/apikey/{prefix}" | ||||
|         }; | ||||
|     } | ||||
|     // --- ApiKeys end --- | ||||
| 
 | ||||
|     // Implement Tailscale API | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user