Skip to content

Commit b2d5018

Browse files
[server] move FGA calls into AuthProviderService (#19017)
* [server] move FGA calls into AuthProviderService * split internal upsert method `updateAuthProvider` into create and update * refactor: move `getAuthProviders` logic from gitpod-server-impl to auth-provider-service * adding db tests for auth provider server * use redacted results in service * Fix typos * extract helper functions for scopes * add more tests * as regular member, should find org-level providers if no built-in providers present * as regular member, should find only built-in providers if present --------- Co-authored-by: Huiwen <[email protected]>
1 parent 2e3429a commit b2d5018

13 files changed

+768
-193
lines changed

components/gitpod-db/src/typeorm/entity/db-auth-provider-entry.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ export class DBAuthProviderEntry implements AuthProviderEntry {
1818
@Column()
1919
ownerId: string;
2020

21-
@Column()
21+
@Column({
22+
...TypeORM.UUID_COLUMN_TYPE,
23+
default: "",
24+
transformer: Transformer.MAP_EMPTY_STR_TO_UNDEFINED,
25+
})
2226
organizationId?: string;
2327

2428
@Column("varchar")

components/gitpod-protocol/src/gitpod-service.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,31 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
8181
updateLoggedInUser(user: Partial<User>): Promise<User>;
8282
sendPhoneNumberVerificationToken(phoneNumber: string): Promise<{ verificationId: string }>;
8383
verifyPhoneNumberVerificationToken(phoneNumber: string, token: string, verificationId: string): Promise<boolean>;
84-
getAuthProviders(): Promise<AuthProviderInfo[]>;
85-
getOwnAuthProviders(): Promise<AuthProviderEntry[]>;
86-
updateOwnAuthProvider(params: GitpodServer.UpdateOwnAuthProviderParams): Promise<AuthProviderEntry>;
87-
deleteOwnAuthProvider(params: GitpodServer.DeleteOwnAuthProviderParams): Promise<void>;
8884
getConfiguration(): Promise<Configuration>;
8985
getToken(query: GitpodServer.GetTokenSearchOptions): Promise<Token | undefined>;
9086
getGitpodTokenScopes(tokenHash: string): Promise<string[]>;
9187
deleteAccount(): Promise<void>;
9288
getClientRegion(): Promise<string | undefined>;
9389

90+
// Auth Provider API
91+
getAuthProviders(): Promise<AuthProviderInfo[]>;
92+
// user-level
93+
getOwnAuthProviders(): Promise<AuthProviderEntry[]>;
94+
updateOwnAuthProvider(params: GitpodServer.UpdateOwnAuthProviderParams): Promise<AuthProviderEntry>;
95+
deleteOwnAuthProvider(params: GitpodServer.DeleteOwnAuthProviderParams): Promise<void>;
96+
// org-level
97+
createOrgAuthProvider(params: GitpodServer.CreateOrgAuthProviderParams): Promise<AuthProviderEntry>;
98+
updateOrgAuthProvider(params: GitpodServer.UpdateOrgAuthProviderParams): Promise<AuthProviderEntry>;
99+
getOrgAuthProviders(params: GitpodServer.GetOrgAuthProviderParams): Promise<AuthProviderEntry[]>;
100+
deleteOrgAuthProvider(params: GitpodServer.DeleteOrgAuthProviderParams): Promise<void>;
101+
// public-api compatibility
102+
/** @deprecated used for public-api compatibility only */
103+
getAuthProvider(id: string): Promise<AuthProviderEntry>;
104+
/** @deprecated used for public-api compatibility only */
105+
deleteAuthProvider(id: string): Promise<void>;
106+
/** @deprecated used for public-api compatibility only */
107+
updateAuthProvider(id: string, update: AuthProviderEntry.UpdateOAuth2Config): Promise<AuthProviderEntry>;
108+
94109
// Query/retrieve workspaces
95110
getWorkspaces(options: GitpodServer.GetWorkspacesOptions): Promise<WorkspaceInfo[]>;
96111
getWorkspaceOwner(workspaceId: string): Promise<UserInfo | undefined>;
@@ -167,10 +182,6 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
167182
deleteTeam(teamId: string): Promise<void>;
168183
getOrgSettings(orgId: string): Promise<OrganizationSettings>;
169184
updateOrgSettings(teamId: string, settings: Partial<OrganizationSettings>): Promise<OrganizationSettings>;
170-
createOrgAuthProvider(params: GitpodServer.CreateOrgAuthProviderParams): Promise<AuthProviderEntry>;
171-
updateOrgAuthProvider(params: GitpodServer.UpdateOrgAuthProviderParams): Promise<AuthProviderEntry>;
172-
getOrgAuthProviders(params: GitpodServer.GetOrgAuthProviderParams): Promise<AuthProviderEntry[]>;
173-
deleteOrgAuthProvider(params: GitpodServer.DeleteOrgAuthProviderParams): Promise<void>;
174185

175186
getDefaultWorkspaceImage(params: GetDefaultWorkspaceImageParams): Promise<GetDefaultWorkspaceImageResult>;
176187

components/gitpod-protocol/src/protocol.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1529,7 +1529,6 @@ export interface AuthProviderInfo {
15291529
readonly ownerId?: string;
15301530
readonly organizationId?: string;
15311531
readonly verified: boolean;
1532-
readonly isReadonly?: boolean;
15331532
readonly hiddenOnDashboard?: boolean;
15341533
readonly disallowLogin?: boolean;
15351534
readonly icon?: string;
@@ -1588,6 +1587,7 @@ export namespace AuthProviderEntry {
15881587
clientSecret: string;
15891588
organizationId: string;
15901589
};
1590+
export type UpdateOAuth2Config = Pick<OAuth2Config, "clientId" | "clientSecret">;
15911591
export function redact(entry: AuthProviderEntry): AuthProviderEntry {
15921592
return {
15931593
...entry,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* Copyright (c) 2023 Gitpod GmbH. All rights reserved.
3+
* Licensed under the GNU Affero General Public License (AGPL).
4+
* See License.AGPL.txt in the project root for license information.
5+
*/
6+
7+
import { AuthProviderEntry } from "@gitpod/gitpod-protocol";
8+
import { GitHubScope } from "../github/scopes";
9+
import { GitLabScope } from "../gitlab/scopes";
10+
import { BitbucketOAuthScopes } from "../bitbucket/bitbucket-oauth-scopes";
11+
import { BitbucketServerOAuthScopes } from "../bitbucket-server/bitbucket-server-oauth-scopes";
12+
13+
export function getRequiredScopes(entry: AuthProviderEntry) {
14+
switch (entry.type) {
15+
case "GitHub":
16+
return {
17+
default: GitHubScope.Requirements.DEFAULT,
18+
publicRepo: GitHubScope.Requirements.PUBLIC_REPO,
19+
privateRepo: GitHubScope.Requirements.PRIVATE_REPO,
20+
};
21+
case "GitLab":
22+
return {
23+
default: GitLabScope.Requirements.DEFAULT,
24+
publicRepo: GitLabScope.Requirements.DEFAULT,
25+
privateRepo: GitLabScope.Requirements.REPO,
26+
};
27+
case "Bitbucket":
28+
return {
29+
default: BitbucketOAuthScopes.Requirements.DEFAULT,
30+
publicRepo: BitbucketOAuthScopes.Requirements.DEFAULT,
31+
privateRepo: BitbucketOAuthScopes.Requirements.DEFAULT,
32+
};
33+
case "BitbucketServer":
34+
return {
35+
default: BitbucketServerOAuthScopes.Requirements.DEFAULT,
36+
publicRepo: BitbucketServerOAuthScopes.Requirements.DEFAULT,
37+
privateRepo: BitbucketServerOAuthScopes.Requirements.DEFAULT,
38+
};
39+
}
40+
}
41+
export function getScopesOfProvider(entry: AuthProviderEntry) {
42+
switch (entry.type) {
43+
case "GitHub":
44+
return GitHubScope.All;
45+
case "GitLab":
46+
return GitLabScope.All;
47+
case "Bitbucket":
48+
return BitbucketOAuthScopes.ALL;
49+
case "BitbucketServer":
50+
return BitbucketServerOAuthScopes.ALL;
51+
}
52+
}

0 commit comments

Comments
 (0)