k2hr3-api
Version:
K2HR3 REST API is K2hdkc based Resource and Roles and policy Rules
199 lines (198 loc) • 8.46 kB
JavaScript
"use strict";
/*
* K2HR3 REST API
*
* Copyright 2018 Yahoo Japan Corporation.
*
* K2HR3 is K2hdkc based Resource and Roles and policy Rules, gathers
* common management information for the cloud.
* K2HR3 can dynamically manage information as "who", "what", "operate".
* These are stored as roles, resources, policies in K2hdkc, and the
* client system can dynamically read and modify these information.
*
* For the full copyright and license information, please view
* the license file that was distributed with this source code.
*
* AUTHOR: Takeshi Nakatani
* CREATE: Tue May 13 2020
* REVISION:
*
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const k2hr3apiutil_1 = __importDefault(require("./k2hr3apiutil"));
const k2hr3cryptutil_1 = __importDefault(require("./k2hr3cryptutil"));
const dbglogging_1 = __importDefault(require("./dbglogging"));
const k2hr3keys_1 = require("./k2hr3keys");
const k2hr3config_1 = require("./k2hr3config");
const apiConf = new k2hr3config_1.r3ApiConfig();
//---------------------------------------------------------
// load userdata templates from config directory
//---------------------------------------------------------
const LoadedExtdataObjs = (() => {
const extdataobjs = {
configs: {},
cryptconfig: null,
kw_role_name: /{{= %K2HR3_ROLE_NAME% }}/g, // Role YRN full path
kw_role_tenant: /{{= %K2HR3_ROLE_TENANT% }}/g, // Tenant YRN full path
kw_role_token: /{{= %K2HR3_ROLE_TOKEN% }}/g, // Role Token
kw_api_uri: /{{= %K2HR3_API_HOST_URI% }}/g, // K2HR3 API server URI(ex. https://localhost:3000)
kw_err_msg: /{{= %K2HR3_ERROR_MSG% }}/g // Error message string when something error occured
};
if (0 < apiConf.getExtdataConfigCount()) {
extdataobjs.configs = apiConf.getAllExtdataConfig();
Object.keys(extdataobjs.configs).forEach(key => {
if (k2hr3apiutil_1.default.isPlainObject(extdataobjs.configs[key]) && k2hr3apiutil_1.default.isSafeString(extdataobjs.configs[key].template)) {
extdataobjs.configs[key].contents = k2hr3apiutil_1.default.readFileContents(extdataobjs.configs[key].template);
}
});
}
extdataobjs.cryptconfig = apiConf.getUserdataCryptConfig();
return extdataobjs;
})();
//---------------------------------------------------------
// Userdata Processing Class
//---------------------------------------------------------
class ExtdataProcess {
_extdataObjs;
//
// Constructor
//
constructor() {
this._extdataObjs = LoadedExtdataObjs;
}
//
// Methods
//
checkSuburi = (key) => {
if (!k2hr3apiutil_1.default.isSafeString(key)) {
dbglogging_1.default.elog('key parameter is empty.');
return false;
}
return k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.configs[key]);
};
checkUserAgent = (agent, key) => {
if (!k2hr3apiutil_1.default.isSafeString(agent)) {
dbglogging_1.default.elog('agent and key parameters are empty.');
return false;
}
if (!k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.configs[key])) {
dbglogging_1.default.elog('unkown key(suburi): ' + JSON.stringify(key));
return false;
}
if (!k2hr3apiutil_1.default.isSafeString(this._extdataObjs.configs[key].useragent)) {
// allow any useragent
return true;
}
return k2hr3apiutil_1.default.compareCaseString(agent, this._extdataObjs.configs[key].useragent);
};
getContentType = (key) => {
if (!k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.configs[key])) {
dbglogging_1.default.elog('unkown key(suburi): ' + JSON.stringify(key));
return null;
}
if (!k2hr3apiutil_1.default.isSafeString(this._extdataObjs.configs[key].contenttype)) {
return 'text/plain';
}
return k2hr3apiutil_1.default.getSafeString(this._extdataObjs.configs[key].contenttype);
};
// [NOTE]
// For the encryption of Role information, the passphrase and the
// algorithm set in userdata are used in common.
// Therefore, Extdata-only encryption is not required, and the
// composite uses the configuratino information of userdata.
//
decryptRoleInfo = (str) => {
if (!k2hr3apiutil_1.default.isSafeString(str)) {
dbglogging_1.default.elog('string parameter is empty.');
return null;
}
if (!k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.cryptconfig)) {
dbglogging_1.default.elog('cryptconfig data is empty.');
return null;
}
const rawData = k2hr3cryptutil_1.default.r3DecryptJSON(str, this._extdataObjs.cryptconfig.passphrase, this._extdataObjs.cryptconfig.algorithm);
if (!k2hr3apiutil_1.default.isValTypeRoleInfo(rawData)) {
return null;
}
return rawData;
};
getExtdata = (roleobj, key) => {
let rolename = '';
let roletenant = '';
let roletoken = '';
let contents = '';
let baseuri = '';
let errorMsg = '';
if (!k2hr3apiutil_1.default.isSafeEntity(roleobj)) {
dbglogging_1.default.elog('role object(role name, role token) parameter is empty.');
errorMsg = 'k2hr3 role information is wrong';
}
else if (!k2hr3apiutil_1.default.isSafeString(roleobj.role)) {
dbglogging_1.default.elog('role name parameter is empty.');
errorMsg = 'k2hr3 role name is empty';
}
else if (!k2hr3apiutil_1.default.isSafeString(roleobj.token)) {
dbglogging_1.default.elog('role token parameter is empty.');
errorMsg = 'k2hr3 role token is empty';
}
else {
rolename = k2hr3apiutil_1.default.getSafeString(roleobj.role);
roletoken = k2hr3apiutil_1.default.getSafeString(roleobj.token);
// Extract tenant yrn full path from role yrn full path
const keys = (0, k2hr3keys_1.getK2hr3Keys)();
const roleptn = new RegExp('^' + keys.MATCH_ANY_TENANT_ROLE); // regex = /^yrn:yahoo:(.*)::(.*):role:(.*)/
const matches = rolename.match(roleptn);
if (k2hr3apiutil_1.default.isNotEmptyArray(matches) && 4 <= matches.length && k2hr3apiutil_1.default.isSafeString(matches[2])) {
roletenant = keys.NO_SERVICE_KEY + k2hr3apiutil_1.default.getSafeString(matches[1]) + '::' + k2hr3apiutil_1.default.getSafeString(matches[2]);
}
}
if (k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.configs[key])) {
const config = this._extdataObjs.configs[key];
if (k2hr3apiutil_1.default.isPlainObject(config)) {
if (k2hr3apiutil_1.default.isSafeString(config.contents)) {
contents = config.contents;
}
if (k2hr3apiutil_1.default.isSafeString(config.baseuri)) {
baseuri = config.baseuri;
}
}
}
//-----------------
// expands templates
//-----------------
let result = null;
if (k2hr3apiutil_1.default.isSafeString(contents)) {
result = contents
.replace(this._extdataObjs.kw_role_name, rolename)
.replace(this._extdataObjs.kw_role_tenant, roletenant)
.replace(this._extdataObjs.kw_role_token, roletoken)
.replace(this._extdataObjs.kw_api_uri, baseuri)
.replace(this._extdataObjs.kw_err_msg, errorMsg);
}
return result;
};
getGzipExtdata = (roleobj, key) => {
// get expanded data
const expanded = this.getExtdata(roleobj, key);
return (k2hr3cryptutil_1.default.r3Gzip(expanded) ?? null);
};
}
//---------------------------------------------------------
// Exports
//---------------------------------------------------------
//
// Class
//
const extdataProcess = ExtdataProcess;
exports.default = extdataProcess;
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: noexpandtab sw=4 ts=4 fdm=marker
* vim<600: noexpandtab sw=4 ts=4
*/