2021-12-07 13:18:08 -05:00

74 lines
2.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AzureAuth = void 0;
const tslib_1 = require("tslib");
const proc = tslib_1.__importStar(require("child_process"));
const jsonpath = tslib_1.__importStar(require("jsonpath-plus"));
class AzureAuth {
isAuthProvider(user) {
if (!user || !user.authProvider) {
return false;
}
return user.authProvider.name === 'azure';
}
async applyAuthentication(user, opts) {
const token = this.getToken(user);
if (token) {
opts.headers.Authorization = `Bearer ${token}`;
}
}
getToken(user) {
const config = user.authProvider.config;
if (this.isExpired(config)) {
this.updateAccessToken(config);
}
return config['access-token'];
}
isExpired(config) {
const token = config['access-token'];
const expiry = config.expiry;
const expiresOn = config['expires-on'];
if (!token) {
return true;
}
if (!expiry && !expiresOn) {
return false;
}
const expiration = expiry ? Date.parse(expiry) : new Date(parseInt(expiresOn, 10));
if (expiration < Date.now()) {
return true;
}
return false;
}
updateAccessToken(config) {
let cmd = config['cmd-path'];
if (!cmd) {
throw new Error('Token is expired!');
}
// Wrap cmd in quotes to make it cope with spaces in path
cmd = `"${cmd}"`;
const args = config['cmd-args'];
if (args) {
cmd = cmd + ' ' + args;
}
// TODO: Cache to file?
// TODO: do this asynchronously
let output;
try {
output = proc.execSync(cmd);
}
catch (err) {
throw new Error('Failed to refresh token: ' + err.message);
}
const resultObj = JSON.parse(output);
const tokenPathKeyInConfig = config['token-key'];
const expiryPathKeyInConfig = config['expiry-key'];
// Format in file is {<query>}, so slice it out and add '$'
const tokenPathKey = '$' + tokenPathKeyInConfig.slice(1, -1);
const expiryPathKey = '$' + expiryPathKeyInConfig.slice(1, -1);
config['access-token'] = jsonpath.JSONPath(tokenPathKey, resultObj);
config.expiry = jsonpath.JSONPath(expiryPathKey, resultObj);
}
}
exports.AzureAuth = AzureAuth;
//# sourceMappingURL=azure_auth.js.map