Skip to content

Commit 78ee74f

Browse files
Merge branch 'main' into ft/focus-targets
2 parents 8c3f4fd + 6c772f9 commit 78ee74f

File tree

2 files changed

+23
-56
lines changed

2 files changed

+23
-56
lines changed

components/server/src/authorization/perms.ts

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,6 @@ import {
1515
} from "../prometheus-metrics";
1616
import { SpiceDBClient } from "./spicedb";
1717

18-
export type OrganizationOperation =
19-
// A not yet implemented operation at this time. This exists such that we can be explicit about what
20-
// we have not yet migrated to fine-grained-permissions.
21-
| "not_implemented"
22-
23-
// Ability to perform write actions an Organization, and all sub-resources of the organization.
24-
| "org_write"
25-
26-
// Ability to update Organization metadata - name, and other general info.
27-
| "org_metadata_write"
28-
// Ability to read Organization metadata - name, and other general info.
29-
| "org_metadata_read"
30-
31-
// Ability to access information about team members.
32-
| "org_members_read"
33-
// Ability to add, or remove, team members.
34-
| "org_members_write"
35-
36-
// Ability to read projects in an Organization.
37-
| "org_project_read"
38-
// Ability to create/update/delete projects in an Organization.
39-
| "org_project_write"
40-
41-
// Ability to create/update/delete Organization Auth Providers.
42-
| "org_authprovider_write"
43-
// Ability to read Organization Auth Providers.
44-
| "org_authprovider_read";
45-
4618
export type CheckResult = {
4719
permitted: boolean;
4820
err?: Error;

components/server/src/workspace/gitpod-server-impl.ts

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -169,13 +169,7 @@ import {
169169
ConfigCatClientFactory,
170170
getExperimentsClientForBackend,
171171
} from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";
172-
import {
173-
Authorizer,
174-
CheckResult,
175-
OrganizationOperation,
176-
NotPermitted,
177-
PermissionChecker,
178-
} from "../authorization/perms";
172+
import { Authorizer, CheckResult, NotPermitted, PermissionChecker } from "../authorization/perms";
179173
import {
180174
ReadOrganizationMembers,
181175
ReadOrganizationInfo,
@@ -210,6 +204,7 @@ import {
210204
import { ClientError } from "nice-grpc-common";
211205
import { BillingModes } from "../billing/billing-mode";
212206
import { goDurationToHumanReadable } from "@gitpod/gitpod-protocol/lib/util/timeutil";
207+
import { OrganizationPermission } from "../authorization/definitions";
213208

214209
// shortcut
215210
export const traceWI = (ctx: TraceContext, wi: Omit<LogContext, "userId">) => TraceContext.setOWI(ctx, wi); // userId is already taken care of in WebsocketConnectionManager
@@ -2662,7 +2657,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
26622657
protected async guardTeamOperation(
26632658
teamId: string,
26642659
op: ResourceAccessOp,
2665-
fineGrainedOp: OrganizationOperation,
2660+
fineGrainedOp: OrganizationPermission | "not_implemented",
26662661
): Promise<{ team: Team; members: TeamMemberInfo[] }> {
26672662
if (!uuidValidate(teamId)) {
26682663
throw new ResponseError(ErrorCodes.BAD_REQUEST, "organization ID must be a valid UUID");
@@ -2693,7 +2688,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
26932688
};
26942689

26952690
const checkWithCentralizedPerms = async (): Promise<CheckResult> => {
2696-
if (centralizedPermissionsEnabled) {
2691+
if (centralizedPermissionsEnabled && fineGrainedOp !== "not_implemented") {
26972692
log.info("[perms] Checking team operations.", {
26982693
org: teamId,
26992694
operations: fineGrainedOp,
@@ -2746,19 +2741,19 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
27462741

27472742
protected async guardOrganizationOperationWithCentralizedPerms(
27482743
orgId: string,
2749-
op: OrganizationOperation,
2744+
op: OrganizationPermission,
27502745
): Promise<CheckResult> {
27512746
const user = await this.checkUser();
27522747

27532748
switch (op) {
2754-
case "org_metadata_read":
2749+
case "read_info":
27552750
return await this.authorizer.check(ReadOrganizationInfo(user.id, orgId));
2756-
case "org_metadata_write":
2751+
case "write_info":
27572752
return await this.authorizer.check(WriteOrganizationInfo(user.id, orgId));
27582753

2759-
case "org_members_read":
2754+
case "read_members":
27602755
return await this.authorizer.check(ReadOrganizationMembers(user.id, orgId));
2761-
case "org_members_write":
2756+
case "write_members":
27622757
return await this.authorizer.check(WriteOrganizationMembers(user.id, orgId));
27632758

27642759
default:
@@ -2777,15 +2772,15 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
27772772

27782773
await this.checkAndBlockUser("getTeam");
27792774

2780-
const { team } = await this.guardTeamOperation(teamId, "get", "org_members_read");
2775+
const { team } = await this.guardTeamOperation(teamId, "get", "read_info");
27812776
return team;
27822777
}
27832778

27842779
public async updateTeam(ctx: TraceContext, teamId: string, team: Pick<Team, "name">): Promise<Team> {
27852780
traceAPIParams(ctx, { teamId });
27862781
await this.checkUser("updateTeam");
27872782

2788-
await this.guardTeamOperation(teamId, "update", "org_metadata_write");
2783+
await this.guardTeamOperation(teamId, "update", "write_info");
27892784

27902785
const updatedTeam = await this.teamDB.updateTeam(teamId, team);
27912786
return updatedTeam;
@@ -2795,7 +2790,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
27952790
traceAPIParams(ctx, { teamId });
27962791

27972792
await this.checkUser("getTeamMembers");
2798-
const { members } = await this.guardTeamOperation(teamId, "get", "org_members_read");
2793+
const { members } = await this.guardTeamOperation(teamId, "get", "read_members");
27992794

28002795
return members;
28012796
}
@@ -2904,7 +2899,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
29042899
}
29052900

29062901
await this.checkAndBlockUser("setTeamMemberRole");
2907-
await this.guardTeamOperation(teamId, "update", "org_members_write");
2902+
await this.guardTeamOperation(teamId, "update", "write_members");
29082903

29092904
await this.teamDB.setTeamMemberRole(userId, teamId, role);
29102905
}
@@ -2923,7 +2918,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
29232918
if (!currentUserLeavingTeam) {
29242919
await this.guardTeamOperation(teamId, "update", "not_implemented");
29252920
} else {
2926-
await this.guardTeamOperation(teamId, "get", "org_members_write");
2921+
await this.guardTeamOperation(teamId, "get", "write_members");
29272922
}
29282923

29292924
// Check for existing membership.
@@ -2957,7 +2952,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
29572952
traceAPIParams(ctx, { teamId });
29582953

29592954
await this.checkUser("getGenericInvite");
2960-
await this.guardTeamOperation(teamId, "get", "org_members_write");
2955+
await this.guardTeamOperation(teamId, "get", "write_members");
29612956

29622957
if (await this.teamDB.hasActiveSSO(teamId)) {
29632958
throw new ResponseError(ErrorCodes.NOT_FOUND, "Invites are disabled for SSO-enabled organizations.");
@@ -2974,7 +2969,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
29742969
traceAPIParams(ctx, { teamId });
29752970

29762971
await this.checkAndBlockUser("resetGenericInvite");
2977-
await this.guardTeamOperation(teamId, "update", "org_members_write");
2972+
await this.guardTeamOperation(teamId, "update", "write_members");
29782973
if (await this.teamDB.hasActiveSSO(teamId)) {
29792974
throw new ResponseError(ErrorCodes.NOT_FOUND, "Invites are disabled for SSO-enabled organizations.");
29802975
}
@@ -3017,7 +3012,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
30173012
const user = await this.checkAndBlockUser("deleteTeam");
30183013
traceAPIParams(ctx, { teamId, userId: user.id });
30193014

3020-
await this.guardTeamOperation(teamId, "delete", "org_write");
3015+
await this.guardTeamOperation(teamId, "delete", "not_implemented");
30213016

30223017
const teamProjects = await this.projectsService.getTeamProjects(teamId);
30233018
teamProjects.forEach((project) => {
@@ -3048,7 +3043,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
30483043
async getOrgSettings(ctx: TraceContextWithSpan, orgId: string): Promise<OrganizationSettings> {
30493044
const user = await this.checkAndBlockUser("getOrgSettings");
30503045
traceAPIParams(ctx, { orgId, userId: user.id });
3051-
await this.guardTeamOperation(orgId, "get", "org_write");
3046+
await this.guardTeamOperation(orgId, "get", "not_implemented");
30523047
const settings = await this.teamDB.findOrgSettings(orgId);
30533048
// TODO: make a default in protocol
30543049
return settings ?? { workspaceSharingDisabled: false };
@@ -3061,7 +3056,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
30613056
): Promise<OrganizationSettings> {
30623057
const user = await this.checkAndBlockUser("updateOrgSettings");
30633058
traceAPIParams(ctx, { orgId, userId: user.id });
3064-
await this.guardTeamOperation(orgId, "update", "org_write");
3059+
await this.guardTeamOperation(orgId, "update", "not_implemented");
30653060
await this.teamDB.setOrgSettings(orgId, settings);
30663061
return (await this.teamDB.findOrgSettings(orgId))!;
30673062
}
@@ -3757,7 +3752,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
37573752
}
37583753

37593754
// Ensure user can perform this operation on this organization
3760-
await this.guardTeamOperation(newProvider.organizationId, "update", "org_authprovider_write");
3755+
await this.guardTeamOperation(newProvider.organizationId, "update", "not_implemented");
37613756

37623757
try {
37633758
// on creating we're are checking for already existing runtime providers
@@ -3805,7 +3800,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
38053800

38063801
await this.guardWithFeatureFlag("orgGitAuthProviders", user, providerUpdate.organizationId);
38073802

3808-
await this.guardTeamOperation(providerUpdate.organizationId, "update", "org_authprovider_write");
3803+
await this.guardTeamOperation(providerUpdate.organizationId, "update", "not_implemented");
38093804

38103805
try {
38113806
const result = await this.authProviderService.updateOrgAuthProvider(providerUpdate);
@@ -3826,7 +3821,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
38263821

38273822
await this.guardWithFeatureFlag("orgGitAuthProviders", user, params.organizationId);
38283823

3829-
await this.guardTeamOperation(params.organizationId, "get", "org_authprovider_read");
3824+
await this.guardTeamOperation(params.organizationId, "get", "not_implemented");
38303825

38313826
try {
38323827
const result = await this.authProviderService.getAuthProvidersOfOrg(params.organizationId);
@@ -3857,7 +3852,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
38573852
throw new ResponseError(ErrorCodes.NOT_FOUND, "Provider resource not found.");
38583853
}
38593854

3860-
await this.guardTeamOperation(authProvider.organizationId || "", "update", "org_authprovider_write");
3855+
await this.guardTeamOperation(authProvider.organizationId || "", "update", "not_implemented");
38613856

38623857
try {
38633858
await this.authProviderService.deleteAuthProvider(authProvider);

0 commit comments

Comments
 (0)