Skip to content

Commit

TS access mirrors the workspace token cap and fine-grained reach

syntaqxcommitted Parentdf0f701Browse files
2 files+24−20/2 viewed
+12−2
116116 }
117117
118118 function membershipRole(user: User, membership: Membership): RepoRole | null {
119− // A workspace's own token, and g1t acting in the workspace, do what an
120− // owner can on its repositories.
119+ // A workspace's own token has Write, or Admin when an owner gave it that;
120+ // g1t, and a service acting as the workspace, do what an owner can.
121+ if (user.kind === "workspace" && user.token) return user.token.admin ? "admin" : "write";
121122 if (user.kind === "workspace" || user.kind === "system") return "admin";
122123 return membership.role === "owner" ? "admin" : baseRole(membership.base_permission);
123124 }
124125
125126 /** The user's role on the repository, not counting that it may be public. */
126127 export function granted(user: User, repo: RepoRef): RepoRole | null {
128+ // A fine-grained token outside its resource owner or selection: no role.
129+ const reach = user.token?.fine_grained;
130+ if (reach) {
131+ const inside =
132+ !!reach.workspace &&
133+ reach.workspace.toLowerCase() === repo.namespace.toLowerCase() &&
134+ (reach.repositories === "all" || (reach.repositories === "selected" && (reach.repo_ids ?? []).includes(repo.id)));
135+ if (!inside) return null;
136+ }
127137 const namespace = repo.namespace.toLowerCase();
128138 const membership = user.workspaces?.find((m) => m.slug.toLowerCase() === namespace);
129139 let role = membership ? membershipRole(user, membership) : null;
+12−0
5252 legacy?: boolean;
5353 /** The token's name, as its owner gave it. */
5454 name?: string;
55+ /** A fine-grained token's reach: its resource owner and repositories. */
56+ fine_grained?: {
57+ workspace?: string | null;
58+ repositories?: "all" | "selected" | "public";
59+ repo_ids?: string[];
60+ };
61+ /** A workspace's own token an owner gave Admin. */
62+ admin?: boolean;
63+ /** Set on what a deploy key resolves to. */
64+ deploy_key?: string;
65+ /** The one repository a job's token or a deploy key reaches. */
66+ repo?: string;
5567 };
5668 };
5769