k2hr3-api 1.0.42 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/config/k2hr3-init.sh.templ +4 -4
  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 -378
  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/service.js DELETED
@@ -1,894 +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 Nov 1 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 k2hr3 = require('../lib/k2hr3dkc');
30
- var r3keys = require('../lib/k2hr3keys').getK2hr3Keys;
31
-
32
- // Debug logging objects
33
- var r3logger = require('../lib/dbglogging');
34
-
35
- //
36
- // Common utility function
37
- //
38
- // Convert tenant yrn path to tenant name
39
- //
40
- function rawGetTenantNameFromYrn(tenant)
41
- {
42
- if(!apiutil.isSafeString(tenant)){
43
- return null;
44
- }
45
- var keys = r3keys();
46
- var yrnptn = new RegExp('^' + keys.MATCH_ANY_TENANT_MAIN); // regex = /^yrn:yahoo:(.*)::(.*)/
47
- var matches = tenant.match(yrnptn);
48
- if(apiutil.isEmptyArray(matches) || matches.length < 3){
49
- // not match tenant yrn, then return original tenant
50
- return tenant;
51
- }
52
- tenant = matches[2]; // tenant name
53
- if(!apiutil.isSafeString(tenant)){
54
- return null;
55
- }
56
- return tenant;
57
- }
58
-
59
- //
60
- // Common utility function
61
- //
62
- // Create or update service
63
- //
64
- // Result null(succeed) or error message(failed)
65
- //
66
- function rawUpdateService(owner, servicename, verify, tenants, is_clear, is_create)
67
- {
68
- var error = null;
69
- var result= null;
70
- if(!apiutil.isSafeString(owner) || !apiutil.isSafeString(servicename)){
71
- error = new Error('Internal error: rawUpdateService');
72
- return error;
73
- }
74
- if(!apiutil.isSafeEntity(verify)){
75
- verify = null;
76
- }
77
- if(apiutil.isEmptyArray(tenants)){
78
- tenants = null;
79
- }
80
-
81
- //------------------------------
82
- // set(update) all field / update verify field
83
- //------------------------------
84
- if(is_create || null !== verify){
85
- //
86
- // [NOTE]
87
- // initService() === updateServiceVerify()
88
- //
89
- result = k2hr3.initService(owner, servicename, verify);
90
- if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
91
- if(!apiutil.isSafeEntity(result)){
92
- error = new Error('Could not get response from initService');
93
- }else{
94
- if(!apiutil.isSafeEntity(result.message)){
95
- error = new Error('Could not get error message in response from initService');
96
- }
97
- }
98
- return error;
99
- }
100
- }
101
-
102
- //------------------------------
103
- // add tenants
104
- //------------------------------
105
- var allowtenants= !apiutil.isEmptyArray(tenants) ? tenants : [];
106
- var denytenants = [];
107
- var cnt;
108
- if(is_clear || !apiutil.isEmptyArray(allowtenants)){
109
- // get all service data
110
- var allres = k2hr3.getService(owner, servicename);
111
- if(!apiutil.isSafeEntity(allres) || !apiutil.isSafeEntity(allres.result) || false === allres.result){
112
- if(!apiutil.isSafeEntity(allres)){
113
- error = new Error('Could not get response from getService');
114
- }else{
115
- if(!apiutil.isSafeEntity(allres.message)){
116
- error = new Error('Could not get error message in response from getService');
117
- }else{
118
- error = new Error(allres.message);
119
- }
120
- }
121
- return error;
122
- }
123
- // check
124
- if(apiutil.isSafeEntity(allres.service) && apiutil.isArray(allres.service.tenant)){
125
- var keys = r3keys(null, owner, null);
126
- var cnt2;
127
- var found;
128
- for(cnt = 0; cnt < allres.service.tenant.length; ++cnt){
129
- found = false;
130
- for(cnt2 = 0; cnt2 < allowtenants.length; ++cnt2){
131
- if(apiutil.compareCaseString(allres.service.tenant[cnt], allowtenants[cnt2])){
132
- // cut already existing tenant
133
- allowtenants.splice(cnt2, 1);
134
- found = true;
135
- break;
136
- }
137
- }
138
- if(!found){
139
- // does not remove owner tenant
140
- if(!apiutil.compareCaseString(allres.service.tenant[cnt], keys.MASTER_TENANT_TOP_KEY)){
141
- // add new deny tenant
142
- denytenants.push(allres.service.tenant[cnt]);
143
- }
144
- }
145
- }
146
- }
147
- }
148
- // add new allow tenants
149
- for(cnt = 0; cnt < allowtenants.length; ++cnt){
150
- var addtenant = rawGetTenantNameFromYrn(allowtenants[cnt]);
151
- if(null === addtenant){
152
- error = new Error('To allow Tenant name(' + allowtenants[cnt] + ') is something wrong.');
153
- return error;
154
- }
155
- result = k2hr3.allowTenantToService(owner, servicename, addtenant);
156
- if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
157
- if(!apiutil.isSafeEntity(result)){
158
- error = new Error('Could not get response from allowTenantToService');
159
- }else{
160
- error = new Error('Could not get error message in response from allowTenantToService');
161
- }
162
- return error;
163
- }
164
- }
165
- // remove new deny tenants
166
- if(is_clear && !apiutil.isEmptyArray(denytenants)){
167
- for(cnt = 0; cnt < denytenants.length; ++cnt){
168
- var denytenant = rawGetTenantNameFromYrn(denytenants[cnt]);
169
- if(null === denytenant){
170
- error = new Error('To allow Tenant name(' + denytenants[cnt] + ') is something wrong.');
171
- return error;
172
- }
173
- result = k2hr3.denyTenantFromService(owner, servicename, denytenant);
174
- if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
175
- if(!apiutil.isSafeEntity(result)){
176
- error = new Error('Could not get response from denyTenantToService');
177
- }else{
178
- error = new Error('Could not get error message in response from denyTenantToService');
179
- }
180
- return error;
181
- }
182
- }
183
- }
184
-
185
- if(null === result){
186
- error = new Error('Internal error: rawUpdateService');
187
- return error;
188
- }
189
- r3logger.dlog('succeed : ' + result.message);
190
- return null;
191
- }
192
-
193
- //
194
- // Mountpath : '/v1/service'
195
- //
196
- // POST '/v1/service' : post service on version 1
197
- // HEADER : X-Auth-Token => Scoped User token
198
- // response body : result => true/false
199
- // message => messages
200
- // body :
201
- // {
202
- // "name": <service name> => key is "yrn:yahoo::::service:<service>"
203
- // "verify": <verify url> => key is "yrn:yahoo::::service:<service>:verify"
204
- // when the value is URL, it is save as URL string.
205
- // the value is allowed null or undefined, then verify url value is null.
206
- // the value is allowed string(not URL), it is saved and converted by JSON.
207
- // }
208
- //
209
- // POST '/v1/service/<service>' : post tenant or verify for service on version 1
210
- // HEADER : X-Auth-Token => Scoped User token
211
- // response body : result => true/false
212
- // message => messages
213
- // body :
214
- // {
215
- // "tenant": <tenant name> or array => key is "yrn:yahoo::::service:<service>:tenant"
216
- // if this key is specified, adding tenants to service
217
- // the value is string for tenant name, or array of tenant name list
218
- // "clear_tenant": true/false => true means clear existing tenant without "tenant".
219
- // default false
220
- // "verify": <verify url> => key is "yrn:yahoo::::service:<service>:verify"
221
- // if this key is specified, updating verify url.
222
- // when the value is URL, it is save as URL string.
223
- // the value is allowed string(not URL), it is saved and converted by JSON.
224
- // }
225
- // }
226
- //
227
- // [NOTE]
228
- // Verify URL is used as following formatted:
229
- //
230
- // GET http://<verify host[:port]>{/<path>}?service=<service name>&tenant=<tenant name>&tenantid=<tenant id>&user=<user name>&userid=<user id>
231
- //
232
- // service : service name
233
- // tenant : tenant name
234
- // tenantid : tenant id
235
- // user : user name
236
- // userid : user id
237
- //
238
- // And it's response is following:
239
- // response body = [ => undefined/null or resource array(if one element, allows only it not array)
240
- // {
241
- // name => resource name which is key name(path) for resource
242
- // expire => undefined/null or integer
243
- // type => resource data type(string or object), if date is null or '', this value must be string.
244
- // data => resource data which must be string or object or null/undefined.
245
- // keys = { => resource has keys(associative array), or null/undefined.
246
- // 'foo': bar, => any value is allowed
247
- // ...
248
- // }
249
- // },
250
- // ...
251
- // ]
252
- //
253
- router.post('/', function(req, res, next) // eslint-disable-line no-unused-vars
254
- {
255
- r3logger.dlog('CALL:', req.method, req.url);
256
-
257
- res.type('application/json; charset=utf-8');
258
-
259
- var result = { result: true, message: null };
260
- if( !apiutil.isSafeEntity(req) ||
261
- !apiutil.isSafeEntity(req.baseUrl) ||
262
- !apiutil.isSafeEntity(req.body) )
263
- {
264
- result = {
265
- result: false,
266
- message: 'POST body does not exist'
267
- };
268
-
269
- r3logger.elog(result.message);
270
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
271
- return;
272
- }
273
-
274
- //------------------------------
275
- // check token
276
- //------------------------------
277
- var token_result = r3token.checkToken(req, true, true); // scoped, user token
278
- if(!token_result.result){
279
- r3logger.elog(token_result.message);
280
- var _status = token_result.status;
281
- delete token_result.status;
282
- resutil.errResponse(req, res, _status, token_result);
283
- return;
284
- }
285
- var token_info = token_result.token_info;
286
-
287
- //------------------------------
288
- // check service path in url
289
- //------------------------------
290
- var name = null;
291
- var is_create = false;
292
- var requestptn = new RegExp('^/v1/service/(.*)'); // regex = /^\/v1\/service\/(.*)/
293
- var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
294
- if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
295
- is_create = true;
296
- }else{
297
- name = reqmatchs[1].toLowerCase();
298
- is_create = false;
299
- }
300
-
301
- //------------------------------
302
- // check arguments
303
- //------------------------------
304
- var verify = null;
305
- var tenant = null;
306
- var is_clear = false;
307
- var cnt;
308
- if(is_create){
309
- if(!apiutil.isSafeString(req.body.name)){
310
- result = {
311
- result: false,
312
- message: 'service:name field is wrong : ' + JSON.stringify(req.body.name)
313
- };
314
-
315
- r3logger.elog(result.message);
316
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
317
- return;
318
- }
319
- name = req.body.name.toLowerCase();
320
- if(apiutil.isSafeEntity(req.body.verify)){
321
- verify = req.body.verify;
322
- }
323
-
324
- }else{
325
- if(apiutil.isSafeEntity(req.body.tenant)){
326
- tenant = req.body.tenant;
327
- if(apiutil.checkSimpleJSON(tenant)){
328
- tenant = JSON.parse(tenant);
329
- }
330
- if(apiutil.isArray(tenant)){
331
- var tmparr = [];
332
- for(cnt = 0; cnt < tenant.length; ++cnt){
333
- if(!apiutil.isSafeString(tenant[cnt])){
334
- continue;
335
- }
336
- tmparr.push(tenant[cnt].toLowerCase());
337
- }
338
- tenant = tmparr;
339
- }else if(apiutil.isSafeString(tenant)){
340
- tenant = [tenant.toLowerCase()];
341
- }else{
342
- tenant = null;
343
- }
344
- if(apiutil.isEmptyArray(tenant)){
345
- tenant = null;
346
- }
347
- }
348
- if(apiutil.isSafeEntity(req.body.clear_tenant) && 'boolean' === typeof req.body.clear_tenant && true === req.body.clear_tenant){
349
- is_clear = true;
350
- }
351
- if(apiutil.isSafeEntity(req.body.verify)){
352
- verify = req.body.verify;
353
- }
354
- if(null === tenant && null === verify){
355
- result = {
356
- result: false,
357
- message: 'both tenant and verify are not specified.'
358
- };
359
-
360
- r3logger.elog(result.message);
361
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
362
- return;
363
- }
364
- }
365
-
366
- //------------------------------
367
- // create/update service
368
- //------------------------------
369
- var error = rawUpdateService(token_info.tenant, name, verify, tenant, is_clear, is_create);
370
- if(null !== error){
371
- result = {
372
- result: false,
373
- message: error.message
374
- };
375
-
376
- r3logger.elog(result.message);
377
- resutil.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
378
- return;
379
- }
380
- res.status(201); // 201: Created
381
- res.send(JSON.stringify(result));
382
- });
383
-
384
- //
385
- // Mountpath : '/v1/service/*'
386
- //
387
- // PUT '/v1/service' : post service on version 1
388
- // HEADER : X-Auth-Token => Scoped User token
389
- // response body : result => true/false
390
- // message => messages
391
- // URL argument
392
- // "name" : <service name> => key is "yrn:yahoo::::service:<service>"
393
- // "verify" : <verify url> => key is "yrn:yahoo::::service:<service>:verify"
394
- // when the value is URL, it is save as URL string.
395
- // the value is allowed null or undefined, then verify url value is null.
396
- // the value is allowed string(not URL), it is saved and converted by JSON.
397
- //
398
- // PUT '/v1/service/<service>' : post tenant or verify for service on version 1
399
- // HEADER : X-Auth-Token => Scoped User token
400
- // response body : result => true/false
401
- // message => messages
402
- // URL argument
403
- // "tenant" : <tenant name> => key is "yrn:yahoo::::service:<service>:tenant"
404
- // if this key is specified, adding tenants to service
405
- // the value is string for tenant name of tenant name list
406
- // "clear_tenant" : true/false => true means clear existing tenant without "tenant".
407
- // default false
408
- // "verify" : <verify url> => key is "yrn:yahoo::::service:<service>:verify"
409
- // when the value is URL, it is save as URL string.
410
- // the value is allowed string(not URL), it is saved and converted by JSON.
411
- //
412
- // [NOTE] see POST
413
- //
414
- router.put('/', function(req, res, next) // eslint-disable-line no-unused-vars
415
- {
416
- r3logger.dlog('CALL:', req.method, req.url);
417
-
418
- res.type('application/json; charset=utf-8');
419
-
420
- var result = { result: true, message: null };
421
- if( !apiutil.isSafeEntity(req) ||
422
- !apiutil.isSafeEntity(req.baseUrl) ||
423
- !apiutil.isSafeEntity(req.query) )
424
- {
425
- result = {
426
- result: false,
427
- message: 'PUT argument does not have any data'
428
- };
429
-
430
- r3logger.elog(result.message);
431
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
432
- return;
433
- }
434
-
435
- //------------------------------
436
- // check token
437
- //------------------------------
438
- var token_result = r3token.checkToken(req, true, true); // scoped, user token
439
- if(!token_result.result){
440
- r3logger.elog(token_result.message);
441
- var _status = token_result.status;
442
- delete token_result.status;
443
- resutil.errResponse(req, res, _status, token_result);
444
- return;
445
- }
446
- var token_info = token_result.token_info;
447
-
448
- //------------------------------
449
- // check service path in url
450
- //------------------------------
451
- var name = null;
452
- var is_create = false;
453
- var requestptn = new RegExp('^/v1/service/(.*)'); // regex = /^\/v1\/service\/(.*)/
454
- var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
455
- if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
456
- is_create = true;
457
- }else{
458
- name = reqmatchs[1].toLowerCase();
459
- is_create = false;
460
- }
461
-
462
- //------------------------------
463
- // check arguments
464
- //------------------------------
465
- var verify = null;
466
- var tenant = null;
467
- var is_clear = false;
468
- if(is_create){
469
- if(!apiutil.isSafeString(req.query.name)){
470
- result = {
471
- result: false,
472
- message: 'name argument is wrong : ' + JSON.stringify(req.query.name)
473
- };
474
-
475
- r3logger.elog(result.message);
476
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
477
- return;
478
- }
479
- name = req.query.name.toLowerCase();
480
- if(apiutil.isSafeEntity(req.query.verify)){
481
- verify = req.query.verify;
482
- if(apiutil.checkSimpleJSON(verify)){
483
- verify = JSON.parse(verify);
484
- }
485
- }
486
-
487
- }else{
488
- if(apiutil.isSafeString(req.query.tenant)){
489
- tenant = req.query.tenant;
490
- if(apiutil.checkSimpleJSON(tenant)){
491
- tenant = JSON.parse(tenant);
492
- }
493
- if(apiutil.isArray(tenant)){
494
- var tmparr = [];
495
- for(var cnt = 0; cnt < tenant.length; ++cnt){
496
- if(!apiutil.isSafeString(tenant[cnt])){
497
- continue;
498
- }
499
- tmparr.push(tenant[cnt].toLowerCase());
500
- }
501
- tenant = tmparr;
502
- }else if(apiutil.isSafeString(tenant)){
503
- tenant = [tenant.toLowerCase()];
504
- }else{
505
- tenant = null;
506
- }
507
- if(apiutil.isEmptyArray(tenant)){
508
- tenant = null;
509
- }
510
- }
511
- if(apiutil.isSafeEntity(req.query.clear_tenant)){
512
- if( ('boolean' === typeof req.query.clear_tenant && true === req.query.clear_tenant) ||
513
- (apiutil.isSafeString(req.query.clear_tenant) && (apiutil.compareCaseString('true', req.query.clear_tenant) || apiutil.compareCaseString('1', req.query.clear_tenant))) )
514
- {
515
- is_clear = true;
516
- }
517
- }
518
- if(apiutil.isSafeEntity(req.query.verify)){
519
- verify = req.query.verify;
520
- if(apiutil.checkSimpleJSON(verify)){
521
- verify = JSON.parse(verify);
522
- }
523
- }
524
- if(null === tenant && null === verify){
525
- result = {
526
- result: false,
527
- message: 'both tenant and verify are not specified.'
528
- };
529
-
530
- r3logger.elog(result.message);
531
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
532
- return;
533
- }
534
- }
535
-
536
- //------------------------------
537
- // create/update service
538
- //------------------------------
539
- var error = rawUpdateService(token_info.tenant, name, verify, tenant, is_clear, is_create);
540
- if(null !== error){
541
- result = {
542
- result: false,
543
- message: error.message
544
- };
545
-
546
- r3logger.elog(result.message);
547
- resutil.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
548
- return;
549
- }
550
- res.status(201); // 201: Created
551
- res.send(JSON.stringify(result));
552
- });
553
-
554
- //
555
- // Mountpath : '/v1/service/*'
556
- //
557
- // GET '/v1/service/<service>' : get service on version 1
558
- // HEADER : X-Auth-Token => Scoped User token
559
- // response body : result => true/false
560
- // message => error message
561
- // service => object
562
- // service object
563
- // {
564
- // "verify": <verify url> or <verify object>
565
- // "tenant": [
566
- // <tenant yrn full path>,
567
- // ...
568
- // ]
569
- // }
570
- //
571
- router.get('/', function(req, res, next)
572
- {
573
- r3logger.dlog('CALL:', req.method, req.url);
574
-
575
- if('GET' !== req.method){
576
- // HEAD request comes here, so it should be routed to head function.
577
- next();
578
- return;
579
- }
580
- res.type('application/json; charset=utf-8');
581
-
582
- var result;
583
- if( !apiutil.isSafeEntity(req) ||
584
- !apiutil.isSafeEntity(req.baseUrl) )
585
- {
586
- result = {
587
- result: false,
588
- message: 'GET request or url is wrong'
589
- };
590
-
591
- r3logger.elog(result.message);
592
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
593
- return;
594
- }
595
-
596
- //------------------------------
597
- // check token
598
- //------------------------------
599
- var token_result = r3token.checkToken(req, true, true); // scoped, user token
600
- if(!token_result.result){
601
- r3logger.elog(token_result.message);
602
- var _status = token_result.status;
603
- delete token_result.status;
604
- resutil.errResponse(req, res, _status, token_result);
605
- return;
606
- }
607
- var token_info = token_result.token_info;
608
-
609
- //------------------------------
610
- // check service path in url
611
- //------------------------------
612
- var requestptn = new RegExp('^/v1/service/(.*)'); // regex = /^\/v1\/service\/(.*)/
613
- var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
614
- if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
615
- result = {
616
- result: false,
617
- message: 'GET request url does not have service name'
618
- };
619
-
620
- r3logger.elog(result.message);
621
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
622
- return;
623
- }
624
- var servicename = reqmatchs[1].toLowerCase();
625
-
626
- //------------------------------
627
- // get all service
628
- //------------------------------
629
- result = k2hr3.getService(token_info.tenant, servicename);
630
- if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
631
- if(!apiutil.isSafeEntity(result)){
632
- result = {
633
- result: false,
634
- message: 'Could not get service data from getService'
635
- };
636
- }else{
637
- if(!apiutil.isSafeEntity(result.result)){
638
- result.result = false;
639
- }
640
- if(!apiutil.isSafeEntity(result.message)){
641
- result.message = 'Could not get error message in response from getService';
642
- }
643
- }
644
- r3logger.elog(result.message);
645
- resutil.errResponse(req, res, 403, result); // 403: Forbidden(is this status OK?)
646
- return;
647
- }
648
-
649
- //
650
- // Remove owner/name from result
651
- //
652
- if(apiutil.isSafeEntity(result.name)){
653
- delete result.name;
654
- }
655
- if(apiutil.isSafeEntity(result.owner)){
656
- delete result.owner;
657
- }
658
- r3logger.dlog('succeed : ' + result.message);
659
- res.status(200); // 200: OK
660
- res.send(JSON.stringify(result));
661
- });
662
-
663
- //
664
- // Mountpath : '/v1/service/*'
665
- //
666
- // HEAD '/v1/service/<service>' : head service on version 1
667
- // HEADER : X-Auth-Token => Scoped User token
668
- //
669
- // HEAD '/v1/service/<service>' : head tenant is allowed in service's tenant list on version 1
670
- // HEADER : X-Auth-Token => Scoped User token
671
- // URL argument :
672
- // "tenant" : <tenant name> => key is "yrn:yahoo::::service:<service>:tenant"
673
- // if this key is specified, check tenant is allowed.
674
- //
675
- router.head('/', function(req, res, next)
676
- {
677
- r3logger.dlog('CALL:', req.method, req.url);
678
-
679
- if('HEAD' !== req.method){
680
- // If other method request comes here, so it should be routed another function.
681
- next();
682
- return;
683
- }
684
- res.type('application/json; charset=utf-8');
685
-
686
- var result;
687
- if( !apiutil.isSafeEntity(req) ||
688
- !apiutil.isSafeEntity(req.baseUrl) )
689
- {
690
- result = {
691
- result: false,
692
- message: 'HEAD request or url or query is wrong'
693
- };
694
-
695
- r3logger.elog(result.message);
696
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
697
- return;
698
- }
699
-
700
- //------------------------------
701
- // check token
702
- //------------------------------
703
- var token_result = r3token.checkToken(req, true, true); // scoped, user token
704
- if(!token_result.result){
705
- r3logger.elog(token_result.message);
706
- var _status = token_result.status;
707
- delete token_result.status;
708
- resutil.errResponse(req, res, _status, token_result);
709
- return;
710
- }
711
- var token_info = token_result.token_info;
712
-
713
- //------------------------------
714
- // check service path in url
715
- //------------------------------
716
- var requestptn = new RegExp('^/v1/service/(.*)'); // regex = /^\/v1\/service\/(.*)/
717
- var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
718
- if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
719
- result = {
720
- result: false,
721
- message: 'GET request url does not have service name'
722
- };
723
-
724
- r3logger.elog(result.message);
725
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
726
- return;
727
- }
728
- var servicename = reqmatchs[1].toLowerCase();
729
-
730
- //------------------------------
731
- // check arguments
732
- //------------------------------
733
- var tenantyrn = null;
734
- if(apiutil.isSafeString(req.query.tenant)){
735
- var keys = r3keys(null, req.query.tenant.toLowerCase(), null);
736
- tenantyrn = keys.MASTER_TENANT_TOP_KEY; // tenant full yrn : "yrn:yahoo:::<tenant>"
737
- }
738
-
739
- //------------------------------
740
- // get all service
741
- //------------------------------
742
- result = k2hr3.getService(token_info.tenant, servicename);
743
- if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
744
- if(!apiutil.isSafeEntity(result)){
745
- result = {
746
- result: false,
747
- message: 'Could not get service data from getService'
748
- };
749
- }else{
750
- if(!apiutil.isSafeEntity(result.result)){
751
- result.result = false;
752
- }
753
- if(!apiutil.isSafeEntity(result.message)){
754
- result.message = 'Could not get error message in response from getService';
755
- }
756
- }
757
- r3logger.elog(result.message);
758
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
759
- return;
760
- }
761
- if(null !== tenantyrn){
762
- // tenant check
763
- if(!apiutil.isSafeEntity(result.service) || !apiutil.isArray(result.service.tenant) || !apiutil.findStringInArray(result.service.tenant, tenantyrn)){
764
- result = {
765
- result: false,
766
- message: 'Deny tenant(' + req.query.tenant.toLowerCase() + ') for service(' + servicename + ')'
767
- };
768
-
769
- r3logger.elog(result.message);
770
- resutil.errResponse(req, res, 403); // 403: Forbidden(is this status OK?)
771
- return;
772
- }
773
- }
774
-
775
- r3logger.dlog('succeed : ' + result.message);
776
- res.status(204); // 204: No Content
777
- res.send();
778
- });
779
-
780
- //
781
- // Mountpath : '/v1/service/*'
782
- //
783
- // DELETE '/v1/service/<service>' : delete service on version 1
784
- // remove service and all related to service.
785
- // HEADER : X-Auth-Token => Scoped User token
786
- //
787
- // DELETE '/v1/service/<service>' : delete tenant from service's tenant list on version 1
788
- // HEADER : X-Auth-Token => Scoped User token
789
- // URL argument :
790
- // "tenant" : <tenant name> => key is "yrn:yahoo::::service:<service>:tenant"
791
- // if this key is specified, removing tenant from service
792
- //
793
- router.delete('/', function(req, res, next) // eslint-disable-line no-unused-vars
794
- {
795
- r3logger.dlog('CALL:', req.method, req.url);
796
-
797
- res.type('application/json; charset=utf-8');
798
-
799
- var result;
800
- if( !apiutil.isSafeEntity(req) ||
801
- !apiutil.isSafeEntity(req.baseUrl) )
802
- {
803
- result = {
804
- result: false,
805
- message: 'DELETE request or url or query is wrong'
806
- };
807
-
808
- r3logger.elog(result.message);
809
- resutil.errResponse(req, res, 400); // 400: Bad Request
810
- return;
811
- }
812
-
813
- //------------------------------
814
- // check token
815
- //------------------------------
816
- var token_result = r3token.checkToken(req, true, true); // scoped, user token
817
- if(!token_result.result){
818
- r3logger.elog(token_result.message);
819
- var _status = token_result.status;
820
- delete token_result.status;
821
- resutil.errResponse(req, res, _status, token_result);
822
- return;
823
- }
824
- var token_info = token_result.token_info;
825
-
826
- //------------------------------
827
- // check service path in url
828
- //------------------------------
829
- var requestptn = new RegExp('^/v1/service/(.*)'); // regex = /^\/v1\/service\/(.*)/
830
- var reqmatchs = decodeURI(req.baseUrl).match(requestptn);
831
- if(apiutil.isEmptyArray(reqmatchs) || reqmatchs.length < 2 || '' === apiutil.getSafeString(reqmatchs[1])){
832
- result = {
833
- result: false,
834
- message: 'DELETE request url does not have service name'
835
- };
836
-
837
- r3logger.elog(result.message);
838
- resutil.errResponse(req, res, 400, result); // 400: Bad Request
839
- return;
840
- }
841
- var servicename = reqmatchs[1].toLowerCase();
842
-
843
- //------------------------------
844
- // check arguments
845
- //------------------------------
846
- var tenantname = null;
847
- if(apiutil.isSafeString(req.query.tenant)){
848
- tenantname = req.query.tenant.toLowerCase();
849
- }
850
-
851
- //------------------------------
852
- // Do remove
853
- //------------------------------
854
- if(null === tenantname){
855
- // remove service and all
856
- result = k2hr3.removeService(token_info.tenant, servicename);
857
- }else{
858
- // remove tenant from service's tenant list
859
- result = k2hr3.removeServiceTenant(token_info.user, tenantname, servicename);
860
- }
861
- if(!apiutil.isSafeEntity(result) || !apiutil.isSafeEntity(result.result) || false === result.result){
862
- if(!apiutil.isSafeEntity(result)){
863
- result = {
864
- result: false,
865
- message: 'Could not remove service data from ' + (null === tenantname ? 'removeService' : 'denyTenantFromService')
866
- };
867
- }else{
868
- if(!apiutil.isSafeEntity(result.result)){
869
- result.result = false;
870
- }
871
- if(!apiutil.isSafeEntity(result.message)){
872
- result.message = 'Could not get error message in response from ' + (null === tenantname ? 'removeService' : 'denyTenantFromService');
873
- }
874
- }
875
- r3logger.elog(result.message);
876
- resutil.errResponse(req, res, 403); // 403: Forbidden(is this status OK?)
877
- return;
878
- }
879
-
880
- r3logger.dlog('succeed : ' + result.message);
881
- res.status(204); // 204: No Content
882
- res.send();
883
- });
884
-
885
- module.exports = router;
886
-
887
- /*
888
- * Local variables:
889
- * tab-width: 4
890
- * c-basic-offset: 4
891
- * End:
892
- * vim600: noexpandtab sw=4 ts=4 fdm=marker
893
- * vim<600: noexpandtab sw=4 ts=4
894
- */