w-web-perm 1.0.7 → 1.0.8

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.
@@ -64,7 +64,7 @@
64
64
 
65
65
 
66
66
 
67
- <h4 class="name" id="WWebPerm"><span class="type-signature"></span>new WWebPerm<span class="signature">(WOrm, url, db, getUserByToken, verifyUser, opt<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h4>
67
+ <h4 class="name" id="WWebPerm"><span class="type-signature"></span>new WWebPerm<span class="signature">(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h4>
68
68
 
69
69
 
70
70
 
@@ -80,7 +80,7 @@
80
80
 
81
81
  <dt class="tag-source">Source:</dt>
82
82
  <dd class="tag-source"><ul class="dummy"><li>
83
- <a href="WWebPerm.mjs.html">WWebPerm.mjs</a>, <a href="WWebPerm.mjs.html#line115">line 115</a>
83
+ <a href="WWebPerm.mjs.html">WWebPerm.mjs</a>, <a href="WWebPerm.mjs.html#line128">line 128</a>
84
84
  </li></ul></dd>
85
85
 
86
86
 
@@ -127,7 +127,7 @@
127
127
 
128
128
  <h5 class="h5-examples">Example</h5>
129
129
 
130
- <pre class="prettyprint"><code>import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
131
130
  bCheckUser: false,
132
131
  getUserById: null,
133
132
  bExcludeWhenNotAdmin: false,
134
133
  serverPort: 11006,
135
134
  subfolder: '', //mperm
136
135
  webName: {
137
136
  'eng': 'Permission Service',
138
137
  'cht': '權限管理系統',
139
138
  },
140
139
  webDescription: {
141
140
  'eng': 'A web service package for user permissions and management targets.',
142
141
  'cht': 'A web service package for user permissions and management targets.',
143
142
  },
144
143
  webLogo: 'data:image/svg+xml;base64,...',
145
144
  // return {} //測試無法登入
146
145
  if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
147
146
  return {
148
147
  id: 'id-for-application',
149
148
  name: 'application',
150
149
  email: 'admin@example.com',
151
150
  isAdmin: 'y',
152
151
  }
153
152
  }
154
153
  if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
155
154
  return {
156
155
  id: 'id-for-admin',
157
156
  name: 'tester',
158
157
  email: 'admin@example.com',
159
158
  isAdmin: 'y',
160
159
  }
161
160
  }
162
161
  console.log('invalid token', token)
163
162
  console.log('於生產環境時得加入SSO等驗證token機制')
164
163
  return {}
165
164
  console.log('於生產環境時得加入驗證user機制')
166
165
  return user.isAdmin === 'y' //測試僅系統管理者使用
167
166
  console.log(err)
167
+ <pre class="prettyprint"><code>import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
168
168
  bCheckUser: false,
169
169
  getUserById: null,
170
170
  bExcludeWhenNotAdmin: false,
171
171
  serverPort: 11006,
172
172
  subfolder: '', //mperm
173
173
  urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11006/
174
174
  webName: {
175
175
  'eng': 'Permission Service',
176
176
  'cht': '權限管理系統',
177
177
  },
178
178
  webDescription: {
179
179
  'eng': 'A web service package for user permissions and management targets.',
180
180
  'cht': 'A web service package for user permissions and management targets.',
181
181
  },
182
182
  webLogo: 'data:image/svg+xml;base64,...',
183
183
  // return {} //測試無法登入
184
184
  if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
185
185
  return {
186
186
  id: 'id-for-application',
187
187
  name: 'application',
188
188
  email: 'application@example.com',
189
189
  isAdmin: 'y',
190
190
  }
191
191
  }
192
192
  if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
193
193
  return {
194
194
  id: 'id-for-admin',
195
195
  name: 'tester',
196
196
  email: 'admin@example.com', //mappingBy為email, 開發階段時會使用email找到所建置之使用者資料
197
197
  isAdmin: 'y',
198
198
  }
199
199
  }
200
200
  console.log('invalid token', token)
201
201
  console.log('於生產環境時得加入SSO等驗證token機制')
202
202
  return {}
203
203
  console.log('verifyBrowserUser/user', user)
204
204
  // return false //測試無法登入
205
205
  console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
206
206
  return user.isAdmin === 'y' //測試僅系統管理者使用
