w-web-sso 1.1.12 → 1.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +16 -0
  2. package/dist/css/{app.b17b0ba0.css → app.f000459f.css} +1 -1
  3. package/dist/index.tmp +1 -1
  4. package/dist/js/{app-legacy.bee6840f.js → app-legacy.7c006893.js} +1 -1
  5. package/dist/js/{app.bee6840f.js → app.7c006893.js} +1 -1
  6. package/dist/js/{chunk-vendors.0492b6f5.js → chunk-vendors-legacy.97013ddc.js} +5 -5
  7. package/dist/js/{chunk-vendors-legacy.0492b6f5.js → chunk-vendors.97013ddc.js} +5 -5
  8. package/dist/w-web-sso.umd.js +4 -4
  9. package/dist/w-web-sso.umd.js.map +1 -1
  10. package/docs/WWebSso.html +1 -1
  11. package/docs/global.html +1 -1
  12. package/docs/index.html +1 -1
  13. package/docs/server_WWebSso.mjs.html +16 -10
  14. package/docs/server_getIgnoredOrmKeys.mjs.html +1 -1
  15. package/docs/server_lockSave.mjs.html +1 -1
  16. package/docs/server_ormWrite.mjs.html +1 -1
  17. package/docs/server_staLogs_resolveShellWorker.mjs.html +1 -1
  18. package/docs/server_wrapTimer.mjs.html +1 -1
  19. package/docs/src_components_Common_CheckYesNo.vue.html +1 -1
  20. package/docs/src_fetchSsoMsg.mjs.html +1 -1
  21. package/docs/src_httpGetJson.mjs.html +1 -1
  22. package/docs/src_maskUrl.mjs.html +1 -1
  23. package/docs/src_plugins_staUsage.mjs.html +1 -1
  24. package/docs/src_plugins_submitGuard.mjs.html +1 -1
  25. package/package.json +2 -2
  26. package/server/WWebSso.mjs +15 -9
  27. package/server/procCore.mjs +791 -379
  28. package/server/procLang.mjs +18 -0
  29. package/server/procProtect.mjs +150 -88
  30. package/src/baselineOf.mjs +76 -0
  31. package/src/components/LayoutContentIps.vue +24 -2
  32. package/src/components/LayoutContentTokens.vue +24 -2
  33. package/src/components/LayoutContentUsers.vue +9 -3
  34. package/src/schema/tables/ips.mjs +4 -0
  35. package/src/schema/tables/tokens.mjs +4 -0
  36. package/src/writeContracts/index.mjs +9 -0
  37. package/src/writeContracts/ips.mjs +9 -0
  38. package/src/writeContracts/tokens.mjs +12 -0
  39. package/src/writeContracts/tokensSession.mjs +10 -0
  40. package/src/writeContracts/users.mjs +15 -0
package/docs/WWebSso.html CHANGED
@@ -2492,7 +2492,7 @@ token發放/驗證/更新, 後台使用者/金鑰/IP管理與統計資訊, 以
2492
2492
  <br class="clear">
2493
2493
 
2494
2494
  <footer>
2495
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
2495
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
2496
2496
  </footer>
2497
2497
 
2498
2498
  <script>prettyPrint();</script>
package/docs/global.html CHANGED
@@ -3312,7 +3312,7 @@ why: 計時器之 async 回呼 reject 時無人接手, Node 預設即結束行
3312
3312
  <br class="clear">
3313
3313
 
3314
3314
  <footer>
3315
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
3315
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
3316
3316
  </footer>
3317
3317
 
3318
3318
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
@@ -510,7 +510,7 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
510
510
  console.log('WServOrm init failed', err)
511
511
  throw err
512
512
  }
513
- let { woItems, procOrm } = wp
513
+ let { woItems, procOrm, withTabLocks, guardWrite } = wp //withTabLocks / guardWrite: 每表一鍵之表鎖(多人同時編輯之寫入契約, 原則 10), procCore 與 procProtect 共用同一組
514
514
 
515
515
  //getWebInfor
