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