207
207
  console.log('verifyAppUser/user', user)
208
208
  // return false //測試無法登入
209
209
  console.log('於生產環境時得加入限制應用程式使用者身份機制')
210
210
  return user.isAdmin === 'y' //測試僅系統管理者使用
211
211
  console.log(err)
212
212
 
213
213
 
214
214
 
@@ -305,7 +305,7 @@
305
305
 
306
306
  <tr>
307
307
 
308
- <td class="name"><code>verifyUser</code></td>
308
+ <td class="name"><code>verifyBrowserUser</code></td>
309
309
 
310
310
 
311
311
  <td class="type">
@@ -334,7 +334,43 @@
334
334
  </td>
335
335
 
336
336
 
337
- <td class="description last"><p>輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
337
+ <td class="description last"><p>輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
338
+ </tr>
339
+
340
+
341
+
342
+ <tr>
343
+
344
+ <td class="name"><code>verifyAppUser</code></td>
345
+
346
+
347
+ <td class="type">
348
+
349
+
350
+ <span class="param-type">function</span>
351
+
352
+
353
+
354
+
355
+ </td>
356
+
357
+
358
+ <td class="attributes">
359
+
360
+
361
+
362
+
363
+
364
+ </td>
365
+
366
+
367
+
368
+ <td class="default">
369
+
370
+ </td>
371
+
372
+
373
+ <td class="description last"><p>輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
338
374
  </tr>
339
375
 
340
376
 
@@ -889,7 +925,7 @@
889
925
  <br class="clear">
890
926
 
891
927
  <footer>
892
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 22:57:24 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
928
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 12:07:17 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
893
929
  </footer>
894
930
 
895
931
  <script>prettyPrint();</script>
@@ -79,7 +79,8 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
79
79
  * @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
80
80
  * @param {String} db 輸入資料庫名稱字串
81
81
  * @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
82
- * @param {Function} verifyUser 輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
82
+ * @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
83
+ * @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
83
84
  * @param {Object} [opt={}] 輸入設定物件,預設{}
84
85
  * @param {Integer} [opt.serverPort=11006] 輸入伺服器通訊port,預設11006
85
86
  * @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
@@ -93,10 +94,12 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
93
94
  * @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
94
95
  * @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
95
96
  * @example
97
+ *
96
98
  * import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
97
99
  * import WWebPerm from './server/WWebPerm.mjs'
98
100
  * import getSettings from './g.getSettings.mjs'
99
101
  *
102
+ *
100
103
  * //st
101
104
  * let st = getSettings()
102
105
  *
@@ -110,6 +113,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
110
113
  *
111
114
  * serverPort: 11006,
112
115
  * subfolder: '', //mperm
116
+ * urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11006/
113
117
  *
114
118
  * webName: {
115
119
  * 'eng': 'Permission Service',
@@ -129,7 +133,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
129
133
  * return {
130
134
  * id: 'id-for-application',
131
135
  * name: 'application',
132
- * email: 'admin@example.com',
136
+ * email: 'application@example.com',
133
137
  * isAdmin: 'y',
134
138
  * }
135
139
  * }
@@ -137,7 +141,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
137
141
  * return {
138
142
  * id: 'id-for-admin',
139
143
  * name: 'tester',
140
- * email: 'admin@example.com',
144
+ * email: 'admin@example.com', //mappingBy為email, 開發階段時會使用email找到所建置之使用者資料
141
145
  * isAdmin: 'y',
142
146
  * }
143
147
  * }
@@ -146,20 +150,29 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
146
150
  * return {}
147
151
  * }
148
152
  *
149
- * let verifyUser = (user) => {
150
- * console.log('於生產環境時得加入驗證user機制')
153
+ * let verifyBrowserUser = (user, caller) => {
154
+ * console.log('verifyBrowserUser/user', user)
155
+ * // return false //測試無法登入
156
+ * console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
157
+ * return user.isAdmin === 'y' //測試僅系統管理者使用
158
+ * }
159
+ *
160
+ * let verifyAppUser = (user, caller) => {
161
+ * console.log('verifyAppUser/user', user)
162
+ * // return false //測試無法登入
163
+ * console.log('於生產環境時得加入限制應用程式使用者身份機制')
151
164
  * return user.isAdmin === 'y' //測試僅系統管理者使用
152
165
  * }
153
166
  *
154
167
  * //WWebPerm
155
- * let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt)
168
+ * let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
156
169
  *
