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.
- package/config/k2hr3-init.sh.templ +4 -4
- package/dist/.gitkeep +0 -0
- package/dist/src/app.js +262 -0
- package/{bin → dist/src/bin}/run.sh +1 -1
- package/dist/src/bin/watcher.js +113 -0
- package/dist/src/bin/www.js +217 -0
- package/dist/src/lib/basicipcheck.js +392 -0
- package/dist/src/lib/cacerts.js +106 -0
- package/dist/src/lib/dbglogging.js +190 -0
- package/dist/src/lib/dummyuserapi.js +719 -0
- package/dist/src/lib/ipwatch.js +354 -0
- package/dist/src/lib/k2hr3acrutil.js +532 -0
- package/dist/src/lib/k2hr3apiutil.js +1444 -0
- package/dist/src/lib/k2hr3cliutil.js +183 -0
- package/dist/src/lib/k2hr3config.js +832 -0
- package/dist/src/lib/k2hr3cryptutil.js +258 -0
- package/dist/src/lib/k2hr3dkc.js +12121 -0
- package/dist/src/lib/k2hr3extdata.js +198 -0
- package/dist/src/lib/k2hr3keys.js +207 -0
- package/dist/src/lib/k2hr3resutil.js +111 -0
- package/dist/src/lib/k2hr3template.js +6546 -0
- package/dist/src/lib/k2hr3tokens.js +2643 -0
- package/dist/src/lib/k2hr3userdata.js +296 -0
- package/dist/src/lib/k8soidc.js +1000 -0
- package/dist/src/lib/openstackapiv2.js +695 -0
- package/dist/src/lib/openstackapiv3.js +932 -0
- package/dist/src/lib/openstackep.js +667 -0
- package/{tests/auto_common.js → dist/src/lib/types.js} +4 -38
- package/dist/src/routes/acr.js +704 -0
- package/dist/src/routes/debugVerify.js +294 -0
- package/dist/src/routes/extdata.js +219 -0
- package/dist/src/routes/list.js +264 -0
- package/dist/src/routes/policy.js +840 -0
- package/dist/src/routes/resource.js +1489 -0
- package/dist/src/routes/role.js +2627 -0
- package/dist/src/routes/service.js +908 -0
- package/dist/src/routes/tenant.js +1141 -0
- package/dist/src/routes/userTokens.js +482 -0
- package/dist/src/routes/userdata.js +212 -0
- package/dist/src/routes/version.js +103 -0
- package/package.json +152 -121
- package/ChangeLog +0 -378
- package/app.js +0 -292
- package/bin/watcher +0 -122
- package/bin/www +0 -180
- package/eslint.config.mjs +0 -68
- package/lib/basicipcheck.js +0 -376
- package/lib/cacerts.js +0 -71
- package/lib/dbglogging.js +0 -151
- package/lib/dummyuserapi.js +0 -766
- package/lib/ipwatch.js +0 -379
- package/lib/k2hr3acrutil.js +0 -516
- package/lib/k2hr3apiutil.js +0 -1494
- package/lib/k2hr3cliutil.js +0 -191
- package/lib/k2hr3config.js +0 -826
- package/lib/k2hr3cryptutil.js +0 -254
- package/lib/k2hr3dkc.js +0 -12632
- package/lib/k2hr3extdata.js +0 -198
- package/lib/k2hr3keys.js +0 -234
- package/lib/k2hr3resutil.js +0 -100
- package/lib/k2hr3template.js +0 -6925
- package/lib/k2hr3tokens.js +0 -2799
- package/lib/k2hr3userdata.js +0 -312
- package/lib/k8soidc.js +0 -1012
- package/lib/openstackapiv2.js +0 -764
- package/lib/openstackapiv3.js +0 -1032
- package/lib/openstackep.js +0 -553
- package/routes/acr.js +0 -738
- package/routes/debugVerify.js +0 -263
- package/routes/extdata.js +0 -232
- package/routes/list.js +0 -270
- package/routes/policy.js +0 -869
- package/routes/resource.js +0 -1441
- package/routes/role.js +0 -2664
- package/routes/service.js +0 -894
- package/routes/tenant.js +0 -1095
- package/routes/userTokens.js +0 -511
- package/routes/userdata.js +0 -218
- package/routes/version.js +0 -108
- package/templ/Dockerfile.templ +0 -71
- package/tests/auto_acr.js +0 -1101
- package/tests/auto_acr_spec.js +0 -79
- package/tests/auto_all_spec.js +0 -142
- package/tests/auto_control_subprocess.sh +0 -243
- package/tests/auto_extdata.js +0 -220
- package/tests/auto_extdata_spec.js +0 -79
- package/tests/auto_init_config_json.sh +0 -275
- package/tests/auto_k2hdkc_server.ini +0 -109
- package/tests/auto_k2hdkc_slave.ini +0 -83
- package/tests/auto_list.js +0 -439
- package/tests/auto_list_spec.js +0 -79
- package/tests/auto_policy.js +0 -1579
- package/tests/auto_policy_spec.js +0 -79
- package/tests/auto_resource.js +0 -10956
- package/tests/auto_resource_spec.js +0 -79
- package/tests/auto_role.js +0 -6150
- package/tests/auto_role_spec.js +0 -79
- package/tests/auto_service.js +0 -770
- package/tests/auto_service_spec.js +0 -79
- package/tests/auto_subprocesses.js +0 -114
- package/tests/auto_template.sh +0 -126
- package/tests/auto_tenant.js +0 -1100
- package/tests/auto_tenant_spec.js +0 -79
- package/tests/auto_token_util.js +0 -219
- package/tests/auto_userdata.js +0 -292
- package/tests/auto_userdata_spec.js +0 -79
- package/tests/auto_usertokens.js +0 -565
- package/tests/auto_usertokens_spec.js +0 -79
- package/tests/auto_version.js +0 -127
- package/tests/auto_version_spec.js +0 -79
- package/tests/auto_watcher.js +0 -157
- package/tests/auto_watcher_spec.js +0 -79
- package/tests/k2hdkc_test.data +0 -986
- package/tests/k2hdkc_test_load.sh +0 -255
- package/tests/k2hr3template_test.js +0 -187
- package/tests/k2hr3template_test.sh +0 -339
- package/tests/k2hr3template_test_async.js +0 -216
- package/tests/k2hr3template_test_template.result +0 -7117
- package/tests/k2hr3template_test_template.txt +0 -3608
- package/tests/k2hr3template_test_vars.js +0 -194
- package/tests/manual_acr_delete.js +0 -143
- package/tests/manual_acr_get.js +0 -297
- package/tests/manual_acr_postput.js +0 -215
- package/tests/manual_allusertenant_get.js +0 -113
- package/tests/manual_extdata_get.js +0 -191
- package/tests/manual_k2hr3keys_get.js +0 -84
- package/tests/manual_list_gethead.js +0 -230
- package/tests/manual_policy_delete.js +0 -132
- package/tests/manual_policy_gethead.js +0 -275
- package/tests/manual_policy_postput.js +0 -297
- package/tests/manual_resource_delete.js +0 -433
- package/tests/manual_resource_gethead.js +0 -423
- package/tests/manual_resource_postput.js +0 -487
- package/tests/manual_role_delete.js +0 -404
- package/tests/manual_role_gethead.js +0 -547
- package/tests/manual_role_postput.js +0 -544
- package/tests/manual_service_delete.js +0 -153
- package/tests/manual_service_gethead.js +0 -178
- package/tests/manual_service_postput.js +0 -348
- package/tests/manual_tenant_delete.js +0 -186
- package/tests/manual_tenant_gethead.js +0 -268
- package/tests/manual_tenant_postput.js +0 -293
- package/tests/manual_test.sh +0 -352
- package/tests/manual_userdata_get.js +0 -173
- package/tests/manual_usertoken_gethead.js +0 -136
- package/tests/manual_usertoken_postput.js +0 -310
- package/tests/manual_version_get.js +0 -127
- package/tests/run_local_test_k2hdkc.sh +0 -174
- package/tests/test.sh +0 -333
package/routes/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
|
-
*/
|