74 lines
2.5 KiB
JavaScript
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
|