157
170
  * instWWebPerm.on('error', (err) => {
158
171
  * console.log(err)
159
172
  * })
160
173
  *
161
174
  */
162
- function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
175
+ function WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
163
176
  let instWServHapiServer = null
164
177
 
165
178
 
@@ -191,10 +204,17 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
191
204
  }
192
205
 
193
206
 
194
- //check verifyUser
195
- if (!isfun(verifyUser)) {
196
- console.log('invalid verifyUser', verifyUser)
197
- throw new Error('invalid verifyUser')
207
+ //check verifyBrowserUser
208
+ if (!isfun(verifyBrowserUser)) {
209
+ console.log('invalid verifyBrowserUser', verifyBrowserUser)
210
+ throw new Error('invalid verifyBrowserUser')
211
+ }
212
+
213
+
214
+ //check verifyAppUser
215
+ if (!isfun(verifyAppUser)) {
216
+ console.log('invalid verifyAppUser', verifyAppUser)
217
+ throw new Error('invalid verifyAppUser')
198
218
  }
199
219
 
200
220
 
@@ -312,8 +332,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
312
332
  }
313
333
 
314
334
 
315
- //getTokenUserForSelf
316
- let getTokenUserForSelf = async(token) => {
335
+ //getTokenUser
336
+ let getTokenUser = async(token) => {
317
337
 
318
338
  //userSelf
319
339
  let userSelf = null
@@ -394,8 +414,18 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
394
414
  }
395
415
  // console.log('userFind(isAdmin)', userFind)
396
416
 
397
- //verifyUser
398
- let b = verifyUser(userFind)
417
+ return userFind
418
+ }
419
+
420
+
421
+ //getAndVerifyBrowserTokenUser
422
+ let getAndVerifyBrowserTokenUser = async (token, caller = '') => {
423
+
424
+ //getTokenUser
425
+ let userSelf = await getTokenUser(token)
426
+
427
+ //verifyBrowserUser
428
+ let b = verifyBrowserUser(userSelf, caller)
399
429
  if (ispm(b)) {
400
430
  b = await b
401
431
  }
@@ -403,12 +433,34 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
403
433
  //check
404
434
  if (!b) {
405
435
  console.log('userSelf', userSelf)
406
- console.log('userFind', userFind)
407
- console.log('user does not have permission')
436
+ console.log(`user does not have permission`)
408
437
  return Promise.reject(`user does not have permission`)
409
438
  }
410
439
 
411
- return userFind
440
+ return userSelf
441
+ }
442
+
443
+
444
+ //getAndVerifyAppTokenUser
445
+ let getAndVerifyAppTokenUser = async (token, caller = '') => {
446
+
447
+ //getTokenUser
448
+ let userSelf = await getTokenUser(token)
449
+
450
+ //verifyAppUser
451
+ let b = verifyAppUser(userSelf, caller)
452
+ if (ispm(b)) {
453
+ b = await b
454
+ }
455
+
456
+ //check
457
+ if (!b) {
458
+ console.log('userSelf', userSelf)
459
+ console.log(`user does not have permission`)
460
+ return Promise.reject(`user does not have permission`)
461
+ }
462
+
463
+ return userSelf
412
464
  }
413
465
 
414
466
 
@@ -636,14 +688,14 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
636
688
  // console.log('getUserByToken', req)
637
689
 
638
690
  async function core() {
639
- //提供對象為browser使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 確認後回傳該使用者(系統管理員)資訊物件
691
+ //提供對象為browser使用者, 須先檢測token是否有效, 確認後回傳該使用者之資訊物件
640
692
 
641
693
  //token
642
694
  let token = get(req, 'query.token', '')
643
695
  // console.log('token', token)
644
696
 
645
- //getGenUserByUserId
646
- let userSelf = await getTokenUserForSelf(token)
697
+ //getAndVerifyBrowserTokenUser
698
+ let userSelf = await getAndVerifyBrowserTokenUser(token)
647
699
  // console.log('userSelf', userSelf)
648
700
 
649
701
  //check
@@ -654,11 +706,6 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
654
706
  return Promise.reject(`token does not have permission`)
655
707
  }
656
708
 
