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

89 lines
2.7 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExecAuth = void 0;
const execa = require("execa");
class ExecAuth {
constructor() {
this.tokenCache = {};
this.execFn = execa.sync;
}
isAuthProvider(user) {
if (!user) {
return false;
}
if (user.exec) {
return true;
}
if (!user.authProvider) {
return false;
}
return (user.authProvider.name === 'exec' || !!(user.authProvider.config && user.authProvider.config.exec));
}
async applyAuthentication(user, opts) {
const credential = this.getCredential(user);
if (!credential) {
return;
}
if (credential.status.clientCertificateData) {
opts.cert = credential.status.clientCertificateData;
}
if (credential.status.clientKeyData) {
opts.key = credential.status.clientKeyData;
}
const token = this.getToken(credential);
if (token) {
if (!opts.headers) {
opts.headers = [];
}
opts.headers.Authorization = `Bearer ${token}`;
}
}
getToken(credential) {
if (!credential) {
return null;
}
if (credential.status.token) {
return credential.status.token;
}
return null;
}
getCredential(user) {
// TODO: Add a unit test for token caching.
const cachedToken = this.tokenCache[user.name];
if (cachedToken) {
const date = Date.parse(cachedToken.status.expirationTimestamp);
if (date > Date.now()) {
return cachedToken;
}
this.tokenCache[user.name] = null;
}
let exec = null;
if (user.authProvider && user.authProvider.config) {
exec = user.authProvider.config.exec;
}
if (user.exec) {
exec = user.exec;
}
if (!exec) {
return null;
}
if (!exec.command) {
throw new Error('No command was specified for exec authProvider!');
}
let opts = {};
if (exec.env) {
const env = process.env;
exec.env.forEach((elt) => (env[elt.name] = elt.value));
opts = { ...opts, env };
}
const result = this.execFn(exec.command, exec.args, opts);
if (result.exitCode === 0) {
const obj = JSON.parse(result.stdout);
this.tokenCache[user.name] = obj;
return obj;
}
throw new Error(result.stderr);
}
}
exports.ExecAuth = ExecAuth;
//# sourceMappingURL=exec_auth.js.map