/** * Copyright (c) 2020 Gitpod GmbH. All rights reserved. * Licensed under the GNU Affero General Public License (AGPL). * See License.AGPL.txt in the project root for license information. */ import { GitpodToken, GitpodTokenType, Identity, IdentityLookup, SSHPublicKeyValue, Token, TokenEntry, User, UserEnvVar, UserEnvVarValue, UserSSHPublicKey, } from "@gitpod/gitpod-protocol"; import { OAuthTokenRepository, OAuthUserRepository } from "@jmondi/oauth2-server"; import { Repository } from "typeorm"; import { DBUser } from "./typeorm/entity/db-user"; import { TransactionalDB } from "./typeorm/transactional-db-impl"; export type MaybeUser = User | undefined; export const UserDB = Symbol("UserDB"); export interface UserDB extends OAuthUserRepository, OAuthTokenRepository, TransactionalDB { newUser(): Promise; storeUser(newUser: User): Promise; updateUserPartial(partial: PartialUserUpdate): Promise; findUserById(id: string): Promise; findUserByIdentity(identity: IdentityLookup): Promise; /** * Gets the number of users. * * @param excludeBuiltinUsers substract the builtin-users from the count (currently only the user builtin-workspace-prober), true by default */ getUserCount(excludeBuiltinUsers?: boolean): Promise; getUserRepo(): Promise>; /** * stores the given token and marks any existing tokens in that identity deleted. * * @param identity * @param token */ storeSingleToken(identity: Pick, token: Token): Promise; /** * adds the given token to the identity * * @param identity * @param token */ addToken(identity: Pick, token: Token): Promise; /** * Will mark tokens for the given identity as deleted. * * @param identity * @param shouldDelete optional predicate to suppress deletion of certain entries */ deleteTokens(identity: Identity, shouldDelete?: (entry: TokenEntry) => boolean): Promise; /** * Find TokenEntry by id * * @param uid */ findTokenEntryById(uid: string): Promise; /** * Delete TokenEntry by id * * @param uid */ deleteTokenEntryById(uid: string): Promise; /** * Delete expired TokenEntries * * @param date All tokens with an expiry date before (older than) this ISO8601 formatted date are considered expired and will be deleted. */ deleteExpiredTokenEntries(date: string): Promise; /** * Update TokenEntry by id * * @param tokenEntry */ updateTokenEntry(tokenEntry: Partial & Pick): Promise; /** * @param identity * @throws an error when there is more than one token */ findTokenForIdentity(identity: Identity): Promise; /** * * @param identity * @param includeDeleted whether deleted tokens should be returned as well */ findTokensForIdentity(identity: Identity, includeDeleted?: boolean): Promise; /** * returns all users using the same email * * @param email */ findUsersByEmail(email: string): Promise; findEnvVar(userId: string, envVar: UserEnvVarValue): Promise; addEnvVar(userId: string, envVar: UserEnvVarValue): Promise; updateEnvVar(userId: string, envVar: Partial): Promise; deleteEnvVar(envVar: UserEnvVar): Promise; getEnvVars(userId: string): Promise; // User SSH Keys hasSSHPublicKey(userId: string): Promise; getSSHPublicKeys(userId: string): Promise; addSSHPublicKey(userId: string, value: SSHPublicKeyValue): Promise; deleteSSHPublicKey(userId: string, id: string): Promise; findAllUsers( offset: number, limit: number, orderBy: keyof User, orderDir: "ASC" | "DESC", searchTerm?: string, minCreationDate?: Date, maxCreationDate?: Date, excludeBuiltinUsers?: boolean, ): Promise<{ total: number; rows: User[] }>; findUserByName(name: string): Promise; findUserByGitpodToken( tokenHash: string, tokenType?: GitpodTokenType, ): Promise<{ user: User; token: GitpodToken } | undefined>; findGitpodTokensOfUser(userId: string, tokenHash: string): Promise; findAllGitpodTokensOfUser(userId: string): Promise; storeGitpodToken(token: GitpodToken): Promise; deleteGitpodToken(tokenHash: string): Promise; deleteGitpodTokensNamedLike(userId: string, namePattern: string): Promise; countUsagesOfPhoneNumber(phoneNumber: string): Promise; isBlockedPhoneNumber(phoneNumber: string): Promise; findOrgOwnedUser(organizationId: string, email: string): Promise; findUserIdsNotYetMigratedToFgaVersion(fgaRelationshipsVersion: number, limit: number): Promise; } export type PartialUserUpdate = Partial> & Pick; export const BUILTIN_WORKSPACE_PROBE_USER_ID = "builtin-user-workspace-probe-0000000"; export const BUILTIN_WORKSPACE_USER_AGENT_SMITH = "builtin-user-agent-smith-0000000"; // We need a valid UUID for the builtin admin user so that it can authenticate in order to call endpoints for setting up SSO export const BUILTIN_INSTLLATION_ADMIN_USER_ID = "f071bb8e-b5d1-46cf-a436-da03ae63bcd2"; export function isBuiltinUser(userId: string): boolean { return [ BUILTIN_WORKSPACE_PROBE_USER_ID, BUILTIN_WORKSPACE_USER_AGENT_SMITH, BUILTIN_INSTLLATION_ADMIN_USER_ID, ].some((id) => id === userId); }