k2hr3-api 1.0.42 → 2.0.0
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 +2 -2
- 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
package/routes/tenant.js
DELETED
|
@@ -1,1095 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* K2HR3 REST API
|
|
3
|
-
*
|
|
4
|
-
* Copyright 2023 Yahoo Japan Corporation.
|
|
5
|
-
*
|
|
6
|
-
* K2HR3 is K2hdkc based Resource and Roles and policy Rules, gathers
|
|
7
|
-
* common management information for the cloud.
|
|
8
|
-
* K2HR3 can dynamically manage information as "who", "what", "operate".
|
|
9
|
-
* These are stored as roles, resources, policies in K2hdkc, and the
|
|
10
|
-
* client system can dynamically read and modify these information.
|
|
11
|
-
*
|
|
12
|
-
* For the full copyright and license information, please view
|
|
13
|
-
* the license file that was distributed with this source code.
|
|
14
|
-
*
|
|
15
|
-
* AUTHOR: Takeshi Nakatani
|
|
16
|
-
* CREATE: Mon Sep 3 2023
|
|
17
|
-
* REVISION:
|
|
18
|
-
*
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
'use strict';
|
|
22
|
-
|
|
23
|
-
var express = require('express');
|
|
24
|
-
var router = express.Router();
|
|
25
|
-
|
|
26
|
-
var r3token = require('../lib/k2hr3tokens');
|
|
27
|
-
var apiutil = require('../lib/k2hr3apiutil');
|
|
28
|
-
var resutil = require('../lib/k2hr3resutil');
|
|
29
|
-
var k2hr3 = require('../lib/k2hr3dkc');
|
|
30
|
-
var r3keys = require('../lib/k2hr3keys').getK2hr3Keys;
|
|
31
|
-
|
|
32
|
-
// Debug logging objects
|
|
33
|
-
var r3logger = require('../lib/dbglogging');
|
|
34
|
-
|
|
35
|
-
//=========================================================
|
|
36
|
-
// CAUTION
|
|
37
|
-
//---------------------------------------------------------
|
|
38
|
-
// This note is common to the TENANT API.
|
|
39
|
-
//
|
|
40
|
-
// TENANT API requires User Unscoped Token or User Scoped
|
|
41
|
-
// Token.
|
|
42
|
-
// Note that even if a User Scoped Token is specified, that
|
|
43
|
-
// scoped Tenant will be ignored.
|
|
44
|
-
// To specify the tenant of each API, use URI path or parameter
|
|
45
|
-
// instead of Token.
|
|
46
|
-
// Specify the tenant only by the tenant name, not by the YRN
|
|
47
|
-
// full path.
|
|
48
|
-
//
|
|
49
|
-
//---------------------------------------------------------
|
|
50
|
-
|
|
51
|
-
//=========================================================
|
|
52
|
-
// Common Utility function
|
|
53
|
-
//=========================================================
|
|
54
|
-
//
|
|
55
|
-
// Utility for parsing common input parameters
|
|
56
|
-
//
|
|
57
|
-
// This function parse token(user or role or not have this) from HTTP request(req),
|
|
58
|
-
// and tenant name, etc.
|
|
59
|
-
//
|
|
60
|
-
// return {
|
|
61
|
-
// result: true/false
|
|
62
|
-
// message: null or error message
|
|
63
|
-
// status_code: status code(default 200)
|
|
64
|
-
// parameters: {
|
|
65
|
-
// token_type: null or 'user' or 'role'
|
|
66
|
-
// token_str: token string(if user token or role token)
|
|
67
|
-
// token_info: null or object(returned from checkToken)
|
|
68
|
-
// user_name: null or user name(if user token)
|
|
69
|
-
// tenant_name: null or tenant name in request uri path
|
|
70
|
-
// keys: k2hr3keys object
|
|
71
|
-
// }
|
|
72
|
-
// }
|
|
73
|
-
//
|
|
74
|
-
function rawParseBaseParamInRequest(req)
|
|
75
|
-
{
|
|
76
|
-
var result = {
|
|
77
|
-
result: true,
|
|
78
|
-
message: null,
|
|
79
|
-
status_code: 200
|
|
80
|
-
};
|
|
81
|
-
var parameters = {
|
|
82
|
-
token_type: null,
|
|
83
|
-
token_str: null,
|
|
84
|
-
token_info: null,
|
|
85
|
-
token_tenant: null,
|
|
86
|
-
user_name: null,
|
|
87
|
-
tenant_name: null,
|
|
88
|
-
keys: r3keys() // temporary
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
//
|
|
92
|
-
// check token for API mode
|
|
93
|
-
//
|
|
94
|
-
if(r3token.hasAuthTokenHeader(req)){
|
|
95
|
-
var token_result = r3token.checkToken(req, false, true); // (un)scoped, user
|
|
96
|
-
if(!token_result.result){
|
|
97
|
-
result.result = token_result.result;
|
|
98
|
-
result.message = token_result.message;
|
|
99
|
-
result.status_code = token_result.status;
|
|
100
|
-
r3logger.elog(result.message);
|
|
101
|
-
return result;
|
|
102
|
-
}
|
|
103
|
-
parameters.token_str = token_result.token;
|
|
104
|
-
parameters.token_type = token_result.token_type;
|
|
105
|
-
parameters.token_info = token_result.token_info;
|
|
106
|
-
parameters.user_name = apiutil.getSafeString(parameters.token_info.user);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
//
|
|
110
|
-
// get tenant name from uri
|
|
111
|
-
//
|
|
112
|
-
var requestptn = new RegExp('^/v1/tenant/(.*)'); // regex = /^\/v1\/tenant\/(.*)/
|
|
113
|
-
var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
114
|
-
if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
|
|
115
|
-
parameters.tenant_name = null;
|
|
116
|
-
}else{
|
|
117
|
-
// check tenant name
|
|
118
|
-
if(0 !== reqmatchs[1].indexOf(parameters.keys.VALUE_PREFIX_LOCAL_TENANT)){
|
|
119
|
-
// Not have prefix("local@")
|
|
120
|
-
parameters.tenant_name = parameters.keys.VALUE_PREFIX_LOCAL_TENANT + reqmatchs[1];
|
|
121
|
-
parameters.tenant_name = parameters.tenant_name.toLowerCase();
|
|
122
|
-
}else{
|
|
123
|
-
parameters.tenant_name = reqmatchs[1].toLowerCase();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// keys
|
|
128
|
-
parameters.keys = r3keys(parameters.user_name, parameters.tenant_name);
|
|
129
|
-
|
|
130
|
-
// no error
|
|
131
|
-
result.parameters = parameters;
|
|
132
|
-
|
|
133
|
-
return result;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
//
|
|
137
|
-
// Utility for Create/Update tenant for POST/PUT
|
|
138
|
-
//
|
|
139
|
-
// is_create : true/false
|
|
140
|
-
// user_name : add main user name for tenant
|
|
141
|
-
// tenant_name : tenant name
|
|
142
|
-
// tenant_id : tenant id
|
|
143
|
-
// tenant_desc : tenant description
|
|
144
|
-
// tenant_display : tenant display name
|
|
145
|
-
// tenant_users : other tenant user names
|
|
146
|
-
//
|
|
147
|
-
// result {
|
|
148
|
-
// result: true/false
|
|
149
|
-
// message: error message
|
|
150
|
-
// rescode: 200/201/4xx/5xx
|
|
151
|
-
// }
|
|
152
|
-
//
|
|
153
|
-
function rawCreateUpdateTenant(is_create, user_name, tenant_name, tenant_id, tenant_desc, tenant_display, tenant_users)
|
|
154
|
-
{
|
|
155
|
-
var result = {result: true, message: null, rescode: 200};
|
|
156
|
-
var resobj;
|
|
157
|
-
|
|
158
|
-
if(is_create){
|
|
159
|
-
//
|
|
160
|
-
// Create tenant
|
|
161
|
-
//
|
|
162
|
-
resobj = k2hr3.findTenant(tenant_name);
|
|
163
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeEntity(resobj.result) && true === resobj.result){
|
|
164
|
-
result.result = false;
|
|
165
|
-
result.message = 'failed to create tenant by already tenant(' + tenant_name + ') existed';
|
|
166
|
-
result.rescode = 400;
|
|
167
|
-
r3logger.elog(result.message);
|
|
168
|
-
return result;
|
|
169
|
-
}
|
|
170
|
-
result.rescode = 201; // 201: Created
|
|
171
|
-
}else{
|
|
172
|
-
//
|
|
173
|
-
// Update tenant
|
|
174
|
-
//
|
|
175
|
-
resobj = k2hr3.findTenant(tenant_name, user_name, tenant_id);
|
|
176
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
|
|
177
|
-
result.result = false;
|
|
178
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
179
|
-
result.message = 'failed to update tenant by ' + resobj.message;
|
|
180
|
-
}else{
|
|
181
|
-
result.message = 'failed to update tenant by unknown reason';
|
|
182
|
-
}
|
|
183
|
-
result.rescode = 400;
|
|
184
|
-
r3logger.elog(result.message);
|
|
185
|
-
return result;
|
|
186
|
-
}
|
|
187
|
-
result.rescode = 200; // 200: OK
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
//
|
|
191
|
-
// Create/Update tenant
|
|
192
|
-
//
|
|
193
|
-
resobj = k2hr3.initTenant(tenant_name, tenant_id, tenant_desc, tenant_display, user_name, tenant_users);
|
|
194
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
|
|
195
|
-
result.result = false;
|
|
196
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
197
|
-
result.message = 'failed to create tenant by ' + resobj.message;
|
|
198
|
-
}else{
|
|
199
|
-
result.message = 'failed to create tenant by unknown reason';
|
|
200
|
-
}
|
|
201
|
-
result.rescode = 400;
|
|
202
|
-
r3logger.elog(result.message);
|
|
203
|
-
return result;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return result;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
//=========================================================
|
|
210
|
-
// Router POST
|
|
211
|
-
//=========================================================
|
|
212
|
-
//
|
|
213
|
-
// Mountpath : '/v1/tenant'
|
|
214
|
-
//
|
|
215
|
-
//---------------------------------------------------------
|
|
216
|
-
// [POST] No tenant path
|
|
217
|
-
//---------------------------------------------------------
|
|
218
|
-
// POST '/v1/tenant' : create tenant version 1
|
|
219
|
-
// HEADER : X-Auth-Token = <User token>
|
|
220
|
-
// body : {
|
|
221
|
-
// "tenant": {
|
|
222
|
-
// "name": <tenant> => key is "yrn:yahoo:::<tenant>"
|
|
223
|
-
// thix value type must be string.
|
|
224
|
-
// "desc": <description> => value for "yrn:yahoo:::<tenant>:desc"
|
|
225
|
-
// thix value type must be string.
|
|
226
|
-
// "display": <display name> => key is "yrn:yahoo:::<tenant>:display"
|
|
227
|
-
// thix value type must be string.
|
|
228
|
-
// "users": <user> or [user, ...] => key is "yrn:yahoo::::user:<user>"
|
|
229
|
-
// specify adding user array which is yrn path as "yrn:yahoo::::user:<user>" or "user name"
|
|
230
|
-
// }
|
|
231
|
-
// }
|
|
232
|
-
//
|
|
233
|
-
// response status code : 201 or 4xx/5xx
|
|
234
|
-
// response body : {
|
|
235
|
-
// result: true/false
|
|
236
|
-
// message: messages
|
|
237
|
-
// }
|
|
238
|
-
//
|
|
239
|
-
// Create a tenant as <K2HR3 cluster LOCAL> tenant.
|
|
240
|
-
//
|
|
241
|
-
// [NOTE]
|
|
242
|
-
// If the <K2HR3 cluster LOCAL> tenant already exists, this repsponses an error.
|
|
243
|
-
//
|
|
244
|
-
// Tenant names must start with "local@"(if not set it, this prefix adds automatically).
|
|
245
|
-
// Specify the user by YRN full path or user name.
|
|
246
|
-
// If the user indicated by <User Token> does not exist, it will be added.
|
|
247
|
-
// New tenant id is set automatically.
|
|
248
|
-
//
|
|
249
|
-
//---------------------------------------------------------
|
|
250
|
-
// [POST] With tenant path
|
|
251
|
-
//---------------------------------------------------------
|
|
252
|
-
// POST '/v1/tenant/tenant' : update tenant version 1
|
|
253
|
-
// HEADER : X-Auth-Token = <User token>
|
|
254
|
-
// body : {
|
|
255
|
-
// "tenant": {
|
|
256
|
-
// "id": <id> => key is "yrn:yahoo:::<tenant>:id"
|
|
257
|
-
// this value type must be string.
|
|
258
|
-
// "desc": <description> => value for "yrn:yahoo:::<tenant>:desc"
|
|
259
|
-
// thix value type must be string.
|
|
260
|
-
// "display": <display name> => key is "yrn:yahoo:::<tenant>:display"
|
|
261
|
-
// thix value type must be string.
|
|
262
|
-
// "users": <user> or [user, ...] => key is "yrn:yahoo::::user:<user>"
|
|
263
|
-
// specify adding user array which is yrn path as "yrn:yahoo::::user:<user>" or "user name"
|
|
264
|
-
// }
|
|
265
|
-
// }
|
|
266
|
-
//
|
|
267
|
-
// response status code : 200 or 4xx/5xx
|
|
268
|
-
// response body : {
|
|
269
|
-
// result: true/false
|
|
270
|
-
// message: messages
|
|
271
|
-
// }
|
|
272
|
-
//
|
|
273
|
-
// Update existed tenant as <K2HR3 cluster LOCAL> tenant.
|
|
274
|
-
//
|
|
275
|
-
// [NOTE]
|
|
276
|
-
// If the <K2HR3 cluster LOCAL> tenant does not exist, this repsponses an error.
|
|
277
|
-
// Tenant names must start with "local@"(if not set it, this prefix adds automatically for search).
|
|
278
|
-
// The <User Token> user must be included in the tenant's user list.
|
|
279
|
-
//
|
|
280
|
-
// Specify the user by YRN full path or user name.
|
|
281
|
-
// If the user indicated by <User Token> does not exist, it will be added.
|
|
282
|
-
//
|
|
283
|
-
router.post('/', function(req, res, next) // eslint-disable-line no-unused-vars
|
|
284
|
-
{
|
|
285
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
286
|
-
|
|
287
|
-
res.type('application/json; charset=utf-8');
|
|
288
|
-
|
|
289
|
-
var result = {result: true, message: null};
|
|
290
|
-
|
|
291
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
292
|
-
!apiutil.isSafeEntity(req.baseUrl) ||
|
|
293
|
-
!apiutil.isSafeEntity(req.body) ||
|
|
294
|
-
!apiutil.isSafeEntity(req.body.tenant) )
|
|
295
|
-
{
|
|
296
|
-
result.result = false;
|
|
297
|
-
result.message = 'POST body does not have tenant data';
|
|
298
|
-
r3logger.elog(result.message);
|
|
299
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
//------------------------------
|
|
304
|
-
// check common parameters(token, tenant etc)
|
|
305
|
-
//------------------------------
|
|
306
|
-
var resobj = rawParseBaseParamInRequest(req);
|
|
307
|
-
if(!resobj.result){
|
|
308
|
-
result.result = resobj.result;
|
|
309
|
-
result.message = resobj.message;
|
|
310
|
-
r3logger.elog(resobj.message);
|
|
311
|
-
resutil.errResponse(req, res, resobj.status_code, result);
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
var comparam = resobj.parameters;
|
|
315
|
-
|
|
316
|
-
//------------------------------
|
|
317
|
-
// check token type
|
|
318
|
-
//------------------------------
|
|
319
|
-
if('user' !== comparam.token_type){
|
|
320
|
-
result.result = false;
|
|
321
|
-
result.message = 'POST request tenant must specify <User Token>';
|
|
322
|
-
r3logger.elog(result.message);
|
|
323
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
//------------------------------
|
|
328
|
-
// check arguments
|
|
329
|
-
//------------------------------
|
|
330
|
-
var is_create = true;
|
|
331
|
-
var tenant_name = null;
|
|
332
|
-
var tenant_id = null;
|
|
333
|
-
var tenant_desc = null;
|
|
334
|
-
var tenant_display = null;
|
|
335
|
-
var tenant_users = null;
|
|
336
|
-
|
|
337
|
-
if(!apiutil.isSafeString(comparam.tenant_name)){
|
|
338
|
-
//
|
|
339
|
-
// Create mode
|
|
340
|
-
//
|
|
341
|
-
is_create = true;
|
|
342
|
-
tenant_name = apiutil.getSafeString(req.body.tenant.name).toLowerCase();
|
|
343
|
-
tenant_id = apiutil.getStrUuid4(); // Create new id here.
|
|
344
|
-
|
|
345
|
-
if(!apiutil.isSafeString(tenant_name)){
|
|
346
|
-
result.result = false;
|
|
347
|
-
result.message = 'POST request tenant body does not have tenant.name string object.';
|
|
348
|
-
r3logger.elog(result.message);
|
|
349
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
if(0 !== tenant_name.indexOf(comparam.keys.VALUE_PREFIX_LOCAL_TENANT)){
|
|
353
|
-
// Not have prefix("local@")
|
|
354
|
-
tenant_name = comparam.keys.VALUE_PREFIX_LOCAL_TENANT + tenant_name;
|
|
355
|
-
}
|
|
356
|
-
}else{
|
|
357
|
-
//
|
|
358
|
-
// Update mode
|
|
359
|
-
//
|
|
360
|
-
is_create = false;
|
|
361
|
-
tenant_name = comparam.tenant_name;
|
|
362
|
-
tenant_id = apiutil.getSafeString(req.body.tenant.id);
|
|
363
|
-
if(!apiutil.isSafeString(tenant_id)){
|
|
364
|
-
result.result = false;
|
|
365
|
-
result.message = 'POST request tenant(' + tenant_name + ') body does not have tenant.id string object.';
|
|
366
|
-
r3logger.elog(result.message);
|
|
367
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
368
|
-
return;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
if(apiutil.isSafeString(req.body.tenant.desc)){
|
|
373
|
-
tenant_desc = apiutil.getSafeString(req.body.tenant.desc);
|
|
374
|
-
}else{
|
|
375
|
-
tenant_desc = 'K2HR3 Cluster Local tenant';
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
if(apiutil.isSafeString(req.body.tenant.display)){
|
|
379
|
-
tenant_display = apiutil.getSafeString(req.body.tenant.display);
|
|
380
|
-
}else{
|
|
381
|
-
tenant_display = tenant_name;
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
//
|
|
385
|
-
// Check users
|
|
386
|
-
//
|
|
387
|
-
if(apiutil.getSafeString(req.body.tenant.users)){
|
|
388
|
-
tenant_users = [req.body.tenant.users.trim()];
|
|
389
|
-
}else{
|
|
390
|
-
tenant_users = apiutil.getSafeArray(req.body.tenant.users);
|
|
391
|
-
}
|
|
392
|
-
if(is_create){
|
|
393
|
-
// add own user
|
|
394
|
-
apiutil.tryAddStringToArray(tenant_users, comparam.user_name);
|
|
395
|
-
}else{
|
|
396
|
-
if(apiutil.isEmptyArray(tenant_users)){
|
|
397
|
-
result.result = false;
|
|
398
|
-
result.message = 'POST request tenant(' + tenant_name + ') does not have any user list.';
|
|
399
|
-
r3logger.elog(result.message);
|
|
400
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
var findobj = k2hr3.findTenant(tenant_name, comparam.user_name, tenant_id);
|
|
405
|
-
if( !apiutil.isSafeEntity(findobj) ||
|
|
406
|
-
!apiutil.isSafeEntity(findobj.result) ||
|
|
407
|
-
false === findobj.result ||
|
|
408
|
-
!apiutil.isSafeEntity(findobj.tenant) ||
|
|
409
|
-
!apiutil.isSafeEntity(findobj.tenant.name) ||
|
|
410
|
-
!apiutil.getSafeArray(findobj.tenant.users) ||
|
|
411
|
-
!apiutil.findStringInArray(findobj.tenant.users, comparam.user_name) )
|
|
412
|
-
{
|
|
413
|
-
result.result = false;
|
|
414
|
-
result.message = 'POST request tenant(' + tenant_name + ') does not allow user(' + comparam.user_name + ').';
|
|
415
|
-
r3logger.elog(result.message);
|
|
416
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
417
|
-
return;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
if(apiutil.isArray(tenant_users)){
|
|
421
|
-
tenant_users.sort();
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
//------------------------------
|
|
425
|
-
// Processing
|
|
426
|
-
//------------------------------
|
|
427
|
-
resobj = rawCreateUpdateTenant(is_create, comparam.user_name, tenant_name, tenant_id, tenant_desc, tenant_display, tenant_users);
|
|
428
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isSafeEntity(resobj.rescode) || false === resobj.result){
|
|
429
|
-
result.result = false;
|
|
430
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
431
|
-
result.message = 'POST request failed to update tenant by ' + resobj.message;
|
|
432
|
-
}else{
|
|
433
|
-
result.message = 'POST request failed to update tenant by unknown reason';
|
|
434
|
-
}
|
|
435
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeEntity(resobj.rescode)){
|
|
436
|
-
resutil.errResponse(req, res, resobj.rescode, result);
|
|
437
|
-
}else{
|
|
438
|
-
resutil.errResponse(req, res, 500, result); // 500: Internal error
|
|
439
|
-
}
|
|
440
|
-
r3logger.elog(result.message);
|
|
441
|
-
return;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
r3logger.dlog('succeed : create/update tenant(' + tenant_name + ') by user(' + comparam.user_name + ')');
|
|
445
|
-
res.status(resobj.rescode); // 200 or 201
|
|
446
|
-
res.send(JSON.stringify(result));
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
//=========================================================
|
|
450
|
-
// Router PUT
|
|
451
|
-
//=========================================================
|
|
452
|
-
//
|
|
453
|
-
// Mountpath : '/v1/tenant'
|
|
454
|
-
//
|
|
455
|
-
//---------------------------------------------------------
|
|
456
|
-
// [PUT] No tenant path
|
|
457
|
-
//---------------------------------------------------------
|
|
458
|
-
// PUT '/v1/tenant' : create tenant version 1
|
|
459
|
-
// HEADER : X-Auth-Token = <User token>
|
|
460
|
-
// url argument :
|
|
461
|
-
// "name": <tenant> => key is "yrn:yahoo:::<tenant>"
|
|
462
|
-
// <tenant> must include the prefix "R3CLUSTERLOCAL-".
|
|
463
|
-
// "desc": <description> => value for "yrn:yahoo:::<tenant>:desc"
|
|
464
|
-
// thix value type must be string.
|
|
465
|
-
// "display": <display name> => key is "yrn:yahoo:::<tenant>:display"
|
|
466
|
-
// thix value type must be string.
|
|
467
|
-
// "users": <user> or [user, ...] => key is "yrn:yahoo::::user:<user>"
|
|
468
|
-
// specify adding user array which is yrn path as "yrn:yahoo::::user:<user>" or "user name"
|
|
469
|
-
//
|
|
470
|
-
// response status code : 201 or 4xx/5xx
|
|
471
|
-
// response body : {
|
|
472
|
-
// result: true/false
|
|
473
|
-
// message: messages
|
|
474
|
-
// }
|
|
475
|
-
//
|
|
476
|
-
// Create a tenant as <K2HR3 cluster LOCAL> tenant.
|
|
477
|
-
//
|
|
478
|
-
// [NOTE]
|
|
479
|
-
// If the <K2HR3 cluster LOCAL> tenant already exists, this repsponses an error.
|
|
480
|
-
//
|
|
481
|
-
// Tenant names must start with "R3CLUSTERLOCAL-".
|
|
482
|
-
// Specify the user by YRN full path or user name.
|
|
483
|
-
// If the user indicated by <User Token> does not exist, it will be added.
|
|
484
|
-
// New tenant id("R3CLUSTERLOCAL-xxxxxx") is set automatically.
|
|
485
|
-
//
|
|
486
|
-
//---------------------------------------------------------
|
|
487
|
-
// [PUT] With tenant path
|
|
488
|
-
//---------------------------------------------------------
|
|
489
|
-
// PUT '/v1/tenant/tenant' : update tenant version 1
|
|
490
|
-
// HEADER : X-Auth-Token = <User token>
|
|
491
|
-
// url argument :
|
|
492
|
-
// "id": <id> => key is "yrn:yahoo:::<tenant>:id"
|
|
493
|
-
// this value type must be string.
|
|
494
|
-
// "desc": <description> => value for "yrn:yahoo:::<tenant>:desc"
|
|
495
|
-
// thix value type must be string.
|
|
496
|
-
// "display": <display name> => key is "yrn:yahoo:::<tenant>:display"
|
|
497
|
-
// thix value type must be string.
|
|
498
|
-
// "users": <user> or [user, ...] => key is "yrn:yahoo::::user:<user>"
|
|
499
|
-
// specify adding user array which is yrn path as "yrn:yahoo::::user:<user>" or "user name"
|
|
500
|
-
//
|
|
501
|
-
// response status code : 200 or 4xx/5xx
|
|
502
|
-
// response body : {
|
|
503
|
-
// result: true/false
|
|
504
|
-
// message: messages
|
|
505
|
-
// }
|
|
506
|
-
//
|
|
507
|
-
// Update existed tenant as <K2HR3 cluster LOCAL> tenant.
|
|
508
|
-
//
|
|
509
|
-
// [NOTE]
|
|
510
|
-
// If the <K2HR3 cluster LOCAL> tenant does not exist, this repsponses an error.
|
|
511
|
-
// The <User Token> user must be included in the tenant's user list.
|
|
512
|
-
//
|
|
513
|
-
// Specify the user by YRN full path or user name.
|
|
514
|
-
// If the user indicated by <User Token> does not exist, it will be added.
|
|
515
|
-
//
|
|
516
|
-
router.put('/', function(req, res, next) // eslint-disable-line no-unused-vars
|
|
517
|
-
{
|
|
518
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
519
|
-
|
|
520
|
-
res.type('application/json; charset=utf-8');
|
|
521
|
-
|
|
522
|
-
var result = {result: true, message: null};
|
|
523
|
-
|
|
524
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
525
|
-
!apiutil.isSafeEntity(req.baseUrl) ||
|
|
526
|
-
!apiutil.isSafeEntity(req.query) )
|
|
527
|
-
{
|
|
528
|
-
result.result = false;
|
|
529
|
-
result.message = 'PUT request is something wrong';
|
|
530
|
-
r3logger.elog(result.message);
|
|
531
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
532
|
-
return;
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
//------------------------------
|
|
536
|
-
// check common parameters(token, tenant etc)
|
|
537
|
-
//------------------------------
|
|
538
|
-
var resobj = rawParseBaseParamInRequest(req);
|
|
539
|
-
if(!resobj.result){
|
|
540
|
-
result.result = resobj.result;
|
|
541
|
-
result.message = resobj.message;
|
|
542
|
-
r3logger.elog(resobj.message);
|
|
543
|
-
resutil.errResponse(req, res, resobj.status_code, result);
|
|
544
|
-
return;
|
|
545
|
-
}
|
|
546
|
-
var comparam = resobj.parameters;
|
|
547
|
-
|
|
548
|
-
//------------------------------
|
|
549
|
-
// check token type
|
|
550
|
-
//------------------------------
|
|
551
|
-
if('user' !== comparam.token_type){
|
|
552
|
-
result.result = false;
|
|
553
|
-
result.message = 'PUT request tenant must specify <User Token>';
|
|
554
|
-
r3logger.elog(result.message);
|
|
555
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
556
|
-
return;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
//------------------------------
|
|
560
|
-
// check arguments
|
|
561
|
-
//------------------------------
|
|
562
|
-
var is_create = true;
|
|
563
|
-
var tenant_name = null;
|
|
564
|
-
var tenant_id = null;
|
|
565
|
-
var tenant_desc = null;
|
|
566
|
-
var tenant_display = null;
|
|
567
|
-
var tenant_users = null;
|
|
568
|
-
|
|
569
|
-
if(!apiutil.isSafeString(comparam.tenant_name)){
|
|
570
|
-
//
|
|
571
|
-
// Create mode
|
|
572
|
-
//
|
|
573
|
-
is_create = true;
|
|
574
|
-
tenant_name = apiutil.getSafeString(req.query.name).toLowerCase();
|
|
575
|
-
tenant_id = apiutil.getStrUuid4(); // Create new id here.
|
|
576
|
-
|
|
577
|
-
if(!apiutil.isSafeString(tenant_name)){
|
|
578
|
-
result.result = false;
|
|
579
|
-
result.message = 'PUT request tenant body does not have tenant.name string object.';
|
|
580
|
-
r3logger.elog(result.message);
|
|
581
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
582
|
-
return;
|
|
583
|
-
}
|
|
584
|
-
if(0 !== tenant_name.indexOf(comparam.keys.VALUE_PREFIX_LOCAL_TENANT)){
|
|
585
|
-
// Not have prefix("local@")
|
|
586
|
-
tenant_name = comparam.keys.VALUE_PREFIX_LOCAL_TENANT + tenant_name;
|
|
587
|
-
}
|
|
588
|
-
}else{
|
|
589
|
-
//
|
|
590
|
-
// Update mode
|
|
591
|
-
//
|
|
592
|
-
is_create = false;
|
|
593
|
-
tenant_name = comparam.tenant_name;
|
|
594
|
-
tenant_id = apiutil.getSafeString(req.query.id);
|
|
595
|
-
if(!apiutil.isSafeString(tenant_id)){
|
|
596
|
-
result.result = false;
|
|
597
|
-
result.message = 'PUT request tenant(' + tenant_name + ') body does not have tenant.id string object.';
|
|
598
|
-
r3logger.elog(result.message);
|
|
599
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
600
|
-
return;
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
if(apiutil.isSafeString(req.query.desc)){
|
|
605
|
-
tenant_desc = apiutil.getSafeString(req.query.desc);
|
|
606
|
-
}else{
|
|
607
|
-
tenant_desc = 'K2HR3 Cluster Local tenant';
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
if(apiutil.isSafeString(req.query.display)){
|
|
611
|
-
tenant_display = apiutil.getSafeString(req.query.display);
|
|
612
|
-
}else{
|
|
613
|
-
tenant_display = tenant_name;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
//
|
|
617
|
-
// Check users
|
|
618
|
-
//
|
|
619
|
-
if(apiutil.checkSimpleJSON(req.query.users)){
|
|
620
|
-
tenant_users = apiutil.parseJSON(req.query.users);
|
|
621
|
-
if(!apiutil.isArray(tenant_users) && apiutil.isSafeString(tenant_users)){
|
|
622
|
-
tenant_users = [tenant_users];
|
|
623
|
-
}else{
|
|
624
|
-
tenant_users = apiutil.getSafeArray(tenant_users);
|
|
625
|
-
}
|
|
626
|
-
}else if(!apiutil.isArray(req.query.users) && apiutil.isSafeString(req.query.users)){
|
|
627
|
-
tenant_users = [req.query.users];
|
|
628
|
-
}else{
|
|
629
|
-
tenant_users = apiutil.getSafeArray(req.query.users);
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
if(is_create){
|
|
633
|
-
// add own user
|
|
634
|
-
apiutil.tryAddStringToArray(tenant_users, comparam.user_name);
|
|
635
|
-
}else{
|
|
636
|
-
// check user in current tenant users
|
|
637
|
-
if(apiutil.isEmptyArray(tenant_users)){
|
|
638
|
-
result.result = false;
|
|
639
|
-
result.message = 'PUT request tenant(' + tenant_name + ') does not have any user list.';
|
|
640
|
-
r3logger.elog(result.message);
|
|
641
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
642
|
-
return;
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
var findobj = k2hr3.findTenant(tenant_name, comparam.user_name, tenant_id);
|
|
646
|
-
if( !apiutil.isSafeEntity(findobj) ||
|
|
647
|
-
!apiutil.isSafeEntity(findobj.result) ||
|
|
648
|
-
false === findobj.result ||
|
|
649
|
-
!apiutil.isSafeEntity(findobj.tenant) ||
|
|
650
|
-
!apiutil.isSafeEntity(findobj.tenant.name) ||
|
|
651
|
-
!apiutil.getSafeArray(findobj.tenant.users) ||
|
|
652
|
-
!apiutil.findStringInArray(findobj.tenant.users, comparam.user_name) )
|
|
653
|
-
{
|
|
654
|
-
result.result = false;
|
|
655
|
-
result.message = 'PUT request tenant(' + tenant_name + ') does not allow user(' + comparam.user_name + ').';
|
|
656
|
-
r3logger.elog(result.message);
|
|
657
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
658
|
-
return;
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
if(apiutil.isArray(tenant_users)){
|
|
662
|
-
tenant_users.sort();
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
//------------------------------
|
|
666
|
-
// Processing
|
|
667
|
-
//------------------------------
|
|
668
|
-
resobj = rawCreateUpdateTenant(is_create, comparam.user_name, tenant_name, tenant_id, tenant_desc, tenant_display, tenant_users);
|
|
669
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isSafeEntity(resobj.rescode) || false === resobj.result){
|
|
670
|
-
result.result = false;
|
|
671
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
672
|
-
result.message = 'PUT request failed to update tenant by ' + resobj.message;
|
|
673
|
-
}else{
|
|
674
|
-
result.message = 'PUT request failed to update tenant by unknown reason';
|
|
675
|
-
}
|
|
676
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeEntity(resobj.rescode)){
|
|
677
|
-
resutil.errResponse(req, res, resobj.rescode, result);
|
|
678
|
-
}else{
|
|
679
|
-
resutil.errResponse(req, res, 500, result); // 500: Internal error
|
|
680
|
-
}
|
|
681
|
-
r3logger.elog(result.message);
|
|
682
|
-
return;
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
r3logger.dlog('succeed : create/update tenant(' + tenant_name + ') by user(' + comparam.user_name + ')');
|
|
686
|
-
res.status(resobj.rescode); // 200 or 201
|
|
687
|
-
res.send(JSON.stringify(result));
|
|
688
|
-
});
|
|
689
|
-
|
|
690
|
-
//=========================================================
|
|
691
|
-
// Router GET
|
|
692
|
-
//=========================================================
|
|
693
|
-
//
|
|
694
|
-
// Mountpath : '/v1/tenant{/tenant}'
|
|
695
|
-
//
|
|
696
|
-
//---------------------------------------------------------
|
|
697
|
-
// [GET] No tenant path
|
|
698
|
-
//---------------------------------------------------------
|
|
699
|
-
// GET '/v1/tenant' : get tenant list version 1
|
|
700
|
-
// HEADER : X-Auth-Token = <User token>
|
|
701
|
-
// URL arguments : expand = "true"(default) or "false"
|
|
702
|
-
// response status code : 200 or 4xx/5xx
|
|
703
|
-
// response : nothing
|
|
704
|
-
// response body : {
|
|
705
|
-
// result: true/false,
|
|
706
|
-
// message: null or error message string
|
|
707
|
-
// tenants: [
|
|
708
|
-
// {
|
|
709
|
-
// name: "string",
|
|
710
|
-
// id: "string",
|
|
711
|
-
// desc: "string",
|
|
712
|
-
// display: "string",
|
|
713
|
-
// user: array[users...]
|
|
714
|
-
// },
|
|
715
|
-
// ...
|
|
716
|
-
// ]
|
|
717
|
-
// }
|
|
718
|
-
// or
|
|
719
|
-
// {
|
|
720
|
-
// result: true/false,
|
|
721
|
-
// message: null or error message string
|
|
722
|
-
// tenants: [
|
|
723
|
-
// "tenant",
|
|
724
|
-
// ...
|
|
725
|
-
// ]
|
|
726
|
-
// }
|
|
727
|
-
//
|
|
728
|
-
// This mount point retrieves a list of tenants and information about each.
|
|
729
|
-
//
|
|
730
|
-
//---------------------------------------------------------
|
|
731
|
-
// [GET] With tenant path
|
|
732
|
-
//---------------------------------------------------------
|
|
733
|
-
// GET '/v1/tenant/<tenant>' : get tenant information on version 1
|
|
734
|
-
// HEADER : X-Auth-Token = <User token>
|
|
735
|
-
// URL arguments : nothing
|
|
736
|
-
// response status code : 200 or 4xx/5xx
|
|
737
|
-
// response : nothing
|
|
738
|
-
// response body : {
|
|
739
|
-
// result: true/false,
|
|
740
|
-
// message: null or error message string
|
|
741
|
-
// tenant: {
|
|
742
|
-
// name: "string",
|
|
743
|
-
// id: "string",
|
|
744
|
-
// desc: "string",
|
|
745
|
-
// display: "string",
|
|
746
|
-
// user: array[users...]
|
|
747
|
-
// }
|
|
748
|
-
// }
|
|
749
|
-
//
|
|
750
|
-
router.get('/', function(req, res, next)
|
|
751
|
-
{
|
|
752
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
753
|
-
|
|
754
|
-
if('GET' !== req.method){
|
|
755
|
-
// HEAD request comes here, so it should be routed to head function.
|
|
756
|
-
next();
|
|
757
|
-
return;
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
res.type('application/json; charset=utf-8');
|
|
761
|
-
|
|
762
|
-
var result = {result: true, message: null};
|
|
763
|
-
|
|
764
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
765
|
-
!apiutil.isSafeEntity(req.baseUrl) )
|
|
766
|
-
{
|
|
767
|
-
result.result = false;
|
|
768
|
-
result.message = 'GET request is something wrong';
|
|
769
|
-
r3logger.elog(result.message);
|
|
770
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
771
|
-
return;
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
//------------------------------
|
|
775
|
-
// check common parameters(token, tenant etc)
|
|
776
|
-
//------------------------------
|
|
777
|
-
var resobj = rawParseBaseParamInRequest(req);
|
|
778
|
-
if(!resobj.result){
|
|
779
|
-
result.result = resobj.result;
|
|
780
|
-
result.message = resobj.message;
|
|
781
|
-
r3logger.elog(resobj.message);
|
|
782
|
-
resutil.errResponse(req, res, resobj.status_code, result);
|
|
783
|
-
return;
|
|
784
|
-
}
|
|
785
|
-
var comparam = resobj.parameters;
|
|
786
|
-
|
|
787
|
-
//------------------------------
|
|
788
|
-
// check token type
|
|
789
|
-
//------------------------------
|
|
790
|
-
if('user' !== comparam.token_type){
|
|
791
|
-
result.result = false;
|
|
792
|
-
result.message = 'GET request tenant must specify <User Token>';
|
|
793
|
-
r3logger.elog(result.message);
|
|
794
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
795
|
-
return;
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
//------------------------------
|
|
799
|
-
// Processing
|
|
800
|
-
//------------------------------
|
|
801
|
-
if(!apiutil.isSafeString(comparam.tenant_name)){
|
|
802
|
-
//
|
|
803
|
-
// List mode
|
|
804
|
-
//
|
|
805
|
-
var keys = r3keys(comparam.user_name);
|
|
806
|
-
|
|
807
|
-
//
|
|
808
|
-
// Check expand type
|
|
809
|
-
//
|
|
810
|
-
var is_expand = true;
|
|
811
|
-
if(apiutil.isSafeEntity(req.query) && apiutil.isSafeString(req.query.expand)){
|
|
812
|
-
if(apiutil.compareCaseString(keys.VALUE_TRUE, req.query.expand)){
|
|
813
|
-
is_expand = true;
|
|
814
|
-
}else if(apiutil.compareCaseString(keys.VALUE_FALSE, req.query.expand)){
|
|
815
|
-
is_expand = false;
|
|
816
|
-
}else{
|
|
817
|
-
result.result = false;
|
|
818
|
-
result.message = 'GET expand url argument parameter(' + JSON.stringify(req.query.expand) + ') is wrong, it must be ' + keys.VALUE_TRUE + ' or ' + keys.VALUE_FALSE + '.';
|
|
819
|
-
r3logger.elog(result.message);
|
|
820
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
821
|
-
return;
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
//
|
|
826
|
-
// Get list
|
|
827
|
-
//
|
|
828
|
-
resobj = k2hr3.listLocalTenant(comparam.user_name, is_expand);
|
|
829
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isArray(resobj.tenants) || false === resobj.result){
|
|
830
|
-
result.result = false;
|
|
831
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
832
|
-
result.message = 'GET request failed to update tenant by ' + resobj.message;
|
|
833
|
-
}else{
|
|
834
|
-
result.message = 'GET request failed to update tenant by unknown reason';
|
|
835
|
-
}
|
|
836
|
-
r3logger.elog(result.message);
|
|
837
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
838
|
-
return;
|
|
839
|
-
}
|
|
840
|
-
result.tenants = resobj.tenants;
|
|
841
|
-
|
|
842
|
-
}else{
|
|
843
|
-
//
|
|
844
|
-
// One tenant
|
|
845
|
-
//
|
|
846
|
-
resobj = k2hr3.findTenant(comparam.tenant_name);
|
|
847
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isSafeEntity(resobj.tenant) || false === resobj.result){
|
|
848
|
-
result.result = false;
|
|
849
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
850
|
-
result.message = 'GET request failed to update tenant by ' + resobj.message;
|
|
851
|
-
}else{
|
|
852
|
-
result.message = 'GET request failed to update tenant by unknown reason';
|
|
853
|
-
}
|
|
854
|
-
r3logger.elog(result.message);
|
|
855
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
856
|
-
return;
|
|
857
|
-
}
|
|
858
|
-
result.tenant = resobj.tenant;
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
r3logger.dlog('succeed : get tenant(s) by user(' + comparam.user_name + ')');
|
|
862
|
-
res.status(200); // 200: OK
|
|
863
|
-
res.send(JSON.stringify(result));
|
|
864
|
-
});
|
|
865
|
-
|
|
866
|
-
//=========================================================
|
|
867
|
-
// Router HEAD
|
|
868
|
-
//=========================================================
|
|
869
|
-
//
|
|
870
|
-
// Mountpath : '/v1/tenant/tenant'
|
|
871
|
-
//
|
|
872
|
-
// HEAD '/v1/tenant/<tenant>' : head tenant on version 1
|
|
873
|
-
// HEADER : X-Auth-Token = <User token>
|
|
874
|
-
// response status code : 204 or 4xx/5xx
|
|
875
|
-
// response body : nothing
|
|
876
|
-
//
|
|
877
|
-
// This mount point is an API for checking the existence of a tenant.
|
|
878
|
-
// If the tenant is given, this returns a 204 if that tenant exists and is allowed to be seen.
|
|
879
|
-
// If no tenant is given, returns 204 if at least one target tenant exists.
|
|
880
|
-
//
|
|
881
|
-
router.head('/', function(req, res, next)
|
|
882
|
-
{
|
|
883
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
884
|
-
|
|
885
|
-
if('HEAD' !== req.method){
|
|
886
|
-
// If other method request comes here, so it should be routed another function.
|
|
887
|
-
next();
|
|
888
|
-
return;
|
|
889
|
-
}
|
|
890
|
-
res.type('application/json; charset=utf-8');
|
|
891
|
-
|
|
892
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
893
|
-
!apiutil.isSafeEntity(req.baseUrl) )
|
|
894
|
-
{
|
|
895
|
-
r3logger.elog('HEAD request is something wrong');
|
|
896
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
897
|
-
return;
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
//------------------------------
|
|
901
|
-
// check common parameters(token, tenant etc)
|
|
902
|
-
//------------------------------
|
|
903
|
-
var resobj = rawParseBaseParamInRequest(req);
|
|
904
|
-
if(!resobj.result){
|
|
905
|
-
r3logger.elog(resobj.message);
|
|
906
|
-
resutil.errResponse(req, res, resobj.status_code);
|
|
907
|
-
return;
|
|
908
|
-
}
|
|
909
|
-
var comparam = resobj.parameters;
|
|
910
|
-
|
|
911
|
-
//------------------------------
|
|
912
|
-
// check token type
|
|
913
|
-
//------------------------------
|
|
914
|
-
if('user' !== comparam.token_type){
|
|
915
|
-
r3logger.elog('HEAD request tenant must specify <User Token>');
|
|
916
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
917
|
-
return;
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
//------------------------------
|
|
921
|
-
// Check uri paths(tenant name)
|
|
922
|
-
//------------------------------
|
|
923
|
-
if(!apiutil.isSafeString(comparam.tenant_name)){
|
|
924
|
-
r3logger.elog('HEAD request tenant must specify <tenant> path');
|
|
925
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
926
|
-
return;
|
|
927
|
-
}
|
|
928
|
-
|
|
929
|
-
//------------------------------
|
|
930
|
-
// Processing
|
|
931
|
-
//------------------------------
|
|
932
|
-
resobj = k2hr3.findTenant(comparam.tenant_name);
|
|
933
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || !apiutil.isSafeEntity(resobj.tenant) || false === resobj.result){
|
|
934
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
935
|
-
r3logger.elog('HEAD request failed to update tenant by ' + resobj.message);
|
|
936
|
-
}else{
|
|
937
|
-
r3logger.elog('HEAD request failed to update tenant by unknown reason');
|
|
938
|
-
}
|
|
939
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
940
|
-
return;
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
r3logger.dlog('HEAD request succeed - check tenant(' + comparam.tenant_name + ') exists');
|
|
944
|
-
res.status(204); // 204: No Content
|
|
945
|
-
res.send();
|
|
946
|
-
});
|
|
947
|
-
|
|
948
|
-
//=========================================================
|
|
949
|
-
// Router DELETE
|
|
950
|
-
//=========================================================
|
|
951
|
-
//
|
|
952
|
-
// Mountpath : '/v1/tenant'
|
|
953
|
-
//
|
|
954
|
-
//---------------------------------------------------------
|
|
955
|
-
// [DELETE] No tenant path
|
|
956
|
-
//---------------------------------------------------------
|
|
957
|
-
// DELETE '/v1/tenant' : delete tenant version 1
|
|
958
|
-
// HEADER : X-Auth-Token = <User token>
|
|
959
|
-
// url argument : "tenant" = <tenant name>
|
|
960
|
-
// url argument : "id" = <id> => key is "yrn:yahoo:::<tenant>:id"
|
|
961
|
-
// response status code : 204 or 4xx/5xx
|
|
962
|
-
// response body : nothing
|
|
963
|
-
//
|
|
964
|
-
// This mount point deletes the specified <K2HR3 cluster LOCAL> tenant.
|
|
965
|
-
//
|
|
966
|
-
//---------------------------------------------------------
|
|
967
|
-
// [DELETE] With tenant path
|
|
968
|
-
//---------------------------------------------------------
|
|
969
|
-
// DELETE '/v1/tenant/tenant' : delete tenant version 1
|
|
970
|
-
// HEADER : X-Auth-Token = <User token>
|
|
971
|
-
// url argument : "id" = <id> => key is "yrn:yahoo:::<tenant>:id"
|
|
972
|
-
// response status code : 204 or 4xx/5xx
|
|
973
|
-
// response body : nothing
|
|
974
|
-
//
|
|
975
|
-
// This mount point deletes the specified <K2HR3 cluster LOCAL> tenant.
|
|
976
|
-
//
|
|
977
|
-
// [NOTE]
|
|
978
|
-
// Only users registered in the tenant to be deleted can delete this tenant.
|
|
979
|
-
//
|
|
980
|
-
router.delete('/', function(req, res, next) // eslint-disable-line no-unused-vars
|
|
981
|
-
{
|
|
982
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
983
|
-
|
|
984
|
-
res.type('application/json; charset=utf-8');
|
|
985
|
-
|
|
986
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
987
|
-
!apiutil.isSafeEntity(req.baseUrl) )
|
|
988
|
-
{
|
|
989
|
-
r3logger.elog('DELETE request or url or query is wrong');
|
|
990
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
991
|
-
return;
|
|
992
|
-
}
|
|
993
|
-
|
|
994
|
-
//------------------------------
|
|
995
|
-
// check common parameters(token, tenant etc)
|
|
996
|
-
//------------------------------
|
|
997
|
-
var resobj = rawParseBaseParamInRequest(req);
|
|
998
|
-
if(!resobj.result){
|
|
999
|
-
r3logger.elog(resobj.message);
|
|
1000
|
-
resutil.errResponse(req, res, resobj.status_code);
|
|
1001
|
-
return;
|
|
1002
|
-
}
|
|
1003
|
-
var comparam = resobj.parameters;
|
|
1004
|
-
|
|
1005
|
-
//------------------------------
|
|
1006
|
-
// check token type
|
|
1007
|
-
//------------------------------
|
|
1008
|
-
if('user' !== comparam.token_type){
|
|
1009
|
-
r3logger.elog('DELETE request tenant must specify <User Token>');
|
|
1010
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1011
|
-
return;
|
|
1012
|
-
}
|
|
1013
|
-
|
|
1014
|
-
//------------------------------
|
|
1015
|
-
// Check uri paths
|
|
1016
|
-
//------------------------------
|
|
1017
|
-
var tenant_name;
|
|
1018
|
-
var tenant_id;
|
|
1019
|
-
if(!apiutil.isSafeString(comparam.tenant_name)){
|
|
1020
|
-
//------------------------------
|
|
1021
|
-
// Check argments(tenant)
|
|
1022
|
-
//------------------------------
|
|
1023
|
-
tenant_name = apiutil.getSafeString(req.query.tenant);
|
|
1024
|
-
if(!apiutil.isSafeString(tenant_name)){
|
|
1025
|
-
r3logger.elog('DELETE request tenant must specify in argument');
|
|
1026
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1027
|
-
return;
|
|
1028
|
-
}
|
|
1029
|
-
|
|
1030
|
-
//------------------------------
|
|
1031
|
-
// Check argments(id)
|
|
1032
|
-
//------------------------------
|
|
1033
|
-
tenant_id = apiutil.getSafeString(req.query.id);
|
|
1034
|
-
if(!apiutil.isSafeString(tenant_id)){
|
|
1035
|
-
r3logger.elog('DELETE request id must specify in argument');
|
|
1036
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1037
|
-
return;
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
//------------------------------
|
|
1041
|
-
// Processing
|
|
1042
|
-
//------------------------------
|
|
1043
|
-
resobj = k2hr3.removeLocalTenant(tenant_name, comparam.user_name, tenant_id);
|
|
1044
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
|
|
1045
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
1046
|
-
r3logger.elog('DELETE request failed to remove user from tenant by ' + resobj.message);
|
|
1047
|
-
}else{
|
|
1048
|
-
r3logger.elog('DELETE request failed to remove user from tenant by unknown reason');
|
|
1049
|
-
}
|
|
1050
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1051
|
-
return;
|
|
1052
|
-
}
|
|
1053
|
-
r3logger.dlog('DELETE request succeed - remove tenant');
|
|
1054
|
-
|
|
1055
|
-
}else{
|
|
1056
|
-
//------------------------------
|
|
1057
|
-
// Check argments(id)
|
|
1058
|
-
//------------------------------
|
|
1059
|
-
tenant_id = apiutil.getSafeString(req.query.id);
|
|
1060
|
-
if(!apiutil.isSafeString(tenant_id)){
|
|
1061
|
-
r3logger.elog('DELETE request id must specify in argument');
|
|
1062
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1063
|
-
return;
|
|
1064
|
-
}
|
|
1065
|
-
|
|
1066
|
-
//------------------------------
|
|
1067
|
-
// Processing
|
|
1068
|
-
//------------------------------
|
|
1069
|
-
resobj = k2hr3.removeUserFromLocalTenant(comparam.tenant_name, comparam.user_name, tenant_id);
|
|
1070
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
|
|
1071
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeString(resobj.message)){
|
|
1072
|
-
r3logger.elog('DELETE request failed to remove user from tenant by ' + resobj.message);
|
|
1073
|
-
}else{
|
|
1074
|
-
r3logger.elog('DELETE request failed to remove user from tenant by unknown reason');
|
|
1075
|
-
}
|
|
1076
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1077
|
-
return;
|
|
1078
|
-
}
|
|
1079
|
-
r3logger.dlog('DELETE request succeed - remove user from tenant');
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
res.status(204); // 204: No Content
|
|
1083
|
-
res.send();
|
|
1084
|
-
});
|
|
1085
|
-
|
|
1086
|
-
module.exports = router;
|
|
1087
|
-
|
|
1088
|
-
/*
|
|
1089
|
-
* Local variables:
|
|
1090
|
-
* tab-width: 4
|
|
1091
|
-
* c-basic-offset: 4
|
|
1092
|
-
* End:
|
|
1093
|
-
* vim600: noexpandtab sw=4 ts=4 fdm=marker
|
|
1094
|
-
* vim<600: noexpandtab sw=4 ts=4
|
|
1095
|
-
*/
|