@vtecx/vtecxnext 1.0.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,10 @@ import type { Readable } from 'node:stream';
5
5
  * Hello world.
6
6
  */
7
7
  export declare const hello: () => void;
8
+ type StatusMessage = {
9
+ status: number;
10
+ message: string;
11
+ };
8
12
  /**
9
13
  * X-Requested-With header check.
10
14
  * If not specified, set status 417 to the response.
@@ -29,26 +33,36 @@ export declare const sendMessage: (res: ServerResponse, statusCode: number, mess
29
33
  * @param res response
30
34
  * @param wsse WSSE
31
35
  * @param reCaptchaToken reCAPTCHA token
32
- * @return true if log in has been successful.
36
+ * @return status and message
33
37
  */
34
- export declare const login: (req: IncomingMessage, res: ServerResponse, wsse: string, reCaptchaToken?: string) => Promise<boolean>;
38
+ export declare const login: (req: IncomingMessage, res: ServerResponse, wsse: string, reCaptchaToken?: string) => Promise<StatusMessage>;
35
39
  /**
36
40
  * login with RXID.
37
41
  * If the login is successful, sets the authentication information in a cookie.
38
42
  * @param req request
39
43
  * @param res response
40
44
  * @param rxid RXID
41
- * @return true if log in has been successful.
45
+ * @return status and message
42
46
  */
43
- export declare const loginWithRxid: (req: IncomingMessage, res: ServerResponse, rxid: string) => Promise<boolean>;
47
+ export declare const loginWithRxid: (req: IncomingMessage, res: ServerResponse, rxid: string) => Promise<StatusMessage>;
48
+ /**
49
+ * login with Time-based One Time Password.
50
+ * If the login is successful, sets the authentication information in a cookie.
51
+ * @param req request
52
+ * @param res response
53
+ * @param totp Time-based One Time Password
54
+ * @param isTrustedDevice true if trusted device
55
+ * @return status and message
56
+ */
57
+ export declare const loginWithTotp: (req: IncomingMessage, res: ServerResponse, totp: string, isTrustedDevice: boolean) => Promise<StatusMessage>;
44
58
  /**
45
59
  * logout.
46
60
  * If the logout is successful, delete the authentication information in a cookie.
47
61
  * @param req request
48
62
  * @param res response
49
- * @return true if log out has been successful.
63
+ * @return status and message
50
64
  */
