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