@hitchy/plugin-auth 0.2.0 → 0.3.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 (66) hide show
  1. package/.gitlab-ci.yml +42 -21
  2. package/LICENSE +21 -0
  3. package/api/controller/user.js +2 -29
  4. package/api/model/authorization/rule.js +0 -27
  5. package/api/model/role.js +0 -28
  6. package/api/model/user-to-role.js +0 -28
  7. package/api/model/user.js +2 -30
  8. package/api/policy/authentication.js +67 -64
  9. package/api/policy/authorization.js +0 -28
  10. package/api/policy/user.js +0 -28
  11. package/api/service/auth/manager.js +9 -28
  12. package/api/service/authentication/passport.js +1 -29
  13. package/api/service/authentication/strategies.js +176 -27
  14. package/api/service/authorization/node.js +0 -28
  15. package/api/service/authorization/policy-generator.js +0 -28
  16. package/api/service/authorization/tree.js +0 -28
  17. package/config/auth.js +5 -0
  18. package/coverage/base.css +224 -0
  19. package/coverage/block-navigation.js +79 -0
  20. package/coverage/favicon.png +0 -0
  21. package/coverage/index.html +231 -0
  22. package/coverage/plugin-auth/api/controller/index.html +111 -0
  23. package/coverage/plugin-auth/api/controller/user.js.html +368 -0
  24. package/coverage/plugin-auth/api/model/authorization/index.html +111 -0
  25. package/coverage/plugin-auth/api/model/authorization/rule.js.html +227 -0
  26. package/coverage/plugin-auth/api/model/index.html +141 -0
  27. package/coverage/plugin-auth/api/model/role.js.html +200 -0
  28. package/coverage/plugin-auth/api/model/user-to-role.js.html +167 -0
  29. package/coverage/plugin-auth/api/model/user.js.html +752 -0
  30. package/coverage/plugin-auth/api/policy/authentication.js.html +617 -0
  31. package/coverage/plugin-auth/api/policy/authorization.js.html +182 -0
  32. package/coverage/plugin-auth/api/policy/index.html +141 -0
  33. package/coverage/plugin-auth/api/policy/user.js.html +479 -0
  34. package/coverage/plugin-auth/api/service/auth/index.html +111 -0
  35. package/coverage/plugin-auth/api/service/auth/manager.js.html +863 -0
  36. package/coverage/plugin-auth/api/service/authentication/index.html +126 -0
  37. package/coverage/plugin-auth/api/service/authentication/passport.js.html +290 -0
  38. package/coverage/plugin-auth/api/service/authentication/strategies.js.html +860 -0
  39. package/coverage/plugin-auth/api/service/authorization/index.html +141 -0
  40. package/coverage/plugin-auth/api/service/authorization/node.js.html +944 -0
  41. package/coverage/plugin-auth/api/service/authorization/policy-generator.js.html +386 -0
  42. package/coverage/plugin-auth/api/service/authorization/tree.js.html +983 -0
  43. package/coverage/plugin-auth/config/auth.js.html +140 -0
  44. package/coverage/plugin-auth/config/index.html +111 -0
  45. package/coverage/plugin-auth/index.html +111 -0
  46. package/coverage/plugin-auth/index.js.html +344 -0
  47. package/coverage/prettify.css +1 -0
  48. package/coverage/prettify.js +2 -0
  49. package/coverage/sort-arrow-sprite.png +0 -0
  50. package/coverage/sorter.js +170 -0
  51. package/coverage/tmp/coverage-6744-1648396809135-0.json +1 -0
  52. package/docs/.vuepress/config.js +5 -2
  53. package/docs/api/config.md +14 -2
  54. package/docs/api/model/authorization-rule.md +1 -1
  55. package/docs/api/model/user.md +2 -2
  56. package/docs/api/service/authentication-passport.md +1 -1
  57. package/docs/guides/getting-started.md +2 -2
  58. package/docs/guides/idp-login.png +0 -0
  59. package/docs/guides/idp-saml-cert.png +0 -0
  60. package/docs/guides/openid-connect.md +164 -0
  61. package/docs/guides/readme.md +2 -0
  62. package/docs/guides/saml.md +161 -0
  63. package/docs/introduction.md +5 -5
  64. package/index.js +27 -50
  65. package/package.json +18 -13
  66. package/readme.md +11 -43