51
- export declare const logout: (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
65
+ export declare const logout: (req: IncomingMessage, res: ServerResponse) => Promise<StatusMessage>;
52
66
  /**
53
67
  * get current datetime
54
68
  * @return current datetime
@@ -738,6 +752,38 @@ export declare const oauthCallbackLine: (req: IncomingMessage, res: ServerRespon
738
752
  * @returns buffer
739
753
  */
740
754
  export declare const buffer: (readable: Readable) => Promise<Buffer>;
755
+ /**
756
+ * get TOTP link
757
+ * @param req request (for authentication)
758
+ * @param res response (for authentication)
759
+ * @param chs length of one side of QR code
760
+ * @return QR code URL in feed.title
761
+ */
762
+ export declare const getTotpLink: (req: IncomingMessage, res: ServerResponse, chs?: number) => Promise<any>;
763
+ /**
764
+ * create TOTP
765
+ * @param req request (for authentication)
766
+ * @param res response (for authentication)
767
+ * @param feed one-time password for feed.title when you do book registration
768
+ * @return message
769
+ */
770
+ export declare const createTotp: (req: IncomingMessage, res: ServerResponse, feed: any) => Promise<any>;
771
+ /**
772
+ * delete TOTP
773
+ * @param req request (for authentication)
774
+ * @param res response (for authentication)
775
+ * @param account target account (for service admin user)
776
+ * @return message
777
+ */
778
+ export declare const deleteTotp: (req: IncomingMessage, res: ServerResponse, account?: string) => Promise<any>;
779
+ /**
780
+ * change TDID (Trusted device ID)
781
+ * @param req request (for authentication)
782
+ * @param res response (for authentication)
783
+ * @param account target account (for service admin user)
784
+ * @return message
785
+ */
786
+ export declare const changeTdid: (req: IncomingMessage, res: ServerResponse) => Promise<any>;
741
787
  /**
742
788
  * Error returned from vte.cx
743
789
  */
@@ -751,3 +797,4 @@ export declare class VtecxNextError extends Error {
751
797
  export declare class FetchError extends VtecxNextError {
752
798
  constructor(message: string);
753
799
  }
800
+ export {};
package/dist/vtecxnext.js CHANGED
@@ -26,8 +26,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.deleteSignature = exports.putSignatures = exports.putSignature = exports.toPdf = exports.getBQCsv = exports.getBQ = exports.deleteBQ = exports.postBQ = exports.getPage = exports.pagination = exports.getSessionLong = exports.getSessionString = exports.getSessionEntry = exports.getSessionFeed = exports.deleteSessionLong = exports.deleteSessionString = exports.deleteSessionEntry = exports.deleteSessionFeed = exports.incrementSession = exports.setSessionLong = exports.setSessionString = exports.setSessionEntry = exports.setSessionFeed = exports.getRangeids = exports.rangeids = exports.setids = exports.getids = exports.addids = exports.allocids = exports.deleteFolder = exports.deleteEntry = exports.put = exports.post = exports.count = exports.getFeed = exports.getEntry = exports.log = exports.rxid = exports.service = exports.isLoggedin = exports.whoami = exports.account = exports.uid = exports.now = exports.logout = exports.loginWithRxid = exports.login = exports.sendMessage = exports.checkXRequestedWith = exports.hello = void 0;
30
- exports.FetchError = exports.VtecxNextError = exports.buffer = exports.oauthCallbackLine = exports.oauthLine = exports.removealias = exports.addalias = exports.removeacl = exports.addacl = exports.getcontent = exports.deletecontent = exports.putcontent = exports.savefiles = exports.deleteusers = exports.deleteuser = exports.canceluser = exports.activateusers = exports.activateuser = exports.revokeusers = exports.revokeuser = exports.userstatus = exports.changeaccount_verify = exports.changeaccount = exports.changepassByAdmin = exports.changepass = exports.passreset = exports.adduserByAdmin = exports.adduser = exports.isAdmin = exports.isGroupMember = exports.getGroups = exports.noGroupMember = exports.leaveGroup = exports.joinGroup = exports.getMessageQueue = exports.setMessageQueue = exports.setMessageQueueStatus = exports.pushNotification = exports.sendMail = exports.checkSignature = void 0;
29
+ exports.putSignatures = exports.putSignature = exports.toPdf = exports.getBQCsv = exports.getBQ = exports.deleteBQ = exports.postBQ = exports.getPage = exports.pagination = exports.getSessionLong = exports.getSessionString = exports.getSessionEntry = exports.getSessionFeed = exports.deleteSessionLong = exports.deleteSessionString = exports.deleteSessionEntry = exports.deleteSessionFeed = exports.incrementSession = exports.setSessionLong = exports.setSessionString = exports.setSessionEntry = exports.setSessionFeed = exports.getRangeids = exports.rangeids = exports.setids = exports.getids = exports.addids = exports.allocids = exports.deleteFolder = exports.deleteEntry = exports.put = exports.post = exports.count = exports.getFeed = exports.getEntry = exports.log = exports.rxid = exports.service = exports.isLoggedin = exports.whoami = exports.account = exports.uid = exports.now = exports.logout = exports.loginWithTotp = exports.loginWithRxid = exports.login = exports.sendMessage = exports.checkXRequestedWith = exports.hello = void 0;
30
+ exports.FetchError = exports.VtecxNextError = exports.changeTdid = exports.deleteTotp = exports.createTotp = exports.getTotpLink = exports.buffer = exports.oauthCallbackLine = exports.oauthLine = exports.removealias = exports.addalias = exports.removeacl = exports.addacl = exports.getcontent = exports.deletecontent = exports.putcontent = exports.savefiles = exports.deleteusers = exports.deleteuser = exports.canceluser = exports.activateusers = exports.activateuser = exports.revokeusers = exports.revokeuser = exports.userstatus = exports.changeaccount_verify = exports.changeaccount = exports.changepassByAdmin = exports.changepass = exports.passreset = exports.adduserByAdmin = exports.adduser = exports.isAdmin = exports.isGroupMember = exports.getGroups = exports.noGroupMember = exports.leaveGroup = exports.joinGroup = exports.getMessageQueue = exports.setMessageQueue = exports.setMessageQueueStatus = exports.pushNotification = exports.sendMail = exports.checkSignature = exports.deleteSignature = void 0;
31
31
  const sqlstring_1 = __importDefault(require("sqlstring"));
32
32
  const formidable_1 = __importDefault(require("formidable"));
33
33
  const fs_1 = __importDefault(require("fs"));
@@ -39,6 +39,9 @@ const hello = () => {
39
39
  console.log('Hello vtecxnext.');
40
40
  };
41
41
  exports.hello = hello;
42
+ const SERVLETPATH_DATA = '/d';
43
+ const SERVLETPATH_PROVIDER = '/p';
44
+ const SERVLETPATH_OAUTH = '/o';
42
45
  /**
43
46
  * X-Requested-With header check.
44
47
  * If not specified, set status 417 to the response.
@@ -77,7 +80,7 @@ exports.sendMessage = sendMessage;
77
80
  * @param res response
78
81
  * @param wsse WSSE
79
82
  * @param reCaptchaToken reCAPTCHA token
80
- * @return true if log in has been successful.
83
+ * @return status and message
81
84
  */
82
85
  const login = async (req, res, wsse, reCaptchaToken) => {
83
86
  //console.log('[vtecxnext login] start.')
@@ -87,28 +90,19 @@ const login = async (req, res, wsse, reCaptchaToken) => {
87
90
  // reCAPTCHA tokenは任意
88
91
  const param = reCaptchaToken ? `&g-recaptcha-token=${reCaptchaToken}` : '';
89
92
  const method = 'GET';
90
- const url = `/d/?_login${param}`;
93
+ const url = `${SERVLETPATH_DATA}/?_login${param}`;
91
94
  const headers = { 'X-WSSE': `${wsse}` };
92
95
  let response;
93
96
  try {
94
- response = await fetchVtecx(method, url, headers);
97
+ response = await requestVtecx(method, url, req, null, headers);
95
98
  }
96
99
  catch (e) {
97
100
  throw newFetchError(e, true);
98
101
  }
99
- //const feed = await response.json()
100
102
  // vte.cxからのset-cookieを転記
101
103
  setCookie(response, res);
102
- // レスポンスのエラーチェック
103
- let isLoggedin;
104
- if (response.status < 400) {
105
- isLoggedin = true;
106
- }
107
- else {
108
- isLoggedin = false;
109
- }
110
- //console.log(`[vtecxnext login] end. status=${response.status} message=${feed.title}`)
111
- return isLoggedin;
104
+ const data = await response.json();
105
+ return { status: response.status, message: data.feed.title };
112
106
  };
113
107
  exports.login = login;
114
108
  /**
@@ -117,7 +111,7 @@ exports.login = login;
117
111
  * @param req request
118
112
  * @param res response
119
113
  * @param rxid RXID
120
- * @return true if log in has been successful.
114
+ * @return status and message
121
115
  */
122
116
  const loginWithRxid = async (req, res, rxid) => {
123
117
  //console.log('[vtecxnext loginWithRxid] start.')
@@ -126,7 +120,7 @@ const loginWithRxid = async (req, res, rxid) => {
126
120
  // ログイン
127
121
  // reCAPTCHA tokenは任意
128
122
  const method = 'GET';
129
- const url = `/d/?_login&_RXID=${rxid}`;
123
+ const url = `${SERVLETPATH_DATA}/?_login&_RXID=${rxid}`;
130
124
  let response;
131
125
  try {
132
126
  response = await requestVtecx(method, url, req);
@@ -137,24 +131,50 @@ const loginWithRxid = async (req, res, rxid) => {
137
131
  const feed = await response.json();
138
132
  // vte.cxからのset-cookieを転記
139
133
  setCookie(response, res);
140
- // レスポンスのエラーチェック
141
- let isLoggedin;
142
- if (response.status < 400) {
143
- isLoggedin = true;
134
+ const data = await response.json();
135
+ return { status: response.status, message: data.feed.title };
136
+ };
137
+ exports.loginWithRxid = loginWithRxid;
138
+ /**
139
+ * login with Time-based One Time Password.
140
+ * If the login is successful, sets the authentication information in a cookie.
141
+ * @param req request
142
+ * @param res response
143
+ * @param totp Time-based One Time Password
144
+ * @param isTrustedDevice true if trusted device
145
+ * @return status and message
146
+ */
147
+ const loginWithTotp = async (req, res, totp, isTrustedDevice) => {
148
+ //console.log('[vtecxnext loginWithTotp] start.')
149
+ // 入力チェック
150
+ checkNotNull(totp, 'Authentication information');
151
+ // ログイン
152
+ const method = 'GET';
153
+ const url = `${SERVLETPATH_DATA}/?_login`;
154
+ const headers = { 'Authorization': `TOTP ${totp}` };
155
+ if (isTrustedDevice) {
156
+ headers['X-TRUSTED-DEVICE'] = 'true';
144
157
  }
145
- else {
146
- isLoggedin = false;
158
+ //console.log(`[vtecxnext loginWithTotp] headers = ${JSON.stringify(headers)}`)
159
+ let response;
160
+ try {
161
+ response = await requestVtecx(method, url, req, null, headers);
147
162
  }
148
- //console.log(`[vtecxnext loginWithRxid] end. status=${response.status} message=${feed.title}`)
149
- return isLoggedin;
163
+ catch (e) {
164
+ throw newFetchError(e, true);
165
+ }
166
+ // vte.cxからのset-cookieを転記
167
+ setCookie(response, res);
168
+ const data = await response.json();
169
+ return { status: response.status, message: data.feed.title };
150
170
  };
151
- exports.loginWithRxid = loginWithRxid;
171
+ exports.loginWithTotp = loginWithTotp;
152
172
  /**
153
173
  * logout.
154
174
  * If the logout is successful, delete the authentication information in a cookie.
155
175
  * @param req request
156
176
  * @param res response
157
- * @return true if log out has been successful.
177
+ * @return status and message
158
178
  */
159
179
  const logout = async (req, res) => {
160
180
  //console.log('[vtecxnext logout] start.')
@@ -177,7 +197,8 @@ const logout = async (req, res) => {
177
197
  // 戻り値
178
198
  const data = await getJson(response);
179
199
  //console.log(`[vtecxnext logout] response message : ${data.feed.title}`)
180
- return true;
200
+ //return true
201
+ return { status: response.status, message: data.feed.title };
181
202
  };
182
203
  exports.logout = logout;
183
204
  /**
@@ -374,7 +395,7 @@ const log = async (req, res, message, title, subtitle) => {
374
395
  const logSubtitle = subtitle ?? 'INFO';
375
396
  const feed = [{ 'title': logTitle, 'subtitle': logSubtitle, 'summary': message }];
376
397
  const method = 'POST';
377
- const url = `/p/?_log`;
398
+ const url = `${SERVLETPATH_PROVIDER}/?_log`;
378
399
  let response;
379
400
  try {
380
401
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -405,7 +426,7 @@ const getEntry = async (req, res, uri, targetService) => {
405
426
  checkUri(uri);
406
427
  // vte.cxへリクエスト
407
428
  const method = 'GET';
408
- const url = `/p${uri}?e`;
429
+ const url = `${SERVLETPATH_PROVIDER}${uri}?e`;
409
430
  let response;
410
431
  try {
411
432
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -435,7 +456,7 @@ const getFeed = async (req, res, uri, targetService) => {
435
456
  checkUri(uri);
436
457
  // vte.cxへリクエスト
437
458
  const method = 'GET';
438
- const url = `/p${uri}${uri.includes('?') ? '&' : '?'}f`;
459
+ const url = `${SERVLETPATH_PROVIDER}${uri}${uri.includes('?') ? '&' : '?'}f`;
439
460
  let response;
440
461
  try {
441
462
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -465,7 +486,7 @@ const count = async (req, res, uri, targetService) => {
465
486
  checkUri(uri);
466
487
  // vte.cxへリクエスト
467
488
  const method = 'GET';
468
- const url = `/p${uri}${uri.includes('?') ? '&' : '?'}c`;
489
+ const url = `${SERVLETPATH_PROVIDER}${uri}${uri.includes('?') ? '&' : '?'}c`;
469
490
  let response;
470
491
  try {
471
492
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -501,7 +522,7 @@ const post = async (req, res, feed, uri, targetService) => {
501
522
  }
502
523
  // vte.cxへリクエスト
503
524
  const method = 'POST';
504
- const url = `/p${uri ? uri : '/'}?e`;
525
+ const url = `${SERVLETPATH_PROVIDER}${uri ? uri : '/'}?e`;
505
526
  let response;
506
527
  try {
507
528
  response = await requestVtecx(method, url, req, JSON.stringify(feed), null, targetService);
@@ -537,7 +558,7 @@ const put = async (req, res, feed, isbulk, parallel, async, targetService) => {
537
558
  if (isbulk) {
538
559
  additionalParam = (parallel ? '&_bulk' : '&_bulkserial') + (async ? '&_async' : '');
539
560
  }
540
- const url = `/p/?e${additionalParam}`;
561
+ const url = `${SERVLETPATH_PROVIDER}/?e${additionalParam}`;
541
562
  //console.log(`[vtecxnext put] url=${url}`)
542
563
  let response;
543
564
  try {
@@ -569,7 +590,7 @@ const deleteEntry = async (req, res, uri, revision, targetService) => {
569
590
  // vte.cxへリクエスト
570
591
  const method = 'DELETE';
571
592
  const param = revision ? `&r=${revision}` : '';
572
- const url = `/p${uri}?e${param}`;
593
+ const url = `${SERVLETPATH_PROVIDER}${uri}?e${param}`;
573
594
  let response;
574
595
  try {
575
596
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -599,7 +620,7 @@ const deleteFolder = async (req, res, uri, async, targetService) => {
599
620
  checkUri(uri);
600
621
  // vte.cxへリクエスト
601
622
  const method = 'DELETE';
602
- const url = `/p${uri}?_rf${async ? '&_async' : ''}`;
623
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_rf${async ? '&_async' : ''}`;
603
624
  let response;
604
625
  try {
605
626
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -630,7 +651,7 @@ const allocids = async (req, res, uri, num, targetService) => {
630
651
  checkNotNull(num, 'number to allocate');
631
652
  // vte.cxへリクエスト
632
653
  const method = 'GET';
633
- const url = `/p${uri}?_allocids=${num}`;
654
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_allocids=${num}`;
634
655
  let response;
635
656
  try {
636
657
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -663,7 +684,7 @@ const addids = async (req, res, uri, num, targetService) => {
663
684
  checkNotNull(num, 'number to add');
664
685
  // vte.cxへリクエスト
665
686
  const method = 'PUT';
666
- const url = `/p${uri}?_addids=${num}`;
687
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_addids=${num}`;
667
688
  let response;
668
689
  try {
669
690
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -694,7 +715,7 @@ const getids = async (req, res, uri, targetService) => {
694
715
  checkUri(uri);
695
716
  // vte.cxへリクエスト
696
717
  const method = 'GET';
697
- const url = `/p${uri}?_getids`;
718
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_getids`;
698
719
  let response;
699
720
  try {
700
721
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -727,7 +748,7 @@ const setids = async (req, res, uri, num, targetService) => {
727
748
  checkNotNull(num, 'number to set');
728
749
  // vte.cxへリクエスト
729
750
  const method = 'PUT';
730
- const url = `/p${uri}?_setids=${num}`;
751
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_setids=${num}`;
731
752
  let response;
732
753
  try {
733
754
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -760,7 +781,7 @@ const rangeids = async (req, res, uri, range) => {
760
781
  checkNotNull(range, 'range');
761
782
  // vte.cxへリクエスト
762
783
  const method = 'PUT';
763
- const url = `/p${uri}?_rangeids`;
784
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_rangeids`;
764
785
  const feed = { feed: { 'title': range } };
765
786
  let response;
766
787
  try {
@@ -792,7 +813,7 @@ const getRangeids = async (req, res, uri) => {
792
813
  checkUri(uri);
793
814
  // vte.cxへリクエスト
794
815
  const method = 'GET';
795
- const url = `/p${uri}?_rangeids`;
816
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_rangeids`;
796
817
  let response;
797
818
  try {
798
819
  response = await requestVtecx(method, url, req);
@@ -825,7 +846,7 @@ const setSessionFeed = async (req, res, name, feed) => {
825
846
  checkNotNull(feed, 'Feed');
826
847
  // vte.cxへリクエスト
827
848
  const method = 'PUT';
828
- const url = `/p/?_sessionfeed=${name}`;
849
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionfeed=${name}`;
829
850
  let response;
830
851
  try {
831
852
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -856,7 +877,7 @@ const setSessionEntry = async (req, res, name, entry) => {
856
877
  checkNotNull(entry, 'Entry');
857
878
  // vte.cxへリクエスト
858
879
  const method = 'PUT';
859
- const url = `/p/?_sessionentry=${name}`;
880
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionentry=${name}`;
860
881
  const feed = { feed: { 'entry': entry } };
861
882
  let response;
862
883
  try {
@@ -888,7 +909,7 @@ const setSessionString = async (req, res, name, str) => {
888
909
  checkNotNull(str, 'String');
889
910
  // vte.cxへリクエスト
890
911
  const method = 'PUT';
891
- const url = `/p/?_sessionstring=${name}`;
912
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionstring=${name}`;
892
913
  const feed = { feed: { 'title': str } };
893
914
  let response;
894
915
  try {
@@ -920,7 +941,7 @@ const setSessionLong = async (req, res, name, num) => {
920
941
  checkNotNull(num, 'Number');
921
942
  // vte.cxへリクエスト
922
943
  const method = 'PUT';
923
- const url = `/p/?_sessionlong=${name}`;
944
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionlong=${name}`;
924
945
  const feed = { feed: { 'title': String(num) } };
925
946
  let response;
926
947
  try {
@@ -952,7 +973,7 @@ const incrementSession = async (req, res, name, num) => {
952
973
  checkNotNull(num, 'Number');
953
974
  // vte.cxへリクエスト
954
975
  const method = 'PUT';
955
- const url = `/p/?_sessionincr=${name}&_num=${num}`;
976
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionincr=${name}&_num=${num}`;
956
977
  let response;
957
978
  try {
958
979
  response = await requestVtecx(method, url, req);
@@ -983,7 +1004,7 @@ const deleteSessionFeed = async (req, res, name) => {
983
1004
  checkNotNull(name, 'Name');
984
1005
  // vte.cxへリクエスト
985
1006
  const method = 'DELETE';
986
- const url = `/p/?_sessionfeed=${name}`;
1007
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionfeed=${name}`;
987
1008
  let response;
988
1009
  try {
989
1010
  response = await requestVtecx(method, url, req);
@@ -1012,7 +1033,7 @@ const deleteSessionEntry = async (req, res, name) => {
1012
1033
  checkNotNull(name, 'Name');
1013
1034
  // vte.cxへリクエスト
1014
1035
  const method = 'DELETE';
1015
- const url = `/p/?_sessionentry=${name}`;
1036
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionentry=${name}`;
1016
1037
  let response;
1017
1038
  try {
1018
1039
  response = await requestVtecx(method, url, req);
@@ -1041,7 +1062,7 @@ const deleteSessionString = async (req, res, name) => {
1041
1062
  checkNotNull(name, 'Name');
1042
1063
  // vte.cxへリクエスト
1043
1064
  const method = 'DELETE';
1044
- const url = `/p/?_sessionstring=${name}`;
1065
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionstring=${name}`;
1045
1066
  let response;
1046
1067
  try {
1047
1068
  response = await requestVtecx(method, url, req);
@@ -1070,7 +1091,7 @@ const deleteSessionLong = async (req, res, name) => {
1070
1091
  checkNotNull(name, 'Name');
1071
1092
  // vte.cxへリクエスト
1072
1093
  const method = 'DELETE';
1073
- const url = `/p/?_sessionlong=${name}`;
1094
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionlong=${name}`;
1074
1095
  let response;
1075
1096
  try {
1076
1097
  response = await requestVtecx(method, url, req);
@@ -1099,7 +1120,7 @@ const getSessionFeed = async (req, res, name) => {
1099
1120
  checkNotNull(name, 'Name');
1100
1121
  // vte.cxへリクエスト
1101
1122
  const method = 'GET';
1102
- const url = `/p/?_sessionfeed=${name}`;
1123
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionfeed=${name}`;
1103
1124
  let response;
1104
1125
  try {
1105
1126
  response = await requestVtecx(method, url, req);
@@ -1129,7 +1150,7 @@ const getSessionEntry = async (req, res, name) => {
1129
1150
  checkNotNull(name, 'Name');
1130
1151
  // vte.cxへリクエスト
1131
1152
  const method = 'GET';
1132
- const url = `/p/?_sessionentry=${name}`;
1153
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionentry=${name}`;
1133
1154
  let response;
1134
1155
  try {
1135
1156
  response = await requestVtecx(method, url, req);
@@ -1159,7 +1180,7 @@ const getSessionString = async (req, res, name) => {
1159
1180
  checkNotNull(name, 'Name');
1160
1181
  // vte.cxへリクエスト
1161
1182
  const method = 'GET';
1162
- const url = `/p/?_sessionstring=${name}`;
1183
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionstring=${name}`;
1163
1184
  let response;
1164
1185
  try {
1165
1186
  response = await requestVtecx(method, url, req);
@@ -1195,7 +1216,7 @@ const getSessionLong = async (req, res, name) => {
1195
1216
  checkNotNull(name, 'Name');
1196
1217
  // vte.cxへリクエスト
1197
1218
  const method = 'GET';
1198
- const url = `/p/?_sessionlong=${name}`;
1219
+ const url = `${SERVLETPATH_PROVIDER}/?_sessionlong=${name}`;
1199
1220
  let response;
1200
1221
  try {
1201
1222
  response = await requestVtecx(method, url, req);
@@ -1232,7 +1253,7 @@ const pagination = async (req, res, uri, pagerange, targetService) => {
1232
1253
  checkUri(uri);
1233
1254
  // vte.cxへリクエスト
1234
1255
  const method = 'GET';
1235
- const url = `/p${uri}${uri.includes('?') ? '&' : '?'}_pagination=${pagerange}`;
1256
+ const url = `${SERVLETPATH_PROVIDER}${uri}${uri.includes('?') ? '&' : '?'}_pagination=${pagerange}`;
1236
1257
  let response;
1237
1258
  try {
1238
1259
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -1264,7 +1285,7 @@ const getPage = async (req, res, uri, num, targetService) => {
1264
1285
  checkNotNull(num, 'page number');
1265
1286
  // vte.cxへリクエスト
1266
1287
  const method = 'GET';
1267
- const url = `/p${uri}${uri.includes('?') ? '&' : '?'}n=${num}`;
1288
+ const url = `${SERVLETPATH_PROVIDER}${uri}${uri.includes('?') ? '&' : '?'}n=${num}`;
1268
1289
  let response;
1269
1290
  try {
1270
1291
  response = await requestVtecx(method, url, req, null, null, targetService);
@@ -1303,7 +1324,7 @@ const postBQ = async (req, res, feed, async, tablenames) => {
1303
1324
  }
1304
1325
  // vte.cxへリクエスト
1305
1326
  const method = 'POST';
1306
- const url = `/p/?_bq${async ? '&_async' : ''}`;
1327
+ const url = `${SERVLETPATH_PROVIDER}/?_bq${async ? '&_async' : ''}`;
1307
1328
  let response;
1308
1329
  try {
1309
1330
  response = await requestVtecx(method, url, req, JSON.stringify(reqFeed));
@@ -1350,7 +1371,7 @@ const deleteBQ = async (req, res, keys, async, tablenames) => {
1350
1371
  //console.log(`[vtecxnext deleteBQ] feed=${feed}`)
1351
1372
  // vte.cxへリクエスト
1352
1373
  const method = 'DELETE';
1353
- const url = `/p/?_bq${async ? '&_async' : ''}`;
1374
+ const url = `${SERVLETPATH_PROVIDER}/?_bq${async ? '&_async' : ''}`;
1354
1375
  let response;
1355
1376
  try {
1356
1377
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -1383,7 +1404,7 @@ const getBQ = async (req, res, sql, values, parent) => {
1383
1404
  const feed = editGetBqArgument(sql, values, parent);
1384
1405
  // vte.cxへリクエスト
1385
1406
  const method = 'PUT';
1386
- const url = `/p/?_querybq`;
1407
+ const url = `${SERVLETPATH_PROVIDER}/?_querybq`;
1387
1408
  let response;
1388
1409
  try {
1389
1410
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -1420,7 +1441,7 @@ const getBQCsv = async (req, res, sql, values, filename, parent) => {
1420
1441
  const feed = editGetBqArgument(sql, values, parent);
1421
1442
  // vte.cxへリクエスト
1422
1443
  const method = 'PUT';
1423
- const url = `/p/?_querybq&_csv${filename ? '=' + filename : ''}`;
1444
+ const url = `${SERVLETPATH_PROVIDER}/?_querybq&_csv${filename ? '=' + filename : ''}`;
1424
1445
  let response;
1425
1446
  try {
1426
1447
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -1458,7 +1479,7 @@ const toPdf = async (req, res, htmlTemplate, filename) => {
1458
1479
  checkNotNull(htmlTemplate, 'PDF template');
1459
1480
  // vte.cxへリクエスト
1460
1481
  const method = 'PUT';
1461
- const url = `/p/?_pdf${filename ? '=' + filename : ''}`;
1482
+ const url = `${SERVLETPATH_PROVIDER}/?_pdf${filename ? '=' + filename : ''}`;
1462
1483
  let response;
1463
1484
  try {
1464
1485
  response = await requestVtecx(method, url, req, htmlTemplate);
@@ -1495,7 +1516,7 @@ const putSignature = async (req, res, uri, revision) => {
1495
1516
  checkUri(uri);
1496
1517
  // vte.cxへリクエスト
1497
1518
  const method = 'PUT';
1498
- const url = `/p${uri}?_signature${revision ? '&r=' + revision : ''}`;
1519
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_signature${revision ? '&r=' + revision : ''}`;
1499
1520
  let response;
1500
1521
  try {
1501
1522
  response = await requestVtecx(method, url, req);
@@ -1525,7 +1546,7 @@ const putSignatures = async (req, res, feed) => {
1525
1546
  checkNotNull(feed, 'Feed');
1526
1547
  // vte.cxへリクエスト
1527
1548
  const method = 'PUT';
1528
- const url = `/p/?_signature`;
1549
+ const url = `${SERVLETPATH_PROVIDER}/?_signature`;
1529
1550
  let response;
1530
1551
  try {
1531
1552
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -1556,7 +1577,7 @@ const deleteSignature = async (req, res, uri, revision) => {
1556
1577
  checkUri(uri);
1557
1578
  // vte.cxへリクエスト
1558
1579
  const method = 'DELETE';
1559
- const url = `/p${uri}?_signature${revision ? '&r=' + revision : ''}`;
1580
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_signature${revision ? '&r=' + revision : ''}`;
1560
1581
  let response;
1561
1582
  try {
1562
1583
  response = await requestVtecx(method, url, req);
@@ -1585,7 +1606,7 @@ const checkSignature = async (req, res, uri) => {
1585
1606
  checkUri(uri);
1586
1607
  // vte.cxへリクエスト
1587
1608
  const method = 'GET';
1588
- const url = `/p${uri}?_signature`;
1609
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_signature`;
1589
1610
  let response;
1590
1611
  try {
1591
1612
  response = await requestVtecx(method, url, req);
@@ -1646,7 +1667,7 @@ const sendMail = async (req, res, entry, to, cc, bcc, attachments) => {
1646
1667
  //console.log(`[vtecxnext sendMail] feed = ${JSON.stringify(feed)}`)
1647
1668
  // vte.cxへリクエスト
1648
1669
  const method = 'POST';
1649
- const url = `/p/?_sendmail`;
1670
+ const url = `${SERVLETPATH_PROVIDER}/?_sendmail`;
1650
1671
  let response;
1651
1672
  try {
1652
1673
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -1716,7 +1737,7 @@ const pushNotification = async (req, res, message, to, title, subtitle, imageUrl
1716
1737
  //console.log(`[vtecxnext pushNotification] feed = ${JSON.stringify(feed)}`)
1717
1738
  // vte.cxへリクエスト
1718
1739
  const method = 'POST';
1719
- const url = `/p/?_pushnotification`;
1740
+ const url = `${SERVLETPATH_PROVIDER}/?_pushnotification`;
1720
1741
  let response;
1721
1742
  try {
1722
1743
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -1745,7 +1766,7 @@ const setMessageQueueStatus = async (req, res, flag, channel) => {
1745
1766
  checkUri(channel);
1746
1767
  // vte.cxへリクエスト
1747
1768
  const method = 'PUT';
1748
- const url = `/p${channel}?_mqstatus=${flag ? 'true' : 'false'}`;
1769
+ const url = `${SERVLETPATH_PROVIDER}${channel}?_mqstatus=${flag ? 'true' : 'false'}`;
1749
1770
  let response;
1750
1771
  try {
1751
1772
  response = await requestVtecx(method, url, req);
@@ -1776,7 +1797,7 @@ const setMessageQueue = async (req, res, feed, channel) => {
1776
1797
  checkNotNull(feed, 'Feed');
1777
1798
  // vte.cxへリクエスト
1778
1799
  const method = 'POST';
1779
- const url = `/p${channel}?_mq`;
1800
+ const url = `${SERVLETPATH_PROVIDER}${channel}?_mq`;
1780
1801
  let response;
1781
1802
  try {
1782
1803
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -1805,7 +1826,7 @@ const getMessageQueue = async (req, res, channel) => {
1805
1826
  checkUri(channel);
1806
1827
  // vte.cxへリクエスト
1807
1828
  const method = 'GET';
1808
- const url = `/p${channel}?_mq`;
1829
+ const url = `${SERVLETPATH_PROVIDER}${channel}?_mq`;
1809
1830
  let response;
1810
1831
  try {
1811
1832
  response = await requestVtecx(method, url, req);
@@ -1837,7 +1858,7 @@ const joinGroup = async (req, res, group, selfid) => {
1837
1858
  checkNotNull(selfid, 'selfid (hierarchical name under my group alias)');
1838
1859
  // vte.cxへリクエスト
1839
1860
  const method = 'PUT';
1840
- const url = `/p${group}?_joingroup&_selfid=${selfid}`;
1861
+ const url = `${SERVLETPATH_PROVIDER}${group}?_joingroup&_selfid=${selfid}`;
1841
1862
  let response;
1842
1863
  try {
1843
1864
  response = await requestVtecx(method, url, req);
@@ -1867,7 +1888,7 @@ const leaveGroup = async (req, res, group) => {
1867
1888
  checkUri(group);
1868
1889
  // vte.cxへリクエスト
1869
1890
  const method = 'DELETE';
1870
- const url = `/p${group}?_leavegroup`;
1891
+ const url = `${SERVLETPATH_PROVIDER}${group}?_leavegroup`;
1871
1892
  let response;
1872
1893
  try {
1873
1894
  response = await requestVtecx(method, url, req);
@@ -1898,7 +1919,7 @@ const noGroupMember = async (req, res, uri) => {
1898
1919
  checkUri(uri);
1899
1920
  // vte.cxへリクエスト
1900
1921
  const method = 'GET';
1901
- const url = `/d${uri}?_no_group_member`;
1922
+ const url = `${SERVLETPATH_DATA}${uri}?_no_group_member`;
1902
1923
  let response;
1903
1924
  try {
1904
1925
  response = await requestVtecx(method, url, req);
@@ -1926,7 +1947,7 @@ const getGroups = async (req, res) => {
1926
1947
  //console.log('[vtecxnext getGroups] start.')
1927
1948
  // vte.cxへリクエスト
1928
1949
  const method = 'GET';
1929
- const url = `/d/?_group`;
1950
+ const url = `${SERVLETPATH_DATA}/?_group`;
1930
1951
  let response;
1931
1952
  try {
1932
1953
  response = await requestVtecx(method, url, req);
@@ -1956,7 +1977,7 @@ const isGroupMember = async (req, res, uri) => {
1956
1977
  checkUri(uri);
1957
1978
  // vte.cxへリクエスト
1958
1979
  const method = 'GET';
1959
- const url = `/d${uri}?_is_group_member`;
1980
+ const url = `${SERVLETPATH_DATA}${uri}?_is_group_member`;
1960
1981
  let response;
1961
1982
  try {
1962
1983
  response = await requestVtecx(method, url, req);
@@ -1999,7 +2020,7 @@ const adduser = async (req, res, feed, reCaptchaToken) => {
1999
2020
  // vte.cxへリクエスト
2000
2021
  const method = 'POST';
2001
2022
  const param = reCaptchaToken ? `&g-recaptcha-token=${reCaptchaToken}` : '';
2002
- const url = `/d/?_adduser${param}`;
2023
+ const url = `${SERVLETPATH_DATA}/?_adduser${param}`;
2003
2024
  let response;
2004
2025
  try {
2005
2026
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2029,7 +2050,7 @@ const adduserByAdmin = async (req, res, feed) => {
2029
2050
  checkNotNull(feed, 'Feed');
2030
2051
  // vte.cxへリクエスト
2031
2052
  const method = 'POST';
2032
- const url = `/d/?_adduserByAdmin`;
2053
+ const url = `${SERVLETPATH_DATA}/?_adduserByAdmin`;
2033
2054
  let response;
2034
2055
  try {
2035
2056
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2060,7 +2081,7 @@ const passreset = async (req, res, feed, reCaptchaToken) => {
2060
2081
  // vte.cxへリクエスト
2061
2082
  const method = 'POST';
2062
2083
  const param = reCaptchaToken ? `&g-recaptcha-token=${reCaptchaToken}` : '';
2063
- const url = `/d/?_passreset${param}`;
2084
+ const url = `${SERVLETPATH_DATA}/?_passreset${param}`;
2064
2085
  let response;
2065
2086
  try {
2066
2087
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2089,7 +2110,7 @@ const changepass = async (req, res, feed) => {
2089
2110
  checkNotNull(feed, 'Feed');
2090
2111
  // vte.cxへリクエスト
2091
2112
  const method = 'PUT';
2092
- const url = `/d/?_changephash`;
2113
+ const url = `${SERVLETPATH_DATA}/?_changephash`;
2093
2114
  let response;
2094
2115
  try {
2095
2116
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2118,7 +2139,7 @@ const changepassByAdmin = async (req, res, feed) => {
2118
2139
  checkNotNull(feed, 'Feed');
2119
2140
  // vte.cxへリクエスト
2120
2141
  const method = 'PUT';
2121
- const url = `/d/?_changephashByAdmin`;
2142
+ const url = `${SERVLETPATH_DATA}/?_changephashByAdmin`;
2122
2143
  let response;
2123
2144
  try {
2124
2145
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2147,7 +2168,7 @@ const changeaccount = async (req, res, feed) => {
2147
2168
  checkNotNull(feed, 'Feed');
2148
2169
  // vte.cxへリクエスト
2149
2170
  const method = 'PUT';
2150
- const url = `/d/?_changeaccount`;
2171
+ const url = `${SERVLETPATH_DATA}/?_changeaccount`;
2151
2172
  let response;
2152
2173
  try {
2153
2174
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2176,7 +2197,7 @@ const changeaccount_verify = async (req, res, verifyCode) => {
2176
2197
  checkNotNull(verifyCode, 'verify code');
2177
2198
  // vte.cxへリクエスト
2178
2199
  const method = 'PUT';
2179
- const url = `/d/?_changeaccount_verify=${verifyCode}`;
2200
+ const url = `${SERVLETPATH_DATA}/?_changeaccount_verify=${verifyCode}`;
2180
2201
  let response;
2181
2202
  try {
2182
2203
  response = await requestVtecx(method, url, req);
@@ -2204,7 +2225,7 @@ const userstatus = async (req, res, account) => {
2204
2225
  //console.log('[vtecxnext userstatus] start.')
2205
2226
  // vte.cxへリクエスト
2206
2227
  const method = 'GET';
2207
- const url = `/d/?_userstatus${account ? '=' + account : ''}`;
2228
+ const url = `${SERVLETPATH_DATA}/?_userstatus${account ? '=' + account : ''}`;
2208
2229
  let response;
2209
2230
  try {
2210
2231
  response = await requestVtecx(method, url, req);
@@ -2234,7 +2255,7 @@ const revokeuser = async (req, res, account) => {
2234
2255
  checkNotNull(account, 'account');
2235
2256
  // vte.cxへリクエスト
2236
2257
  const method = 'PUT';
2237
- const url = `/d/?_revokeuser=${account}`;
2258
+ const url = `${SERVLETPATH_DATA}/?_revokeuser=${account}`;
2238
2259
  let response;
2239
2260
  try {
2240
2261
  response = await requestVtecx(method, url, req);
@@ -2264,7 +2285,7 @@ const revokeusers = async (req, res, feed) => {
2264
2285
  checkNotNull(feed, 'Feed');
2265
2286
  // vte.cxへリクエスト
2266
2287
  const method = 'PUT';
2267
- const url = `/d/?_revokeuser`;
2288
+ const url = `${SERVLETPATH_DATA}/?_revokeuser`;
2268
2289
  let response;
2269
2290
  try {
2270
2291
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2293,7 +2314,7 @@ const activateuser = async (req, res, account) => {
2293
2314
  checkNotNull(account, 'account');
2294
2315
  // vte.cxへリクエスト
2295
2316
  const method = 'PUT';
2296
- const url = `/d/?_activateuser=${account}`;
2317
+ const url = `${SERVLETPATH_DATA}/?_activateuser=${account}`;
2297
2318
  let response;
2298
2319
  try {
2299
2320
  response = await requestVtecx(method, url, req);
@@ -2323,7 +2344,7 @@ const activateusers = async (req, res, feed) => {
2323
2344
  checkNotNull(feed, 'Feed');
2324
2345
  // vte.cxへリクエスト
2325
2346
  const method = 'PUT';
2326
- const url = `/d/?_activateuser`;
2347
+ const url = `${SERVLETPATH_DATA}/?_activateuser`;
2327
2348
  let response;
2328
2349
  try {
2329
2350
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2350,7 +2371,7 @@ const canceluser = async (req, res) => {
2350
2371
  //console.log('[vtecxnext canceluser] start.')
2351
2372
  // vte.cxへリクエスト
2352
2373
  const method = 'DELETE';
2353
- const url = `/d/?_canceluser`;
2374
+ const url = `${SERVLETPATH_DATA}/?_canceluser`;
2354
2375
  let response;
2355
2376
  try {
2356
2377
  response = await requestVtecx(method, url, req);
@@ -2380,7 +2401,7 @@ const deleteuser = async (req, res, account) => {
2380
2401
  checkNotNull(account, 'account');
2381
2402
  // vte.cxへリクエスト
2382
2403
  const method = 'DELETE';
2383
- const url = `/d/?_deleteuser=${account}`;
2404
+ const url = `${SERVLETPATH_DATA}/?_deleteuser=${account}`;
2384
2405
  let response;
2385
2406
  try {
2386
2407
  response = await requestVtecx(method, url, req);
@@ -2410,7 +2431,7 @@ const deleteusers = async (req, res, feed) => {
2410
2431
  checkNotNull(feed, 'Feed');
2411
2432
  // vte.cxへリクエスト
2412
2433
  const method = 'DELETE';
2413
- const url = `/d/?_deleteuser`;
2434
+ const url = `${SERVLETPATH_DATA}/?_deleteuser`;
2414
2435
  let response;
2415
2436
  try {
2416
2437
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2469,7 +2490,7 @@ const savefiles = async (req, res, uri) => {
2469
2490
  // vte.cxへリクエスト
2470
2491
  const method = 'PUT';
2471
2492
  const contentUri = `${uri}${uri.endsWith('/') ? '' : '/'}${formidableFile.field}`;
2472
- const url = `/p${contentUri}?_content`;
2493
+ const url = `${SERVLETPATH_PROVIDER}${contentUri}?_content`;
2473
2494
  const headers = { 'Content-Type': formidableFile.file.mimetype };
2474
2495
  //console.log(`[vtecxnext savefiles] request. url=${url}`)
2475
2496
  const promiseResponse = requestVtecx(method, url, req, fileBuffer, headers);
@@ -2504,7 +2525,7 @@ const savefiles = async (req, res, uri) => {
2504
2525
 
2505
2526
  // vte.cxへリクエスト
2506
2527
  const method = 'POST'
2507
- const url = `/p${uri}?_content`
2528
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_content`
2508
2529
  //console.log(`[vtecxnext savefiles] request. url=${url}`)
2509
2530
  const response = await requestVtecx(method, url, req, formData)
2510
2531
  //console.log(`[vtecxnext savefiles] response. status=${response.status}`)
@@ -2529,7 +2550,7 @@ const putcontent = async (req, res, uri) => {
2529
2550
  checkUri(uri);
2530
2551
  // vte.cxへリクエスト
2531
2552
  const method = 'PUT';
2532
- const url = `/p${uri}?_content`;
2553
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_content`;
2533
2554
  //const headers = {'Content-Type' : req.headers['content-type'], 'Content-Length' : req.headers['content-length']}
2534
2555
  const headers = { 'Content-Type': req.headers['content-type'] };
2535
2556
  const buf = await (0, exports.buffer)(req);
@@ -2561,7 +2582,7 @@ const deletecontent = async (req, res, uri) => {
2561
2582
  checkUri(uri);
2562
2583
  // vte.cxへリクエスト
2563
2584
  const method = 'DELETE';
2564
- const url = `/p${uri}?_content`;
2585
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_content`;
2565
2586
  let response;
2566
2587
  try {
2567
2588
  response = await requestVtecx(method, url, req);
@@ -2591,7 +2612,7 @@ const getcontent = async (req, res, uri) => {
2591
2612
  checkUri(uri);
2592
2613
  // vte.cxへリクエスト
2593
2614
  const method = 'GET';
2594
- const url = `/p${uri}?_content`;
2615
+ const url = `${SERVLETPATH_PROVIDER}${uri}?_content`;
2595
2616
  let response;
2596
2617
  try {
2597
2618
  response = await requestVtecx(method, url, req);
@@ -2633,7 +2654,7 @@ const addacl = async (req, res, feed) => {
2633
2654
  checkNotNull(feed, 'Feed');
2634
2655
  // vte.cxへリクエスト
2635
2656
  const method = 'PUT';
2636
- const url = `/d/?_addacl`;
2657
+ const url = `${SERVLETPATH_DATA}/?_addacl`;
2637
2658
  let response;
2638
2659
  try {
2639
2660
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2663,7 +2684,7 @@ const removeacl = async (req, res, feed) => {
2663
2684
  checkNotNull(feed, 'Feed');
2664
2685
  // vte.cxへリクエスト
2665
2686
  const method = 'PUT';
2666
- const url = `/d/?_removeacl`;
2687
+ const url = `${SERVLETPATH_DATA}/?_removeacl`;
2667
2688
  let response;
2668
2689
  try {
2669
2690
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2693,7 +2714,7 @@ const addalias = async (req, res, feed) => {
2693
2714
  checkNotNull(feed, 'Feed');
2694
2715
  // vte.cxへリクエスト
2695
2716
  const method = 'PUT';
2696
- const url = `/d/?_addalias`;
2717
+ const url = `${SERVLETPATH_DATA}/?_addalias`;
2697
2718
  let response;
2698
2719
  try {
2699
2720
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2723,7 +2744,7 @@ const removealias = async (req, res, feed) => {
2723
2744
  checkNotNull(feed, 'Feed');
2724
2745
  // vte.cxへリクエスト
2725
2746
  const method = 'PUT';
2726
- const url = `/d/?_removealias`;
2747
+ const url = `${SERVLETPATH_DATA}/?_removealias`;
2727
2748
  let response;
2728
2749
  try {
2729
2750
  response = await requestVtecx(method, url, req, JSON.stringify(feed));
@@ -2781,6 +2802,120 @@ const buffer = async (readable) => {
2781
2802
  return Buffer.concat(chunks);
2782
2803
  };
2783
2804
  exports.buffer = buffer;
2805
+ /**
2806
+ * get TOTP link
2807
+ * @param req request (for authentication)
2808
+ * @param res response (for authentication)
2809
+ * @param chs length of one side of QR code
2810
+ * @return QR code URL in feed.title
2811
+ */
2812
+ const getTotpLink = async (req, res, chs) => {
2813
+ //console.log('[vtecxnext getTotpLink] start.')
2814
+ // vte.cxへリクエスト
2815
+ const method = 'POST';
2816
+ const url = `${SERVLETPATH_DATA}/?_createtotp${chs ? '&_chs=' + String(chs) : ''}`;
2817
+ let response;
2818
+ try {
2819
+ response = await requestVtecx(method, url, req);
2820
+ }
2821
+ catch (e) {
2822
+ throw newFetchError(e, true);
2823
+ }
2824
+ //console.log(`[vtecxnext getTotpLink] response=${response}`)
2825
+ // vte.cxからのset-cookieを転記
2826
+ setCookie(response, res);
2827
+ // レスポンスのエラーチェック
2828
+ await checkVtecxResponse(response);
2829
+ // 戻り値
2830
+ return await getJson(response);
2831
+ };
2832
+ exports.getTotpLink = getTotpLink;
2833
+ /**
2834
+ * create TOTP
2835
+ * @param req request (for authentication)
2836
+ * @param res response (for authentication)
2837
+ * @param feed one-time password for feed.title when you do book registration
2838
+ * @return message
2839
+ */
2840
+ const createTotp = async (req, res, feed) => {
2841
+ //console.log('[vtecxnext createTotp] start.')
2842
+ // 入力チェック
2843
+ checkNotNull(feed, 'Feed');
2844
+ // vte.cxへリクエスト
2845
+ const method = 'POST';
2846
+ const url = `${SERVLETPATH_DATA}/?_createtotp`;
2847
+ let response;
2848
+ try {
2849
+ response = await requestVtecx(method, url, req, JSON.stringify(feed));
2850
+ }
2851
+ catch (e) {
2852
+ throw newFetchError(e, true);
2853
+ }
2854
+ //console.log(`[vtecxnext createTotp] response=${response}`)
2855
+ // vte.cxからのset-cookieを転記
2856
+ setCookie(response, res);
2857
+ // レスポンスのエラーチェック
2858
+ await checkVtecxResponse(response);
2859
+ // 戻り値
2860
+ return await getJson(response);
2861
+ };
2862
+ exports.createTotp = createTotp;
2863
+ /**
2864
+ * delete TOTP
2865
+ * @param req request (for authentication)
2866
+ * @param res response (for authentication)
2867
+ * @param account target account (for service admin user)
2868
+ * @return message
2869
+ */
2870
+ const deleteTotp = async (req, res, account) => {
2871
+ //console.log('[vtecxnext deleteTotp] start.')
2872
+ // vte.cxへリクエスト
2873
+ const method = 'DELETE';
2874
+ const url = `${SERVLETPATH_DATA}/?_deletetotp${account ? '=' + account : ''}`;
2875
+ let response;
2876
+ try {
2877
+ response = await requestVtecx(method, url, req);
2878
+ }
2879
+ catch (e) {
2880
+ throw newFetchError(e, true);
2881
+ }
2882
+ //console.log(`[vtecxnext deleteTotp] response=${response}`)
2883
+ // vte.cxからのset-cookieを転記
2884
+ setCookie(response, res);
2885
+ // レスポンスのエラーチェック
2886
+ await checkVtecxResponse(response);
2887
+ // 戻り値
2888
+ return await getJson(response);
2889
+ };
2890
+ exports.deleteTotp = deleteTotp;
2891
+ /**
2892
+ * change TDID (Trusted device ID)
2893
+ * @param req request (for authentication)
2894
+ * @param res response (for authentication)
2895
+ * @param account target account (for service admin user)
2896
+ * @return message
2897
+ */
2898
+ const changeTdid = async (req, res) => {
2899
+ //console.log('[vtecxnext changeTdid] start.')
2900
+ // vte.cxへリクエスト
2901
+ const method = 'PUT';
2902
+ const url = `${SERVLETPATH_DATA}/?_changetdid`;
2903
+ let response;
2904
+ try {
2905
+ response = await requestVtecx(method, url, req);
2906
+ }
2907
+ catch (e) {
2908
+ throw newFetchError(e, true);
2909
+ }
2910
+ //console.log(`[vtecxnext changeTdid] response=${response}`)
2911
+ // vte.cxからのset-cookieを転記
2912
+ setCookie(response, res);
2913
+ // レスポンスのエラーチェック
2914
+ await checkVtecxResponse(response);
2915
+ // 戻り値
2916
+ return await getJson(response);
2917
+ };
2918
+ exports.changeTdid = changeTdid;
2784
2919
  //---------------------------------------------
2785
2920
  /**
2786
2921
  * Error returned from vte.cx
@@ -2853,9 +2988,23 @@ const fetchVtecx = async (method, url, headers, body, mode) => {
2853
2988
  //console.log(`[vtecxnext fetchVtecx] url=${process.env.VTECX_URL}${url}`)
2854
2989
  headers['X-Requested-With'] = 'XMLHttpRequest';
2855
2990
  const apiKey = process.env.VTECX_APIKEY;
2856
- if (apiKey) {
2857
- headers['Authorization'] = `APIKey ${apiKey}`;
2991
+ if (apiKey && !url.startsWith(SERVLETPATH_DATA)) {
2992
+ //headers['Authorization'] = `APIKey ${apiKey}`
2993
+ const apiKeyVal = `APIKey ${apiKey}`;
2994
+ if (headers.Authorization) {
2995
+ if (Array.isArray(headers.Authorization)) {
2996
+ headers.Authorization.push(apiKeyVal);
2997
+ }
2998
+ else {
2999
+ const tmp = headers.Authorization;
3000
+ headers.Authorization = [tmp, apiKeyVal];
3001
+ }
3002
+ }
3003
+ else {
3004
+ headers.Authorization = apiKeyVal;
3005
+ }
2858
3006
  }
3007
+ //console.log(`[vtecxnext fetchVtecx] headers = ${JSON.stringify(headers)}`)
2859
3008
  const requestInit = {
2860
3009
  body: body,
2861
3010
  method: method,
@@ -2877,7 +3026,7 @@ const newFetchError = (e, isVtecx) => {
2877
3026
  else {
2878
3027
  errMsg = `Unexpected error.`;
2879
3028
  }
2880
- console.log(`[vtecxnext fetchProc] errMsg = ${errMsg}`);
3029
+ //console.log(`[vtecxnext fetchProc] errMsg = ${errMsg}`)
2881
3030
  return new FetchError(errMsg);
2882
3031
  };
2883
3032
  /**
@@ -2896,10 +3045,50 @@ const fetchProc = (url, requestInit) => {
2896
3045
  * @param res ブラウザへのレスポンス
2897
3046
  */
2898
3047
  const setCookie = (response, res) => {
2899
- const setCookieVal = response.headers.get('set-cookie');
3048
+ // 各レスポンスヘッダーについて、ヘッダー名をキーとする配列をログ出力します。
3049
+ let setCookieVal = response.headers.get('set-cookie');
2900
3050
  if (setCookieVal === '' || setCookieVal) {
2901
- res.setHeader('set-cookie', setCookieVal);
3051
+ //console.log(`[vtecxnext setCookie] value : ${setCookieVal}`)
3052
+ //res.setHeader('set-cookie', setCookieVal)
3053
+ const setCookieVals = splitCookieValue(setCookieVal);
3054
+ res.setHeader('set-cookie', setCookieVals);
3055
+ /*
3056
+ for (const val of setCookieVals) {
3057
+ res.setHeader('set-cookie', val)
3058
+ }
3059
+ */
3060
+ }
3061
+ };
3062
+ /**
3063
+ * 複数のset-cookieの値を分割。
3064
+ * fetchで受け取った際カンマ区切りで繋げられており、
3065
+ * これをそのままset-cookieにセットするとブラウザでは2項目目以降が適用されないため。
3066
+ * @param val set-cookieの値
3067
+ * @returns 分割したset-cookieの値
3068
+ */
3069
+ const splitCookieValue = (val) => {
3070
+ //console.log(`[vtecxnext splitCookieValue] start. val = ${val}`)
3071
+ const ret = [];
3072
+ if (val) {
3073
+ const parts = val.split(', ');
3074
+ let tmp = '';
3075
+ for (const part of parts) {
3076
+ tmp += part;
3077
+ // ; Expires=Thu, 09-Mar-2023 06:55:48 GMT 等のカンマは区切りとしない。
3078
+ if (part.match('^.*; Expires=...$')) {
3079
+ // 続きあり
3080
+ }
3081
+ else {
3082
+ ret.push(tmp);
3083
+ tmp = '';
3084
+ }
3085
+ }
3086
+ if (tmp) {
3087
+ ret.push(tmp);
3088
+ }
2902
3089
  }
3090
+ //console.log(`[vtecxnext splitCookieValue] return : ${JSON.stringify(ret)}`)
3091
+ return ret;
2903
3092
  };
2904
3093
  /**
2905
3094
  * vte.cxからのallow-originを、ブラウザへレスポンスする。
@@ -2942,7 +3131,7 @@ const setResponseHeaders = (response, res) => {
2942
3131
  * @returns 戻り値はなし。エラーの場合VtecxNextErrorをスロー。
2943
3132
  */
2944
3133
  const checkVtecxResponse = async (response) => {
2945
- if (response.status < 400) {
3134
+ if (response.status < 400 && response.status !== 203) {
2946
3135
  return;
2947
3136
  }
2948
3137
  else {
@@ -2998,6 +3187,7 @@ const getJson = async (response) => {
2998
3187
  catch (e) {
2999
3188
  let errMsg;
3000
3189
  if (e instanceof Error) {
3190
+ //console.log(`[vtecxnext getJson] Error occured. ${e.name}: ${e.message}`)
3001
3191
  errMsg = `JsonError: ${e.message}`;
3002
3192
  }
3003
3193
  else {
@@ -3090,7 +3280,7 @@ const oauth = async (req, res, provider, oauthUrl) => {
3090
3280
  checkNotNull(provider, 'OAuth provider');
3091
3281
  // vte.cxへリクエスト (state取得)
3092
3282
  const method = 'POST';
3093
- const url = `/o/${provider}/create_state`;
3283
+ const url = `${SERVLETPATH_OAUTH}/${provider}/create_state`;
3094
3284
  let response;
3095
3285
  try {
3096
3286
  response = await requestVtecx(method, url, req);
@@ -3146,7 +3336,7 @@ const oauthGetAccesstoken = async (req, res, provider, accesstokenUrl) => {
3146
3336
  }
3147
3337
  // vte.cxへリクエスト (stateチェック)
3148
3338
  const vtecxMethod = 'POST';
3149
- const vtecxUrl = `/o/${provider}/check_state?state=${state}`;
3339
+ const vtecxUrl = `${SERVLETPATH_OAUTH}/${provider}/check_state?state=${state}`;
3150
3340
  //console.log(`[vtecxnext oauthGetAccesstoken] vtecxUrl=${vtecxUrl}`)
3151
3341
  let vtecxResponse;
3152
3342
  try {
@@ -3273,7 +3463,7 @@ const oauthLink = async (req, res, provider, userInfo) => {
3273
3463
  //const param = reCaptchaToken ? `&g-recaptcha-token=${reCaptchaToken}` : ''
3274
3464
  const param = '';
3275
3465
  const method = 'POST';
3276
- const url = `/o/${provider}/link?state=${userInfo.state}${param}`;
3466
+ const url = `${SERVLETPATH_OAUTH}/${provider}/link?state=${userInfo.state}${param}`;
3277
3467
  const reqFeed = [{ 'title': userInfo.guid, 'subtitle': userInfo.nickname }];
3278
3468
  let response;
3279
3469
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vtecx/vtecxnext",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "vte.cx Next.js api",
5
5
  "main": "dist/index.js",
6
6
  "files": [