@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,860 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for plugin-auth/api/service/authentication/strategies.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/authentication</a> strategies.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">88.84% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>231/260</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">68.42% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>26/38</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">91.66% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>11/12</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">88.84% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>231/260</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
321
+ <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">1x</span>
325
+ <span class="cline-any cline-yes">1x</span>
326
+ <span class="cline-any cline-yes">1x</span>
327
+ <span class="cline-any cline-yes">1x</span>
328
+ <span class="cline-any cline-yes">1x</span>
329
+ <span class="cline-any cline-yes">1x</span>
330
+ <span class="cline-any cline-yes">1x</span>
331
+ <span class="cline-any cline-yes">1x</span>
332
+ <span class="cline-any cline-yes">1x</span>
333
+ <span class="cline-any cline-yes">1x</span>
334
+ <span class="cline-any cline-yes">1x</span>
335
+ <span class="cline-any cline-yes">1x</span>
336
+ <span class="cline-any cline-yes">1x</span>
337
+ <span class="cline-any cline-yes">1x</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">18x</span>
343
+ <span class="cline-any cline-yes">18x</span>
344
+ <span class="cline-any cline-yes">18x</span>
345
+ <span class="cline-any cline-yes">18x</span>
346
+ <span class="cline-any cline-yes">18x</span>
347
+ <span class="cline-any cline-yes">18x</span>
348
+ <span class="cline-any cline-yes">18x</span>
349
+ <span class="cline-any cline-yes">18x</span>
350
+ <span class="cline-any cline-yes">18x</span>
351
+ <span class="cline-any cline-yes">18x</span>
352
+ <span class="cline-any cline-yes">18x</span>
353
+ <span class="cline-any cline-yes">2x</span>
354
+ <span class="cline-any cline-yes">2x</span>
355
+ <span class="cline-any cline-yes">2x</span>
356
+ <span class="cline-any cline-yes">2x</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-no">&nbsp;</span>
359
+ <span class="cline-any cline-yes">2x</span>
360
+ <span class="cline-any cline-yes">2x</span>
361
+ <span class="cline-any cline-yes">2x</span>
362
+ <span class="cline-any cline-yes">2x</span>
363
+ <span class="cline-any cline-yes">2x</span>
364
+ <span class="cline-any cline-yes">2x</span>
365
+ <span class="cline-any cline-yes">2x</span>
366
+ <span class="cline-any cline-yes">2x</span>
367
+ <span class="cline-any cline-no">&nbsp;</span>
368
+ <span class="cline-any cline-no">&nbsp;</span>
369
+ <span class="cline-any cline-yes">2x</span>
370
+ <span class="cline-any cline-yes">2x</span>
371
+ <span class="cline-any cline-yes">2x</span>
372
+ <span class="cline-any cline-yes">2x</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">18x</span>
380
+ <span class="cline-any cline-yes">18x</span>
381
+ <span class="cline-any cline-yes">18x</span>
382
+ <span class="cline-any cline-yes">18x</span>
383
+ <span class="cline-any cline-yes">18x</span>
384
+ <span class="cline-any cline-yes">18x</span>
385
+ <span class="cline-any cline-yes">18x</span>
386
+ <span class="cline-any cline-yes">9x</span>
387
+ <span class="cline-any cline-yes">9x</span>
388
+ <span class="cline-any cline-yes">9x</span>
389
+ <span class="cline-any cline-yes">9x</span>
390
+ <span class="cline-any cline-yes">9x</span>
391
+ <span class="cline-any cline-no">&nbsp;</span>
392
+ <span class="cline-any cline-no">&nbsp;</span>
393
+ <span class="cline-any cline-yes">9x</span>
394
+ <span class="cline-any cline-yes">9x</span>
395
+ <span class="cline-any cline-yes">9x</span>
396
+ <span class="cline-any cline-yes">9x</span>
397
+ <span class="cline-any cline-yes">9x</span>
398
+ <span class="cline-any cline-no">&nbsp;</span>
399
+ <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-no">&nbsp;</span>
401
+ <span class="cline-any cline-yes">9x</span>
402
+ <span class="cline-any cline-yes">9x</span>
403
+ <span class="cline-any cline-yes">9x</span>
404
+ <span class="cline-any cline-yes">9x</span>
405
+ <span class="cline-any cline-yes">9x</span>
406
+ <span class="cline-any cline-no">&nbsp;</span>
407
+ <span class="cline-any cline-no">&nbsp;</span>
408
+ <span class="cline-any cline-yes">9x</span>
409
+ <span class="cline-any cline-yes">9x</span>
410
+ <span class="cline-any cline-yes">9x</span>
411
+ <span class="cline-any cline-yes">9x</span>
412
+ <span class="cline-any cline-no">&nbsp;</span>
413
+ <span class="cline-any cline-no">&nbsp;</span>
414
+ <span class="cline-any cline-yes">9x</span>
415
+ <span class="cline-any cline-yes">9x</span>
416
+ <span class="cline-any cline-yes">9x</span>
417
+ <span class="cline-any cline-no">&nbsp;</span>
418
+ <span class="cline-any cline-no">&nbsp;</span>
419
+ <span class="cline-any cline-yes">9x</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">18x</span>
426
+ <span class="cline-any cline-yes">18x</span>
427
+ <span class="cline-any cline-yes">18x</span>
428
+ <span class="cline-any cline-yes">18x</span>
429
+ <span class="cline-any cline-yes">18x</span>
430
+ <span class="cline-any cline-yes">18x</span>
431
+ <span class="cline-any cline-yes">18x</span>
432
+ <span class="cline-any cline-yes">18x</span>
433
+ <span class="cline-any cline-yes">18x</span>
434
+ <span class="cline-any cline-yes">18x</span>
435
+ <span class="cline-any cline-yes">18x</span>
436
+ <span class="cline-any cline-yes">2x</span>
437
+ <span class="cline-any cline-yes">1x</span>
438
+ <span class="cline-any cline-yes">1x</span>
439
+ <span class="cline-any cline-yes">1x</span>
440
+ <span class="cline-any cline-yes">2x</span>
441
+ <span class="cline-any cline-yes">2x</span>
442
+ <span class="cline-any cline-yes">2x</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-yes">2x</span>
445
+ <span class="cline-any cline-yes">2x</span>
446
+ <span class="cline-any cline-yes">2x</span>
447
+ <span class="cline-any cline-yes">2x</span>
448
+ <span class="cline-any cline-yes">2x</span>
449
+ <span class="cline-any cline-yes">2x</span>
450
+ <span class="cline-any cline-yes">2x</span>
451
+ <span class="cline-any cline-yes">2x</span>
452
+ <span class="cline-any cline-yes">2x</span>
453
+ <span class="cline-any cline-yes">2x</span>
454
+ <span class="cline-any cline-yes">2x</span>
455
+ <span class="cline-any cline-yes">2x</span>
456
+ <span class="cline-any cline-yes">2x</span>
457
+ <span class="cline-any cline-yes">2x</span>
458
+ <span class="cline-any cline-yes">2x</span>
459
+ <span class="cline-any cline-yes">2x</span>
460
+ <span class="cline-any cline-yes">1x</span>
461
+ <span class="cline-any cline-yes">1x</span>
462
+ <span class="cline-any cline-yes">1x</span>
463
+ <span class="cline-any cline-yes">1x</span>
464
+ <span class="cline-any cline-yes">1x</span>
465
+ <span class="cline-any cline-yes">1x</span>
466
+ <span class="cline-any cline-yes">1x</span>
467
+ <span class="cline-any cline-yes">1x</span>
468
+ <span class="cline-any cline-yes">1x</span>
469
+ <span class="cline-any cline-yes">1x</span>
470
+ <span class="cline-any cline-yes">1x</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-yes">1x</span>
473
+ <span class="cline-any cline-yes">1x</span>
474
+ <span class="cline-any cline-yes">1x</span>
475
+ <span class="cline-any cline-yes">1x</span>
476
+ <span class="cline-any cline-yes">1x</span>
477
+ <span class="cline-any cline-yes">11x</span>
478
+ <span class="cline-any cline-yes">11x</span>
479
+ <span class="cline-any cline-yes">1x</span>
480
+ <span class="cline-any cline-yes">1x</span>
481
+ <span class="cline-any cline-yes">1x</span>
482
+ <span class="cline-any cline-yes">1x</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-yes">1x</span>
485
+ <span class="cline-any cline-yes">1x</span>
486
+ <span class="cline-any cline-yes">1x</span>
487
+ <span class="cline-any cline-yes">1x</span>
488
+ <span class="cline-any cline-no">&nbsp;</span>
489
+ <span class="cline-any cline-yes">1x</span>
490
+ <span class="cline-any cline-yes">1x</span>
491
+ <span class="cline-any cline-yes">1x</span>
492
+ <span class="cline-any cline-yes">1x</span>
493
+ <span class="cline-any cline-yes">1x</span>
494
+ <span class="cline-any cline-yes">1x</span>
495
+ <span class="cline-any cline-yes">1x</span>
496
+ <span class="cline-any cline-yes">1x</span>
497
+ <span class="cline-any cline-yes">1x</span>
498
+ <span class="cline-any cline-yes">1x</span>
499
+ <span class="cline-any cline-yes">1x</span>
500
+ <span class="cline-any cline-yes">1x</span>
501
+ <span class="cline-any cline-yes">1x</span>
502
+ <span class="cline-any cline-no">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-no">&nbsp;</span>
505
+ <span class="cline-any cline-no">&nbsp;</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-no">&nbsp;</span>
508
+ <span class="cline-any cline-no">&nbsp;</span>
509
+ <span class="cline-any cline-no">&nbsp;</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">2x</span>
512
+ <span class="cline-any cline-yes">2x</span>
513
+ <span class="cline-any cline-yes">2x</span>
514
+ <span class="cline-any cline-yes">2x</span>
515
+ <span class="cline-any cline-yes">2x</span>
516
+ <span class="cline-any cline-yes">2x</span>
517
+ <span class="cline-any cline-yes">18x</span>
518
+ <span class="cline-any cline-yes">18x</span>
519
+ <span class="cline-any cline-yes">18x</span>
520
+ <span class="cline-any cline-yes">18x</span>
521
+ <span class="cline-any cline-yes">18x</span>
522
+ <span class="cline-any cline-yes">18x</span>
523
+ <span class="cline-any cline-yes">18x</span>
524
+ <span class="cline-any cline-yes">18x</span>
525
+ <span class="cline-any cline-yes">18x</span>
526
+ <span class="cline-any cline-yes">18x</span>
527
+ <span class="cline-any cline-yes">2x</span>
528
+ <span class="cline-any cline-yes">1x</span>
529
+ <span class="cline-any cline-yes">2x</span>
530
+ <span class="cline-any cline-yes">2x</span>
531
+ <span class="cline-any cline-yes">2x</span>
532
+ <span class="cline-any cline-yes">2x</span>
533
+ <span class="cline-any cline-yes">2x</span>
534
+ <span class="cline-any cline-yes">2x</span>
535
+ <span class="cline-any cline-yes">2x</span>
536
+ <span class="cline-any cline-yes">2x</span>
537
+ <span class="cline-any cline-yes">2x</span>
538
+ <span class="cline-any cline-yes">2x</span>
539
+ <span class="cline-any cline-yes">2x</span>
540
+ <span class="cline-any cline-yes">2x</span>
541
+ <span class="cline-any cline-yes">2x</span>
542
+ <span class="cline-any cline-yes">2x</span>
543
+ <span class="cline-any cline-yes">2x</span>
544
+ <span class="cline-any cline-yes">1x</span>
545
+ <span class="cline-any cline-yes">1x</span>
546
+ <span class="cline-any cline-yes">1x</span>
547
+ <span class="cline-any cline-yes">1x</span>
548
+ <span class="cline-any cline-yes">1x</span>
549
+ <span class="cline-any cline-yes">1x</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">2x</span>
554
+ <span class="cline-any cline-yes">2x</span>
555
+ <span class="cline-any cline-yes">2x</span>
556
+ <span class="cline-any cline-yes">2x</span>
557
+ <span class="cline-any cline-yes">2x</span>
558
+ <span class="cline-any cline-yes">2x</span>
559
+ <span class="cline-any cline-yes">18x</span>
560
+ <span class="cline-any cline-yes">18x</span>
561
+ <span class="cline-any cline-yes">18x</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">51x</span>
567
+ <span class="cline-any cline-yes">51x</span>
568
+ <span class="cline-any cline-yes">51x</span>
569
+ <span class="cline-any cline-no">&nbsp;</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-yes">51x</span>
572
+ <span class="cline-any cline-yes">51x</span>
573
+ <span class="cline-any cline-yes">51x</span>
574
+ <span class="cline-any cline-yes">51x</span>
575
+ <span class="cline-any cline-yes">51x</span>
576
+ <span class="cline-any cline-yes">18x</span>
577
+ <span class="cline-any cline-yes">18x</span>
578
+ <span class="cline-any cline-yes">18x</span>
579
+ <span class="cline-any cline-yes">1x</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
581
+ &nbsp;
582
+ const LocalStrategy = require( "passport-local" ).Strategy;
583
+ &nbsp;
584
+ /**
585
+ * Temporarily tracks additional session data per remotely authenticated user.
586
+ *
587
+ * Some strategies (such as passport-saml) expect certain strategy-related data
588
+ * per authenticated user to be present on `req.user` prior to accepting request
589
+ * for logging out. In hitchy, `req.user` is fetched from database on every
590
+ * request and thus no temporary data is available. Hence, this local map is
591
+ * used instead to track any additional data for those strategies.
592
+ *
593
+ * @type {Map&lt;any, any&gt;}
594
+ */
595
+ const RemoteAuthCustomData = new Map();
596
+ &nbsp;
597
+ module.exports = function() {
598
+ const api = this;
599
+ const { models } = api.runtime;
600
+ &nbsp;
601
+ const AlertLog = api.log( "hitchy:plugin:auth:alert" );
602
+ &nbsp;
603
+ /**
604
+ * Fetches named user's local profile.
605
+ *
606
+ * @param {string} strategyName name of strategy used to authenticate user
607
+ * @param {string} username name of user to search locally for related profile
608
+ * @param {boolean} createIfMissing set true to create user's profile if it's missing currenly
609
+ * @param {function(Error?, object):void} doneFn callback invoked with encountered error or user's profile
610
+ * @returns {void}
611
+ */
612
+ function getLocalProfile( strategyName, username, createIfMissing, doneFn ) {
613
+ models.User.find( { eq: { name: username } } )
614
+ .then( candidates =&gt; candidates.find( user =&gt; user.strategy === strategyName ) )
615
+ .then( match =&gt; {
616
+ if ( match ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
617
+ <span class="cstat-no" title="statement not covered" > return match;</span>
618
+ <span class="cstat-no" title="statement not covered" > }</span>
619
+ &nbsp;
620
+ if ( createIfMissing ) {
621
+ const newUser = new models.User();
622
+ newUser.name = username;
623
+ newUser.strategy = strategyName;
624
+ &nbsp;
625
+ return newUser.save();
626
+ }
627
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
628
+ <span class="cstat-no" title="statement not covered" > throw new TypeError( "selected user does not exist" );</span>
629
+ } )
630
+ .then( profile =&gt; doneFn( null, profile ) )
631
+ .catch( doneFn );
632
+ }
633
+ &nbsp;
634
+ /**
635
+ * Implements helpers for generating strategies for passport.js.
636
+ */
637
+ class AuthenticationStrategies {
638
+ /**
639
+ * Generates local strategy authenticating user based on local user
640
+ * model managed in local ODM.
641
+ *
642
+ * @returns {Strategy} generated strategy for use with passport.js
643
+ */
644
+ static generateLocal() {
645
+ const strategy = new LocalStrategy( ( name, password, done ) =&gt; {
646
+ models.User
647
+ .find( { eq: { name } }, {}, { loadRecords: true } )
648
+ .then( matches =&gt; {
649
+ switch ( matches.length ) {
650
+ <span class="branch-0 cbranch-no" title="branch not covered" > case 0 :</span>
651
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: "Incorrect username." } );</span>
652
+ <span class="cstat-no" title="statement not covered" > return undefined;</span>
653
+ &nbsp;
654
+ case 1 : {
655
+ const [user] = matches;
656
+ &nbsp;
657
+ if ( user.strategy <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; user.strategy !== "local" </span>) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
658
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: "Authenticating this user requires different strategy." } );</span>
659
+ <span class="cstat-no" title="statement not covered" > return undefined;</span>
660
+ <span class="cstat-no" title="statement not covered" > }</span>
661
+ &nbsp;
662
+ return user.verifyPassword( password ).then( result =&gt; {
663
+ if ( result ) {
664
+ done( null, user );
665
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
666
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: "Incorrect password." } );</span>
667
+ <span class="cstat-no" title="statement not covered" > }</span>
668
+ } );
669
+ }
670
+ &nbsp;
671
+ <span class="branch-0 cbranch-no" title="branch not covered" > default :</span>
672
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: "Ambiguous username." } );</span>
673
+ <span class="cstat-no" title="statement not covered" > return undefined;</span>
674
+ }
675
+ } )
676
+ .catch( err =&gt; {
677
+ <span class="cstat-no" title="statement not covered" > AlertLog( err );</span>
678
+ <span class="cstat-no" title="statement not covered" > done( err );</span>
679
+ } );
680
+ } );
681
+ &nbsp;
682
+ strategy.passwordRequried = true;
683
+ &nbsp;
684
+ return strategy;
685
+ }
686
+ &nbsp;
687
+ /**
688
+ * Generates SAML strategy authenticating user against some remote IdP
689
+ * based on SAML v2.0 protocol.
690
+ *
691
+ * @param {string} strategyName name of resulting strategy in context of your application
692
+ * @param {Hitchy.Plugin.Auth.SamlConfig} config SAML protocol configuration
693
+ * @returns {Strategy} generated strategy for use with passport.js
694
+ */
695
+ static generateSaml( strategyName, config ) {
696
+ const verifyLocalProfileOnLogin = ( req, userInfo, done ) =&gt; {
697
+ RemoteAuthCustomData.set( `${strategyName}:${userInfo.nameID}`, { ...userInfo } );
698
+ &nbsp;
699
+ getLocalProfile( strategyName, userInfo.nameID, true, done );
700
+ };
701
+ &nbsp;
702
+ const verifyLocalProfileOnLogout = <span class="fstat-no" title="function not covered" >( req, userInfo, done ) =&gt; {</span>
703
+ <span class="cstat-no" title="statement not covered" > getLocalProfile( strategyName, userInfo.nameID, false, done );</span>
704
+ };
705
+ &nbsp;
706
+ const { Strategy } = require( "passport-saml" );
707
+ const strategy = new Strategy( {
708
+ ...config,
709
+ passReqToCallback: true,
710
+ }, verifyLocalProfileOnLogin, verifyLocalProfileOnLogout );
711
+ &nbsp;
712
+ /**
713
+ * Triggers requesting user being logged out remotely.
714
+ *
715
+ * @param {Hitchy.Core.IncomingMessage} req request descriptor
716
+ * @returns {Promise&lt;boolean&gt;} promises indicator if request was redirected to come back after remote logout succeeded
717
+ */
718
+ strategy.logOutRemotely = req =&gt; {
719
+ if ( req.query.SAMLResponse ) {
720
+ return Promise.resolve( false );
721
+ }
722
+ &nbsp;
723
+ const res = req.context.response;
724
+ &nbsp;
725
+ return new Promise( ( resolve, reject ) =&gt; {
726
+ const { user } = req;
727
+ &nbsp;
728
+ const remoteSessionKey = `${strategyName}:${user.name}`;
729
+ &nbsp;
730
+ if ( !user || user.strategy !== strategyName || !RemoteAuthCustomData.has( remoteSessionKey ) ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
731
+ <span class="cstat-no" title="statement not covered" > resolve( {} );</span>
732
+ } else {
733
+ // inject custom auth data into `req.user` as expected by passport-saml strategy
734
+ const data = RemoteAuthCustomData.get( remoteSessionKey );
735
+ &nbsp;
736
+ for ( const name of Object.keys( data ) ) {
737
+ user[name] = data[name];
738
+ }
739
+ &nbsp;
740
+ user.nameID = user.name;
741
+ &nbsp;
742
+ if ( !user.nameID || !user.nameIDFormat ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
743
+ <span class="cstat-no" title="statement not covered" > reject( new Error( "missing nameID and nameIDFormat of user required for requesting logout at IdP" ) );</span>
744
+ } else {
745
+ // ask strategy for generating logout URL for redirecting client to
746
+ strategy.logout( req, ( error, logoutUrl ) =&gt; {
747
+ if ( error ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
748
+ <span class="cstat-no" title="statement not covered" > reject( error );</span>
749
+ } else {
750
+ resolve( { name: remoteSessionKey, url: logoutUrl } );
751
+ }
752
+ } );
753
+ }
754
+ }
755
+ } )
756
+ .then( ( { name, url } ) =&gt; {
757
+ if ( url ) {
758
+ // first pass -&gt; redirect to IdP
759
+ res.redirect( 302, url );
760
+ return true;
761
+ }
762
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
763
+ <span class="cstat-no" title="statement not covered" > // second pass -&gt; returned from IdP</span>
764
+ <span class="cstat-no" title="statement not covered" ></span>
765
+ <span class="cstat-no" title="statement not covered" > if ( name ) {</span>
766
+ <span class="cstat-no" title="statement not covered" > RemoteAuthCustomData.delete( name );</span>
767
+ <span class="cstat-no" title="statement not covered" > }</span>
768
+ <span class="cstat-no" title="statement not covered" ></span>
769
+ <span class="cstat-no" title="statement not covered" > return false;</span>
770
+ } );
771
+ };
772
+ &nbsp;
773
+ Object.defineProperty( strategy, "$$doNotSeal$$", { value: true } );
774
+ &nbsp;
775
+ return strategy;
776
+ }
777
+ &nbsp;
778
+ /**
779
+ * Creates strategy for illustrating and testing integration with remote IdP
780
+ * supporting OpenID Connect with Authorization Code Flow.
781
+ *
782
+ * @param {string} strategyName name of resulting strategy in context of your application
783
+ * @param {ClientMetaData} config OpenID Connect client configuration
784
+ * @returns {Promise&lt;Strategy&gt;} promises generated strategy for use with passport.js
785
+ */
786
+ static async generateOpenIdConnect( strategyName, config ) { // eslint-disable-line consistent-this
787
+ const verifyLocalProfileOnLogin = ( req, tokens, userInfo, done ) =&gt; {
788
+ getLocalProfile( strategyName, userInfo.preferred_username, true, done );
789
+ };
790
+ &nbsp;
791
+ const { Issuer, Strategy } = require( "openid-client" );
792
+ const issuer = await Issuer.discover( config.discovery_url );
793
+ const client = new issuer.Client( config );
794
+ &nbsp;
795
+ const strategy = new Strategy( {
796
+ client,
797
+ passReqToCallback: true,
798
+ }, verifyLocalProfileOnLogin );
799
+ &nbsp;
800
+ strategy.logOutRemotely = req =&gt; {
801
+ const key = `${strategyName}:logout_state`;
802
+ &nbsp;
803
+ if ( req.session[key] &amp;&amp; req.query.state === req.session[key] ) {
804
+ return Promise.resolve( false );
805
+ }
806
+ &nbsp;
807
+ const state = req.session[key] = require( "crypto" ).randomBytes( 32 ).toString( "base64" ); // eslint-disable-line no-param-reassign
808
+ &nbsp;
809
+ // redirect user to discovered end_session_url of IdP
810
+ req.context.response.redirect( 302, client.endSessionUrl( { state } ) );
811
+ &nbsp;
812
+ return Promise.resolve( true );
813
+ };
814
+ &nbsp;
815
+ Object.defineProperty( strategy, "$$doNotSeal$$", { value: true } );
816
+ &nbsp;
817
+ return strategy;
818
+ }
819
+ &nbsp;
820
+ /**
821
+ * Retrieves name of strategy to use by default.
822
+ *
823
+ * @returns {string} name of strategy to use for user authentication
824
+ */
825
+ static defaultStrategy() {
826
+ const { defaultStrategy, strategies } = api.config.auth;
827
+ &nbsp;
828
+ if ( defaultStrategy ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
829
+ <span class="cstat-no" title="statement not covered" > return defaultStrategy;</span>
830
+ <span class="cstat-no" title="statement not covered" > }</span>
831
+ &nbsp;
832
+ const strategiesNames = Object.keys( strategies );
833
+ &nbsp;
834
+ return strategiesNames.length === 1 ? strategiesNames[0] : "local";
835
+ }
836
+ }
837
+ &nbsp;
838
+ return AuthenticationStrategies;
839
+ };
840
+ &nbsp;</pre></td></tr></table></pre>
841
+
842
+ <div class='push'></div><!-- for sticky footer -->
843
+ </div><!-- /wrapper -->
844
+ <div class='footer quiet pad2 space-top1 center small'>
845
+ Code coverage generated by
846
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
847
+ at Sun Mar 27 2022 18:00:09 GMT+0200 (Mitteleuropäische Sommerzeit)
848
+ </div>
849
+ </div>
850
+ <script src="../../../../prettify.js"></script>
851
+ <script>
852
+ window.onload = function () {
853
+ prettyPrint();
854
+ };
855
+ </script>
856
+ <script src="../../../../sorter.js"></script>
857
+ <script src="../../../../block-navigation.js"></script>
858
+ </body>
859
+ </html>
860
+