@@ -0,0 +1,863 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for plugin-auth/api/service/auth/manager.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">plugin-auth/api/service/auth</a> manager.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">96.55% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>252/261</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">90.32% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>56/62</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>9/9</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">96.55% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>252/261</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ </div>
58
+ <div class='status-line high'></div>
59
+ <pre><table class="coverage">
60
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
+ <a name='L2'></a><a href='#L2'>2</a>
62
+ <a name='L3'></a><a href='#L3'>3</a>
63
+ <a name='L4'></a><a href='#L4'>4</a>
64
+ <a name='L5'></a><a href='#L5'>5</a>
65
+ <a name='L6'></a><a href='#L6'>6</a>
66
+ <a name='L7'></a><a href='#L7'>7</a>
67
+ <a name='L8'></a><a href='#L8'>8</a>
68
+ <a name='L9'></a><a href='#L9'>9</a>
69
+ <a name='L10'></a><a href='#L10'>10</a>
70
+ <a name='L11'></a><a href='#L11'>11</a>
71
+ <a name='L12'></a><a href='#L12'>12</a>
72
+ <a name='L13'></a><a href='#L13'>13</a>
73
+ <a name='L14'></a><a href='#L14'>14</a>
74
+ <a name='L15'></a><a href='#L15'>15</a>
75
+ <a name='L16'></a><a href='#L16'>16</a>
76
+ <a name='L17'></a><a href='#L17'>17</a>
77
+ <a name='L18'></a><a href='#L18'>18</a>
78
+ <a name='L19'></a><a href='#L19'>19</a>
79
+ <a name='L20'></a><a href='#L20'>20</a>
80
+ <a name='L21'></a><a href='#L21'>21</a>
81
+ <a name='L22'></a><a href='#L22'>22</a>
82
+ <a name='L23'></a><a href='#L23'>23</a>
83
+ <a name='L24'></a><a href='#L24'>24</a>
84
+ <a name='L25'></a><a href='#L25'>25</a>
85
+ <a name='L26'></a><a href='#L26'>26</a>
86
+ <a name='L27'></a><a href='#L27'>27</a>
87
+ <a name='L28'></a><a href='#L28'>28</a>
88
+ <a name='L29'></a><a href='#L29'>29</a>
89
+ <a name='L30'></a><a href='#L30'>30</a>
90
+ <a name='L31'></a><a href='#L31'>31</a>
91
+ <a name='L32'></a><a href='#L32'>32</a>
92
+ <a name='L33'></a><a href='#L33'>33</a>
93
+ <a name='L34'></a><a href='#L34'>34</a>
94
+ <a name='L35'></a><a href='#L35'>35</a>
95
+ <a name='L36'></a><a href='#L36'>36</a>
96
+ <a name='L37'></a><a href='#L37'>37</a>
97
+ <a name='L38'></a><a href='#L38'>38</a>
98
+ <a name='L39'></a><a href='#L39'>39</a>
99
+ <a name='L40'></a><a href='#L40'>40</a>
100
+ <a name='L41'></a><a href='#L41'>41</a>
101
+ <a name='L42'></a><a href='#L42'>42</a>
102
+ <a name='L43'></a><a href='#L43'>43</a>
103
+ <a name='L44'></a><a href='#L44'>44</a>
104
+ <a name='L45'></a><a href='#L45'>45</a>
105
+ <a name='L46'></a><a href='#L46'>46</a>
106
+ <a name='L47'></a><a href='#L47'>47</a>
107
+ <a name='L48'></a><a href='#L48'>48</a>
108
+ <a name='L49'></a><a href='#L49'>49</a>
109
+ <a name='L50'></a><a href='#L50'>50</a>
110
+ <a name='L51'></a><a href='#L51'>51</a>
111
+ <a name='L52'></a><a href='#L52'>52</a>
112
+ <a name='L53'></a><a href='#L53'>53</a>
113
+ <a name='L54'></a><a href='#L54'>54</a>
114
+ <a name='L55'></a><a href='#L55'>55</a>
115
+ <a name='L56'></a><a href='#L56'>56</a>
116
+ <a name='L57'></a><a href='#L57'>57</a>
117
+ <a name='L58'></a><a href='#L58'>58</a>
118
+ <a name='L59'></a><a href='#L59'>59</a>
119
+ <a name='L60'></a><a href='#L60'>60</a>
120
+ <a name='L61'></a><a href='#L61'>61</a>
121
+ <a name='L62'></a><a href='#L62'>62</a>
122
+ <a name='L63'></a><a href='#L63'>63</a>
123
+ <a name='L64'></a><a href='#L64'>64</a>
124
+ <a name='L65'></a><a href='#L65'>65</a>
125
+ <a name='L66'></a><a href='#L66'>66</a>
126
+ <a name='L67'></a><a href='#L67'>67</a>
127
+ <a name='L68'></a><a href='#L68'>68</a>
128
+ <a name='L69'></a><a href='#L69'>69</a>
129
+ <a name='L70'></a><a href='#L70'>70</a>
130
+ <a name='L71'></a><a href='#L71'>71</a>
131
+ <a name='L72'></a><a href='#L72'>72</a>
132
+ <a name='L73'></a><a href='#L73'>73</a>
133
+ <a name='L74'></a><a href='#L74'>74</a>
134
+ <a name='L75'></a><a href='#L75'>75</a>
135
+ <a name='L76'></a><a href='#L76'>76</a>
136
+ <a name='L77'></a><a href='#L77'>77</a>
137
+ <a name='L78'></a><a href='#L78'>78</a>
138
+ <a name='L79'></a><a href='#L79'>79</a>
139
+ <a name='L80'></a><a href='#L80'>80</a>
140
+ <a name='L81'></a><a href='#L81'>81</a>
141
+ <a name='L82'></a><a href='#L82'>82</a>
142
+ <a name='L83'></a><a href='#L83'>83</a>
143
+ <a name='L84'></a><a href='#L84'>84</a>
144
+ <a name='L85'></a><a href='#L85'>85</a>
145
+ <a name='L86'></a><a href='#L86'>86</a>
146
+ <a name='L87'></a><a href='#L87'>87</a>
147
+ <a name='L88'></a><a href='#L88'>88</a>
148
+ <a name='L89'></a><a href='#L89'>89</a>
149
+ <a name='L90'></a><a href='#L90'>90</a>
150
+ <a name='L91'></a><a href='#L91'>91</a>
151
+ <a name='L92'></a><a href='#L92'>92</a>
152
+ <a name='L93'></a><a href='#L93'>93</a>
153
+ <a name='L94'></a><a href='#L94'>94</a>
154
+ <a name='L95'></a><a href='#L95'>95</a>
155
+ <a name='L96'></a><a href='#L96'>96</a>
156
+ <a name='L97'></a><a href='#L97'>97</a>
157
+ <a name='L98'></a><a href='#L98'>98</a>
158
+ <a name='L99'></a><a href='#L99'>99</a>
159
+ <a name='L100'></a><a href='#L100'>100</a>
160
+ <a name='L101'></a><a href='#L101'>101</a>
161
+ <a name='L102'></a><a href='#L102'>102</a>
162
+ <a name='L103'></a><a href='#L103'>103</a>
163
+ <a name='L104'></a><a href='#L104'>104</a>
164
+ <a name='L105'></a><a href='#L105'>105</a>
165
+ <a name='L106'></a><a href='#L106'>106</a>
166
+ <a name='L107'></a><a href='#L107'>107</a>
167
+ <a name='L108'></a><a href='#L108'>108</a>
168
+ <a name='L109'></a><a href='#L109'>109</a>
169
+ <a name='L110'></a><a href='#L110'>110</a>
170
+ <a name='L111'></a><a href='#L111'>111</a>
171
+ <a name='L112'></a><a href='#L112'>112</a>
172
+ <a name='L113'></a><a href='#L113'>113</a>
173
+ <a name='L114'></a><a href='#L114'>114</a>
174
+ <a name='L115'></a><a href='#L115'>115</a>
175
+ <a name='L116'></a><a href='#L116'>116</a>
176
+ <a name='L117'></a><a href='#L117'>117</a>
177
+ <a name='L118'></a><a href='#L118'>118</a>
178
+ <a name='L119'></a><a href='#L119'>119</a>
179
+ <a name='L120'></a><a href='#L120'>120</a>
180
+ <a name='L121'></a><a href='#L121'>121</a>
181
+ <a name='L122'></a><a href='#L122'>122</a>
182
+ <a name='L123'></a><a href='#L123'>123</a>
183
+ <a name='L124'></a><a href='#L124'>124</a>
184
+ <a name='L125'></a><a href='#L125'>125</a>
185
+ <a name='L126'></a><a href='#L126'>126</a>
186
+ <a name='L127'></a><a href='#L127'>127</a>
187
+ <a name='L128'></a><a href='#L128'>128</a>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
207
+ <a name='L148'></a><a href='#L148'>148</a>
208
+ <a name='L149'></a><a href='#L149'>149</a>
209
+ <a name='L150'></a><a href='#L150'>150</a>
210
+ <a name='L151'></a><a href='#L151'>151</a>
211
+ <a name='L152'></a><a href='#L152'>152</a>
212
+ <a name='L153'></a><a href='#L153'>153</a>
213
+ <a name='L154'></a><a href='#L154'>154</a>
214
+ <a name='L155'></a><a href='#L155'>155</a>
215
+ <a name='L156'></a><a href='#L156'>156</a>
216
+ <a name='L157'></a><a href='#L157'>157</a>
217
+ <a name='L158'></a><a href='#L158'>158</a>
218
+ <a name='L159'></a><a href='#L159'>159</a>
219
+ <a name='L160'></a><a href='#L160'>160</a>
220
+ <a name='L161'></a><a href='#L161'>161</a>
221
+ <a name='L162'></a><a href='#L162'>162</a>
222
+ <a name='L163'></a><a href='#L163'>163</a>
223
+ <a name='L164'></a><a href='#L164'>164</a>
224
+ <a name='L165'></a><a href='#L165'>165</a>
225
+ <a name='L166'></a><a href='#L166'>166</a>
226
+ <a name='L167'></a><a href='#L167'>167</a>
227
+ <a name='L168'></a><a href='#L168'>168</a>
228
+ <a name='L169'></a><a href='#L169'>169</a>
229
+ <a name='L170'></a><a href='#L170'>170</a>
230
+ <a name='L171'></a><a href='#L171'>171</a>
231
+ <a name='L172'></a><a href='#L172'>172</a>
232
+ <a name='L173'></a><a href='#L173'>173</a>
233
+ <a name='L174'></a><a href='#L174'>174</a>
234
+ <a name='L175'></a><a href='#L175'>175</a>
235
+ <a name='L176'></a><a href='#L176'>176</a>
236
+ <a name='L177'></a><a href='#L177'>177</a>
237
+ <a name='L178'></a><a href='#L178'>178</a>
238
+ <a name='L179'></a><a href='#L179'>179</a>
239
+ <a name='L180'></a><a href='#L180'>180</a>
240
+ <a name='L181'></a><a href='#L181'>181</a>
241
+ <a name='L182'></a><a href='#L182'>182</a>
242
+ <a name='L183'></a><a href='#L183'>183</a>
243
+ <a name='L184'></a><a href='#L184'>184</a>
244
+ <a name='L185'></a><a href='#L185'>185</a>
245
+ <a name='L186'></a><a href='#L186'>186</a>
246
+ <a name='L187'></a><a href='#L187'>187</a>
247
+ <a name='L188'></a><a href='#L188'>188</a>
248
+ <a name='L189'></a><a href='#L189'>189</a>
249
+ <a name='L190'></a><a href='#L190'>190</a>
250
+ <a name='L191'></a><a href='#L191'>191</a>
251
+ <a name='L192'></a><a href='#L192'>192</a>
252
+ <a name='L193'></a><a href='#L193'>193</a>
253
+ <a name='L194'></a><a href='#L194'>194</a>
254
+ <a name='L195'></a><a href='#L195'>195</a>
255
+ <a name='L196'></a><a href='#L196'>196</a>
256
+ <a name='L197'></a><a href='#L197'>197</a>
257
+ <a name='L198'></a><a href='#L198'>198</a>
258
+ <a name='L199'></a><a href='#L199'>199</a>
259
+ <a name='L200'></a><a href='#L200'>200</a>
260
+ <a name='L201'></a><a href='#L201'>201</a>
261
+ <a name='L202'></a><a href='#L202'>202</a>
262
+ <a name='L203'></a><a href='#L203'>203</a>
263
+ <a name='L204'></a><a href='#L204'>204</a>
264
+ <a name='L205'></a><a href='#L205'>205</a>
265
+ <a name='L206'></a><a href='#L206'>206</a>
266
+ <a name='L207'></a><a href='#L207'>207</a>
267
+ <a name='L208'></a><a href='#L208'>208</a>
268
+ <a name='L209'></a><a href='#L209'>209</a>
269
+ <a name='L210'></a><a href='#L210'>210</a>
270
+ <a name='L211'></a><a href='#L211'>211</a>
271
+ <a name='L212'></a><a href='#L212'>212</a>
272
+ <a name='L213'></a><a href='#L213'>213</a>
273
+ <a name='L214'></a><a href='#L214'>214</a>
274
+ <a name='L215'></a><a href='#L215'>215</a>
275
+ <a name='L216'></a><a href='#L216'>216</a>
276
+ <a name='L217'></a><a href='#L217'>217</a>
277
+ <a name='L218'></a><a href='#L218'>218</a>
278
+ <a name='L219'></a><a href='#L219'>219</a>
279
+ <a name='L220'></a><a href='#L220'>220</a>
280
+ <a name='L221'></a><a href='#L221'>221</a>
281
+ <a name='L222'></a><a href='#L222'>222</a>
282
+ <a name='L223'></a><a href='#L223'>223</a>
283
+ <a name='L224'></a><a href='#L224'>224</a>
284
+ <a name='L225'></a><a href='#L225'>225</a>
285
+ <a name='L226'></a><a href='#L226'>226</a>
286
+ <a name='L227'></a><a href='#L227'>227</a>
287
+ <a name='L228'></a><a href='#L228'>228</a>
288
+ <a name='L229'></a><a href='#L229'>229</a>
289
+ <a name='L230'></a><a href='#L230'>230</a>
290
+ <a name='L231'></a><a href='#L231'>231</a>
291
+ <a name='L232'></a><a href='#L232'>232</a>
292
+ <a name='L233'></a><a href='#L233'>233</a>
293
+ <a name='L234'></a><a href='#L234'>234</a>
294
+ <a name='L235'></a><a href='#L235'>235</a>
295
+ <a name='L236'></a><a href='#L236'>236</a>
296
+ <a name='L237'></a><a href='#L237'>237</a>
297
+ <a name='L238'></a><a href='#L238'>238</a>
298
+ <a name='L239'></a><a href='#L239'>239</a>
299
+ <a name='L240'></a><a href='#L240'>240</a>
300
+ <a name='L241'></a><a href='#L241'>241</a>
301
+ <a name='L242'></a><a href='#L242'>242</a>
302
+ <a name='L243'></a><a href='#L243'>243</a>
303
+ <a name='L244'></a><a href='#L244'>244</a>
304
+ <a name='L245'></a><a href='#L245'>245</a>
305
+ <a name='L246'></a><a href='#L246'>246</a>
306
+ <a name='L247'></a><a href='#L247'>247</a>
307
+ <a name='L248'></a><a href='#L248'>248</a>
308
+ <a name='L249'></a><a href='#L249'>249</a>
309
+ <a name='L250'></a><a href='#L250'>250</a>
310
+ <a name='L251'></a><a href='#L251'>251</a>
311
+ <a name='L252'></a><a href='#L252'>252</a>
312
+ <a name='L253'></a><a href='#L253'>253</a>
313
+ <a name='L254'></a><a href='#L254'>254</a>
314
+ <a name='L255'></a><a href='#L255'>255</a>
315
+ <a name='L256'></a><a href='#L256'>256</a>
316
+ <a name='L257'></a><a href='#L257'>257</a>
317
+ <a name='L258'></a><a href='#L258'>258</a>
318
+ <a name='L259'></a><a href='#L259'>259</a>
319
+ <a name='L260'></a><a href='#L260'>260</a>
320
+ <a name='L261'></a><a href='#L261'>261</a>
321
+ <a name='L262'></a><a href='#L262'>262</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
322
+ <span class="cline-any cline-yes">1x</span>
323
+ <span class="cline-any cline-yes">1x</span>
324
+ <span class="cline-any cline-yes">18x</span>
325
+ <span class="cline-any cline-yes">18x</span>
326
+ <span class="cline-any cline-yes">18x</span>
327
+ <span class="cline-any cline-yes">18x</span>
328
+ <span class="cline-any cline-yes">18x</span>
329
+ <span class="cline-any cline-yes">18x</span>
330
+ <span class="cline-any cline-yes">18x</span>
331
+ <span class="cline-any cline-yes">18x</span>
332
+ <span class="cline-any cline-yes">18x</span>
333
+ <span class="cline-any cline-yes">18x</span>
334
+ <span class="cline-any cline-yes">18x</span>
335
+ <span class="cline-any cline-yes">18x</span>
336
+ <span class="cline-any cline-yes">18x</span>
337
+ <span class="cline-any cline-yes">18x</span>
338
+ <span class="cline-any cline-yes">18x</span>
339
+ <span class="cline-any cline-yes">18x</span>
340
+ <span class="cline-any cline-yes">18x</span>
341
+ <span class="cline-any cline-yes">18x</span>
342
+ <span class="cline-any cline-yes">107x</span>
343
+ <span class="cline-any cline-no">&nbsp;</span>
344
+ <span class="cline-any cline-no">&nbsp;</span>
345
+ <span class="cline-any cline-yes">107x</span>
346
+ <span class="cline-any cline-yes">107x</span>
347
+ <span class="cline-any cline-yes">107x</span>
348
+ <span class="cline-any cline-yes">31x</span>
349
+ <span class="cline-any cline-yes">107x</span>
350
+ <span class="cline-any cline-yes">31x</span>
351
+ <span class="cline-any cline-yes">107x</span>
352
+ <span class="cline-any cline-yes">93x</span>
353
+ <span class="cline-any cline-yes">93x</span>
354
+ <span class="cline-any cline-yes">14x</span>
355
+ <span class="cline-any cline-yes">107x</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-yes">14x</span>
359
+ <span class="cline-any cline-yes">107x</span>
360
+ <span class="cline-any cline-yes">4x</span>
361
+ <span class="cline-any cline-yes">4x</span>
362
+ <span class="cline-any cline-yes">10x</span>
363
+ <span class="cline-any cline-yes">10x</span>
364
+ <span class="cline-any cline-yes">10x</span>
365
+ <span class="cline-any cline-yes">107x</span>
366
+ <span class="cline-any cline-yes">107x</span>
367
+ <span class="cline-any cline-yes">107x</span>
368
+ <span class="cline-any cline-yes">107x</span>
369
+ <span class="cline-any cline-yes">18x</span>
370
+ <span class="cline-any cline-yes">18x</span>
371
+ <span class="cline-any cline-yes">18x</span>
372
+ <span class="cline-any cline-yes">18x</span>
373
+ <span class="cline-any cline-yes">18x</span>
374
+ <span class="cline-any cline-yes">18x</span>
375
+ <span class="cline-any cline-yes">18x</span>
376
+ <span class="cline-any cline-yes">18x</span>
377
+ <span class="cline-any cline-yes">18x</span>
378
+ <span class="cline-any cline-yes">18x</span>
379
+ <span class="cline-any cline-yes">120x</span>
380
+ <span class="cline-any cline-no">&nbsp;</span>
381
+ <span class="cline-any cline-no">&nbsp;</span>
382
+ <span class="cline-any cline-yes">120x</span>
383
+ <span class="cline-any cline-yes">120x</span>
384
+ <span class="cline-any cline-yes">120x</span>
385
+ <span class="cline-any cline-yes">120x</span>
386
+ <span class="cline-any cline-yes">74x</span>
387
+ <span class="cline-any cline-yes">74x</span>
388
+ <span class="cline-any cline-yes">74x</span>
389
+ <span class="cline-any cline-yes">2x</span>
390
+ <span class="cline-any cline-yes">2x</span>
391
+ <span class="cline-any cline-yes">74x</span>
392
+ <span class="cline-any cline-yes">118x</span>
393
+ <span class="cline-any cline-yes">120x</span>
394
+ <span class="cline-any cline-yes">72x</span>
395
+ <span class="cline-any cline-yes">120x</span>
396
+ <span class="cline-any cline-yes">72x</span>
397
+ <span class="cline-any cline-yes">120x</span>
398
+ <span class="cline-any cline-yes">73x</span>
399
+ <span class="cline-any cline-yes">73x</span>
400
+ <span class="cline-any cline-yes">45x</span>
401
+ <span class="cline-any cline-yes">120x</span>
402
+ <span class="cline-any cline-no">&nbsp;</span>
403
+ <span class="cline-any cline-no">&nbsp;</span>
404
+ <span class="cline-any cline-yes">45x</span>
405
+ <span class="cline-any cline-yes">120x</span>
406
+ <span class="cline-any cline-yes">2x</span>
407
+ <span class="cline-any cline-yes">2x</span>
408
+ <span class="cline-any cline-yes">43x</span>
409
+ <span class="cline-any cline-yes">43x</span>
410
+ <span class="cline-any cline-yes">43x</span>
411
+ <span class="cline-any cline-yes">120x</span>
412
+ <span class="cline-any cline-yes">120x</span>
413
+ <span class="cline-any cline-yes">120x</span>
414
+ <span class="cline-any cline-yes">120x</span>
415
+ <span class="cline-any cline-yes">18x</span>
416
+ <span class="cline-any cline-yes">18x</span>
417
+ <span class="cline-any cline-yes">18x</span>
418
+ <span class="cline-any cline-yes">18x</span>
419
+ <span class="cline-any cline-yes">18x</span>
420
+ <span class="cline-any cline-yes">18x</span>
421
+ <span class="cline-any cline-yes">18x</span>
422
+ <span class="cline-any cline-yes">18x</span>
423
+ <span class="cline-any cline-yes">18x</span>
424
+ <span class="cline-any cline-yes">18x</span>
425
+ <span class="cline-any cline-yes">48x</span>
426
+ <span class="cline-any cline-yes">48x</span>
427
+ <span class="cline-any cline-yes">48x</span>
428
+ <span class="cline-any cline-yes">48x</span>
429
+ <span class="cline-any cline-yes">48x</span>
430
+ <span class="cline-any cline-yes">48x</span>
431
+ <span class="cline-any cline-yes">48x</span>
432
+ <span class="cline-any cline-yes">48x</span>
433
+ <span class="cline-any cline-yes">37x</span>
434
+ <span class="cline-any cline-yes">37x</span>
435
+ <span class="cline-any cline-yes">37x</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
437
+ <span class="cline-any cline-yes">37x</span>
438
+ <span class="cline-any cline-yes">37x</span>
439
+ <span class="cline-any cline-yes">37x</span>
440
+ <span class="cline-any cline-yes">37x</span>
441
+ <span class="cline-any cline-yes">48x</span>
442
+ <span class="cline-any cline-yes">48x</span>
443
+ <span class="cline-any cline-yes">48x</span>
444
+ <span class="cline-any cline-yes">18x</span>
445
+ <span class="cline-any cline-yes">18x</span>
446
+ <span class="cline-any cline-yes">18x</span>
447
+ <span class="cline-any cline-yes">18x</span>
448
+ <span class="cline-any cline-yes">18x</span>
449
+ <span class="cline-any cline-yes">18x</span>
450
+ <span class="cline-any cline-yes">18x</span>
451
+ <span class="cline-any cline-yes">18x</span>
452
+ <span class="cline-any cline-yes">18x</span>
453
+ <span class="cline-any cline-yes">18x</span>
454
+ <span class="cline-any cline-yes">26x</span>
455
+ <span class="cline-any cline-yes">25x</span>
456
+ <span class="cline-any cline-yes">25x</span>
457
+ <span class="cline-any cline-yes">25x</span>
458
+ <span class="cline-any cline-yes">25x</span>
459
+ <span class="cline-any cline-yes">25x</span>
460
+ <span class="cline-any cline-yes">25x</span>
461
+ <span class="cline-any cline-yes">26x</span>
462
+ <span class="cline-any cline-yes">8x</span>
463
+ <span class="cline-any cline-yes">8x</span>
464
+ <span class="cline-any cline-yes">8x</span>
465
+ <span class="cline-any cline-yes">2x</span>
466
+ <span class="cline-any cline-yes">8x</span>
467
+ <span class="cline-any cline-yes">6x</span>
468
+ <span class="cline-any cline-yes">6x</span>
469
+ <span class="cline-any cline-yes">8x</span>
470
+ <span class="cline-any cline-yes">25x</span>
471
+ <span class="cline-any cline-yes">26x</span>
472
+ <span class="cline-any cline-yes">26x</span>
473
+ <span class="cline-any cline-yes">18x</span>
474
+ <span class="cline-any cline-yes">18x</span>
475
+ <span class="cline-any cline-yes">18x</span>
476
+ <span class="cline-any cline-yes">18x</span>
477
+ <span class="cline-any cline-yes">18x</span>
478
+ <span class="cline-any cline-yes">18x</span>
479
+ <span class="cline-any cline-yes">18x</span>
480
+ <span class="cline-any cline-yes">18x</span>
481
+ <span class="cline-any cline-yes">18x</span>
482
+ <span class="cline-any cline-yes">18x</span>
483
+ <span class="cline-any cline-yes">35x</span>
484
+ <span class="cline-any cline-yes">34x</span>
485
+ <span class="cline-any cline-yes">34x</span>
486
+ <span class="cline-any cline-yes">34x</span>
487
+ <span class="cline-any cline-yes">34x</span>
488
+ <span class="cline-any cline-yes">34x</span>
489
+ <span class="cline-any cline-yes">35x</span>
490
+ <span class="cline-any cline-yes">2x</span>
491
+ <span class="cline-any cline-yes">2x</span>
492
+ <span class="cline-any cline-yes">2x</span>
493
+ <span class="cline-any cline-yes">2x</span>
494
+ <span class="cline-any cline-yes">32x</span>
495
+ <span class="cline-any cline-yes">32x</span>
496
+ <span class="cline-any cline-yes">32x</span>
497
+ <span class="cline-any cline-yes">32x</span>
498
+ <span class="cline-any cline-yes">32x</span>
499
+ <span class="cline-any cline-yes">32x</span>
500
+ <span class="cline-any cline-yes">35x</span>
501
+ <span class="cline-any cline-yes">18x</span>
502
+ <span class="cline-any cline-yes">18x</span>
503
+ <span class="cline-any cline-yes">18x</span>
504
+ <span class="cline-any cline-yes">18x</span>
505
+ <span class="cline-any cline-yes">18x</span>
506
+ <span class="cline-any cline-yes">18x</span>
507
+ <span class="cline-any cline-yes">18x</span>
508
+ <span class="cline-any cline-yes">18x</span>
509
+ <span class="cline-any cline-yes">18x</span>
510
+ <span class="cline-any cline-yes">18x</span>
511
+ <span class="cline-any cline-yes">5x</span>
512
+ <span class="cline-any cline-yes">4x</span>
513
+ <span class="cline-any cline-yes">4x</span>
514
+ <span class="cline-any cline-yes">4x</span>
515
+ <span class="cline-any cline-yes">4x</span>
516
+ <span class="cline-any cline-yes">4x</span>
517
+ <span class="cline-any cline-yes">5x</span>
518
+ <span class="cline-any cline-yes">2x</span>
519
+ <span class="cline-any cline-yes">2x</span>
520
+ <span class="cline-any cline-yes">2x</span>
521
+ <span class="cline-any cline-yes">2x</span>
522
+ <span class="cline-any cline-yes">2x</span>
523
+ <span class="cline-any cline-yes">2x</span>
524
+ <span class="cline-any cline-yes">4x</span>
525
+ <span class="cline-any cline-yes">4x</span>
526
+ <span class="cline-any cline-yes">5x</span>
527
+ <span class="cline-any cline-yes">18x</span>
528
+ <span class="cline-any cline-yes">18x</span>
529
+ <span class="cline-any cline-yes">18x</span>
530
+ <span class="cline-any cline-yes">18x</span>
531
+ <span class="cline-any cline-yes">18x</span>
532
+ <span class="cline-any cline-yes">18x</span>
533
+ <span class="cline-any cline-yes">18x</span>
534
+ <span class="cline-any cline-yes">18x</span>
535
+ <span class="cline-any cline-yes">42x</span>
536
+ <span class="cline-any cline-yes">42x</span>
537
+ <span class="cline-any cline-yes">42x</span>
538
+ <span class="cline-any cline-yes">42x</span>
539
+ <span class="cline-any cline-yes">18x</span>
540
+ <span class="cline-any cline-yes">18x</span>
541
+ <span class="cline-any cline-yes">18x</span>
542
+ <span class="cline-any cline-yes">18x</span>
543
+ <span class="cline-any cline-yes">18x</span>
544
+ <span class="cline-any cline-yes">18x</span>
545
+ <span class="cline-any cline-yes">18x</span>
546
+ <span class="cline-any cline-yes">20x</span>
547
+ <span class="cline-any cline-yes">20x</span>
548
+ <span class="cline-any cline-yes">20x</span>
549
+ <span class="cline-any cline-yes">20x</span>
550
+ <span class="cline-any cline-yes">1x</span>
551
+ <span class="cline-any cline-yes">1x</span>
552
+ <span class="cline-any cline-yes">1x</span>
553
+ <span class="cline-any cline-yes">1x</span>
554
+ <span class="cline-any cline-yes">19x</span>
555
+ <span class="cline-any cline-yes">19x</span>
556
+ <span class="cline-any cline-yes">19x</span>
557
+ <span class="cline-any cline-yes">19x</span>
558
+ <span class="cline-any cline-yes">19x</span>
559
+ <span class="cline-any cline-yes">20x</span>
560
+ <span class="cline-any cline-yes">1x</span>
561
+ <span class="cline-any cline-yes">20x</span>
562
+ <span class="cline-any cline-yes">18x</span>
563
+ <span class="cline-any cline-yes">18x</span>
564
+ <span class="cline-any cline-yes">18x</span>
565
+ <span class="cline-any cline-yes">18x</span>
566
+ <span class="cline-any cline-yes">18x</span>
567
+ <span class="cline-any cline-yes">18x</span>
568
+ <span class="cline-any cline-yes">18x</span>
569
+ <span class="cline-any cline-yes">18x</span>
570
+ <span class="cline-any cline-yes">18x</span>
571
+ <span class="cline-any cline-yes">18x</span>
572
+ <span class="cline-any cline-yes">18x</span>
573
+ <span class="cline-any cline-yes">19x</span>
574
+ <span class="cline-any cline-yes">19x</span>
575
+ <span class="cline-any cline-yes">19x</span>
576
+ <span class="cline-any cline-yes">19x</span>
577
+ <span class="cline-any cline-yes">20x</span>
578
+ <span class="cline-any cline-yes">18x</span>
579
+ <span class="cline-any cline-yes">18x</span>
580
+ <span class="cline-any cline-yes">18x</span>
581
+ <span class="cline-any cline-yes">1x</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
583
+ &nbsp;
584
+ module.exports = function() {
585
+ const api = this;
586
+ const { models } = api.runtime;
587
+ &nbsp;
588
+ const DebugLog = api.log( "hitchy:plugin:auth:debug" );
589
+ &nbsp;
590
+ /**
591
+ * Implements several helper methods meant to simplify user/role management.
592
+ */
593
+ class AuthManager {
594
+ /**
595
+ * Qualifies selected user by means of loading or creating it when
596
+ * providing a user's name, only.
597
+ *
598
+ * @param {string|Hitchy.Plugin.Auth.User} user a user's name or model instance
599
+ * @param {boolean} createIfMissing set true to create any missing user
600
+ * @returns {Promise&lt;Hitchy.Plugin.Auth.User&gt;} promises selected user properly set up in database
601
+ */
602
+ static async asUser( user, createIfMissing = false ) {
603
+ if ( !user ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
604
+ <span class="cstat-no" title="statement not covered" > throw new TypeError( "missing user information" );</span>
605
+ <span class="cstat-no" title="statement not covered" > }</span>
606
+ &nbsp;
607
+ const { User } = models;
608
+ const users = user instanceof User ? [user] : await User.find( {
609
+ eq: { name: "name", value: user.name || user },
610
+ } );
611
+ &nbsp;
612
+ if ( users.length === 1 ) {
613
+ return users[0];
614
+ }
615
+ &nbsp;
616
+ if ( users.length &gt; 1 ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
617
+ <span class="cstat-no" title="statement not covered" > throw new Error( "selecting user did not yield unique match" );</span>
618
+ <span class="cstat-no" title="statement not covered" > }</span>
619
+ &nbsp;
620
+ if ( !createIfMissing ) {
621
+ throw new Error( "selecting user did not yield any match" );
622
+ }
623
+ &nbsp;
624
+ const newUser = new User();
625
+ &nbsp;
626
+ newUser.name = user.name || user;
627
+ &nbsp;
628
+ return await newUser.save();
629
+ }
630
+ &nbsp;
631
+ /**
632
+ * Qualifies selected role by means of loading or creating it when
633
+ * providing a role's name, only.
634
+ *
635
+ * @param {string|Hitchy.Plugin.Auth.Role} role a role's name or model instance
636
+ * @param {boolean} createIfMissing set true to create any missing user
637
+ * @returns {Promise&lt;Hitchy.Plugin.Auth.Role&gt;} promises selected role properly set up in database
638
+ */
639
+ static async asRole( role, createIfMissing = false ) {
640
+ if ( !role ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
641
+ <span class="cstat-no" title="statement not covered" > throw new TypeError( "missing role information" );</span>
642
+ <span class="cstat-no" title="statement not covered" > }</span>
643
+ &nbsp;
644
+ const { Role } = models;
645
+ &nbsp;
646
+ if ( !( role instanceof Role ) ) {
647
+ role = String( role ); // eslint-disable-line no-param-reassign
648
+ &nbsp;
649
+ if ( !/^[a-z_]/i.test( role ) || /\s/.test( role ) ) {
650
+ throw new TypeError( "missing role information" );
651
+ }
652
+ }
653
+ &nbsp;
654
+ const roles = role instanceof Role ? [role] : await Role.find( {
655
+ eq: { name: "name", value: role.name || role },
656
+ } );
657
+ &nbsp;
658
+ if ( roles.length === 1 ) {
659
+ return roles[0];
660
+ }
661
+ &nbsp;
662
+ if ( roles.length &gt; 1 ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
663
+ <span class="cstat-no" title="statement not covered" > throw new Error( "selecting role did not yield unique match" );</span>
664
+ <span class="cstat-no" title="statement not covered" > }</span>
665
+ &nbsp;
666
+ if ( !createIfMissing ) {
667
+ throw new Error( "selecting role did not yield any match" );
668
+ }
669
+ &nbsp;
670
+ const newRole = new Role();
671
+ &nbsp;
672
+ newRole.name = role.name || role;
673
+ &nbsp;
674
+ return await newRole.save();
675
+ }
676
+ &nbsp;
677
+ /**
678
+ * Fetches list of provided user's roles.
679
+ *
680
+ * @param {string|Hitchy.Plugin.Auth.User} user user to assign role to (given by instance or by its name)
681
+ * @param {boolean} createIfMissing set true to create any missing user
682
+ * @param {boolean} uuidsOnly true to prevent associated users' instances being loaded
683
+ * @returns {Promise&lt;Role[]&gt;} promises list of (unloaded) roles assigned to selected user
684
+ */
685
+ static async listRolesOfUser( user, createIfMissing = false, uuidsOnly = false ) {
686
+ const { $uuid: userUuid } = await this.asUser( user, createIfMissing );
687
+ const { Role, UserToRole } = models;
688
+ &nbsp;
689
+ const associations = await UserToRole.find( { eq: { name: "user", value: userUuid } } );
690
+ const numAssociations = associations.length;
691
+ const roles = new Array( numAssociations );
692
+ &nbsp;
693
+ for ( let i = 0; i &lt; numAssociations; i++ ) {
694
+ const { role: roleUuid } = associations[i];
695
+ &nbsp;
696
+ if ( uuidsOnly ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
697
+ <span class="cstat-no" title="statement not covered" > roles[i] = new Role( roleUuid );</span>
698
+ } else {
699
+ roles[i] = new Role( roleUuid ).load();
700
+ }
701
+ }
702
+ &nbsp;
703
+ return uuidsOnly <span class="branch-0 cbranch-no" title="branch not covered" >? roles </span>: Promise.all( roles );
704
+ }
705
+ &nbsp;
706
+ /**
707
+ * Searches local database for user's with a role selected by its name.
708
+ *
709
+ * @param {string|Hitchy.Plugin.Auth.Role} role name of role to search for or that role's instance
710
+ * @param {boolean} createIfMissing set true to create any missing role
711
+ * @param {boolean} uuidsOnly true to prevent associated users' instances being loaded
712
+ * @returns {Promise&lt;User[]&gt;} promises list of users with selected role
713
+ */
714
+ static async listUsersOfRole( role, createIfMissing = false, uuidsOnly = false ) {
715
+ const { $uuid: roleUuid } = await this.asRole( role, createIfMissing );
716
+ const { User, UserToRole } = models;
717
+ &nbsp;
718
+ const associations = await UserToRole.find( { eq: { name: "role", value: roleUuid } } );
719
+ const numAssociations = associations.length;
720
+ const users = new Array( numAssociations );
721
+ &nbsp;
722
+ for ( let i = 0; i &lt; numAssociations; i++ ) {
723
+ const { user: userUuid } = associations[i];
724
+ &nbsp;
725
+ if ( uuidsOnly ) {
726
+ users[i] = new User( userUuid );
727
+ } else {
728
+ users[i] = new User( userUuid ).load();
729
+ }
730
+ }
731
+ &nbsp;
732
+ return uuidsOnly ? users : Promise.all( users );
733
+ }
734
+ &nbsp;
735
+ /**
736
+ * Assigns selected role to selected user.
737
+ *
738
+ * @param {string|Hitchy.Plugin.Auth.Role} role role to assign user to (given by instance or by its name)
739
+ * @param {string|Hitchy.Plugin.Auth.User} user user to assign role to (given by instance or by its name)
740
+ * @param {boolean} createIfMissing set true to create any missing user/role
741
+ * @returns {Promise&lt;void&gt;} promises role assigned to user
742
+ */
743
+ static async grantRoleToUser( role, user, createIfMissing = false ) {
744
+ const { $uuid: userUuid } = await this.asUser( user, createIfMissing );
745
+ const { $uuid: roleUuid } = await this.asRole( role, createIfMissing );
746
+ &nbsp;
747
+ const matches = await models.UserToRole.find( { eq: { name: "user", value: userUuid } } );
748
+ const numMatches = matches.length;
749
+ &nbsp;
750
+ for ( let i = 0; i &lt; numMatches; i++ ) {
751
+ if ( matches[i].role.equals( roleUuid ) ) {
752
+ return;
753
+ }
754
+ }
755
+ &nbsp;
756
+ const association = new models.UserToRole();
757
+ association.user = userUuid;
758
+ association.role = roleUuid;
759
+ &nbsp;
760
+ await association.save();
761
+ }
762
+ &nbsp;
763
+ /**
764
+ * Drops assignment of selected role and selected user.
765
+ *
766
+ * @param {string|Hitchy.Plugin.Auth.Role} role role to assign user to (given by instance or by its name)
767
+ * @param {string|Hitchy.Plugin.Auth.User} user user to assign role to (given by instance or by its name)
768
+ * @param {boolean} createIfMissing set true to create any missing user/role
769
+ * @returns {Promise&lt;void&gt;} promises role assigned to user
770
+ */
771
+ static async revokeRoleFromUser( role, user, createIfMissing = false ) {
772
+ const { $uuid: userUuid } = await this.asUser( user, createIfMissing );
773
+ const { $uuid: roleUuid } = await this.asRole( role, createIfMissing );
774
+ &nbsp;
775
+ const associations = await models.UserToRole.find( { eq: { name: "user", value: userUuid } } );
776
+ const promises = [];
777
+ &nbsp;
778
+ for ( let i = 0, count = associations.length; i &lt; count; i++ ) {
779
+ const association = associations[i];
780
+ &nbsp;
781
+ if ( association.role.equals( roleUuid ) ) {
782
+ promises.push( association.remove() );
783
+ }
784
+ }
785
+ &nbsp;
786
+ return Promise.all( promises );
787
+ }
788
+ &nbsp;
789
+ /**
790
+ * Provides configurable name of role implicitly granting full access to
791
+ * its associated users.
792
+ *
793
+ * @returns {string} configured name of role
794
+ */
795
+ static get adminRole() {
796
+ const config = api.config.auth.admin;
797
+ &nbsp;
798
+ return process.env.HITCHY_ADMIN_ROLE || ( config ? config.role : "" ) || "admin";
799
+ }
800
+ &nbsp;
801
+ /**
802
+ * Creates user with admin role if missing in database.
803
+ *
804
+ * @returns {Promise&lt;Hitchy.Plugin.Auth.User[]&gt;} promises list of eventually existing users with admin role
805
+ */
806
+ static async createAdminUserIfMissing() {
807
+ const role = await this.asRole( this.adminRole, true );
808
+ const users = await this.listUsersOfRole( role );
809
+ &nbsp;
810
+ if ( users.length &gt; 0 ) {
811
+ DebugLog( "admin user found" );
812
+ &nbsp;
813
+ return users;
814
+ }
815
+ &nbsp;
816
+ &nbsp;
817
+ const existingAdmins = await models.User.find( { eq: { name: "admin" } } );
818
+ let user;
819
+ &nbsp;
820
+ if ( existingAdmins.length &gt; 0 ) {
821
+ user = existingAdmins[0];
822
+ } else {
823
+ const config = api.config.auth.admin;
824
+ &nbsp;
825
+ DebugLog( "creating admin user" );
826
+ &nbsp;
827
+ user = new models.User();
828
+ &nbsp;
829
+ user.name = process.env.HITCHY_ADMIN_NAME || ( config ? config.name : "" ) || "admin";
830
+ &nbsp;
831
+ await user.setPassword( process.env.HITCHY_ADMIN_PASSWORD || ( config ? config.password : "" ) || "nimda" );
832
+ await user.save();
833
+ }
834
+ &nbsp;
835
+ await this.grantRoleToUser( role, user );
836
+ &nbsp;
837
+ return [user];
838
+ }
839
+ }
840
+ &nbsp;
841
+ return AuthManager;
842
+ };
843
+ &nbsp;</pre></td></tr></table></pre>
844
+
845
+ <div class='push'></div><!-- for sticky footer -->
846
+ </div><!-- /wrapper -->
847
+ <div class='footer quiet pad2 space-top1 center small'>
848
+ Code coverage generated by
849
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
850
+ at Sun Mar 27 2022 18:00:09 GMT+0200 (Mitteleuropäische Sommerzeit)
851
+ </div>
852
+ </div>
853
+ <script src="../../../../prettify.js"></script>
854
+ <script>
855
+ window.onload = function () {
856
+ prettyPrint();
857
+ };
858
+ </script>
859
+ <script src="../../../../sorter.js"></script>
860
+ <script src="../../../../block-navigation.js"></script>
861
+ </body>
862
+ </html>
863
+