k2hr3-api 1.0.42 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/k2hr3-init.sh.templ +4 -4
- package/dist/.gitkeep +0 -0
- package/dist/src/app.js +262 -0
- package/{bin → dist/src/bin}/run.sh +1 -1
- package/dist/src/bin/watcher.js +113 -0
- package/dist/src/bin/www.js +217 -0
- package/dist/src/lib/basicipcheck.js +392 -0
- package/dist/src/lib/cacerts.js +106 -0
- package/dist/src/lib/dbglogging.js +190 -0
- package/dist/src/lib/dummyuserapi.js +719 -0
- package/dist/src/lib/ipwatch.js +354 -0
- package/dist/src/lib/k2hr3acrutil.js +532 -0
- package/dist/src/lib/k2hr3apiutil.js +1444 -0
- package/dist/src/lib/k2hr3cliutil.js +183 -0
- package/dist/src/lib/k2hr3config.js +832 -0
- package/dist/src/lib/k2hr3cryptutil.js +258 -0
- package/dist/src/lib/k2hr3dkc.js +12121 -0
- package/dist/src/lib/k2hr3extdata.js +198 -0
- package/dist/src/lib/k2hr3keys.js +207 -0
- package/dist/src/lib/k2hr3resutil.js +111 -0
- package/dist/src/lib/k2hr3template.js +6546 -0
- package/dist/src/lib/k2hr3tokens.js +2643 -0
- package/dist/src/lib/k2hr3userdata.js +296 -0
- package/dist/src/lib/k8soidc.js +1000 -0
- package/dist/src/lib/openstackapiv2.js +695 -0
- package/dist/src/lib/openstackapiv3.js +932 -0
- package/dist/src/lib/openstackep.js +667 -0
- package/{tests/auto_common.js → dist/src/lib/types.js} +4 -38
- package/dist/src/routes/acr.js +704 -0
- package/dist/src/routes/debugVerify.js +294 -0
- package/dist/src/routes/extdata.js +219 -0
- package/dist/src/routes/list.js +264 -0
- package/dist/src/routes/policy.js +840 -0
- package/dist/src/routes/resource.js +1489 -0
- package/dist/src/routes/role.js +2627 -0
- package/dist/src/routes/service.js +908 -0
- package/dist/src/routes/tenant.js +1141 -0
- package/dist/src/routes/userTokens.js +482 -0
- package/dist/src/routes/userdata.js +212 -0
- package/dist/src/routes/version.js +103 -0
- package/package.json +152 -121
- package/ChangeLog +0 -378
- package/app.js +0 -292
- package/bin/watcher +0 -122
- package/bin/www +0 -180
- package/eslint.config.mjs +0 -68
- package/lib/basicipcheck.js +0 -376
- package/lib/cacerts.js +0 -71
- package/lib/dbglogging.js +0 -151
- package/lib/dummyuserapi.js +0 -766
- package/lib/ipwatch.js +0 -379
- package/lib/k2hr3acrutil.js +0 -516
- package/lib/k2hr3apiutil.js +0 -1494
- package/lib/k2hr3cliutil.js +0 -191
- package/lib/k2hr3config.js +0 -826
- package/lib/k2hr3cryptutil.js +0 -254
- package/lib/k2hr3dkc.js +0 -12632
- package/lib/k2hr3extdata.js +0 -198
- package/lib/k2hr3keys.js +0 -234
- package/lib/k2hr3resutil.js +0 -100
- package/lib/k2hr3template.js +0 -6925
- package/lib/k2hr3tokens.js +0 -2799
- package/lib/k2hr3userdata.js +0 -312
- package/lib/k8soidc.js +0 -1012
- package/lib/openstackapiv2.js +0 -764
- package/lib/openstackapiv3.js +0 -1032
- package/lib/openstackep.js +0 -553
- package/routes/acr.js +0 -738
- package/routes/debugVerify.js +0 -263
- package/routes/extdata.js +0 -232
- package/routes/list.js +0 -270
- package/routes/policy.js +0 -869
- package/routes/resource.js +0 -1441
- package/routes/role.js +0 -2664
- package/routes/service.js +0 -894
- package/routes/tenant.js +0 -1095
- package/routes/userTokens.js +0 -511
- package/routes/userdata.js +0 -218
- package/routes/version.js +0 -108
- package/templ/Dockerfile.templ +0 -71
- package/tests/auto_acr.js +0 -1101
- package/tests/auto_acr_spec.js +0 -79
- package/tests/auto_all_spec.js +0 -142
- package/tests/auto_control_subprocess.sh +0 -243
- package/tests/auto_extdata.js +0 -220
- package/tests/auto_extdata_spec.js +0 -79
- package/tests/auto_init_config_json.sh +0 -275
- package/tests/auto_k2hdkc_server.ini +0 -109
- package/tests/auto_k2hdkc_slave.ini +0 -83
- package/tests/auto_list.js +0 -439
- package/tests/auto_list_spec.js +0 -79
- package/tests/auto_policy.js +0 -1579
- package/tests/auto_policy_spec.js +0 -79
- package/tests/auto_resource.js +0 -10956
- package/tests/auto_resource_spec.js +0 -79
- package/tests/auto_role.js +0 -6150
- package/tests/auto_role_spec.js +0 -79
- package/tests/auto_service.js +0 -770
- package/tests/auto_service_spec.js +0 -79
- package/tests/auto_subprocesses.js +0 -114
- package/tests/auto_template.sh +0 -126
- package/tests/auto_tenant.js +0 -1100
- package/tests/auto_tenant_spec.js +0 -79
- package/tests/auto_token_util.js +0 -219
- package/tests/auto_userdata.js +0 -292
- package/tests/auto_userdata_spec.js +0 -79
- package/tests/auto_usertokens.js +0 -565
- package/tests/auto_usertokens_spec.js +0 -79
- package/tests/auto_version.js +0 -127
- package/tests/auto_version_spec.js +0 -79
- package/tests/auto_watcher.js +0 -157
- package/tests/auto_watcher_spec.js +0 -79
- package/tests/k2hdkc_test.data +0 -986
- package/tests/k2hdkc_test_load.sh +0 -255
- package/tests/k2hr3template_test.js +0 -187
- package/tests/k2hr3template_test.sh +0 -339
- package/tests/k2hr3template_test_async.js +0 -216
- package/tests/k2hr3template_test_template.result +0 -7117
- package/tests/k2hr3template_test_template.txt +0 -3608
- package/tests/k2hr3template_test_vars.js +0 -194
- package/tests/manual_acr_delete.js +0 -143
- package/tests/manual_acr_get.js +0 -297
- package/tests/manual_acr_postput.js +0 -215
- package/tests/manual_allusertenant_get.js +0 -113
- package/tests/manual_extdata_get.js +0 -191
- package/tests/manual_k2hr3keys_get.js +0 -84
- package/tests/manual_list_gethead.js +0 -230
- package/tests/manual_policy_delete.js +0 -132
- package/tests/manual_policy_gethead.js +0 -275
- package/tests/manual_policy_postput.js +0 -297
- package/tests/manual_resource_delete.js +0 -433
- package/tests/manual_resource_gethead.js +0 -423
- package/tests/manual_resource_postput.js +0 -487
- package/tests/manual_role_delete.js +0 -404
- package/tests/manual_role_gethead.js +0 -547
- package/tests/manual_role_postput.js +0 -544
- package/tests/manual_service_delete.js +0 -153
- package/tests/manual_service_gethead.js +0 -178
- package/tests/manual_service_postput.js +0 -348
- package/tests/manual_tenant_delete.js +0 -186
- package/tests/manual_tenant_gethead.js +0 -268
- package/tests/manual_tenant_postput.js +0 -293
- package/tests/manual_test.sh +0 -352
- package/tests/manual_userdata_get.js +0 -173
- package/tests/manual_usertoken_gethead.js +0 -136
- package/tests/manual_usertoken_postput.js +0 -310
- package/tests/manual_version_get.js +0 -127
- package/tests/run_local_test_k2hdkc.sh +0 -174
- package/tests/test.sh +0 -333
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* K2HR3 REST API
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2018 Yahoo Japan Corporation.
|
|
6
|
+
*
|
|
7
|
+
* K2HR3 is K2hdkc based Resource and Roles and policy Rules, gathers
|
|
8
|
+
* common management information for the cloud.
|
|
9
|
+
* K2HR3 can dynamically manage information as "who", "what", "operate".
|
|
10
|
+
* These are stored as roles, resources, policies in K2hdkc, and the
|
|
11
|
+
* client system can dynamically read and modify these information.
|
|
12
|
+
*
|
|
13
|
+
* For the full copyright and license information, please view
|
|
14
|
+
* the license file that was distributed with this source code.
|
|
15
|
+
*
|
|
16
|
+
* AUTHOR: Takeshi Nakatani
|
|
17
|
+
* CREATE: Tue May 13 2020
|
|
18
|
+
* REVISION:
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
const k2hr3apiutil_1 = __importDefault(require("./k2hr3apiutil"));
|
|
26
|
+
const k2hr3cryptutil_1 = __importDefault(require("./k2hr3cryptutil"));
|
|
27
|
+
const dbglogging_1 = __importDefault(require("./dbglogging"));
|
|
28
|
+
const k2hr3keys_1 = require("./k2hr3keys");
|
|
29
|
+
const k2hr3config_1 = require("./k2hr3config");
|
|
30
|
+
const apiConf = new k2hr3config_1.r3ApiConfig();
|
|
31
|
+
//---------------------------------------------------------
|
|
32
|
+
// load userdata templates from config directory
|
|
33
|
+
//---------------------------------------------------------
|
|
34
|
+
const LoadedExtdataObjs = (() => {
|
|
35
|
+
const extdataobjs = {
|
|
36
|
+
configs: {},
|
|
37
|
+
cryptconfig: null,
|
|
38
|
+
kw_role_name: /{{= %K2HR3_ROLE_NAME% }}/g, // Role YRN full path
|
|
39
|
+
kw_role_tenant: /{{= %K2HR3_ROLE_TENANT% }}/g, // Tenant YRN full path
|
|
40
|
+
kw_role_token: /{{= %K2HR3_ROLE_TOKEN% }}/g, // Role Token
|
|
41
|
+
kw_api_uri: /{{= %K2HR3_API_HOST_URI% }}/g, // K2HR3 API server URI(ex. https://localhost:3000)
|
|
42
|
+
kw_err_msg: /{{= %K2HR3_ERROR_MSG% }}/g // Error message string when something error occured
|
|
43
|
+
};
|
|
44
|
+
if (0 < apiConf.getExtdataConfigCount()) {
|
|
45
|
+
extdataobjs.configs = apiConf.getAllExtdataConfig();
|
|
46
|
+
Object.keys(extdataobjs.configs).forEach(key => {
|
|
47
|
+
if (k2hr3apiutil_1.default.isPlainObject(extdataobjs.configs[key]) && k2hr3apiutil_1.default.isSafeString(extdataobjs.configs[key].template)) {
|
|
48
|
+
extdataobjs.configs[key].contents = k2hr3apiutil_1.default.readFileContents(extdataobjs.configs[key].template);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
extdataobjs.cryptconfig = apiConf.getUserdataCryptConfig();
|
|
53
|
+
return extdataobjs;
|
|
54
|
+
})();
|
|
55
|
+
//---------------------------------------------------------
|
|
56
|
+
// Userdata Processing Class
|
|
57
|
+
//---------------------------------------------------------
|
|
58
|
+
class ExtdataProcess {
|
|
59
|
+
_extdataObjs;
|
|
60
|
+
//
|
|
61
|
+
// Constructor
|
|
62
|
+
//
|
|
63
|
+
constructor() {
|
|
64
|
+
this._extdataObjs = LoadedExtdataObjs;
|
|
65
|
+
}
|
|
66
|
+
//
|
|
67
|
+
// Methods
|
|
68
|
+
//
|
|
69
|
+
checkSuburi = (key) => {
|
|
70
|
+
if (!k2hr3apiutil_1.default.isSafeString(key)) {
|
|
71
|
+
dbglogging_1.default.elog('key parameter is empty.');
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.configs[key]);
|
|
75
|
+
};
|
|
76
|
+
checkUserAgent = (agent, key) => {
|
|
77
|
+
if (!k2hr3apiutil_1.default.isSafeString(agent)) {
|
|
78
|
+
dbglogging_1.default.elog('agent and key parameters are empty.');
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.configs[key])) {
|
|
82
|
+
dbglogging_1.default.elog('unkown key(suburi): ' + JSON.stringify(key));
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
if (!k2hr3apiutil_1.default.isSafeString(this._extdataObjs.configs[key].useragent)) {
|
|
86
|
+
// allow any useragent
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
return k2hr3apiutil_1.default.compareCaseString(agent, this._extdataObjs.configs[key].useragent);
|
|
90
|
+
};
|
|
91
|
+
getContentType = (key) => {
|
|
92
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.configs[key])) {
|
|
93
|
+
dbglogging_1.default.elog('unkown key(suburi): ' + JSON.stringify(key));
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
if (!k2hr3apiutil_1.default.isSafeString(this._extdataObjs.configs[key].contenttype)) {
|
|
97
|
+
return 'text/plain';
|
|
98
|
+
}
|
|
99
|
+
return k2hr3apiutil_1.default.getSafeString(this._extdataObjs.configs[key].contenttype);
|
|
100
|
+
};
|
|
101
|
+
// [NOTE]
|
|
102
|
+
// For the encryption of Role information, the passphrase and the
|
|
103
|
+
// algorithm set in userdata are used in common.
|
|
104
|
+
// Therefore, Extdata-only encryption is not required, and the
|
|
105
|
+
// composite uses the configuratino information of userdata.
|
|
106
|
+
//
|
|
107
|
+
decryptRoleInfo = (str) => {
|
|
108
|
+
if (!k2hr3apiutil_1.default.isSafeString(str)) {
|
|
109
|
+
dbglogging_1.default.elog('string parameter is empty.');
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.cryptconfig)) {
|
|
113
|
+
dbglogging_1.default.elog('cryptconfig data is empty.');
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const rawData = k2hr3cryptutil_1.default.r3DecryptJSON(str, this._extdataObjs.cryptconfig.passphrase, this._extdataObjs.cryptconfig.algorithm);
|
|
117
|
+
if (!k2hr3apiutil_1.default.isValTypeRoleInfo(rawData)) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
return rawData;
|
|
121
|
+
};
|
|
122
|
+
getExtdata = (roleobj, key) => {
|
|
123
|
+
let rolename = '';
|
|
124
|
+
let roletenant = '';
|
|
125
|
+
let roletoken = '';
|
|
126
|
+
let contents = '';
|
|
127
|
+
let baseuri = '';
|
|
128
|
+
let errorMsg = '';
|
|
129
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(roleobj)) {
|
|
130
|
+
dbglogging_1.default.elog('role object(role name, role token) parameter is empty.');
|
|
131
|
+
errorMsg = 'k2hr3 role information is wrong';
|
|
132
|
+
}
|
|
133
|
+
else if (!k2hr3apiutil_1.default.isSafeString(roleobj.role)) {
|
|
134
|
+
dbglogging_1.default.elog('role name parameter is empty.');
|
|
135
|
+
errorMsg = 'k2hr3 role name is empty';
|
|
136
|
+
}
|
|
137
|
+
else if (!k2hr3apiutil_1.default.isSafeString(roleobj.token)) {
|
|
138
|
+
dbglogging_1.default.elog('role token parameter is empty.');
|
|
139
|
+
errorMsg = 'k2hr3 role token is empty';
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
rolename = k2hr3apiutil_1.default.getSafeString(roleobj.role);
|
|
143
|
+
roletoken = k2hr3apiutil_1.default.getSafeString(roleobj.token);
|
|
144
|
+
// Extract tenant yrn full path from role yrn full path
|
|
145
|
+
const keys = (0, k2hr3keys_1.getK2hr3Keys)();
|
|
146
|
+
const roleptn = new RegExp('^' + keys.MATCH_ANY_TENANT_ROLE); // regex = /^yrn:yahoo:(.*)::(.*):role:(.*)/
|
|
147
|
+
const matches = rolename.match(roleptn);
|
|
148
|
+
if (k2hr3apiutil_1.default.isNotEmptyArray(matches) && 4 <= matches.length && k2hr3apiutil_1.default.isSafeString(matches[2])) {
|
|
149
|
+
roletenant = keys.NO_SERVICE_KEY + k2hr3apiutil_1.default.getSafeString(matches[1]) + '::' + k2hr3apiutil_1.default.getSafeString(matches[2]);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (k2hr3apiutil_1.default.isSafeEntity(this._extdataObjs.configs[key])) {
|
|
153
|
+
const config = this._extdataObjs.configs[key];
|
|
154
|
+
if (k2hr3apiutil_1.default.isPlainObject(config)) {
|
|
155
|
+
if (k2hr3apiutil_1.default.isSafeString(config.contents)) {
|
|
156
|
+
contents = config.contents;
|
|
157
|
+
}
|
|
158
|
+
if (k2hr3apiutil_1.default.isSafeString(config.baseuri)) {
|
|
159
|
+
baseuri = config.baseuri;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//-----------------
|
|
164
|
+
// expands templates
|
|
165
|
+
//-----------------
|
|
166
|
+
let result = null;
|
|
167
|
+
if (k2hr3apiutil_1.default.isSafeString(contents)) {
|
|
168
|
+
result = contents
|
|
169
|
+
.replace(this._extdataObjs.kw_role_name, rolename)
|
|
170
|
+
.replace(this._extdataObjs.kw_role_tenant, roletenant)
|
|
171
|
+
.replace(this._extdataObjs.kw_role_token, roletoken)
|
|
172
|
+
.replace(this._extdataObjs.kw_api_uri, baseuri)
|
|
173
|
+
.replace(this._extdataObjs.kw_err_msg, errorMsg);
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
};
|
|
177
|
+
getGzipExtdata = (roleobj, key) => {
|
|
178
|
+
// get expanded data
|
|
179
|
+
const expanded = this.getExtdata(roleobj, key);
|
|
180
|
+
return (k2hr3cryptutil_1.default.r3Gzip(expanded) ?? null);
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
//---------------------------------------------------------
|
|
184
|
+
// Exports
|
|
185
|
+
//---------------------------------------------------------
|
|
186
|
+
//
|
|
187
|
+
// Class
|
|
188
|
+
//
|
|
189
|
+
const extdataProcess = ExtdataProcess;
|
|
190
|
+
exports.default = extdataProcess;
|
|
191
|
+
/*
|
|
192
|
+
* Local variables:
|
|
193
|
+
* tab-width: 4
|
|
194
|
+
* c-basic-offset: 4
|
|
195
|
+
* End:
|
|
196
|
+
* vim600: noexpandtab sw=4 ts=4 fdm=marker
|
|
197
|
+
* vim<600: noexpandtab sw=4 ts=4
|
|
198
|
+
*/
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* K2HR3 REST API
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2017 Yahoo Japan Corporation.
|
|
6
|
+
*
|
|
7
|
+
* K2HR3 is K2hdkc based Resource and Roles and policy Rules, gathers
|
|
8
|
+
* common management information for the cloud.
|
|
9
|
+
* K2HR3 can dynamically manage information as "who", "what", "operate".
|
|
10
|
+
* These are stored as roles, resources, policies in K2hdkc, and the
|
|
11
|
+
* client system can dynamically read and modify these information.
|
|
12
|
+
*
|
|
13
|
+
* For the full copyright and license information, please view
|
|
14
|
+
* the license file that was distributed with this source code.
|
|
15
|
+
*
|
|
16
|
+
* AUTHOR: Takeshi Nakatani
|
|
17
|
+
* CREATE: Wed Jun 8 2017
|
|
18
|
+
* REVISION:
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.getK2hr3Keys = void 0;
|
|
26
|
+
const k2hr3apiutil_1 = __importDefault(require("./k2hr3apiutil"));
|
|
27
|
+
const getK2hr3Keys = (user, tenant, service) => {
|
|
28
|
+
const keywords = {
|
|
29
|
+
// common types
|
|
30
|
+
'TYPE_ROLE': 'role',
|
|
31
|
+
'TYPE_RESOURCE': 'resource',
|
|
32
|
+
'TYPE_POLICY': 'policy',
|
|
33
|
+
'TYPE_SERVICE': 'service', // Using in list API
|
|
34
|
+
// common values
|
|
35
|
+
'VALUE_WILDCARD': '*',
|
|
36
|
+
'VALUE_TRUE': 'true',
|
|
37
|
+
'VALUE_FALSE': 'false',
|
|
38
|
+
'VALUE_ENABLE': 'enable',
|
|
39
|
+
'VALUE_DISABLE': 'disable',
|
|
40
|
+
'VALUE_ALLOW': 'allow',
|
|
41
|
+
'VALUE_DENY': 'deny',
|
|
42
|
+
'VALUE_READ': 'read',
|
|
43
|
+
'VALUE_WRITE': 'write',
|
|
44
|
+
'VALUE_ANY_PORT': '*',
|
|
45
|
+
'VALUE_HOST_SEP': ' ',
|
|
46
|
+
'VALUE_HOST_REGSEP': ':',
|
|
47
|
+
'VALUE_HOST_DETAILSEP': ',',
|
|
48
|
+
'VALUE_ANYDATA_TYPE': 'anytype',
|
|
49
|
+
'VALUE_STRING_TYPE': 'string',
|
|
50
|
+
'VALUE_OBJECT_TYPE': 'object',
|
|
51
|
+
'VALUE_KEYS_TYPE': 'keys',
|
|
52
|
+
'VALUE_ALIAS_TYPE': 'aliases',
|
|
53
|
+
'VALUE_EXPIRE_TYPE': 'expire',
|
|
54
|
+
'VALUE_POLICIES_TYPE': 'policies',
|
|
55
|
+
'VALUE_HOSTS_TYPE': 'hosts',
|
|
56
|
+
'VALUE_HOSTNAMES_TYPE': 'hostnames',
|
|
57
|
+
'VALUE_IPS_TYPE': 'ips',
|
|
58
|
+
'VALUE_KEYSTONE_NORMAL': 'kstype_normal',
|
|
59
|
+
'VALUE_KEYSTONE_NOPASS': 'kstype_nopasswd',
|
|
60
|
+
'VALUE_KEYSTONE_SUB': 'kstype_substitute',
|
|
61
|
+
'VALUE_OPENSTACK_V1': 'openstack-auto-v1', // used/set from k2hr3-init.sh
|
|
62
|
+
'VALUE_K8S_V1': 'k8s-auto-v1', // used/set from k2hr3-kube-init.sh
|
|
63
|
+
'VALUE_PREFIX_LOCAL_TENANT': 'local@',
|
|
64
|
+
// common keywords( part of keyname )
|
|
65
|
+
'POLICIES_KW': 'policies',
|
|
66
|
+
'SERVICE_KW': 'service',
|
|
67
|
+
'HOSTS_KW': 'hosts',
|
|
68
|
+
'HOSTS_NAME_KW': 'name',
|
|
69
|
+
'HOSTS_IP_KW': 'ip',
|
|
70
|
+
'KEYS_KW': 'keys',
|
|
71
|
+
'TYPE_KW': 'type',
|
|
72
|
+
'EXPIRE_KW': 'expire',
|
|
73
|
+
'EFFECT_KW': 'effect',
|
|
74
|
+
'ACTION_KW': 'action',
|
|
75
|
+
'RESOURCE_KW': 'resource',
|
|
76
|
+
'CONDITION_KW': 'condition',
|
|
77
|
+
'REFERENCE_KW': 'reference',
|
|
78
|
+
'ID_KW': 'id',
|
|
79
|
+
'ALIAS_KW': '@',
|
|
80
|
+
'URL_KW': 'url',
|
|
81
|
+
'STATUS_KW': 'status',
|
|
82
|
+
'DATE_KW': 'date',
|
|
83
|
+
'SEED_KW': 'seed',
|
|
84
|
+
'ROLE_TOKEN_KW': 'tokens',
|
|
85
|
+
// ACR keywords
|
|
86
|
+
'ACR_POLICY_KW': 'acr-policy',
|
|
87
|
+
'ACR_ROLE_KW': 'acr-role',
|
|
88
|
+
'ACR_RESOURCE_NAME_KEY': 'name',
|
|
89
|
+
'ACR_RESOURCE_EXPIRE_KEY': 'expire',
|
|
90
|
+
'ACR_RESOURCE_TYPE_KEY': 'type',
|
|
91
|
+
'ACR_RESOURCE_DATA_KEY': 'data',
|
|
92
|
+
'ACR_RESOURCE_KEYS_KEY': 'keys',
|
|
93
|
+
// kubernetes cuk keywords
|
|
94
|
+
'K8S_HOST_INCUK_KEY': 'host',
|
|
95
|
+
'K8S_NAMESPACE_INCUK_KEY': 'k8s_namespace',
|
|
96
|
+
'K8S_SA_INCUK_KEY': 'k8s_service_account',
|
|
97
|
+
'K8S_NODENAME_INCUK_KEY': 'k8s_node_name',
|
|
98
|
+
'K8S_NODEIP_INCUK_KEY': 'k8s_node_ip',
|
|
99
|
+
'K8S_PODNAME_INCUK_KEY': 'k8s_pod_name',
|
|
100
|
+
'K8S_PODID_INCUK_KEY': 'k8s_pod_id',
|
|
101
|
+
'K8S_PODIP_INCUK_KEY': 'k8s_pod_ip',
|
|
102
|
+
'K8S_CONTAINERID_INCUK_KEY': 'k8s_container_id',
|
|
103
|
+
'K8S_RAND_INCUK_KEY': 'k8s_k2hr3_rand',
|
|
104
|
+
// common key names
|
|
105
|
+
'YRN_KEY': 'yrn',
|
|
106
|
+
'DOMAIN_KEY': 'yrn:yahoo',
|
|
107
|
+
'NO_SERVICE_KEY': 'yrn:yahoo:',
|
|
108
|
+
'NO_SERVICE_REGION_KEY': 'yrn:yahoo::',
|
|
109
|
+
'NO_SERVICE_TENANT_KEY': 'yrn:yahoo:::',
|
|
110
|
+
'USER_TOP_KEY': 'yrn:yahoo::::user',
|
|
111
|
+
'TOKEN_TOP_KEY': 'yrn:yahoo::::token',
|
|
112
|
+
'TOKEN_USER_TOP_KEY': 'yrn:yahoo::::token:user',
|
|
113
|
+
'TOKEN_ROLE_TOP_KEY': 'yrn:yahoo::::token:role',
|
|
114
|
+
'ACTION_TOP_KEY': 'yrn:yahoo::::action',
|
|
115
|
+
'ACTION_READ_KEY': 'yrn:yahoo::::action:read',
|
|
116
|
+
'ACTION_WRITE_KEY': 'yrn:yahoo::::action:write',
|
|
117
|
+
'KEYSTONE_TOP_KEY': 'yrn:yahoo::::keystone',
|
|
118
|
+
'IAAS_TOP_KEY': 'yrn:yahoo::::iaas',
|
|
119
|
+
'IAAS_OS_TOP_KEY': 'yrn:yahoo::::iaas:openstack',
|
|
120
|
+
'IAAS_K8S_TOP_KEY': 'yrn:yahoo::::iaas:k8s',
|
|
121
|
+
'MASTER_SERVICE_TOP_KEY': 'yrn:yahoo::::service',
|
|
122
|
+
'ANYTENANT_SERVICE_TOP_KEY': 'yrn:yahoo::::service:',
|
|
123
|
+
'ANYTENANT_SERVICE_KEY': 'yrn:yahoo::::service::anytenant',
|
|
124
|
+
// match regex
|
|
125
|
+
'MATCH_ANY_SERVICE_MASTER': 'yrn:yahoo::::service:(.*)',
|
|
126
|
+
'MATCH_ANY_IAAS': 'yrn:yahoo::::iaas:(.*)',
|
|
127
|
+
'MATCH_ANY_IAAS_OS': 'yrn:yahoo::::iaas:openstack:(.*)',
|
|
128
|
+
'MATCH_ANY_IAAS_K8S': 'yrn:yahoo::::iaas:k8s:(.*)',
|
|
129
|
+
'MATCH_ANY_SERVICE_TENANT': 'yrn:yahoo:(.*)::(.*):(.*)',
|
|
130
|
+
'MATCH_ANY_TENANT_MAIN': 'yrn:yahoo:(.*)::(.*)',
|
|
131
|
+
'MATCH_ANY_TENANT_ROLE': 'yrn:yahoo:(.*)::(.*):role:(.*)',
|
|
132
|
+
'MATCH_ANY_TENANT_POLICY': 'yrn:yahoo:(.*)::(.*):policy:(.*)',
|
|
133
|
+
'MATCH_ANY_TENANT_RESOURCE': 'yrn:yahoo:(.*)::(.*):resource:(.*)',
|
|
134
|
+
'MATCH_ANY_TENANT_RES_DATA': 'yrn:yahoo:(.*)::(.*):resource:(.*)', // end of resource name
|
|
135
|
+
'MATCH_NOT_TENANT_RES_DATA': '( |\t|\r|\n|:)', // not match resource data key name
|
|
136
|
+
'MATCH_ANY_TENANT_RES_KEY': 'yrn:yahoo:(.*)::(.*):resource:(.*)/keys/(.*)', // end of resource name/keys/<keyname>
|
|
137
|
+
'MATCH_ANY_HOSTNAME_PORT': 'yrn:yahoo:(.*)::(.*):role:(.*)/hosts/name/(.*) (.*) (.*)',
|
|
138
|
+
'MATCH_ANY_HOSTNAME_KEYS': 'yrn:yahoo:(.*)::(.*):role:(.*)/hosts/name',
|
|
139
|
+
'MATCH_ANY_IP_PORT': 'yrn:yahoo:(.*)::(.*):role:(.*)/hosts/ip/(.*) (.*) (.*)',
|
|
140
|
+
'MATCH_ANY_IP_KEYS': 'yrn:yahoo:(.*)::(.*):role:(.*)/hosts/ip',
|
|
141
|
+
'MATCH_ANY_ALLHOST_KEYS': 'yrn:yahoo:(.*)::(.*):role:(.*)/hosts/all', // This is only used in template variable names, not key name
|
|
142
|
+
'MATCH_ANY_KS_REGION': 'yrn:yahoo::::keystone:(.*)',
|
|
143
|
+
'MATCH_ANY_USER_TOKEN': 'yrn:yahoo::::user:(.*):tenant/(.*)/token/(.*)',
|
|
144
|
+
'MATCH_ANY_ROLE_TOKEN': 'yrn:yahoo::::token:role/(.*)',
|
|
145
|
+
'MATCH_URI_GET_ROLE_DATA': '^/v1/role/(.*)',
|
|
146
|
+
'MATCH_URI_GET_RTOKEN': '^/v1/role/token/(.*)',
|
|
147
|
+
'MATCH_URI_GET_RTOKEN_LIST': '^/v1/role/token/list/(.*)'
|
|
148
|
+
};
|
|
149
|
+
const _user = k2hr3apiutil_1.default.getSafeString(user).toLowerCase();
|
|
150
|
+
const _tenant = k2hr3apiutil_1.default.getSafeString(tenant).toLowerCase();
|
|
151
|
+
const _service = k2hr3apiutil_1.default.getSafeString(service).toLowerCase();
|
|
152
|
+
keywords.SERVICE_TOP_KEY = keywords.NO_SERVICE_KEY + _service; // "yrn:yahoo:<service>"
|
|
153
|
+
keywords.SERVICE_NO_REGION_KEY = keywords.SERVICE_TOP_KEY + ':'; // "yrn:yahoo:<service>:"
|
|
154
|
+
if (k2hr3apiutil_1.default.isSafeString(_service)) {
|
|
155
|
+
keywords.MASTER_SERVICE_KEY = keywords.MASTER_SERVICE_TOP_KEY + ':' + _service; // "yrn:yahoo::::service:<service>"
|
|
156
|
+
keywords.SERVICE_OWNER_KEY = keywords.MASTER_SERVICE_KEY + ':owner'; // "yrn:yahoo::::service:<service>:owner"
|
|
157
|
+
keywords.SERVICE_TENANT_KEY = keywords.MASTER_SERVICE_KEY + ':tenant'; // "yrn:yahoo::::service:<service>:tenant"
|
|
158
|
+
keywords.SERVICE_VERIFY_TENANT_KEY = keywords.MASTER_SERVICE_KEY + ':verify'; // "yrn:yahoo::::service:<service>:verify"
|
|
159
|
+
}
|
|
160
|
+
if (k2hr3apiutil_1.default.isSafeString(_tenant)) {
|
|
161
|
+
// tenant key with service(allowed null)
|
|
162
|
+
keywords.TENANT_TOP_KEY = keywords.SERVICE_NO_REGION_KEY + ':' + _tenant; // "yrn:yahoo:<service>::<tenant>"
|
|
163
|
+
// tenant master key(service is null)
|
|
164
|
+
keywords.MASTER_TENANT_TOP_KEY = keywords.NO_SERVICE_REGION_KEY + ':' + _tenant; // "yrn:yahoo:::<tenant>"
|
|
165
|
+
// tenant description keys(service is null)
|
|
166
|
+
keywords.TENANT_ID_KEY = keywords.MASTER_TENANT_TOP_KEY + ':id'; // "yrn:yahoo:::<tenant>:id"
|
|
167
|
+
keywords.TENANT_DESC_KEY = keywords.MASTER_TENANT_TOP_KEY + ':desc'; // "yrn:yahoo:::<tenant>:desc"
|
|
168
|
+
keywords.TENANT_DISP_KEY = keywords.MASTER_TENANT_TOP_KEY + ':display'; // "yrn:yahoo:::<tenant>:display"
|
|
169
|
+
keywords.TENANT_USER_KEY = keywords.MASTER_TENANT_TOP_KEY + ':user'; // "yrn:yahoo:::<tenant>:user"
|
|
170
|
+
keywords.TENANT_SERVICE_KEY = keywords.MASTER_TENANT_TOP_KEY + ':service'; // "yrn:yahoo:::<tenant>:service"
|
|
171
|
+
// role, resource, policy under tenant with service
|
|
172
|
+
keywords.ROLE_TOP_KEY = keywords.TENANT_TOP_KEY + ':' + 'role'; // "yrn:yahoo:<service>::<tenant>:role"
|
|
173
|
+
keywords.POLICY_TOP_KEY = keywords.TENANT_TOP_KEY + ':' + 'policy'; // "yrn:yahoo:<service>::<tenant>:policy"
|
|
174
|
+
keywords.RESOURCE_TOP_KEY = keywords.TENANT_TOP_KEY + ':' + 'resource'; // "yrn:yahoo:<service>::<tenant>:resource"
|
|
175
|
+
}
|
|
176
|
+
if (k2hr3apiutil_1.default.isSafeString(_user)) {
|
|
177
|
+
keywords.USER_KEY = keywords.USER_TOP_KEY + ':' + _user; // "yrn:yahoo::::user:<user>"
|
|
178
|
+
keywords.USER_ID_KEY = keywords.USER_KEY + ':id'; // "yrn:yahoo::::user:<user>:id"
|
|
179
|
+
keywords.USER_TENANT_TOP_KEY = keywords.USER_KEY + ':tenant'; // "yrn:yahoo::::user:<user>:tenant"
|
|
180
|
+
keywords.USER_TENANT_COMMON_KEY = keywords.USER_TENANT_TOP_KEY + '/'; // "yrn:yahoo::::user:<user>:tenant/"
|
|
181
|
+
keywords.USER_TENANT_UNSCOPE_TOKEN_KEY = keywords.USER_TENANT_COMMON_KEY + '/token'; // "yrn:yahoo::::user:<user>:tenant//token"
|
|
182
|
+
if (k2hr3apiutil_1.default.isSafeString(tenant)) {
|
|
183
|
+
keywords.USER_TENANT_KEY = keywords.USER_TENANT_COMMON_KEY + _tenant; // "yrn:yahoo::::user:<user>:tenant/<tenant>"
|
|
184
|
+
keywords.USER_TENANT_SCOPE_TOKEN_KEY = keywords.USER_TENANT_KEY + '/token'; // "yrn:yahoo::::user:<user>:tenant/<tenant>/token"
|
|
185
|
+
// ambiguous key whether tenant exists or not
|
|
186
|
+
keywords.USER_TENANT_AMBIGUOUS_KEY = keywords.USER_TENANT_KEY; // "yrn:yahoo::::user:<user>:tenant/<tenant>"
|
|
187
|
+
keywords.USER_TENANT_AMBIGUOUS_TOKEN_KEY = keywords.USER_TENANT_SCOPE_TOKEN_KEY; // "yrn:yahoo::::user:<user>:tenant/<tenant>/token"
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
keywords.USER_TENANT_KEY = ''; // ""
|
|
191
|
+
keywords.USER_TENANT_SCOPE_TOKEN_KEY = ''; // ""
|
|
192
|
+
// ambiguous key whether tenant exists or not
|
|
193
|
+
keywords.USER_TENANT_AMBIGUOUS_KEY = keywords.USER_TENANT_COMMON_KEY; // "yrn:yahoo::::user:<user>:tenant/"
|
|
194
|
+
keywords.USER_TENANT_AMBIGUOUS_TOKEN_KEY = keywords.USER_TENANT_UNSCOPE_TOKEN_KEY; // "yrn:yahoo::::user:<user>:tenant//token"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return keywords;
|
|
198
|
+
};
|
|
199
|
+
exports.getK2hr3Keys = getK2hr3Keys;
|
|
200
|
+
/*
|
|
201
|
+
* Local variables:
|
|
202
|
+
* tab-width: 4
|
|
203
|
+
* c-basic-offset: 4
|
|
204
|
+
* End:
|
|
205
|
+
* vim600: noexpandtab sw=4 ts=4 fdm=marker
|
|
206
|
+
* vim<600: noexpandtab sw=4 ts=4
|
|
207
|
+
*/
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* K2HR3 REST API
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2017 Yahoo Japan Corporation.
|
|
6
|
+
*
|
|
7
|
+
* K2HR3 is K2hdkc based Resource and Roles and policy Rules, gathers
|
|
8
|
+
* common management information for the cloud.
|
|
9
|
+
* K2HR3 can dynamically manage information as "who", "what", "operate".
|
|
10
|
+
* These are stored as roles, resources, policies in K2hdkc, and the
|
|
11
|
+
* client system can dynamically read and modify these information.
|
|
12
|
+
*
|
|
13
|
+
* For the full copyright and license information, please view
|
|
14
|
+
* the license file that was distributed with this source code.
|
|
15
|
+
*
|
|
16
|
+
* AUTHOR: Takeshi Nakatani
|
|
17
|
+
* CREATE: Fri Sep 8 2017
|
|
18
|
+
* REVISION:
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.k2hr3resutil = void 0;
|
|
26
|
+
const k2hr3apiutil_1 = __importDefault(require("./k2hr3apiutil"));
|
|
27
|
+
//---------------------------------------------------------
|
|
28
|
+
// Functions
|
|
29
|
+
//---------------------------------------------------------
|
|
30
|
+
const rawSendErrorResponse = (req, res, status, msgbody, strType) => {
|
|
31
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(res) || !k2hr3apiutil_1.default.isSafeEntity(status) || !k2hr3apiutil_1.default.isSafeNumber(status)) {
|
|
32
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(res)) {
|
|
33
|
+
// can do nothing
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
status = 500; // 500: Internal Error
|
|
37
|
+
msgbody = 'Wrong parameters are got.';
|
|
38
|
+
}
|
|
39
|
+
// set response type
|
|
40
|
+
if (k2hr3apiutil_1.default.isSafeString(strType)) {
|
|
41
|
+
res.type(strType);
|
|
42
|
+
}
|
|
43
|
+
// set response status
|
|
44
|
+
res.status(status ?? 500);
|
|
45
|
+
// body message to JSON
|
|
46
|
+
let jsonbody = '';
|
|
47
|
+
if (null !== msgbody) {
|
|
48
|
+
if (k2hr3apiutil_1.default.isString(msgbody)) {
|
|
49
|
+
if (k2hr3apiutil_1.default.checkSimpleJSON(msgbody)) {
|
|
50
|
+
jsonbody = msgbody;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// msgbody is string, but it is not JSON.
|
|
54
|
+
jsonbody = JSON.stringify(msgbody);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
jsonbody = JSON.stringify(msgbody);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// set 'x-k2hr3-error' header
|
|
62
|
+
if (k2hr3apiutil_1.default.isPlainObject(req) &&
|
|
63
|
+
k2hr3apiutil_1.default.isPlainObject(req.headers)) {
|
|
64
|
+
const tmpDbgHead = req.headers['x-k2hr3-debug'];
|
|
65
|
+
if (k2hr3apiutil_1.default.isSafeEntity(tmpDbgHead) &&
|
|
66
|
+
(k2hr3apiutil_1.default.compareCaseString('ON', k2hr3apiutil_1.default.isArray(tmpDbgHead) ? k2hr3apiutil_1.default.getSafeString(tmpDbgHead[0]) : k2hr3apiutil_1.default.getSafeString(tmpDbgHead)) ||
|
|
67
|
+
k2hr3apiutil_1.default.compareCaseString('OK', k2hr3apiutil_1.default.isArray(tmpDbgHead) ? k2hr3apiutil_1.default.getSafeString(tmpDbgHead[0]) : k2hr3apiutil_1.default.getSafeString(tmpDbgHead)) ||
|
|
68
|
+
k2hr3apiutil_1.default.compareCaseString('debug', k2hr3apiutil_1.default.isArray(tmpDbgHead) ? k2hr3apiutil_1.default.getSafeString(tmpDbgHead[0]) : k2hr3apiutil_1.default.getSafeString(tmpDbgHead)) ||
|
|
69
|
+
k2hr3apiutil_1.default.compareCaseString('dbg', k2hr3apiutil_1.default.isArray(tmpDbgHead) ? k2hr3apiutil_1.default.getSafeString(tmpDbgHead[0]) : k2hr3apiutil_1.default.getSafeString(tmpDbgHead)) ||
|
|
70
|
+
k2hr3apiutil_1.default.compareCaseString('1', k2hr3apiutil_1.default.isArray(tmpDbgHead) ? k2hr3apiutil_1.default.getSafeString(tmpDbgHead[0]) : k2hr3apiutil_1.default.getSafeString(tmpDbgHead)) ||
|
|
71
|
+
k2hr3apiutil_1.default.compareCaseString('1', k2hr3apiutil_1.default.isArray(tmpDbgHead) ? k2hr3apiutil_1.default.getSafeString(tmpDbgHead[0]) : k2hr3apiutil_1.default.getSafeString(tmpDbgHead)))) {
|
|
72
|
+
let errheader;
|
|
73
|
+
if (k2hr3apiutil_1.default.isSafeString(jsonbody)) {
|
|
74
|
+
errheader = jsonbody;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
errheader = JSON.stringify({ status: status });
|
|
78
|
+
}
|
|
79
|
+
res.header('x-k2hr3-error', errheader);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// send body
|
|
83
|
+
res.send(jsonbody);
|
|
84
|
+
return true;
|
|
85
|
+
};
|
|
86
|
+
//---------------------------------------------------------
|
|
87
|
+
// Exports
|
|
88
|
+
//---------------------------------------------------------
|
|
89
|
+
exports.k2hr3resutil = {
|
|
90
|
+
//
|
|
91
|
+
// <argument> <default> <note>
|
|
92
|
+
// req request object
|
|
93
|
+
// res response object
|
|
94
|
+
// status status code for error, must be number
|
|
95
|
+
// msgbody null response error body if need
|
|
96
|
+
// strType null response type if need
|
|
97
|
+
//
|
|
98
|
+
errResponse: rawSendErrorResponse
|
|
99
|
+
};
|
|
100
|
+
//
|
|
101
|
+
// Default
|
|
102
|
+
//
|
|
103
|
+
exports.default = exports.k2hr3resutil;
|
|
104
|
+
/*
|
|
105
|
+
* Local variables:
|
|
106
|
+
* tab-width: 4
|
|
107
|
+
* c-basic-offset: 4
|
|
108
|
+
* End:
|
|
109
|
+
* vim600: noexpandtab sw=4 ts=4 fdm=marker
|
|
110
|
+
* vim<600: noexpandtab sw=4 ts=4
|
|
111
|
+
*/
|