diff --git a/api/server.go b/api/server.go index 6aa6b34..a9352d8 100644 --- a/api/server.go +++ b/api/server.go @@ -264,6 +264,29 @@ func (s *Server) RenameGroup(_ context.Context, req *keepassgov1.RenameGroupRequ return &keepassgov1.RenameGroupResponse{}, nil } +func (s *Server) DeleteGroup(_ context.Context, req *keepassgov1.DeleteGroupRequest) (*keepassgov1.DeleteGroupResponse, error) { + s.mu.Lock() + defer s.mu.Unlock() + + if s.locked { + return nil, status.Error(codes.FailedPrecondition, "vault is locked") + } + + if err := s.model.DeleteGroup(req.GetPath()); err != nil { + switch { + case errors.Is(err, vault.ErrEntryNotFound): + return nil, status.Error(codes.NotFound, err.Error()) + case errors.Is(err, vault.ErrGroupNotEmpty): + return nil, status.Error(codes.FailedPrecondition, err.Error()) + default: + return nil, status.Errorf(codes.Internal, "delete group: %v", err) + } + } + + s.dirty = true + return &keepassgov1.DeleteGroupResponse{}, nil +} + func (s *Server) UpsertEntry(_ context.Context, req *keepassgov1.UpsertEntryRequest) (*keepassgov1.UpsertEntryResponse, error) { if req.GetEntry() == nil { return nil, status.Error(codes.InvalidArgument, "missing entry") @@ -605,6 +628,7 @@ func entryToProto(entry vault.Entry) *keepassgov1.Entry { Notes: entry.Notes, Tags: append([]string(nil), entry.Tags...), Path: append([]string(nil), entry.Path...), + Fields: maps.Clone(entry.Fields), } } @@ -618,6 +642,7 @@ func entryFromProto(entry *keepassgov1.Entry) vault.Entry { Notes: entry.GetNotes(), Tags: append([]string(nil), entry.GetTags()...), Path: append([]string(nil), entry.GetPath()...), + Fields: maps.Clone(entry.GetFields()), } } diff --git a/api/server_test.go b/api/server_test.go index 02500fb..7cca1fd 100644 --- a/api/server_test.go +++ b/api/server_test.go @@ -378,6 +378,9 @@ func TestVaultServiceListsEntriesForAuthorizedClients(t *testing.T) { if resp.Entries[0].Title != "Vault Console" { t.Fatalf("ListEntries().Entries[0].Title = %q, want %q", resp.Entries[0].Title, "Vault Console") } + if got := resp.Entries[0].Fields["X-Role"]; got != "automation" { + t.Fatalf("ListEntries().Entries[0].Fields[X-Role] = %q, want %q", got, "automation") + } } func TestVaultServiceListsCreatesAndRenamesGroupsForAuthorizedClients(t *testing.T) { @@ -427,6 +430,42 @@ func TestVaultServiceListsCreatesAndRenamesGroupsForAuthorizedClients(t *testing } } +func TestVaultServiceDeletesEmptyGroupsAndRejectsNonEmptyGroups(t *testing.T) { + t.Parallel() + + client, _, cleanup := newTestClient(t) + defer cleanup() + + ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer test-token") + if _, err := client.CreateGroup(ctx, &keepassgov1.CreateGroupRequest{ + ParentPath: []string{"Root"}, + Name: "Finance", + }); err != nil { + t.Fatalf("CreateGroup() error = %v", err) + } + + if _, err := client.DeleteGroup(ctx, &keepassgov1.DeleteGroupRequest{ + Path: []string{"Root", "Finance"}, + }); err != nil { + t.Fatalf("DeleteGroup() error = %v, want success for empty group", err) + } + + listed, err := client.ListGroups(ctx, &keepassgov1.ListGroupsRequest{Path: []string{"Root"}}) + if err != nil { + t.Fatalf("ListGroups() error = %v", err) + } + if len(listed.Names) != 2 || listed.Names[0] != "Home Assistant" || listed.Names[1] != "Internet" { + t.Fatalf("ListGroups().Names = %#v, want empty Finance group removed", listed.Names) + } + + _, err = client.DeleteGroup(ctx, &keepassgov1.DeleteGroupRequest{ + Path: []string{"Root", "Internet"}, + }) + if status.Code(err) != codes.FailedPrecondition { + t.Fatalf("DeleteGroup() code = %v, want %v for non-empty group", status.Code(err), codes.FailedPrecondition) + } +} + func TestVaultServiceGeneratesPasswordsForAuthorizedClients(t *testing.T) { t.Parallel() @@ -477,7 +516,10 @@ func TestVaultServiceUpsertsEntriesForAuthorizedClients(t *testing.T) { Username: "codex", Password: "token-2", Url: "https://surveillance.crew.example.invalid", - Path: []string{"Root", "Home Assistant"}, + Fields: map[string]string{ + "X-Role": "lights-admin", + }, + Path: []string{"Root", "Home Assistant"}, }, }) if err != nil { @@ -487,6 +529,9 @@ func TestVaultServiceUpsertsEntriesForAuthorizedClients(t *testing.T) { if upserted.Entry.Title != "Surveillance Console" { t.Fatalf("UpsertEntry().Entry.Title = %q, want %q", upserted.Entry.Title, "Surveillance Console") } + if got := upserted.Entry.Fields["X-Role"]; got != "lights-admin" { + t.Fatalf("UpsertEntry().Entry.Fields[X-Role] = %q, want %q", got, "lights-admin") + } listed, err := client.ListEntries(ctx, &keepassgov1.ListEntriesRequest{Path: []string{"Root", "Home Assistant"}}) if err != nil { @@ -496,6 +541,9 @@ func TestVaultServiceUpsertsEntriesForAuthorizedClients(t *testing.T) { if len(listed.Entries) != 1 || listed.Entries[0].Password != "token-2" { t.Fatalf("ListEntries().Entries = %#v, want persisted Home Assistant entry", listed.Entries) } + if got := listed.Entries[0].Fields["X-Role"]; got != "lights-admin" { + t.Fatalf("ListEntries().Entries[0].Fields[X-Role] = %q, want %q", got, "lights-admin") + } } func TestVaultServiceDeletesAndRestoresEntriesForAuthorizedClients(t *testing.T) { @@ -552,6 +600,9 @@ func TestVaultServiceListsAndInstantiatesTemplatesForAuthorizedClients(t *testin if len(templates.Templates) != 1 || templates.Templates[0].Title != "Website Login" { t.Fatalf("ListTemplates().Templates = %#v, want Website Login template", templates.Templates) } + if got := templates.Templates[0].Fields["Environment"]; got != "prod" { + t.Fatalf("ListTemplates().Templates[0].Fields[Environment] = %q, want %q", got, "prod") + } instantiated, err := client.InstantiateTemplate(ctx, &keepassgov1.InstantiateTemplateRequest{ TemplateId: "website-login", @@ -561,8 +612,11 @@ func TestVaultServiceListsAndInstantiatesTemplatesForAuthorizedClients(t *testin Username: "rustyryan", Password: "hunter2", Url: "https://bellagio.example.invalid", - Path: []string{"Root", "Internet"}, - Tags: []string{"dns"}, + Fields: map[string]string{ + "Environment": "staging", + }, + Path: []string{"Root", "Internet"}, + Tags: []string{"dns"}, }, }) if err != nil { @@ -572,6 +626,9 @@ func TestVaultServiceListsAndInstantiatesTemplatesForAuthorizedClients(t *testin if instantiated.Entry.Title != "Bellagio" || instantiated.Entry.Notes != "Reusable template for website accounts." { t.Fatalf("InstantiateTemplate().Entry = %#v, want Bellagio entry with template notes", instantiated.Entry) } + if got := instantiated.Entry.Fields["Environment"]; got != "staging" { + t.Fatalf("InstantiateTemplate().Entry.Fields[Environment] = %q, want %q", got, "staging") + } listed, err := client.ListEntries(ctx, &keepassgov1.ListEntriesRequest{Path: []string{"Root", "Internet"}}) if err != nil { @@ -596,7 +653,10 @@ func TestVaultServiceUpsertsAndDeletesTemplatesForAuthorizedClients(t *testing.T Title: "Website Login Updated", Username: "template-user", Password: "template-password", - Path: []string{"Templates", "Web"}, + Fields: map[string]string{ + "Environment": "dev", + }, + Path: []string{"Templates", "Web"}, }, }) if err != nil { @@ -605,6 +665,9 @@ func TestVaultServiceUpsertsAndDeletesTemplatesForAuthorizedClients(t *testing.T if upserted.Template.Title != "Website Login Updated" { t.Fatalf("UpsertTemplate().Template.Title = %q, want updated title", upserted.Template.Title) } + if got := upserted.Template.Fields["Environment"]; got != "dev" { + t.Fatalf("UpsertTemplate().Template.Fields[Environment] = %q, want %q", got, "dev") + } listed, err := client.ListTemplates(ctx, &keepassgov1.ListTemplatesRequest{}) if err != nil { @@ -613,6 +676,9 @@ func TestVaultServiceUpsertsAndDeletesTemplatesForAuthorizedClients(t *testing.T if len(listed.Templates) != 1 || listed.Templates[0].Title != "Website Login Updated" { t.Fatalf("ListTemplates().Templates = %#v, want updated template", listed.Templates) } + if got := listed.Templates[0].Fields["Environment"]; got != "dev" { + t.Fatalf("ListTemplates().Templates[0].Fields[Environment] = %q, want %q", got, "dev") + } if _, err := client.DeleteTemplate(ctx, &keepassgov1.DeleteTemplateRequest{Id: "website-login"}); err != nil { t.Fatalf("DeleteTemplate() error = %v", err) @@ -721,6 +787,9 @@ func newTestClient(t *testing.T) (keepassgov1.VaultServiceClient, *memoryClipboa Username: "dannyocean", Password: "token-1", URL: "https://vault.crew.example.invalid", + Fields: map[string]string{ + "X-Role": "automation", + }, History: []vault.Entry{ { ID: "vault-console-h1", @@ -750,8 +819,11 @@ func newTestClient(t *testing.T) (keepassgov1.VaultServiceClient, *memoryClipboa Password: "template-password", URL: "https://example.com", Notes: "Reusable template for website accounts.", - Tags: []string{"template", "web"}, - Path: []string{"Templates"}, + Fields: map[string]string{ + "Environment": "prod", + }, + Tags: []string{"template", "web"}, + Path: []string{"Templates"}, }, }, }, diff --git a/proto/keepassgo/v1/keepassgo.pb.go b/proto/keepassgo/v1/keepassgo.pb.go index 8708e19..92e07f2 100644 --- a/proto/keepassgo/v1/keepassgo.pb.go +++ b/proto/keepassgo/v1/keepassgo.pb.go @@ -627,6 +627,7 @@ type Entry struct { Notes string `protobuf:"bytes,6,opt,name=notes,proto3" json:"notes,omitempty"` Tags []string `protobuf:"bytes,7,rep,name=tags,proto3" json:"tags,omitempty"` Path []string `protobuf:"bytes,8,rep,name=path,proto3" json:"path,omitempty"` + Fields map[string]string `protobuf:"bytes,9,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -717,6 +718,13 @@ func (x *Entry) GetPath() []string { return nil } +func (x *Entry) GetFields() map[string]string { + if x != nil { + return x.Fields + } + return nil +} + type ListEntriesResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Entries []*Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` @@ -1025,6 +1033,86 @@ func (*RenameGroupResponse) Descriptor() ([]byte, []int) { return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{20} } +type DeleteGroupRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Path []string `protobuf:"bytes,1,rep,name=path,proto3" json:"path,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteGroupRequest) Reset() { + *x = DeleteGroupRequest{} + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGroupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGroupRequest) ProtoMessage() {} + +func (x *DeleteGroupRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGroupRequest.ProtoReflect.Descriptor instead. +func (*DeleteGroupRequest) Descriptor() ([]byte, []int) { + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{21} +} + +func (x *DeleteGroupRequest) GetPath() []string { + if x != nil { + return x.Path + } + return nil +} + +type DeleteGroupResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteGroupResponse) Reset() { + *x = DeleteGroupResponse{} + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGroupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGroupResponse) ProtoMessage() {} + +func (x *DeleteGroupResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGroupResponse.ProtoReflect.Descriptor instead. +func (*DeleteGroupResponse) Descriptor() ([]byte, []int) { + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{22} +} + type UpsertEntryRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Entry *Entry `protobuf:"bytes,1,opt,name=entry,proto3" json:"entry,omitempty"` @@ -1034,7 +1122,7 @@ type UpsertEntryRequest struct { func (x *UpsertEntryRequest) Reset() { *x = UpsertEntryRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[21] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1046,7 +1134,7 @@ func (x *UpsertEntryRequest) String() string { func (*UpsertEntryRequest) ProtoMessage() {} func (x *UpsertEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[21] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1059,7 +1147,7 @@ func (x *UpsertEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpsertEntryRequest.ProtoReflect.Descriptor instead. func (*UpsertEntryRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{21} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{23} } func (x *UpsertEntryRequest) GetEntry() *Entry { @@ -1078,7 +1166,7 @@ type UpsertEntryResponse struct { func (x *UpsertEntryResponse) Reset() { *x = UpsertEntryResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[22] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1090,7 +1178,7 @@ func (x *UpsertEntryResponse) String() string { func (*UpsertEntryResponse) ProtoMessage() {} func (x *UpsertEntryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[22] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1103,7 +1191,7 @@ func (x *UpsertEntryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpsertEntryResponse.ProtoReflect.Descriptor instead. func (*UpsertEntryResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{22} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{24} } func (x *UpsertEntryResponse) GetEntry() *Entry { @@ -1122,7 +1210,7 @@ type DeleteEntryRequest struct { func (x *DeleteEntryRequest) Reset() { *x = DeleteEntryRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[23] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1134,7 +1222,7 @@ func (x *DeleteEntryRequest) String() string { func (*DeleteEntryRequest) ProtoMessage() {} func (x *DeleteEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[23] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1147,7 +1235,7 @@ func (x *DeleteEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteEntryRequest.ProtoReflect.Descriptor instead. func (*DeleteEntryRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{23} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{25} } func (x *DeleteEntryRequest) GetId() string { @@ -1165,7 +1253,7 @@ type DeleteEntryResponse struct { func (x *DeleteEntryResponse) Reset() { *x = DeleteEntryResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[24] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1177,7 +1265,7 @@ func (x *DeleteEntryResponse) String() string { func (*DeleteEntryResponse) ProtoMessage() {} func (x *DeleteEntryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[24] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1190,7 +1278,7 @@ func (x *DeleteEntryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteEntryResponse.ProtoReflect.Descriptor instead. func (*DeleteEntryResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{24} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{26} } type RestoreEntryRequest struct { @@ -1202,7 +1290,7 @@ type RestoreEntryRequest struct { func (x *RestoreEntryRequest) Reset() { *x = RestoreEntryRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[25] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1214,7 +1302,7 @@ func (x *RestoreEntryRequest) String() string { func (*RestoreEntryRequest) ProtoMessage() {} func (x *RestoreEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[25] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1227,7 +1315,7 @@ func (x *RestoreEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreEntryRequest.ProtoReflect.Descriptor instead. func (*RestoreEntryRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{25} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{27} } func (x *RestoreEntryRequest) GetId() string { @@ -1246,7 +1334,7 @@ type RestoreEntryResponse struct { func (x *RestoreEntryResponse) Reset() { *x = RestoreEntryResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[26] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1258,7 +1346,7 @@ func (x *RestoreEntryResponse) String() string { func (*RestoreEntryResponse) ProtoMessage() {} func (x *RestoreEntryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[26] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1271,7 +1359,7 @@ func (x *RestoreEntryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreEntryResponse.ProtoReflect.Descriptor instead. func (*RestoreEntryResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{26} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{28} } func (x *RestoreEntryResponse) GetEntry() *Entry { @@ -1290,7 +1378,7 @@ type ListEntryHistoryRequest struct { func (x *ListEntryHistoryRequest) Reset() { *x = ListEntryHistoryRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[27] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1302,7 +1390,7 @@ func (x *ListEntryHistoryRequest) String() string { func (*ListEntryHistoryRequest) ProtoMessage() {} func (x *ListEntryHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[27] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1315,7 +1403,7 @@ func (x *ListEntryHistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEntryHistoryRequest.ProtoReflect.Descriptor instead. func (*ListEntryHistoryRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{27} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{29} } func (x *ListEntryHistoryRequest) GetId() string { @@ -1334,7 +1422,7 @@ type ListEntryHistoryResponse struct { func (x *ListEntryHistoryResponse) Reset() { *x = ListEntryHistoryResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[28] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1346,7 +1434,7 @@ func (x *ListEntryHistoryResponse) String() string { func (*ListEntryHistoryResponse) ProtoMessage() {} func (x *ListEntryHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[28] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1359,7 +1447,7 @@ func (x *ListEntryHistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEntryHistoryResponse.ProtoReflect.Descriptor instead. func (*ListEntryHistoryResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{28} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{30} } func (x *ListEntryHistoryResponse) GetEntries() []*Entry { @@ -1379,7 +1467,7 @@ type RestoreEntryHistoryRequest struct { func (x *RestoreEntryHistoryRequest) Reset() { *x = RestoreEntryHistoryRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[29] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1391,7 +1479,7 @@ func (x *RestoreEntryHistoryRequest) String() string { func (*RestoreEntryHistoryRequest) ProtoMessage() {} func (x *RestoreEntryHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[29] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1404,7 +1492,7 @@ func (x *RestoreEntryHistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreEntryHistoryRequest.ProtoReflect.Descriptor instead. func (*RestoreEntryHistoryRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{29} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{31} } func (x *RestoreEntryHistoryRequest) GetId() string { @@ -1430,7 +1518,7 @@ type RestoreEntryHistoryResponse struct { func (x *RestoreEntryHistoryResponse) Reset() { *x = RestoreEntryHistoryResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[30] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1442,7 +1530,7 @@ func (x *RestoreEntryHistoryResponse) String() string { func (*RestoreEntryHistoryResponse) ProtoMessage() {} func (x *RestoreEntryHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[30] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1455,7 +1543,7 @@ func (x *RestoreEntryHistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreEntryHistoryResponse.ProtoReflect.Descriptor instead. func (*RestoreEntryHistoryResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{30} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{32} } func (x *RestoreEntryHistoryResponse) GetEntry() *Entry { @@ -1473,7 +1561,7 @@ type ListTemplatesRequest struct { func (x *ListTemplatesRequest) Reset() { *x = ListTemplatesRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[31] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1485,7 +1573,7 @@ func (x *ListTemplatesRequest) String() string { func (*ListTemplatesRequest) ProtoMessage() {} func (x *ListTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[31] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1498,7 +1586,7 @@ func (x *ListTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTemplatesRequest.ProtoReflect.Descriptor instead. func (*ListTemplatesRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{31} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{33} } type ListTemplatesResponse struct { @@ -1510,7 +1598,7 @@ type ListTemplatesResponse struct { func (x *ListTemplatesResponse) Reset() { *x = ListTemplatesResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[32] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1522,7 +1610,7 @@ func (x *ListTemplatesResponse) String() string { func (*ListTemplatesResponse) ProtoMessage() {} func (x *ListTemplatesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[32] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1535,7 +1623,7 @@ func (x *ListTemplatesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTemplatesResponse.ProtoReflect.Descriptor instead. func (*ListTemplatesResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{32} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{34} } func (x *ListTemplatesResponse) GetTemplates() []*Entry { @@ -1554,7 +1642,7 @@ type UpsertTemplateRequest struct { func (x *UpsertTemplateRequest) Reset() { *x = UpsertTemplateRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[33] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1566,7 +1654,7 @@ func (x *UpsertTemplateRequest) String() string { func (*UpsertTemplateRequest) ProtoMessage() {} func (x *UpsertTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[33] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1579,7 +1667,7 @@ func (x *UpsertTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpsertTemplateRequest.ProtoReflect.Descriptor instead. func (*UpsertTemplateRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{33} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{35} } func (x *UpsertTemplateRequest) GetTemplate() *Entry { @@ -1598,7 +1686,7 @@ type UpsertTemplateResponse struct { func (x *UpsertTemplateResponse) Reset() { *x = UpsertTemplateResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[34] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1610,7 +1698,7 @@ func (x *UpsertTemplateResponse) String() string { func (*UpsertTemplateResponse) ProtoMessage() {} func (x *UpsertTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[34] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1623,7 +1711,7 @@ func (x *UpsertTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpsertTemplateResponse.ProtoReflect.Descriptor instead. func (*UpsertTemplateResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{34} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{36} } func (x *UpsertTemplateResponse) GetTemplate() *Entry { @@ -1642,7 +1730,7 @@ type DeleteTemplateRequest struct { func (x *DeleteTemplateRequest) Reset() { *x = DeleteTemplateRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[35] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1654,7 +1742,7 @@ func (x *DeleteTemplateRequest) String() string { func (*DeleteTemplateRequest) ProtoMessage() {} func (x *DeleteTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[35] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1667,7 +1755,7 @@ func (x *DeleteTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTemplateRequest.ProtoReflect.Descriptor instead. func (*DeleteTemplateRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{35} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{37} } func (x *DeleteTemplateRequest) GetId() string { @@ -1685,7 +1773,7 @@ type DeleteTemplateResponse struct { func (x *DeleteTemplateResponse) Reset() { *x = DeleteTemplateResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[36] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1697,7 +1785,7 @@ func (x *DeleteTemplateResponse) String() string { func (*DeleteTemplateResponse) ProtoMessage() {} func (x *DeleteTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[36] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1710,7 +1798,7 @@ func (x *DeleteTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTemplateResponse.ProtoReflect.Descriptor instead. func (*DeleteTemplateResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{36} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{38} } type InstantiateTemplateRequest struct { @@ -1723,7 +1811,7 @@ type InstantiateTemplateRequest struct { func (x *InstantiateTemplateRequest) Reset() { *x = InstantiateTemplateRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[37] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1735,7 +1823,7 @@ func (x *InstantiateTemplateRequest) String() string { func (*InstantiateTemplateRequest) ProtoMessage() {} func (x *InstantiateTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[37] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1748,7 +1836,7 @@ func (x *InstantiateTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InstantiateTemplateRequest.ProtoReflect.Descriptor instead. func (*InstantiateTemplateRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{37} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{39} } func (x *InstantiateTemplateRequest) GetTemplateId() string { @@ -1774,7 +1862,7 @@ type InstantiateTemplateResponse struct { func (x *InstantiateTemplateResponse) Reset() { *x = InstantiateTemplateResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[38] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1786,7 +1874,7 @@ func (x *InstantiateTemplateResponse) String() string { func (*InstantiateTemplateResponse) ProtoMessage() {} func (x *InstantiateTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[38] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1799,7 +1887,7 @@ func (x *InstantiateTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InstantiateTemplateResponse.ProtoReflect.Descriptor instead. func (*InstantiateTemplateResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{38} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{40} } func (x *InstantiateTemplateResponse) GetEntry() *Entry { @@ -1818,7 +1906,7 @@ type ListAttachmentsRequest struct { func (x *ListAttachmentsRequest) Reset() { *x = ListAttachmentsRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[39] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1830,7 +1918,7 @@ func (x *ListAttachmentsRequest) String() string { func (*ListAttachmentsRequest) ProtoMessage() {} func (x *ListAttachmentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[39] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1843,7 +1931,7 @@ func (x *ListAttachmentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAttachmentsRequest.ProtoReflect.Descriptor instead. func (*ListAttachmentsRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{39} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{41} } func (x *ListAttachmentsRequest) GetEntryId() string { @@ -1862,7 +1950,7 @@ type ListAttachmentsResponse struct { func (x *ListAttachmentsResponse) Reset() { *x = ListAttachmentsResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[40] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1874,7 +1962,7 @@ func (x *ListAttachmentsResponse) String() string { func (*ListAttachmentsResponse) ProtoMessage() {} func (x *ListAttachmentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[40] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1887,7 +1975,7 @@ func (x *ListAttachmentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAttachmentsResponse.ProtoReflect.Descriptor instead. func (*ListAttachmentsResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{40} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{42} } func (x *ListAttachmentsResponse) GetNames() []string { @@ -1908,7 +1996,7 @@ type UploadAttachmentRequest struct { func (x *UploadAttachmentRequest) Reset() { *x = UploadAttachmentRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[41] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1920,7 +2008,7 @@ func (x *UploadAttachmentRequest) String() string { func (*UploadAttachmentRequest) ProtoMessage() {} func (x *UploadAttachmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[41] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1933,7 +2021,7 @@ func (x *UploadAttachmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadAttachmentRequest.ProtoReflect.Descriptor instead. func (*UploadAttachmentRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{41} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{43} } func (x *UploadAttachmentRequest) GetEntryId() string { @@ -1965,7 +2053,7 @@ type UploadAttachmentResponse struct { func (x *UploadAttachmentResponse) Reset() { *x = UploadAttachmentResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[42] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1977,7 +2065,7 @@ func (x *UploadAttachmentResponse) String() string { func (*UploadAttachmentResponse) ProtoMessage() {} func (x *UploadAttachmentResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[42] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1990,7 +2078,7 @@ func (x *UploadAttachmentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadAttachmentResponse.ProtoReflect.Descriptor instead. func (*UploadAttachmentResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{42} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{44} } type DownloadAttachmentRequest struct { @@ -2003,7 +2091,7 @@ type DownloadAttachmentRequest struct { func (x *DownloadAttachmentRequest) Reset() { *x = DownloadAttachmentRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[43] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2015,7 +2103,7 @@ func (x *DownloadAttachmentRequest) String() string { func (*DownloadAttachmentRequest) ProtoMessage() {} func (x *DownloadAttachmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[43] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2028,7 +2116,7 @@ func (x *DownloadAttachmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DownloadAttachmentRequest.ProtoReflect.Descriptor instead. func (*DownloadAttachmentRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{43} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{45} } func (x *DownloadAttachmentRequest) GetEntryId() string { @@ -2054,7 +2142,7 @@ type DownloadAttachmentResponse struct { func (x *DownloadAttachmentResponse) Reset() { *x = DownloadAttachmentResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[44] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2066,7 +2154,7 @@ func (x *DownloadAttachmentResponse) String() string { func (*DownloadAttachmentResponse) ProtoMessage() {} func (x *DownloadAttachmentResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[44] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2079,7 +2167,7 @@ func (x *DownloadAttachmentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DownloadAttachmentResponse.ProtoReflect.Descriptor instead. func (*DownloadAttachmentResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{44} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{46} } func (x *DownloadAttachmentResponse) GetContent() []byte { @@ -2099,7 +2187,7 @@ type DeleteAttachmentRequest struct { func (x *DeleteAttachmentRequest) Reset() { *x = DeleteAttachmentRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[45] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2111,7 +2199,7 @@ func (x *DeleteAttachmentRequest) String() string { func (*DeleteAttachmentRequest) ProtoMessage() {} func (x *DeleteAttachmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[45] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2124,7 +2212,7 @@ func (x *DeleteAttachmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteAttachmentRequest.ProtoReflect.Descriptor instead. func (*DeleteAttachmentRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{45} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{47} } func (x *DeleteAttachmentRequest) GetEntryId() string { @@ -2149,7 +2237,7 @@ type DeleteAttachmentResponse struct { func (x *DeleteAttachmentResponse) Reset() { *x = DeleteAttachmentResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[46] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2161,7 +2249,7 @@ func (x *DeleteAttachmentResponse) String() string { func (*DeleteAttachmentResponse) ProtoMessage() {} func (x *DeleteAttachmentResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[46] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2174,7 +2262,7 @@ func (x *DeleteAttachmentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteAttachmentResponse.ProtoReflect.Descriptor instead. func (*DeleteAttachmentResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{46} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{48} } type CopyEntryFieldRequest struct { @@ -2187,7 +2275,7 @@ type CopyEntryFieldRequest struct { func (x *CopyEntryFieldRequest) Reset() { *x = CopyEntryFieldRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[47] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2199,7 +2287,7 @@ func (x *CopyEntryFieldRequest) String() string { func (*CopyEntryFieldRequest) ProtoMessage() {} func (x *CopyEntryFieldRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[47] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2212,7 +2300,7 @@ func (x *CopyEntryFieldRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyEntryFieldRequest.ProtoReflect.Descriptor instead. func (*CopyEntryFieldRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{47} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{49} } func (x *CopyEntryFieldRequest) GetId() string { @@ -2237,7 +2325,7 @@ type CopyEntryFieldResponse struct { func (x *CopyEntryFieldResponse) Reset() { *x = CopyEntryFieldResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[48] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2249,7 +2337,7 @@ func (x *CopyEntryFieldResponse) String() string { func (*CopyEntryFieldResponse) ProtoMessage() {} func (x *CopyEntryFieldResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[48] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2262,7 +2350,7 @@ func (x *CopyEntryFieldResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyEntryFieldResponse.ProtoReflect.Descriptor instead. func (*CopyEntryFieldResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{48} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{50} } type GeneratePasswordRequest struct { @@ -2274,7 +2362,7 @@ type GeneratePasswordRequest struct { func (x *GeneratePasswordRequest) Reset() { *x = GeneratePasswordRequest{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[49] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2286,7 +2374,7 @@ func (x *GeneratePasswordRequest) String() string { func (*GeneratePasswordRequest) ProtoMessage() {} func (x *GeneratePasswordRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[49] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2299,7 +2387,7 @@ func (x *GeneratePasswordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GeneratePasswordRequest.ProtoReflect.Descriptor instead. func (*GeneratePasswordRequest) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{49} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{51} } func (x *GeneratePasswordRequest) GetProfile() string { @@ -2318,7 +2406,7 @@ type GeneratePasswordResponse struct { func (x *GeneratePasswordResponse) Reset() { *x = GeneratePasswordResponse{} - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[50] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2330,7 +2418,7 @@ func (x *GeneratePasswordResponse) String() string { func (*GeneratePasswordResponse) ProtoMessage() {} func (x *GeneratePasswordResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[50] + mi := &file_proto_keepassgo_v1_keepassgo_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2343,7 +2431,7 @@ func (x *GeneratePasswordResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GeneratePasswordResponse.ProtoReflect.Descriptor instead. func (*GeneratePasswordResponse) Descriptor() ([]byte, []int) { - return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{50} + return file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP(), []int{52} } func (x *GeneratePasswordResponse) GetPassword() string { @@ -2387,7 +2475,7 @@ const file_proto_keepassgo_v1_keepassgo_proto_rawDesc = "" + "\x13UnlockVaultResponse\">\n" + "\x12ListEntriesRequest\x12\x12\n" + "\x04path\x18\x01 \x03(\tR\x04path\x12\x14\n" + - "\x05query\x18\x02 \x01(\tR\x05query\"\xb5\x01\n" + + "\x05query\x18\x02 \x01(\tR\x05query\"\xa9\x02\n" + "\x05Entry\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + "\x05title\x18\x02 \x01(\tR\x05title\x12\x1a\n" + @@ -2396,7 +2484,11 @@ const file_proto_keepassgo_v1_keepassgo_proto_rawDesc = "" + "\x03url\x18\x05 \x01(\tR\x03url\x12\x14\n" + "\x05notes\x18\x06 \x01(\tR\x05notes\x12\x12\n" + "\x04tags\x18\a \x03(\tR\x04tags\x12\x12\n" + - "\x04path\x18\b \x03(\tR\x04path\"D\n" + + "\x04path\x18\b \x03(\tR\x04path\x127\n" + + "\x06fields\x18\t \x03(\v2\x1f.keepassgo.v1.Entry.FieldsEntryR\x06fields\x1a9\n" + + "\vFieldsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"D\n" + "\x13ListEntriesResponse\x12-\n" + "\aentries\x18\x01 \x03(\v2\x13.keepassgo.v1.EntryR\aentries\"'\n" + "\x11ListGroupsRequest\x12\x12\n" + @@ -2411,7 +2503,10 @@ const file_proto_keepassgo_v1_keepassgo_proto_rawDesc = "" + "\x12RenameGroupRequest\x12\x12\n" + "\x04path\x18\x01 \x03(\tR\x04path\x12\x19\n" + "\bnew_name\x18\x02 \x01(\tR\anewName\"\x15\n" + - "\x13RenameGroupResponse\"?\n" + + "\x13RenameGroupResponse\"(\n" + + "\x12DeleteGroupRequest\x12\x12\n" + + "\x04path\x18\x01 \x03(\tR\x04path\"\x15\n" + + "\x13DeleteGroupResponse\"?\n" + "\x12UpsertEntryRequest\x12)\n" + "\x05entry\x18\x01 \x01(\v2\x13.keepassgo.v1.EntryR\x05entry\"@\n" + "\x13UpsertEntryResponse\x12)\n" + @@ -2473,7 +2568,7 @@ const file_proto_keepassgo_v1_keepassgo_proto_rawDesc = "" + "\x17GeneratePasswordRequest\x12\x18\n" + "\aprofile\x18\x01 \x01(\tR\aprofile\"6\n" + "\x18GeneratePasswordResponse\x12\x1a\n" + - "\bpassword\x18\x01 \x01(\tR\bpassword2\xf9\x11\n" + + "\bpassword\x18\x01 \x01(\tR\bpassword2\xcd\x12\n" + "\fVaultService\x12a\n" + "\x10GetSessionStatus\x12%.keepassgo.v1.GetSessionStatusRequest\x1a&.keepassgo.v1.GetSessionStatusResponse\x12L\n" + "\tOpenVault\x12\x1e.keepassgo.v1.OpenVaultRequest\x1a\x1f.keepassgo.v1.OpenVaultResponse\x12^\n" + @@ -2486,6 +2581,7 @@ const file_proto_keepassgo_v1_keepassgo_proto_rawDesc = "" + "ListGroups\x12\x1f.keepassgo.v1.ListGroupsRequest\x1a .keepassgo.v1.ListGroupsResponse\x12R\n" + "\vCreateGroup\x12 .keepassgo.v1.CreateGroupRequest\x1a!.keepassgo.v1.CreateGroupResponse\x12R\n" + "\vRenameGroup\x12 .keepassgo.v1.RenameGroupRequest\x1a!.keepassgo.v1.RenameGroupResponse\x12R\n" + + "\vDeleteGroup\x12 .keepassgo.v1.DeleteGroupRequest\x1a!.keepassgo.v1.DeleteGroupResponse\x12R\n" + "\vUpsertEntry\x12 .keepassgo.v1.UpsertEntryRequest\x1a!.keepassgo.v1.UpsertEntryResponse\x12R\n" + "\vDeleteEntry\x12 .keepassgo.v1.DeleteEntryRequest\x1a!.keepassgo.v1.DeleteEntryResponse\x12U\n" + "\fRestoreEntry\x12!.keepassgo.v1.RestoreEntryRequest\x1a\".keepassgo.v1.RestoreEntryResponse\x12a\n" + @@ -2514,7 +2610,7 @@ func file_proto_keepassgo_v1_keepassgo_proto_rawDescGZIP() []byte { return file_proto_keepassgo_v1_keepassgo_proto_rawDescData } -var file_proto_keepassgo_v1_keepassgo_proto_msgTypes = make([]protoimpl.MessageInfo, 51) +var file_proto_keepassgo_v1_keepassgo_proto_msgTypes = make([]protoimpl.MessageInfo, 54) var file_proto_keepassgo_v1_keepassgo_proto_goTypes = []any{ (*GetSessionStatusRequest)(nil), // 0: keepassgo.v1.GetSessionStatusRequest (*GetSessionStatusResponse)(nil), // 1: keepassgo.v1.GetSessionStatusResponse @@ -2537,104 +2633,110 @@ var file_proto_keepassgo_v1_keepassgo_proto_goTypes = []any{ (*CreateGroupResponse)(nil), // 18: keepassgo.v1.CreateGroupResponse (*RenameGroupRequest)(nil), // 19: keepassgo.v1.RenameGroupRequest (*RenameGroupResponse)(nil), // 20: keepassgo.v1.RenameGroupResponse - (*UpsertEntryRequest)(nil), // 21: keepassgo.v1.UpsertEntryRequest - (*UpsertEntryResponse)(nil), // 22: keepassgo.v1.UpsertEntryResponse - (*DeleteEntryRequest)(nil), // 23: keepassgo.v1.DeleteEntryRequest - (*DeleteEntryResponse)(nil), // 24: keepassgo.v1.DeleteEntryResponse - (*RestoreEntryRequest)(nil), // 25: keepassgo.v1.RestoreEntryRequest - (*RestoreEntryResponse)(nil), // 26: keepassgo.v1.RestoreEntryResponse - (*ListEntryHistoryRequest)(nil), // 27: keepassgo.v1.ListEntryHistoryRequest - (*ListEntryHistoryResponse)(nil), // 28: keepassgo.v1.ListEntryHistoryResponse - (*RestoreEntryHistoryRequest)(nil), // 29: keepassgo.v1.RestoreEntryHistoryRequest - (*RestoreEntryHistoryResponse)(nil), // 30: keepassgo.v1.RestoreEntryHistoryResponse - (*ListTemplatesRequest)(nil), // 31: keepassgo.v1.ListTemplatesRequest - (*ListTemplatesResponse)(nil), // 32: keepassgo.v1.ListTemplatesResponse - (*UpsertTemplateRequest)(nil), // 33: keepassgo.v1.UpsertTemplateRequest - (*UpsertTemplateResponse)(nil), // 34: keepassgo.v1.UpsertTemplateResponse - (*DeleteTemplateRequest)(nil), // 35: keepassgo.v1.DeleteTemplateRequest - (*DeleteTemplateResponse)(nil), // 36: keepassgo.v1.DeleteTemplateResponse - (*InstantiateTemplateRequest)(nil), // 37: keepassgo.v1.InstantiateTemplateRequest - (*InstantiateTemplateResponse)(nil), // 38: keepassgo.v1.InstantiateTemplateResponse - (*ListAttachmentsRequest)(nil), // 39: keepassgo.v1.ListAttachmentsRequest - (*ListAttachmentsResponse)(nil), // 40: keepassgo.v1.ListAttachmentsResponse - (*UploadAttachmentRequest)(nil), // 41: keepassgo.v1.UploadAttachmentRequest - (*UploadAttachmentResponse)(nil), // 42: keepassgo.v1.UploadAttachmentResponse - (*DownloadAttachmentRequest)(nil), // 43: keepassgo.v1.DownloadAttachmentRequest - (*DownloadAttachmentResponse)(nil), // 44: keepassgo.v1.DownloadAttachmentResponse - (*DeleteAttachmentRequest)(nil), // 45: keepassgo.v1.DeleteAttachmentRequest - (*DeleteAttachmentResponse)(nil), // 46: keepassgo.v1.DeleteAttachmentResponse - (*CopyEntryFieldRequest)(nil), // 47: keepassgo.v1.CopyEntryFieldRequest - (*CopyEntryFieldResponse)(nil), // 48: keepassgo.v1.CopyEntryFieldResponse - (*GeneratePasswordRequest)(nil), // 49: keepassgo.v1.GeneratePasswordRequest - (*GeneratePasswordResponse)(nil), // 50: keepassgo.v1.GeneratePasswordResponse + (*DeleteGroupRequest)(nil), // 21: keepassgo.v1.DeleteGroupRequest + (*DeleteGroupResponse)(nil), // 22: keepassgo.v1.DeleteGroupResponse + (*UpsertEntryRequest)(nil), // 23: keepassgo.v1.UpsertEntryRequest + (*UpsertEntryResponse)(nil), // 24: keepassgo.v1.UpsertEntryResponse + (*DeleteEntryRequest)(nil), // 25: keepassgo.v1.DeleteEntryRequest + (*DeleteEntryResponse)(nil), // 26: keepassgo.v1.DeleteEntryResponse + (*RestoreEntryRequest)(nil), // 27: keepassgo.v1.RestoreEntryRequest + (*RestoreEntryResponse)(nil), // 28: keepassgo.v1.RestoreEntryResponse + (*ListEntryHistoryRequest)(nil), // 29: keepassgo.v1.ListEntryHistoryRequest + (*ListEntryHistoryResponse)(nil), // 30: keepassgo.v1.ListEntryHistoryResponse + (*RestoreEntryHistoryRequest)(nil), // 31: keepassgo.v1.RestoreEntryHistoryRequest + (*RestoreEntryHistoryResponse)(nil), // 32: keepassgo.v1.RestoreEntryHistoryResponse + (*ListTemplatesRequest)(nil), // 33: keepassgo.v1.ListTemplatesRequest + (*ListTemplatesResponse)(nil), // 34: keepassgo.v1.ListTemplatesResponse + (*UpsertTemplateRequest)(nil), // 35: keepassgo.v1.UpsertTemplateRequest + (*UpsertTemplateResponse)(nil), // 36: keepassgo.v1.UpsertTemplateResponse + (*DeleteTemplateRequest)(nil), // 37: keepassgo.v1.DeleteTemplateRequest + (*DeleteTemplateResponse)(nil), // 38: keepassgo.v1.DeleteTemplateResponse + (*InstantiateTemplateRequest)(nil), // 39: keepassgo.v1.InstantiateTemplateRequest + (*InstantiateTemplateResponse)(nil), // 40: keepassgo.v1.InstantiateTemplateResponse + (*ListAttachmentsRequest)(nil), // 41: keepassgo.v1.ListAttachmentsRequest + (*ListAttachmentsResponse)(nil), // 42: keepassgo.v1.ListAttachmentsResponse + (*UploadAttachmentRequest)(nil), // 43: keepassgo.v1.UploadAttachmentRequest + (*UploadAttachmentResponse)(nil), // 44: keepassgo.v1.UploadAttachmentResponse + (*DownloadAttachmentRequest)(nil), // 45: keepassgo.v1.DownloadAttachmentRequest + (*DownloadAttachmentResponse)(nil), // 46: keepassgo.v1.DownloadAttachmentResponse + (*DeleteAttachmentRequest)(nil), // 47: keepassgo.v1.DeleteAttachmentRequest + (*DeleteAttachmentResponse)(nil), // 48: keepassgo.v1.DeleteAttachmentResponse + (*CopyEntryFieldRequest)(nil), // 49: keepassgo.v1.CopyEntryFieldRequest + (*CopyEntryFieldResponse)(nil), // 50: keepassgo.v1.CopyEntryFieldResponse + (*GeneratePasswordRequest)(nil), // 51: keepassgo.v1.GeneratePasswordRequest + (*GeneratePasswordResponse)(nil), // 52: keepassgo.v1.GeneratePasswordResponse + nil, // 53: keepassgo.v1.Entry.FieldsEntry } var file_proto_keepassgo_v1_keepassgo_proto_depIdxs = []int32{ - 13, // 0: keepassgo.v1.ListEntriesResponse.entries:type_name -> keepassgo.v1.Entry - 13, // 1: keepassgo.v1.UpsertEntryRequest.entry:type_name -> keepassgo.v1.Entry - 13, // 2: keepassgo.v1.UpsertEntryResponse.entry:type_name -> keepassgo.v1.Entry - 13, // 3: keepassgo.v1.RestoreEntryResponse.entry:type_name -> keepassgo.v1.Entry - 13, // 4: keepassgo.v1.ListEntryHistoryResponse.entries:type_name -> keepassgo.v1.Entry - 13, // 5: keepassgo.v1.RestoreEntryHistoryResponse.entry:type_name -> keepassgo.v1.Entry - 13, // 6: keepassgo.v1.ListTemplatesResponse.templates:type_name -> keepassgo.v1.Entry - 13, // 7: keepassgo.v1.UpsertTemplateRequest.template:type_name -> keepassgo.v1.Entry - 13, // 8: keepassgo.v1.UpsertTemplateResponse.template:type_name -> keepassgo.v1.Entry - 13, // 9: keepassgo.v1.InstantiateTemplateRequest.overrides:type_name -> keepassgo.v1.Entry - 13, // 10: keepassgo.v1.InstantiateTemplateResponse.entry:type_name -> keepassgo.v1.Entry - 0, // 11: keepassgo.v1.VaultService.GetSessionStatus:input_type -> keepassgo.v1.GetSessionStatusRequest - 2, // 12: keepassgo.v1.VaultService.OpenVault:input_type -> keepassgo.v1.OpenVaultRequest - 4, // 13: keepassgo.v1.VaultService.OpenRemoteVault:input_type -> keepassgo.v1.OpenRemoteVaultRequest - 6, // 14: keepassgo.v1.VaultService.SaveVault:input_type -> keepassgo.v1.SaveVaultRequest - 8, // 15: keepassgo.v1.VaultService.LockVault:input_type -> keepassgo.v1.LockVaultRequest - 10, // 16: keepassgo.v1.VaultService.UnlockVault:input_type -> keepassgo.v1.UnlockVaultRequest - 12, // 17: keepassgo.v1.VaultService.ListEntries:input_type -> keepassgo.v1.ListEntriesRequest - 15, // 18: keepassgo.v1.VaultService.ListGroups:input_type -> keepassgo.v1.ListGroupsRequest - 17, // 19: keepassgo.v1.VaultService.CreateGroup:input_type -> keepassgo.v1.CreateGroupRequest - 19, // 20: keepassgo.v1.VaultService.RenameGroup:input_type -> keepassgo.v1.RenameGroupRequest - 21, // 21: keepassgo.v1.VaultService.UpsertEntry:input_type -> keepassgo.v1.UpsertEntryRequest - 23, // 22: keepassgo.v1.VaultService.DeleteEntry:input_type -> keepassgo.v1.DeleteEntryRequest - 25, // 23: keepassgo.v1.VaultService.RestoreEntry:input_type -> keepassgo.v1.RestoreEntryRequest - 27, // 24: keepassgo.v1.VaultService.ListEntryHistory:input_type -> keepassgo.v1.ListEntryHistoryRequest - 29, // 25: keepassgo.v1.VaultService.RestoreEntryHistory:input_type -> keepassgo.v1.RestoreEntryHistoryRequest - 31, // 26: keepassgo.v1.VaultService.ListTemplates:input_type -> keepassgo.v1.ListTemplatesRequest - 33, // 27: keepassgo.v1.VaultService.UpsertTemplate:input_type -> keepassgo.v1.UpsertTemplateRequest - 35, // 28: keepassgo.v1.VaultService.DeleteTemplate:input_type -> keepassgo.v1.DeleteTemplateRequest - 37, // 29: keepassgo.v1.VaultService.InstantiateTemplate:input_type -> keepassgo.v1.InstantiateTemplateRequest - 39, // 30: keepassgo.v1.VaultService.ListAttachments:input_type -> keepassgo.v1.ListAttachmentsRequest - 41, // 31: keepassgo.v1.VaultService.UploadAttachment:input_type -> keepassgo.v1.UploadAttachmentRequest - 43, // 32: keepassgo.v1.VaultService.DownloadAttachment:input_type -> keepassgo.v1.DownloadAttachmentRequest - 45, // 33: keepassgo.v1.VaultService.DeleteAttachment:input_type -> keepassgo.v1.DeleteAttachmentRequest - 47, // 34: keepassgo.v1.VaultService.CopyEntryField:input_type -> keepassgo.v1.CopyEntryFieldRequest - 49, // 35: keepassgo.v1.VaultService.GeneratePassword:input_type -> keepassgo.v1.GeneratePasswordRequest - 1, // 36: keepassgo.v1.VaultService.GetSessionStatus:output_type -> keepassgo.v1.GetSessionStatusResponse - 3, // 37: keepassgo.v1.VaultService.OpenVault:output_type -> keepassgo.v1.OpenVaultResponse - 5, // 38: keepassgo.v1.VaultService.OpenRemoteVault:output_type -> keepassgo.v1.OpenRemoteVaultResponse - 7, // 39: keepassgo.v1.VaultService.SaveVault:output_type -> keepassgo.v1.SaveVaultResponse - 9, // 40: keepassgo.v1.VaultService.LockVault:output_type -> keepassgo.v1.LockVaultResponse - 11, // 41: keepassgo.v1.VaultService.UnlockVault:output_type -> keepassgo.v1.UnlockVaultResponse - 14, // 42: keepassgo.v1.VaultService.ListEntries:output_type -> keepassgo.v1.ListEntriesResponse - 16, // 43: keepassgo.v1.VaultService.ListGroups:output_type -> keepassgo.v1.ListGroupsResponse - 18, // 44: keepassgo.v1.VaultService.CreateGroup:output_type -> keepassgo.v1.CreateGroupResponse - 20, // 45: keepassgo.v1.VaultService.RenameGroup:output_type -> keepassgo.v1.RenameGroupResponse - 22, // 46: keepassgo.v1.VaultService.UpsertEntry:output_type -> keepassgo.v1.UpsertEntryResponse - 24, // 47: keepassgo.v1.VaultService.DeleteEntry:output_type -> keepassgo.v1.DeleteEntryResponse - 26, // 48: keepassgo.v1.VaultService.RestoreEntry:output_type -> keepassgo.v1.RestoreEntryResponse - 28, // 49: keepassgo.v1.VaultService.ListEntryHistory:output_type -> keepassgo.v1.ListEntryHistoryResponse - 30, // 50: keepassgo.v1.VaultService.RestoreEntryHistory:output_type -> keepassgo.v1.RestoreEntryHistoryResponse - 32, // 51: keepassgo.v1.VaultService.ListTemplates:output_type -> keepassgo.v1.ListTemplatesResponse - 34, // 52: keepassgo.v1.VaultService.UpsertTemplate:output_type -> keepassgo.v1.UpsertTemplateResponse - 36, // 53: keepassgo.v1.VaultService.DeleteTemplate:output_type -> keepassgo.v1.DeleteTemplateResponse - 38, // 54: keepassgo.v1.VaultService.InstantiateTemplate:output_type -> keepassgo.v1.InstantiateTemplateResponse - 40, // 55: keepassgo.v1.VaultService.ListAttachments:output_type -> keepassgo.v1.ListAttachmentsResponse - 42, // 56: keepassgo.v1.VaultService.UploadAttachment:output_type -> keepassgo.v1.UploadAttachmentResponse - 44, // 57: keepassgo.v1.VaultService.DownloadAttachment:output_type -> keepassgo.v1.DownloadAttachmentResponse - 46, // 58: keepassgo.v1.VaultService.DeleteAttachment:output_type -> keepassgo.v1.DeleteAttachmentResponse - 48, // 59: keepassgo.v1.VaultService.CopyEntryField:output_type -> keepassgo.v1.CopyEntryFieldResponse - 50, // 60: keepassgo.v1.VaultService.GeneratePassword:output_type -> keepassgo.v1.GeneratePasswordResponse - 36, // [36:61] is the sub-list for method output_type - 11, // [11:36] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 53, // 0: keepassgo.v1.Entry.fields:type_name -> keepassgo.v1.Entry.FieldsEntry + 13, // 1: keepassgo.v1.ListEntriesResponse.entries:type_name -> keepassgo.v1.Entry + 13, // 2: keepassgo.v1.UpsertEntryRequest.entry:type_name -> keepassgo.v1.Entry + 13, // 3: keepassgo.v1.UpsertEntryResponse.entry:type_name -> keepassgo.v1.Entry + 13, // 4: keepassgo.v1.RestoreEntryResponse.entry:type_name -> keepassgo.v1.Entry + 13, // 5: keepassgo.v1.ListEntryHistoryResponse.entries:type_name -> keepassgo.v1.Entry + 13, // 6: keepassgo.v1.RestoreEntryHistoryResponse.entry:type_name -> keepassgo.v1.Entry + 13, // 7: keepassgo.v1.ListTemplatesResponse.templates:type_name -> keepassgo.v1.Entry + 13, // 8: keepassgo.v1.UpsertTemplateRequest.template:type_name -> keepassgo.v1.Entry + 13, // 9: keepassgo.v1.UpsertTemplateResponse.template:type_name -> keepassgo.v1.Entry + 13, // 10: keepassgo.v1.InstantiateTemplateRequest.overrides:type_name -> keepassgo.v1.Entry + 13, // 11: keepassgo.v1.InstantiateTemplateResponse.entry:type_name -> keepassgo.v1.Entry + 0, // 12: keepassgo.v1.VaultService.GetSessionStatus:input_type -> keepassgo.v1.GetSessionStatusRequest + 2, // 13: keepassgo.v1.VaultService.OpenVault:input_type -> keepassgo.v1.OpenVaultRequest + 4, // 14: keepassgo.v1.VaultService.OpenRemoteVault:input_type -> keepassgo.v1.OpenRemoteVaultRequest + 6, // 15: keepassgo.v1.VaultService.SaveVault:input_type -> keepassgo.v1.SaveVaultRequest + 8, // 16: keepassgo.v1.VaultService.LockVault:input_type -> keepassgo.v1.LockVaultRequest + 10, // 17: keepassgo.v1.VaultService.UnlockVault:input_type -> keepassgo.v1.UnlockVaultRequest + 12, // 18: keepassgo.v1.VaultService.ListEntries:input_type -> keepassgo.v1.ListEntriesRequest + 15, // 19: keepassgo.v1.VaultService.ListGroups:input_type -> keepassgo.v1.ListGroupsRequest + 17, // 20: keepassgo.v1.VaultService.CreateGroup:input_type -> keepassgo.v1.CreateGroupRequest + 19, // 21: keepassgo.v1.VaultService.RenameGroup:input_type -> keepassgo.v1.RenameGroupRequest + 21, // 22: keepassgo.v1.VaultService.DeleteGroup:input_type -> keepassgo.v1.DeleteGroupRequest + 23, // 23: keepassgo.v1.VaultService.UpsertEntry:input_type -> keepassgo.v1.UpsertEntryRequest + 25, // 24: keepassgo.v1.VaultService.DeleteEntry:input_type -> keepassgo.v1.DeleteEntryRequest + 27, // 25: keepassgo.v1.VaultService.RestoreEntry:input_type -> keepassgo.v1.RestoreEntryRequest + 29, // 26: keepassgo.v1.VaultService.ListEntryHistory:input_type -> keepassgo.v1.ListEntryHistoryRequest + 31, // 27: keepassgo.v1.VaultService.RestoreEntryHistory:input_type -> keepassgo.v1.RestoreEntryHistoryRequest + 33, // 28: keepassgo.v1.VaultService.ListTemplates:input_type -> keepassgo.v1.ListTemplatesRequest + 35, // 29: keepassgo.v1.VaultService.UpsertTemplate:input_type -> keepassgo.v1.UpsertTemplateRequest + 37, // 30: keepassgo.v1.VaultService.DeleteTemplate:input_type -> keepassgo.v1.DeleteTemplateRequest + 39, // 31: keepassgo.v1.VaultService.InstantiateTemplate:input_type -> keepassgo.v1.InstantiateTemplateRequest + 41, // 32: keepassgo.v1.VaultService.ListAttachments:input_type -> keepassgo.v1.ListAttachmentsRequest + 43, // 33: keepassgo.v1.VaultService.UploadAttachment:input_type -> keepassgo.v1.UploadAttachmentRequest + 45, // 34: keepassgo.v1.VaultService.DownloadAttachment:input_type -> keepassgo.v1.DownloadAttachmentRequest + 47, // 35: keepassgo.v1.VaultService.DeleteAttachment:input_type -> keepassgo.v1.DeleteAttachmentRequest + 49, // 36: keepassgo.v1.VaultService.CopyEntryField:input_type -> keepassgo.v1.CopyEntryFieldRequest + 51, // 37: keepassgo.v1.VaultService.GeneratePassword:input_type -> keepassgo.v1.GeneratePasswordRequest + 1, // 38: keepassgo.v1.VaultService.GetSessionStatus:output_type -> keepassgo.v1.GetSessionStatusResponse + 3, // 39: keepassgo.v1.VaultService.OpenVault:output_type -> keepassgo.v1.OpenVaultResponse + 5, // 40: keepassgo.v1.VaultService.OpenRemoteVault:output_type -> keepassgo.v1.OpenRemoteVaultResponse + 7, // 41: keepassgo.v1.VaultService.SaveVault:output_type -> keepassgo.v1.SaveVaultResponse + 9, // 42: keepassgo.v1.VaultService.LockVault:output_type -> keepassgo.v1.LockVaultResponse + 11, // 43: keepassgo.v1.VaultService.UnlockVault:output_type -> keepassgo.v1.UnlockVaultResponse + 14, // 44: keepassgo.v1.VaultService.ListEntries:output_type -> keepassgo.v1.ListEntriesResponse + 16, // 45: keepassgo.v1.VaultService.ListGroups:output_type -> keepassgo.v1.ListGroupsResponse + 18, // 46: keepassgo.v1.VaultService.CreateGroup:output_type -> keepassgo.v1.CreateGroupResponse + 20, // 47: keepassgo.v1.VaultService.RenameGroup:output_type -> keepassgo.v1.RenameGroupResponse + 22, // 48: keepassgo.v1.VaultService.DeleteGroup:output_type -> keepassgo.v1.DeleteGroupResponse + 24, // 49: keepassgo.v1.VaultService.UpsertEntry:output_type -> keepassgo.v1.UpsertEntryResponse + 26, // 50: keepassgo.v1.VaultService.DeleteEntry:output_type -> keepassgo.v1.DeleteEntryResponse + 28, // 51: keepassgo.v1.VaultService.RestoreEntry:output_type -> keepassgo.v1.RestoreEntryResponse + 30, // 52: keepassgo.v1.VaultService.ListEntryHistory:output_type -> keepassgo.v1.ListEntryHistoryResponse + 32, // 53: keepassgo.v1.VaultService.RestoreEntryHistory:output_type -> keepassgo.v1.RestoreEntryHistoryResponse + 34, // 54: keepassgo.v1.VaultService.ListTemplates:output_type -> keepassgo.v1.ListTemplatesResponse + 36, // 55: keepassgo.v1.VaultService.UpsertTemplate:output_type -> keepassgo.v1.UpsertTemplateResponse + 38, // 56: keepassgo.v1.VaultService.DeleteTemplate:output_type -> keepassgo.v1.DeleteTemplateResponse + 40, // 57: keepassgo.v1.VaultService.InstantiateTemplate:output_type -> keepassgo.v1.InstantiateTemplateResponse + 42, // 58: keepassgo.v1.VaultService.ListAttachments:output_type -> keepassgo.v1.ListAttachmentsResponse + 44, // 59: keepassgo.v1.VaultService.UploadAttachment:output_type -> keepassgo.v1.UploadAttachmentResponse + 46, // 60: keepassgo.v1.VaultService.DownloadAttachment:output_type -> keepassgo.v1.DownloadAttachmentResponse + 48, // 61: keepassgo.v1.VaultService.DeleteAttachment:output_type -> keepassgo.v1.DeleteAttachmentResponse + 50, // 62: keepassgo.v1.VaultService.CopyEntryField:output_type -> keepassgo.v1.CopyEntryFieldResponse + 52, // 63: keepassgo.v1.VaultService.GeneratePassword:output_type -> keepassgo.v1.GeneratePasswordResponse + 38, // [38:64] is the sub-list for method output_type + 12, // [12:38] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_proto_keepassgo_v1_keepassgo_proto_init() } @@ -2648,7 +2750,7 @@ func file_proto_keepassgo_v1_keepassgo_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_keepassgo_v1_keepassgo_proto_rawDesc), len(file_proto_keepassgo_v1_keepassgo_proto_rawDesc)), NumEnums: 0, - NumMessages: 51, + NumMessages: 54, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/keepassgo/v1/keepassgo.proto b/proto/keepassgo/v1/keepassgo.proto index f8d1583..ef57ec8 100644 --- a/proto/keepassgo/v1/keepassgo.proto +++ b/proto/keepassgo/v1/keepassgo.proto @@ -15,6 +15,7 @@ service VaultService { rpc ListGroups(ListGroupsRequest) returns (ListGroupsResponse); rpc CreateGroup(CreateGroupRequest) returns (CreateGroupResponse); rpc RenameGroup(RenameGroupRequest) returns (RenameGroupResponse); + rpc DeleteGroup(DeleteGroupRequest) returns (DeleteGroupResponse); rpc UpsertEntry(UpsertEntryRequest) returns (UpsertEntryResponse); rpc DeleteEntry(DeleteEntryRequest) returns (DeleteEntryResponse); rpc RestoreEntry(RestoreEntryRequest) returns (RestoreEntryResponse); @@ -88,6 +89,7 @@ message Entry { string notes = 6; repeated string tags = 7; repeated string path = 8; + map fields = 9; } message ListEntriesResponse { @@ -116,6 +118,12 @@ message RenameGroupRequest { message RenameGroupResponse {} +message DeleteGroupRequest { + repeated string path = 1; +} + +message DeleteGroupResponse {} + message UpsertEntryRequest { Entry entry = 1; } diff --git a/proto/keepassgo/v1/keepassgo_grpc.pb.go b/proto/keepassgo/v1/keepassgo_grpc.pb.go index 2eb4e34..2420a58 100644 --- a/proto/keepassgo/v1/keepassgo_grpc.pb.go +++ b/proto/keepassgo/v1/keepassgo_grpc.pb.go @@ -29,6 +29,7 @@ const ( VaultService_ListGroups_FullMethodName = "/keepassgo.v1.VaultService/ListGroups" VaultService_CreateGroup_FullMethodName = "/keepassgo.v1.VaultService/CreateGroup" VaultService_RenameGroup_FullMethodName = "/keepassgo.v1.VaultService/RenameGroup" + VaultService_DeleteGroup_FullMethodName = "/keepassgo.v1.VaultService/DeleteGroup" VaultService_UpsertEntry_FullMethodName = "/keepassgo.v1.VaultService/UpsertEntry" VaultService_DeleteEntry_FullMethodName = "/keepassgo.v1.VaultService/DeleteEntry" VaultService_RestoreEntry_FullMethodName = "/keepassgo.v1.VaultService/RestoreEntry" @@ -60,6 +61,7 @@ type VaultServiceClient interface { ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*CreateGroupResponse, error) RenameGroup(ctx context.Context, in *RenameGroupRequest, opts ...grpc.CallOption) (*RenameGroupResponse, error) + DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*DeleteGroupResponse, error) UpsertEntry(ctx context.Context, in *UpsertEntryRequest, opts ...grpc.CallOption) (*UpsertEntryResponse, error) DeleteEntry(ctx context.Context, in *DeleteEntryRequest, opts ...grpc.CallOption) (*DeleteEntryResponse, error) RestoreEntry(ctx context.Context, in *RestoreEntryRequest, opts ...grpc.CallOption) (*RestoreEntryResponse, error) @@ -185,6 +187,16 @@ func (c *vaultServiceClient) RenameGroup(ctx context.Context, in *RenameGroupReq return out, nil } +func (c *vaultServiceClient) DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*DeleteGroupResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteGroupResponse) + err := c.cc.Invoke(ctx, VaultService_DeleteGroup_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vaultServiceClient) UpsertEntry(ctx context.Context, in *UpsertEntryRequest, opts ...grpc.CallOption) (*UpsertEntryResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UpsertEntryResponse) @@ -349,6 +361,7 @@ type VaultServiceServer interface { ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) CreateGroup(context.Context, *CreateGroupRequest) (*CreateGroupResponse, error) RenameGroup(context.Context, *RenameGroupRequest) (*RenameGroupResponse, error) + DeleteGroup(context.Context, *DeleteGroupRequest) (*DeleteGroupResponse, error) UpsertEntry(context.Context, *UpsertEntryRequest) (*UpsertEntryResponse, error) DeleteEntry(context.Context, *DeleteEntryRequest) (*DeleteEntryResponse, error) RestoreEntry(context.Context, *RestoreEntryRequest) (*RestoreEntryResponse, error) @@ -404,6 +417,9 @@ func (UnimplementedVaultServiceServer) CreateGroup(context.Context, *CreateGroup func (UnimplementedVaultServiceServer) RenameGroup(context.Context, *RenameGroupRequest) (*RenameGroupResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RenameGroup not implemented") } +func (UnimplementedVaultServiceServer) DeleteGroup(context.Context, *DeleteGroupRequest) (*DeleteGroupResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteGroup not implemented") +} func (UnimplementedVaultServiceServer) UpsertEntry(context.Context, *UpsertEntryRequest) (*UpsertEntryResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpsertEntry not implemented") } @@ -650,6 +666,24 @@ func _VaultService_RenameGroup_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _VaultService_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteGroupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VaultServiceServer).DeleteGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: VaultService_DeleteGroup_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VaultServiceServer).DeleteGroup(ctx, req.(*DeleteGroupRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VaultService_UpsertEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpsertEntryRequest) if err := dec(in); err != nil { @@ -967,6 +1001,10 @@ var VaultService_ServiceDesc = grpc.ServiceDesc{ MethodName: "RenameGroup", Handler: _VaultService_RenameGroup_Handler, }, + { + MethodName: "DeleteGroup", + Handler: _VaultService_DeleteGroup_Handler, + }, { MethodName: "UpsertEntry", Handler: _VaultService_UpsertEntry_Handler, diff --git a/vault/model.go b/vault/model.go index 911d80a..9295bb9 100644 --- a/vault/model.go +++ b/vault/model.go @@ -7,19 +7,20 @@ import ( ) var ErrEntryNotFound = errors.New("entry not found") +var ErrGroupNotEmpty = errors.New("group is not empty") type Entry struct { - ID string - Title string - Username string - Password string - URL string - Notes string - Tags []string - Fields map[string]string + ID string + Title string + Username string + Password string + URL string + Notes string + Tags []string + Fields map[string]string Attachments map[string][]byte - History []Entry - Path []string + History []Entry + Path []string } type SearchResult struct { @@ -323,12 +324,12 @@ func (m *Model) MoveTemplate(id string, path []string) error { func (m *Model) DeleteGroup(path []string) error { for _, entry := range m.Entries { if slices.Equal(entry.Path, path) || hasPathPrefix(entry.Path, path) { - return errors.New("group is not empty") + return ErrGroupNotEmpty } } for _, entry := range m.Templates { if slices.Equal(entry.Path, path) || hasPathPrefix(entry.Path, path) { - return errors.New("group is not empty") + return ErrGroupNotEmpty } }