Avoid overwriting exiting redirect URI and trusted peers when updating the client
Also skip configure the Public field.
This commit is contained in:
		@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user