Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 54055a2

Browse files
authored
Merge pull request #450 from gets0ul/issue_447
Refresh owner user/copilot Gitlab access token automatically when needed
2 parents e82f6c6 + 131b236 commit 54055a2

File tree

4 files changed

+19
-13
lines changed

4 files changed

+19
-13
lines changed

src/common/constants.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ const GITLAB_MAX_PER_PAGE = Number.MAX_SAFE_INTEGER;
4343
// the access level can be: 10 - GUEST, 20 - REPORTER, 30 - DEVELOPER, 40 - MASTER, 50 - OWNER
4444
const GITLAB_DEFAULT_GROUP_ACCESS_LEVEL = 30;
4545

46-
// The Gitlab access token default expiration in seconds
47-
const GITLAB_ACCESS_TOKEN_DEFAULT_EXPIRATION = 3600 * 24 * 14;
46+
// The Gitlab access token default expiration in seconds (2 hours expiration)
47+
const GITLAB_ACCESS_TOKEN_DEFAULT_EXPIRATION = 3600 * 2;
4848

49-
// The Gitlab refresh token time in seconds before expiration
49+
// The Gitlab refresh token time in seconds before expiration (5 minute before expiration)
5050
const GITLAB_REFRESH_TOKEN_BEFORE_EXPIRATION = 300;
5151

5252
const GITHUB_OWNER_CALLBACK_URL = '/api/v1/github/owneruser/callback';

src/controllers/GitlabController.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ async function listOwnerUserGroups(req) {
102102
if (!user || !user.accessToken) {
103103
throw new errors.UnauthorizedError('You have not setup for Gitlab.');
104104
}
105-
return await GitlabService.listOwnerUserGroups(user.accessToken, req.query.page, req.query.perPage, req.query.getAll);
105+
const refreshedUser = await GitlabService.refreshGitlabUserAccessToken(user);
106+
return await GitlabService.listOwnerUserGroups(refreshedUser.accessToken, req.query.page,
107+
req.query.perPage, req.query.getAll);
106108
}
107109

108110
/**
@@ -175,7 +177,7 @@ async function addUserToGroupCallback(req, res) {
175177
throw new errors.NotFoundError('The owner user is not found or not accessible.');
176178
}
177179

178-
await GitlabService.refreshGitlabUserAccessToken(ownerUser);
180+
const refreshedOwnerUser = await GitlabService.refreshGitlabUserAccessToken(ownerUser);
179181

180182
// exchange code to get normal user token
181183
const result = await request
@@ -195,15 +197,16 @@ async function addUserToGroupCallback(req, res) {
195197
const token = result.body.access_token;
196198

197199
// get group name
198-
const groupsResult = await GitlabService.listOwnerUserGroups(ownerUser.accessToken, 1, constants.MAX_PER_PAGE, true);
200+
const groupsResult = await GitlabService.listOwnerUserGroups(refreshedOwnerUser.accessToken, 1,
201+
constants.MAX_PER_PAGE, true);
199202
const currentGroup = _.find(groupsResult.groups, (item) => { // eslint-disable-line arrow-body-style
200203
return item.id.toString() === group.groupId.toString();
201204
});
202205

203206
// add user to group
204207
const gitlabUser = await GitlabService.addGroupMember(
205208
group.groupId,
206-
ownerUser.accessToken,
209+
refreshedOwnerUser.accessToken,
207210
token,
208211
group.accessLevel,
209212
group.expiredAt);
@@ -265,11 +268,12 @@ async function deleteUsersFromTeam(req, res) {
265268
if (!ownerUser) {
266269
throw new errors.NotFoundError('The owner user is not found or not accessible.');
267270
}
268-
await GitlabService.refreshGitlabUserAccessToken(ownerUser);
271+
const refreshedOwnerUser = await GitlabService.refreshGitlabUserAccessToken(ownerUser);
269272
const userGroupMappings = await dbHelper.scan(UserGroupMapping, {groupId});
270273
// eslint-disable-next-line no-restricted-syntax
271274
for (const userGroupMapItem of userGroupMappings) {
272-
await GitlabService.deleteUserFromGitlabGroup(ownerUser.accessToken, groupId, userGroupMapItem.gitlabUserId);
275+
await GitlabService.deleteUserFromGitlabGroup(refreshedOwnerUser.accessToken, groupId,
276+
userGroupMapItem.gitlabUserId);
273277
await dbHelper.removeById(UserGroupMapping, userGroupMapItem.id);
274278
}
275279
} catch (err) {

src/models/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ if (config.DYNAMODB.AWS_ACCESS_KEY_ID) {
1818
dynamoose.AWS.config.update(dynamooseConfig);
1919

2020
if (config.DYNAMODB.IS_LOCAL === 'true') {
21-
dynamoose.local();
21+
dynamoose.local(config.DYNAMODB.URL);
2222
}
2323

2424
dynamoose.setDefaults({

src/services/GitlabService.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,11 @@ getUserIdByUsername.schema = Joi.object().keys({
262262
/**
263263
* Refresh the owner user access token if needed
264264
* @param {Object} gitlabOwner the gitlab owner
265+
* @returns {Promise} the promise result of owner user with refreshed token
265266
*/
266267
async function refreshGitlabUserAccessToken(gitlabOwner) {
267-
if (gitlabOwner.accessTokenExpiration && gitlabOwner.accessTokenExpiration.getTime() <=
268-
new Date().getTime() + constants.GITLAB_REFRESH_TOKEN_BEFORE_EXPIRATION * MS_PER_SECOND) {
268+
if (gitlabOwner.accessTokenExpiration && new Date().getTime() > gitlabOwner.accessTokenExpiration.getTime() -
269+
(constants.GITLAB_REFRESH_TOKEN_BEFORE_EXPIRATION * MS_PER_SECOND)) {
269270
const refreshTokenResult = await request
270271
.post('https://gitlab.com/oauth/token')
271272
.query({
@@ -278,12 +279,13 @@ async function refreshGitlabUserAccessToken(gitlabOwner) {
278279
.end();
279280
// save user token data
280281
const expiresIn = refreshTokenResult.body.expires_in || constants.GITLAB_ACCESS_TOKEN_DEFAULT_EXPIRATION;
281-
await dbHelper.update(User, gitlabOwner.id, {
282+
return await dbHelper.update(User, gitlabOwner.id, {
282283
accessToken: refreshTokenResult.body.access_token,
283284
accessTokenExpiration: new Date(new Date().getTime() + expiresIn * MS_PER_SECOND),
284285
refreshToken: refreshTokenResult.body.refresh_token,
285286
});
286287
}
288+
return gitlabOwner;
287289
}
288290

289291
refreshGitlabUserAccessToken.schema = Joi.object().keys({

0 commit comments

Comments
 (0)