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.
Files changed (149) hide show
  1. package/config/k2hr3-init.sh.templ +2 -2
  2. package/dist/.gitkeep +0 -0
  3. package/dist/src/app.js +262 -0
  4. package/{bin → dist/src/bin}/run.sh +1 -1
  5. package/dist/src/bin/watcher.js +113 -0
  6. package/dist/src/bin/www.js +217 -0
  7. package/dist/src/lib/basicipcheck.js +392 -0
  8. package/dist/src/lib/cacerts.js +106 -0
  9. package/dist/src/lib/dbglogging.js +190 -0
  10. package/dist/src/lib/dummyuserapi.js +719 -0
  11. package/dist/src/lib/ipwatch.js +354 -0
  12. package/dist/src/lib/k2hr3acrutil.js +532 -0
  13. package/dist/src/lib/k2hr3apiutil.js +1444 -0
  14. package/dist/src/lib/k2hr3cliutil.js +183 -0
  15. package/dist/src/lib/k2hr3config.js +832 -0
  16. package/dist/src/lib/k2hr3cryptutil.js +258 -0
  17. package/dist/src/lib/k2hr3dkc.js +12121 -0
  18. package/dist/src/lib/k2hr3extdata.js +198 -0
  19. package/dist/src/lib/k2hr3keys.js +207 -0
  20. package/dist/src/lib/k2hr3resutil.js +111 -0
  21. package/dist/src/lib/k2hr3template.js +6546 -0
  22. package/dist/src/lib/k2hr3tokens.js +2643 -0
  23. package/dist/src/lib/k2hr3userdata.js +296 -0
  24. package/dist/src/lib/k8soidc.js +1000 -0
  25. package/dist/src/lib/openstackapiv2.js +695 -0
  26. package/dist/src/lib/openstackapiv3.js +932 -0
  27. package/dist/src/lib/openstackep.js +667 -0
  28. package/{tests/auto_common.js → dist/src/lib/types.js} +4 -38
  29. package/dist/src/routes/acr.js +704 -0
  30. package/dist/src/routes/debugVerify.js +294 -0
  31. package/dist/src/routes/extdata.js +219 -0
  32. package/dist/src/routes/list.js +264 -0
  33. package/dist/src/routes/policy.js +840 -0
  34. package/dist/src/routes/resource.js +1489 -0
  35. package/dist/src/routes/role.js +2627 -0
  36. package/dist/src/routes/service.js +908 -0
  37. package/dist/src/routes/tenant.js +1141 -0
  38. package/dist/src/routes/userTokens.js +482 -0
  39. package/dist/src/routes/userdata.js +212 -0
  40. package/dist/src/routes/version.js +103 -0
  41. package/package.json +152 -121
  42. package/ChangeLog +0 -372
  43. package/app.js +0 -292
  44. package/bin/watcher +0 -122
  45. package/bin/www +0 -180
  46. package/eslint.config.mjs +0 -68
  47. package/lib/basicipcheck.js +0 -376
  48. package/lib/cacerts.js +0 -71
  49. package/lib/dbglogging.js +0 -151
  50. package/lib/dummyuserapi.js +0 -766
  51. package/lib/ipwatch.js +0 -379
  52. package/lib/k2hr3acrutil.js +0 -516
  53. package/lib/k2hr3apiutil.js +0 -1494
  54. package/lib/k2hr3cliutil.js +0 -191
  55. package/lib/k2hr3config.js +0 -826
  56. package/lib/k2hr3cryptutil.js +0 -254
  57. package/lib/k2hr3dkc.js +0 -12632
  58. package/lib/k2hr3extdata.js +0 -198
  59. package/lib/k2hr3keys.js +0 -234
  60. package/lib/k2hr3resutil.js +0 -100
  61. package/lib/k2hr3template.js +0 -6925
  62. package/lib/k2hr3tokens.js +0 -2799
  63. package/lib/k2hr3userdata.js +0 -312
  64. package/lib/k8soidc.js +0 -1012
  65. package/lib/openstackapiv2.js +0 -764
  66. package/lib/openstackapiv3.js +0 -1032
  67. package/lib/openstackep.js +0 -553
  68. package/routes/acr.js +0 -738
  69. package/routes/debugVerify.js +0 -263
  70. package/routes/extdata.js +0 -232
  71. package/routes/list.js +0 -270
  72. package/routes/policy.js +0 -869
  73. package/routes/resource.js +0 -1441
  74. package/routes/role.js +0 -2664
  75. package/routes/service.js +0 -894
  76. package/routes/tenant.js +0 -1095
  77. package/routes/userTokens.js +0 -511
  78. package/routes/userdata.js +0 -218
  79. package/routes/version.js +0 -108
  80. package/templ/Dockerfile.templ +0 -71
  81. package/tests/auto_acr.js +0 -1101
  82. package/tests/auto_acr_spec.js +0 -79
  83. package/tests/auto_all_spec.js +0 -142
  84. package/tests/auto_control_subprocess.sh +0 -243
  85. package/tests/auto_extdata.js +0 -220
  86. package/tests/auto_extdata_spec.js +0 -79
  87. package/tests/auto_init_config_json.sh +0 -275
  88. package/tests/auto_k2hdkc_server.ini +0 -109
  89. package/tests/auto_k2hdkc_slave.ini +0 -83
  90. package/tests/auto_list.js +0 -439
  91. package/tests/auto_list_spec.js +0 -79
  92. package/tests/auto_policy.js +0 -1579
  93. package/tests/auto_policy_spec.js +0 -79
  94. package/tests/auto_resource.js +0 -10956
  95. package/tests/auto_resource_spec.js +0 -79
  96. package/tests/auto_role.js +0 -6150
  97. package/tests/auto_role_spec.js +0 -79
  98. package/tests/auto_service.js +0 -770
  99. package/tests/auto_service_spec.js +0 -79
  100. package/tests/auto_subprocesses.js +0 -114
  101. package/tests/auto_template.sh +0 -126
  102. package/tests/auto_tenant.js +0 -1100
  103. package/tests/auto_tenant_spec.js +0 -79
  104. package/tests/auto_token_util.js +0 -219
  105. package/tests/auto_userdata.js +0 -292
  106. package/tests/auto_userdata_spec.js +0 -79
  107. package/tests/auto_usertokens.js +0 -565
  108. package/tests/auto_usertokens_spec.js +0 -79
  109. package/tests/auto_version.js +0 -127
  110. package/tests/auto_version_spec.js +0 -79
  111. package/tests/auto_watcher.js +0 -157
  112. package/tests/auto_watcher_spec.js +0 -79
  113. package/tests/k2hdkc_test.data +0 -986
  114. package/tests/k2hdkc_test_load.sh +0 -255
  115. package/tests/k2hr3template_test.js +0 -187
  116. package/tests/k2hr3template_test.sh +0 -339
  117. package/tests/k2hr3template_test_async.js +0 -216
  118. package/tests/k2hr3template_test_template.result +0 -7117
  119. package/tests/k2hr3template_test_template.txt +0 -3608
  120. package/tests/k2hr3template_test_vars.js +0 -194
  121. package/tests/manual_acr_delete.js +0 -143
  122. package/tests/manual_acr_get.js +0 -297
  123. package/tests/manual_acr_postput.js +0 -215
  124. package/tests/manual_allusertenant_get.js +0 -113
  125. package/tests/manual_extdata_get.js +0 -191
  126. package/tests/manual_k2hr3keys_get.js +0 -84
  127. package/tests/manual_list_gethead.js +0 -230
  128. package/tests/manual_policy_delete.js +0 -132
  129. package/tests/manual_policy_gethead.js +0 -275
  130. package/tests/manual_policy_postput.js +0 -297
  131. package/tests/manual_resource_delete.js +0 -433
  132. package/tests/manual_resource_gethead.js +0 -423
  133. package/tests/manual_resource_postput.js +0 -487
  134. package/tests/manual_role_delete.js +0 -404
  135. package/tests/manual_role_gethead.js +0 -547
  136. package/tests/manual_role_postput.js +0 -544
  137. package/tests/manual_service_delete.js +0 -153
  138. package/tests/manual_service_gethead.js +0 -178
  139. package/tests/manual_service_postput.js +0 -348
  140. package/tests/manual_tenant_delete.js +0 -186
  141. package/tests/manual_tenant_gethead.js +0 -268
  142. package/tests/manual_tenant_postput.js +0 -293
  143. package/tests/manual_test.sh +0 -352
  144. package/tests/manual_userdata_get.js +0 -173
  145. package/tests/manual_usertoken_gethead.js +0 -136
  146. package/tests/manual_usertoken_postput.js +0 -310
  147. package/tests/manual_version_get.js +0 -127
  148. package/tests/run_local_test_k2hdkc.sh +0 -174
  149. 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
- */