516
516
  let getWebInfor = () => {
@@ -587,8 +587,10 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
587
587
  verifyEmailResultContent = fs.readFileSync(fpTpl, 'utf8')
588
588
  }
589
589
 
590
- let p = procCore(woItems, procOrm, { srLog, srEmail, salt, minExpired, kpLang, passwordPolicy, allowUserRegistration, siteUrl, verifyBaseUrl })
590
+ let p = procCore(woItems, procOrm, { srLog, srEmail, salt, minExpired, kpLang, passwordPolicy, allowUserRegistration, siteUrl, verifyBaseUrl, withTabLocks, guardWrite })
591
591
  let pp = procProtect(woItems, p, {
592
+ procOrm, //系統直寫(自動封鎖、計時器登錄 IP)經 procOrm 且在表鎖內, 更新者記 'system'
593
+ withTabLocks,
592
594
  srLog, //app token 跳過速率封鎖時記 debug (ADR-052)
593
595
  minForAccountLoginFailed,
594
596
  numForAccountLoginFailed,
@@ -962,7 +964,7 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
962
964
  // console.log('us', us)
963
965
 
964
966
  //對外介接契約不輸出憑證欄(ADR-068): 介接端常以本清單同步使用者, 憑證會擴散至其資料庫與 log;
965
- //只在對外路由剝除, 後台 kpfun getUsersList 之整列存回依賴 tokenVerify(updateTabItems 以 ltdtmapping 補齊全欄)
967
+ //只在對外路由剝除(後台 kpfun getUsersList 同樣不回傳 tokenVerify, T3; 存檔時伺服器專有欄位取庫內值, 不再依賴前端整列存回)
966
968
  us = us.map(p.omitUserCredential)
967
969
 
968
970
  return us
@@ -1308,13 +1310,15 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
1308
1310
  return rs
1309
1311
  },
1310
1312
 
1311
- updateUsersList: async (_t, token, lang, rows) => {
1313
+ //optSave: 選用之第 4 參數 { baseline }(前端以 buildBaseline 對載入時畫面所見之列自算, 多人同時編輯之寫入契約 R-CONC-05); 未給即不帶基準(app 權杖直呼、已開啟之舊版頁面, 本 major 允許),
1314
+ //格式 / 白名單由 procCore.parseSaveOpt 驗證, 不識者 reject saveBaselineFormat, 不降級為不帶基準; 此處只轉交, 不展開給 procOrm
1315
+ updateUsersList: async (_t, token, lang, rows, optSave) => {
1312
1316
  if (!_strictStr(token)) return Promise.reject('tokenExpired')
1313
1317
  if (!isearr(rows) || !rows.every((r) => isestr(get(r, 'id', '')))) return Promise.reject('invalidRows')
1314
1318
  srLog.info({ event: 'kpfun-updateUsersList', token: maskToken(token), lang })
1315
1319
  //console.log('call updateUsersList...')
1316
1320
  //內層 reject key 字串 (含 checkToken 之 tokenExpired) 直接透出回前端 (前端 $t 顯示)
1317
- let rs = await p.checkTokenAndUpdateUsersList(token, lang, rows, { fun: funCheckAdmin, perm: 'writeUsers' })
1321
+ let rs = await p.checkTokenAndUpdateUsersList(token, lang, rows, { fun: funCheckAdmin, perm: 'writeUsers' }, optSave)
1318
1322
  //console.log('call updateUsersList end')
1319
1323
  return rs
1320
1324
  },
@@ -1328,12 +1332,13 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
1328
1332
  return rs
1329
1333
  },
1330
1334
 
1331
- updateTokensList: async (_t, token, lang, rows) => {
1335
+ //optSave: { baseline, baselineSession }(app 列嚴格整表基準、session 列逐列寬鬆基準; 見 users 同名參數說明)
1336
+ updateTokensList: async (_t, token, lang, rows, optSave) => {
1332
1337
  if (!_strictStr(token)) return Promise.reject('tokenExpired')
1333
1338
  if (!isearr(rows) || !rows.every((r) => isestr(get(r, 'id', '')))) return Promise.reject('invalidRows')
1334
1339
  srLog.info({ event: 'kpfun-updateTokensList', token: maskToken(token), lang })
1335
1340
  //console.log('call updateTokensList...')
1336
- let rs = await p.checkTokenAndUpdateTokensList(token, rows, { fun: funCheckAdmin, perm: 'writeTokens' })
1341
+ let rs = await p.checkTokenAndUpdateTokensList(token, rows, { fun: funCheckAdmin, perm: 'writeTokens' }, optSave)
1337
1342
  //console.log('call updateTokensList end')
1338
1343
  return rs
1339
1344
  },
@@ -1347,12 +1352,13 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
1347
1352
  return rs
1348
1353
  },
1349
1354
 
1350
- updateIpsList: async (_t, token, lang, rows) => {
1355
+ //optSave: { baseline }(見 users 同名參數說明)
1356
+ updateIpsList: async (_t, token, lang, rows, optSave) => {
1351
1357
  if (!_strictStr(token)) return Promise.reject('tokenExpired')
1352
1358
  if (!isearr(rows) || !rows.every((r) => isestr(get(r, 'id', '')))) return Promise.reject('invalidRows')
1353
1359
  srLog.info({ event: 'kpfun-updateIpsList', token: maskToken(token), lang })
1354
1360
  //console.log('call updateIpsList...')
1355
- let rs = await p.checkTokenAndUpdateIpsList(token, rows, { fun: funCheckAdmin, perm: 'writeIps' })
1361
+ let rs = await p.checkTokenAndUpdateIpsList(token, rows, { fun: funCheckAdmin, perm: 'writeIps' }, optSave)
1356
1362
  //console.log('call updateIpsList end')
1357
1363
  return rs
1358
1364
  },
@@ -1451,7 +1457,7 @@ export default WWebSso
1451
1457
  <br class="clear">
1452
1458
 
1453
1459
  <footer>
1454
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1460
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1455
1461
  </footer>
1456
1462
 
1457
1463
  <script>prettyPrint();</script>
@@ -93,7 +93,7 @@ export default getIgnoredOrmKeys
93
93
  <br class="clear">
94
94
 
95
95
  <footer>
96
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
96
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
97
97
  </footer>
98
98
 
99
99
  <script>prettyPrint();</script>
@@ -102,7 +102,7 @@ export default createLockSave
102
102
  <br class="clear">
103
103
 
104
104
  <footer>
105
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
105
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
106
106
  </footer>
107
107
 
108
108
  <script>prettyPrint();</script>
@@ -108,7 +108,7 @@ export default ormWrite
108
108
  <br class="clear">
109
109
 
110
110
  <footer>
111
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
111
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
112
112
  </footer>
113
113
 
114
114
  <script>prettyPrint();</script>
@@ -167,7 +167,7 @@ export default resolveShellWorker
167
167
  <br class="clear">
168
168
 
169
169
  <footer>
170
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
170
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
171
171
  </footer>
172
172
 
173
173
  <script>prettyPrint();</script>
@@ -117,7 +117,7 @@ export default wrapTimer
117
117
  <br class="clear">
118
118
 
119
119
  <footer>
120
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
120
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
121
121
  </footer>
122
122
 
123
123
  <script>prettyPrint();</script>
@@ -188,7 +188,7 @@ export default {
188
188
  <br class="clear">
189
189
 
190
190
  <footer>
191
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
191
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
192
192
  </footer>
193
193
 
194
194
  <script>prettyPrint();</script>
@@ -211,7 +211,7 @@ export { fetchSsoMsg, convertUser, hasUrlParam }
211
211
  <br class="clear">
212
212
 
213
213
  <footer>
214
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
214
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
215
215
  </footer>
216
216
 
217
217
  <script>prettyPrint();</script>
@@ -100,7 +100,7 @@ export default httpGetJson
100
100
  <br class="clear">
101
101
 
102
102
  <footer>
103
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
103
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
104
104
  </footer>
105
105
 
106
106
  <script>prettyPrint();</script>
@@ -99,7 +99,7 @@ export default maskUrl
99
99
  <br class="clear">
100
100
 
101
101
  <footer>
102
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
102
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
103
103
  </footer>
104
104
 
105
105
  <script>prettyPrint();</script>
@@ -237,7 +237,7 @@ export { getFreqVal, sumFreqVal, groupFreq, calcUsageSummary }
237
237
  <br class="clear">
238
238
 
239
239
  <footer>
240
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
240
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
241
241
  </footer>
242
242
 
243
243
  <script>prettyPrint();</script>
@@ -150,7 +150,7 @@ export default submitGuard
150
150
  <br class="clear">
151
151
 
152
152
  <footer>
153
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 18:57:50 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
153
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 11:30:30 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
154
154
  </footer>
155
155
 
156
156
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-web-sso",
3
- "version": "1.1.12",
3
+ "version": "1.1.13",
4
4
  "main": "dist/w-web-sso.umd.js",
5
5
  "dependencies": {
6
6
  "json5": "^2.2.3",
@@ -10,7 +10,7 @@
10
10
  "w-echarts-vue": "^1.0.19",
11
11
  "w-email": "^1.1.8",
12
12
  "w-serv-hapi": "^1.1.7",
13
- "w-serv-orm": "^1.1.15",
13
+ "w-serv-orm": "^1.1.17",
14
14
  "w-syslog": "^1.0.34",
15
15
  "wsemi": "^1.9.21"
16
16
  },
@@ -463,7 +463,7 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
463
463
  console.log('WServOrm init failed', err)
464
464
  throw err
465
465
  }
466
- let { woItems, procOrm } = wp
466
+ let { woItems, procOrm, withTabLocks, guardWrite } = wp //withTabLocks / guardWrite: 每表一鍵之表鎖(多人同時編輯之寫入契約, 原則 10), procCore 與 procProtect 共用同一組
467
467
 
468
468
  //getWebInfor
469
469
  let getWebInfor = () => {
@@ -540,8 +540,10 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
540
540
  verifyEmailResultContent = fs.readFileSync(fpTpl, 'utf8')
541
541
  }
542
542
 
543
- let p = procCore(woItems, procOrm, { srLog, srEmail, salt, minExpired, kpLang, passwordPolicy, allowUserRegistration, siteUrl, verifyBaseUrl })
543
+ let p = procCore(woItems, procOrm, { srLog, srEmail, salt, minExpired, kpLang, passwordPolicy, allowUserRegistration, siteUrl, verifyBaseUrl, withTabLocks, guardWrite })
544
544
  let pp = procProtect(woItems, p, {
545
+ procOrm, //系統直寫(自動封鎖、計時器登錄 IP)經 procOrm 且在表鎖內, 更新者記 'system'
546
+ withTabLocks,
545
547
  srLog, //app token 跳過速率封鎖時記 debug (ADR-052)
546
548
  minForAccountLoginFailed,
547
549
  numForAccountLoginFailed,
@@ -915,7 +917,7 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
915
917
  // console.log('us', us)
916
918
 
917
919
  //對外介接契約不輸出憑證欄(ADR-068): 介接端常以本清單同步使用者, 憑證會擴散至其資料庫與 log;
918
- //只在對外路由剝除, 後台 kpfun getUsersList 之整列存回依賴 tokenVerify(updateTabItems 以 ltdtmapping 補齊全欄)
920
+ //只在對外路由剝除(後台 kpfun getUsersList 同樣不回傳 tokenVerify, T3; 存檔時伺服器專有欄位取庫內值, 不再依賴前端整列存回)
919
921
  us = us.map(p.omitUserCredential)
920
922
 
921
923
  return us
@@ -1261,13 +1263,15 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
1261
1263
  return rs
1262
1264
  },
1263
1265
 
1264
- updateUsersList: async (_t, token, lang, rows) => {
1266
+ //optSave: 選用之第 4 參數 { baseline }(前端以 buildBaseline 對載入時畫面所見之列自算, 多人同時編輯之寫入契約 R-CONC-05); 未給即不帶基準(app 權杖直呼、已開啟之舊版頁面, 本 major 允許),
1267
+ //格式 / 白名單由 procCore.parseSaveOpt 驗證, 不識者 reject saveBaselineFormat, 不降級為不帶基準; 此處只轉交, 不展開給 procOrm
1268
+ updateUsersList: async (_t, token, lang, rows, optSave) => {
1265
1269
  if (!_strictStr(token)) return Promise.reject('tokenExpired')
1266
1270
  if (!isearr(rows) || !rows.every((r) => isestr(get(r, 'id', '')))) return Promise.reject('invalidRows')
1267
1271
  srLog.info({ event: 'kpfun-updateUsersList', token: maskToken(token), lang })
1268
1272
  //console.log('call updateUsersList...')
1269
1273
  //內層 reject key 字串 (含 checkToken 之 tokenExpired) 直接透出回前端 (前端 $t 顯示)
1270
- let rs = await p.checkTokenAndUpdateUsersList(token, lang, rows, { fun: funCheckAdmin, perm: 'writeUsers' })
1274
+ let rs = await p.checkTokenAndUpdateUsersList(token, lang, rows, { fun: funCheckAdmin, perm: 'writeUsers' }, optSave)
1271
1275
  //console.log('call updateUsersList end')
1272
1276
  return rs
1273
1277
  },
@@ -1281,12 +1285,13 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
1281
1285
  return rs
1282
1286
  },
1283
1287
 
1284
- updateTokensList: async (_t, token, lang, rows) => {
1288
+ //optSave: { baseline, baselineSession }(app 列嚴格整表基準、session 列逐列寬鬆基準; 見 users 同名參數說明)
1289
+ updateTokensList: async (_t, token, lang, rows, optSave) => {
1285
1290
  if (!_strictStr(token)) return Promise.reject('tokenExpired')
1286
1291
  if (!isearr(rows) || !rows.every((r) => isestr(get(r, 'id', '')))) return Promise.reject('invalidRows')
1287
1292
  srLog.info({ event: 'kpfun-updateTokensList', token: maskToken(token), lang })
1288
1293
  //console.log('call updateTokensList...')
1289
- let rs = await p.checkTokenAndUpdateTokensList(token, rows, { fun: funCheckAdmin, perm: 'writeTokens' })
1294
+ let rs = await p.checkTokenAndUpdateTokensList(token, rows, { fun: funCheckAdmin, perm: 'writeTokens' }, optSave)
1290
1295
  //console.log('call updateTokensList end')
1291
1296
  return rs
1292
1297
  },
@@ -1300,12 +1305,13 @@ function WWebSso(WOrm, url, db, pathSettings, optExt = {}) {
1300
1305
  return rs
1301
1306
  },
1302
1307
 
1303
- updateIpsList: async (_t, token, lang, rows) => {
1308
+ //optSave: { baseline }(見 users 同名參數說明)
1309
+ updateIpsList: async (_t, token, lang, rows, optSave) => {
1304
1310
  if (!_strictStr(token)) return Promise.reject('tokenExpired')
1305
1311
  if (!isearr(rows) || !rows.every((r) => isestr(get(r, 'id', '')))) return Promise.reject('invalidRows')
1306
1312
  srLog.info({ event: 'kpfun-updateIpsList', token: maskToken(token), lang })
1307
1313
  //console.log('call updateIpsList...')
1308
- let rs = await p.checkTokenAndUpdateIpsList(token, rows, { fun: funCheckAdmin, perm: 'writeIps' })
1314
+ let rs = await p.checkTokenAndUpdateIpsList(token, rows, { fun: funCheckAdmin, perm: 'writeIps' }, optSave)
1309
1315
  //console.log('call updateIpsList end')
1310
1316
  return rs
1311
1317
  },