diff --git a/components/dashboard/src/settings/EnvironmentVariables.tsx b/components/dashboard/src/settings/EnvironmentVariables.tsx index 3e5322850b9cdf..d6fcc285c29ed8 100644 --- a/components/dashboard/src/settings/EnvironmentVariables.tsx +++ b/components/dashboard/src/settings/EnvironmentVariables.tsx @@ -80,12 +80,19 @@ function AddEnvVarModal(p: EnvVarModalProps) { } +function sortEnvVars(a: UserEnvVarValue, b: UserEnvVarValue) { + if (a.name === b.name) { + return a.repositoryPattern > b.repositoryPattern ? 1 : -1; + } + return a.name > b.name ? 1 : -1; +} + export default function EnvVars() { const [envVars, setEnvVars] = useState([] as UserEnvVarValue[]); const [currentEnvVar, setCurrentEnvVar] = useState({ name: '', value: '', repositoryPattern: '' } as UserEnvVarValue); const [isAddEnvVarModalVisible, setAddEnvVarModalVisible] = useState(false); const update = async () => { - await getGitpodService().server.getEnvVars().then(r => setEnvVars(r)); + await getGitpodService().server.getAllEnvVars().then(r => setEnvVars(r.sort(sortEnvVars))); } useEffect(() => { diff --git a/components/gitpod-protocol/src/gitpod-service.ts b/components/gitpod-protocol/src/gitpod-service.ts index 7beff194e09432..7f7cba757f5441 100644 --- a/components/gitpod-protocol/src/gitpod-service.ts +++ b/components/gitpod-protocol/src/gitpod-service.ts @@ -107,6 +107,7 @@ export interface GitpodServer extends JsonRpcServer, AdminServer, // user env vars getEnvVars(): Promise; + getAllEnvVars(): Promise; setEnvVar(variable: UserEnvVarValue): Promise; deleteEnvVar(variable: UserEnvVarValue): Promise; diff --git a/components/server/src/auth/rate-limiter.ts b/components/server/src/auth/rate-limiter.ts index 5ee15c3e6de701..23499ef557e5f0 100644 --- a/components/server/src/auth/rate-limiter.ts +++ b/components/server/src/auth/rate-limiter.ts @@ -77,6 +77,7 @@ function readConfig(): RateLimiterConfig { "getUserStorageResource": { group: "default", points: 1 }, "updateUserStorageResource": { group: "default", points: 1 }, "getEnvVars": { group: "default", points: 1 }, + "getAllEnvVars": { group: "default", points: 1 }, "setEnvVar": { group: "default", points: 1 }, "deleteEnvVar": { group: "default", points: 1 }, "getContentBlobUploadUrl": { group: "default", points: 1 }, diff --git a/components/server/src/workspace/gitpod-server-impl.ts b/components/server/src/workspace/gitpod-server-impl.ts index 0f6d03068ce459..c5793b12f502cd 100644 --- a/components/server/src/workspace/gitpod-server-impl.ts +++ b/components/server/src/workspace/gitpod-server-impl.ts @@ -1257,6 +1257,7 @@ export class GitpodServerImpl { const user = this.checkUser("getEnvVars"); const result = new Map(); @@ -1274,6 +1275,24 @@ export class GitpodServerImpl ({ id, name, value, repositoryPattern })); } + // Get all environment variables (unfiltered) + async getAllEnvVars(): Promise { + const user = this.checkUser("getAllEnvVars"); + const result: UserEnvVarValue[] = []; + for (const value of await this.userDB.getEnvVars(user.id)) { + if (!await this.resourceAccessGuard.canAccess({ kind: 'envVar', subject: value }, 'get')) { + continue; + } + result.push({ + id: value.id, + name: value.name, + value: value.value, + repositoryPattern: value.repositoryPattern, + }); + } + return result; + } + async setEnvVar(variable: UserEnvVarValue): Promise { // Note: this operation is per-user only, hence needs no resource guard const user = this.checkUser("setEnvVar");