657
- // //check
658
- // if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
659
- // return Promise.reject(`user does not have permission`)
660
- // }
661
-
662
709
  return userSelf
663
710
  }
664
711
 
@@ -676,14 +723,14 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
676
723
  // console.log('getPerm', req)
677
724
 
678
725
  async function core() {
679
- //提供對象為node與browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者權限資訊物件
726
+ //提供對象為node與browser使用者, node實際也為轉發之browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者之權限資訊物件
680
727
 
681
728
  //parseToken
682
729
  let token = parseToken(req)
683
730
  // console.log('token', token)
684
731
 
685
- //getGenUserByUserId
686
- let userLogin = await getTokenUserForSelf(token)
732
+ //getAndVerifyBrowserTokenUser
733
+ let userLogin = await getAndVerifyBrowserTokenUser(token)
687
734
  // console.log('userLogin', userLogin)
688
735
 
689
736
  //check
@@ -735,14 +782,14 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
735
782
  // console.log('getPermById', req)
736
783
 
737
784
  async function core() {
738
- //提供對象為node使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
785
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
739
786
 
740
787
  //token
741
788
  let token = get(req, 'query.token', '')
742
789
  // console.log('token', token)
743
790
 
744
- //getGenUserByUserId
745
- let userSelf = await getTokenUserForSelf(token)
791
+ //getAndVerifyAppTokenUser
792
+ let userSelf = await getAndVerifyAppTokenUser(token, 'getPermById')
746
793
  // console.log('userSelf', userSelf)
747
794
 
748
795
  //check
@@ -753,11 +800,6 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
753
800
  return Promise.reject(`token does not have permission`)
754
801
  }
755
802
 
756
- // //check
757
- // if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
758
- // return Promise.reject(`user does not have permission`)
759
- // }
760
-
761
803
  //userId
762
804
  let userId = get(req, 'query.userId', '')
763
805
  // console.log('userId', userId)
@@ -792,12 +834,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
792
834
  // console.log('payload', req.payload)
793
835
 
794
836
  async function core() {
837
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
795
838
 
796
839
  //token
797
840
  let token = get(req, 'query.token', '')
798
841
 
799
- //getTokenUserForSelf
800
- let user = await getTokenUserForSelf(token)
842
+ //getAndVerifyAppTokenUser
843
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceUsers')
801
844
 
802
845
  //check
803
846
  if (!iseobj(user)) {
@@ -831,12 +874,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
831
874
  // console.log('payload', req.payload)
832
875
 
833
876
  async function core() {
877
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
834
878
 
835
879
  //token
836
880
  let token = get(req, 'query.token', '')
837
881
 
838
- //getTokenUserForSelf
839
- let user = await getTokenUserForSelf(token)
882
+ //getAndVerifyAppTokenUser
883
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceTargets')
840
884
 
841
885
  //check
842
886
  if (!iseobj(user)) {
@@ -870,12 +914,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
870
914
  // console.log('payload', req.payload)
871
915
 
872
916
  async function core() {
917
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
873
918
 
874
919
  //token
875
920
  let token = get(req, 'query.token', '')
876
921
 
877
- //getTokenUserForSelf
878
- let user = await getTokenUserForSelf(token)
922
+ //getAndVerifyAppTokenUser
923
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceRuleGroups')
879
924
 
880
925
  //check
881
926
  if (!iseobj(user)) {
@@ -958,7 +1003,7 @@ export default WWebPerm
958
1003
  <br class="clear">
959
1004
 
960
1005
  <footer>
961
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 22:57:24 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1006
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 12:07:17 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
962
1007
  </footer>
963
1008
 
964
1009
  <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.2</a> on Thu Nov 02 2023 22:57:24 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.2</a> on Fri Nov 03 2023 12:07:17 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-web-perm",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "main": "dist/w-web-perm.umd.js",
5
5
  "dependencies": {
6
6
  "@mdi/js": "^7.2.96",
@@ -12,7 +12,7 @@
12
12
  "w-data-collector": "^1.0.19",
13
13
  "w-serv-hapi": "^1.0.11",
14
14
  "w-serv-orm": "^1.0.7",
15
- "w-ui-loginout": "^1.0.4",
15
+ "w-ui-loginout": "^1.0.5",
16
16
  "wsemi": "^1.7.38"
17
17
  },
18
18
  "devDependencies": {