Skip to content

Show git providers #8645

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions components/dashboard/src/admin/UserDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default function UserDetail(p: { user: User }) {
const [isStudent, setIsStudent] = useState<boolean>();
const [editFeatureFlags, setEditFeatureFlags] = useState(false);
const [editRoles, setEditRoles] = useState(false);
const [authProviders, setAuthProviders] = useState<string[]>();
const userRef = useRef(user);

const isProfessionalOpenSource = accountStatement && accountStatement.subscriptions.some(s => s.planId === Plans.FREE_OPEN_SOURCE.chargebeeId)
Expand All @@ -40,6 +41,9 @@ export default function UserDetail(p: { user: User }) {
getGitpodService().server.adminIsStudent(p.user.id).then(
isStud => setIsStudent(isStud)
);
getGitpodService().server.adminGetAuthProviderIdsOfUser(p.user.id).then(
result => setAuthProviders(result.map(r => r.authProviderId))
);
}, [p.user]);

const email = User.getPrimaryEmail(p.user);
Expand Down Expand Up @@ -169,6 +173,12 @@ export default function UserDetail(p: { user: User }) {
}] : undefined}
>{isStudent === undefined ? '---' : (isStudent ? 'Enabled' : 'Disabled')}</Property>
</div>
<div className="flex w-full mt-6 overflow-scroll">
{authProviders && authProviders.length > 0 &&
<Property name="Git providers">
<div className="overflow-scroll">{authProviders?.join(", ")}</div>
Copy link
Contributor

@gtsiolis gtsiolis Mar 9, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Don't want to block this and maybe this is no longer relevant based on #8645 (comment) but maybe we could change this to look like this. Happy to discuss this in a separate follow up issue.

Collapsed Expanded
providers-collapsed providers-expadned

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removing from in progress, let me know if there's any more design feedback needed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gtsiolis Sorry I dropped the ball here - will ping you once I pick it back up!

</Property>}
</div>
</div>
</div>
<WorkspaceSearch user={user} />
Expand Down
7 changes: 7 additions & 0 deletions components/gitpod-db/src/typeorm/user-db-impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,13 @@ export class TypeORMUserDBImpl implements UserDB {
return qBuilder.getOne();
}

public async findAuthProviderIdsOfUser(userId: string): Promise<Identity[]> {
const repo = await this.getIdentitiesRepo();
const queryBuilder = repo.createQueryBuilder('identity')
.where('identity.userId', { userId });
return queryBuilder.getMany();
}

public async findAllGitpodTokensOfUser(userId: string): Promise<GitpodToken[]> {
const repo = await this.getGitpodTokenRepo()
const qBuilder = repo.createQueryBuilder('gitpodToken')
Expand Down
10 changes: 10 additions & 0 deletions components/gitpod-db/src/user-db.spec.db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,16 @@ const WRONG_ID = '123'; // no uuid
expect(r1).to.be.not.undefined;
expect(r1!.name).to.be.eq("XYZ");
}

@test(timeout(10000))
public async findAuthProviderIdsByUserId() {
let user = await this.db.newUser();
user.identities.push(this.IDENTITY1);
user = await this.db.storeUser(user);

const identity = await this.db.findAuthProviderIdsOfUser(user.id);
expect(identity[0].authProviderId).to.eq("GitHub");
}
}

