Merge pull request #1275 from ccojocar/client-update-api

Extend the API with a function which updates the client configuration
This commit is contained in:
Stephan Renatus 2018-11-27 11:47:16 +01:00 committed by GitHub
commit f3acec0b1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 390 additions and 68 deletions

View File

@ -13,6 +13,8 @@ It has these top-level messages:
CreateClientResp CreateClientResp
DeleteClientReq DeleteClientReq
DeleteClientResp DeleteClientResp
UpdateClientReq
UpdateClientResp
Password Password
CreatePasswordReq CreatePasswordReq
CreatePasswordResp CreatePasswordResp
@ -194,6 +196,72 @@ func (m *DeleteClientResp) GetNotFound() bool {
return false return false
} }
// UpdateClientReq is a request to update an exisitng client.
type UpdateClientReq struct {
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
RedirectUris []string `protobuf:"bytes,2,rep,name=redirect_uris,json=redirectUris" json:"redirect_uris,omitempty"`
TrustedPeers []string `protobuf:"bytes,3,rep,name=trusted_peers,json=trustedPeers" json:"trusted_peers,omitempty"`
Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
LogoUrl string `protobuf:"bytes,5,opt,name=logo_url,json=logoUrl" json:"logo_url,omitempty"`
}
func (m *UpdateClientReq) Reset() { *m = UpdateClientReq{} }
func (m *UpdateClientReq) String() string { return proto.CompactTextString(m) }
func (*UpdateClientReq) ProtoMessage() {}
func (*UpdateClientReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *UpdateClientReq) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *UpdateClientReq) GetRedirectUris() []string {
if m != nil {
return m.RedirectUris
}
return nil
}
func (m *UpdateClientReq) GetTrustedPeers() []string {
if m != nil {
return m.TrustedPeers
}
return nil
}
func (m *UpdateClientReq) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *UpdateClientReq) GetLogoUrl() string {
if m != nil {
return m.LogoUrl
}
return ""
}
// UpdateClientResp returns the reponse form updating a client.
type UpdateClientResp struct {
NotFound bool `protobuf:"varint,1,opt,name=not_found,json=notFound" json:"not_found,omitempty"`
}
func (m *UpdateClientResp) Reset() { *m = UpdateClientResp{} }
func (m *UpdateClientResp) String() string { return proto.CompactTextString(m) }
func (*UpdateClientResp) ProtoMessage() {}
func (*UpdateClientResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (m *UpdateClientResp) GetNotFound() bool {
if m != nil {
return m.NotFound
}
return false
}
// Password is an email for password mapping managed by the storage. // Password is an email for password mapping managed by the storage.
type Password struct { type Password struct {
Email string `protobuf:"bytes,1,opt,name=email" json:"email,omitempty"` Email string `protobuf:"bytes,1,opt,name=email" json:"email,omitempty"`
@ -206,7 +274,7 @@ type Password struct {
func (m *Password) Reset() { *m = Password{} } func (m *Password) Reset() { *m = Password{} }
func (m *Password) String() string { return proto.CompactTextString(m) } func (m *Password) String() string { return proto.CompactTextString(m) }
func (*Password) ProtoMessage() {} func (*Password) ProtoMessage() {}
func (*Password) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } func (*Password) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (m *Password) GetEmail() string { func (m *Password) GetEmail() string {
if m != nil { if m != nil {
@ -244,7 +312,7 @@ type CreatePasswordReq struct {
func (m *CreatePasswordReq) Reset() { *m = CreatePasswordReq{} } func (m *CreatePasswordReq) Reset() { *m = CreatePasswordReq{} }
func (m *CreatePasswordReq) String() string { return proto.CompactTextString(m) } func (m *CreatePasswordReq) String() string { return proto.CompactTextString(m) }
func (*CreatePasswordReq) ProtoMessage() {} func (*CreatePasswordReq) ProtoMessage() {}
func (*CreatePasswordReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } func (*CreatePasswordReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (m *CreatePasswordReq) GetPassword() *Password { func (m *CreatePasswordReq) GetPassword() *Password {
if m != nil { if m != nil {
@ -261,7 +329,7 @@ type CreatePasswordResp struct {
func (m *CreatePasswordResp) Reset() { *m = CreatePasswordResp{} } func (m *CreatePasswordResp) Reset() { *m = CreatePasswordResp{} }
func (m *CreatePasswordResp) String() string { return proto.CompactTextString(m) } func (m *CreatePasswordResp) String() string { return proto.CompactTextString(m) }
func (*CreatePasswordResp) ProtoMessage() {} func (*CreatePasswordResp) ProtoMessage() {}
func (*CreatePasswordResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } func (*CreatePasswordResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (m *CreatePasswordResp) GetAlreadyExists() bool { func (m *CreatePasswordResp) GetAlreadyExists() bool {
if m != nil { if m != nil {
@ -281,7 +349,7 @@ type UpdatePasswordReq struct {
func (m *UpdatePasswordReq) Reset() { *m = UpdatePasswordReq{} } func (m *UpdatePasswordReq) Reset() { *m = UpdatePasswordReq{} }
func (m *UpdatePasswordReq) String() string { return proto.CompactTextString(m) } func (m *UpdatePasswordReq) String() string { return proto.CompactTextString(m) }
func (*UpdatePasswordReq) ProtoMessage() {} func (*UpdatePasswordReq) ProtoMessage() {}
func (*UpdatePasswordReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } func (*UpdatePasswordReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (m *UpdatePasswordReq) GetEmail() string { func (m *UpdatePasswordReq) GetEmail() string {
if m != nil { if m != nil {
@ -312,7 +380,7 @@ type UpdatePasswordResp struct {
func (m *UpdatePasswordResp) Reset() { *m = UpdatePasswordResp{} } func (m *UpdatePasswordResp) Reset() { *m = UpdatePasswordResp{} }
func (m *UpdatePasswordResp) String() string { return proto.CompactTextString(m) } func (m *UpdatePasswordResp) String() string { return proto.CompactTextString(m) }
func (*UpdatePasswordResp) ProtoMessage() {} func (*UpdatePasswordResp) ProtoMessage() {}
func (*UpdatePasswordResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } func (*UpdatePasswordResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (m *UpdatePasswordResp) GetNotFound() bool { func (m *UpdatePasswordResp) GetNotFound() bool {
if m != nil { if m != nil {
@ -329,7 +397,7 @@ type DeletePasswordReq struct {
func (m *DeletePasswordReq) Reset() { *m = DeletePasswordReq{} } func (m *DeletePasswordReq) Reset() { *m = DeletePasswordReq{} }
func (m *DeletePasswordReq) String() string { return proto.CompactTextString(m) } func (m *DeletePasswordReq) String() string { return proto.CompactTextString(m) }
func (*DeletePasswordReq) ProtoMessage() {} func (*DeletePasswordReq) ProtoMessage() {}
func (*DeletePasswordReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } func (*DeletePasswordReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (m *DeletePasswordReq) GetEmail() string { func (m *DeletePasswordReq) GetEmail() string {
if m != nil { if m != nil {
@ -346,7 +414,7 @@ type DeletePasswordResp struct {
func (m *DeletePasswordResp) Reset() { *m = DeletePasswordResp{} } func (m *DeletePasswordResp) Reset() { *m = DeletePasswordResp{} }
func (m *DeletePasswordResp) String() string { return proto.CompactTextString(m) } func (m *DeletePasswordResp) String() string { return proto.CompactTextString(m) }
func (*DeletePasswordResp) ProtoMessage() {} func (*DeletePasswordResp) ProtoMessage() {}
func (*DeletePasswordResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } func (*DeletePasswordResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (m *DeletePasswordResp) GetNotFound() bool { func (m *DeletePasswordResp) GetNotFound() bool {
if m != nil { if m != nil {
@ -362,7 +430,7 @@ type ListPasswordReq struct {
func (m *ListPasswordReq) Reset() { *m = ListPasswordReq{} } func (m *ListPasswordReq) Reset() { *m = ListPasswordReq{} }
func (m *ListPasswordReq) String() string { return proto.CompactTextString(m) } func (m *ListPasswordReq) String() string { return proto.CompactTextString(m) }
func (*ListPasswordReq) ProtoMessage() {} func (*ListPasswordReq) ProtoMessage() {}
func (*ListPasswordReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } func (*ListPasswordReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
// ListPasswordResp returns a list of passwords. // ListPasswordResp returns a list of passwords.
type ListPasswordResp struct { type ListPasswordResp struct {
@ -372,7 +440,7 @@ type ListPasswordResp struct {
func (m *ListPasswordResp) Reset() { *m = ListPasswordResp{} } func (m *ListPasswordResp) Reset() { *m = ListPasswordResp{} }
func (m *ListPasswordResp) String() string { return proto.CompactTextString(m) } func (m *ListPasswordResp) String() string { return proto.CompactTextString(m) }
func (*ListPasswordResp) ProtoMessage() {} func (*ListPasswordResp) ProtoMessage() {}
func (*ListPasswordResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } func (*ListPasswordResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *ListPasswordResp) GetPasswords() []*Password { func (m *ListPasswordResp) GetPasswords() []*Password {
if m != nil { if m != nil {
@ -388,7 +456,7 @@ type VersionReq struct {
func (m *VersionReq) Reset() { *m = VersionReq{} } func (m *VersionReq) Reset() { *m = VersionReq{} }
func (m *VersionReq) String() string { return proto.CompactTextString(m) } func (m *VersionReq) String() string { return proto.CompactTextString(m) }
func (*VersionReq) ProtoMessage() {} func (*VersionReq) ProtoMessage() {}
func (*VersionReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } func (*VersionReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
// VersionResp holds the version info of components. // VersionResp holds the version info of components.
type VersionResp struct { type VersionResp struct {
@ -402,7 +470,7 @@ type VersionResp struct {
func (m *VersionResp) Reset() { *m = VersionResp{} } func (m *VersionResp) Reset() { *m = VersionResp{} }
func (m *VersionResp) String() string { return proto.CompactTextString(m) } func (m *VersionResp) String() string { return proto.CompactTextString(m) }
func (*VersionResp) ProtoMessage() {} func (*VersionResp) ProtoMessage() {}
func (*VersionResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } func (*VersionResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *VersionResp) GetServer() string { func (m *VersionResp) GetServer() string {
if m != nil { if m != nil {
@ -430,7 +498,7 @@ type RefreshTokenRef struct {
func (m *RefreshTokenRef) Reset() { *m = RefreshTokenRef{} } func (m *RefreshTokenRef) Reset() { *m = RefreshTokenRef{} }
func (m *RefreshTokenRef) String() string { return proto.CompactTextString(m) } func (m *RefreshTokenRef) String() string { return proto.CompactTextString(m) }
func (*RefreshTokenRef) ProtoMessage() {} func (*RefreshTokenRef) ProtoMessage() {}
func (*RefreshTokenRef) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } func (*RefreshTokenRef) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *RefreshTokenRef) GetId() string { func (m *RefreshTokenRef) GetId() string {
if m != nil { if m != nil {
@ -469,7 +537,7 @@ type ListRefreshReq struct {
func (m *ListRefreshReq) Reset() { *m = ListRefreshReq{} } func (m *ListRefreshReq) Reset() { *m = ListRefreshReq{} }
func (m *ListRefreshReq) String() string { return proto.CompactTextString(m) } func (m *ListRefreshReq) String() string { return proto.CompactTextString(m) }
func (*ListRefreshReq) ProtoMessage() {} func (*ListRefreshReq) ProtoMessage() {}
func (*ListRefreshReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } func (*ListRefreshReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *ListRefreshReq) GetUserId() string { func (m *ListRefreshReq) GetUserId() string {
if m != nil { if m != nil {
@ -486,7 +554,7 @@ type ListRefreshResp struct {
func (m *ListRefreshResp) Reset() { *m = ListRefreshResp{} } func (m *ListRefreshResp) Reset() { *m = ListRefreshResp{} }
func (m *ListRefreshResp) String() string { return proto.CompactTextString(m) } func (m *ListRefreshResp) String() string { return proto.CompactTextString(m) }
func (*ListRefreshResp) ProtoMessage() {} func (*ListRefreshResp) ProtoMessage() {}
func (*ListRefreshResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } func (*ListRefreshResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (m *ListRefreshResp) GetRefreshTokens() []*RefreshTokenRef { func (m *ListRefreshResp) GetRefreshTokens() []*RefreshTokenRef {
if m != nil { if m != nil {
@ -505,7 +573,7 @@ type RevokeRefreshReq struct {
func (m *RevokeRefreshReq) Reset() { *m = RevokeRefreshReq{} } func (m *RevokeRefreshReq) Reset() { *m = RevokeRefreshReq{} }
func (m *RevokeRefreshReq) String() string { return proto.CompactTextString(m) } func (m *RevokeRefreshReq) String() string { return proto.CompactTextString(m) }
func (*RevokeRefreshReq) ProtoMessage() {} func (*RevokeRefreshReq) ProtoMessage() {}
func (*RevokeRefreshReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } func (*RevokeRefreshReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (m *RevokeRefreshReq) GetUserId() string { func (m *RevokeRefreshReq) GetUserId() string {
if m != nil { if m != nil {
@ -530,7 +598,7 @@ type RevokeRefreshResp struct {
func (m *RevokeRefreshResp) Reset() { *m = RevokeRefreshResp{} } func (m *RevokeRefreshResp) Reset() { *m = RevokeRefreshResp{} }
func (m *RevokeRefreshResp) String() string { return proto.CompactTextString(m) } func (m *RevokeRefreshResp) String() string { return proto.CompactTextString(m) }
func (*RevokeRefreshResp) ProtoMessage() {} func (*RevokeRefreshResp) ProtoMessage() {}
func (*RevokeRefreshResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } func (*RevokeRefreshResp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (m *RevokeRefreshResp) GetNotFound() bool { func (m *RevokeRefreshResp) GetNotFound() bool {
if m != nil { if m != nil {
@ -545,6 +613,8 @@ func init() {
proto.RegisterType((*CreateClientResp)(nil), "api.CreateClientResp") proto.RegisterType((*CreateClientResp)(nil), "api.CreateClientResp")
proto.RegisterType((*DeleteClientReq)(nil), "api.DeleteClientReq") proto.RegisterType((*DeleteClientReq)(nil), "api.DeleteClientReq")
proto.RegisterType((*DeleteClientResp)(nil), "api.DeleteClientResp") proto.RegisterType((*DeleteClientResp)(nil), "api.DeleteClientResp")
proto.RegisterType((*UpdateClientReq)(nil), "api.UpdateClientReq")
proto.RegisterType((*UpdateClientResp)(nil), "api.UpdateClientResp")
proto.RegisterType((*Password)(nil), "api.Password") proto.RegisterType((*Password)(nil), "api.Password")
proto.RegisterType((*CreatePasswordReq)(nil), "api.CreatePasswordReq") proto.RegisterType((*CreatePasswordReq)(nil), "api.CreatePasswordReq")
proto.RegisterType((*CreatePasswordResp)(nil), "api.CreatePasswordResp") proto.RegisterType((*CreatePasswordResp)(nil), "api.CreatePasswordResp")
@ -576,6 +646,8 @@ const _ = grpc.SupportPackageIsVersion4
type DexClient interface { type DexClient interface {
// CreateClient creates a client. // CreateClient creates a client.
CreateClient(ctx context.Context, in *CreateClientReq, opts ...grpc.CallOption) (*CreateClientResp, error) CreateClient(ctx context.Context, in *CreateClientReq, opts ...grpc.CallOption) (*CreateClientResp, error)
// UpdateClient updates an existing client
UpdateClient(ctx context.Context, in *UpdateClientReq, opts ...grpc.CallOption) (*UpdateClientResp, error)
// DeleteClient deletes the provided client. // DeleteClient deletes the provided client.
DeleteClient(ctx context.Context, in *DeleteClientReq, opts ...grpc.CallOption) (*DeleteClientResp, error) DeleteClient(ctx context.Context, in *DeleteClientReq, opts ...grpc.CallOption) (*DeleteClientResp, error)
// CreatePassword creates a password. // CreatePassword creates a password.
@ -613,6 +685,15 @@ func (c *dexClient) CreateClient(ctx context.Context, in *CreateClientReq, opts
return out, nil return out, nil
} }
func (c *dexClient) UpdateClient(ctx context.Context, in *UpdateClientReq, opts ...grpc.CallOption) (*UpdateClientResp, error) {
out := new(UpdateClientResp)
err := grpc.Invoke(ctx, "/api.Dex/UpdateClient", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *dexClient) DeleteClient(ctx context.Context, in *DeleteClientReq, opts ...grpc.CallOption) (*DeleteClientResp, error) { func (c *dexClient) DeleteClient(ctx context.Context, in *DeleteClientReq, opts ...grpc.CallOption) (*DeleteClientResp, error) {
out := new(DeleteClientResp) out := new(DeleteClientResp)
err := grpc.Invoke(ctx, "/api.Dex/DeleteClient", in, out, c.cc, opts...) err := grpc.Invoke(ctx, "/api.Dex/DeleteClient", in, out, c.cc, opts...)
@ -690,6 +771,8 @@ func (c *dexClient) RevokeRefresh(ctx context.Context, in *RevokeRefreshReq, opt
type DexServer interface { type DexServer interface {
// CreateClient creates a client. // CreateClient creates a client.
CreateClient(context.Context, *CreateClientReq) (*CreateClientResp, error) CreateClient(context.Context, *CreateClientReq) (*CreateClientResp, error)
// UpdateClient updates an existing client
UpdateClient(context.Context, *UpdateClientReq) (*UpdateClientResp, error)
// DeleteClient deletes the provided client. // DeleteClient deletes the provided client.
DeleteClient(context.Context, *DeleteClientReq) (*DeleteClientResp, error) DeleteClient(context.Context, *DeleteClientReq) (*DeleteClientResp, error)
// CreatePassword creates a password. // CreatePassword creates a password.
@ -732,6 +815,24 @@ func _Dex_CreateClient_Handler(srv interface{}, ctx context.Context, dec func(in
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Dex_UpdateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateClientReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(DexServer).UpdateClient(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.Dex/UpdateClient",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(DexServer).UpdateClient(ctx, req.(*UpdateClientReq))
}
return interceptor(ctx, in, info, handler)
}
func _Dex_DeleteClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _Dex_DeleteClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DeleteClientReq) in := new(DeleteClientReq)
if err := dec(in); err != nil { if err := dec(in); err != nil {
@ -884,6 +985,10 @@ var _Dex_serviceDesc = grpc.ServiceDesc{
MethodName: "CreateClient", MethodName: "CreateClient",
Handler: _Dex_CreateClient_Handler, Handler: _Dex_CreateClient_Handler,
}, },
{
MethodName: "UpdateClient",
Handler: _Dex_UpdateClient_Handler,
},
{ {
MethodName: "DeleteClient", MethodName: "DeleteClient",
Handler: _Dex_DeleteClient_Handler, Handler: _Dex_DeleteClient_Handler,
@ -924,56 +1029,58 @@ var _Dex_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("api/api.proto", fileDescriptor0) } func init() { proto.RegisterFile("api/api.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 801 bytes of a gzipped FileDescriptorProto // 848 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0x6d, 0x4f, 0xe3, 0x46, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0xdb, 0x4e, 0xf3, 0x46,
0x10, 0x4e, 0xe2, 0x90, 0x38, 0x93, 0xf7, 0x6d, 0x00, 0x13, 0x54, 0x09, 0x16, 0x55, 0x02, 0x55, 0x10, 0x4e, 0x62, 0x92, 0x38, 0x93, 0xf3, 0x36, 0x3f, 0x84, 0xa0, 0x4a, 0xb0, 0xa8, 0x12, 0xa8,
0x0a, 0x85, 0x4a, 0xad, 0x54, 0x54, 0xfa, 0x02, 0x6d, 0x41, 0xaa, 0x2a, 0x64, 0x35, 0xfd, 0x58, 0x52, 0x28, 0x54, 0x6a, 0xa5, 0xa2, 0xd2, 0x03, 0xb4, 0x05, 0xa9, 0xaa, 0x90, 0xd5, 0xf4, 0xb2,
0xcb, 0xc4, 0x03, 0xac, 0x30, 0xb6, 0xbb, 0xbb, 0x21, 0xf4, 0xfe, 0xdd, 0xe9, 0xfe, 0xd8, 0x69, 0x96, 0x89, 0x07, 0x58, 0x61, 0x6c, 0x77, 0x77, 0x43, 0x68, 0x2f, 0xfb, 0x18, 0x7d, 0x9b, 0xbe,
0xd7, 0x9b, 0x60, 0x3b, 0xb9, 0x0b, 0xdf, 0x3c, 0xcf, 0xce, 0x3c, 0xb3, 0xf3, 0xec, 0xcc, 0xc8, 0xd9, 0xaf, 0x5d, 0x6f, 0x82, 0x0f, 0x81, 0x70, 0xe7, 0xf9, 0x76, 0xe6, 0x9b, 0xf3, 0xc8, 0xd0,
0xd0, 0xf6, 0x13, 0x76, 0xec, 0x27, 0x6c, 0x94, 0xf0, 0x58, 0xc6, 0xc4, 0xf2, 0x13, 0x46, 0xdf, 0xf6, 0x62, 0x76, 0xe4, 0xc5, 0x6c, 0x1c, 0xf3, 0x48, 0x46, 0xc4, 0xf2, 0x62, 0x46, 0xff, 0x2f,
0x97, 0xa1, 0x76, 0x11, 0x32, 0x8c, 0x24, 0xe9, 0x40, 0x85, 0x05, 0x4e, 0x79, 0xaf, 0x7c, 0xd8, 0x43, 0xed, 0x3c, 0x60, 0x18, 0x4a, 0xd2, 0x81, 0x0a, 0xf3, 0x87, 0xe5, 0xdd, 0xf2, 0x41, 0xc3,
0x70, 0x2b, 0x2c, 0x20, 0x5b, 0x50, 0x13, 0x38, 0xe1, 0x28, 0x9d, 0x8a, 0xc6, 0x8c, 0x45, 0x0e, 0xa9, 0x30, 0x9f, 0x6c, 0x42, 0x4d, 0xe0, 0x94, 0xa3, 0x1c, 0x56, 0x34, 0x66, 0x24, 0xb2, 0x0f,
0xa0, 0xcd, 0x31, 0x60, 0x1c, 0x27, 0xd2, 0x9b, 0x72, 0x26, 0x1c, 0x6b, 0xcf, 0x3a, 0x6c, 0xb8, 0x6d, 0x8e, 0x3e, 0xe3, 0x38, 0x95, 0xee, 0x8c, 0x33, 0x31, 0xb4, 0x76, 0xad, 0x83, 0x86, 0xd3,
0xad, 0x39, 0x38, 0xe6, 0x4c, 0x28, 0x27, 0xc9, 0xa7, 0x42, 0x62, 0xe0, 0x25, 0x88, 0x5c, 0x38, 0x5a, 0x80, 0x13, 0xce, 0x84, 0x52, 0x92, 0x7c, 0x26, 0x24, 0xfa, 0x6e, 0x8c, 0xc8, 0xc5, 0x70,
0xd5, 0xd4, 0xc9, 0x80, 0x37, 0x0a, 0x53, 0x19, 0x92, 0xe9, 0x6d, 0xc8, 0x26, 0xce, 0xc6, 0x5e, 0x23, 0x51, 0x32, 0xe0, 0xb5, 0xc2, 0x94, 0x87, 0x78, 0x76, 0x13, 0xb0, 0xe9, 0xb0, 0xba, 0x5b,
0xf9, 0xd0, 0x76, 0x8d, 0x45, 0x08, 0x54, 0x23, 0xff, 0x09, 0x9d, 0x9a, 0xce, 0xab, 0xbf, 0xc9, 0x3e, 0xb0, 0x1d, 0x23, 0x11, 0x02, 0x1b, 0xa1, 0xf7, 0x88, 0xc3, 0x9a, 0xf6, 0xab, 0xbf, 0xc9,
0x0e, 0xd8, 0x61, 0x7c, 0x1f, 0x7b, 0x53, 0x1e, 0x3a, 0x75, 0x8d, 0xd7, 0x95, 0x3d, 0xe6, 0x21, 0x36, 0xd8, 0x41, 0x74, 0x17, 0xb9, 0x33, 0x1e, 0x0c, 0xeb, 0x1a, 0xaf, 0x2b, 0x79, 0xc2, 0x03,
0xfd, 0x0e, 0xba, 0x17, 0x1c, 0x7d, 0x89, 0x69, 0x21, 0x2e, 0xfe, 0x47, 0x0e, 0xa0, 0x36, 0xd1, 0xfa, 0x15, 0x74, 0xcf, 0x39, 0x7a, 0x12, 0x93, 0x44, 0x1c, 0xfc, 0x8b, 0xec, 0x43, 0x6d, 0xaa,
0x86, 0xae, 0xa7, 0x79, 0xda, 0x1c, 0xa9, 0xba, 0xcd, 0xb9, 0x39, 0xa2, 0xff, 0x42, 0x2f, 0x1f, 0x05, 0x9d, 0x4f, 0xf3, 0xa4, 0x39, 0x56, 0x79, 0x9b, 0x77, 0xf3, 0x44, 0xff, 0x84, 0x5e, 0xd6,
0x27, 0x12, 0xf2, 0x15, 0x74, 0xfc, 0x90, 0xa3, 0x1f, 0xfc, 0xef, 0xe1, 0x0b, 0x13, 0x52, 0x68, 0x4e, 0xc4, 0xe4, 0x33, 0xe8, 0x78, 0x01, 0x47, 0xcf, 0xff, 0xdb, 0xc5, 0x67, 0x26, 0xa4, 0xd0,
0x02, 0xdb, 0x6d, 0x1b, 0xf4, 0x37, 0x0d, 0x66, 0xf8, 0x2b, 0x9f, 0xe6, 0xdf, 0x87, 0xee, 0x25, 0x04, 0xb6, 0xd3, 0x36, 0xe8, 0x4f, 0x1a, 0x4c, 0xf1, 0x57, 0x5e, 0xe7, 0xdf, 0x83, 0xee, 0x05,
0x86, 0x98, 0xbd, 0x57, 0x41, 0x63, 0x7a, 0x0c, 0xbd, 0xbc, 0x8b, 0x48, 0xc8, 0x2e, 0x34, 0xa2, 0x06, 0x98, 0x8e, 0x2b, 0x57, 0x63, 0x7a, 0x04, 0xbd, 0xac, 0x8a, 0x88, 0xc9, 0x0e, 0x34, 0xc2,
0x58, 0x7a, 0x77, 0xf1, 0x34, 0x0a, 0x4c, 0x76, 0x3b, 0x8a, 0xe5, 0xef, 0xca, 0xa6, 0x0c, 0xec, 0x48, 0xba, 0xb7, 0xd1, 0x2c, 0xf4, 0x8d, 0x77, 0x3b, 0x8c, 0xe4, 0xcf, 0x4a, 0xa6, 0xff, 0x95,
0x1b, 0x5f, 0x88, 0x59, 0xcc, 0x03, 0x32, 0x80, 0x0d, 0x7c, 0xf2, 0x59, 0x68, 0xf8, 0x52, 0x43, 0xa1, 0x3b, 0x89, 0x7d, 0xef, 0x0d, 0xd2, 0x62, 0x83, 0x2a, 0xef, 0x69, 0x90, 0xb5, 0xa2, 0x41,
0x89, 0xf7, 0xe0, 0x8b, 0x07, 0x7d, 0xb1, 0x96, 0xab, 0xbf, 0xc9, 0x10, 0xec, 0xa9, 0x40, 0xae, 0x8b, 0x46, 0x6c, 0xbc, 0xd2, 0x88, 0x6a, 0xb6, 0x11, 0x47, 0xd0, 0xcb, 0xc6, 0xb6, 0x2e, 0x1b,
0x45, 0xb5, 0xb4, 0xf3, 0xc2, 0x26, 0xdb, 0x50, 0x57, 0xdf, 0x1e, 0x0b, 0x9c, 0x6a, 0xfa, 0xce, 0x06, 0xf6, 0xb5, 0x27, 0xc4, 0x3c, 0xe2, 0x3e, 0x19, 0x40, 0x15, 0x1f, 0x3d, 0x16, 0x98, 0x44,
0xca, 0xbc, 0x0e, 0xe8, 0x39, 0xf4, 0x53, 0x79, 0xe6, 0x09, 0x55, 0x01, 0x47, 0x60, 0x27, 0xc6, 0x12, 0x41, 0x45, 0x70, 0xef, 0x89, 0x7b, 0x5d, 0xe6, 0x96, 0xa3, 0xbf, 0xc9, 0x08, 0xec, 0x99,
0x34, 0xd2, 0xb6, 0x75, 0xe9, 0x0b, 0x9f, 0xc5, 0x31, 0x3d, 0x03, 0x52, 0x8c, 0x7f, 0xb3, 0xc0, 0x40, 0xae, 0x23, 0xb3, 0xb4, 0xf2, 0x52, 0x26, 0x5b, 0x50, 0x57, 0xdf, 0x2e, 0xf3, 0x4d, 0xd0,
0xf4, 0x1e, 0xfa, 0xe3, 0x24, 0x28, 0x24, 0x5f, 0x5d, 0xf0, 0x0e, 0xd8, 0x11, 0xce, 0xbc, 0x4c, 0x35, 0x25, 0x5e, 0xf9, 0xf4, 0x0c, 0xfa, 0x49, 0xb3, 0x17, 0x0e, 0x55, 0xe5, 0x0e, 0xc1, 0x8e,
0xd1, 0xf5, 0x08, 0x67, 0x57, 0xaa, 0xee, 0x7d, 0x68, 0xa9, 0xa3, 0x42, 0xed, 0xcd, 0x08, 0x67, 0x8d, 0x68, 0x06, 0xa5, 0xad, 0x1b, 0xb9, 0xd4, 0x59, 0x3e, 0xd3, 0x53, 0x20, 0x79, 0xfb, 0x77,
0x63, 0x03, 0xd1, 0x13, 0x20, 0xc5, 0x44, 0xeb, 0xde, 0xe0, 0x08, 0xfa, 0xe9, 0xa3, 0xad, 0xbd, 0x8f, 0x0b, 0xbd, 0x83, 0x7e, 0x52, 0x98, 0xb4, 0xf3, 0xd5, 0x09, 0x6f, 0x83, 0x1d, 0xe2, 0xdc,
0x9b, 0x62, 0x2f, 0xba, 0xae, 0x63, 0xef, 0x43, 0xf7, 0x4f, 0x26, 0x64, 0x86, 0x9b, 0xfe, 0x04, 0x4d, 0x25, 0x5d, 0x0f, 0x71, 0x7e, 0xa9, 0xf2, 0xde, 0x83, 0x96, 0x7a, 0xca, 0xe5, 0xde, 0x0c,
0xbd, 0x3c, 0x24, 0x12, 0xf2, 0x35, 0x34, 0xe6, 0x4a, 0x2b, 0x09, 0xad, 0xe5, 0x97, 0x78, 0x3d, 0x71, 0x3e, 0x31, 0x10, 0x3d, 0x06, 0x92, 0x77, 0xb4, 0xae, 0x07, 0x87, 0xd0, 0x4f, 0x46, 0x70,
0xa7, 0x2d, 0x80, 0x7f, 0x90, 0x0b, 0x16, 0x47, 0x8a, 0xee, 0x7b, 0x68, 0x2e, 0x2c, 0x91, 0xa4, 0x6d, 0x6c, 0x8a, 0x3d, 0xaf, 0xba, 0x8e, 0xbd, 0x0f, 0xdd, 0x5f, 0x99, 0x90, 0x29, 0x6e, 0xfa,
0x73, 0xce, 0x9f, 0x91, 0x9b, 0xab, 0x1b, 0x8b, 0xf4, 0x40, 0x6d, 0x08, 0x2d, 0xe9, 0x86, 0xab, 0x1d, 0xf4, 0xb2, 0x90, 0x88, 0xc9, 0xe7, 0xd0, 0x58, 0x54, 0x5a, 0x95, 0xd0, 0x2a, 0x76, 0xe2,
0x97, 0xc5, 0x3b, 0xe8, 0xba, 0x78, 0xc7, 0x51, 0x3c, 0xfc, 0x1d, 0x3f, 0x62, 0xe4, 0xe2, 0xdd, 0xe5, 0x9d, 0xb6, 0x00, 0xfe, 0x40, 0x2e, 0x58, 0x14, 0x2a, 0xba, 0xaf, 0xa1, 0xb9, 0x94, 0x44,
0xd2, 0xd2, 0xd8, 0x85, 0x46, 0xda, 0xfd, 0xaa, 0x9f, 0xd2, 0xbd, 0x61, 0xa7, 0xc0, 0x75, 0x40, 0x9c, 0x5c, 0x2d, 0xfe, 0x84, 0xdc, 0x84, 0x6e, 0x24, 0xd2, 0x03, 0x75, 0xef, 0x74, 0x49, 0xab,
0xbe, 0x04, 0x98, 0xe8, 0x8e, 0x08, 0x3c, 0x5f, 0xea, 0x99, 0xb7, 0xdc, 0x86, 0x41, 0x7e, 0x91, 0x8e, 0x3e, 0x7d, 0xff, 0x40, 0xd7, 0xc1, 0x5b, 0x8e, 0xe2, 0xfe, 0xf7, 0xe8, 0x01, 0x43, 0x07,
0x2a, 0x36, 0xf4, 0x85, 0x54, 0xcf, 0x15, 0xe8, 0xd9, 0xb7, 0x5c, 0x5b, 0x01, 0x63, 0x81, 0x4a, 0x6f, 0x0b, 0x9b, 0xb4, 0x03, 0x8d, 0x64, 0x97, 0xd5, 0x3c, 0x25, 0x57, 0xd0, 0x4e, 0x80, 0x2b,
0xf4, 0x8e, 0xd2, 0xc0, 0xe4, 0x57, 0x8a, 0x67, 0x1a, 0xb7, 0x9c, 0x6b, 0xdc, 0xbf, 0x52, 0x05, 0x9f, 0x7c, 0x0a, 0x30, 0xd5, 0x13, 0xe1, 0xbb, 0x9e, 0xd4, 0xab, 0x60, 0x39, 0x0d, 0x83, 0xfc,
0x17, 0xae, 0x22, 0x21, 0x67, 0xd0, 0xe1, 0xa9, 0xe9, 0x49, 0x75, 0xf5, 0xb9, 0x64, 0x03, 0x2d, 0x20, 0x95, 0x6d, 0xe0, 0x09, 0xa9, 0xda, 0xe5, 0xeb, 0x4b, 0x66, 0x39, 0xb6, 0x02, 0x26, 0x02,
0x59, 0xa1, 0x28, 0xb7, 0xcd, 0x33, 0x80, 0xa0, 0x57, 0xd0, 0x73, 0xf1, 0x39, 0x7e, 0xc4, 0x37, 0x55, 0xd1, 0x3b, 0xaa, 0x06, 0xc6, 0xbf, 0xaa, 0x78, 0x6a, 0x70, 0xcb, 0x99, 0xc1, 0xfd, 0x2d,
0x24, 0xff, 0xac, 0x00, 0xf4, 0x1b, 0xe8, 0x17, 0x98, 0xd6, 0x74, 0xc3, 0xe9, 0x87, 0x2a, 0x58, 0xa9, 0xe0, 0x52, 0x55, 0xc4, 0xe4, 0x14, 0x3a, 0x3c, 0x11, 0x5d, 0xa9, 0x42, 0x5f, 0x94, 0x6c,
0x97, 0xf8, 0x42, 0x7e, 0x84, 0x56, 0x76, 0x57, 0x91, 0xf4, 0xe2, 0x85, 0xb5, 0x37, 0xdc, 0x5c, 0xa0, 0x4b, 0x96, 0x4b, 0xca, 0x69, 0xf3, 0x14, 0x20, 0xe8, 0x25, 0xf4, 0x1c, 0x7c, 0x8a, 0x1e,
0x81, 0x8a, 0x84, 0x96, 0x54, 0x78, 0x76, 0xcf, 0x98, 0xf0, 0xc2, 0x76, 0x32, 0xe1, 0xc5, 0x85, 0xf0, 0x1d, 0xce, 0xdf, 0x2c, 0x00, 0xfd, 0x02, 0xfa, 0x39, 0xa6, 0x35, 0xd3, 0x70, 0xf2, 0x6f,
0x44, 0x4b, 0xe4, 0x02, 0x3a, 0xf9, 0x51, 0x26, 0x5b, 0x99, 0x4c, 0x99, 0x56, 0x1d, 0x6e, 0xaf, 0x15, 0xac, 0x0b, 0x7c, 0x26, 0xdf, 0x42, 0x2b, 0x7d, 0x79, 0x49, 0x12, 0x78, 0xee, 0x88, 0x8f,
0xc4, 0xe7, 0x24, 0xf9, 0x49, 0x33, 0x24, 0x4b, 0x73, 0x6e, 0x48, 0x96, 0xc7, 0x32, 0x25, 0xc9, 0x3e, 0xac, 0x40, 0x45, 0x4c, 0x4b, 0xca, 0x3c, 0x7d, 0x67, 0x8c, 0x79, 0xee, 0x2c, 0x1a, 0xf3,
0x0f, 0x94, 0x21, 0x59, 0x1a, 0x48, 0x43, 0xb2, 0x3c, 0x7d, 0xb4, 0x44, 0xce, 0xa1, 0x9d, 0x9d, 0xfc, 0x41, 0x4a, 0xcc, 0xd3, 0x47, 0xd7, 0x98, 0xe7, 0x4e, 0xb5, 0x31, 0xcf, 0x5f, 0x67, 0x5a,
0x27, 0x61, 0xe4, 0x28, 0x8c, 0x9d, 0x91, 0xa3, 0x38, 0x79, 0xb4, 0x44, 0x4e, 0x00, 0xfe, 0x40, 0x22, 0xe7, 0xd0, 0xc9, 0x5e, 0x02, 0xb2, 0x99, 0x0a, 0x34, 0x35, 0xe9, 0xa3, 0xad, 0x95, 0xf8,
0x69, 0x66, 0x88, 0x74, 0xb5, 0xdb, 0xeb, 0x7c, 0x0d, 0x7b, 0x79, 0x40, 0x87, 0xfc, 0x00, 0xcd, 0x82, 0x24, 0xbb, 0xa8, 0x86, 0xa4, 0x70, 0x26, 0x0c, 0x49, 0x71, 0xab, 0x13, 0x92, 0xec, 0x3e,
0x4c, 0x4f, 0x92, 0x2f, 0x16, 0xd4, 0xaf, 0x3d, 0x35, 0x1c, 0x2c, 0x83, 0x3a, 0xf6, 0x67, 0x68, 0x1a, 0x92, 0xc2, 0x3e, 0x1b, 0x92, 0xe2, 0xf2, 0xd2, 0x12, 0x39, 0x83, 0x76, 0x7a, 0x1d, 0x85,
0xe7, 0xba, 0x86, 0x6c, 0x9a, 0xae, 0xcd, 0xf7, 0xe4, 0x70, 0x6b, 0x15, 0xac, 0x18, 0x7e, 0x1d, 0x29, 0x47, 0x6e, 0x6b, 0x4d, 0x39, 0xf2, 0x8b, 0x4b, 0x4b, 0xe4, 0x18, 0xe0, 0x17, 0x94, 0x66,
0x00, 0x99, 0xc4, 0x4f, 0xa3, 0x49, 0xcc, 0x31, 0x16, 0xa3, 0x00, 0x5f, 0x94, 0xe7, 0x6d, 0x4d, 0x05, 0x49, 0x57, 0xab, 0xbd, 0xac, 0xe7, 0xa8, 0x97, 0x05, 0xb4, 0xc9, 0x37, 0xd0, 0x4c, 0x8d,
0xff, 0x07, 0x7c, 0xfb, 0x31, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x6a, 0x64, 0xe2, 0x18, 0x08, 0x00, 0x34, 0xf9, 0x64, 0x49, 0xfd, 0x32, 0x92, 0xa3, 0x41, 0x11, 0xd4, 0xb6, 0xdf, 0x43, 0x3b, 0x33,
0x00, 0x74, 0xe4, 0x83, 0x19, 0xfa, 0xec, 0x48, 0x8f, 0x36, 0x57, 0xc1, 0x8a, 0xe1, 0xc7, 0x01, 0x90,
0x69, 0xf4, 0x38, 0x9e, 0x46, 0x1c, 0x23, 0x31, 0xf6, 0xf1, 0x59, 0x69, 0xde, 0xd4, 0xf4, 0x4f,
0xd1, 0x97, 0x1f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xd1, 0x00, 0x08, 0xae, 0x25, 0x09, 0x00, 0x00,
} }

View File

@ -36,6 +36,20 @@ message DeleteClientResp {
bool not_found = 1; bool not_found = 1;
} }
// UpdateClientReq is a request to update an exisitng client.
message UpdateClientReq {
string id = 1;
repeated string redirect_uris = 2;
repeated string trusted_peers = 3;
string name = 4;
string logo_url = 5;
}
// UpdateClientResp returns the reponse form updating a client.
message UpdateClientResp {
bool not_found = 1;
}
// TODO(ericchiang): expand this. // TODO(ericchiang): expand this.
// Password is an email for password mapping managed by the storage. // Password is an email for password mapping managed by the storage.
@ -138,6 +152,8 @@ message RevokeRefreshResp {
service Dex { service Dex {
// CreateClient creates a client. // CreateClient creates a client.
rpc CreateClient(CreateClientReq) returns (CreateClientResp) {}; rpc CreateClient(CreateClientReq) returns (CreateClientResp) {};
// UpdateClient updates an existing client
rpc UpdateClient(UpdateClientReq) returns (UpdateClientResp) {};
// DeleteClient deletes the provided client. // DeleteClient deletes the provided client.
rpc DeleteClient(DeleteClientReq) returns (DeleteClientResp) {}; rpc DeleteClient(DeleteClientReq) returns (DeleteClientResp) {};
// CreatePassword creates a password. // CreatePassword creates a password.

View File

@ -80,6 +80,37 @@ func (d dexAPI) CreateClient(ctx context.Context, req *api.CreateClientReq) (*ap
}, nil }, nil
} }
func (d dexAPI) UpdateClient(ctx context.Context, req *api.UpdateClientReq) (*api.UpdateClientResp, error) {
if req.Id == "" {
return nil, errors.New("update client: no client ID supplied")
}
err := d.s.UpdateClient(req.Id, func(old storage.Client) (storage.Client, error) {
if req.RedirectUris != nil {
old.RedirectURIs = req.RedirectUris
}
if req.TrustedPeers != nil {
old.TrustedPeers = req.TrustedPeers
}
if req.Name != "" {
old.Name = req.Name
}
if req.LogoUrl != "" {
old.LogoURL = req.LogoUrl
}
return old, nil
})
if err != nil {
if err == storage.ErrNotFound {
return &api.UpdateClientResp{NotFound: true}, nil
}
d.logger.Errorf("api: failed to update the client: %v", err)
return nil, fmt.Errorf("update client: %v", err)
}
return &api.UpdateClientResp{}, nil
}
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

@ -290,3 +290,171 @@ func TestRefreshToken(t *testing.T) {
t.Fatalf("Refresh token returned inspite of revoking it.") t.Fatalf("Refresh token returned inspite of revoking it.")
} }
} }
func TestUpdateClient(t *testing.T) {
logger := &logrus.Logger{
Out: os.Stderr,
Formatter: &logrus.TextFormatter{DisableColors: true},
Level: logrus.DebugLevel,
}
s := memory.New(logger)
client := newAPI(s, logger, t)
defer client.Close()
ctx := context.Background()
createClient := func(t *testing.T, clientId string) {
resp, err := client.CreateClient(ctx, &api.CreateClientReq{
Client: &api.Client{
Id: clientId,
Secret: "",
RedirectUris: []string{},
TrustedPeers: nil,
Public: true,
Name: "",
LogoUrl: "",
},
})
if err != nil {
t.Fatalf("unable to create the client: %v", err)
}
if resp == nil {
t.Fatalf("create client returned no response")
}
if resp.AlreadyExists {
t.Error("existing client was found")
}
if resp.Client == nil {
t.Fatalf("no client created")
}
}
deleteClient := func(t *testing.T, clientId string) {
resp, err := client.DeleteClient(ctx, &api.DeleteClientReq{
Id: clientId,
})
if err != nil {
t.Fatalf("unable to delete the client: %v", err)
}
if resp == nil {
t.Fatalf("delete client delete client returned no response")
}
}
tests := map[string]struct {
setup func(t *testing.T, clientId string)
cleanup func(t *testing.T, clientId string)
req *api.UpdateClientReq
wantErr bool
want *api.UpdateClientResp
}{
"update client": {
setup: createClient,
cleanup: deleteClient,
req: &api.UpdateClientReq{
Id: "test",
RedirectUris: []string{"https://redirect"},
TrustedPeers: []string{"test"},
Name: "test",
LogoUrl: "https://logout",
},
wantErr: false,
want: &api.UpdateClientResp{
NotFound: false,
},
},
"update client without ID": {
setup: createClient,
cleanup: deleteClient,
req: &api.UpdateClientReq{
Id: "",
RedirectUris: nil,
TrustedPeers: nil,
Name: "test",
LogoUrl: "test",
},
wantErr: true,
want: &api.UpdateClientResp{
NotFound: false,
},
},
"update client which not exists ": {
req: &api.UpdateClientReq{
Id: "test",
RedirectUris: nil,
TrustedPeers: nil,
Name: "test",
LogoUrl: "test",
},
wantErr: true,
want: &api.UpdateClientResp{
NotFound: false,
},
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
if tc.setup != nil {
tc.setup(t, tc.req.Id)
}
resp, err := client.UpdateClient(ctx, tc.req)
if err != nil && !tc.wantErr {
t.Fatalf("failed to update the client: %v", err)
}
if !tc.wantErr {
if resp == nil {
t.Fatalf("update client response not found")
}
if tc.want.NotFound != resp.NotFound {
t.Errorf("expected in response NotFound: %t", tc.want.NotFound)
}
client, err := s.GetClient(tc.req.Id)
if err != nil {
t.Errorf("no client found in the storage: %v", err)
}
if tc.req.Id != client.ID {
t.Errorf("expected stored client with ID: %s, found %s", tc.req.Id, client.ID)
}
if tc.req.Name != client.Name {
t.Errorf("expected stored client with Name: %s, found %s", tc.req.Name, client.Name)
}
if tc.req.LogoUrl != client.LogoURL {
t.Errorf("expected stored client with LogoURL: %s, found %s", tc.req.LogoUrl, client.LogoURL)
}
for _, redirectURI := range tc.req.RedirectUris {
found := find(redirectURI, client.RedirectURIs)
if !found {
t.Errorf("expected redirect URI: %s", redirectURI)
}
}
for _, peer := range tc.req.TrustedPeers {
found := find(peer, client.TrustedPeers)
if !found {
t.Errorf("expected trusted peer: %s", peer)
}
}
}
if tc.cleanup != nil {
tc.cleanup(t, tc.req.Id)
}
})
}
}
func find(item string, items []string) bool {
for _, i := range items {
if item == i {
return true
}
}
return false
}