diff --git a/deadlock-plugins/deadlock-extension/src/core/api.service.ts b/deadlock-plugins/deadlock-extension/src/core/api.service.ts index 4bbdee7322c2b034ca43bc205b5d856071f40fea..7087949b9710fbdbfc01947357852b9f71fd19c4 100644 --- a/deadlock-plugins/deadlock-extension/src/core/api.service.ts +++ b/deadlock-plugins/deadlock-extension/src/core/api.service.ts @@ -113,17 +113,29 @@ export default class ApiService { } } - getGiteaPublicProperties(): Promise<GiteaPublicProperties> { - return this.axiosInstance.get<GiteaPublicProperties>(`gitea`).then((res) => res.data); + async getGiteaPublicProperties(): Promise<GiteaPublicProperties> { + const res = await this.axiosInstance.get<GiteaPublicProperties>(`gitea`); + return res.data; } - getUserSshKey(): Promise<SshKeyPair> { - return this.axiosInstance.put<SshKeyPair>(`users/gitea/keypair`).then((res) => res.data); + async getUserSshKey(): Promise<SshKeyPair> { + const res = await this.axiosInstance.put<SshKeyPair>(`users/gitea/keypair`); + return res.data; } - getUser(): Promise<User> { - return this.axiosInstance.get<User>(`auth`).then((res) => { - return res.data; - }); + async getCurrentUser(): Promise<User> { + const res = await this.axiosInstance.get<User>(`auth`); + return res.data; + } + + async getUser(userId: string | null): Promise<User> { + if (!userId) return this.getCurrentUser(); + const res = await this.axiosInstance.get<User>(`users/${userId}`); + return res.data; + } + + async getAccessToRepository(userId: string, missionId: string): Promise<any> { + const res = await this.axiosInstance.get<any>(`users/${userId}/missions/${missionId}/repositoryAccess`); + return res.data; } } diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts index 145974603be899716d75a8f23573a9438a25bd52..68c852a62e481a60914a7ec60bfafd1ca5c5bbad 100644 --- a/deadlock-plugins/deadlock-extension/src/core/controller.ts +++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts @@ -46,6 +46,7 @@ export default class Controller { // TODO: Should we follow eslint no-case-declarations ? const missionId = queryParams.get('missionId'); const missionVersion = queryParams.get('missionVersion'); + const userId = queryParams.get('userId'); log('Opening link', uri); switch (action) { @@ -53,7 +54,7 @@ export default class Controller { if (!missionId || !missionVersion) { window.showErrorMessage('Identifiant ou version de la mission incorrect'); } else { - that.launchMission(missionId, missionVersion); + that.launchMission(missionId, missionVersion, userId); } break; @@ -111,7 +112,7 @@ export default class Controller { commands.executeCommand(openUrlInBrowserCommand.cmd, Uri.parse(url)); } - public async launchMission(missionId: string, missionVersion: string) { + public async launchMission(missionId: string, missionVersion: string, userId: string | null) { window.showInformationMessage(`vous lancez la mission ${missionId}`); const hadMissionWorkdir = this.extensionStore.getMissionWorkdir() !== undefined; if (!hadMissionWorkdir) { @@ -128,10 +129,22 @@ export default class Controller { const mission = new Mission(missionId, missionVersion); const missionsWorkdir = this.extensionStore.getMissionWorkdir() ?? ''; - const user: User = await this.apiService.getUser(); + + const currentUser = await this.apiService.getCurrentUser(); + + const user: User = await this.apiService.getUser(userId); + + const response: any = this.apiService.getAccessToRepository(user.id, mission.id); + const giteaPublicProperties: GiteaPublicProperties = await this.apiService.getGiteaPublicProperties(); - const missionDevcontainer = new MissionDevContainer(missionsWorkdir, user, mission, giteaPublicProperties); + const missionDevcontainer = new MissionDevContainer( + missionsWorkdir, + user, + currentUser, + mission, + giteaPublicProperties, + ); window.showInformationMessage( 'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId, diff --git a/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts b/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts index 9759b5e1559f2e1252a1c3a5740dc9beb47e99a9..ce92b124f79d3488b23582f6c3edece7d1a1cc0e 100644 --- a/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts +++ b/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts @@ -1,5 +1,6 @@ import { ExtensionContext, Memento, SecretStorage, window } from 'vscode'; import { extensionLog as log } from '../recorder/utils/log'; +import { removeFiles } from '../recorder/utils/workdir'; export type GlobalStorageType = Memento & { setKeysForSync(keys: readonly string[]): void }; @@ -22,6 +23,7 @@ export default class ExtensionStore { } if (await this.secretStorage.get(StoreKey.AccessTokenKey)) this.secretStorage.delete(StoreKey.AccessTokenKey); if (await this.secretStorage.get(StoreKey.RefreshTokenKey)) this.secretStorage.delete(StoreKey.RefreshTokenKey); + await removeFiles(`${process.env.HOME}/.deadlock/.ssh/id_rsa`, `${process.env.HOME}/.deadlock/.ssh/id_rsa.pub`); } public static getInstance(context?: ExtensionContext): ExtensionStore { diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts index 7de285acbc2014626a17a71bfee2eb2b621027a8..4ff26fba8154b8be68bc5d485243e2a934345926 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts @@ -19,19 +19,26 @@ export class MissionDevContainer { private readonly dockerImageUrl = 'registry.takima.io/deadlock/deadlock-challenges'; private readonly remoteGiteaWorkDir = `/workdir`; - private readonly dirs = { - missionWorkdir: `${this.missionsWorkdir}/${this.mission.id}`, - config: `${this.missionsWorkdir}/${this.mission.id}/.config`, - devcontainer: `${this.missionsWorkdir}/${this.mission.id}/.devcontainer`, - mounted: `${this.missionsWorkdir}/${this.mission.id}/mounted`, - }; + private readonly dirs: { missionWorkdir: string; config: string; devcontainer: string; mounted: string }; constructor( private readonly missionsWorkdir: string, private readonly user: User, + private readonly currentUser: User, private readonly mission: Mission, private readonly giteaProperties: GiteaPublicProperties, - ) {} + ) { + let prefix = `${this.missionsWorkdir}`; + if (this.isReviewingStudent()) { + prefix += `/students/${this.user.details.lastName}_${this.user.details.firstName}-${this.user.id}`; + } + this.dirs = { + missionWorkdir: `${prefix}/${this.mission.id}`, + config: `${prefix}/${this.mission.id}/.config`, + devcontainer: `${prefix}/${this.mission.id}/.devcontainer`, + mounted: `${prefix}/${this.mission.id}/mounted`, + }; + } async open() { if (!this.isInit) { @@ -51,6 +58,10 @@ export class MissionDevContainer { await this.createUserChallengeJsonFile(); } + private isReviewingStudent() { + return this.currentUser.id !== this.user.id; + } + private createUserChallengeJsonFile() { return writeFile( `${this.dirs.config}/user-challenge.json`, @@ -62,7 +73,7 @@ export class MissionDevContainer { email: `${this.user.id.split('-').join('')}@deadlock.io`, missionId: this.mission.id, remoteGitUsername: this.user.id.split('-').join(''), - currentUserDetails: this.user.details, + currentUserDetails: this.currentUser ? this.currentUser.details : this.user.details, remoteUserDetails: this.user.details, }; return JSON.stringify(userChallengeJson, null, 2); diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts index c7de234a5c80bf1c6ec88eb3d3e36e88f710cb59..f528864d7420dd5e566db99a2e0b8517fca89f01 100644 --- a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts +++ b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts @@ -81,3 +81,11 @@ export function copyGitUserFiles(srcPath: string, destPath: string, userId: stri copyFolderIfExistsSync(join(srcPath, '.git'), join(destPath, `user-git-${userId}`)); copyFileIfExistsSync(join(srcPath, '.gitignore'), join(destPath, `user-gitignore-${userId}`)); } + +export async function removeFiles(...paths: string[]) { + for (const path of paths) { + if (existsSync(path)) { + await unlink(path); + } + } +}