k2hr3-api 1.0.41 → 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 -372
- 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/role.js
DELETED
|
@@ -1,2664 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* K2HR3 REST API
|
|
3
|
-
*
|
|
4
|
-
* Copyright 2017 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: Wed Jun 8 2017
|
|
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 r3userdata = require('../lib/k2hr3userdata');
|
|
30
|
-
var k2hr3 = require('../lib/k2hr3dkc');
|
|
31
|
-
var r3keys = require('../lib/k2hr3keys').getK2hr3Keys;
|
|
32
|
-
|
|
33
|
-
// Debug logging objects
|
|
34
|
-
var r3logger = require('../lib/dbglogging');
|
|
35
|
-
|
|
36
|
-
//---------------------------------------------------------
|
|
37
|
-
// Configuration
|
|
38
|
-
// * Get role full path which is allowed to remove ip address
|
|
39
|
-
// * Get expiration for role tokens
|
|
40
|
-
//---------------------------------------------------------
|
|
41
|
-
var delhost_role_yrn = null;
|
|
42
|
-
var expire_rtoken = 0;
|
|
43
|
-
var expire_reg_rtoken = 0;
|
|
44
|
-
|
|
45
|
-
(function()
|
|
46
|
-
{
|
|
47
|
-
var r3Conf = require('../lib/k2hr3config').r3ApiConfig;
|
|
48
|
-
var apiConf = new r3Conf();
|
|
49
|
-
|
|
50
|
-
var admincfgobj = apiConf.getK2hr3AdminConfig();
|
|
51
|
-
if(apiutil.isSafeEntity(admincfgobj) && apiutil.isSafeString(admincfgobj.tenant) && apiutil.isSafeString(admincfgobj.delhostrole)){
|
|
52
|
-
var keys = r3keys(null, admincfgobj.tenant.trim());
|
|
53
|
-
delhost_role_yrn= keys.ROLE_TOP_KEY + ':' + admincfgobj.delhostrole.trim();
|
|
54
|
-
}else{
|
|
55
|
-
r3logger.elog('Could not find tenant/role in configuration for deleting host by cuk.');
|
|
56
|
-
delhost_role_yrn= null;
|
|
57
|
-
}
|
|
58
|
-
expire_rtoken = apiConf.getExpireTimeRoleToken();
|
|
59
|
-
expire_reg_rtoken = apiConf.getExpireTimeRegRoleToken();
|
|
60
|
-
}());
|
|
61
|
-
|
|
62
|
-
//---------------------------------------------------------
|
|
63
|
-
// Router POST
|
|
64
|
-
//---------------------------------------------------------
|
|
65
|
-
//
|
|
66
|
-
// Mountpath : '/v1/role'
|
|
67
|
-
// POST '/v1/role{/<role{/...}>}' : post role on version 1
|
|
68
|
-
// HEADER : X-Auth-Token => User token or Role token
|
|
69
|
-
// response body : result => true/false
|
|
70
|
-
// message => messages
|
|
71
|
-
//
|
|
72
|
-
// This mount point is for creating(update) role or creating(update) host in role.
|
|
73
|
-
//
|
|
74
|
-
router.post('/', function(req, res, next)
|
|
75
|
-
{
|
|
76
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
77
|
-
|
|
78
|
-
res.type('application/json; charset=utf-8');
|
|
79
|
-
|
|
80
|
-
var result;
|
|
81
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
82
|
-
!apiutil.isSafeEntity(req.baseUrl) )
|
|
83
|
-
{
|
|
84
|
-
result = {
|
|
85
|
-
result: false,
|
|
86
|
-
message: 'POST request or url or query is wrong'
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
r3logger.elog(result.message);
|
|
90
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// check api type
|
|
95
|
-
if('/v1/role' === decodeURI(req.baseUrl)){
|
|
96
|
-
//------------------------------
|
|
97
|
-
// create role type
|
|
98
|
-
//------------------------------
|
|
99
|
-
postRole(req, res, next);
|
|
100
|
-
|
|
101
|
-
}else{
|
|
102
|
-
// check host api
|
|
103
|
-
var keys = r3keys();
|
|
104
|
-
var requestptn = new RegExp(keys.MATCH_URI_GET_ROLE_DATA); // regex = /^\/v1\/role\/(.*)/
|
|
105
|
-
var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
106
|
-
if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
|
|
107
|
-
result = {
|
|
108
|
-
result: false,
|
|
109
|
-
message: 'POST request url does not have role name'
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
r3logger.elog(result.message);
|
|
113
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
// role name
|
|
117
|
-
var name = reqmatchs[1];
|
|
118
|
-
name = name.toLowerCase();
|
|
119
|
-
|
|
120
|
-
//------------------------------
|
|
121
|
-
// create host type
|
|
122
|
-
//------------------------------
|
|
123
|
-
postRoleHost(name, req, res, next);
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
//---------------------------------------------------------
|
|
128
|
-
// Router PUT
|
|
129
|
-
//---------------------------------------------------------
|
|
130
|
-
// Mountpath : '/v1/role'
|
|
131
|
-
// PUT '/v1/role{/<role{/...}>}': put role on version 1
|
|
132
|
-
// HEADER : X-Auth-Token => User token or Role token
|
|
133
|
-
// response body : result => true/false
|
|
134
|
-
// message => messages
|
|
135
|
-
//
|
|
136
|
-
// This mount point is for creating(update) role and creating(update) host in role.
|
|
137
|
-
//
|
|
138
|
-
router.put('/', function(req, res, next)
|
|
139
|
-
{
|
|
140
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
141
|
-
|
|
142
|
-
res.type('application/json; charset=utf-8');
|
|
143
|
-
|
|
144
|
-
var result;
|
|
145
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
146
|
-
!apiutil.isSafeEntity(req.baseUrl) )
|
|
147
|
-
{
|
|
148
|
-
result = {
|
|
149
|
-
result: false,
|
|
150
|
-
message: 'PUT request or url or query is wrong'
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
r3logger.elog(result.message);
|
|
154
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// check api type
|
|
159
|
-
if('/v1/role' === decodeURI(req.baseUrl)){
|
|
160
|
-
//------------------------------
|
|
161
|
-
// create role type
|
|
162
|
-
//------------------------------
|
|
163
|
-
putRole(req, res, next);
|
|
164
|
-
|
|
165
|
-
}else{
|
|
166
|
-
// check host api
|
|
167
|
-
var keys = r3keys();
|
|
168
|
-
var requestptn = new RegExp(keys.MATCH_URI_GET_ROLE_DATA); // regex = /^\/v1\/role\/(.*)/
|
|
169
|
-
var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
170
|
-
if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
|
|
171
|
-
result = {
|
|
172
|
-
result: false,
|
|
173
|
-
message: 'POST request url does not have role name'
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
r3logger.elog(result.message);
|
|
177
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
// role name
|
|
181
|
-
var name = reqmatchs[1];
|
|
182
|
-
name = name.toLowerCase();
|
|
183
|
-
|
|
184
|
-
//------------------------------
|
|
185
|
-
// create host type
|
|
186
|
-
//------------------------------
|
|
187
|
-
putRoleHost(name, req, res, next);
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
//
|
|
192
|
-
// Sub router function for POST CREATE ROLE
|
|
193
|
-
//
|
|
194
|
-
// Mountpath : '/v1/role'
|
|
195
|
-
// POST '/v1/role' : post role on version 1
|
|
196
|
-
// HEADER : X-Auth-Token => User token
|
|
197
|
-
// response body : result => true/false
|
|
198
|
-
// message => messages
|
|
199
|
-
// body :
|
|
200
|
-
// {
|
|
201
|
-
// "role": {
|
|
202
|
-
// "name": <role name> => key is "yrn:yahoo:<service>::<tenant>:role:<role>"
|
|
203
|
-
// <role> can include '/' for hierarchical path
|
|
204
|
-
// "policies": [<policy yrn full path>, ...] => key is "yrn:yahoo:<service>::<tenant>:role:<role>/policies"
|
|
205
|
-
// specify policy as "yrn:yahoo:<service>::<tenant>:policy:<policy>"
|
|
206
|
-
// if null or undefined is specified, not update this member in role when this role exists.
|
|
207
|
-
// if '' or zero array, this member in role is set empty array.
|
|
208
|
-
// "alias": [<role yrn full path>, ...] => key is "yrn:yahoo:<service>::<tenant>:role:<role>/@"
|
|
209
|
-
// specify another role as "yrn:yahoo:<service>::<tenant>:role:<role>"
|
|
210
|
-
// if null or undefined is specified, not update this member in role when this role exists.
|
|
211
|
-
// if '' or zero array, this member in role is set empty array.
|
|
212
|
-
// }
|
|
213
|
-
// }
|
|
214
|
-
//
|
|
215
|
-
// [NOTE]
|
|
216
|
-
// This API does not set host into roles as initial. You can add host to role
|
|
217
|
-
// by another API which is an API dedicated to adding host.
|
|
218
|
-
//
|
|
219
|
-
function postRole(req, res, next) // eslint-disable-line no-unused-vars
|
|
220
|
-
{
|
|
221
|
-
var result;
|
|
222
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
223
|
-
!apiutil.isSafeEntity(req.body) ||
|
|
224
|
-
!apiutil.isSafeEntity(req.body.role) )
|
|
225
|
-
{
|
|
226
|
-
result = {
|
|
227
|
-
result: false,
|
|
228
|
-
message: 'POST body does not have role data'
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
r3logger.elog(result.message);
|
|
232
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
//------------------------------
|
|
237
|
-
// check token
|
|
238
|
-
//------------------------------
|
|
239
|
-
var token_result = r3token.checkToken(req, true, true); // scoped, user token
|
|
240
|
-
if(!token_result.result){
|
|
241
|
-
r3logger.elog(token_result.message);
|
|
242
|
-
var _status = token_result.status;
|
|
243
|
-
delete token_result.status;
|
|
244
|
-
resutil.errResponse(req, res, _status, token_result);
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
var token_info = token_result.token_info;
|
|
248
|
-
|
|
249
|
-
//------------------------------
|
|
250
|
-
// check arguments
|
|
251
|
-
//------------------------------
|
|
252
|
-
// name
|
|
253
|
-
if(!apiutil.isSafeString(req.body.role.name)){
|
|
254
|
-
result = {
|
|
255
|
-
result: false,
|
|
256
|
-
message: 'role:name field is wrong : ' + JSON.stringify(req.body.role.name)
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
r3logger.elog(result.message);
|
|
260
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
var keys = r3keys(token_info.user, token_info.tenant);
|
|
264
|
-
var name = apiutil.getSafeString(req.body.role.name);
|
|
265
|
-
name = name.toLowerCase();
|
|
266
|
-
|
|
267
|
-
// role name is only name or full yrn path
|
|
268
|
-
var nameptn = new RegExp('^' + keys.ROLE_TOP_KEY + ':(.*)'); // regex = /^yrn:yahoo:<service>::<tenant>:role:(.*)/
|
|
269
|
-
var namematchs = name.match(nameptn);
|
|
270
|
-
if(!apiutil.isEmptyArray(namematchs) && 2 <= namematchs.length){
|
|
271
|
-
name = namematchs[1];
|
|
272
|
-
}
|
|
273
|
-
// check name which is not full yrn
|
|
274
|
-
nameptn = new RegExp('^' + keys.NO_TENANT_KEY); // regex = /^yrn:yahoo:/
|
|
275
|
-
if(name.match(nameptn)){
|
|
276
|
-
r3logger.elog('POST request query has wrong yrn full path to role');
|
|
277
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// policies
|
|
282
|
-
var policiesptn = new RegExp('^' + keys.POLICY_TOP_KEY + ':(.*)'); // regex = /^yrn:yahoo:<service>::<tenant>:policy:(.*)/
|
|
283
|
-
var policiespram= apiutil.getNormalizeParameter(req.body.role.policies, policiesptn, null);
|
|
284
|
-
if(false === policiespram.result){
|
|
285
|
-
result = {
|
|
286
|
-
result: false,
|
|
287
|
-
message: 'role:policies field is wrong : ' + JSON.stringify(req.body.role.policies)
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
r3logger.elog(result.message);
|
|
291
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
var policies = policiespram.parameter;
|
|
295
|
-
|
|
296
|
-
// alias
|
|
297
|
-
var aliasptn = new RegExp('^' + keys.MATCH_ANY_TENANT_ROLE); // regex = /^yrn:yahoo:(.*)::(.*):role:(.*)/
|
|
298
|
-
var aliaspram = apiutil.getNormalizeParameter(req.body.role.alias, aliasptn, null);
|
|
299
|
-
if(false === aliaspram.result){
|
|
300
|
-
result = {
|
|
301
|
-
result: false,
|
|
302
|
-
message: 'role:alias field is wrong : ' + JSON.stringify(req.body.role.alias)
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
r3logger.elog(result.message);
|
|
306
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
var aliases = aliaspram.parameter;
|
|
310
|
-
|
|
311
|
-
//------------------------------
|
|
312
|
-
// set all field to role
|
|
313
|
-
//------------------------------
|
|
314
|
-
result = k2hr3.setRoleAll(token_info.user, token_info.tenant, name, policies, aliases, null, false, null, false);
|
|
315
|
-
if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
|
|
316
|
-
if(!apiutil.isSafeEntity(result)){
|
|
317
|
-
result = {
|
|
318
|
-
result: false,
|
|
319
|
-
message: 'Could not get response from setRoleAll'
|
|
320
|
-
};
|
|
321
|
-
}else{
|
|
322
|
-
if(!apiutil.isSafeEntity(result.result)){
|
|
323
|
-
result.result = false;
|
|
324
|
-
}
|
|
325
|
-
if(!apiutil.isSafeEntity(result.message)){
|
|
326
|
-
result.message = 'Could not get error message in response from setRoleAll';
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
r3logger.elog(result.message);
|
|
330
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
r3logger.dlog('succeed : ' + result.message);
|
|
334
|
-
res.status(201); // 201: Created
|
|
335
|
-
res.send(JSON.stringify(result));
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
//
|
|
339
|
-
// Sub router function for PUT CREATE ROLE
|
|
340
|
-
//
|
|
341
|
-
// Mountpath : '/v1/role'
|
|
342
|
-
// PUT '/v1/role{/<role{/...}>}' : put role on version 1
|
|
343
|
-
// HEADER : X-Auth-Token => User token
|
|
344
|
-
// response body : result => true/false
|
|
345
|
-
// message => messages
|
|
346
|
-
// url argument
|
|
347
|
-
// "name": <role name> => key is "yrn:yahoo:<service>::<tenant>:role:<role>"
|
|
348
|
-
// <role> can include '/' for hierarchical path
|
|
349
|
-
// "policies": [<policy yrn full path>, ...] => key is "yrn:yahoo:<service>::<tenant>:role:<role>/policies"
|
|
350
|
-
// specify policy as "yrn:yahoo:<service>::<tenant>:policy:<policy>", it is formatted by JSON.
|
|
351
|
-
// if null or undefined is specified, not update this member in role when this role exists.
|
|
352
|
-
// if '' or zero array, this member in role is set empty array.
|
|
353
|
-
// "alias": [<role yrn full path>, ...] => key is "yrn:yahoo:<service>::<tenant>:role:<role>/@"
|
|
354
|
-
// specify another role as "yrn:yahoo:<service>::<tenant>:role:<role>", it is formatted by JSON.
|
|
355
|
-
// if null or undefined is specified, not update this member in role when this role exists.
|
|
356
|
-
// if '' or zero array, this member in role is set empty array.
|
|
357
|
-
//
|
|
358
|
-
// [NOTE]
|
|
359
|
-
// This API does not set host into roles as initial. You can add host to role
|
|
360
|
-
// by another API which is an API dedicated to adding host.
|
|
361
|
-
//
|
|
362
|
-
function putRole(req, res, next) // eslint-disable-line no-unused-vars
|
|
363
|
-
{
|
|
364
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
365
|
-
|
|
366
|
-
res.type('application/json; charset=utf-8');
|
|
367
|
-
|
|
368
|
-
var result;
|
|
369
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
370
|
-
!apiutil.isSafeEntity(req.query) )
|
|
371
|
-
{
|
|
372
|
-
result = {
|
|
373
|
-
result: false,
|
|
374
|
-
message: 'PUT argument does not have any data'
|
|
375
|
-
};
|
|
376
|
-
|
|
377
|
-
r3logger.elog(result.message);
|
|
378
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
//------------------------------
|
|
383
|
-
// check token
|
|
384
|
-
//------------------------------
|
|
385
|
-
var token_result = r3token.checkToken(req, true, true); // scoped, user token
|
|
386
|
-
if(!token_result.result){
|
|
387
|
-
r3logger.elog(token_result.message);
|
|
388
|
-
var _status = token_result.status;
|
|
389
|
-
delete token_result.status;
|
|
390
|
-
resutil.errResponse(req, res, _status, token_result);
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
var token_info = token_result.token_info;
|
|
394
|
-
|
|
395
|
-
//------------------------------
|
|
396
|
-
// check arguments
|
|
397
|
-
//------------------------------
|
|
398
|
-
// name
|
|
399
|
-
if(!apiutil.isSafeString(req.query.name)){
|
|
400
|
-
result = {
|
|
401
|
-
result: false,
|
|
402
|
-
message: 'role:name field is wrong : ' + JSON.stringify(req.query.name)
|
|
403
|
-
};
|
|
404
|
-
|
|
405
|
-
r3logger.elog(result.message);
|
|
406
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
var keys = r3keys(token_info.user, token_info.tenant);
|
|
410
|
-
var name = apiutil.getSafeString(req.query.name);
|
|
411
|
-
name = name.toLowerCase();
|
|
412
|
-
|
|
413
|
-
// role name is only name or full yrn path
|
|
414
|
-
var nameptn = new RegExp('^' + keys.ROLE_TOP_KEY + ':(.*)'); // regex = /^yrn:yahoo:<service>::<tenant>:role:(.*)/
|
|
415
|
-
var namematchs = name.match(nameptn);
|
|
416
|
-
if(!apiutil.isEmptyArray(namematchs) && 2 <= namematchs.length){
|
|
417
|
-
name = namematchs[1];
|
|
418
|
-
}
|
|
419
|
-
// check name which is not full yrn
|
|
420
|
-
nameptn = new RegExp('^' + keys.NO_TENANT_KEY); // regex = /^yrn:yahoo:/
|
|
421
|
-
if(name.match(nameptn)){
|
|
422
|
-
result = {
|
|
423
|
-
result: false,
|
|
424
|
-
message: 'PUT request query has wrong yrn full path to role'
|
|
425
|
-
};
|
|
426
|
-
|
|
427
|
-
r3logger.elog(result.message);
|
|
428
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// policies
|
|
433
|
-
var policies = null;
|
|
434
|
-
if('' === req.query.policies){
|
|
435
|
-
policies = '';
|
|
436
|
-
}else if(apiutil.isSafeString(req.query.policies)){
|
|
437
|
-
// policies is encoded by JSON, this value is array.
|
|
438
|
-
//
|
|
439
|
-
var tmppolicies = apiutil.getSafeString(req.query.policies);
|
|
440
|
-
if(apiutil.checkSimpleJSON(tmppolicies)){
|
|
441
|
-
tmppolicies = JSON.parse(tmppolicies);
|
|
442
|
-
}
|
|
443
|
-
var policiesptn = new RegExp('^' + keys.POLICY_TOP_KEY + ':(.*)'); // regex = /^yrn:yahoo:<service>::<tenant>:policy:(.*)/
|
|
444
|
-
var policiespram= apiutil.getNormalizeParameter(tmppolicies, policiesptn, null);
|
|
445
|
-
if(false === policiespram.result){
|
|
446
|
-
result = {
|
|
447
|
-
result: false,
|
|
448
|
-
message: 'role:policies field is wrong : ' + req.query.policies
|
|
449
|
-
};
|
|
450
|
-
|
|
451
|
-
r3logger.elog(result.message);
|
|
452
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
453
|
-
return;
|
|
454
|
-
}
|
|
455
|
-
policies = policiespram.parameter;
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
// alias
|
|
459
|
-
var aliases = null;
|
|
460
|
-
if('' === req.query.alias){
|
|
461
|
-
aliases = '';
|
|
462
|
-
}else if(apiutil.isSafeString(req.query.alias)){
|
|
463
|
-
// alias is encoded by JSON, this value is array.
|
|
464
|
-
//
|
|
465
|
-
var tmpaliases = apiutil.getSafeString(req.query.alias);
|
|
466
|
-
if(apiutil.checkSimpleJSON(tmpaliases)){
|
|
467
|
-
tmpaliases = JSON.parse(tmpaliases);
|
|
468
|
-
}
|
|
469
|
-
var aliasptn = new RegExp('^' + keys.MATCH_ANY_TENANT_ROLE); // regex = /^yrn:yahoo:(.*)::(.*):role:(.*)/
|
|
470
|
-
var aliaspram = apiutil.getNormalizeParameter(tmpaliases, aliasptn, null);
|
|
471
|
-
if(false === aliaspram.result){
|
|
472
|
-
result = {
|
|
473
|
-
result: false,
|
|
474
|
-
message: 'role:alias field is wrong : ' + req.query.alias
|
|
475
|
-
};
|
|
476
|
-
|
|
477
|
-
r3logger.elog(result.message);
|
|
478
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
479
|
-
return;
|
|
480
|
-
}
|
|
481
|
-
aliases = aliaspram.parameter;
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
//------------------------------
|
|
485
|
-
// set all field to role
|
|
486
|
-
//------------------------------
|
|
487
|
-
result = k2hr3.setRoleAll(token_info.user, token_info.tenant, name, policies, aliases, null, false, null, false);
|
|
488
|
-
if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
|
|
489
|
-
if(!apiutil.isSafeEntity(result)){
|
|
490
|
-
result = {
|
|
491
|
-
result: false,
|
|
492
|
-
message: 'Could not get response from setRoleAll'
|
|
493
|
-
};
|
|
494
|
-
}else{
|
|
495
|
-
if(!apiutil.isSafeEntity(result.result)){
|
|
496
|
-
result.result = false;
|
|
497
|
-
}
|
|
498
|
-
if(!apiutil.isSafeEntity(result.message)){
|
|
499
|
-
result.message = 'Could not get error message in response from setRoleAll';
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
r3logger.elog(result.message);
|
|
503
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
r3logger.dlog('succeed : ' + result.message);
|
|
507
|
-
res.status(201); // 201: Created
|
|
508
|
-
res.send(JSON.stringify(result));
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
//
|
|
512
|
-
// Sub router function for POST CREATE HOST
|
|
513
|
-
//
|
|
514
|
-
// Mountpath : '/v1/role'
|
|
515
|
-
// POST '/v1/role/<role{/...}>' : post role on version 1
|
|
516
|
-
// HEADER : X-Auth-Token => User token or Role token
|
|
517
|
-
// response body : result => true/false
|
|
518
|
-
// message => messages
|
|
519
|
-
//
|
|
520
|
-
// [UserToken] body :
|
|
521
|
-
// {
|
|
522
|
-
// "host": { => specified single host
|
|
523
|
-
// "host": <hostname / ip address> => key is for "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/{name, ip}/<hostname port cuk>"
|
|
524
|
-
// "port": <port number> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/name/<hostname port cuk>"
|
|
525
|
-
// this value is number string(0-), allowed null and '' for this value.
|
|
526
|
-
// if this value is '0', it means any port.
|
|
527
|
-
// "cuk": <container unique key> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/name/<hostname port cuk>"
|
|
528
|
-
// this value is string. if this value is undefined/null/empty string, it means any.
|
|
529
|
-
// "extra": <extra string data> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
530
|
-
// extra is any string including Control code, allowed null and '' for this value.
|
|
531
|
-
// "tag": <string data> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
532
|
-
// tag is any string including Control code, allowed null and '' for this value.
|
|
533
|
-
// "inboundip": <ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
534
|
-
// inboundip is set ip address string. if you do not use proxy/gateway/bridge/etc, you do not need to set this key.
|
|
535
|
-
// "outboundip": <ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
536
|
-
// outboundip is set ip address string. if you do not use proxy/gateway/bridge/etc, you do not need to set this key.
|
|
537
|
-
// }
|
|
538
|
-
// "clear_hostname": <true/false>
|
|
539
|
-
// "clear_ips": <true/false>
|
|
540
|
-
// }
|
|
541
|
-
// or
|
|
542
|
-
// {
|
|
543
|
-
// "host": [ => specified host as Array(only POST request has this type)
|
|
544
|
-
// {
|
|
545
|
-
// "host": <hostname / ip address>
|
|
546
|
-
// "port": <port number>
|
|
547
|
-
// "cuk": <container unique key>
|
|
548
|
-
// "extra": <extra string data>
|
|
549
|
-
// "tag": <string data>
|
|
550
|
-
// "inboundip": <ip address>
|
|
551
|
-
// "outboundip": <ip address>
|
|
552
|
-
// }
|
|
553
|
-
// ...
|
|
554
|
-
// ]
|
|
555
|
-
// "clear_hostname": <true/false>
|
|
556
|
-
// "clear_ips": <true/false>
|
|
557
|
-
// }
|
|
558
|
-
//
|
|
559
|
-
// [RoleToken] body :
|
|
560
|
-
// {
|
|
561
|
-
// "host": {
|
|
562
|
-
// "port": <port number> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/ip/<ip port cuk>"
|
|
563
|
-
// this value is number string(0-), allowed null and '' for this value.
|
|
564
|
-
// if this value is '0', it means any port.
|
|
565
|
-
// "cuk": <container unique key> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/name/<hostname port cuk>"
|
|
566
|
-
// this value is string. if this value is undefined/null/empty string, it means any.
|
|
567
|
-
// "extra": <extra string data> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
568
|
-
// extra is any string including Control code, allowed null and '' for this value.
|
|
569
|
-
// "tag": <string data> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
570
|
-
// tag is any string including Control code, allowed null and '' for this value.
|
|
571
|
-
// "inboundip": <ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
572
|
-
// inboundip is set ip address string. if you do not use proxy/gateway/bridge/etc, you do not need to set this key.
|
|
573
|
-
// "outboundip": <ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
574
|
-
// outboundip is set ip address string. if you do not use proxy/gateway/bridge/etc, you do not need to set this key.
|
|
575
|
-
// }
|
|
576
|
-
// }
|
|
577
|
-
//
|
|
578
|
-
// [NOTE]
|
|
579
|
-
// This API only set(add/create) host into role. The host is specified hostname.
|
|
580
|
-
// The hostname is any string as like hostname.(ex. "x.yahoo.co.jp", "x[0-9].yahoo.co.jp", "*.yahoo.co.jp", "*", "(.*)", etc)
|
|
581
|
-
// If port number is 0, it means any port.
|
|
582
|
-
// If cuk is undefined/null/empty string, it means any.
|
|
583
|
-
// Extra data can include control-code(CR, etc).
|
|
584
|
-
//
|
|
585
|
-
function postRoleHost(role, req, res, next) // eslint-disable-line no-unused-vars
|
|
586
|
-
{
|
|
587
|
-
var result;
|
|
588
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
589
|
-
!apiutil.isSafeEntity(req.body) ||
|
|
590
|
-
!apiutil.isSafeEntity(req.body.host) )
|
|
591
|
-
{
|
|
592
|
-
result = {
|
|
593
|
-
result: false,
|
|
594
|
-
message: 'POST body does not have host data'
|
|
595
|
-
};
|
|
596
|
-
|
|
597
|
-
r3logger.elog(result.message);
|
|
598
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
599
|
-
return;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
//------------------------------
|
|
603
|
-
// check token
|
|
604
|
-
//------------------------------
|
|
605
|
-
var token_result = r3token.checkToken(req, true); // scoped, both token
|
|
606
|
-
if(!token_result.result){
|
|
607
|
-
r3logger.elog(token_result.message);
|
|
608
|
-
var _status = token_result.status;
|
|
609
|
-
delete token_result.status;
|
|
610
|
-
resutil.errResponse(req, res, _status, token_result);
|
|
611
|
-
return;
|
|
612
|
-
}
|
|
613
|
-
var is_host_req = (!apiutil.isArray(req.body.host) && !apiutil.isSafeString(req.body.host.host));
|
|
614
|
-
var token_info = token_result.token_info;
|
|
615
|
-
var keys = r3keys(token_info.user, token_info.tenant);
|
|
616
|
-
|
|
617
|
-
//------------------------------
|
|
618
|
-
// check arguments
|
|
619
|
-
//------------------------------
|
|
620
|
-
// role name check
|
|
621
|
-
var name = apiutil.getSafeString(role);
|
|
622
|
-
name = name.toLowerCase();
|
|
623
|
-
var nameptn = new RegExp('^' + keys.ROLE_TOP_KEY + ':(.*)'); // regex = /^yrn:yahoo:<service>::<tenant>:role:(.*)/
|
|
624
|
-
var namematchs = name.match(nameptn);
|
|
625
|
-
if(!apiutil.isEmptyArray(namematchs) && 2 <= namematchs.length){
|
|
626
|
-
// name is full yrn, then reset only name.
|
|
627
|
-
name = namematchs[1];
|
|
628
|
-
}else{
|
|
629
|
-
// role name is not full yrn, then check other yrn path
|
|
630
|
-
nameptn = new RegExp('^' + keys.NO_TENANT_KEY); // regex = /^yrn:yahoo:/
|
|
631
|
-
if(name.match(nameptn)){
|
|
632
|
-
result = {
|
|
633
|
-
result: false,
|
|
634
|
-
message: 'POST request url has wrong yrn full path to role'
|
|
635
|
-
};
|
|
636
|
-
|
|
637
|
-
r3logger.elog(result.message);
|
|
638
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
639
|
-
return;
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
//------------------------------
|
|
644
|
-
// build parameters
|
|
645
|
-
//------------------------------
|
|
646
|
-
var port;
|
|
647
|
-
var cuk;
|
|
648
|
-
var extra;
|
|
649
|
-
var tag;
|
|
650
|
-
var host_info;
|
|
651
|
-
if(!is_host_req){
|
|
652
|
-
//
|
|
653
|
-
// request from user token
|
|
654
|
-
//
|
|
655
|
-
var hostArray;
|
|
656
|
-
if(apiutil.isArray(req.body.host)){
|
|
657
|
-
hostArray = req.body.host;
|
|
658
|
-
}else{
|
|
659
|
-
hostArray = [ req.body.host ];
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
// check array and make ip array
|
|
663
|
-
var hostnameArray = [];
|
|
664
|
-
var ipArray = [];
|
|
665
|
-
for(var cnt = 0; cnt < hostArray.length; ++cnt){
|
|
666
|
-
if(!apiutil.isSafeString(hostArray[cnt].host)){
|
|
667
|
-
result = {
|
|
668
|
-
result: false,
|
|
669
|
-
message: 'host is not specified.'
|
|
670
|
-
};
|
|
671
|
-
|
|
672
|
-
r3logger.elog(result.message);
|
|
673
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
674
|
-
return;
|
|
675
|
-
}
|
|
676
|
-
// hostname or ip address
|
|
677
|
-
var tg_host = apiutil.getSafeString(hostArray[cnt].host);
|
|
678
|
-
var tg_ip = null;
|
|
679
|
-
if(apiutil.isIpAddressString(tg_host)){
|
|
680
|
-
tg_ip = tg_host.toLowerCase();
|
|
681
|
-
tg_host = null;
|
|
682
|
-
}else{
|
|
683
|
-
tg_host = tg_host.toLowerCase();
|
|
684
|
-
tg_ip = null;
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
// port
|
|
688
|
-
port = 0; // default any
|
|
689
|
-
if(apiutil.isSafeEntity(hostArray[cnt].port)){
|
|
690
|
-
if(isNaN(hostArray[cnt].port)){
|
|
691
|
-
result = {
|
|
692
|
-
result: false,
|
|
693
|
-
message: 'POST request has port which is not number: ' + JSON.stringify(hostArray[cnt].port)
|
|
694
|
-
};
|
|
695
|
-
|
|
696
|
-
r3logger.elog(result.message);
|
|
697
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
698
|
-
return;
|
|
699
|
-
}
|
|
700
|
-
port = parseInt(hostArray[cnt].port);
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
// cuk
|
|
704
|
-
cuk = null; // default any
|
|
705
|
-
if(apiutil.isSafeString(hostArray[cnt].cuk) && apiutil.isSafeString(hostArray[cnt].cuk.trim())){
|
|
706
|
-
cuk = apiutil.getSafeString(hostArray[cnt].cuk).trim();
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
// extra
|
|
710
|
-
extra = null;
|
|
711
|
-
if(apiutil.isSafeString(hostArray[cnt].extra)){
|
|
712
|
-
extra = apiutil.getSafeString(hostArray[cnt].extra);
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
// tag
|
|
716
|
-
tag = null;
|
|
717
|
-
if(apiutil.isSafeString(hostArray[cnt].tag)){
|
|
718
|
-
tag = apiutil.getSafeString(hostArray[cnt].tag);
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
// set base host information
|
|
722
|
-
if(null !== tg_host){
|
|
723
|
-
host_info = {
|
|
724
|
-
ip: null,
|
|
725
|
-
hostname: tg_host,
|
|
726
|
-
port: port,
|
|
727
|
-
cuk: cuk,
|
|
728
|
-
extra: extra,
|
|
729
|
-
tag: tag
|
|
730
|
-
};
|
|
731
|
-
}else{ // null !== tg_ip
|
|
732
|
-
host_info = {
|
|
733
|
-
ip: tg_ip,
|
|
734
|
-
hostname: null,
|
|
735
|
-
port: port,
|
|
736
|
-
cuk: cuk,
|
|
737
|
-
extra: extra,
|
|
738
|
-
tag: tag
|
|
739
|
-
};
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
// set optional keys
|
|
743
|
-
if(apiutil.isSafeString(hostArray[cnt].inboundip)){
|
|
744
|
-
if(!apiutil.isIpAddressString(hostArray[cnt].inboundip)){
|
|
745
|
-
result = {
|
|
746
|
-
result: false,
|
|
747
|
-
message: 'POST request has inbound ip address which is not ignore ip address string: ' + JSON.stringify(hostArray[cnt].inboundip)
|
|
748
|
-
};
|
|
749
|
-
r3logger.elog(result.message);
|
|
750
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
751
|
-
return;
|
|
752
|
-
}
|
|
753
|
-
host_info.inboundip = apiutil.getSafeString(hostArray[cnt].inboundip);
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
if(apiutil.isSafeString(hostArray[cnt].outboundip)){
|
|
757
|
-
if(!apiutil.isIpAddressString(hostArray[cnt].outboundip)){
|
|
758
|
-
result = {
|
|
759
|
-
result: false,
|
|
760
|
-
message: 'POST request has outbound ip address which is not ignore ip address string: ' + JSON.stringify(hostArray[cnt].outboundip)
|
|
761
|
-
};
|
|
762
|
-
r3logger.elog(result.message);
|
|
763
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
764
|
-
return;
|
|
765
|
-
}
|
|
766
|
-
host_info.outboundip = apiutil.getSafeString(hostArray[cnt].outboundip);
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
// push array
|
|
770
|
-
if(null !== tg_host){
|
|
771
|
-
hostnameArray.push(host_info);
|
|
772
|
-
}else{ // null !== tg_ip
|
|
773
|
-
ipArray.push(host_info);
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
if(apiutil.isEmptyArray(hostnameArray)){
|
|
777
|
-
hostnameArray = null;
|
|
778
|
-
}
|
|
779
|
-
if(apiutil.isEmptyArray(ipArray)){
|
|
780
|
-
ipArray = null;
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
var clear_hostname = false;
|
|
784
|
-
var clear_ips = false;
|
|
785
|
-
if(apiutil.isSafeEntity(req.body.clear_hostname) && 'boolean' === typeof req.body.clear_hostname){
|
|
786
|
-
clear_hostname = req.body.clear_hostname;
|
|
787
|
-
}
|
|
788
|
-
if(apiutil.isSafeEntity(req.body.clear_ips) && 'boolean' === typeof req.body.clear_ips){
|
|
789
|
-
clear_ips = req.body.clear_ips;
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
//
|
|
793
|
-
// Add hostnames and ips ---> Need User Token
|
|
794
|
-
//
|
|
795
|
-
result = k2hr3.updateRoleHosts(token_info.user, token_info.tenant, name, hostnameArray, clear_hostname, ipArray, clear_ips);
|
|
796
|
-
|
|
797
|
-
}else{
|
|
798
|
-
//
|
|
799
|
-
// request from host(token)
|
|
800
|
-
//
|
|
801
|
-
|
|
802
|
-
// get ip address
|
|
803
|
-
var ip = apiutil.getClientIpAddress(req);
|
|
804
|
-
if(!apiutil.isSafeString(ip)){
|
|
805
|
-
result = {
|
|
806
|
-
result: false,
|
|
807
|
-
message: 'Could not get ip address from request.'
|
|
808
|
-
};
|
|
809
|
-
|
|
810
|
-
r3logger.elog(result.message);
|
|
811
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
812
|
-
return;
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
// port
|
|
816
|
-
port = 0; // default any
|
|
817
|
-
if(apiutil.isSafeEntity(req.body.host.port)){
|
|
818
|
-
if(isNaN(req.body.host.port)){
|
|
819
|
-
result = {
|
|
820
|
-
result: false,
|
|
821
|
-
message: 'POST request has port which is not number: ' + JSON.stringify(req.body.host.port)
|
|
822
|
-
};
|
|
823
|
-
|
|
824
|
-
r3logger.elog(result.message);
|
|
825
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
826
|
-
return;
|
|
827
|
-
}
|
|
828
|
-
port = parseInt(req.body.host.port);
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
// cuk
|
|
832
|
-
cuk = null; // default any
|
|
833
|
-
if(apiutil.isSafeString(req.body.host.cuk) && apiutil.isSafeString(req.body.host.cuk.trim())){
|
|
834
|
-
cuk = apiutil.getSafeString(req.body.host.cuk).trim();
|
|
835
|
-
}
|
|
836
|
-
|
|
837
|
-
// extra
|
|
838
|
-
extra = null;
|
|
839
|
-
if(apiutil.isSafeString(req.body.host.extra)){
|
|
840
|
-
extra = apiutil.getSafeString(req.body.host.extra);
|
|
841
|
-
if(apiutil.checkSimpleJSON(extra)){
|
|
842
|
-
extra = JSON.parse(extra);
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
// tag
|
|
847
|
-
tag = null;
|
|
848
|
-
if(apiutil.isSafeString(req.body.host.tag)){
|
|
849
|
-
tag = apiutil.getSafeString(req.body.host.tag);
|
|
850
|
-
if(apiutil.checkSimpleJSON(tag)){
|
|
851
|
-
tag = JSON.parse(tag);
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
|
|
855
|
-
// inboundip(optional)
|
|
856
|
-
var inboundip = null;
|
|
857
|
-
if(apiutil.isSafeString(req.body.host.inboundip)){
|
|
858
|
-
if(!apiutil.isIpAddressString(req.body.host.inboundip)){
|
|
859
|
-
result = {
|
|
860
|
-
result: false,
|
|
861
|
-
message: 'POST request has inbound ip address which is not ignore ip address string: ' + JSON.stringify(req.body.host.inboundip)
|
|
862
|
-
};
|
|
863
|
-
r3logger.elog(result.message);
|
|
864
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
865
|
-
return;
|
|
866
|
-
}
|
|
867
|
-
inboundip = apiutil.getSafeString(req.body.host.inboundip);
|
|
868
|
-
}
|
|
869
|
-
|
|
870
|
-
// outboundip(optional)
|
|
871
|
-
var outboundip = null;
|
|
872
|
-
if(apiutil.isSafeString(req.body.host.outboundip)){
|
|
873
|
-
if(!apiutil.isIpAddressString(req.body.host.outboundip)){
|
|
874
|
-
result = {
|
|
875
|
-
result: false,
|
|
876
|
-
message: 'POST request has outbound ip address which is not ignore ip address string: ' + JSON.stringify(req.body.host.outboundip)
|
|
877
|
-
};
|
|
878
|
-
r3logger.elog(result.message);
|
|
879
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
880
|
-
return;
|
|
881
|
-
}
|
|
882
|
-
outboundip = apiutil.getSafeString(req.body.host.outboundip);
|
|
883
|
-
}
|
|
884
|
-
|
|
885
|
-
//
|
|
886
|
-
// Add ip address ---> Role Token or User Token
|
|
887
|
-
//
|
|
888
|
-
result = k2hr3.addHost(token_info.tenant, name, null, ip, port, cuk, extra, tag, inboundip, outboundip);
|
|
889
|
-
}
|
|
890
|
-
|
|
891
|
-
//------------------------------
|
|
892
|
-
// check result
|
|
893
|
-
//------------------------------
|
|
894
|
-
if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
|
|
895
|
-
if(!apiutil.isSafeEntity(result)){
|
|
896
|
-
result = {
|
|
897
|
-
result: false,
|
|
898
|
-
message: 'Could not get response from addHost'
|
|
899
|
-
};
|
|
900
|
-
}else{
|
|
901
|
-
if(!apiutil.isSafeEntity(result.result)){
|
|
902
|
-
result.result = false;
|
|
903
|
-
}
|
|
904
|
-
if(!apiutil.isSafeEntity(result.message)){
|
|
905
|
-
result.message = 'Could not get error message in response from addHost';
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
r3logger.elog(result.message);
|
|
909
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
910
|
-
return;
|
|
911
|
-
}
|
|
912
|
-
r3logger.dlog('succeed : ' + result.message);
|
|
913
|
-
res.status(201); // 201: Created
|
|
914
|
-
res.send(JSON.stringify(result));
|
|
915
|
-
}
|
|
916
|
-
|
|
917
|
-
//
|
|
918
|
-
// Sub router function for PUT CREATE HOST
|
|
919
|
-
//
|
|
920
|
-
// Mountpath : '/v1/role'
|
|
921
|
-
// PUT '/v1/role/<role{/...}>' : put role on version 1
|
|
922
|
-
// HEADER : X-Auth-Token => User token or Role token
|
|
923
|
-
// response body : result => true/false
|
|
924
|
-
// message => messages
|
|
925
|
-
//
|
|
926
|
-
// [UserToken] url argument
|
|
927
|
-
// "host": <hostname or ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/{name, ip}/<hostname port cuk>"
|
|
928
|
-
// "port": <port number> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/name/<hostname port cuk>"
|
|
929
|
-
// this value is number string(0-), allowed null and '' for this value.
|
|
930
|
-
// if this value is '0', it means any port.
|
|
931
|
-
// "cuk": <container unique key> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/name/<hostname port cuk>"
|
|
932
|
-
// this value is string. if this value is undefined/null/empty string, it means any.
|
|
933
|
-
// "extra": <extra string data> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
934
|
-
// This value must be encoded by JSON.
|
|
935
|
-
// extra is any string including Control code, allowed null and '' for this value.
|
|
936
|
-
// "tag": <string data> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
937
|
-
// This value must be encoded by JSON.
|
|
938
|
-
// tag is any string including Control code, allowed null and '' for this value.
|
|
939
|
-
// "inboundip": <ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
940
|
-
// inboundip is set ip address string. if you do not use proxy/gateway/bridge/etc, you do not need to set this key.
|
|
941
|
-
// "outboundip": <ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
942
|
-
// outboundip is set ip address string. if you do not use proxy/gateway/bridge/etc, you do not need to set this key.
|
|
943
|
-
//
|
|
944
|
-
// [RoleToken] url argument
|
|
945
|
-
// "port": <port number> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/ip/<ip port cuk>"
|
|
946
|
-
// this value is number string(0-), allowed null and '' for this value.
|
|
947
|
-
// if this value is '0', it means any port.
|
|
948
|
-
// "cuk": <container unique key> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/name/<hostname port cuk>"
|
|
949
|
-
// this value is string. if this value is undefined/null/empty string, it means any.
|
|
950
|
-
// "extra": <extra string data> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
951
|
-
// This value must be encoded by JSON.
|
|
952
|
-
// extra is any string including Control code, allowed null and '' for this value.
|
|
953
|
-
// "tag": <string data> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
954
|
-
// This value must be encoded by JSON.
|
|
955
|
-
// tag is any string including Control code, allowed null and '' for this value.
|
|
956
|
-
// "inboundip": <ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
957
|
-
// inboundip is set ip address string. if you do not use proxy/gateway/bridge/etc, you do not need to set this key.
|
|
958
|
-
// "outboundip": <ip address> => key is "yrn:yahoo:<service>::<tenant>:role:<role>/hosts/..."
|
|
959
|
-
// outboundip is set ip address string. if you do not use proxy/gateway/bridge/etc, you do not need to set this key.
|
|
960
|
-
//
|
|
961
|
-
// [NOTE]
|
|
962
|
-
// This API only set(add/create) host into role. Ether hostname or ip address must be specified.
|
|
963
|
-
// If port number is 0, it means any port.
|
|
964
|
-
// If cuk is undefined/null/empty string, it means any.
|
|
965
|
-
// Extra data can include control-code(CR, etc).
|
|
966
|
-
//
|
|
967
|
-
function putRoleHost(role, req, res, next) // eslint-disable-line no-unused-vars
|
|
968
|
-
{
|
|
969
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
970
|
-
|
|
971
|
-
res.type('application/json; charset=utf-8');
|
|
972
|
-
|
|
973
|
-
var result;
|
|
974
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
975
|
-
!apiutil.isSafeEntity(req.query) )
|
|
976
|
-
{
|
|
977
|
-
result = {
|
|
978
|
-
result: false,
|
|
979
|
-
message: 'PUT argument does not have any data'
|
|
980
|
-
};
|
|
981
|
-
|
|
982
|
-
r3logger.elog(result.message);
|
|
983
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
984
|
-
return;
|
|
985
|
-
}
|
|
986
|
-
|
|
987
|
-
//------------------------------
|
|
988
|
-
// check token
|
|
989
|
-
//------------------------------
|
|
990
|
-
var token_result = r3token.checkToken(req, true); // scoped, both token
|
|
991
|
-
if(!token_result.result){
|
|
992
|
-
r3logger.elog(token_result.message);
|
|
993
|
-
var _status = token_result.status;
|
|
994
|
-
delete token_result.status;
|
|
995
|
-
resutil.errResponse(req, res, _status, token_result);
|
|
996
|
-
return;
|
|
997
|
-
}
|
|
998
|
-
var is_host_req = !apiutil.isSafeString(req.query.host);
|
|
999
|
-
var token_info = token_result.token_info;
|
|
1000
|
-
var keys = r3keys(token_info.user, token_info.tenant);
|
|
1001
|
-
|
|
1002
|
-
//------------------------------
|
|
1003
|
-
// check arguments
|
|
1004
|
-
//------------------------------
|
|
1005
|
-
// role name check
|
|
1006
|
-
var name = apiutil.getSafeString(role);
|
|
1007
|
-
name = name.toLowerCase();
|
|
1008
|
-
var nameptn = new RegExp('^' + keys.ROLE_TOP_KEY + ':(.*)'); // regex = /^yrn:yahoo:<service>::<tenant>:role:(.*)/
|
|
1009
|
-
var namematchs = name.match(nameptn);
|
|
1010
|
-
if(!apiutil.isEmptyArray(namematchs) && 2 <= namematchs.length){
|
|
1011
|
-
// name is full yrn, then reset only name.
|
|
1012
|
-
name = namematchs[1];
|
|
1013
|
-
}else{
|
|
1014
|
-
// role name is not full yrn, then check other yrn path
|
|
1015
|
-
nameptn = new RegExp('^' + keys.NO_TENANT_KEY); // regex = /^yrn:yahoo:/
|
|
1016
|
-
if(name.match(nameptn)){
|
|
1017
|
-
result = {
|
|
1018
|
-
result: false,
|
|
1019
|
-
message: 'POST request url has wrong yrn full path to role'
|
|
1020
|
-
};
|
|
1021
|
-
|
|
1022
|
-
r3logger.elog(result.message);
|
|
1023
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1024
|
-
return;
|
|
1025
|
-
}
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
// hostname
|
|
1029
|
-
var hostname= null;
|
|
1030
|
-
var ip = null;
|
|
1031
|
-
if(!is_host_req){
|
|
1032
|
-
if(!apiutil.isSafeString(req.query.host)){
|
|
1033
|
-
result = {
|
|
1034
|
-
result: false,
|
|
1035
|
-
message: 'host is not specified.'
|
|
1036
|
-
};
|
|
1037
|
-
|
|
1038
|
-
r3logger.elog(result.message);
|
|
1039
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1040
|
-
return;
|
|
1041
|
-
}
|
|
1042
|
-
var tg_host = apiutil.getSafeString(req.query.host);
|
|
1043
|
-
if(apiutil.isIpAddressString(tg_host)){
|
|
1044
|
-
ip = tg_host.toLowerCase();
|
|
1045
|
-
}else{
|
|
1046
|
-
hostname= tg_host.toLowerCase();
|
|
1047
|
-
}
|
|
1048
|
-
}else{
|
|
1049
|
-
// get ip address
|
|
1050
|
-
ip = apiutil.getClientIpAddress(req);
|
|
1051
|
-
if(!apiutil.isSafeString(ip)){
|
|
1052
|
-
result = {
|
|
1053
|
-
result: false,
|
|
1054
|
-
message: 'Could not get ip address from request.'
|
|
1055
|
-
};
|
|
1056
|
-
|
|
1057
|
-
r3logger.elog(result.message);
|
|
1058
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1059
|
-
return;
|
|
1060
|
-
}
|
|
1061
|
-
}
|
|
1062
|
-
|
|
1063
|
-
// port
|
|
1064
|
-
var port;
|
|
1065
|
-
if(apiutil.isSafeString(req.query.port)){
|
|
1066
|
-
if(isNaN(req.query.port)){
|
|
1067
|
-
result = {
|
|
1068
|
-
result: false,
|
|
1069
|
-
message: 'PUT request has port which is not number: ' + JSON.stringify(req.query.port)
|
|
1070
|
-
};
|
|
1071
|
-
|
|
1072
|
-
r3logger.elog(result.message);
|
|
1073
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1074
|
-
return;
|
|
1075
|
-
}
|
|
1076
|
-
port = parseInt(req.query.port);
|
|
1077
|
-
}else{
|
|
1078
|
-
port = 0; // default any
|
|
1079
|
-
}
|
|
1080
|
-
|
|
1081
|
-
// cuk
|
|
1082
|
-
var cuk;
|
|
1083
|
-
if(apiutil.isSafeString(req.query.cuk) && apiutil.isSafeString(req.query.cuk.trim())){
|
|
1084
|
-
cuk = apiutil.getSafeString(req.query.cuk).trim();
|
|
1085
|
-
}else{
|
|
1086
|
-
cuk = null;
|
|
1087
|
-
}
|
|
1088
|
-
|
|
1089
|
-
// extra
|
|
1090
|
-
var extra;
|
|
1091
|
-
if(apiutil.isSafeString(req.query.extra)){
|
|
1092
|
-
extra = apiutil.getSafeString(req.query.extra);
|
|
1093
|
-
if(apiutil.checkSimpleJSON(extra)){
|
|
1094
|
-
extra = JSON.parse(extra); // extra encoded JSON
|
|
1095
|
-
}
|
|
1096
|
-
}else{
|
|
1097
|
-
extra = null;
|
|
1098
|
-
}
|
|
1099
|
-
|
|
1100
|
-
// tag
|
|
1101
|
-
var tag;
|
|
1102
|
-
if(apiutil.isSafeString(req.query.tag)){
|
|
1103
|
-
tag = apiutil.getSafeString(req.query.tag);
|
|
1104
|
-
if(apiutil.checkSimpleJSON(tag)){
|
|
1105
|
-
tag = JSON.parse(tag); // tag encoded JSON
|
|
1106
|
-
}
|
|
1107
|
-
}else{
|
|
1108
|
-
tag = null;
|
|
1109
|
-
}
|
|
1110
|
-
|
|
1111
|
-
// make base host information
|
|
1112
|
-
var host_info = { ip: ip, hostname: hostname, port: port, cuk: cuk, extra: extra, tag: tag };
|
|
1113
|
-
|
|
1114
|
-
// set inboundip(optional)
|
|
1115
|
-
var inboundip = null;
|
|
1116
|
-
if(apiutil.isSafeString(req.query.inboundip)){
|
|
1117
|
-
if(!apiutil.isIpAddressString(req.query.inboundip)){
|
|
1118
|
-
result = {
|
|
1119
|
-
result: false,
|
|
1120
|
-
message: 'PUT request has inbound ip address which is not ignore ip address string: ' + JSON.stringify(req.query.inboundip)
|
|
1121
|
-
};
|
|
1122
|
-
r3logger.elog(result.message);
|
|
1123
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1124
|
-
return;
|
|
1125
|
-
}
|
|
1126
|
-
inboundip = apiutil.getSafeString(req.query.inboundip);
|
|
1127
|
-
host_info.inboundip = inboundip;
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
// set outboundip(optional)
|
|
1131
|
-
var outboundip = null;
|
|
1132
|
-
if(apiutil.isSafeString(req.query.outboundip)){
|
|
1133
|
-
if(!apiutil.isIpAddressString(req.query.outboundip)){
|
|
1134
|
-
result = {
|
|
1135
|
-
result: false,
|
|
1136
|
-
message: 'PUT request has outbound ip address which is not ignore ip address string: ' + JSON.stringify(req.query.outboundip)
|
|
1137
|
-
};
|
|
1138
|
-
r3logger.elog(result.message);
|
|
1139
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1140
|
-
return;
|
|
1141
|
-
}
|
|
1142
|
-
outboundip = apiutil.getSafeString(req.query.outboundip);
|
|
1143
|
-
host_info.outboundip= outboundip;
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
|
-
//------------------------------
|
|
1147
|
-
// add host to role
|
|
1148
|
-
//------------------------------
|
|
1149
|
-
if(!is_host_req){
|
|
1150
|
-
// Add hostname ---> Need User Token
|
|
1151
|
-
if(null === ip){
|
|
1152
|
-
result = k2hr3.updateRoleHosts(token_info.user, token_info.tenant, name, host_info);
|
|
1153
|
-
}else{
|
|
1154
|
-
result = k2hr3.updateRoleHosts(token_info.user, token_info.tenant, name, null, false, host_info);
|
|
1155
|
-
}
|
|
1156
|
-
}else{
|
|
1157
|
-
// Add ip address ---> Role Token or User Token
|
|
1158
|
-
result = k2hr3.addHost(token_info.tenant, name, null, ip, port, cuk, extra, tag, inboundip, outboundip);
|
|
1159
|
-
}
|
|
1160
|
-
if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
|
|
1161
|
-
if(!apiutil.isSafeEntity(result)){
|
|
1162
|
-
result = {
|
|
1163
|
-
result: false,
|
|
1164
|
-
message: 'Could not get response from addHost'
|
|
1165
|
-
};
|
|
1166
|
-
}else{
|
|
1167
|
-
if(!apiutil.isSafeEntity(result.result)){
|
|
1168
|
-
result.result = false;
|
|
1169
|
-
}
|
|
1170
|
-
if(!apiutil.isSafeEntity(result.message)){
|
|
1171
|
-
result.message = 'Could not get error message in response from addHost';
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
r3logger.elog(result.message);
|
|
1175
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1176
|
-
return;
|
|
1177
|
-
}
|
|
1178
|
-
r3logger.dlog('succeed : ' + result.message);
|
|
1179
|
-
res.status(201); // 201: Created
|
|
1180
|
-
res.send(JSON.stringify(result));
|
|
1181
|
-
}
|
|
1182
|
-
|
|
1183
|
-
//---------------------------------------------------------
|
|
1184
|
-
// Router GET
|
|
1185
|
-
//---------------------------------------------------------
|
|
1186
|
-
//
|
|
1187
|
-
// Mountpath : '/v1/role/<role{/...}>'
|
|
1188
|
-
//
|
|
1189
|
-
// GET '/v1/role/<role{/...}>' : get role on version 1
|
|
1190
|
-
// HEADER : X-Auth-Token => User token
|
|
1191
|
-
// URL arguments : expand => "true"(default) or "false"
|
|
1192
|
-
// response : {
|
|
1193
|
-
// "result": true or false
|
|
1194
|
-
// "message": error message
|
|
1195
|
-
// "role": {
|
|
1196
|
-
// policies: array,
|
|
1197
|
-
// aliases: array <--- only not expand
|
|
1198
|
-
// hosts: { <--- only not expand
|
|
1199
|
-
// 'hostnames': [ hostname array or empty array
|
|
1200
|
-
// <hostname> <port> <cuk> <extra> <tag>, (if any port, port is *)
|
|
1201
|
-
// ...
|
|
1202
|
-
// ],
|
|
1203
|
-
// 'ips': [ ip address array or empty array
|
|
1204
|
-
// <ip address> <port> <cuk> <extra> <tag>,(if any port, port is *)
|
|
1205
|
-
// ...
|
|
1206
|
-
// ]
|
|
1207
|
-
// }
|
|
1208
|
-
// }
|
|
1209
|
-
// }
|
|
1210
|
-
//
|
|
1211
|
-
// GET '/v1/role/token/<role{/...}>' : get role token on version 1
|
|
1212
|
-
// HEADER : X-Auth-Token => User token or Role token
|
|
1213
|
-
// URL arguments : expire => "expire time(unix time value)" or undefined(default 24H)
|
|
1214
|
-
// response : {
|
|
1215
|
-
// "result": true or false
|
|
1216
|
-
// "message": error message
|
|
1217
|
-
// "token": "role token"
|
|
1218
|
-
// "registerpath": "path for registering"
|
|
1219
|
-
// }
|
|
1220
|
-
//
|
|
1221
|
-
// GET '/v1/role/token/list/<role{/...}>': get list of role tokens on version 1
|
|
1222
|
-
// HEADER : X-Auth-Token => User token
|
|
1223
|
-
// URL arguments : expand => "true"(default) or "false"
|
|
1224
|
-
// response : {
|
|
1225
|
-
// result: true/false
|
|
1226
|
-
// message: null or error message string
|
|
1227
|
-
// tokens: {
|
|
1228
|
-
// "token": {
|
|
1229
|
-
// date: create date(UTC ISO 8601)
|
|
1230
|
-
// expire: expire date(UTC ISO 8601)
|
|
1231
|
-
// user: user name if user created this token
|
|
1232
|
-
// hostname: hostname if this token was created by host(name)
|
|
1233
|
-
// ip: ip address if this token was created by ip
|
|
1234
|
-
// port: port number, if specified port when created token
|
|
1235
|
-
// cuk: cuk, if specified cuk when created token
|
|
1236
|
-
// },
|
|
1237
|
-
// ...
|
|
1238
|
-
// }
|
|
1239
|
-
// }
|
|
1240
|
-
// or
|
|
1241
|
-
// {
|
|
1242
|
-
// result: true/false
|
|
1243
|
-
// message: null or error message string
|
|
1244
|
-
// tokens: [
|
|
1245
|
-
// "role token",
|
|
1246
|
-
// ....
|
|
1247
|
-
// ]
|
|
1248
|
-
// }
|
|
1249
|
-
//
|
|
1250
|
-
// This mount point is for creating(update) role or creating(update) host in role.
|
|
1251
|
-
// And get role token by host(ip address) or user(user token), update role token by
|
|
1252
|
-
// role token.
|
|
1253
|
-
//
|
|
1254
|
-
router.get('/', function(req, res, next)
|
|
1255
|
-
{
|
|
1256
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
1257
|
-
|
|
1258
|
-
if('GET' !== req.method){
|
|
1259
|
-
// HEAD request comes here, so it should be routed to head function.
|
|
1260
|
-
next();
|
|
1261
|
-
return;
|
|
1262
|
-
}
|
|
1263
|
-
|
|
1264
|
-
res.type('application/json; charset=utf-8');
|
|
1265
|
-
|
|
1266
|
-
var result;
|
|
1267
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
1268
|
-
!apiutil.isSafeEntity(req.baseUrl) )
|
|
1269
|
-
{
|
|
1270
|
-
result = {
|
|
1271
|
-
result: false,
|
|
1272
|
-
message: 'GET request or url is wrong'
|
|
1273
|
-
};
|
|
1274
|
-
|
|
1275
|
-
r3logger.elog(result.message);
|
|
1276
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1277
|
-
return;
|
|
1278
|
-
}
|
|
1279
|
-
|
|
1280
|
-
//------------------------------
|
|
1281
|
-
// check token for API mode
|
|
1282
|
-
//------------------------------
|
|
1283
|
-
var token_str = null;
|
|
1284
|
-
var token_type = null;
|
|
1285
|
-
var token_info = null;
|
|
1286
|
-
var keys = r3keys();
|
|
1287
|
-
if(r3token.hasAuthTokenHeader(req)){
|
|
1288
|
-
var token_result = r3token.checkToken(req, true); // scoped, both token
|
|
1289
|
-
if(!token_result.result){
|
|
1290
|
-
r3logger.elog(token_result.message);
|
|
1291
|
-
var _status = token_result.status;
|
|
1292
|
-
delete token_result.status;
|
|
1293
|
-
resutil.errResponse(req, res, _status, token_result);
|
|
1294
|
-
return;
|
|
1295
|
-
}
|
|
1296
|
-
token_str = token_result.token;
|
|
1297
|
-
token_type = token_result.token_type;
|
|
1298
|
-
token_info = token_result.token_info;
|
|
1299
|
-
keys = r3keys(token_info.user, token_info.tenant);
|
|
1300
|
-
}
|
|
1301
|
-
|
|
1302
|
-
//------------------------------
|
|
1303
|
-
// get role name
|
|
1304
|
-
//------------------------------
|
|
1305
|
-
// check get token type and parse role name
|
|
1306
|
-
var is_get_token= false;
|
|
1307
|
-
var is_get_list = false;
|
|
1308
|
-
var requestptn = new RegExp(keys.MATCH_URI_GET_RTOKEN_LIST); // regex = /^\/v1\/role\/token\/list\/(.*)/
|
|
1309
|
-
var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
1310
|
-
if(!apiutil.isEmptyArray(reqmatchs) && 2 <= reqmatchs.length && '' !== apiutil.getSafeString(reqmatchs[1])){
|
|
1311
|
-
// get list of tokens
|
|
1312
|
-
is_get_list = true;
|
|
1313
|
-
}else{
|
|
1314
|
-
// recheck
|
|
1315
|
-
requestptn = new RegExp(keys.MATCH_URI_GET_RTOKEN); // regex = /^\/v1\/role\/token\/(.*)/
|
|
1316
|
-
reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
1317
|
-
if(!apiutil.isEmptyArray(reqmatchs) && 2 <= reqmatchs.length && '' !== apiutil.getSafeString(reqmatchs[1])){
|
|
1318
|
-
// get token
|
|
1319
|
-
is_get_token= true;
|
|
1320
|
-
}else{
|
|
1321
|
-
// retry parse role name
|
|
1322
|
-
requestptn = new RegExp(keys.MATCH_URI_GET_ROLE_DATA); // regex = /^\/v1\/role\/(.*)/
|
|
1323
|
-
reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
1324
|
-
if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
|
|
1325
|
-
result = {
|
|
1326
|
-
result: false,
|
|
1327
|
-
message: 'GET request url does not have role name'
|
|
1328
|
-
};
|
|
1329
|
-
|
|
1330
|
-
r3logger.elog(result.message);
|
|
1331
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1332
|
-
return;
|
|
1333
|
-
}
|
|
1334
|
-
}
|
|
1335
|
-
}
|
|
1336
|
-
|
|
1337
|
-
// check role name is only name or full yrn path
|
|
1338
|
-
var name = reqmatchs[1];
|
|
1339
|
-
name = name.toLowerCase();
|
|
1340
|
-
var nameptn = new RegExp('^' + keys.MATCH_ANY_TENANT_ROLE); // regex = /^yrn:yahoo:(.*)::(.*):role:(.*)/
|
|
1341
|
-
var namematchs = name.match(nameptn);
|
|
1342
|
-
if(apiutil.isEmptyArray(namematchs) || namematchs.length < 4){
|
|
1343
|
-
//
|
|
1344
|
-
// name is not full yrn to role, then check wrong role name
|
|
1345
|
-
//
|
|
1346
|
-
nameptn = new RegExp('^' + keys.NO_TENANT_KEY); // regex = /^yrn:yahoo:/
|
|
1347
|
-
if(name.match(nameptn)){
|
|
1348
|
-
result = {
|
|
1349
|
-
result: false,
|
|
1350
|
-
message: 'GET request query has wrong yrn full path to role'
|
|
1351
|
-
};
|
|
1352
|
-
|
|
1353
|
-
r3logger.elog(result.message);
|
|
1354
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1355
|
-
return;
|
|
1356
|
-
}
|
|
1357
|
-
// role name is not full yrn, we need tenant name
|
|
1358
|
-
if(!apiutil.isSafeEntity(keys.ROLE_TOP_KEY)){
|
|
1359
|
-
result = {
|
|
1360
|
-
result: false,
|
|
1361
|
-
message: 'GET request role name which is not full yrn, and not token. role name must be full yrn, if token is not specified.'
|
|
1362
|
-
};
|
|
1363
|
-
|
|
1364
|
-
r3logger.elog(result.message);
|
|
1365
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1366
|
-
return;
|
|
1367
|
-
}
|
|
1368
|
-
// make full yrn for role name
|
|
1369
|
-
name = keys.ROLE_TOP_KEY + ':' + name;
|
|
1370
|
-
|
|
1371
|
-
}else{
|
|
1372
|
-
//
|
|
1373
|
-
// name is full yrn to role.
|
|
1374
|
-
// need to check tenant name when token is specified.
|
|
1375
|
-
//
|
|
1376
|
-
if(null !== token_type && (!apiutil.isSafeEntity(token_info) || !apiutil.isSafeString(token_info.tenant) || !apiutil.compareCaseString(namematchs[2], token_info.tenant))){
|
|
1377
|
-
result = {
|
|
1378
|
-
result: false,
|
|
1379
|
-
message: 'GET request query has wrong tenant yrn full path(tenant=' + namematchs[2] + ') or not specify tenant.'
|
|
1380
|
-
};
|
|
1381
|
-
|
|
1382
|
-
r3logger.elog(result.message);
|
|
1383
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1384
|
-
return;
|
|
1385
|
-
}
|
|
1386
|
-
}
|
|
1387
|
-
|
|
1388
|
-
// Run
|
|
1389
|
-
if(is_get_token){
|
|
1390
|
-
//------------------------------
|
|
1391
|
-
// GET ROLE TOKEN
|
|
1392
|
-
//------------------------------
|
|
1393
|
-
// token_info: null(undefined) => not specify token, put token by host ip address
|
|
1394
|
-
// user token => put token by user
|
|
1395
|
-
// role token => update token by role
|
|
1396
|
-
//
|
|
1397
|
-
getRoleToken(name, token_info, token_type, token_str, req, res);
|
|
1398
|
-
|
|
1399
|
-
}else if(is_get_list){
|
|
1400
|
-
//------------------------------
|
|
1401
|
-
// GET LIST OF ROLE TOKENS
|
|
1402
|
-
//------------------------------
|
|
1403
|
-
if('user' === apiutil.getSafeString(token_type)){
|
|
1404
|
-
getListRoleTokens(name, token_info, req, res);
|
|
1405
|
-
}else{
|
|
1406
|
-
result = {
|
|
1407
|
-
result: false,
|
|
1408
|
-
message: 'GET request without UserToken for getting list of role(' + name + ') tokens, need User Token.'
|
|
1409
|
-
};
|
|
1410
|
-
|
|
1411
|
-
r3logger.elog(result.message);
|
|
1412
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1413
|
-
return;
|
|
1414
|
-
}
|
|
1415
|
-
|
|
1416
|
-
}else{
|
|
1417
|
-
//------------------------------
|
|
1418
|
-
// GET ROLE DATA
|
|
1419
|
-
//------------------------------
|
|
1420
|
-
if('user' === apiutil.getSafeString(token_type)){
|
|
1421
|
-
getRole(name, token_info, req, res);
|
|
1422
|
-
}else{
|
|
1423
|
-
result = {
|
|
1424
|
-
result: false,
|
|
1425
|
-
message: 'GET request without UserToken for getting role(' + name + '), need User Token.'
|
|
1426
|
-
};
|
|
1427
|
-
|
|
1428
|
-
r3logger.elog(result.message);
|
|
1429
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1430
|
-
return;
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
});
|
|
1434
|
-
|
|
1435
|
-
//
|
|
1436
|
-
// Sub router function for GET ROLE DATA
|
|
1437
|
-
//
|
|
1438
|
-
// Mountpath : '/v1/role/<role{/...}>'
|
|
1439
|
-
//
|
|
1440
|
-
// GET '/v1/role/<role{/...}>' : get role on version 1
|
|
1441
|
-
// HEADER : X-Auth-Token => User token
|
|
1442
|
-
// URL arguments : expand => "true"(default) or "false"
|
|
1443
|
-
// response : {
|
|
1444
|
-
// "result": true or false
|
|
1445
|
-
// "message": error message
|
|
1446
|
-
// "role": {
|
|
1447
|
-
// policies: array,
|
|
1448
|
-
// aliases: array <--- only not expand
|
|
1449
|
-
// hosts: { <--- only not expand
|
|
1450
|
-
// 'hostnames': [ hostname array or empty array
|
|
1451
|
-
// <hostname> <port> <cuk> <extra> <tag>, (if any port, port is *)
|
|
1452
|
-
// ...
|
|
1453
|
-
// ],
|
|
1454
|
-
// 'ips': [ ip address array or empty array
|
|
1455
|
-
// <ip address> <port> <cuk> <extra> <tag>,(if any port, port is *)
|
|
1456
|
-
// ...
|
|
1457
|
-
// ]
|
|
1458
|
-
// }
|
|
1459
|
-
// }
|
|
1460
|
-
// }
|
|
1461
|
-
//
|
|
1462
|
-
// This mount point is for creating(update) role or creating(update) host in role.
|
|
1463
|
-
//
|
|
1464
|
-
function getRole(role, token_info, req, res)
|
|
1465
|
-
{
|
|
1466
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
1467
|
-
|
|
1468
|
-
res.type('application/json; charset=utf-8');
|
|
1469
|
-
|
|
1470
|
-
var result;
|
|
1471
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
1472
|
-
!apiutil.isSafeEntity(req.query) )
|
|
1473
|
-
{
|
|
1474
|
-
result = {
|
|
1475
|
-
result: false,
|
|
1476
|
-
message: 'GET request query is wrong'
|
|
1477
|
-
};
|
|
1478
|
-
|
|
1479
|
-
r3logger.elog(result.message);
|
|
1480
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1481
|
-
return;
|
|
1482
|
-
}
|
|
1483
|
-
if( !apiutil.isSafeString(role) ||
|
|
1484
|
-
!apiutil.isSafeEntity(token_info) ||
|
|
1485
|
-
!apiutil.isSafeString(token_info.user) ||
|
|
1486
|
-
!apiutil.isSafeString(token_info.tenant))
|
|
1487
|
-
{
|
|
1488
|
-
result = {
|
|
1489
|
-
result: false,
|
|
1490
|
-
message: 'GET request is failure by internal error.'
|
|
1491
|
-
};
|
|
1492
|
-
|
|
1493
|
-
r3logger.elog(result.message);
|
|
1494
|
-
resutil.errResponse(req, res, 500, result); // 500: Internal Error
|
|
1495
|
-
return;
|
|
1496
|
-
}
|
|
1497
|
-
|
|
1498
|
-
//------------------------------
|
|
1499
|
-
// check arguments
|
|
1500
|
-
//------------------------------
|
|
1501
|
-
var keys = r3keys(token_info.user, token_info.tenant);
|
|
1502
|
-
|
|
1503
|
-
// expand type
|
|
1504
|
-
var is_expand = true;
|
|
1505
|
-
if(apiutil.isSafeString(req.query.expand)){
|
|
1506
|
-
if(apiutil.compareCaseString(keys.VALUE_TRUE, req.query.expand)){
|
|
1507
|
-
is_expand = true;
|
|
1508
|
-
}else if(apiutil.compareCaseString(keys.VALUE_FALSE, req.query.expand)){
|
|
1509
|
-
is_expand = false;
|
|
1510
|
-
}else{
|
|
1511
|
-
result = {
|
|
1512
|
-
result: false,
|
|
1513
|
-
message: 'GET expand url argument parameter(' + JSON.stringify(req.query.expand) + ') is wrong, it must be ' + keys.VALUE_TRUE + ' or ' + keys.VALUE_FALSE + '.'
|
|
1514
|
-
};
|
|
1515
|
-
|
|
1516
|
-
r3logger.elog(result.message);
|
|
1517
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1518
|
-
return;
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
|
|
1522
|
-
//------------------------------
|
|
1523
|
-
// get role
|
|
1524
|
-
//------------------------------
|
|
1525
|
-
result = k2hr3.getRole(role, is_expand);
|
|
1526
|
-
if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
|
|
1527
|
-
if(!apiutil.isSafeEntity(result)){
|
|
1528
|
-
result = {
|
|
1529
|
-
result: false,
|
|
1530
|
-
message: 'Could not get response from getRole'
|
|
1531
|
-
};
|
|
1532
|
-
}else{
|
|
1533
|
-
if(!apiutil.isSafeEntity(result.result)){
|
|
1534
|
-
result.result = false;
|
|
1535
|
-
}
|
|
1536
|
-
if(!apiutil.isSafeEntity(result.message)){
|
|
1537
|
-
result.message = 'Could not get error message in response from getRole';
|
|
1538
|
-
}
|
|
1539
|
-
}
|
|
1540
|
-
r3logger.elog(result.message);
|
|
1541
|
-
resutil.errResponse(req, res, 404, result); // 404: Not Found
|
|
1542
|
-
return;
|
|
1543
|
-
}
|
|
1544
|
-
r3logger.dlog('succeed : ' + result.message);
|
|
1545
|
-
res.status(200); // 200: OK
|
|
1546
|
-
res.send(JSON.stringify(result));
|
|
1547
|
-
}
|
|
1548
|
-
|
|
1549
|
-
//
|
|
1550
|
-
// Sub router function for GET ROLE TOKEN
|
|
1551
|
-
//
|
|
1552
|
-
// Mountpath : '/v1/role/<role{/...}>'
|
|
1553
|
-
//
|
|
1554
|
-
// GET '/v1/role/token/<role{/...}>' : get role on version 1
|
|
1555
|
-
// HEADER : X-Auth-Token => undefined User token or Role token
|
|
1556
|
-
// URL arguments : expire => "expire time(unix time value)" or undefined(default 24H)
|
|
1557
|
-
// if 0 is specified, no expire.
|
|
1558
|
-
// response : {
|
|
1559
|
-
// "result": true or false
|
|
1560
|
-
// "message": error message
|
|
1561
|
-
// "token": "role token"
|
|
1562
|
-
// "registerpath": "path for registering"
|
|
1563
|
-
// }
|
|
1564
|
-
//
|
|
1565
|
-
// This mount point is for creating(update) role or creating(update) host in role.
|
|
1566
|
-
//
|
|
1567
|
-
function getRoleToken(role, token_info, token_type, token_str, req, res)
|
|
1568
|
-
{
|
|
1569
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
1570
|
-
|
|
1571
|
-
res.type('application/json; charset=utf-8');
|
|
1572
|
-
|
|
1573
|
-
var result;
|
|
1574
|
-
if(!apiutil.isSafeString(role)){
|
|
1575
|
-
result = {
|
|
1576
|
-
result: false,
|
|
1577
|
-
message: 'GET request is failure by internal error.'
|
|
1578
|
-
};
|
|
1579
|
-
|
|
1580
|
-
r3logger.elog(result.message);
|
|
1581
|
-
resutil.errResponse(req, res, 500, result); // 500: Internal Error
|
|
1582
|
-
return;
|
|
1583
|
-
}
|
|
1584
|
-
|
|
1585
|
-
//------------------------------
|
|
1586
|
-
// tenant/role name/client ip
|
|
1587
|
-
//------------------------------
|
|
1588
|
-
var tenant;
|
|
1589
|
-
if(!apiutil.isSafeEntity(token_info) || !apiutil.isSafeString(token_info.tenant)){
|
|
1590
|
-
// parse role yrn path to tenant and role name
|
|
1591
|
-
var keys = r3keys();
|
|
1592
|
-
var nameptn = new RegExp('^' + keys.MATCH_ANY_TENANT_ROLE); // regex = /^yrn:yahoo:(.*)::(.*):role:(.*)/
|
|
1593
|
-
var namematchs = role.match(nameptn);
|
|
1594
|
-
if(apiutil.isEmptyArray(namematchs) || namematchs.length < 4){
|
|
1595
|
-
// role is not full yrn
|
|
1596
|
-
result = {
|
|
1597
|
-
result: false,
|
|
1598
|
-
message: 'GET request is failure by internal error(role yrn path is broken).'
|
|
1599
|
-
};
|
|
1600
|
-
|
|
1601
|
-
r3logger.elog(result.message);
|
|
1602
|
-
resutil.errResponse(req, res, 500, result); // 500: Internal Error
|
|
1603
|
-
return;
|
|
1604
|
-
}
|
|
1605
|
-
tenant = namematchs[2];
|
|
1606
|
-
}else{
|
|
1607
|
-
tenant = token_info.tenant;
|
|
1608
|
-
}
|
|
1609
|
-
|
|
1610
|
-
// client ip
|
|
1611
|
-
var clientip = apiutil.getClientIpAddress(req);
|
|
1612
|
-
if(!apiutil.isSafeString(clientip)){
|
|
1613
|
-
result = {
|
|
1614
|
-
result: false,
|
|
1615
|
-
message: 'GET request does not have ip address for client.'
|
|
1616
|
-
};
|
|
1617
|
-
|
|
1618
|
-
r3logger.elog(result.message);
|
|
1619
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1620
|
-
return;
|
|
1621
|
-
}
|
|
1622
|
-
|
|
1623
|
-
//------------------------------
|
|
1624
|
-
// get role token
|
|
1625
|
-
//------------------------------
|
|
1626
|
-
var expire;
|
|
1627
|
-
if(!apiutil.isSafeString(token_type)){
|
|
1628
|
-
// no token
|
|
1629
|
-
|
|
1630
|
-
// check port
|
|
1631
|
-
var port;
|
|
1632
|
-
if(apiutil.isSafeString(req.query.port)){
|
|
1633
|
-
if(isNaN(req.query.port)){
|
|
1634
|
-
result = {
|
|
1635
|
-
result: false,
|
|
1636
|
-
message: 'GET request has port which is not number: ' + JSON.stringify(req.query.port)
|
|
1637
|
-
};
|
|
1638
|
-
|
|
1639
|
-
r3logger.elog(result.message);
|
|
1640
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1641
|
-
return;
|
|
1642
|
-
}
|
|
1643
|
-
port = parseInt(req.query.port);
|
|
1644
|
-
}else{
|
|
1645
|
-
port = 0; // default any
|
|
1646
|
-
}
|
|
1647
|
-
|
|
1648
|
-
// check cuk parameter
|
|
1649
|
-
var cuk;
|
|
1650
|
-
if(apiutil.isSafeString(req.query.cuk) && apiutil.isSafeString(req.query.cuk.trim())){
|
|
1651
|
-
cuk = apiutil.getSafeString(req.query.cuk).trim();
|
|
1652
|
-
}else{
|
|
1653
|
-
cuk = null;
|
|
1654
|
-
}
|
|
1655
|
-
|
|
1656
|
-
result = r3token.getRoleTokenByIP(clientip, port, cuk, tenant, role, expire_rtoken); // strict checking port/cuk
|
|
1657
|
-
|
|
1658
|
-
}else if('role' === apiutil.getSafeString(token_type)){
|
|
1659
|
-
// role token
|
|
1660
|
-
if(!apiutil.compareRequestIpAddress(req, token_info.ip)){
|
|
1661
|
-
// wrong ip address in token
|
|
1662
|
-
result = {
|
|
1663
|
-
result: false,
|
|
1664
|
-
message: 'GET request ip address and role token are not same.'
|
|
1665
|
-
};
|
|
1666
|
-
|
|
1667
|
-
r3logger.elog(result.message);
|
|
1668
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1669
|
-
return;
|
|
1670
|
-
}
|
|
1671
|
-
|
|
1672
|
-
// set expire time as same as old token
|
|
1673
|
-
expire = apiutil.getExpireUnixtimeFromISOStrings(token_info.date, token_info.expire);
|
|
1674
|
-
if(0 >= expire){
|
|
1675
|
-
expire = expire_rtoken;
|
|
1676
|
-
}
|
|
1677
|
-
|
|
1678
|
-
// using port/cuk from token inforamtion
|
|
1679
|
-
result = r3token.getRoleTokenByIP(clientip, token_info.port, token_info.cuk, tenant, role, expire); // strict checking port/cuk
|
|
1680
|
-
|
|
1681
|
-
// if succeed to get new role token, remove old token
|
|
1682
|
-
if(apiutil.isSafeEntity(result) && apiutil.isSafeEntity(result.result) && result.result){
|
|
1683
|
-
var rm_result = r3token.removeRoleTokenByIP(token_str, clientip, token_info.port, token_info.cuk);
|
|
1684
|
-
if(!apiutil.isSafeEntity(rm_result) || !apiutil.isSafeEntity(rm_result.result) || false === rm_result.result){
|
|
1685
|
-
r3logger.wlog('could not remove old role token(' + token_str + '), but continue...');
|
|
1686
|
-
}
|
|
1687
|
-
}
|
|
1688
|
-
|
|
1689
|
-
}else if('user' === apiutil.getSafeString(token_type)){
|
|
1690
|
-
// user token
|
|
1691
|
-
|
|
1692
|
-
// expire
|
|
1693
|
-
if(apiutil.isSafeString(req.query.expire)){
|
|
1694
|
-
if(isNaN(req.query.expire)){
|
|
1695
|
-
result = {
|
|
1696
|
-
result: false,
|
|
1697
|
-
message: 'GET request has expire which is not number: ' + JSON.stringify(req.query.expire)
|
|
1698
|
-
};
|
|
1699
|
-
|
|
1700
|
-
r3logger.elog(result.message);
|
|
1701
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1702
|
-
return;
|
|
1703
|
-
}
|
|
1704
|
-
expire = parseInt(req.query.expire);
|
|
1705
|
-
if(0 == expire){
|
|
1706
|
-
expire = expire_reg_rtoken; // If 0 is specified, it means no expire
|
|
1707
|
-
}
|
|
1708
|
-
}else{
|
|
1709
|
-
expire = expire_rtoken; // expire is 24H
|
|
1710
|
-
}
|
|
1711
|
-
|
|
1712
|
-
result = r3token.getRoleTokenByUser(token_info.user, tenant, role, expire);
|
|
1713
|
-
|
|
1714
|
-
}else{
|
|
1715
|
-
// broken token
|
|
1716
|
-
result = {
|
|
1717
|
-
result: false,
|
|
1718
|
-
message: 'GET request is failure by internal error(token data broken).'
|
|
1719
|
-
};
|
|
1720
|
-
|
|
1721
|
-
r3logger.elog(result.message);
|
|
1722
|
-
resutil.errResponse(req, res, 500, result); // 500: Internal Error
|
|
1723
|
-
return;
|
|
1724
|
-
}
|
|
1725
|
-
|
|
1726
|
-
// check result
|
|
1727
|
-
if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
|
|
1728
|
-
if(!apiutil.isSafeEntity(result)){
|
|
1729
|
-
result = {
|
|
1730
|
-
result: false,
|
|
1731
|
-
message: 'Could not get role token.'
|
|
1732
|
-
};
|
|
1733
|
-
}else{
|
|
1734
|
-
if(!apiutil.isSafeEntity(result.result)){
|
|
1735
|
-
result.result = false;
|
|
1736
|
-
}
|
|
1737
|
-
if(!apiutil.isSafeEntity(result.message)){
|
|
1738
|
-
result.message = 'Could not get error message in response from get role token';
|
|
1739
|
-
}
|
|
1740
|
-
}
|
|
1741
|
-
r3logger.elog(result.message);
|
|
1742
|
-
resutil.errResponse(req, res, 404, result); // 404: Not Found
|
|
1743
|
-
return;
|
|
1744
|
-
}
|
|
1745
|
-
|
|
1746
|
-
// create url parameter(path) for registering role member
|
|
1747
|
-
//
|
|
1748
|
-
var regparamobj = {
|
|
1749
|
-
role: role,
|
|
1750
|
-
token: result.token
|
|
1751
|
-
};
|
|
1752
|
-
var udproc = new r3userdata.userdataProcess;
|
|
1753
|
-
var regparamstr = udproc.encryptRoleInfo(regparamobj);
|
|
1754
|
-
if(!apiutil.isSafeString(regparamstr)){
|
|
1755
|
-
result = {
|
|
1756
|
-
result: false,
|
|
1757
|
-
message: 'Could not create register url parameter with role token.'
|
|
1758
|
-
};
|
|
1759
|
-
r3logger.elog(result.message);
|
|
1760
|
-
resutil.errResponse(req, res, 404, result); // 404: Not Found
|
|
1761
|
-
return;
|
|
1762
|
-
}else{
|
|
1763
|
-
result.registerpath = regparamstr;
|
|
1764
|
-
}
|
|
1765
|
-
|
|
1766
|
-
r3logger.dlog('succeed : ' + result.message);
|
|
1767
|
-
res.status(200); // 200: OK
|
|
1768
|
-
res.send(JSON.stringify(result));
|
|
1769
|
-
}
|
|
1770
|
-
|
|
1771
|
-
//
|
|
1772
|
-
// Sub router function for GET LIST OF ROLE TOKENS
|
|
1773
|
-
//
|
|
1774
|
-
// Mountpath : '/v1/role/list/token/<role{/...}>'
|
|
1775
|
-
//
|
|
1776
|
-
// GET '/v1/role/token/list/<role{/...}>' : get list of role tokens on version 1
|
|
1777
|
-
// HEADER : X-Auth-Token => User token
|
|
1778
|
-
// URL arguments : expand => "true"(default) or "false"
|
|
1779
|
-
//
|
|
1780
|
-
// response : {
|
|
1781
|
-
// result: true/false
|
|
1782
|
-
// message: null or error message string
|
|
1783
|
-
// tokens: {
|
|
1784
|
-
// "token": {
|
|
1785
|
-
// date: create date(UTC ISO 8601)
|
|
1786
|
-
// expire: expire date(UTC ISO 8601)
|
|
1787
|
-
// user: user name if user created this token
|
|
1788
|
-
// hostname: hostname if this token was created by host(name)
|
|
1789
|
-
// ip: ip address if this token was created by ip
|
|
1790
|
-
// port: port number, if specified port when created token
|
|
1791
|
-
// cuk: cuk, if specified cuk when created token
|
|
1792
|
-
// registerpath: register path in user data script
|
|
1793
|
-
// },
|
|
1794
|
-
// ...
|
|
1795
|
-
// }
|
|
1796
|
-
// }
|
|
1797
|
-
// or
|
|
1798
|
-
// {
|
|
1799
|
-
// result: true/false
|
|
1800
|
-
// message: null or error message string
|
|
1801
|
-
// tokens: [
|
|
1802
|
-
// "role token",
|
|
1803
|
-
// ....
|
|
1804
|
-
// ]
|
|
1805
|
-
// }
|
|
1806
|
-
//
|
|
1807
|
-
// This mount point is for listing of all role tokens in role.
|
|
1808
|
-
//
|
|
1809
|
-
function getListRoleTokens(role, token_info, req, res)
|
|
1810
|
-
{
|
|
1811
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
1812
|
-
|
|
1813
|
-
res.type('application/json; charset=utf-8');
|
|
1814
|
-
|
|
1815
|
-
var result;
|
|
1816
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
1817
|
-
!apiutil.isSafeEntity(req.query) )
|
|
1818
|
-
{
|
|
1819
|
-
result = {
|
|
1820
|
-
result: false,
|
|
1821
|
-
message: 'GET request query is wrong'
|
|
1822
|
-
};
|
|
1823
|
-
|
|
1824
|
-
r3logger.elog(result.message);
|
|
1825
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1826
|
-
return;
|
|
1827
|
-
}
|
|
1828
|
-
|
|
1829
|
-
//------------------------------
|
|
1830
|
-
// check arguments
|
|
1831
|
-
//------------------------------
|
|
1832
|
-
var keys = r3keys();
|
|
1833
|
-
var expand = true;
|
|
1834
|
-
if(apiutil.isSafeString(req.query.expand)){
|
|
1835
|
-
if(apiutil.compareCaseString(keys.VALUE_TRUE, req.query.expand)){
|
|
1836
|
-
expand = true;
|
|
1837
|
-
}else if(apiutil.compareCaseString(keys.VALUE_FALSE, req.query.expand)){
|
|
1838
|
-
expand = false;
|
|
1839
|
-
}else{
|
|
1840
|
-
result = {
|
|
1841
|
-
result: false,
|
|
1842
|
-
message: 'GET expand url argument parameter(' + JSON.stringify(req.query.expand) + ') is wrong, it must be ' + keys.VALUE_TRUE + ' or ' + keys.VALUE_FALSE + '.'
|
|
1843
|
-
};
|
|
1844
|
-
|
|
1845
|
-
r3logger.elog(result.message);
|
|
1846
|
-
resutil.errResponse(req, res, 400, result); // 400: Bad Request
|
|
1847
|
-
return;
|
|
1848
|
-
}
|
|
1849
|
-
}
|
|
1850
|
-
|
|
1851
|
-
// check token
|
|
1852
|
-
if( !apiutil.isSafeString(role) ||
|
|
1853
|
-
!apiutil.isSafeEntity(token_info) ||
|
|
1854
|
-
!apiutil.isSafeString(token_info.user) ||
|
|
1855
|
-
!apiutil.isSafeString(token_info.tenant))
|
|
1856
|
-
{
|
|
1857
|
-
result = {
|
|
1858
|
-
result: false,
|
|
1859
|
-
message: 'GET request is failure by internal error.'
|
|
1860
|
-
};
|
|
1861
|
-
|
|
1862
|
-
r3logger.elog(result.message);
|
|
1863
|
-
resutil.errResponse(req, res, 500, result); // 500: Internal Error
|
|
1864
|
-
return;
|
|
1865
|
-
}
|
|
1866
|
-
|
|
1867
|
-
//------------------------------
|
|
1868
|
-
// get list of role tokens
|
|
1869
|
-
//------------------------------
|
|
1870
|
-
result = r3token.getListRoleTokens(role, token_info.tenant, expand);
|
|
1871
|
-
|
|
1872
|
-
// check result
|
|
1873
|
-
if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
|
|
1874
|
-
if(!apiutil.isSafeEntity(result)){
|
|
1875
|
-
result = {
|
|
1876
|
-
result: false,
|
|
1877
|
-
message: 'Could not get role token list.'
|
|
1878
|
-
};
|
|
1879
|
-
}else{
|
|
1880
|
-
if(!apiutil.isSafeEntity(result.result)){
|
|
1881
|
-
result.result = false;
|
|
1882
|
-
}
|
|
1883
|
-
if(!apiutil.isSafeEntity(result.message)){
|
|
1884
|
-
result.message = 'Could not get error message in response from get role token list';
|
|
1885
|
-
}
|
|
1886
|
-
}
|
|
1887
|
-
r3logger.elog(result.message);
|
|
1888
|
-
resutil.errResponse(req, res, 404, result); // 404: Not Found
|
|
1889
|
-
return;
|
|
1890
|
-
}
|
|
1891
|
-
|
|
1892
|
-
// add register path into each role token elements
|
|
1893
|
-
if(expand){
|
|
1894
|
-
Object.keys(result.tokens).forEach(function(oneToken){
|
|
1895
|
-
var regparamobj = {
|
|
1896
|
-
role: role,
|
|
1897
|
-
token: oneToken
|
|
1898
|
-
};
|
|
1899
|
-
var udproc = new r3userdata.userdataProcess;
|
|
1900
|
-
var regparamstr = udproc.encryptRoleInfo(regparamobj);
|
|
1901
|
-
if(!apiutil.isSafeString(regparamstr)){
|
|
1902
|
-
r3logger.elog('Could not create register url parameter with role token(' + JSON.stringify(oneToken) + '), but continue...');
|
|
1903
|
-
regparamstr = null;
|
|
1904
|
-
}
|
|
1905
|
-
result.tokens[oneToken].registerpath = regparamstr;
|
|
1906
|
-
});
|
|
1907
|
-
}
|
|
1908
|
-
|
|
1909
|
-
r3logger.dlog('succeed : ' + result.message);
|
|
1910
|
-
res.status(200); // 200: OK
|
|
1911
|
-
res.send(JSON.stringify(result));
|
|
1912
|
-
}
|
|
1913
|
-
|
|
1914
|
-
//---------------------------------------------------------
|
|
1915
|
-
// Router HEAD
|
|
1916
|
-
//---------------------------------------------------------
|
|
1917
|
-
//
|
|
1918
|
-
// Mountpath : '/v1/role/<role{/...}>'
|
|
1919
|
-
//
|
|
1920
|
-
// HEAD '/v1/role/<role{/...}>' : head role on version 1
|
|
1921
|
-
// HEADER : X-Auth-Token => User token or Role token or undefined
|
|
1922
|
-
// response : nothing
|
|
1923
|
-
// response status code : 204 or 4xx/5xx
|
|
1924
|
-
//
|
|
1925
|
-
// This mount point is for checking role existing or validation for role token/host ip address in role.
|
|
1926
|
-
//
|
|
1927
|
-
router.head('/', function(req, res, next)
|
|
1928
|
-
{
|
|
1929
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
1930
|
-
|
|
1931
|
-
if('HEAD' !== req.method){
|
|
1932
|
-
// If other method request comes here, so it should be routed another function.
|
|
1933
|
-
next();
|
|
1934
|
-
return;
|
|
1935
|
-
}
|
|
1936
|
-
res.type('application/json; charset=utf-8');
|
|
1937
|
-
|
|
1938
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
1939
|
-
!apiutil.isSafeEntity(req.baseUrl) )
|
|
1940
|
-
{
|
|
1941
|
-
r3logger.elog('HEAD request or url or query is wrong');
|
|
1942
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1943
|
-
return;
|
|
1944
|
-
}
|
|
1945
|
-
|
|
1946
|
-
//------------------------------
|
|
1947
|
-
// check token for API mode
|
|
1948
|
-
//------------------------------
|
|
1949
|
-
var token_str = null;
|
|
1950
|
-
var token_type = null;
|
|
1951
|
-
var token_info = null;
|
|
1952
|
-
var keys = r3keys();
|
|
1953
|
-
if(r3token.hasAuthTokenHeader(req)){
|
|
1954
|
-
var token_result = r3token.checkToken(req, true); // scoped, both token
|
|
1955
|
-
if(!token_result.result){
|
|
1956
|
-
r3logger.elog(token_result.message);
|
|
1957
|
-
resutil.errResponse(req, res, token_result.status);
|
|
1958
|
-
return;
|
|
1959
|
-
}
|
|
1960
|
-
token_str = token_result.token;
|
|
1961
|
-
token_type = token_result.token_type;
|
|
1962
|
-
token_info = token_result.token_info;
|
|
1963
|
-
keys = r3keys(token_info.user, token_info.tenant);
|
|
1964
|
-
}
|
|
1965
|
-
|
|
1966
|
-
//------------------------------
|
|
1967
|
-
// get role name
|
|
1968
|
-
//------------------------------
|
|
1969
|
-
// check get token type and parse role name
|
|
1970
|
-
var requestptn = new RegExp(keys.MATCH_URI_GET_ROLE_DATA); // regex = /^\/v1\/role\/(.*)/
|
|
1971
|
-
var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
1972
|
-
if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
|
|
1973
|
-
r3logger.elog('HEAD request url does not have role name');
|
|
1974
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1975
|
-
return;
|
|
1976
|
-
}
|
|
1977
|
-
|
|
1978
|
-
// check role name is only name or full yrn path and tenant name
|
|
1979
|
-
var tenantname = null;
|
|
1980
|
-
var rolename = null;
|
|
1981
|
-
var roleyrn = reqmatchs[1];
|
|
1982
|
-
roleyrn = roleyrn.toLowerCase();
|
|
1983
|
-
var roleyrnptn = new RegExp('^' + keys.MATCH_ANY_TENANT_ROLE); // regex = /^yrn:yahoo:(.*)::(.*):role:(.*)/
|
|
1984
|
-
var roleyrnmatchs = roleyrn.match(roleyrnptn);
|
|
1985
|
-
if(apiutil.isEmptyArray(roleyrnmatchs) || roleyrnmatchs.length < 4){
|
|
1986
|
-
//
|
|
1987
|
-
// roleyrn is not full yrn to role, then check wrong role name
|
|
1988
|
-
//
|
|
1989
|
-
roleyrnptn = new RegExp('^' + keys.NO_TENANT_KEY); // regex = /^yrn:yahoo:/
|
|
1990
|
-
if(roleyrn.match(roleyrnptn)){
|
|
1991
|
-
r3logger.elog('HEAD request query has wrong yrn full path to role');
|
|
1992
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1993
|
-
return;
|
|
1994
|
-
}
|
|
1995
|
-
// roleyrn is not full yrn, we need tenant name
|
|
1996
|
-
if(!apiutil.isSafeEntity(keys.ROLE_TOP_KEY)){
|
|
1997
|
-
r3logger.elog('HEAD request role name which is not full yrn, and not token. role name must be full yrn, if token is not specified.');
|
|
1998
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
1999
|
-
return;
|
|
2000
|
-
}
|
|
2001
|
-
// make full yrn for role, and set tenant name/role name.
|
|
2002
|
-
tenantname = token_info.tenant;
|
|
2003
|
-
rolename = roleyrn;
|
|
2004
|
-
roleyrn = keys.ROLE_TOP_KEY + ':' + roleyrn;
|
|
2005
|
-
|
|
2006
|
-
}else{
|
|
2007
|
-
//
|
|
2008
|
-
// roleyrn is full yrn to role.
|
|
2009
|
-
// need to check tenant name when token is specified.
|
|
2010
|
-
//
|
|
2011
|
-
if(null !== token_type && (!apiutil.isSafeEntity(token_info) || !apiutil.isSafeString(token_info.tenant) || !apiutil.compareCaseString(roleyrnmatchs[2], token_info.tenant))){
|
|
2012
|
-
r3logger.elog('HEAD request query has wrong tenant yrn full path(tenant=' + roleyrnmatchs[2] + ') or not specify tenant.');
|
|
2013
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2014
|
-
return;
|
|
2015
|
-
}
|
|
2016
|
-
// set tenant name/role name.
|
|
2017
|
-
tenantname = roleyrnmatchs[2];
|
|
2018
|
-
rolename = roleyrnmatchs[3];
|
|
2019
|
-
}
|
|
2020
|
-
|
|
2021
|
-
//------------------------------
|
|
2022
|
-
// Run
|
|
2023
|
-
//------------------------------
|
|
2024
|
-
var result;
|
|
2025
|
-
if(null === token_type){
|
|
2026
|
-
// check host ip address in role
|
|
2027
|
-
var clientip = apiutil.getClientIpAddress(req);
|
|
2028
|
-
if(!apiutil.isSafeString(clientip)){
|
|
2029
|
-
r3logger.elog('HEAD request does not have ip address for client.');
|
|
2030
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2031
|
-
return;
|
|
2032
|
-
}
|
|
2033
|
-
// port
|
|
2034
|
-
var tg_port = 0;
|
|
2035
|
-
if(apiutil.isSafeEntity(req.query) && apiutil.isSafeString(req.query.port)){
|
|
2036
|
-
if(isNaN(req.query.port)){
|
|
2037
|
-
r3logger.elog('HEAD request has port which is not number: ' + JSON.stringify(req.query.port));
|
|
2038
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2039
|
-
return false;
|
|
2040
|
-
}
|
|
2041
|
-
tg_port = parseInt(req.query.port);
|
|
2042
|
-
}
|
|
2043
|
-
// cuk
|
|
2044
|
-
var tg_cuk = null;
|
|
2045
|
-
if(apiutil.isSafeEntity(req.query) && apiutil.isSafeString(req.query.cuk) && apiutil.isSafeString(req.query.cuk.trim())){
|
|
2046
|
-
tg_cuk = req.query.cuk.trim();
|
|
2047
|
-
}
|
|
2048
|
-
|
|
2049
|
-
// find host
|
|
2050
|
-
result = k2hr3.findHost(tenantname, rolename, null, clientip, tg_port, tg_cuk, false); // not strictly checking
|
|
2051
|
-
|
|
2052
|
-
// result
|
|
2053
|
-
if(!result.result){
|
|
2054
|
-
r3logger.elog('HEAD request failure - check host ip(' + clientip + ') address in role(tenant=' + tenantname + ', role=' + rolename + ') host');
|
|
2055
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden
|
|
2056
|
-
return;
|
|
2057
|
-
}else{
|
|
2058
|
-
r3logger.dlog('HEAD request succeed - check host ip(' + clientip + ') address in role(tenant=' + tenantname + ', role=' + rolename + ') host');
|
|
2059
|
-
res.status(204); // 204: No Content
|
|
2060
|
-
}
|
|
2061
|
-
|
|
2062
|
-
}else if('role' === apiutil.getSafeString(token_type)){
|
|
2063
|
-
// check role token
|
|
2064
|
-
result = r3token.checkToken(req, true, false); // recheck - scoped, both token
|
|
2065
|
-
|
|
2066
|
-
// result
|
|
2067
|
-
if(!result.result){
|
|
2068
|
-
r3logger.elog(result.message);
|
|
2069
|
-
r3logger.elog('HEAD request failure - check role token(' + JSON.stringify(token_str) + ')');
|
|
2070
|
-
delete result.status;
|
|
2071
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden
|
|
2072
|
-
return;
|
|
2073
|
-
}else{
|
|
2074
|
-
r3logger.dlog('HEAD request succeed - check role token(' + JSON.stringify(token_str) + ')');
|
|
2075
|
-
delete result.status;
|
|
2076
|
-
res.status(204); // 204: No Content
|
|
2077
|
-
}
|
|
2078
|
-
|
|
2079
|
-
}else if('user' === apiutil.getSafeString(token_type)){
|
|
2080
|
-
// check role exist
|
|
2081
|
-
result = k2hr3.getRole(roleyrn, true);
|
|
2082
|
-
|
|
2083
|
-
// result
|
|
2084
|
-
if(!result.result){
|
|
2085
|
-
r3logger.elog('HEAD request failure - check role(' + roleyrn + ') exist');
|
|
2086
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden
|
|
2087
|
-
return;
|
|
2088
|
-
}else{
|
|
2089
|
-
r3logger.dlog('HEAD request succeed - check role(' + roleyrn + ') exists');
|
|
2090
|
-
res.status(204); // 204: No Content
|
|
2091
|
-
}
|
|
2092
|
-
|
|
2093
|
-
}else{
|
|
2094
|
-
// broken token
|
|
2095
|
-
r3logger.elog('HEAD request is failure by internal error(token data broken).');
|
|
2096
|
-
resutil.errResponse(req, res, 500); // 500: Internal Error
|
|
2097
|
-
return;
|
|
2098
|
-
}
|
|
2099
|
-
|
|
2100
|
-
res.send();
|
|
2101
|
-
});
|
|
2102
|
-
|
|
2103
|
-
//---------------------------------------------------------
|
|
2104
|
-
// Router DELETE
|
|
2105
|
-
//---------------------------------------------------------
|
|
2106
|
-
//
|
|
2107
|
-
// Mountpath : '/v1/role/<role{/...}>'
|
|
2108
|
-
//
|
|
2109
|
-
// DELETE '/v1/role/<role{/...}>' : delete role member host on version 1
|
|
2110
|
-
// HEADER : X-Auth-Token => undefined
|
|
2111
|
-
// URL arguments
|
|
2112
|
-
// "port": <port number> : this value is number string(0-), allowed null and '' for this value.
|
|
2113
|
-
// "cuk": <container unique key> : this value is string. if this value is undefined/null/empty string, it means any.
|
|
2114
|
-
// response : nothing
|
|
2115
|
-
// response status code : 204 or 4xx/5xx
|
|
2116
|
-
//
|
|
2117
|
-
// The role's host member removes itself from the role without any token.
|
|
2118
|
-
// Whether a role member is a host is automatically determined by client ip, port, and cuk.
|
|
2119
|
-
//
|
|
2120
|
-
//
|
|
2121
|
-
// DELETE '/v1/role/<role{/...}>' : delete role token on version 1
|
|
2122
|
-
// HEADER : X-Auth-Token => Role token
|
|
2123
|
-
// URL arguments : n/a
|
|
2124
|
-
// response : nothing
|
|
2125
|
-
// response status code : 204 or 4xx/5xx
|
|
2126
|
-
//
|
|
2127
|
-
// Delete the role token by role token.
|
|
2128
|
-
//
|
|
2129
|
-
//
|
|
2130
|
-
// DELETE '/v1/role/<role{/...}>' : delete role member hosts or ip addresses on version 1
|
|
2131
|
-
// HEADER : X-Auth-Token => User Scoped token
|
|
2132
|
-
// URL arguments
|
|
2133
|
-
// "host": <string, JSON string array> : this value is string for one IP address, or string array encoded JSON string
|
|
2134
|
-
// for IP addresses.
|
|
2135
|
-
// "port": <port number> : this value is number string(0-), allowed null and '' for this value.
|
|
2136
|
-
// "cuk": <container unique key> : this value is string. if this value is undefined/null/empty string, it means any.
|
|
2137
|
-
// response : nothing
|
|
2138
|
-
// response status code : 204 or 4xx/5xx
|
|
2139
|
-
//
|
|
2140
|
-
// Delete the role host(ip address)s member.
|
|
2141
|
-
//
|
|
2142
|
-
//
|
|
2143
|
-
// DELETE '/v1/role/<role{/...}>' : delete role member hosts or ip addresses on version 1
|
|
2144
|
-
// HEADER : X-Auth-Token => User Scoped token
|
|
2145
|
-
// URL arguments : n/a
|
|
2146
|
-
// response : nothing
|
|
2147
|
-
// response status code : 204 or 4xx/5xx
|
|
2148
|
-
//
|
|
2149
|
-
// Delete the role.
|
|
2150
|
-
//
|
|
2151
|
-
//---------------------------------------------------------
|
|
2152
|
-
//
|
|
2153
|
-
// Mountpath : '/v1/role/token/<role token>'
|
|
2154
|
-
//
|
|
2155
|
-
// DELETE '/v1/role/token/<role token>' : delete role token on version 1
|
|
2156
|
-
// HEADER : X-Auth-Token => User Scoped token
|
|
2157
|
-
// URL arguments : undefined
|
|
2158
|
-
// response : nothing
|
|
2159
|
-
// response status code : 204 or 4xx/5xx
|
|
2160
|
-
//
|
|
2161
|
-
// Delete the role token by user.
|
|
2162
|
-
//
|
|
2163
|
-
//---------------------------------------------------------
|
|
2164
|
-
//
|
|
2165
|
-
// Mountpath : '/v1/role'
|
|
2166
|
-
//
|
|
2167
|
-
// DELETE '/v1/role' : delete role member by cuk on version 1
|
|
2168
|
-
// URL arguments
|
|
2169
|
-
// "cuk": <container unique key> : this value is string.
|
|
2170
|
-
// Specify the Container Unique Id to be deleted.
|
|
2171
|
-
// Role members associated with this Id will be deleted.
|
|
2172
|
-
// "host": <string, JSON string array> : this value is string for one IP address, or string array encoded JSON string
|
|
2173
|
-
// for IP addresses.
|
|
2174
|
-
// response : nothing
|
|
2175
|
-
// response status code : 204 or 4xx/5xx
|
|
2176
|
-
//
|
|
2177
|
-
//
|
|
2178
|
-
// This mount point is for deleting ip addresses from roles by container unique key which includes ip addresses.
|
|
2179
|
-
// The requester must be role member which is allowed to access this mount point for removing IP address by cuk.
|
|
2180
|
-
//
|
|
2181
|
-
router.delete('/', function(req, res, next) // eslint-disable-line no-unused-vars
|
|
2182
|
-
{
|
|
2183
|
-
r3logger.dlog('CALL:', req.method, req.url);
|
|
2184
|
-
|
|
2185
|
-
res.type('application/json; charset=utf-8');
|
|
2186
|
-
|
|
2187
|
-
if( !apiutil.isSafeEntity(req) ||
|
|
2188
|
-
!apiutil.isSafeEntity(req.baseUrl) )
|
|
2189
|
-
{
|
|
2190
|
-
r3logger.elog('DELETE request or url or query is wrong');
|
|
2191
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2192
|
-
return;
|
|
2193
|
-
}
|
|
2194
|
-
|
|
2195
|
-
//
|
|
2196
|
-
// Check Path type and branch
|
|
2197
|
-
//
|
|
2198
|
-
var keys = r3keys();
|
|
2199
|
-
var is_delete_token = false;
|
|
2200
|
-
var is_delete_ip = false;
|
|
2201
|
-
var urlpath = decodeURI(req.baseUrl);
|
|
2202
|
-
var requestptn = new RegExp(keys.MATCH_URI_GET_RTOKEN); // regex = /^\/v1\/role\/token\/(.*)/
|
|
2203
|
-
var reqmatchs = urlpath.match(requestptn);
|
|
2204
|
-
if(!apiutil.isEmptyArray(reqmatchs) && 2 <= reqmatchs.length && '' !== apiutil.getSafeString(reqmatchs[1])){
|
|
2205
|
-
// get token
|
|
2206
|
-
is_delete_token = true;
|
|
2207
|
-
}else{
|
|
2208
|
-
// recheck simply
|
|
2209
|
-
if(urlpath == '/v1/role' || urlpath == '/v1/role/'){
|
|
2210
|
-
// urlpath is /v1/role, this is to delete ip address by cuk
|
|
2211
|
-
is_delete_ip= true;
|
|
2212
|
-
}else{
|
|
2213
|
-
// urlpath is not /v1/role, expected /v1/role/<role>, this is to delete role.
|
|
2214
|
-
}
|
|
2215
|
-
}
|
|
2216
|
-
|
|
2217
|
-
// Run
|
|
2218
|
-
if(is_delete_token){
|
|
2219
|
-
// delete role token.
|
|
2220
|
-
if(!rawDeleteRoleToken(req, res)){
|
|
2221
|
-
r3logger.elog('failed to delete role token.');
|
|
2222
|
-
}
|
|
2223
|
-
}else if(is_delete_ip){
|
|
2224
|
-
// delete ip address by cuk
|
|
2225
|
-
if(!rawDeleteIpsByCuk(req, res)){
|
|
2226
|
-
r3logger.elog('failed to delete ip address by cuk.');
|
|
2227
|
-
}
|
|
2228
|
-
}else{
|
|
2229
|
-
// delete role / role token.
|
|
2230
|
-
if(!rawDeleteRoleByPath(req, res)){
|
|
2231
|
-
r3logger.elog('failed to delete role.');
|
|
2232
|
-
}
|
|
2233
|
-
}
|
|
2234
|
-
|
|
2235
|
-
res.send();
|
|
2236
|
-
});
|
|
2237
|
-
|
|
2238
|
-
//
|
|
2239
|
-
// Utility for deleting role / role token
|
|
2240
|
-
//
|
|
2241
|
-
function rawDeleteRoleByPath(req, res)
|
|
2242
|
-
{
|
|
2243
|
-
//------------------------------
|
|
2244
|
-
// check token for API mode
|
|
2245
|
-
//------------------------------
|
|
2246
|
-
var token_str = null;
|
|
2247
|
-
var token_type = null;
|
|
2248
|
-
var token_info = null;
|
|
2249
|
-
var keys = r3keys();
|
|
2250
|
-
if(r3token.hasAuthTokenHeader(req)){
|
|
2251
|
-
var token_result = r3token.checkToken(req, true); // scoped, both token
|
|
2252
|
-
if(!token_result.result){
|
|
2253
|
-
r3logger.elog(token_result.message);
|
|
2254
|
-
resutil.errResponse(req, res, token_result.status);
|
|
2255
|
-
return false;
|
|
2256
|
-
}
|
|
2257
|
-
token_str = token_result.token;
|
|
2258
|
-
token_type = token_result.token_type;
|
|
2259
|
-
token_info = token_result.token_info;
|
|
2260
|
-
keys = r3keys(token_info.user, token_info.tenant);
|
|
2261
|
-
}
|
|
2262
|
-
|
|
2263
|
-
//------------------------------
|
|
2264
|
-
// get role name
|
|
2265
|
-
//------------------------------
|
|
2266
|
-
// check get token type and parse role name
|
|
2267
|
-
var requestptn = new RegExp(keys.MATCH_URI_GET_ROLE_DATA); // regex = /^\/v1\/role\/(.*)/
|
|
2268
|
-
var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
2269
|
-
if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
|
|
2270
|
-
r3logger.elog('HEAD request url does not have role name');
|
|
2271
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2272
|
-
return false;
|
|
2273
|
-
}
|
|
2274
|
-
|
|
2275
|
-
// check role name is only name or full yrn path and tenant name
|
|
2276
|
-
var tenantname = null;
|
|
2277
|
-
var rolename = null;
|
|
2278
|
-
var roleyrn = reqmatchs[1];
|
|
2279
|
-
roleyrn = roleyrn.toLowerCase();
|
|
2280
|
-
var roleyrnptn = new RegExp('^' + keys.MATCH_ANY_TENANT_ROLE); // regex = /^yrn:yahoo:(.*)::(.*):role:(.*)/
|
|
2281
|
-
var roleyrnmatchs = roleyrn.match(roleyrnptn);
|
|
2282
|
-
if(apiutil.isEmptyArray(roleyrnmatchs) || roleyrnmatchs.length < 4){
|
|
2283
|
-
//
|
|
2284
|
-
// roleyrn is not full yrn to role, then check wrong role name
|
|
2285
|
-
//
|
|
2286
|
-
roleyrnptn = new RegExp('^' + keys.NO_TENANT_KEY); // regex = /^yrn:yahoo:/
|
|
2287
|
-
if(roleyrn.match(roleyrnptn)){
|
|
2288
|
-
r3logger.elog('HEAD request query has wrong yrn full path to role');
|
|
2289
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2290
|
-
return false;
|
|
2291
|
-
}
|
|
2292
|
-
// roleyrn is not full yrn, we need tenant name
|
|
2293
|
-
if(!apiutil.isSafeEntity(keys.ROLE_TOP_KEY)){
|
|
2294
|
-
r3logger.elog('HEAD request role name which is not full yrn, and not token. role name must be full yrn, if token is not specified.');
|
|
2295
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2296
|
-
return false;
|
|
2297
|
-
}
|
|
2298
|
-
// make full yrn for role, and set tenant name/role name.
|
|
2299
|
-
tenantname = token_info.tenant;
|
|
2300
|
-
rolename = roleyrn;
|
|
2301
|
-
roleyrn = keys.ROLE_TOP_KEY + ':' + roleyrn;
|
|
2302
|
-
|
|
2303
|
-
}else{
|
|
2304
|
-
//
|
|
2305
|
-
// roleyrn is full yrn to role.
|
|
2306
|
-
// need to check tenant name when token is specified.
|
|
2307
|
-
//
|
|
2308
|
-
if(null !== token_type && (!apiutil.isSafeEntity(token_info) || !apiutil.isSafeString(token_info.tenant) || !apiutil.compareCaseString(roleyrnmatchs[2], token_info.tenant))){
|
|
2309
|
-
r3logger.elog('HEAD request query has wrong tenant yrn full path(tenant=' + roleyrnmatchs[2] + ') or not specify tenant.');
|
|
2310
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2311
|
-
return false;
|
|
2312
|
-
}
|
|
2313
|
-
// set tenant name/role name.
|
|
2314
|
-
tenantname = roleyrnmatchs[2];
|
|
2315
|
-
rolename = roleyrnmatchs[3];
|
|
2316
|
-
}
|
|
2317
|
-
|
|
2318
|
-
//------------------------------
|
|
2319
|
-
// Run
|
|
2320
|
-
//------------------------------
|
|
2321
|
-
var clientip;
|
|
2322
|
-
var port;
|
|
2323
|
-
var cuk;
|
|
2324
|
-
var result;
|
|
2325
|
-
if(null === token_type){
|
|
2326
|
-
// remove host ip address in role
|
|
2327
|
-
clientip = apiutil.getClientIpAddress(req);
|
|
2328
|
-
if(!apiutil.isSafeString(clientip)){
|
|
2329
|
-
r3logger.elog('DELETE request does not have ip address for client.');
|
|
2330
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2331
|
-
return false;
|
|
2332
|
-
}
|
|
2333
|
-
|
|
2334
|
-
// check port
|
|
2335
|
-
if(apiutil.isSafeString(req.query.port)){
|
|
2336
|
-
if(isNaN(req.query.port)){
|
|
2337
|
-
r3logger.elog('DELETE request has port which is not number: ' + JSON.stringify(req.query.port));
|
|
2338
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2339
|
-
return;
|
|
2340
|
-
}
|
|
2341
|
-
port = parseInt(req.query.port);
|
|
2342
|
-
}else{
|
|
2343
|
-
port = 0; // default any
|
|
2344
|
-
}
|
|
2345
|
-
|
|
2346
|
-
// check cuk parameter
|
|
2347
|
-
if(apiutil.isSafeString(req.query.cuk) && apiutil.isSafeString(req.query.cuk.trim())){
|
|
2348
|
-
cuk = apiutil.getSafeString(req.query.cuk).trim();
|
|
2349
|
-
}else{
|
|
2350
|
-
cuk = null;
|
|
2351
|
-
}
|
|
2352
|
-
|
|
2353
|
-
// remove host(check requester and requester is target)
|
|
2354
|
-
result = k2hr3.removeHost(tenantname, rolename, clientip, port, cuk, clientip, port, cuk);
|
|
2355
|
-
|
|
2356
|
-
// result
|
|
2357
|
-
if(!result.result){
|
|
2358
|
-
r3logger.elog('DELETE request failure - remove host by ip(' + clientip + ':' + String(port) + ') address, cuk(' + JSON.stringify(cuk) + ') in role(tenant=' + tenantname + ', role=' + rolename + ') host');
|
|
2359
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden
|
|
2360
|
-
return false;
|
|
2361
|
-
}else{
|
|
2362
|
-
r3logger.dlog('DELETE request succeed - remove host by ip(' + clientip + ':' + String(port) + ') address, cuk(' + JSON.stringify(cuk) + ') in role(tenant=' + tenantname + ', role=' + rolename + ') host');
|
|
2363
|
-
res.status(204); // 204: No Content
|
|
2364
|
-
}
|
|
2365
|
-
|
|
2366
|
-
}else if('role' === apiutil.getSafeString(token_type)){
|
|
2367
|
-
// remove role token
|
|
2368
|
-
clientip = apiutil.getClientIpAddress(req);
|
|
2369
|
-
if(!apiutil.isSafeString(clientip)){
|
|
2370
|
-
r3logger.elog('DELETE request does not have ip address for client.');
|
|
2371
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2372
|
-
return false;
|
|
2373
|
-
}
|
|
2374
|
-
|
|
2375
|
-
// check full role yrn path in token and path
|
|
2376
|
-
if(token_info.role != roleyrn){
|
|
2377
|
-
r3logger.elog('DELETE request is something wrong, the role token(' + JSON.stringify(token_info.role) + ') and role path(' + JSON.stringify(roleyrn) + ') do not match.');
|
|
2378
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2379
|
-
return false;
|
|
2380
|
-
}
|
|
2381
|
-
|
|
2382
|
-
// check for k8s cuk/port
|
|
2383
|
-
if(token_info.extra == keys.VALUE_K8S_V1){
|
|
2384
|
-
// cuk
|
|
2385
|
-
if(!apiutil.isSafeString(req.query.cuk) || !apiutil.isSafeString(req.query.cuk.trim())){
|
|
2386
|
-
r3logger.elog('DELETE request need cuk parameter for deleting role token which is made for k8s.');
|
|
2387
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2388
|
-
return false;
|
|
2389
|
-
}
|
|
2390
|
-
cuk = apiutil.getSafeString(req.query.cuk).trim();
|
|
2391
|
-
|
|
2392
|
-
if(token_info.cuk != cuk){
|
|
2393
|
-
r3logger.elog('DELETE request cuk(' + JSON.string(cuk) + ') parameter is invalid.');
|
|
2394
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2395
|
-
return false;
|
|
2396
|
-
}
|
|
2397
|
-
|
|
2398
|
-
// port
|
|
2399
|
-
if(apiutil.isSafeString(req.query.port)){
|
|
2400
|
-
if(isNaN(req.query.port)){
|
|
2401
|
-
r3logger.elog('DELETE request has port which is not number: ' + JSON.stringify(req.query.port));
|
|
2402
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2403
|
-
return;
|
|
2404
|
-
}
|
|
2405
|
-
port = parseInt(req.query.port);
|
|
2406
|
-
}else{
|
|
2407
|
-
port = 0; // default any
|
|
2408
|
-
}
|
|
2409
|
-
if(token_info.port != port){
|
|
2410
|
-
r3logger.elog('DELETE request port(' + JSON.stringify(port) + ') parameter is invalid.');
|
|
2411
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2412
|
-
return false;
|
|
2413
|
-
}
|
|
2414
|
-
}
|
|
2415
|
-
|
|
2416
|
-
// remove role token
|
|
2417
|
-
result = r3token.removeRoleTokenByIP(token_str, clientip, token_info.port, token_info.cuk);
|
|
2418
|
-
|
|
2419
|
-
// result
|
|
2420
|
-
if(!result.result){
|
|
2421
|
-
r3logger.elog('DELETE request failure - remove role token(' + JSON.stringify(token_str) + ')');
|
|
2422
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden
|
|
2423
|
-
return false;
|
|
2424
|
-
}else{
|
|
2425
|
-
r3logger.dlog('DELETE request succeed - remove role token(' + JSON.stringify(token_str) + ')');
|
|
2426
|
-
res.status(204); // 204: No Content
|
|
2427
|
-
}
|
|
2428
|
-
|
|
2429
|
-
}else if('user' === apiutil.getSafeString(token_type)){
|
|
2430
|
-
if(apiutil.isSafeString(req.query.host)){
|
|
2431
|
-
// remove host(hostname or ip address) in role
|
|
2432
|
-
var tg_host = apiutil.getSafeString(req.query.host);
|
|
2433
|
-
var tmp_host= apiutil.parseJSON(req.query.host);
|
|
2434
|
-
if(!apiutil.isEmptyArray(tmp_host)){
|
|
2435
|
-
tg_host = tmp_host;
|
|
2436
|
-
}
|
|
2437
|
-
|
|
2438
|
-
// check port
|
|
2439
|
-
if(apiutil.isSafeString(req.query.port)){
|
|
2440
|
-
if(isNaN(req.query.port)){
|
|
2441
|
-
r3logger.elog('GET request has port which is not number: ' + JSON.stringify(req.query.port));
|
|
2442
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2443
|
-
return;
|
|
2444
|
-
}
|
|
2445
|
-
port = parseInt(req.query.port);
|
|
2446
|
-
}else{
|
|
2447
|
-
port = 0; // default any
|
|
2448
|
-
}
|
|
2449
|
-
|
|
2450
|
-
// check cuk parameter
|
|
2451
|
-
if(apiutil.isSafeString(req.query.cuk) && apiutil.isSafeString(req.query.cuk.trim())){
|
|
2452
|
-
cuk = apiutil.getSafeString(req.query.cuk).trim();
|
|
2453
|
-
}else{
|
|
2454
|
-
cuk = null;
|
|
2455
|
-
}
|
|
2456
|
-
|
|
2457
|
-
// remove host(not check requester)
|
|
2458
|
-
result = k2hr3.removeHost(tenantname, rolename, tg_host, port, cuk);
|
|
2459
|
-
|
|
2460
|
-
// result
|
|
2461
|
-
if(!result.result){
|
|
2462
|
-
r3logger.elog('DELETE request failure - remove host(' + apiutil.getSafeString(tg_host) + ':' + String(port) + ') address, cuk(' + JSON.stringify(cuk) + ') in role(tenant=' + tenantname + ', role=' + rolename + ') host');
|
|
2463
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden
|
|
2464
|
-
return false;
|
|
2465
|
-
}else{
|
|
2466
|
-
r3logger.dlog('DELETE request succeed - remove host(' + apiutil.getSafeString(tg_host) + ':' + String(port) + ') address, cuk(' + JSON.stringify(cuk) + ') in role(tenant=' + tenantname + ', role=' + rolename + ') host');
|
|
2467
|
-
res.status(204); // 204: No Content
|
|
2468
|
-
}
|
|
2469
|
-
}else{
|
|
2470
|
-
// remove role
|
|
2471
|
-
result = k2hr3.removeRole(token_info.user, tenantname, rolename);
|
|
2472
|
-
|
|
2473
|
-
// result
|
|
2474
|
-
if(!result.result){
|
|
2475
|
-
r3logger.elog('DELETE request failure - remove role(' + rolename + ') exist');
|
|
2476
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden
|
|
2477
|
-
return false;
|
|
2478
|
-
}else{
|
|
2479
|
-
r3logger.dlog('DELETE request succeed - remove role(' + rolename + ') exists');
|
|
2480
|
-
res.status(204); // 204: No Content
|
|
2481
|
-
}
|
|
2482
|
-
}
|
|
2483
|
-
|
|
2484
|
-
}else{
|
|
2485
|
-
// broken token
|
|
2486
|
-
r3logger.elog('DELETE request is failure by internal error(token data broken).');
|
|
2487
|
-
resutil.errResponse(req, res, 500); // 500: Internal Error
|
|
2488
|
-
return false;
|
|
2489
|
-
}
|
|
2490
|
-
return true;
|
|
2491
|
-
}
|
|
2492
|
-
|
|
2493
|
-
//
|
|
2494
|
-
// Utility for deleting ip address by cuk
|
|
2495
|
-
//
|
|
2496
|
-
function rawDeleteIpsByCuk(req, res)
|
|
2497
|
-
{
|
|
2498
|
-
var keys = r3keys();
|
|
2499
|
-
|
|
2500
|
-
var clientip = apiutil.getClientIpAddress(req);
|
|
2501
|
-
if(!apiutil.isSafeString(clientip)){
|
|
2502
|
-
r3logger.elog('DELETE request does not have ip address for client');
|
|
2503
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2504
|
-
return false;
|
|
2505
|
-
}
|
|
2506
|
-
|
|
2507
|
-
//------------------------------
|
|
2508
|
-
// check arguments
|
|
2509
|
-
//------------------------------
|
|
2510
|
-
if(!apiutil.isSafeEntity(req.query)){
|
|
2511
|
-
r3logger.elog('DELETE request has no query parameter');
|
|
2512
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2513
|
-
return false;
|
|
2514
|
-
}
|
|
2515
|
-
var tg_host = null;
|
|
2516
|
-
if(apiutil.isSafeEntity(req.query.host)){
|
|
2517
|
-
var tmp_host = req.query.host.trim();
|
|
2518
|
-
if(apiutil.checkSimpleJSON(tmp_host)){
|
|
2519
|
-
tmp_host = JSON.parse(tmp_host);
|
|
2520
|
-
}
|
|
2521
|
-
if(apiutil.isSafeString(tmp_host) && apiutil.isSafeString(tmp_host.trim())){
|
|
2522
|
-
tg_host = new Array();
|
|
2523
|
-
tg_host.push(tmp_host.trim());
|
|
2524
|
-
}else if(!apiutil.isEmptyArray(tmp_host)){
|
|
2525
|
-
tg_host = tmp_host.slice(0, tmp_host.length);
|
|
2526
|
-
}else{
|
|
2527
|
-
r3logger.dlog('DELETE request has no host parameter, it means removing all host in cuk: ' + JSON.stringify(req.query.cuk));
|
|
2528
|
-
}
|
|
2529
|
-
}
|
|
2530
|
-
|
|
2531
|
-
// cuk parameter
|
|
2532
|
-
if(!apiutil.isSafeString(req.query.cuk) || !apiutil.isSafeString(req.query.cuk.trim())){
|
|
2533
|
-
r3logger.elog('DELETE request has invalid cuk parameter: ' + JSON.stringify(req.query.cuk));
|
|
2534
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2535
|
-
return false;
|
|
2536
|
-
}
|
|
2537
|
-
var tg_cuk = req.query.cuk.trim();
|
|
2538
|
-
|
|
2539
|
-
var tg_extra= k2hr3.getExtraFromCuk(tg_cuk);
|
|
2540
|
-
var adminips;
|
|
2541
|
-
|
|
2542
|
-
// Check client ip address
|
|
2543
|
-
if(tg_extra == keys.VALUE_K8S_V1){
|
|
2544
|
-
// for kubernetes
|
|
2545
|
-
|
|
2546
|
-
// check client ip address is the host itself to be removed
|
|
2547
|
-
//
|
|
2548
|
-
// [NOTE]
|
|
2549
|
-
// if result is true, it means client ip address is cuk's node ip address.
|
|
2550
|
-
// after that, the comparison between the cuk object data contents and the cuk data
|
|
2551
|
-
// in k2hdkc linked to the this ip address is done in removeIpsByCuk() function.
|
|
2552
|
-
//
|
|
2553
|
-
if(!k2hr3.compareIpAndKubernetesCuk(clientip, tg_cuk)){
|
|
2554
|
-
// client ip is not as same as cuk's node ip address,
|
|
2555
|
-
// then retry to compare delhost ip in config and it.
|
|
2556
|
-
adminips = k2hr3.findRoleHost(null, delhost_role_yrn, null, clientip, 0, null, null, false); // not strict checking for admin delhost host
|
|
2557
|
-
if(!apiutil.isSafeEntity(adminips)){
|
|
2558
|
-
r3logger.elog('DELETE request from ip address(' + JSON.stringify(clientip) + ') is not role(' + JSON.stringify(delhost_role_yrn) + ') member.');
|
|
2559
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2560
|
-
return false;
|
|
2561
|
-
}
|
|
2562
|
-
}
|
|
2563
|
-
}else if(tg_extra == keys.VALUE_OPENSTACK_V1){
|
|
2564
|
-
// for openstack
|
|
2565
|
-
|
|
2566
|
-
// In case of openstack, when deleting without token, it can be deleted only from
|
|
2567
|
-
// the IP address registered as delhost ip in config.
|
|
2568
|
-
//
|
|
2569
|
-
// Check client ip address is in role admin member ip address.
|
|
2570
|
-
adminips = k2hr3.findRoleHost(null, delhost_role_yrn, null, clientip, 0, null, null, false); // not strict checking for admin delhost host
|
|
2571
|
-
if(!apiutil.isSafeEntity(adminips)){
|
|
2572
|
-
r3logger.elog('DELETE request from ip address(' + JSON.stringify(clientip) + ') is not role(' + JSON.stringify(delhost_role_yrn) + ') member.');
|
|
2573
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2574
|
-
return false;
|
|
2575
|
-
}
|
|
2576
|
-
}else{
|
|
2577
|
-
// Currently supports only openstack and kubernetes
|
|
2578
|
-
r3logger.elog('DELETE request has unknown extra type in cuk parameter: ' + JSON.stringify(req.query.cuk));
|
|
2579
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2580
|
-
return false;
|
|
2581
|
-
}
|
|
2582
|
-
|
|
2583
|
-
//------------------------------
|
|
2584
|
-
// Run
|
|
2585
|
-
//------------------------------
|
|
2586
|
-
var resobj = k2hr3.removeIpsByCuk(tg_cuk, tg_host, true);
|
|
2587
|
-
if(!apiutil.isSafeEntity(resobj) || !apiutil.isSafeEntity(resobj.result) || false === resobj.result){
|
|
2588
|
-
var message = null;
|
|
2589
|
-
if(apiutil.isSafeEntity(resobj) && apiutil.isSafeEntity(resobj.message)){
|
|
2590
|
-
message = 'DELETE request failed by ' + resobj.message;
|
|
2591
|
-
}else{
|
|
2592
|
-
message = 'DELETE request failed by unknown reason.';
|
|
2593
|
-
}
|
|
2594
|
-
r3logger.elog(message);
|
|
2595
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden(is this status OK?)
|
|
2596
|
-
return false;
|
|
2597
|
-
}
|
|
2598
|
-
r3logger.dlog('succeed : ' + resobj.message);
|
|
2599
|
-
res.status(204); // 204: No Content
|
|
2600
|
-
|
|
2601
|
-
return true;
|
|
2602
|
-
}
|
|
2603
|
-
|
|
2604
|
-
//
|
|
2605
|
-
// Utility for deleting role token
|
|
2606
|
-
//
|
|
2607
|
-
function rawDeleteRoleToken(req, res)
|
|
2608
|
-
{
|
|
2609
|
-
//------------------------------
|
|
2610
|
-
// check token
|
|
2611
|
-
//------------------------------
|
|
2612
|
-
if(!r3token.hasAuthTokenHeader(req)){
|
|
2613
|
-
r3logger.elog('DELETE request does not have any auth token.');
|
|
2614
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2615
|
-
return false;
|
|
2616
|
-
}
|
|
2617
|
-
var token_result = r3token.checkToken(req, true, true); // scoped, user token
|
|
2618
|
-
if(!token_result.result){
|
|
2619
|
-
r3logger.elog(token_result.message);
|
|
2620
|
-
resutil.errResponse(req, res, token_result.status);
|
|
2621
|
-
return false;
|
|
2622
|
-
}
|
|
2623
|
-
var token_info = token_result.token_info;
|
|
2624
|
-
var keys = r3keys(token_info.user, token_info.tenant);
|
|
2625
|
-
|
|
2626
|
-
//------------------------------
|
|
2627
|
-
// get role token from uri
|
|
2628
|
-
//------------------------------
|
|
2629
|
-
// check get token type and parse role name
|
|
2630
|
-
var requestptn = new RegExp(keys.MATCH_URI_GET_RTOKEN); // regex = /^\/v1\/role\/token\/(.*)/
|
|
2631
|
-
var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
|
|
2632
|
-
if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
|
|
2633
|
-
r3logger.elog('DELETE request url does not have token string nor yrn path');
|
|
2634
|
-
resutil.errResponse(req, res, 400); // 400: Bad Request
|
|
2635
|
-
return false;
|
|
2636
|
-
}
|
|
2637
|
-
var token_string = apiutil.getSafeString(reqmatchs[1]);
|
|
2638
|
-
|
|
2639
|
-
//------------------------------
|
|
2640
|
-
// Run
|
|
2641
|
-
//------------------------------
|
|
2642
|
-
if(!r3token.removeRoleTokenByPath(token_string, token_info.tenant)){
|
|
2643
|
-
r3logger.elog('failed to remove role token.');
|
|
2644
|
-
r3logger.elog('DELETE request failure - remove role token(' + token_string + ')');
|
|
2645
|
-
resutil.errResponse(req, res, 403); // 403: Forbidden
|
|
2646
|
-
return false;
|
|
2647
|
-
}else{
|
|
2648
|
-
r3logger.dlog('DELETE request succeed - remove role token(' + token_string + ')');
|
|
2649
|
-
res.status(204); // 204: No Content
|
|
2650
|
-
}
|
|
2651
|
-
|
|
2652
|
-
return true;
|
|
2653
|
-
}
|
|
2654
|
-
|
|
2655
|
-
module.exports = router;
|
|
2656
|
-
|
|
2657
|
-
/*
|
|
2658
|
-
* Local variables:
|
|
2659
|
-
* tab-width: 4
|
|
2660
|
-
* c-basic-offset: 4
|
|
2661
|
-
* End:
|
|
2662
|
-
* vim600: noexpandtab sw=4 ts=4 fdm=marker
|
|
2663
|
-
* vim<600: noexpandtab sw=4 ts=4
|
|
2664
|
-
*/
|