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,704 @@
|
|
|
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: Thu Nov 2 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
|
+
const k2hr3apiutil_1 = __importDefault(require("../lib/k2hr3apiutil"));
|
|
26
|
+
const k2hr3resutil_1 = __importDefault(require("../lib/k2hr3resutil"));
|
|
27
|
+
const k2hr3tokens_1 = __importDefault(require("../lib/k2hr3tokens"));
|
|
28
|
+
const k2hr3dkc_1 = __importDefault(require("../lib/k2hr3dkc"));
|
|
29
|
+
const dbglogging_1 = __importDefault(require("../lib/dbglogging"));
|
|
30
|
+
const express_1 = __importDefault(require("express"));
|
|
31
|
+
const router = express_1.default.Router();
|
|
32
|
+
//
|
|
33
|
+
// Common utility function
|
|
34
|
+
//
|
|
35
|
+
// Create or update service
|
|
36
|
+
//
|
|
37
|
+
// Result null(succeed) or error message(failed)
|
|
38
|
+
//
|
|
39
|
+
const rawCreateServiceTenant = (token_info, token, tenantname, servicename, callback) => {
|
|
40
|
+
if (!k2hr3apiutil_1.default.isFunction(callback)) {
|
|
41
|
+
const error = new Error('callback parameter is wrong : callback=' + JSON.stringify(callback));
|
|
42
|
+
dbglogging_1.default.elog(error.message);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
//
|
|
46
|
+
// Check service name
|
|
47
|
+
//
|
|
48
|
+
if (!k2hr3apiutil_1.default.isSafeString(servicename)) {
|
|
49
|
+
const error = new Error('service name is wrong.');
|
|
50
|
+
dbglogging_1.default.elog(error.message);
|
|
51
|
+
callback(error);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
//
|
|
55
|
+
// Check token
|
|
56
|
+
//
|
|
57
|
+
if (!k2hr3apiutil_1.default.isSafeString(token) ||
|
|
58
|
+
!k2hr3tokens_1.default.isResTypeCheckRoleToken(token_info) ||
|
|
59
|
+
!k2hr3apiutil_1.default.isString(token_info.user)) {
|
|
60
|
+
const error = new Error('specified wrong token or it is not scoped or no tenant.');
|
|
61
|
+
dbglogging_1.default.elog(error.message);
|
|
62
|
+
callback(error);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
//
|
|
66
|
+
// Create service + tenant
|
|
67
|
+
//
|
|
68
|
+
if (token_info.scoped) {
|
|
69
|
+
// [NOTE]
|
|
70
|
+
// The token is scoped to tenant, but if the user exists, we use this token as unscoped.
|
|
71
|
+
// By using as an unscoped token, the following function creates a scoped token inside it.
|
|
72
|
+
// Then this logic will not be affected by deletion (one time) of token.
|
|
73
|
+
//
|
|
74
|
+
k2hr3dkc_1.default.createServiceTenantByScopedToken(tenantname, servicename, token, callback);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
k2hr3dkc_1.default.createServiceTenantByUnscopedToken(tenantname, servicename, token, k2hr3apiutil_1.default.getSafeString(token_info.user), callback);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
//
|
|
81
|
+
// Mountpath : '/v1/acr'
|
|
82
|
+
//
|
|
83
|
+
// POST '/v1/acr/<service>' : post service/tenant on version 1
|
|
84
|
+
// HEADER : X-Auth-Token => Unscoped/Scoped User token or Role Token
|
|
85
|
+
// body : {
|
|
86
|
+
// tenant: => tenant name(when unscoped user token)
|
|
87
|
+
// }
|
|
88
|
+
// response body : result => true/false
|
|
89
|
+
// message => messages
|
|
90
|
+
//
|
|
91
|
+
router.post('/', (req, res, _) => {
|
|
92
|
+
dbglogging_1.default.dlog('CALL:', req.method, req.url, req.baseUrl);
|
|
93
|
+
res.type('application/json; charset=utf-8');
|
|
94
|
+
if (!k2hr3apiutil_1.default.isPlainObject(req) ||
|
|
95
|
+
!k2hr3apiutil_1.default.isSafeString(req.baseUrl)) {
|
|
96
|
+
const result = {
|
|
97
|
+
result: false,
|
|
98
|
+
message: 'POST request is wrong'
|
|
99
|
+
};
|
|
100
|
+
dbglogging_1.default.elog(result.message);
|
|
101
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
//------------------------------
|
|
105
|
+
// check token
|
|
106
|
+
//------------------------------
|
|
107
|
+
const token_result = k2hr3tokens_1.default.checkToken(req, false, true); // (un)scoped user token
|
|
108
|
+
if (!token_result.result) {
|
|
109
|
+
dbglogging_1.default.elog(k2hr3apiutil_1.default.getSafeString(token_result.message));
|
|
110
|
+
const result = {
|
|
111
|
+
result: token_result.result,
|
|
112
|
+
message: k2hr3apiutil_1.default.getSafeString(token_result.message),
|
|
113
|
+
};
|
|
114
|
+
k2hr3resutil_1.default.errResponse(req, res, token_result.status, result);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const token_info = token_result.token_info;
|
|
118
|
+
if (!k2hr3tokens_1.default.isResTypeCheckRoleToken(token_info)) {
|
|
119
|
+
const result = {
|
|
120
|
+
result: false,
|
|
121
|
+
message: 'specified wrong token or it is not scoped user token'
|
|
122
|
+
};
|
|
123
|
+
dbglogging_1.default.elog(result.message);
|
|
124
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
let tenantname;
|
|
128
|
+
if (false === token_info.scoped) {
|
|
129
|
+
//
|
|
130
|
+
// Unscoped user token : need tenant parameter
|
|
131
|
+
//
|
|
132
|
+
if (!k2hr3apiutil_1.default.isPlainObject(req.body) ||
|
|
133
|
+
!k2hr3apiutil_1.default.isSafeString(req.body.tenant)) {
|
|
134
|
+
const result = {
|
|
135
|
+
result: false,
|
|
136
|
+
message: 'Specified unscoped user token, but there is not tenant in body data.'
|
|
137
|
+
};
|
|
138
|
+
dbglogging_1.default.elog(result.message);
|
|
139
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// get user's tenant list
|
|
143
|
+
const tenant_list = k2hr3tokens_1.default.getTenantList(token_info.user);
|
|
144
|
+
if (!k2hr3apiutil_1.default.isArray(tenant_list) || !k2hr3apiutil_1.default.isNotEmptyArray(tenant_list)) {
|
|
145
|
+
const result = {
|
|
146
|
+
result: false,
|
|
147
|
+
message: 'token(' + k2hr3apiutil_1.default.getSafeString(token_result.token) + ') for user (' + k2hr3apiutil_1.default.getSafeString(token_info.user) + ') does not have any tenant.'
|
|
148
|
+
};
|
|
149
|
+
dbglogging_1.default.elog(result.message);
|
|
150
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// check tenant
|
|
154
|
+
if (!k2hr3tokens_1.default.checkTenantInTenantList(tenant_list, req.body.tenant.toLowerCase())) {
|
|
155
|
+
const result = {
|
|
156
|
+
result: false,
|
|
157
|
+
message: 'user (' + k2hr3apiutil_1.default.getSafeString(token_info.user) + ') is not member of tenant(' + k2hr3apiutil_1.default.getSafeString(req.body.tenant) + ').'
|
|
158
|
+
};
|
|
159
|
+
dbglogging_1.default.elog(result.message);
|
|
160
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
tenantname = req.body.tenant.toLowerCase();
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
//
|
|
167
|
+
// Scoped user token : not need tenant parameter
|
|
168
|
+
//
|
|
169
|
+
if (k2hr3apiutil_1.default.isPlainObject(req.body) &&
|
|
170
|
+
k2hr3apiutil_1.default.isSafeString(req.body.tenant)) {
|
|
171
|
+
if (!k2hr3apiutil_1.default.compareCaseString(token_info.tenant, req.body.tenant)) {
|
|
172
|
+
const result = {
|
|
173
|
+
result: false,
|
|
174
|
+
message: 'Specified scoped user token and tenant in body data, but these are not same tenant name.'
|
|
175
|
+
};
|
|
176
|
+
dbglogging_1.default.elog(result.message);
|
|
177
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
tenantname = k2hr3apiutil_1.default.getSafeString(token_info.tenant);
|
|
182
|
+
}
|
|
183
|
+
//------------------------------
|
|
184
|
+
// check service path in url
|
|
185
|
+
//------------------------------
|
|
186
|
+
const requestptn = new RegExp('^/v1/acr/(.*)'); // regex = /^\/v1\/acr\/(.*)/
|
|
187
|
+
const reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
188
|
+
if (!k2hr3apiutil_1.default.isNotEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === k2hr3apiutil_1.default.getSafeString(reqmatchs[1])) {
|
|
189
|
+
const result = {
|
|
190
|
+
result: false,
|
|
191
|
+
message: 'POST request url does not have service name'
|
|
192
|
+
};
|
|
193
|
+
dbglogging_1.default.elog(result.message);
|
|
194
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const servicename = reqmatchs[1].toLowerCase();
|
|
198
|
+
//------------------------------
|
|
199
|
+
// create service + tenant
|
|
200
|
+
//------------------------------
|
|
201
|
+
rawCreateServiceTenant(token_info, (token_result.token ?? null), tenantname, servicename, (error) => {
|
|
202
|
+
if (null !== error) {
|
|
203
|
+
const result = {
|
|
204
|
+
result: false,
|
|
205
|
+
message: error.message
|
|
206
|
+
};
|
|
207
|
+
dbglogging_1.default.elog(result.message);
|
|
208
|
+
k2hr3resutil_1.default.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const result = {
|
|
212
|
+
result: true,
|
|
213
|
+
message: null
|
|
214
|
+
};
|
|
215
|
+
res.status(201); // 201: Created
|
|
216
|
+
res.send(JSON.stringify(result));
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
//
|
|
221
|
+
// Mountpath : '/v1/acr'
|
|
222
|
+
//
|
|
223
|
+
// PUT '/v1/acr/<service>' : post service/tenant on version 1
|
|
224
|
+
// HEADER : X-Auth-Token => Unscoped/Scoped User token or Role Token
|
|
225
|
+
// URL arguments : tenant => tenant name(when unscoped user token)
|
|
226
|
+
// response body : result => true/false
|
|
227
|
+
// message => messages
|
|
228
|
+
//
|
|
229
|
+
router.put('/', (req, res, _) => {
|
|
230
|
+
dbglogging_1.default.dlog('CALL:', req.method, req.url, req.baseUrl);
|
|
231
|
+
res.type('application/json; charset=utf-8');
|
|
232
|
+
if (!k2hr3apiutil_1.default.isPlainObject(req) ||
|
|
233
|
+
!k2hr3apiutil_1.default.isSafeString(req.baseUrl)) {
|
|
234
|
+
const result = {
|
|
235
|
+
result: false,
|
|
236
|
+
message: 'PUT request is wrong'
|
|
237
|
+
};
|
|
238
|
+
dbglogging_1.default.elog(result.message);
|
|
239
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
//------------------------------
|
|
243
|
+
// check token
|
|
244
|
+
//------------------------------
|
|
245
|
+
const token_result = k2hr3tokens_1.default.checkToken(req, false, true); // (un)scoped user token
|
|
246
|
+
if (!token_result.result) {
|
|
247
|
+
dbglogging_1.default.elog(k2hr3apiutil_1.default.getSafeString(token_result.message));
|
|
248
|
+
const result = {
|
|
249
|
+
result: token_result.result,
|
|
250
|
+
message: k2hr3apiutil_1.default.getSafeString(token_result.message),
|
|
251
|
+
};
|
|
252
|
+
k2hr3resutil_1.default.errResponse(req, res, token_result.status, result);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const token_info = token_result.token_info;
|
|
256
|
+
if (!k2hr3tokens_1.default.isResTypeCheckRoleToken(token_info)) {
|
|
257
|
+
const result = {
|
|
258
|
+
result: false,
|
|
259
|
+
message: 'specified wrong token or it is not scoped user token'
|
|
260
|
+
};
|
|
261
|
+
dbglogging_1.default.elog(result.message);
|
|
262
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
let tenantname;
|
|
266
|
+
if (false === token_info.scoped) {
|
|
267
|
+
//
|
|
268
|
+
// Unscoped user token : need tenant parameter
|
|
269
|
+
//
|
|
270
|
+
if (!k2hr3apiutil_1.default.isPlainObject(req.query) ||
|
|
271
|
+
!k2hr3apiutil_1.default.isSafeString(req.query.tenant)) {
|
|
272
|
+
const result = {
|
|
273
|
+
result: false,
|
|
274
|
+
message: 'Specified unscoped user token, but there is not tenant in argument.'
|
|
275
|
+
};
|
|
276
|
+
dbglogging_1.default.elog(result.message);
|
|
277
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// get user's tenant list
|
|
281
|
+
const tenant_list = k2hr3tokens_1.default.getTenantList(token_info.user);
|
|
282
|
+
if (!k2hr3apiutil_1.default.isArray(tenant_list) || !k2hr3apiutil_1.default.isNotEmptyArray(tenant_list)) {
|
|
283
|
+
const result = {
|
|
284
|
+
result: false,
|
|
285
|
+
message: 'token(' + k2hr3apiutil_1.default.getSafeString(token_result.token) + ') for user (' + k2hr3apiutil_1.default.getSafeString(token_info.user) + ') does not have any tenant.'
|
|
286
|
+
};
|
|
287
|
+
dbglogging_1.default.elog(result.message);
|
|
288
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
// check tenant
|
|
292
|
+
if (!k2hr3tokens_1.default.checkTenantInTenantList(tenant_list, req.query.tenant.toLowerCase())) {
|
|
293
|
+
const result = {
|
|
294
|
+
result: false,
|
|
295
|
+
message: 'user (' + k2hr3apiutil_1.default.getSafeString(token_info.user) + ') is not member of tenant(' + k2hr3apiutil_1.default.getSafeString(req.query.tenant) + ').'
|
|
296
|
+
};
|
|
297
|
+
dbglogging_1.default.elog(result.message);
|
|
298
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
tenantname = req.query.tenant.toLowerCase();
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
//
|
|
305
|
+
// Scoped user token : not need tenant parameter
|
|
306
|
+
//
|
|
307
|
+
if (k2hr3apiutil_1.default.isPlainObject(req.body) &&
|
|
308
|
+
k2hr3apiutil_1.default.isSafeString(req.body.tenant)) {
|
|
309
|
+
if (!k2hr3apiutil_1.default.compareCaseString(token_info.tenant, req.body.tenant)) {
|
|
310
|
+
const result = {
|
|
311
|
+
result: false,
|
|
312
|
+
message: 'Specified scoped user token and tenant in body data, but these are not same tenant name.'
|
|
313
|
+
};
|
|
314
|
+
dbglogging_1.default.elog(result.message);
|
|
315
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
tenantname = k2hr3apiutil_1.default.getSafeString(token_info.tenant);
|
|
320
|
+
}
|
|
321
|
+
//------------------------------
|
|
322
|
+
// check service path in url
|
|
323
|
+
//------------------------------
|
|
324
|
+
const requestptn = new RegExp('^/v1/acr/(.*)'); // regex = /^\/v1\/acr\/(.*)/
|
|
325
|
+
const reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
326
|
+
if (!k2hr3apiutil_1.default.isNotEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === k2hr3apiutil_1.default.getSafeString(reqmatchs[1])) {
|
|
327
|
+
const result = {
|
|
328
|
+
result: false,
|
|
329
|
+
message: 'PUT request url does not have service name'
|
|
330
|
+
};
|
|
331
|
+
dbglogging_1.default.elog(result.message);
|
|
332
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const servicename = reqmatchs[1].toLowerCase();
|
|
336
|
+
//------------------------------
|
|
337
|
+
// create service + tenant
|
|
338
|
+
//------------------------------
|
|
339
|
+
rawCreateServiceTenant(token_info, (token_result.token ?? null), tenantname, servicename, (error) => {
|
|
340
|
+
if (null !== error) {
|
|
341
|
+
const result = {
|
|
342
|
+
result: false,
|
|
343
|
+
message: error.message
|
|
344
|
+
};
|
|
345
|
+
dbglogging_1.default.elog(result.message);
|
|
346
|
+
k2hr3resutil_1.default.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
const result = {
|
|
350
|
+
result: true,
|
|
351
|
+
message: null
|
|
352
|
+
};
|
|
353
|
+
res.status(201); // 201: Created
|
|
354
|
+
res.send(JSON.stringify(result));
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
//
|
|
359
|
+
// Utility function for getting Service/Tenant Names
|
|
360
|
+
//
|
|
361
|
+
const rawGetServiceTenantNames = (req, res) => {
|
|
362
|
+
if (!k2hr3apiutil_1.default.isPlainObject(req) ||
|
|
363
|
+
!k2hr3apiutil_1.default.isSafeString(req.baseUrl)) {
|
|
364
|
+
const result = {
|
|
365
|
+
result: false,
|
|
366
|
+
message: 'GET request or url is wrong'
|
|
367
|
+
};
|
|
368
|
+
dbglogging_1.default.elog(result.message);
|
|
369
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
//------------------------------
|
|
373
|
+
// check token
|
|
374
|
+
//------------------------------
|
|
375
|
+
const token_result = k2hr3tokens_1.default.checkToken(req, true, true); // scoped user token
|
|
376
|
+
if (!token_result.result) {
|
|
377
|
+
dbglogging_1.default.elog(k2hr3apiutil_1.default.getSafeString(token_result.message));
|
|
378
|
+
const result = {
|
|
379
|
+
result: token_result.result,
|
|
380
|
+
message: k2hr3apiutil_1.default.getSafeString(token_result.message),
|
|
381
|
+
};
|
|
382
|
+
k2hr3resutil_1.default.errResponse(req, res, token_result.status, result);
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
const token_info = token_result.token_info;
|
|
386
|
+
if (!k2hr3tokens_1.default.isResTypeCheckRoleToken(token_info)) {
|
|
387
|
+
const result = {
|
|
388
|
+
result: false,
|
|
389
|
+
message: 'specified wrong token or it is not scoped user token'
|
|
390
|
+
};
|
|
391
|
+
dbglogging_1.default.elog(result.message);
|
|
392
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
//
|
|
396
|
+
// force remove user token(this is one shot!)
|
|
397
|
+
//
|
|
398
|
+
k2hr3tokens_1.default.removeScopedUserToken(token_result.token ?? undefined);
|
|
399
|
+
//------------------------------
|
|
400
|
+
// check service path in url
|
|
401
|
+
//------------------------------
|
|
402
|
+
const requestptn = new RegExp('^/v1/acr/(.*)'); // regex = /^\/v1\/acr\/(.*)/
|
|
403
|
+
const reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
404
|
+
if (!k2hr3apiutil_1.default.isNotEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === k2hr3apiutil_1.default.getSafeString(reqmatchs[1])) {
|
|
405
|
+
const result = {
|
|
406
|
+
result: false,
|
|
407
|
+
message: 'PUT request url does not have service name'
|
|
408
|
+
};
|
|
409
|
+
dbglogging_1.default.elog(result.message);
|
|
410
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
const servicename = reqmatchs[1].toLowerCase();
|
|
414
|
+
//------------------------------
|
|
415
|
+
// check tenant in service's tenant list
|
|
416
|
+
//------------------------------
|
|
417
|
+
const resobj = k2hr3dkc_1.default.checkTenantInService(servicename, token_info.tenant);
|
|
418
|
+
if (!k2hr3apiutil_1.default.isPlainObject(resobj) || !k2hr3apiutil_1.default.isBoolean(resobj.result) || false === resobj.result) {
|
|
419
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(resobj)) {
|
|
420
|
+
const result = {
|
|
421
|
+
result: false,
|
|
422
|
+
message: 'Could not get service data from checkTenantInService'
|
|
423
|
+
};
|
|
424
|
+
dbglogging_1.default.elog(result.message);
|
|
425
|
+
k2hr3resutil_1.default.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
const result = {
|
|
429
|
+
result: resobj.result,
|
|
430
|
+
message: k2hr3apiutil_1.default.isString(resobj.message) ? resobj.message : 'Could not get error message in response from checkTenantInService'
|
|
431
|
+
};
|
|
432
|
+
dbglogging_1.default.elog(result.message);
|
|
433
|
+
k2hr3resutil_1.default.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
|
|
434
|
+
}
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
//------------------------------
|
|
438
|
+
// make result
|
|
439
|
+
//------------------------------
|
|
440
|
+
const tokeninfo = {
|
|
441
|
+
user: k2hr3apiutil_1.default.getSafeString(token_info.user),
|
|
442
|
+
tenant: k2hr3apiutil_1.default.getSafeString(token_info.tenant),
|
|
443
|
+
service: servicename
|
|
444
|
+
};
|
|
445
|
+
const success_result = {
|
|
446
|
+
result: true,
|
|
447
|
+
message: null,
|
|
448
|
+
tokeninfo: tokeninfo
|
|
449
|
+
};
|
|
450
|
+
dbglogging_1.default.dlog('succeed');
|
|
451
|
+
res.status(200); // 200: OK
|
|
452
|
+
res.send(JSON.stringify(success_result));
|
|
453
|
+
};
|
|
454
|
+
//
|
|
455
|
+
// Utility function for getting Service/Tenant Resources
|
|
456
|
+
//
|
|
457
|
+
const rawGetServiceTenantResources = (req, res) => {
|
|
458
|
+
//------------------------------
|
|
459
|
+
// check request
|
|
460
|
+
//------------------------------
|
|
461
|
+
const sip = k2hr3apiutil_1.default.getClientIpAddress(req);
|
|
462
|
+
if (!k2hr3apiutil_1.default.isPlainObject(req) ||
|
|
463
|
+
!k2hr3apiutil_1.default.isSafeString(req.baseUrl) ||
|
|
464
|
+
!k2hr3apiutil_1.default.isPlainObject(req.query) ||
|
|
465
|
+
!k2hr3apiutil_1.default.isSafeString(req.query.cip) ||
|
|
466
|
+
!k2hr3apiutil_1.default.isSafeString(sip) ||
|
|
467
|
+
!k2hr3apiutil_1.default.isSafeString(req.query.crole) ||
|
|
468
|
+
!k2hr3apiutil_1.default.isSafeString(req.query.srole)) {
|
|
469
|
+
const result = {
|
|
470
|
+
result: false,
|
|
471
|
+
message: 'GET request or parameters are wrong'
|
|
472
|
+
};
|
|
473
|
+
dbglogging_1.default.elog(result.message);
|
|
474
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
//------------------------------
|
|
478
|
+
// port parameters
|
|
479
|
+
//------------------------------
|
|
480
|
+
const cport = k2hr3apiutil_1.default.cvtToNumber(req.query.cport);
|
|
481
|
+
const sport = k2hr3apiutil_1.default.cvtToNumber(req.query.sport);
|
|
482
|
+
//------------------------------
|
|
483
|
+
// cuk parameters
|
|
484
|
+
//------------------------------
|
|
485
|
+
const ccuk = k2hr3apiutil_1.default.isString(req.query.ccuk) ? req.query.ccuk : null;
|
|
486
|
+
const scuk = k2hr3apiutil_1.default.isString(req.query.scuk) ? req.query.scuk : null;
|
|
487
|
+
//------------------------------
|
|
488
|
+
// check service path in url
|
|
489
|
+
//------------------------------
|
|
490
|
+
const requestptn = new RegExp('^/v1/acr/(.*)'); // regex = /^\/v1\/acr\/(.*)/
|
|
491
|
+
const reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
492
|
+
if (!k2hr3apiutil_1.default.isNotEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === k2hr3apiutil_1.default.getSafeString(reqmatchs[1])) {
|
|
493
|
+
const result = {
|
|
494
|
+
result: false,
|
|
495
|
+
message: 'PUT request url does not have service name'
|
|
496
|
+
};
|
|
497
|
+
dbglogging_1.default.elog(result.message);
|
|
498
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
const servicename = reqmatchs[1].toLowerCase();
|
|
502
|
+
//------------------------------
|
|
503
|
+
// Get ACR resources
|
|
504
|
+
//------------------------------
|
|
505
|
+
const resource_result = k2hr3dkc_1.default.getServiceTenantResources(servicename, sip, sport, scuk, req.query.srole, req.query.cip, cport, ccuk, req.query.crole);
|
|
506
|
+
if (!k2hr3apiutil_1.default.isPlainObject(resource_result) || !k2hr3apiutil_1.default.isBoolean(resource_result.result) || false === resource_result.result) {
|
|
507
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(resource_result)) {
|
|
508
|
+
const result = {
|
|
509
|
+
result: false,
|
|
510
|
+
message: 'Could not get ACR resources from getServiceTenantResources'
|
|
511
|
+
};
|
|
512
|
+
dbglogging_1.default.elog(result.message);
|
|
513
|
+
k2hr3resutil_1.default.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
const result = {
|
|
517
|
+
result: resource_result.result,
|
|
518
|
+
message: k2hr3apiutil_1.default.isString(resource_result.message) ? resource_result.message : 'Could not get error message in response from getServiceTenantResources'
|
|
519
|
+
};
|
|
520
|
+
dbglogging_1.default.elog(result.message);
|
|
521
|
+
k2hr3resutil_1.default.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
|
|
522
|
+
}
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
dbglogging_1.default.dlog('succeed : ' + JSON.stringify(resource_result));
|
|
526
|
+
res.status(200); // 200: OK
|
|
527
|
+
res.send(JSON.stringify(resource_result));
|
|
528
|
+
};
|
|
529
|
+
//
|
|
530
|
+
// Mountpath : '/v1/acr'
|
|
531
|
+
//
|
|
532
|
+
// GET '/v1/acr/<service>' : get service/tenant names on version 1
|
|
533
|
+
// HEADER : X-Auth-Token => Scoped User token
|
|
534
|
+
// response body : result => true/false
|
|
535
|
+
// message => messages
|
|
536
|
+
// tokeninfo => user/tenant information for verify
|
|
537
|
+
//
|
|
538
|
+
// tokeninfo = {
|
|
539
|
+
// user: : <user name> => user name string
|
|
540
|
+
// tenant: : <tenant name> => tenant name string
|
|
541
|
+
// service: : <service name> => service name string
|
|
542
|
+
// }
|
|
543
|
+
//
|
|
544
|
+
//
|
|
545
|
+
// GET '/v1/acr/<service>' : get resource proxying service on version 1
|
|
546
|
+
// URL argument :
|
|
547
|
+
// "cip" : <IP address> => client IP address(client peer address to service) gave by service
|
|
548
|
+
// "cport" : <port> => client port number specified by client(proxied by service)
|
|
549
|
+
// this value is optional
|
|
550
|
+
// "ccuk" : <cuk string> => client container unique key
|
|
551
|
+
// this value is optional
|
|
552
|
+
// "sport" : <port> => service port number specified by service
|
|
553
|
+
// this value is optional
|
|
554
|
+
// "scuk" : <cuk string> => service container unique key
|
|
555
|
+
// this value is optional
|
|
556
|
+
// "crole" : <role yrn> => client role full yrn specified by client(proxied by service)
|
|
557
|
+
// "srole" : <role yrn> => service role full yrn
|
|
558
|
+
//
|
|
559
|
+
// response body : result => true/false
|
|
560
|
+
// message => messages
|
|
561
|
+
// resource => following format
|
|
562
|
+
//
|
|
563
|
+
// response = [ => allowed null/undefined, this object is the result of verify from service at creating service/tenant
|
|
564
|
+
// {
|
|
565
|
+
// name : <resource name> => resource name which is key name(path) for resource
|
|
566
|
+
// expire : <expire> => undefined/null or integer
|
|
567
|
+
// type : <resource type> => resource data type(string or object), if date is null or '', this value must be string.
|
|
568
|
+
// data : <resource data> => resource data which must be string or object or null/undefined.
|
|
569
|
+
// keys = { : <resource keys> => resource has keys(associative array), or null/undefined.
|
|
570
|
+
// 'foo': bar,: => any value is allowed
|
|
571
|
+
// ...
|
|
572
|
+
// }
|
|
573
|
+
// },
|
|
574
|
+
// ...
|
|
575
|
+
// ]
|
|
576
|
+
//
|
|
577
|
+
router.get('/', (req, res, next) => {
|
|
578
|
+
dbglogging_1.default.dlog('CALL:', req.method, req.url);
|
|
579
|
+
if ('GET' !== req.method) {
|
|
580
|
+
// HEAD request comes here, so it should be routed to head function.
|
|
581
|
+
next();
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
res.type('application/json; charset=utf-8');
|
|
585
|
+
//------------------------------
|
|
586
|
+
// check request type
|
|
587
|
+
//------------------------------
|
|
588
|
+
if (k2hr3tokens_1.default.hasAuthTokenHeader(req)) {
|
|
589
|
+
//
|
|
590
|
+
// Get service/tenant name
|
|
591
|
+
//
|
|
592
|
+
rawGetServiceTenantNames(req, res);
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
//
|
|
596
|
+
// Get resources for service/tenant
|
|
597
|
+
//
|
|
598
|
+
rawGetServiceTenantResources(req, res);
|
|
599
|
+
}
|
|
600
|
+
});
|
|
601
|
+
//
|
|
602
|
+
// Mountpath : '/v1/acr/*'
|
|
603
|
+
//
|
|
604
|
+
// DELETE '/v1/acr/<service>' : delete service tenant on version 1
|
|
605
|
+
// HEADER : X-Auth-Token => Scoped User token
|
|
606
|
+
// response body : result => true/false
|
|
607
|
+
//
|
|
608
|
+
router.delete('/', (req, res, _) => {
|
|
609
|
+
dbglogging_1.default.dlog('CALL:', req.method, req.url, req.baseUrl);
|
|
610
|
+
res.type('application/json; charset=utf-8');
|
|
611
|
+
if (!k2hr3apiutil_1.default.isPlainObject(req) ||
|
|
612
|
+
!k2hr3apiutil_1.default.isSafeString(req.baseUrl)) {
|
|
613
|
+
const result = {
|
|
614
|
+
result: false,
|
|
615
|
+
message: 'DELETE request or url is wrong'
|
|
616
|
+
};
|
|
617
|
+
dbglogging_1.default.elog(result.message);
|
|
618
|
+
k2hr3resutil_1.default.errResponse(req, res, 400); // 400: Bad Request
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
//------------------------------
|
|
622
|
+
// check token
|
|
623
|
+
//------------------------------
|
|
624
|
+
const token_result = k2hr3tokens_1.default.checkToken(req, true, true); // scoped user token
|
|
625
|
+
if (!token_result.result) {
|
|
626
|
+
dbglogging_1.default.elog(k2hr3apiutil_1.default.getSafeString(token_result.message));
|
|
627
|
+
const result = {
|
|
628
|
+
result: token_result.result,
|
|
629
|
+
message: k2hr3apiutil_1.default.getSafeString(token_result.message),
|
|
630
|
+
};
|
|
631
|
+
k2hr3resutil_1.default.errResponse(req, res, token_result.status, result);
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
const token_info = token_result.token_info;
|
|
635
|
+
if (!k2hr3tokens_1.default.isResTypeCheckRoleToken(token_info) ||
|
|
636
|
+
!k2hr3apiutil_1.default.isSafeString(token_info.tenant) ||
|
|
637
|
+
!k2hr3apiutil_1.default.isSafeString(token_info.user)) {
|
|
638
|
+
const result = {
|
|
639
|
+
result: false,
|
|
640
|
+
message: 'specified wrong token or it is not scoped user token'
|
|
641
|
+
};
|
|
642
|
+
dbglogging_1.default.elog(result.message);
|
|
643
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
const tenantname = token_info.tenant;
|
|
647
|
+
const user = token_info.user;
|
|
648
|
+
//------------------------------
|
|
649
|
+
// check service path in url
|
|
650
|
+
//------------------------------
|
|
651
|
+
const requestptn = new RegExp('^/v1/acr/(.*)'); // regex = /^\/v1\/acr\/(.*)/
|
|
652
|
+
const reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
653
|
+
if (!k2hr3apiutil_1.default.isNotEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === k2hr3apiutil_1.default.getSafeString(reqmatchs[1])) {
|
|
654
|
+
const result = {
|
|
655
|
+
result: false,
|
|
656
|
+
message: 'DELETE request url does not have service name'
|
|
657
|
+
};
|
|
658
|
+
dbglogging_1.default.elog(result.message);
|
|
659
|
+
k2hr3resutil_1.default.errResponse(req, res, 400, result); // 400: Bad Request
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
const servicename = reqmatchs[1].toLowerCase();
|
|
663
|
+
//------------------------------
|
|
664
|
+
// remove service + tenant
|
|
665
|
+
//------------------------------
|
|
666
|
+
const rm_result = k2hr3dkc_1.default.removeServiceTenant(user, tenantname, servicename);
|
|
667
|
+
if (!k2hr3apiutil_1.default.isPlainObject(rm_result) || !k2hr3apiutil_1.default.isBoolean(rm_result.result) || false === rm_result.result) {
|
|
668
|
+
if (!k2hr3apiutil_1.default.isSafeEntity(rm_result)) {
|
|
669
|
+
const result = {
|
|
670
|
+
result: false,
|
|
671
|
+
message: 'Could not get response from removeServiceTenant'
|
|
672
|
+
};
|
|
673
|
+
dbglogging_1.default.elog(result.message);
|
|
674
|
+
k2hr3resutil_1.default.errResponse(req, res, 403); // 403: Forbidden(is this status OK?)
|
|
675
|
+
}
|
|
676
|
+
else {
|
|
677
|
+
const result = {
|
|
678
|
+
result: rm_result.result,
|
|
679
|
+
message: k2hr3apiutil_1.default.isString(rm_result.message) ? rm_result.message : 'Could not get error message in response from removeServiceTenant'
|
|
680
|
+
};
|
|
681
|
+
dbglogging_1.default.elog(result.message);
|
|
682
|
+
k2hr3resutil_1.default.errResponse(req, res, 403); // 403: Forbidden(is this status OK?)
|
|
683
|
+
}
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
dbglogging_1.default.dlog('succeed : ' + rm_result.message);
|
|
687
|
+
res.status(204); // 204: No Content
|
|
688
|
+
res.send();
|
|
689
|
+
});
|
|
690
|
+
//---------------------------------------------------------
|
|
691
|
+
// Exports
|
|
692
|
+
//---------------------------------------------------------
|
|
693
|
+
//
|
|
694
|
+
// Functions
|
|
695
|
+
//
|
|
696
|
+
exports.default = router;
|
|
697
|
+
/*
|
|
698
|
+
* Local variables:
|
|
699
|
+
* tab-width: 4
|
|
700
|
+
* c-basic-offset: 4
|
|
701
|
+
* End:
|
|
702
|
+
* vim600: noexpandtab sw=4 ts=4 fdm=marker
|
|
703
|
+
* vim<600: noexpandtab sw=4 ts=4
|
|
704
|
+
*/
|