fix: improve getToken

This commit is contained in:
tdurieux
2023-02-15 19:22:11 +01:00
parent 99f837c3cf
commit fb9bbe105a
3 changed files with 37 additions and 20 deletions
@@ -17,6 +17,7 @@ const AnonymizedRepositorySchema = new Schema({
accessToken: String, accessToken: String,
owner: { owner: {
type: Schema.Types.ObjectId, type: Schema.Types.ObjectId,
ref: "user",
index: true, index: true,
}, },
conference: String, conference: String,
+13 -2
View File
@@ -17,6 +17,7 @@ import { downloadQueue, removeQueue } from "../queue";
import RepositoryModel from "../database/repositories/repositories.model"; import RepositoryModel from "../database/repositories/repositories.model";
import User from "../User"; import User from "../User";
import { RepositoryStatus } from "../types"; import { RepositoryStatus } from "../types";
import { IUserDocument } from "../database/users/users.types";
const router = express.Router(); const router = express.Router();
@@ -34,8 +35,18 @@ async function getTokenForAdmin(user: User, req: express.Request) {
"source.accessToken": 1, "source.accessToken": 1,
owner: 1, owner: 1,
} }
).exec(); ).populate({
if (existingRepo && existingRepo.owner != user.id) { path: "owner",
model: UserModel,
});
const user: IUserDocument = existingRepo?.owner as any;
if (user instanceof UserModel) {
const check = await GitHubBase.checkToken(user.accessTokens.github);
if (check) {
return user.accessTokens.github;
}
}
if (existingRepo) {
return existingRepo.source.accessToken; return existingRepo.source.accessToken;
} }
} catch (error) { } catch (error) {
+23 -18
View File
@@ -6,6 +6,7 @@ import Repository from "../Repository";
import { Readable } from "stream"; import { Readable } from "stream";
import UserModel from "../database/users/users.model"; import UserModel from "../database/users/users.model";
import AnonymousError from "../AnonymousError"; import AnonymousError from "../AnonymousError";
import { Octokit } from "@octokit/rest";
export default abstract class GitHubBase { export default abstract class GitHubBase {
type: "GitHubDownload" | "GitHubStream" | "Zip"; type: "GitHubDownload" | "GitHubStream" | "Zip";
@@ -54,28 +55,32 @@ export default abstract class GitHubBase {
}); });
} }
static async checkToken(token: string) {
const octokit = new Octokit({ auth: token });
try {
await octokit.users.getAuthenticated();
return true;
} catch (error) {
return false;
}
}
async getToken() { async getToken() {
const user = await UserModel.findById(this.repository.owner.id); const user = await UserModel.findById(this.repository.owner.id);
if (user && user.accessTokens.github) { if (user && user.accessTokens.github) {
return user.accessTokens.github as string; const check = await GitHubBase.checkToken(user.accessTokens.github);
} if (check) {
if (this.accessToken) { this.accessToken = user.accessTokens.github;
try {
// const app = new OAuthApp({
// clientType: "github-app",
// clientId: config.CLIENT_ID,
// clientSecret: config.CLIENT_SECRET,
// });
// await app.checkToken({
// token: this.accessToken,
// });
return this.accessToken; return this.accessToken;
} catch (error) {
console.debug("[ERROR] Token is invalid", this.repository.repoId);
this.accessToken = config.GITHUB_TOKEN;
} }
} }
return config.GITHUB_TOKEN; if (this.accessToken) {
if (await GitHubBase.checkToken(this.accessToken)) {
return this.accessToken;
}
}
this.accessToken = config.GITHUB_TOKEN;
return this.accessToken;
} }
get url() { get url() {
@@ -86,8 +91,8 @@ export default abstract class GitHubBase {
return { return {
type: this.type, type: this.type,
fullName: this.githubRepository.fullName?.toString(), fullName: this.githubRepository.fullName?.toString(),
branch: this.branch.name, branch: this.branch?.name,
commit: this.branch.commit, commit: this.branch?.commit,
}; };
} }
} }