w-web-sso 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.github/workflows/ci-test.yml +24 -0
  5. package/.jsdoc +25 -0
  6. package/.vscode/launch.json +20 -0
  7. package/LICENSE +21 -0
  8. package/README.md +25 -0
  9. package/SECURITY.md +5 -0
  10. package/babel.config.js +15 -0
  11. package/dist/css/app.969ad1db.css +1 -0
  12. package/dist/index.tmp +3 -0
  13. package/dist/js/app-legacy.ff64be1c.js +2 -0
  14. package/dist/js/app-legacy.ff64be1c.js.map +1 -0
  15. package/dist/js/app.ff64be1c.js +2 -0
  16. package/dist/js/app.ff64be1c.js.map +1 -0
  17. package/dist/js/chunk-vendors-legacy.0bb7a31b.js +13 -0
  18. package/dist/js/chunk-vendors-legacy.0bb7a31b.js.map +1 -0
  19. package/dist/js/chunk-vendors.0bb7a31b.js +13 -0
  20. package/dist/js/chunk-vendors.0bb7a31b.js.map +1 -0
  21. package/dist/w-web-sso.umd.js +7 -0
  22. package/dist/w-web-sso.umd.js.map +1 -0
  23. package/docs/WWebSso.html +938 -0
  24. package/docs/WWebSso.mjs.html +721 -0
  25. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  26. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  27. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  28. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  29. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  30. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  31. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  32. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  33. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  34. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  35. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  36. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  37. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  38. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  39. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  40. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  41. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  42. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  43. package/docs/index.html +84 -0
  44. package/docs/scripts/collapse.js +39 -0
  45. package/docs/scripts/commonNav.js +28 -0
  46. package/docs/scripts/linenumber.js +25 -0
  47. package/docs/scripts/nav.js +12 -0
  48. package/docs/scripts/polyfill.js +4 -0
  49. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  50. package/docs/scripts/prettify/lang-css.js +2 -0
  51. package/docs/scripts/prettify/prettify.js +28 -0
  52. package/docs/scripts/search.js +99 -0
  53. package/docs/styles/jsdoc.css +776 -0
  54. package/docs/styles/prettify.css +80 -0
  55. package/g.backupDb.mjs +10 -0
  56. package/g.getSettings.mjs +17 -0
  57. package/g.initialData.mjs +94 -0
  58. package/g.initialTestData.mjs +21 -0
  59. package/g.mOrm.mjs +24 -0
  60. package/g.provideUsers.mjs +45 -0
  61. package/package.json +70 -0
  62. package/public/index.html +30 -0
  63. package/script.txt +22 -0
  64. package/server/WWebSso.mjs +649 -0
  65. package/server/hashPassword.mjs +27 -0
  66. package/server/proc.mjs +543 -0
  67. package/server/provideUsers.mjs +68 -0
  68. package/src/App.vue +123 -0
  69. package/src/components/Common/CheckYes.vue +85 -0
  70. package/src/components/Common/CheckYesNo.vue +91 -0
  71. package/src/components/Common/LabelItem.vue +106 -0
  72. package/src/components/Common/LoadingWinBar.vue +115 -0
  73. package/src/components/Layout.vue +160 -0
  74. package/src/components/LayoutContent.vue +193 -0
  75. package/src/components/LayoutContentUsers.vue +498 -0
  76. package/src/components/LayoutState.vue +91 -0
  77. package/src/components/PageLogin.vue +524 -0
  78. package/src/components/VeUser.vue +446 -0
  79. package/src/components/ruleGroup.vue +645 -0
  80. package/src/main.js +97 -0
  81. package/src/plugins/mDataSelectorSchema.mjs +30 -0
  82. package/src/plugins/mDataSupport.mjs +23 -0
  83. package/src/plugins/mShare.mjs +229 -0
  84. package/src/plugins/mUI.mjs +229 -0
  85. package/src/schema/gi.mjs +8 -0
  86. package/src/schema/index.mjs +18 -0
  87. package/src/schema/tables/tokens.mjs +70 -0
  88. package/src/schema/tables/users.mjs +110 -0
  89. package/src/store/actions.mjs +1 -0
  90. package/src/store/getters.mjs +1 -0
  91. package/src/store/index.mjs +25 -0
  92. package/src/store/mutations.mjs +333 -0
  93. package/src/store/types.mjs +15 -0
  94. package/srv.mjs +84 -0
  95. package/tableTags-web-sso.json +1 -0
  96. package/test/all.test.mjs +10 -0
  97. package/toolg/addVersion.mjs +4 -0
  98. package/toolg/cleanFolder.mjs +4 -0
  99. package/toolg/gDistRollup.mjs +36 -0
  100. package/toolg/genEntry.mjs +23 -0
  101. package/toolg/modifyReadme.mjs +4 -0
  102. package/vue.config.js +15 -0
