89 lines
2.7 KiB
JavaScript
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
|