Avoid overwriting exiting redirect URI and trusted peers when updating the client

Also skip configure the Public field.
This commit is contained in:
Cosmin Cojocar 2018-11-12 21:48:14 +01:00
parent 6536d97812
commit 49fa5ee6e8
2 changed files with 58 additions and 3 deletions

View File

@ -87,12 +87,11 @@ func (d dexAPI) UpdateClient(ctx context.Context, req *api.UpdateClientReq) (*ap
err := d.s.UpdateClient(req.Id, func(old storage.Client) (storage.Client, error) { err := d.s.UpdateClient(req.Id, func(old storage.Client) (storage.Client, error) {
if req.RedirectUris != nil && len(req.RedirectUris) > 0 { if req.RedirectUris != nil && len(req.RedirectUris) > 0 {
old.RedirectURIs = req.RedirectUris old.RedirectURIs = mergeSlice(old.RedirectURIs, req.RedirectUris)
} }
if req.TrustedPeers != nil && len(req.TrustedPeers) > 0 { if req.TrustedPeers != nil && len(req.TrustedPeers) > 0 {
old.TrustedPeers = req.TrustedPeers old.TrustedPeers = mergeSlice(old.TrustedPeers, req.TrustedPeers)
} }
old.Public = req.Public
if req.Name != "" { if req.Name != "" {
old.Name = req.Name old.Name = req.Name
} }
@ -112,6 +111,23 @@ func (d dexAPI) UpdateClient(ctx context.Context, req *api.UpdateClientReq) (*ap
return &api.UpdateClientResp{}, nil return &api.UpdateClientResp{}, nil
} }
func mergeSlice(s1 []string, s2 []string) []string {
isPresent := func(i string, s []string) bool {
for _, j := range s {
if j == i {
return true
}
}
return false
}
for _, i := range s2 {
if !isPresent(i, s1) {
s1 = append(s1, i)
}
}
return s1
}
func (d dexAPI) DeleteClient(ctx context.Context, req *api.DeleteClientReq) (*api.DeleteClientResp, error) { func (d dexAPI) DeleteClient(ctx context.Context, req *api.DeleteClientReq) (*api.DeleteClientResp, error) {
err := d.s.DeleteClient(req.Id) err := d.s.DeleteClient(req.Id)
if err != nil { if err != nil {

View File

@ -461,3 +461,42 @@ func find(item string, items []string) bool {
} }
return false return false
} }
func TestMergeSlice(t *testing.T) {
tests := map[string]struct {
s1 []string
s2 []string
want []string
}{
"merge slice": {
s1: []string{"t1", "t2"},
s2: []string{"t3"},
want: []string{"t1", "t2", "t3"},
},
"merge slice with duplicates": {
s1: []string{"t1", "t2"},
s2: []string{"t3", "t2"},
want: []string{"t1", "t2", "t3"},
},
"merge slice with empty slice": {
s1: []string{"t1", "t2"},
s2: []string{},
want: []string{"t1", "t2"},
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
got := mergeSlice(tc.s1, tc.s2)
if len(got) != len(tc.want) {
t.Errorf("expected equal slice")
}
for _, want := range tc.want {
found := find(want, got)
if !found {
t.Errorf("missing element: %s", want)
}
}
})
}
}