fix: improve token management

This commit is contained in:
tdurieux
2024-06-18 12:00:45 +02:00
parent 9271332d5b
commit 532c094388
9 changed files with 90 additions and 32 deletions
+53 -20
View File
@@ -29,35 +29,68 @@ export async function getToken(repository: Repository) {
span.setAttribute("repoId", repository.repoId);
try {
// only check the token if the repo has been visited more than one day ago
if (
repository.model.source.accessToken &&
repository.model.lastView > new Date(Date.now() - 1000 * 60 * 60 * 24)
) {
return repository.model.source.accessToken;
}
// if (
// repository.model.source.accessToken &&
// repository.model.lastView > new Date(Date.now() - 1000 * 60 * 60 * 24)
// ) {
// return repository.model.source.accessToken;
// }
if (repository.model.source.accessToken) {
if (await checkToken(repository.model.source.accessToken)) {
return repository.model.source.accessToken;
}
}
if (!repository.owner.model.accessTokens?.github) {
const accessTokens = (
await UserModel.findById(repository.owner.id, {
accessTokens: 1,
})
)?.accessTokens;
if (accessTokens) {
repository.owner.model.accessTokens = accessTokens;
const query = await UserModel.findById(repository.owner.id, {
accessTokens: 1,
accessTokenDates: 1,
});
if (query?.accessTokens) {
repository.owner.model.accessTokens = query.accessTokens;
repository.owner.model.accessTokenDates = query.accessTokenDates;
}
}
if (repository.owner.model.accessTokens?.github) {
const check = await checkToken(
repository.owner.model.accessTokens?.github
);
const ownerAccessToken = repository.owner.model.accessTokens?.github;
if (ownerAccessToken) {
const tokenAge = repository.owner.model.accessTokenDates?.github;
if (!tokenAge || tokenAge < new Date(Date.now() - 1000 * 60 * 60 * 24)) {
const url = `https://api.github.com/applications/${config.CLIENT_ID}/token`;
const headers = {
Accept: "application/vnd.github+json",
"X-GitHub-Api-Version": "2022-11-28",
};
const res = await fetch(url, {
method: "PATCH",
body: JSON.stringify({
access_token: ownerAccessToken,
}),
credentials: "include",
headers: {
...headers,
Authorization:
"Basic " +
Buffer.from(
config.CLIENT_ID + ":" + config.CLIENT_SECRET
).toString("base64"),
},
});
const resBody = (await res.json()) as { token: string };
repository.owner.model.accessTokens.github = resBody.token;
if (!repository.owner.model.accessTokenDates) {
repository.owner.model.accessTokenDates = {
github: new Date(),
};
} else {
repository.owner.model.accessTokenDates.github = new Date();
}
await repository.owner.model.save();
return resBody.token;
}
const check = await checkToken(ownerAccessToken);
if (check) {
repository.model.source.accessToken =
repository.owner.model.accessTokens?.github;
return repository.owner.model.accessTokens?.github;
repository.model.source.accessToken = ownerAccessToken;
return ownerAccessToken;
}
}
return config.GITHUB_TOKEN;
+6 -2
View File
@@ -518,7 +518,11 @@ export default class Repository {
await storage.rm(this.repoId);
this.model.isReseted = true;
if (isConnected) {
await this.model.save();
try {
await this.model.save();
} catch (error) {
console.error("[ERROR] removeCache save", error);
}
}
} finally {
span.end();
@@ -542,7 +546,7 @@ export default class Repository {
}> {
const span = trace
.getTracer("ano-file")
.startSpan("Repository.removeCache");
.startSpan("Repository.computeSize");
span.setAttribute("repoId", this.repoId);
try {
if (this.status !== RepositoryStatus.READY)
+3
View File
@@ -4,6 +4,9 @@ const UserSchema = new Schema({
accessTokens: {
github: { type: String },
},
accessTokenDates: {
github: { type: Date },
},
externalIDs: {
github: { type: String, index: true },
},
+3
View File
@@ -4,6 +4,9 @@ export interface IUser {
accessTokens: {
github: string;
};
accessTokenDates?: {
github: Date;
};
externalIDs: {
github: string;
};