namespace TestData {
Expand Down
1 change: 1 addition & 0 deletions components/gitpod-db/src/user-db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ export interface UserDB extends OAuthUserRepository, OAuthTokenRepository {

findUserByGitpodToken(tokenHash: string, tokenType?: GitpodTokenType): Promise<{ user: User, token: GitpodToken } | undefined>;
findGitpodTokensOfUser(userId: string, tokenHash: string): Promise<GitpodToken | undefined>;
findAuthProviderIdsOfUser(userId: string): Promise<Identity[]>;
findAllGitpodTokensOfUser(userId: string): Promise<GitpodToken[]>;
storeGitpodToken(token: GitpodToken & { user: DBUser }): Promise<void>;
deleteGitpodToken(tokenHash: string): Promise<void>;
Expand Down
3 changes: 2 additions & 1 deletion components/gitpod-protocol/src/admin-protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* See License-AGPL.txt in the project root for license information.
*/

import { User, Workspace, NamedWorkspaceFeatureFlag } from "./protocol";
import { User, Workspace, NamedWorkspaceFeatureFlag, Identity } from "./protocol";
import { FindPrebuildsParams } from "./gitpod-service";
import { Project, Team, PrebuildWithStatus, TeamMemberInfo, TeamMemberRole } from "./teams-projects-protocol"
import { WorkspaceInstance, WorkspaceInstancePhase } from "./workspace-instance";
Expand All @@ -17,6 +17,7 @@ export interface AdminServer {
adminGetUser(id: string): Promise<User>;
adminBlockUser(req: AdminBlockUserRequest): Promise<User>;
adminDeleteUser(id: string): Promise<void>;
adminGetAuthProviderIdsOfUser(userId: string): Promise<Identity[]>;
adminModifyRoleOrPermission(req: AdminModifyRoleOrPermissionRequest): Promise<User>;
adminModifyPermanentWorkspaceFeatureFlag(req: AdminModifyPermanentWorkspaceFeatureFlagRequest): Promise<User>;

Expand Down
10 changes: 9 additions & 1 deletion components/server/ee/src/workspace/gitpod-server-impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import { injectable, inject } from "inversify";
import { GitpodServerImpl, traceAPIParams, traceWI, censor } from "../../../src/workspace/gitpod-server-impl";
import { TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing";
import { GitpodServer, GitpodClient, AdminGetListRequest, User, Team, TeamMemberInfo, AdminGetListResult, Permission, AdminBlockUserRequest, AdminModifyRoleOrPermissionRequest, RoleOrPermission, AdminModifyPermanentWorkspaceFeatureFlagRequest, UserFeatureSettings, AdminGetWorkspacesRequest, WorkspaceAndInstance, GetWorkspaceTimeoutResult, WorkspaceTimeoutDuration, WorkspaceTimeoutValues, SetWorkspaceTimeoutResult, WorkspaceContext, CreateWorkspaceMode, WorkspaceCreationResult, PrebuiltWorkspaceContext, CommitContext, PrebuiltWorkspace, WorkspaceInstance, EduEmailDomain, ProviderRepository, Queue, PrebuildWithStatus, CreateProjectParams, Project, StartPrebuildResult, ClientHeaderFields, Workspace, FindPrebuildsParams, TeamMemberRole } from "@gitpod/gitpod-protocol";
import { GitpodServer, GitpodClient, AdminGetListRequest, User, Team, TeamMemberInfo, AdminGetListResult, Permission, AdminBlockUserRequest, AdminModifyRoleOrPermissionRequest, RoleOrPermission, AdminModifyPermanentWorkspaceFeatureFlagRequest, UserFeatureSettings, AdminGetWorkspacesRequest, WorkspaceAndInstance, GetWorkspaceTimeoutResult, WorkspaceTimeoutDuration, WorkspaceTimeoutValues, SetWorkspaceTimeoutResult, WorkspaceContext, CreateWorkspaceMode, WorkspaceCreationResult, PrebuiltWorkspaceContext, CommitContext, PrebuiltWorkspace, WorkspaceInstance, EduEmailDomain, ProviderRepository, Queue, PrebuildWithStatus, CreateProjectParams, Project, StartPrebuildResult, ClientHeaderFields, Workspace, FindPrebuildsParams, TeamMemberRole, Identity } from "@gitpod/gitpod-protocol";
import { ResponseError } from "vscode-jsonrpc";
import { TakeSnapshotRequest, AdmissionLevel, ControlAdmissionRequest, StopWorkspacePolicy, DescribeWorkspaceRequest, SetTimeoutRequest } from "@gitpod/ws-manager/lib";
import { ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
Expand Down Expand Up @@ -489,6 +489,14 @@ export class GitpodServerEEImpl extends GitpodServerImpl {
}
}

async adminGetAuthProviderIdsOfUser(ctx: TraceContext, userId: string): Promise<Identity[]> {
traceAPIParams(ctx, { userId });
this.requireEELicense(Feature.FeatureAdminDashboard);
await this.guardAdminAccess("adminGetAuthProviderIdsOfUser", { userId }, Permission.ADMIN_USERS);

return await this.userDB.findAuthProviderIdsOfUser(userId);
}

async adminModifyRoleOrPermission(ctx: TraceContext, req: AdminModifyRoleOrPermissionRequest): Promise<User> {
traceAPIParams(ctx, { req });

Expand Down
1 change: 1 addition & 0 deletions components/server/src/auth/rate-limiter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ function getConfig(config: RateLimiterConfig): RateLimiterConfig {
"adminGetUser": { group: "default", points: 1 },
"adminBlockUser": { group: "default", points: 1 },
"adminDeleteUser": { group: "default", points: 1 },
"adminGetAuthProviderIdsOfUser": { group: "default", points: 1 },
"adminModifyRoleOrPermission": { group: "default", points: 1 },
"adminModifyPermanentWorkspaceFeatureFlag": { group: "default", points: 1 },
"adminGetTeams": { group: "default", points: 1 },
Expand Down
6 changes: 5 additions & 1 deletion components/server/src/workspace/gitpod-server-impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import { DownloadUrlRequest, DownloadUrlResponse, UploadUrlRequest, UploadUrlResponse } from '@gitpod/content-service/lib/blobs_pb';
import { AppInstallationDB, UserDB, UserMessageViewsDB, WorkspaceDB, DBWithTracing, TracedWorkspaceDB, DBGitpodToken, DBUser, UserStorageResourcesDB, TeamDB, InstallationAdminDB, ProjectDB } from '@gitpod/gitpod-db/lib';
import { AuthProviderEntry, AuthProviderInfo, CommitContext, Configuration, CreateWorkspaceMode, DisposableCollection, GetWorkspaceTimeoutResult, GitpodClient as GitpodApiClient, GitpodServer, GitpodToken, GitpodTokenType, InstallPluginsParams, PermissionName, PortVisibility, PrebuiltWorkspace, PrebuiltWorkspaceContext, PreparePluginUploadParams, ResolvedPlugins, ResolvePluginsParams, SetWorkspaceTimeoutResult, StartPrebuildContext, StartWorkspaceResult, Terms, Token, UninstallPluginParams, User, UserEnvVar, UserEnvVarValue, UserInfo, WhitelistedRepository, Workspace, WorkspaceContext, WorkspaceCreationResult, WorkspaceImageBuild, WorkspaceInfo, WorkspaceInstance, WorkspaceInstancePort, WorkspaceInstanceUser, WorkspaceTimeoutDuration, GuessGitTokenScopesParams, GuessedGitTokenScopes, Team, TeamMemberInfo, TeamMembershipInvite, CreateProjectParams, Project, ProviderRepository, TeamMemberRole, WithDefaultConfig, FindPrebuildsParams, PrebuildWithStatus, StartPrebuildResult, ClientHeaderFields, Permission, SnapshotContext } from '@gitpod/gitpod-protocol';
import { AuthProviderEntry, AuthProviderInfo, CommitContext, Configuration, CreateWorkspaceMode, DisposableCollection, GetWorkspaceTimeoutResult, GitpodClient as GitpodApiClient, GitpodServer, GitpodToken, GitpodTokenType, InstallPluginsParams, PermissionName, PortVisibility, PrebuiltWorkspace, PrebuiltWorkspaceContext, PreparePluginUploadParams, ResolvedPlugins, ResolvePluginsParams, SetWorkspaceTimeoutResult, StartPrebuildContext, StartWorkspaceResult, Terms, Token, UninstallPluginParams, User, UserEnvVar, UserEnvVarValue, UserInfo, WhitelistedRepository, Workspace, WorkspaceContext, WorkspaceCreationResult, WorkspaceImageBuild, WorkspaceInfo, WorkspaceInstance, WorkspaceInstancePort, WorkspaceInstanceUser, WorkspaceTimeoutDuration, GuessGitTokenScopesParams, GuessedGitTokenScopes, Team, TeamMemberInfo, TeamMembershipInvite, CreateProjectParams, Project, ProviderRepository, TeamMemberRole, WithDefaultConfig, FindPrebuildsParams, PrebuildWithStatus, StartPrebuildResult, ClientHeaderFields, Permission, SnapshotContext, Identity } from '@gitpod/gitpod-protocol';
import { AccountStatement } from "@gitpod/gitpod-protocol/lib/accounting-protocol";
import { AdminBlockUserRequest, AdminGetListRequest, AdminGetListResult, AdminGetWorkspacesRequest, AdminModifyPermanentWorkspaceFeatureFlagRequest, AdminModifyRoleOrPermissionRequest, WorkspaceAndInstance } from '@gitpod/gitpod-protocol/lib/admin-protocol';
import { GetLicenseInfoResult, LicenseFeature, LicenseValidationResult } from '@gitpod/gitpod-protocol/lib/license-protocol';
Expand Down Expand Up @@ -2171,6 +2171,10 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
throw new ResponseError(ErrorCodes.EE_FEATURE, `Admin support is implemented in Gitpod's Enterprise Edition`);
}

async adminGetAuthProviderIdsOfUser(ctx: TraceContext, userId: string): Promise<Identity[]> {
throw new ResponseError(ErrorCodes.EE_FEATURE, `Admin support is implemented in Gitpod's Enterprise Edition`);
}

async adminModifyRoleOrPermission(ctx: TraceContext, req: AdminModifyRoleOrPermissionRequest): Promise<User> {
throw new ResponseError(ErrorCodes.EE_FEATURE, `Admin support is implemented in Gitpod's Enterprise Edition`);
}
Expand Down