@@ -0,0 +1,543 @@
1
+ import path from 'path'
2
+ import fs from 'fs'
3
+ import ot from 'dayjs'
4
+ import get from 'lodash-es/get.js'
5
+ import each from 'lodash-es/each.js'
6
+ import size from 'lodash-es/size.js'
7
+ import keys from 'lodash-es/keys.js'
8
+ import iseobj from 'wsemi/src/iseobj.mjs'
9
+ import isestr from 'wsemi/src/isestr.mjs'
10
+ import ispint from 'wsemi/src/ispint.mjs'
11
+ import isearr from 'wsemi/src/isearr.mjs'
12
+ import ispnum from 'wsemi/src/ispnum.mjs'
13
+ import isfun from 'wsemi/src/isfun.mjs'
14
+ import ispm from 'wsemi/src/ispm.mjs'
15
+ import cint from 'wsemi/src/cint.mjs'
16
+ import j2o from 'wsemi/src/j2o.mjs'
17
+ import strleft from 'wsemi/src/strleft.mjs'
18
+ import strright from 'wsemi/src/strright.mjs'
19
+ import strdelright from 'wsemi/src/strdelright.mjs'
20
+ import pm2resolve from 'wsemi/src/pm2resolve.mjs'
21
+ import pmSeries from 'wsemi/src/pmSeries.mjs'
22
+ import ds from '../src/schema/index.mjs'
23
+ import hashPassword from './hashPassword.mjs'
24
+
25
+
26
+ function proc(woItems, { salt, timeExpired }) {
27
+
28
+
29
+ //getGenUserByKV
30
+ let getGenUserByKV = async(keyUser, valueUser) => {
31
+
32
+ //us
33
+ let us = await woItems.users.select({ [keyUser]: valueUser, isActive: 'y' })
34
+
35
+ //u
36
+ let u = get(us, 0, null)
37
+
38
+ //check
39
+ if (!iseobj(u)) {
40
+ return null
41
+ }
42
+
43
+ return u
44
+ }
45
+
46
+
47
+ // //getGenUserByUserId
48
+ // let getGenUserByUserId = async(userId) => {
49
+
50
+ // //u
51
+ // let u = await getGenUserByKV('id', userId)
52
+
53
+ // //check
54
+ // if (!iseobj(u)) {
55
+ // return null
56
+ // }
57
+
58
+ // return u
59
+ // }
60
+
61
+
62
+ //getGenUserByUserAc
63
+ let getGenUserByUserAc = async(account) => {
64
+
65
+ //u
66
+ let u = await getGenUserByKV('account', account)
67
+
68
+ //check
69
+ if (!iseobj(u)) {
70
+ return null
71
+ }
72
+
73
+ return u
74
+ }
75
+
76
+
77
+ //loginByAccountAndPassword
78
+ let loginByAccountAndPassword = async(account, password) => {
79
+
80
+ //hashPassword
81
+ let passwordTest = hashPassword(password, salt)
82
+ // console.log('password', password, 'salt', salt)
83
+ // console.log('passwordTest', passwordTest)
84
+
85
+ //getGenUserByUserAc
86
+ let u = await getGenUserByUserAc(account)
87
+ // console.log('u', u)
88
+
89
+ //check
90
+ if (!iseobj(u)) {
91
+ console.log(`account`, account)
92
+ console.log(`can not find the user from account`)
93
+ return Promise.reject(`can not find the user from account`)
94
+ }
95
+
96
+ //passwordTrue
97
+ let passwordTrue = get(u, 'password', '')
98
+ // console.log('passwordTrue', passwordTrue)
99
+
100
+ //check
101
+ if (passwordTest !== passwordTrue) {
102
+ return Promise.reject(`incorrect user account or password`)
103
+ }
104
+
105
+ //userId
106
+ let userId = get(u, 'id', '')
107
+ // console.log('userId', userId)
108
+
109
+ //createToken
110
+ let token = await createToken(userId)
111
+ // console.log('token', token)
112
+
113
+ //bbb 待加入創建usersRecs儲存使用者登入資訊與紀錄
114
+
115
+ //r
116
+ let r = {
117
+ account: u.account,
118
+ name: u.name,
119
+ email: u.email,
120
+ description: u.description,
121
+ from: u.from,
122
+ ruleGroupsIds: u.ruleGroupsIds,
123
+ redir: u.redir,
124
+ isAdmin: u.isAdmin,
125
+ token,
126
+ }
127
+
128
+ return r
129
+ }
130
+
131
+
132
+ //createToken
133
+ let createToken = async (userId) => {
134
+ let errTemp = null
135
+
136
+ //t
137
+ let t = ds.tokens.funNew({
138
+ userId,
139
+ })
140
+ // console.log('funNew', t)
141
+
142
+ //token
143
+ let token = get(t, 'token', '')
144
+
145
+ //insert
146
+ await woItems.tokens.insert(t)
147
+ .catch((err) => {
148
+ errTemp = err
149
+ })
150
+
151
+ //check
152
+ if (errTemp) {
153
+ console.log(errTemp)
154
+ console.log(`token`, token)
155
+ console.log(`Can not create a token from userId`)
156
+ return Promise.reject(`Can not create a token from userId`)
157
+ }
158
+
159
+ return token
160
+ }
161
+
162
+
163
+ //checkTokenCore
164
+ let checkTokenCore = async (tk) => {
165
+
166
+ //timeEnd
167
+ let timeEnd = get(tk, 'timeEnd', '')
168
+
169
+ //tt
170
+ let tt = ot(timeEnd, 'YYYY-MM-DDTHH:mm:ss.SSSZ')
171
+ // console.log('tt', tt)
172
+
173
+ //tn
174
+ let tn = ot()
175
+
176
+ //dmin
177
+ let dmin = tt.diff(tn, 'minutes')
178
+ // console.log('dmin', dmin)
179
+
180
+ //check
181
+ if (dmin > timeExpired) {
182
+ console.log(`tk`, tk)
183
+ console.log(`dmin`, dmin, `dmitimeExpiredn`, timeExpired)
184
+ console.log(`token expired`)
185
+ return Promise.reject(`token expired`)
186
+ }
187
+
188
+ return true
189
+ }
190
+
191
+
192
+ //checkToken
193
+ let checkToken = async (token) => {
194
+
195
+ //tks
196
+ let tks = await woItems.tokens.select({ token })
197
+
198
+ //ntks
199
+ let ntks = size(tks)
200
+
201
+ //check
202
+ if (ntks === 0) {
203
+ console.log(`token`, token)
204
+ console.log(`can not find the token`)
205
+ return Promise.reject(`can not find the token`)
206
+ }
207
+
208
+ //check
209
+ if (ntks >= 2) {
210
+ console.log(`token`, token)
211
+ console.log(`duplicate tokens`)
212
+ return Promise.reject(`duplicate tokens`)
213
+ }
214
+
215
+ //tk
216
+ let tk = get(tks, 0, '')
217
+ // console.log('tk', tk)
218
+
219
+ //checkTokenCore
220
+ await checkTokenCore(tk)
221
+
222
+ return true
223
+ }
224
+
225
+
226
+ //refreshToken
227
+ let refreshToken = async (token) => {
228
+ let errTemp = null
229
+
230
+ //tks
231
+ let tks = await woItems.tokens.select({ token })
232
+
233
+ //ntks
234
+ let ntks = size(tks)
235
+
236
+ //check
237
+ if (ntks === 0) {
238
+ console.log(`token`, token)
239
+ console.log(`can not find the token`)
240
+ return Promise.reject(`can not find the token`)
241
+ }
242
+
243
+ //check
244
+ if (ntks >= 2) {
245
+ console.log(`token`, token)
246
+ console.log(`duplicate tokens`)
247
+ return Promise.reject(`duplicate tokens`)
248
+ }
249
+
250
+ //tk
251
+ let tk = get(tks, 0, '')
252
+ // console.log('tk', tk)
253
+
254
+ //timeEnd
255
+ let timeEnd = get(tk, 'timeEnd', '')
256
+
257
+ //tt
258
+ let tt = ot(timeEnd, 'YYYY-MM-DDTHH:mm:ss.SSSZ')
259
+ // console.log('tt', tt)
260
+
261
+ //tn
262
+ let tn = ot()
263
+
264
+ //dmin
265
+ let dmin = tt.diff(tn, 'minutes')
266
+ // console.log('dmin', dmin)
267
+
268
+ //check
269
+ if (dmin > timeExpired) {
270
+ console.log(`token`, token)
271
+ console.log(`dmin`, dmin, `timeExpired`, timeExpired)
272
+ console.log(`token expired`)
273
+ return Promise.reject(`token expired`)
274
+ }
275
+
276
+ //timeEndNew
277
+ let timeEndNew = tn.format('YYYY-MM-DDTHH:mm:ss.SSSZ')
278
+ // console.log('timeEndNew', timeEndNew)
279
+
280
+ //save
281
+ await woItems.tokens.save({
282
+ id: tk.id,
283
+ timeEnd: timeEndNew,
284
+ })
285
+ .catch((err) => {
286
+ errTemp = err
287
+ })
288
+
289
+ //check
290
+ if (errTemp) {
291
+ console.log(errTemp)
292
+ console.log(`token`, token)
293
+ console.log(`Can not update time for token`)
294
+ return Promise.reject(`Can not update time for token`)
295
+ }
296
+
297
+ return true
298
+ }
299
+
300
+
301
+ //getUserByToken
302
+ let getUserByToken = async(token) => {
303
+ let errTemp = null
304
+
305
+ //tks
306
+ let tks = await woItems.tokens.select({ token })
307
+
308
+ //ntks
309
+ let ntks = size(tks)
310
+
311
+ //check
312
+ if (ntks === 0) {
313
+ console.log(`token`, token)
314
+ console.log(`can not find the token`)
315
+ return Promise.reject(`can not find the token`)
316
+ }
317
+
318
+ //check
319
+ if (ntks >= 2) {
320
+ console.log(`token`, token)
321
+ console.log(`duplicate tokens`)
322
+ return Promise.reject(`duplicate tokens`)
323
+ }
324
+
325
+ //tk
326
+ let tk = get(tks, 0, '')
327
+ // console.log('tk', tk)
328
+
329
+ //userId
330
+ let userId = get(tk, 'userId', '')
331
+ // console.log('userId', userId)
332
+
333
+ //us
334
+ let us = await woItems.users.select({ id: userId })
335
+ .catch((err) => {
336
+ errTemp = err
337
+ })
338
+
339
+ //check
340
+ if (errTemp) {
341
+ console.log(errTemp)
342
+ console.log(`userId`, userId)
343
+ console.log(`Failed to find user`)
344
+ return Promise.reject(`Failed to find user`)
345
+ }
346
+
347
+ //nus
348
+ let nus = size(us)
349
+
350
+ //check
351
+ if (nus === 0) {
352
+ console.log(`userId`, userId)
353
+ console.log(`can not find the user by userId`)
354
+ return Promise.reject(`can not find the user by userId`)
355
+ }
356
+
357
+ //check
358
+ if (nus >= 2) {
359
+ console.log(`userId`, userId)
360
+ console.log(`duplicate userId`)
361
+ return Promise.reject(`duplicate userId`)
362
+ }
363
+
364
+ //u
365
+ let u = get(us, 0, '')
366
+ // console.log('u', u)
367
+
368
+ //r
369
+ let r = {
370
+ account: u.account,
371
+ name: u.name,
372
+ email: u.email,
373
+ description: u.description,
374
+ from: u.from,
375
+ ruleGroupsIds: u.ruleGroupsIds,
376
+ redir: u.redir,
377
+ isAdmin: u.isAdmin,
378
+ token,
379
+ }
380
+
381
+ return r
382
+ }
383
+
384
+
385
+ //logOutByToken
386
+ let logOutByToken = async(token) => {
387
+ let errTemp = null
388
+
389
+ //tks
390
+ let tks = await woItems.tokens.select({ token })
391
+
392
+ //ntks
393
+ let ntks = size(tks)
394
+
395
+ //check
396
+ if (ntks === 0) {
397
+ console.log(`token`, token)
398
+ console.log(`can not find the token`)
399
+ return Promise.reject(`can not find the token`)
400
+ }
401
+
402
+ //check
403
+ if (ntks >= 2) {
404
+ console.log(`token`, token)
405
+ console.log(`duplicate tokens`)
406
+ return Promise.reject(`duplicate tokens`)
407
+ }
408
+
409
+ //tk
410
+ let tk = get(tks, 0, '')
411
+ // console.log('tk', tk)
412
+
413
+ //userId
414
+ let userId = get(tk, 'userId', '') //bbb 先保留userId供後續功能使用
415
+ // console.log('userId', userId)
416
+
417
+ //del
418
+ await woItems.tokens.del({ token })
419
+ .catch((err) => {
420
+ errTemp = err
421
+ })
422
+
423
+ //check
424
+ if (errTemp) {
425
+ console.log(errTemp)
426
+ console.log(`token`, token)
427
+ console.log(`Failed to delete key`)
428
+ return Promise.reject(`Failed to delete key`)
429
+ }
430
+
431
+ //bbb 待加入創建usersRecs儲存使用者登出紀錄
432
+
433
+ //bbb 待加入通知程序(訂閱者,監聽器)之使用者登出訊息
434
+
435
+ return true
436
+ }
437
+
438
+
439
+ //cleanTokens
440
+ let cleanTokens = async () => {
441
+
442
+ //tks
443
+ let tks = await woItems.tokens.select()
444
+ // console.log('tks', tks)
445
+
446
+ //tksDels
447
+ let tksDels = []
448
+ await pmSeries(tks, async (tk) => {
449
+
450
+ //checkTokenCore
451
+ let errTemp = null
452
+ await checkTokenCore(tk)
453
+ .catch((err) => {
454
+ errTemp = err
455
+ })
456
+
457
+ //check
458
+ if (errTemp) {
459
+ tksDels.push(tk)
460
+ }
461
+
462
+ })
463
+
464
+ //check
465
+ if (size(tksDels) > 0) {
466
+
467
+ await pmSeries(tks, async (tk) => {
468
+
469
+ //del
470
+ await woItems.tokens.del({ token: tk.token })
471
+ .catch(() => { })
472
+
473
+ //bbb 待加入創建usersRecs儲存使用者登出紀錄
474
+
475
+ //bbb 待加入通知程序(訂閱者,監聽器)之使用者登出訊息
476
+
477
+ })
478
+
479
+ }
480
+
481
+ }
482
+
483
+
484
+ //createUser
485
+ let createUser = async () => {
486
+ //bbb
487
+ }
488
+
489
+
490
+ //ModifyUser
491
+ let ModifyUser = async () => {
492
+ //bbb
493
+ }
494
+
495
+
496
+ //DeleteUser
497
+ let DeleteUser = async () => {
498
+ //bbb
499
+ }
500
+
501
+
502
+ //AuthUser
503
+ let AuthUser = async () => {
504
+ //bbb
505
+ }
506
+
507
+
508
+ //EmailUser
509
+ let EmailUser = async () => {
510
+ //bbb
511
+ }
512
+
513
+
514
+ //getUsersList
515
+ let getUsersList = async (token) => {
516
+ //bbb
517
+ // let rs = await woItems.users.select() //isActive為y或n都需要提供, 給前端編輯
518
+ // return rs
519
+ }
520
+
521
+
522
+ //p
523
+ let p = {
524
+ loginByAccountAndPassword,
525
+ checkToken,
526
+ refreshToken,
527
+ getUserByToken,
528
+ logOutByToken,
529
+ cleanTokens,
530
+ createUser,
531
+ ModifyUser,
532
+ DeleteUser,
533
+ AuthUser,
534
+ EmailUser,
535
+ getUsersList,
536
+ }
537
+
538
+
539
+ return p
540
+ }
541
+
542
+
543
+ export default proc
@@ -0,0 +1,68 @@
1
+ import axios from 'axios'
2
+ import ltdtpick from 'wsemi/src/ltdtpick.mjs'
3
+ import genPm from 'wsemi/src/genPm.mjs'
4
+
5
+
6
+ async function provideUsers(url, from, users) {
7
+ //url: 指權限伺服器提供的調整users網址, 例如 http://localhost:11007/syncAndReplaceUsers
8
+ //from: 指user來源
9
+
10
+ //pm
11
+ let pm = genPm()
12
+
13
+ //ks
14
+ let ks = [
15
+ 'id',
16
+ 'order',
17
+ 'name',
18
+ 'email',
19
+ 'description',
20
+ 'from',
21
+ 'ruleGroupsIds',
22
+ 'isAdmin',
23
+ 'userId',
24
+ 'timeCreate',
25
+ 'userIdUpdate',
26
+ 'timeUpdate',
27
+ 'isActive',
28
+ ]
29
+
30
+ //ltdtpick
31
+ users = ltdtpick(users, ks)
32
+
33
+ //rin
34
+ let rin = {
35
+ from,
36
+ users,
37
+ }
38
+ // rin = JSON.stringify(rin)
39
+
40
+ //axios
41
+ await axios({
42
+ method: 'post',
43
+ url,
44
+ headers: { 'Content-Type': 'application/json; charset=utf-8' },
45
+ data: rin,
46
+ })
47
+ .then((res) => {
48
+ // console.log(res)
49
+ let r = {
50
+ msg: '成功傳輸Users清單',
51
+ res,
52
+ }
53
+ pm.resolve(r)
54
+ })
55
+ .catch((err) => {
56
+ // console.log(err)
57
+ let r = {
58
+ msg: '無法傳輸Users清單',
59
+ res: err,
60
+ }
61
+ pm.reject(r)
62
+ })
63
+
64
+ return pm
65
+ }
66
+
67
+
68
+ export default provideUsers