From 4634b8d2d1a318ee79c29608776f53cb7e01c2c9 Mon Sep 17 00:00:00 2001 From: tdurieux Date: Mon, 6 Feb 2023 08:05:49 +0100 Subject: [PATCH] fix: user correct token to access repositories as admin --- public/partials/admin/queues.htm | 6 +++++ src/routes/repository-private.ts | 44 ++++++++++++++++++++++++++++---- src/source/GitHubStream.ts | 3 +++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/public/partials/admin/queues.htm b/public/partials/admin/queues.htm index 81fca85..db7dee2 100644 --- a/public/partials/admin/queues.htm +++ b/public/partials/admin/queues.htm @@ -60,6 +60,9 @@ > Retry + + Edit + @@ -131,6 +134,9 @@ > Retry + + Edit + diff --git a/src/routes/repository-private.ts b/src/routes/repository-private.ts index 8ff2033..09047ca 100644 --- a/src/routes/repository-private.ts +++ b/src/routes/repository-private.ts @@ -10,16 +10,38 @@ import AnonymizedRepositoryModel from "../database/anonymizedRepositories/anonym import config from "../../config"; import { IAnonymizedRepositoryDocument } from "../database/anonymizedRepositories/anonymizedRepositories.types"; import Repository from "../Repository"; +import UserModel from "../database/users/users.model"; import ConferenceModel from "../database/conference/conferences.model"; import AnonymousError from "../AnonymousError"; import { downloadQueue, removeQueue } from "../queue"; import RepositoryModel from "../database/repositories/repositories.model"; +import User from "../User"; const router = express.Router(); // user needs to be connected for all user API router.use(ensureAuthenticated); +async function getTokenForAdmin(user: User, req: express.Request) { + if (user.isAdmin) { + try { + const existingRepo = await AnonymizedRepositoryModel.findOne( + { + "source.repositoryName": `${req.params.owner}/${req.params.repo}`, + }, + { + "source.accessToken": 1, + } + ).exec(); + if (existingRepo) { + return existingRepo.source.accessToken; + } + } catch (error) { + console.log(error); + } + } +} + // claim a repository router.post("/claim", async (req: express.Request, res: express.Response) => { const user = await getUser(req); @@ -135,11 +157,15 @@ router.get( "/:owner/:repo/", async (req: express.Request, res: express.Response) => { const user = await getUser(req); + let token = user.accessToken; + if (user.isAdmin) { + token = (await getTokenForAdmin(user, req)) || token; + } try { const repo = await getRepositoryFromGitHub({ owner: req.params.owner, repo: req.params.repo, - accessToken: user.accessToken, + accessToken: token, }); res.json(repo.toJSON()); } catch (error) { @@ -152,15 +178,19 @@ router.get( "/:owner/:repo/branches", async (req: express.Request, res: express.Response) => { const user = await getUser(req); + let token = user.accessToken; + if (user.isAdmin) { + token = (await getTokenForAdmin(user, req)) || token; + } try { const repository = await getRepositoryFromGitHub({ - accessToken: user.accessToken, + accessToken: token, owner: req.params.owner, repo: req.params.repo, }); return res.json( await repository.branches({ - accessToken: user.accessToken, + accessToken: token, force: req.query.force == "1", }) ); @@ -175,11 +205,15 @@ router.get( async (req: express.Request, res: express.Response) => { try { const user = await getUser(req); + let token = user.accessToken; + if (user.isAdmin) { + token = (await getTokenForAdmin(user, req)) || token; + } const repo = await getRepositoryFromGitHub({ owner: req.params.owner, repo: req.params.repo, - accessToken: user.accessToken, + accessToken: token, }); if (!repo) { throw new AnonymousError("repo_not_found", { @@ -189,7 +223,7 @@ router.get( } return res.send( await repo.readme({ - accessToken: user.accessToken, + accessToken: token, force: req.query.force == "1", branch: req.query.branch as string, }) diff --git a/src/source/GitHubStream.ts b/src/source/GitHubStream.ts index 115bbc9..3447bd7 100644 --- a/src/source/GitHubStream.ts +++ b/src/source/GitHubStream.ts @@ -152,6 +152,9 @@ export default class GitHubStream extends GitHubBase implements SourceBase { }, depth = 0 ) { + console.log( + `sha ${sha}, countFiles: ${count.file} countRequest: ${count.request}, parentPath: "${parentPath}"` + ); count.request++; const data = await this.getGHTree(sha, { recursive: false }); this.tree2Tree(data.tree, truncatedTree, parentPath);