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/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
|
-
*/
|