Skip to content

Commit 17c1def

Browse files
easyCZroboquat
authored andcommitted
[iam] Add Get OIDC Client Config RPC
1 parent 6868ce0 commit 17c1def

File tree

2 files changed

+85
-4
lines changed

2 files changed

+85
-4
lines changed

components/iam/pkg/apiv1/oidc_config.go

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package apiv1
66

77
import (
88
"context"
9+
"errors"
910

1011
goidc "github.com/coreos/go-oidc/v3/oidc"
1112
"github.com/gitpod-io/gitpod/common-go/log"
@@ -52,13 +53,37 @@ func (s *OIDCClientConfigService) CreateClientConfig(ctx context.Context, req *v
5253
}
5354

5455
return &v1.CreateClientConfigResponse{
55-
Config: &v1.OIDCClientConfig{
56-
Id: created.ID.String(),
57-
// TODO: Populate remainder of fields
58-
},
56+
Config: oidcClientConfigToProto(created),
5957
}, nil
6058
}
6159

60+
func (s *OIDCClientConfigService) GetClientConfig(ctx context.Context, req *v1.GetClientConfigRequest) (*v1.GetClientConfigResponse, error) {
61+
id, err := validateOIDCSpecID(req.GetId())
62+
if err != nil {
63+
return nil, err
64+
}
65+
66+
oidcConfig, err := db.GetOIDCClientConfig(ctx, s.dbConn, id)
67+
if err != nil {
68+
if errors.Is(err, db.ErrorNotFound) {
69+
return nil, status.Errorf(codes.NotFound, "no oidc config with ID: %s exists", id.String())
70+
}
71+
}
72+
73+
return &v1.GetClientConfigResponse{
74+
Config: oidcClientConfigToProto(oidcConfig),
75+
}, nil
76+
}
77+
78+
func validateOIDCSpecID(id string) (uuid.UUID, error) {
79+
parsed, err := uuid.Parse(id)
80+
if err != nil {
81+
return uuid.Nil, status.Errorf(codes.InvalidArgument, "invalid oidc spec ID, must be a UUID")
82+
}
83+
84+
return parsed, nil
85+
}
86+
6287
func toDBSpec(oauth2Config *v1.OAuth2Config, oidcConfig *v1.OIDCConfig) db.OIDCSpec {
6388
return db.OIDCSpec{
6489
ClientID: oauth2Config.GetClientId(),
@@ -67,3 +92,10 @@ func toDBSpec(oauth2Config *v1.OAuth2Config, oidcConfig *v1.OIDCConfig) db.OIDCS
6792
Scopes: append([]string{goidc.ScopeOpenID, "profile", "email"}, oauth2Config.GetScopesSupported()...),
6893
}
6994
}
95+
96+
func oidcClientConfigToProto(cfg db.OIDCClientConfig) *v1.OIDCClientConfig {
97+
return &v1.OIDCClientConfig{
98+
Id: cfg.ID.String(),
99+
// TODO: Populate remainder of fields
100+
}
101+
}

components/iam/pkg/apiv1/oidc_config_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,55 @@ func TestOIDCClientConfig_Create(t *testing.T) {
5353
require.Equal(t, toDBSpec(config.Oauth2Config, config.OidcConfig), decrypted)
5454
}
5555

56+
func TestOIDCClientConfig_Get(t *testing.T) {
57+
58+
t.Run("invalid id returns invalid argument", func(t *testing.T) {
59+
client, _ := setupOIDCClientConfigService(t)
60+
61+
_, err := client.GetClientConfig(context.Background(), &v1.GetClientConfigRequest{
62+
Id: "not-uuid",
63+
})
64+
require.Error(t, err)
65+
require.Equal(t, codes.InvalidArgument, status.Code(err))
66+
})
67+
68+
t.Run("no client config with ID returns not found", func(t *testing.T) {
69+
client, _ := setupOIDCClientConfigService(t)
70+
71+
_, err := client.GetClientConfig(context.Background(), &v1.GetClientConfigRequest{
72+
Id: uuid.New().String(),
73+
})
74+
require.Error(t, err)
75+
require.Equal(t, codes.NotFound, status.Code(err))
76+
})
77+
78+
t.Run("retrieves a config by ID", func(t *testing.T) {
79+
client, dbConn := setupOIDCClientConfigService(t)
80+
81+
config := db.OIDCSpec{
82+
ClientID: "some-client-id",
83+
ClientSecret: "some-client-secret",
84+
}
85+
86+
encrypted, err := db.EncryptJSON(dbtest.CipherSet(t), config)
87+
require.NoError(t, err)
88+
89+
created := dbtest.CreateOIDCClientConfigs(t, dbConn,
90+
dbtest.NewOIDCClientConfig(t, db.OIDCClientConfig{
91+
Data: encrypted,
92+
}),
93+
)[0]
94+
95+
response, err := client.GetClientConfig(context.Background(), &v1.GetClientConfigRequest{
96+
Id: created.ID.String(),
97+
})
98+
require.NoError(t, err)
99+
require.Equal(t, codes.OK, status.Code(err))
100+
require.Equal(t, oidcClientConfigToProto(created), response.Config)
101+
})
102+
103+
}
104+
56105
func setupOIDCClientConfigService(t *testing.T) (v1.OIDCServiceClient, *gorm.DB) {
57106
t.Helper()
58107

0 commit comments

Comments
 (0)