8000 fix: handle omitted role sync claim (#8697) · coder/coder@ac559f1 · GitHub
[go: up one dir, main page]

Skip to content

Commit ac559f1

Browse files
authored
fix: handle omitted role sync claim (#8697)
* fix: handle omitted role sync claim
1 parent ac973a4 commit ac559f1

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

coderd/userauth.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -965,7 +965,8 @@ func (api *API) userOIDC(rw http.ResponseWriter, r *http.Request) {
965965
// a member. This is because there is no way to tell the difference
966966
// between []string{} and nil for OIDC claims. IDPs omit claims
967967
// if they are empty ([]string{}).
968-
rolesRow = []string{}
968+
// Use []interface{}{} so the next typecast works.
969+
rolesRow = []interface{}{}
969970
}
970971

971972
rolesInterface, ok := rolesRow.([]interface{})

enterprise/coderd/userauth_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,45 @@ func TestUserOIDC(t *testing.T) {
2828
t.Run("RoleSync", func(t *testing.T) {
2929
t.Parallel()
3030

31+
t.Run("NoRoles", func(t *testing.T) {
32+
t.Parallel()
33+
34+
ctx := testutil.Context(t, testutil.WaitMedium)
35+
conf := coderdtest.NewOIDCConfig(t, "")
36+
37+
oidcRoleName := "TemplateAuthor"
38+
39+
config := conf.OIDCConfig(t, jwt.MapClaims{}, func(cfg *coderd.OIDCConfig) {
40+
cfg.UserRoleMapping = map[string][]string{oidcRoleName: {rbac.RoleTemplateAdmin(), rbac.RoleUserAdmin()}}
41+
})
42+
config.AllowSignups = true
43+
config.UserRoleField = "roles"
44+
45+
client, _ := coderdenttest.New(t, &coderdenttest.Options{
46+
Options: &coderdtest.Options{
47+
OIDCConfig: config,
48+
},
49+
LicenseOptions: &coderdenttest.LicenseOptions{
50+
Features: license.Features{codersdk.FeatureUserRoleManagement: 1},
51+
},
52+
})
53+
54+
admin, err := client.User(ctx, "me")
55+
require.NoError(t, err)
56+
require.Len(t, admin.OrganizationIDs, 1)
57+
58+
resp := oidcCallback(t, client, conf.EncodeClaims(t, jwt.MapClaims{
59+
"email": "alice@coder.com",
60+
}))
61+
require.Equal(t, http.StatusTemporaryRedirect, resp.StatusCode)
62+
user, err := client.User(ctx, "alice")
63+
require.NoError(t, err)
64+
65+
require.Len(t, user.Roles, 0)
66+
roleNames := []string{}
67+
require.ElementsMatch(t, roleNames, []string{})
68+
})
69+
3170
t.Run("NewUserAndRemoveRoles", func(t *testing.T) {
3271
t.Parallel()
3372

0 commit comments

Comments
 (0)
0