w-web-perm 1.0.48 → 1.0.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci-test.yml +2 -2
- package/_gh-pages-deploy/.nojekyll +0 -0
- package/_gh-pages-deploy/WWebPerm.html +938 -0
- package/_gh-pages-deploy/WWebPerm.mjs.html +1228 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/_gh-pages-deploy/index.html +84 -0
- package/_gh-pages-deploy/scripts/collapse.js +39 -0
- package/_gh-pages-deploy/scripts/commonNav.js +28 -0
- package/_gh-pages-deploy/scripts/linenumber.js +25 -0
- package/_gh-pages-deploy/scripts/nav.js +12 -0
- package/_gh-pages-deploy/scripts/polyfill.js +4 -0
- package/_gh-pages-deploy/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/_gh-pages-deploy/scripts/prettify/lang-css.js +2 -0
- package/_gh-pages-deploy/scripts/prettify/prettify.js +28 -0
- package/_gh-pages-deploy/scripts/search.js +99 -0
- package/_gh-pages-deploy/styles/jsdoc.css +776 -0
- package/_gh-pages-deploy/styles/prettify.css +80 -0
- package/dist/css/app.d8b16216.css +1 -0
- package/dist/css/{chunk-vendors.f149e124.css → chunk-vendors.2d3ef2ba.css} +1 -1
- package/dist/index.tmp +2 -2
- package/dist/js/app-legacy.fb48310a.js +1 -0
- package/dist/js/app.fb48310a.js +1 -0
- package/dist/js/chunk-vendors-legacy.8fdd4435.js +21 -0
- package/dist/js/chunk-vendors.8fdd4435.js +21 -0
- package/dist/w-web-perm.umd.js +2 -2
- package/dist/w-web-perm.umd.js.map +1 -1
- package/docs/WWebPerm.html +2 -2
- package/docs/WWebPerm.mjs.html +138 -199
- package/docs/index.html +1 -1
- package/package.json +15 -11
- package/public/index.html +2 -2
- package/server/WWebPerm.mjs +137 -198
- package/server/procCore.mjs +169 -0
- package/server/procLang.mjs +197 -0
- package/server/procStaInfor.mjs +118 -0
- package/server/provideTabs.mjs +1 -1
- package/server/srLog.mjs +30 -0
- package/server/staLogs/staEvent.callWorker.mjs +46 -0
- package/server/staLogs/staEvent.mjs +116 -0
- package/server/staLogs/staEvent.shellWorker.mjs +19 -0
- package/server/staLogs/staEventTable.mjs +100 -0
- package/server/staLogs/test_staEvent.mjs +22 -0
- package/settings.json +40 -0
- package/src/components/Common/CheckYes.vue +18 -1
- package/src/components/Layout.vue +1 -1
- package/src/components/LayoutContent.vue +13 -1
- package/src/components/LayoutContentGrups.vue +32 -23
- package/src/components/LayoutContentPemis.vue +32 -23
- package/src/components/LayoutContentStaInfor.vue +536 -0
- package/src/components/LayoutContentTargets.vue +32 -23
- package/src/components/LayoutContentUsers.vue +32 -23
- package/src/components/LayoutState.vue +5 -0
- package/src/components/VeCgrups.vue +12 -3
- package/src/components/VeCpemis.vue +12 -3
- package/src/components/VeCrules.vue +12 -3
- package/src/components/VeGrupBlngUsers.vue +18 -6
- package/src/components/VePemiBlngGrups.vue +18 -6
- package/src/getPerm.mjs +7 -17
- package/src/getPermUserInfor.mjs +8 -18
- package/src/main.js +1 -0
- package/src/plugins/mShare.mjs +8 -13
- package/src/plugins/mUI.mjs +11 -0
- package/srv.mjs +76 -101
- package/tableTags.json +1 -1
- package/db/wperm/grups/data.mdb +0 -0
- package/db/wperm/grups/lock.mdb +0 -0
- package/db/wperm/pemis/data.mdb +0 -0
- package/db/wperm/pemis/lock.mdb +0 -0
- package/db/wperm/targets/data.mdb +0 -0
- package/db/wperm/targets/lock.mdb +0 -0
- package/db/wperm/users/data.mdb +0 -0
- package/db/wperm/users/lock.mdb +0 -0
- package/dist/css/app.30e81bfe.css +0 -1
- package/dist/js/app-legacy.3324392e.js +0 -1
- package/dist/js/app.3324392e.js +0 -1
- package/dist/js/chunk-vendors-legacy.e8703728.js +0 -21
- package/dist/js/chunk-vendors.e8703728.js +0 -21
- package/test/getUserRules.test.mjs +0 -899
package/server/WWebPerm.mjs
CHANGED
|
@@ -23,15 +23,16 @@ import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
|
23
23
|
import fsIsFile from 'wsemi/src/fsIsFile.mjs'
|
|
24
24
|
import replace from 'wsemi/src/replace.mjs'
|
|
25
25
|
import strdelleft from 'wsemi/src/strdelleft.mjs'
|
|
26
|
-
import haskey from 'wsemi/src/haskey.mjs'
|
|
27
|
-
import arrHas from 'wsemi/src/arrHas.mjs'
|
|
28
|
-
import ltdtDiffByKey from 'wsemi/src/ltdtDiffByKey.mjs'
|
|
29
26
|
import ltdtmapping from 'wsemi/src/ltdtmapping.mjs'
|
|
27
|
+
import pmKeyMutex from 'wsemi/src/pmKeyMutex.mjs'
|
|
30
28
|
import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
|
|
31
29
|
import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
|
|
32
30
|
import ds from '../src/schema/index.mjs'
|
|
33
31
|
import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
32
|
+
import procCore from './procCore.mjs'
|
|
34
33
|
import procLang from './procLang.mjs'
|
|
34
|
+
import srLogInit from './srLog.mjs'
|
|
35
|
+
import procStaInfor from './procStaInfor.mjs'
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
/**
|
|
@@ -268,6 +269,10 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
268
269
|
let kpLang = procLang({ kpLangExt, webName, webDescription })
|
|
269
270
|
|
|
270
271
|
|
|
272
|
+
//srLog
|
|
273
|
+
let srLog = srLogInit(opt)
|
|
274
|
+
|
|
275
|
+
|
|
271
276
|
//WServOrm
|
|
272
277
|
let optWServOrm = {
|
|
273
278
|
useCheckUser,
|
|
@@ -284,8 +289,25 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
284
289
|
let { woItems, procOrm } = wp
|
|
285
290
|
|
|
286
291
|
|
|
292
|
+
//pmKeyMutex: per-key in-memory mutex, 同 key 序列化、不同 key 並行.
|
|
293
|
+
//perm 為「整表批次 diff」寫入, key 粒度為 {op}:{keyTable}, 防同表並行 race (lost update).
|
|
294
|
+
let kmx = pmKeyMutex()
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
//procCore: 整表批次 diff 寫入邏輯 (updateTabItems + updateTargets/Pemis/Grups/Users)
|
|
298
|
+
let pc = procCore(woItems, procOrm, { srLog, kmx })
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
//procStaInfor: 統計資訊, fdLog 對齊 srLog 使用同一目錄; mock 由 settings.staEventMock 注入(e2e 統計圖穩定用)
|
|
302
|
+
let psi = procStaInfor({ fdLog: './_logs', mock: get(opt, 'staEventMock', false) })
|
|
303
|
+
|
|
304
|
+
|
|
287
305
|
//getWebInfor
|
|
288
306
|
let getWebInfor = (userId) => {
|
|
307
|
+
|
|
308
|
+
//info
|
|
309
|
+
srLog.info({ event: 'getWebInfor-success', userId })
|
|
310
|
+
|
|
289
311
|
return {
|
|
290
312
|
|
|
291
313
|
// webName, //已併入kpLang
|
|
@@ -348,162 +370,32 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
348
370
|
// }
|
|
349
371
|
|
|
350
372
|
|
|
351
|
-
//updateTabItems
|
|
352
|
-
let updateTabItems = async (keyTable, userId, rows, keyDetect) => {
|
|
353
|
-
// console.log('updateTabItems', keyTable, userId, rows.length, keyDetect)
|
|
354
|
-
|
|
355
|
-
//ltdtmapping
|
|
356
|
-
rows = ltdtmapping(rows, ds[keyTable].keys)
|
|
357
|
-
// console.log('ltdtmapping rows', rows)
|
|
358
|
-
|
|
359
|
-
//重給order
|
|
360
|
-
rows = map(rows, (r, k) => {
|
|
361
|
-
r.order = k + 1
|
|
362
|
-
return r
|
|
363
|
-
})
|
|
364
|
-
|
|
365
|
-
//ckKey
|
|
366
|
-
let ckKey = (rows, key) => {
|
|
367
|
-
let err = null
|
|
368
|
-
|
|
369
|
-
//check
|
|
370
|
-
let kp = {}
|
|
371
|
-
each(rows, (v, k) => {
|
|
372
|
-
|
|
373
|
-
//value
|
|
374
|
-
let value = get(v, key, '')
|
|
375
|
-
|
|
376
|
-
//check
|
|
377
|
-
if (!isestr(value)) {
|
|
378
|
-
err = `rows[${k}].${key} is not an effective string`
|
|
379
|
-
return false //跳出
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
//check
|
|
383
|
-
if (haskey(kp, value)) {
|
|
384
|
-
err = `rows[${k}].${key}[${value}] is duplicate`
|
|
385
|
-
return false //跳出
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
//kp
|
|
389
|
-
kp[value] = true
|
|
390
|
-
|
|
391
|
-
})
|
|
392
|
-
|
|
393
|
-
return err
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
//偵測未給予或重複
|
|
397
|
-
let err = null
|
|
398
|
-
if (true) {
|
|
399
|
-
if (arrHas(keyTable, ['targets'])) {
|
|
400
|
-
err = ckKey(rows, 'id')
|
|
401
|
-
if (err !== null) {
|
|
402
|
-
return Promise.reject(err)
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
if (arrHas(keyTable, ['pemis', 'grups'])) { //users可重複name故不列入
|
|
406
|
-
err = ckKey(rows, 'name')
|
|
407
|
-
if (err !== null) {
|
|
408
|
-
return Promise.reject(err)
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
if (arrHas(keyTable, ['users'])) {
|
|
412
|
-
err = ckKey(rows, 'email')
|
|
413
|
-
if (err !== null) {
|
|
414
|
-
return Promise.reject(err)
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
//ltdtDiffByKey
|
|
420
|
-
let ltdtOld = await woItems[keyTable].select()
|
|
421
|
-
let ltdtNew = rows
|
|
422
|
-
let r = ltdtDiffByKey(ltdtOld, ltdtNew, keyDetect)
|
|
423
|
-
// console.log('ltdtDiffByKey r', r)
|
|
424
|
-
|
|
425
|
-
//del
|
|
426
|
-
if (size(r.del) > 0) {
|
|
427
|
-
await procOrm(userId, keyTable, 'del', r.del) //須使用procOrm才有辦法自動給予相關欄位
|
|
428
|
-
// .catch((err) => {
|
|
429
|
-
// console.log('woItems[keyTable].del err', err)
|
|
430
|
-
// })
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
//add
|
|
434
|
-
if (size(r.add) > 0) {
|
|
435
|
-
await procOrm(userId, keyTable, 'insert', r.add) //須使用procOrm才有辦法自動給予相關欄位
|
|
436
|
-
// .catch((err) => {
|
|
437
|
-
// console.log('woItems[keyTable].insert err', err)
|
|
438
|
-
// })
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
//diff
|
|
442
|
-
if (size(r.diff) > 0) {
|
|
443
|
-
await procOrm(userId, keyTable, 'save', r.diff) //須使用procOrm才有辦法自動給予相關欄位
|
|
444
|
-
// .catch((err) => {
|
|
445
|
-
// console.log('woItems[keyTable].save err', err)
|
|
446
|
-
// })
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
return ltdtNew
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
//updateTargets
|
|
454
|
-
let updateTargets = async (userId, rows) => {
|
|
455
|
-
rows = await updateTabItems('targets', userId, rows, 'id')
|
|
456
|
-
return rows
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
//updatePemis
|
|
461
|
-
let updatePemis = async (userId, rows) => {
|
|
462
|
-
rows = await updateTabItems('pemis', userId, rows, 'name')
|
|
463
|
-
return rows
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
//updateGrups
|
|
468
|
-
let updateGrups = async (userId, rows) => {
|
|
469
|
-
rows = await updateTabItems('grups', userId, rows, 'name')
|
|
470
|
-
return rows
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
//updateUsers
|
|
475
|
-
let updateUsers = async (userId, rows) => {
|
|
476
|
-
rows = await updateTabItems('users', userId, rows, 'id')
|
|
477
|
-
return rows
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
|
|
481
373
|
//checkUser
|
|
482
374
|
let checkUser = async(user) => {
|
|
483
375
|
let id = get(user, 'id', '')
|
|
484
376
|
if (!isestr(id)) {
|
|
485
377
|
console.log('user', user)
|
|
486
|
-
|
|
487
|
-
return Promise.reject(`
|
|
378
|
+
srLog.error({ event: 'checkUser-error', msg: 'cannotGetUserId' })
|
|
379
|
+
return Promise.reject(`cannotGetUserId`)
|
|
488
380
|
}
|
|
489
381
|
let email = get(user, 'email', '')
|
|
490
382
|
if (!isestr(email)) {
|
|
491
383
|
console.log('user', user)
|
|
492
|
-
|
|
493
|
-
return Promise.reject(`
|
|
384
|
+
srLog.error({ event: 'checkUser-error', msg: 'cannotGetUserEmail' })
|
|
385
|
+
return Promise.reject(`cannotGetUserEmail`)
|
|
494
386
|
}
|
|
495
387
|
let name = get(user, 'name', '')
|
|
496
388
|
if (!isestr(name)) {
|
|
497
389
|
console.log('user', user)
|
|
498
|
-
|
|
499
|
-
return Promise.reject(`
|
|
390
|
+
srLog.error({ event: 'checkUser-error', msg: 'cannotGetUserName' })
|
|
391
|
+
return Promise.reject(`cannotGetUserName`)
|
|
500
392
|
}
|
|
501
393
|
let isAdmin = get(user, 'isAdmin', '')
|
|
502
394
|
if (isAdmin !== 'y' && isAdmin !== 'n') {
|
|
503
395
|
console.log('user', user)
|
|
504
396
|
console.log('user.isAdmin is not y or n', user.isAdmin)
|
|
505
|
-
|
|
506
|
-
return Promise.reject(`
|
|
397
|
+
srLog.error({ event: 'checkUser-error', msg: 'cannotGetUserRole' })
|
|
398
|
+
return Promise.reject(`cannotGetUserRole`)
|
|
507
399
|
}
|
|
508
400
|
return true
|
|
509
401
|
}
|
|
@@ -526,8 +418,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
526
418
|
//check
|
|
527
419
|
if (!iseobj(userSelf)) {
|
|
528
420
|
console.log(`token`, token)
|
|
529
|
-
|
|
530
|
-
return Promise.reject(`
|
|
421
|
+
srLog.error({ event: 'getTokenUser-error', msg: 'cannotFindUserFromToken' })
|
|
422
|
+
return Promise.reject(`cannotFindUserFromToken`)
|
|
531
423
|
}
|
|
532
424
|
|
|
533
425
|
//check userSelf
|
|
@@ -541,8 +433,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
541
433
|
if (!isestr(vSelf)) {
|
|
542
434
|
console.log('userSelf', userSelf)
|
|
543
435
|
console.log('mappingBy', mappingBy)
|
|
544
|
-
|
|
545
|
-
return Promise.reject(`
|
|
436
|
+
srLog.error({ event: 'getTokenUser-error', msg: 'cannotGetUserProp', mappingBy })
|
|
437
|
+
return Promise.reject(`cannotGetUserProp`)
|
|
546
438
|
}
|
|
547
439
|
|
|
548
440
|
//userFind
|
|
@@ -554,8 +446,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
554
446
|
if (!iseobj(userFind)) {
|
|
555
447
|
console.log('userSelf', userSelf)
|
|
556
448
|
console.log('mappingBy', mappingBy)
|
|
557
|
-
|
|
558
|
-
return Promise.reject(`
|
|
449
|
+
srLog.error({ event: 'getTokenUser-error', msg: 'cannotGetUserFromPerm', mappingBy })
|
|
450
|
+
return Promise.reject(`cannotGetUserFromPerm`)
|
|
559
451
|
}
|
|
560
452
|
|
|
561
453
|
//複寫isAdmin
|
|
@@ -602,8 +494,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
602
494
|
//check
|
|
603
495
|
if (!b) {
|
|
604
496
|
console.log('user', user)
|
|
605
|
-
|
|
606
|
-
return Promise.reject(`
|
|
497
|
+
srLog.error({ event: 'getAndVerifyClientUser-error', msg: 'userNoPermission', from })
|
|
498
|
+
return Promise.reject(`userNoPermission`)
|
|
607
499
|
}
|
|
608
500
|
|
|
609
501
|
return user
|
|
@@ -627,8 +519,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
627
519
|
//check
|
|
628
520
|
if (!iseobj(user)) {
|
|
629
521
|
console.log(`token`, token)
|
|
630
|
-
|
|
631
|
-
return Promise.reject(`
|
|
522
|
+
srLog.error({ event: 'getAndVerifyAppUser-error', msg: 'cannotFindUserFromToken' })
|
|
523
|
+
return Promise.reject(`cannotFindUserFromToken`)
|
|
632
524
|
}
|
|
633
525
|
|
|
634
526
|
//verifyAppUser
|
|
@@ -640,8 +532,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
640
532
|
//check
|
|
641
533
|
if (!b) {
|
|
642
534
|
console.log('user', user)
|
|
643
|
-
|
|
644
|
-
return Promise.reject(`
|
|
535
|
+
srLog.error({ event: 'getAndVerifyAppUser-error', msg: 'userNoPermission', from })
|
|
536
|
+
return Promise.reject(`userNoPermission`)
|
|
645
537
|
}
|
|
646
538
|
|
|
647
539
|
return user
|
|
@@ -662,8 +554,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
662
554
|
//check
|
|
663
555
|
if (!iseobj(payload)) {
|
|
664
556
|
console.log('payload', payload)
|
|
665
|
-
|
|
666
|
-
return Promise.reject(`
|
|
557
|
+
srLog.error({ event: 'parsePayload-error', msg: 'invalidPayload' })
|
|
558
|
+
return Promise.reject(`invalidPayload`)
|
|
667
559
|
}
|
|
668
560
|
|
|
669
561
|
//from
|
|
@@ -672,8 +564,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
672
564
|
//check
|
|
673
565
|
if (!isestr(from)) {
|
|
674
566
|
console.log('payload', payload)
|
|
675
|
-
|
|
676
|
-
return Promise.reject(`
|
|
567
|
+
srLog.error({ event: 'parsePayload-error', msg: 'invalidFromInPayload' })
|
|
568
|
+
return Promise.reject(`invalidFromInPayload`)
|
|
677
569
|
}
|
|
678
570
|
|
|
679
571
|
//rows
|
|
@@ -682,8 +574,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
682
574
|
//check
|
|
683
575
|
if (!isearr(rows)) {
|
|
684
576
|
console.log('payload', payload)
|
|
685
|
-
|
|
686
|
-
return Promise.reject(`
|
|
577
|
+
srLog.error({ event: 'parsePayload-error', msg: 'invalidRowsInPayload' })
|
|
578
|
+
return Promise.reject(`invalidRowsInPayload`)
|
|
687
579
|
}
|
|
688
580
|
|
|
689
581
|
//inp
|
|
@@ -699,6 +591,9 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
699
591
|
//syncAndReplaceTabs
|
|
700
592
|
let syncAndReplaceTabs = async (userId, inp, keyTable) => {
|
|
701
593
|
|
|
594
|
+
//序列化同表之並行整表 delAll+insert: 防 lost update (同 keyTable 序列化, 不同表並行)
|
|
595
|
+
return await kmx('syncAndReplaceTabs:' + keyTable, async () => {
|
|
596
|
+
|
|
702
597
|
//from
|
|
703
598
|
let from = get(inp, 'from', '')
|
|
704
599
|
// console.log('from', from)
|
|
@@ -706,8 +601,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
706
601
|
//check
|
|
707
602
|
if (!isestr(from)) {
|
|
708
603
|
console.log('inp', inp)
|
|
709
|
-
|
|
710
|
-
return Promise.reject(`
|
|
604
|
+
srLog.error({ event: 'syncAndReplaceTabs-error', msg: 'invalidFrom', keyTable })
|
|
605
|
+
return Promise.reject(`invalidFrom`)
|
|
711
606
|
}
|
|
712
607
|
|
|
713
608
|
//rows
|
|
@@ -718,7 +613,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
718
613
|
if (!isearr(rows)) {
|
|
719
614
|
console.log('inp', inp)
|
|
720
615
|
console.log('keyTable', keyTable)
|
|
721
|
-
|
|
616
|
+
srLog.error({ event: 'syncAndReplaceTabs-error', msg: 'invalidRows', keyTable })
|
|
617
|
+
return Promise.reject(`invalidRows`)
|
|
722
618
|
}
|
|
723
619
|
|
|
724
620
|
//save from
|
|
@@ -741,6 +637,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
741
637
|
// console.log('r', r)
|
|
742
638
|
|
|
743
639
|
return r
|
|
640
|
+
|
|
641
|
+
})
|
|
744
642
|
}
|
|
745
643
|
|
|
746
644
|
|
|
@@ -801,8 +699,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
801
699
|
//check
|
|
802
700
|
if (!iseobj(kur)) {
|
|
803
701
|
console.log('userId', userId)
|
|
804
|
-
|
|
805
|
-
return Promise.reject(`
|
|
702
|
+
srLog.error({ event: 'getGenUserAndRulesByUserId-error', msg: 'cannotGetUserRules', userId })
|
|
703
|
+
return Promise.reject(`cannotGetUserRules`)
|
|
806
704
|
}
|
|
807
705
|
|
|
808
706
|
//grupsNames
|
|
@@ -876,8 +774,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
876
774
|
console.log('req.query', get(req, 'query'))
|
|
877
775
|
console.log('token', token)
|
|
878
776
|
console.log('[API]getUserByToken/check token: invalid token')
|
|
879
|
-
|
|
880
|
-
return Promise.reject(`
|
|
777
|
+
srLog.error({ event: 'api/getUserByToken-error', msg: 'tokenNoPermission' })
|
|
778
|
+
return Promise.reject(`tokenNoPermission`)
|
|
881
779
|
}
|
|
882
780
|
|
|
883
781
|
//getAndVerifyClientUser
|
|
@@ -888,10 +786,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
888
786
|
if (!iseobj(user)) {
|
|
889
787
|
console.log('token', token)
|
|
890
788
|
console.log('[API]getUserByToken/check user: invalid user')
|
|
891
|
-
|
|
892
|
-
return Promise.reject(`
|
|
789
|
+
srLog.error({ event: 'api/getUserByToken-error', msg: 'tokenNoPermission' })
|
|
790
|
+
return Promise.reject(`tokenNoPermission`)
|
|
893
791
|
}
|
|
894
792
|
|
|
793
|
+
//info
|
|
794
|
+
srLog.info({ event: 'api/getUserByToken-success', userId: get(user, 'id', '') })
|
|
795
|
+
|
|
895
796
|
return user
|
|
896
797
|
}
|
|
897
798
|
|
|
@@ -923,8 +824,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
923
824
|
console.log('req.query', get(req, 'query'))
|
|
924
825
|
console.log('token', token)
|
|
925
826
|
console.log('[API]getPerm/check token: invalid token')
|
|
926
|
-
|
|
927
|
-
return Promise.reject(`
|
|
827
|
+
srLog.error({ event: 'api/getPerm-error', msg: 'tokenNoPermission' })
|
|
828
|
+
return Promise.reject(`tokenNoPermission`)
|
|
928
829
|
}
|
|
929
830
|
|
|
930
831
|
//getAndVerifyClientUser, 發起token的所屬使用者, 驗證僅對client使用者, 不得使用app使用者
|
|
@@ -935,8 +836,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
935
836
|
if (!iseobj(userSelf)) {
|
|
936
837
|
console.log('token', token)
|
|
937
838
|
console.log('[API]getPerm/check userSelf: invalid userSelf')
|
|
938
|
-
|
|
939
|
-
return Promise.reject(`
|
|
839
|
+
srLog.error({ event: 'api/getPerm-error', msg: 'tokenNoPermission' })
|
|
840
|
+
return Promise.reject(`tokenNoPermission`)
|
|
940
841
|
}
|
|
941
842
|
|
|
942
843
|
//userIdSelf, client使用者的userId
|
|
@@ -948,8 +849,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
948
849
|
console.log('token', token)
|
|
949
850
|
console.log('userSelf', userSelf)
|
|
950
851
|
console.log('[API]getPerm/check userIdSelf: invalid userIdSelf')
|
|
951
|
-
|
|
952
|
-
return Promise.reject(`
|
|
852
|
+
srLog.error({ event: 'api/getPerm-error', msg: 'tokenNoPermission' })
|
|
853
|
+
return Promise.reject(`tokenNoPermission`)
|
|
953
854
|
}
|
|
954
855
|
|
|
955
856
|
//getGenUserAndRulesByUserId, 查找到的client使用者與權限
|
|
@@ -962,10 +863,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
962
863
|
console.log('userSelf', userSelf)
|
|
963
864
|
console.log('userIdSelf', userIdSelf)
|
|
964
865
|
console.log('[API]getPerm/check userWithRulesSelf: invalid userWithRulesSelf')
|
|
965
|
-
|
|
966
|
-
return Promise.reject(`
|
|
866
|
+
srLog.error({ event: 'api/getPerm-error', msg: 'tokenNoPermission' })
|
|
867
|
+
return Promise.reject(`tokenNoPermission`)
|
|
967
868
|
}
|
|
968
869
|
|
|
870
|
+
//info
|
|
871
|
+
srLog.info({ event: 'api/getPerm-success', userId: userIdSelf })
|
|
872
|
+
|
|
969
873
|
return userWithRulesSelf
|
|
970
874
|
}
|
|
971
875
|
|
|
@@ -996,8 +900,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
996
900
|
if (!isestr(tokenSelf)) {
|
|
997
901
|
console.log('req.query', get(req, 'query'))
|
|
998
902
|
console.log('[API]getPermUserInfor/check tokenSelf: invalid tokenSelf')
|
|
999
|
-
|
|
1000
|
-
return Promise.reject(`
|
|
903
|
+
srLog.error({ event: 'api/getPermUserInfor-error', msg: 'tokenNoPermission' })
|
|
904
|
+
return Promise.reject(`tokenNoPermission`)
|
|
1001
905
|
}
|
|
1002
906
|
|
|
1003
907
|
//getAndVerifyAppUser, 發起token的所屬使用者, 驗證須為app使用者
|
|
@@ -1009,8 +913,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1009
913
|
console.log('req.query', get(req, 'query'))
|
|
1010
914
|
console.log('tokenSelf', tokenSelf)
|
|
1011
915
|
console.log('[API]getPermUserInfor/check userSelf: invalid userSelf')
|
|
1012
|
-
|
|
1013
|
-
return Promise.reject(`
|
|
916
|
+
srLog.error({ event: 'api/getPermUserInfor-error', msg: 'tokenNoPermission' })
|
|
917
|
+
return Promise.reject(`tokenNoPermission`)
|
|
1014
918
|
}
|
|
1015
919
|
|
|
1016
920
|
//userIdFind, 欲查找使用者的userId
|
|
@@ -1022,8 +926,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1022
926
|
console.log('req.query', get(req, 'query'))
|
|
1023
927
|
console.log('tokenSelf', tokenSelf)
|
|
1024
928
|
console.log('[API]getPermUserInfor/check userIdFind: invalid userIdFind')
|
|
1025
|
-
|
|
1026
|
-
return Promise.reject(`
|
|
929
|
+
srLog.error({ event: 'api/getPermUserInfor-error', msg: 'tokenNoPermission' })
|
|
930
|
+
return Promise.reject(`tokenNoPermission`)
|
|
1027
931
|
}
|
|
1028
932
|
|
|
1029
933
|
//getGenUserAndRulesByUserId, 查找到的使用者與權限
|
|
@@ -1034,10 +938,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1034
938
|
if (!iseobj(userWithRulesFind)) {
|
|
1035
939
|
console.log('userIdFind', userIdFind)
|
|
1036
940
|
console.log('[API]getPermUserInfor/check userWithRulesFind: invalid userWithRulesFind')
|
|
1037
|
-
|
|
1038
|
-
return Promise.reject(`
|
|
941
|
+
srLog.error({ event: 'api/getPermUserInfor-error', msg: 'userIdNoPermrules' })
|
|
942
|
+
return Promise.reject(`userIdNoPermrules`)
|
|
1039
943
|
}
|
|
1040
944
|
|
|
945
|
+
//info
|
|
946
|
+
srLog.info({ event: 'api/getPermUserInfor-success', userId: userIdFind })
|
|
947
|
+
|
|
1041
948
|
return userWithRulesFind
|
|
1042
949
|
}
|
|
1043
950
|
|
|
@@ -1069,8 +976,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1069
976
|
console.log('req.query', get(req, 'query'))
|
|
1070
977
|
console.log('token', token)
|
|
1071
978
|
console.log('[API]syncAndReplaceTabs/check token: invalid token')
|
|
1072
|
-
|
|
1073
|
-
return Promise.reject(`
|
|
979
|
+
srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'tokenNoPermission' })
|
|
980
|
+
return Promise.reject(`tokenNoPermission`)
|
|
1074
981
|
}
|
|
1075
982
|
|
|
1076
983
|
//keyTable
|
|
@@ -1081,15 +988,16 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1081
988
|
console.log('req.query', get(req, 'query'))
|
|
1082
989
|
console.log('keyTable', keyTable)
|
|
1083
990
|
console.log('[API]syncAndReplaceTabs/check keyTable: invalid keyTable')
|
|
1084
|
-
|
|
1085
|
-
return Promise.reject(`
|
|
991
|
+
srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'tokenNoPermission' })
|
|
992
|
+
return Promise.reject(`tokenNoPermission`)
|
|
1086
993
|
}
|
|
1087
994
|
|
|
1088
995
|
//check keyTable
|
|
1089
996
|
let allowedTables = ['targets', 'pemis', 'grups', 'users']
|
|
1090
997
|
if (!allowedTables.includes(keyTable)) {
|
|
1091
998
|
console.log('[API]syncAndReplaceTabs/check keyTable: unexpected keyTable', keyTable)
|
|
1092
|
-
|
|
999
|
+
srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'invalidKeyTable', keyTable })
|
|
1000
|
+
return Promise.reject(`invalidKeyTable`)
|
|
1093
1001
|
}
|
|
1094
1002
|
|
|
1095
1003
|
//getAndVerifyAppUser
|
|
@@ -1099,8 +1007,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1099
1007
|
if (!iseobj(user)) {
|
|
1100
1008
|
console.log('token', token)
|
|
1101
1009
|
console.log('[API]syncAndReplaceTabs/check user: invalid user')
|
|
1102
|
-
|
|
1103
|
-
return Promise.reject(`
|
|
1010
|
+
srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'tokenNoPermission' })
|
|
1011
|
+
return Promise.reject(`tokenNoPermission`)
|
|
1104
1012
|
}
|
|
1105
1013
|
|
|
1106
1014
|
//userId
|
|
@@ -1111,8 +1019,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1111
1019
|
console.log('token', token)
|
|
1112
1020
|
console.log('user', user)
|
|
1113
1021
|
console.log('[API]syncAndReplaceTabs/check userId: invalid userId')
|
|
1114
|
-
|
|
1115
|
-
return Promise.reject(`
|
|
1022
|
+
srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'tokenNoPermission' })
|
|
1023
|
+
return Promise.reject(`tokenNoPermission`)
|
|
1116
1024
|
}
|
|
1117
1025
|
|
|
1118
1026
|
//parsePayload
|
|
@@ -1121,6 +1029,9 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1121
1029
|
//syncAndReplaceTabs
|
|
1122
1030
|
let r = await syncAndReplaceTabs(userId, inp, keyTable)
|
|
1123
1031
|
|
|
1032
|
+
//info
|
|
1033
|
+
srLog.info({ event: 'api/syncAndReplaceTabs-success', userId, keyTable })
|
|
1034
|
+
|
|
1124
1035
|
return r
|
|
1125
1036
|
}
|
|
1126
1037
|
|
|
@@ -1171,6 +1082,21 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1171
1082
|
let b = await p.checkToken(token)
|
|
1172
1083
|
// console.log('b', b)
|
|
1173
1084
|
|
|
1085
|
+
//ip, 對齊sso慣例x-forwarded-for取第1個, fallback到req remoteAddress, 取不到則略過
|
|
1086
|
+
let ip = get(headers, 'x-forwarded-for', '').split(',')[0].trim()
|
|
1087
|
+
if (!isestr(ip)) {
|
|
1088
|
+
ip = get(req, 'info.remoteAddress', '') || get(req, 'socket.remoteAddress', '') || get(req, 'connection.remoteAddress', '')
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
//origin
|
|
1092
|
+
let origin = get(headers, 'origin', '')
|
|
1093
|
+
|
|
1094
|
+
//referer
|
|
1095
|
+
let referer = get(headers, 'referer', '')
|
|
1096
|
+
|
|
1097
|
+
//info
|
|
1098
|
+
srLog.info({ event: 'verifyConn', ok: b, apiType, ip, origin, referer })
|
|
1099
|
+
|
|
1174
1100
|
return b
|
|
1175
1101
|
},
|
|
1176
1102
|
getUserIdByToken: async (token) => { //可使用async或sync函數
|
|
@@ -1180,7 +1106,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1180
1106
|
if (!isestr(userId)) {
|
|
1181
1107
|
console.log('token', token)
|
|
1182
1108
|
console.log('userId', userId)
|
|
1183
|
-
|
|
1109
|
+
srLog.error({ event: 'getUserIdByToken-error', msg: 'cannotFindUserId' })
|
|
1110
|
+
return Promise.reject(`cannotFindUserId`)
|
|
1184
1111
|
}
|
|
1185
1112
|
return userId
|
|
1186
1113
|
},
|
|
@@ -1200,10 +1127,22 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
|
|
|
1200
1127
|
// getGrupsList,
|
|
1201
1128
|
// getUsersList,
|
|
1202
1129
|
|
|
1203
|
-
updateTargets,
|
|
1204
|
-
updatePemis,
|
|
1205
|
-
updateGrups,
|
|
1206
|
-
updateUsers,
|
|
1130
|
+
updateTargets: pc.updateTargets,
|
|
1131
|
+
updatePemis: pc.updatePemis,
|
|
1132
|
+
updateGrups: pc.updateGrups,
|
|
1133
|
+
updateUsers: pc.updateUsers,
|
|
1134
|
+
|
|
1135
|
+
getStaEvent: async (userId, timeLength, timeInterval) => {
|
|
1136
|
+
let rs = await psi.getStaEvent(userId, timeLength, timeInterval)
|
|
1137
|
+
srLog.info({ event: 'getStaEvent-success', userId })
|
|
1138
|
+
return rs
|
|
1139
|
+
},
|
|
1140
|
+
|
|
1141
|
+
getStaEventTable: async (userId) => {
|
|
1142
|
+
let rs = await psi.getStaEventTable(userId)
|
|
1143
|
+
srLog.info({ event: 'getStaEventTable-success', userId })
|
|
1144
|
+
return rs
|
|
1145
|
+
},
|
|
1207
1146
|
|
|
1208
1147
|
},
|
|
1209
1148
|
fnTableTags: 'tableTags-web-perm.json',
|