@hitchy/plugin-auth 0.2.0 → 0.3.2

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 +127 -70
  9. package/api/policy/authorization.js +0 -28
  10. package/api/policy/user.js +0 -28
  11. package/api/service/auth/manager.js +45 -32
  12. package/api/service/authentication/passport.js +7 -34
  13. package/api/service/authentication/strategies.js +230 -58
  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 +8 -36
  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 +782 -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 +959 -0
  36. package/coverage/plugin-auth/api/service/authentication/index.html +126 -0
  37. package/coverage/plugin-auth/api/service/authentication/passport.js.html +293 -0
  38. package/coverage/plugin-auth/api/service/authentication/strategies.js.html +929 -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-8472-1648414315419-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 +31 -51
  65. package/package.json +18 -13
  66. package/readme.md +11 -43
@@ -0,0 +1,929 @@
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">79.5% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>225/283</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">78.12% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>25/32</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">84.61% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>11/13</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">79.5% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>225/283</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 medium'></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>
322
+ <a name='L263'></a><a href='#L263'>263</a>
323
+ <a name='L264'></a><a href='#L264'>264</a>
324
+ <a name='L265'></a><a href='#L265'>265</a>
325
+ <a name='L266'></a><a href='#L266'>266</a>
326
+ <a name='L267'></a><a href='#L267'>267</a>
327
+ <a name='L268'></a><a href='#L268'>268</a>
328
+ <a name='L269'></a><a href='#L269'>269</a>
329
+ <a name='L270'></a><a href='#L270'>270</a>
330
+ <a name='L271'></a><a href='#L271'>271</a>
331
+ <a name='L272'></a><a href='#L272'>272</a>
332
+ <a name='L273'></a><a href='#L273'>273</a>
333
+ <a name='L274'></a><a href='#L274'>274</a>
334
+ <a name='L275'></a><a href='#L275'>275</a>
335
+ <a name='L276'></a><a href='#L276'>276</a>
336
+ <a name='L277'></a><a href='#L277'>277</a>
337
+ <a name='L278'></a><a href='#L278'>278</a>
338
+ <a name='L279'></a><a href='#L279'>279</a>
339
+ <a name='L280'></a><a href='#L280'>280</a>
340
+ <a name='L281'></a><a href='#L281'>281</a>
341
+ <a name='L282'></a><a href='#L282'>282</a>
342
+ <a name='L283'></a><a href='#L283'>283</a>
343
+ <a name='L284'></a><a href='#L284'>284</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
344
+ <span class="cline-any cline-yes">1x</span>
345
+ <span class="cline-any cline-yes">1x</span>
346
+ <span class="cline-any cline-yes">1x</span>
347
+ <span class="cline-any cline-yes">1x</span>
348
+ <span class="cline-any cline-yes">1x</span>
349
+ <span class="cline-any cline-yes">1x</span>
350
+ <span class="cline-any cline-yes">1x</span>
351
+ <span class="cline-any cline-yes">1x</span>
352
+ <span class="cline-any cline-yes">1x</span>
353
+ <span class="cline-any cline-yes">1x</span>
354
+ <span class="cline-any cline-yes">1x</span>
355
+ <span class="cline-any cline-yes">1x</span>
356
+ <span class="cline-any cline-yes">1x</span>
357
+ <span class="cline-any cline-yes">1x</span>
358
+ <span class="cline-any cline-yes">1x</span>
359
+ <span class="cline-any cline-yes">1x</span>
360
+ <span class="cline-any cline-yes">1x</span>
361
+ <span class="cline-any cline-yes">18x</span>
362
+ <span class="cline-any cline-yes">18x</span>
363
+ <span class="cline-any cline-yes">18x</span>
364
+ <span class="cline-any cline-yes">18x</span>
365
+ <span class="cline-any cline-yes">18x</span>
366
+ <span class="cline-any cline-yes">18x</span>
367
+ <span class="cline-any cline-yes">18x</span>
368
+ <span class="cline-any cline-yes">18x</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">2x</span>
377
+ <span class="cline-any cline-yes">2x</span>
378
+ <span class="cline-any cline-yes">2x</span>
379
+ <span class="cline-any cline-yes">2x</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">2x</span>
383
+ <span class="cline-any cline-yes">2x</span>
384
+ <span class="cline-any cline-yes">2x</span>
385
+ <span class="cline-any cline-yes">2x</span>
386
+ <span class="cline-any cline-yes">2x</span>
387
+ <span class="cline-any cline-yes">2x</span>
388
+ <span class="cline-any cline-yes">2x</span>
389
+ <span class="cline-any cline-yes">2x</span>
390
+ <span class="cline-any cline-no">&nbsp;</span>
391
+ <span class="cline-any cline-no">&nbsp;</span>
392
+ <span class="cline-any cline-yes">2x</span>
393
+ <span class="cline-any cline-yes">2x</span>
394
+ <span class="cline-any cline-yes">2x</span>
395
+ <span class="cline-any cline-yes">2x</span>
396
+ <span class="cline-any cline-yes">18x</span>
397
+ <span class="cline-any cline-yes">18x</span>
398
+ <span class="cline-any cline-yes">18x</span>
399
+ <span class="cline-any cline-yes">18x</span>
400
+ <span class="cline-any cline-yes">18x</span>
401
+ <span class="cline-any cline-yes">18x</span>
402
+ <span class="cline-any cline-yes">18x</span>
403
+ <span class="cline-any cline-yes">18x</span>
404
+ <span class="cline-any cline-yes">18x</span>
405
+ <span class="cline-any cline-yes">18x</span>
406
+ <span class="cline-any cline-yes">18x</span>
407
+ <span class="cline-any cline-yes">18x</span>
408
+ <span class="cline-any cline-yes">18x</span>
409
+ <span class="cline-any cline-yes">18x</span>
410
+ <span class="cline-any cline-yes">18x</span>
411
+ <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
415
+ <span class="cline-any cline-no">&nbsp;</span>
416
+ <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
420
+ <span class="cline-any cline-no">&nbsp;</span>
421
+ <span class="cline-any cline-no">&nbsp;</span>
422
+ <span class="cline-any cline-no">&nbsp;</span>
423
+ <span class="cline-any cline-no">&nbsp;</span>
424
+ <span class="cline-any cline-no">&nbsp;</span>
425
+ <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-no">&nbsp;</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
+ <span class="cline-any cline-no">&nbsp;</span>
434
+ <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-no">&nbsp;</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
437
+ <span class="cline-any cline-no">&nbsp;</span>
438
+ <span class="cline-any cline-no">&nbsp;</span>
439
+ <span class="cline-any cline-no">&nbsp;</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-no">&nbsp;</span>
445
+ <span class="cline-any cline-no">&nbsp;</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">18x</span>
455
+ <span class="cline-any cline-yes">9x</span>
456
+ <span class="cline-any cline-yes">9x</span>
457
+ <span class="cline-any cline-yes">9x</span>
458
+ <span class="cline-any cline-yes">9x</span>
459
+ <span class="cline-any cline-yes">9x</span>
460
+ <span class="cline-any cline-no">&nbsp;</span>
461
+ <span class="cline-any cline-no">&nbsp;</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
+ <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-yes">9x</span>
466
+ <span class="cline-any cline-yes">18x</span>
467
+ <span class="cline-any cline-yes">18x</span>
468
+ <span class="cline-any cline-yes">18x</span>
469
+ <span class="cline-any cline-yes">18x</span>
470
+ <span class="cline-any cline-yes">18x</span>
471
+ <span class="cline-any cline-yes">18x</span>
472
+ <span class="cline-any cline-yes">18x</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">2x</span>
483
+ <span class="cline-any cline-yes">1x</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">2x</span>
487
+ <span class="cline-any cline-yes">2x</span>
488
+ <span class="cline-any cline-yes">2x</span>
489
+ <span class="cline-any cline-no">&nbsp;</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">2x</span>
495
+ <span class="cline-any cline-yes">2x</span>
496
+ <span class="cline-any cline-yes">2x</span>
497
+ <span class="cline-any cline-yes">2x</span>
498
+ <span class="cline-any cline-yes">2x</span>
499
+ <span class="cline-any cline-yes">2x</span>
500
+ <span class="cline-any cline-yes">2x</span>
501
+ <span class="cline-any cline-yes">2x</span>
502
+ <span class="cline-any cline-yes">2x</span>
503
+ <span class="cline-any cline-yes">2x</span>
504
+ <span class="cline-any cline-yes">2x</span>
505
+ <span class="cline-any cline-yes">2x</span>
506
+ <span class="cline-any cline-yes">1x</span>
507
+ <span class="cline-any cline-yes">1x</span>
508
+ <span class="cline-any cline-yes">1x</span>
509
+ <span class="cline-any cline-yes">1x</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">1x</span>
512
+ <span class="cline-any cline-yes">1x</span>
513
+ <span class="cline-any cline-yes">1x</span>
514
+ <span class="cline-any cline-yes">1x</span>
515
+ <span class="cline-any cline-yes">1x</span>
516
+ <span class="cline-any cline-yes">1x</span>
517
+ <span class="cline-any cline-no">&nbsp;</span>
518
+ <span class="cline-any cline-yes">1x</span>
519
+ <span class="cline-any cline-yes">1x</span>
520
+ <span class="cline-any cline-yes">1x</span>
521
+ <span class="cline-any cline-yes">1x</span>
522
+ <span class="cline-any cline-yes">1x</span>
523
+ <span class="cline-any cline-yes">11x</span>
524
+ <span class="cline-any cline-yes">11x</span>
525
+ <span class="cline-any cline-yes">1x</span>
526
+ <span class="cline-any cline-yes">1x</span>
527
+ <span class="cline-any cline-yes">1x</span>
528
+ <span class="cline-any cline-yes">1x</span>
529
+ <span class="cline-any cline-no">&nbsp;</span>
530
+ <span class="cline-any cline-yes">1x</span>
531
+ <span class="cline-any cline-yes">1x</span>
532
+ <span class="cline-any cline-yes">1x</span>
533
+ <span class="cline-any cline-yes">1x</span>
534
+ <span class="cline-any cline-no">&nbsp;</span>
535
+ <span class="cline-any cline-yes">1x</span>
536
+ <span class="cline-any cline-yes">1x</span>
537
+ <span class="cline-any cline-yes">1x</span>
538
+ <span class="cline-any cline-yes">1x</span>
539
+ <span class="cline-any cline-yes">1x</span>
540
+ <span class="cline-any cline-yes">1x</span>
541
+ <span class="cline-any cline-yes">1x</span>
542
+ <span class="cline-any cline-yes">1x</span>
543
+ <span class="cline-any cline-yes">1x</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-no">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-no">&nbsp;</span>
551
+ <span class="cline-any cline-no">&nbsp;</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
553
+ <span class="cline-any cline-no">&nbsp;</span>
554
+ <span class="cline-any cline-no">&nbsp;</span>
555
+ <span class="cline-any cline-no">&nbsp;</span>
556
+ <span class="cline-any cline-yes">1x</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">2x</span>
560
+ <span class="cline-any cline-yes">2x</span>
561
+ <span class="cline-any cline-yes">2x</span>
562
+ <span class="cline-any cline-yes">2x</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">2x</span>
574
+ <span class="cline-any cline-yes">1x</span>
575
+ <span class="cline-any cline-yes">2x</span>
576
+ <span class="cline-any cline-yes">2x</span>
577
+ <span class="cline-any cline-yes">2x</span>
578
+ <span class="cline-any cline-yes">2x</span>
579
+ <span class="cline-any cline-yes">2x</span>
580
+ <span class="cline-any cline-yes">2x</span>
581
+ <span class="cline-any cline-yes">2x</span>
582
+ <span class="cline-any cline-yes">2x</span>
583
+ <span class="cline-any cline-yes">2x</span>
584
+ <span class="cline-any cline-yes">2x</span>
585
+ <span class="cline-any cline-yes">2x</span>
586
+ <span class="cline-any cline-yes">2x</span>
587
+ <span class="cline-any cline-yes">2x</span>
588
+ <span class="cline-any cline-yes">2x</span>
589
+ <span class="cline-any cline-yes">2x</span>
590
+ <span class="cline-any cline-yes">1x</span>
591
+ <span class="cline-any cline-yes">1x</span>
592
+ <span class="cline-any cline-yes">1x</span>
593
+ <span class="cline-any cline-yes">1x</span>
594
+ <span class="cline-any cline-yes">1x</span>
595
+ <span class="cline-any cline-yes">1x</span>
596
+ <span class="cline-any cline-yes">1x</span>
597
+ <span class="cline-any cline-yes">1x</span>
598
+ <span class="cline-any cline-yes">1x</span>
599
+ <span class="cline-any cline-yes">2x</span>
600
+ <span class="cline-any cline-yes">2x</span>
601
+ <span class="cline-any cline-yes">2x</span>
602
+ <span class="cline-any cline-yes">2x</span>
603
+ <span class="cline-any cline-yes">2x</span>
604
+ <span class="cline-any cline-yes">2x</span>
605
+ <span class="cline-any cline-yes">18x</span>
606
+ <span class="cline-any cline-yes">18x</span>
607
+ <span class="cline-any cline-yes">18x</span>
608
+ <span class="cline-any cline-yes">18x</span>
609
+ <span class="cline-any cline-yes">18x</span>
610
+ <span class="cline-any cline-yes">18x</span>
611
+ <span class="cline-any cline-yes">18x</span>
612
+ <span class="cline-any cline-yes">51x</span>
613
+ <span class="cline-any cline-yes">51x</span>
614
+ <span class="cline-any cline-yes">51x</span>
615
+ <span class="cline-any cline-no">&nbsp;</span>
616
+ <span class="cline-any cline-no">&nbsp;</span>
617
+ <span class="cline-any cline-yes">51x</span>
618
+ <span class="cline-any cline-yes">51x</span>
619
+ <span class="cline-any cline-yes">51x</span>
620
+ <span class="cline-any cline-yes">51x</span>
621
+ <span class="cline-any cline-yes">51x</span>
622
+ <span class="cline-any cline-yes">18x</span>
623
+ <span class="cline-any cline-yes">18x</span>
624
+ <span class="cline-any cline-yes">18x</span>
625
+ <span class="cline-any cline-yes">1x</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
627
+ &nbsp;
628
+ const LocalStrategy = require( "passport-local" ).Strategy;
629
+ &nbsp;
630
+ /**
631
+ * Temporarily tracks additional session data per remotely authenticated user.
632
+ *
633
+ * Some strategies (such as passport-saml) expect certain strategy-related data
634
+ * per authenticated user to be present on `req.user` prior to accepting request
635
+ * for logging out. In hitchy, `req.user` is fetched from database on every
636
+ * request and thus no temporary data is available. Hence, this local map is
637
+ * used instead to track any additional data for those strategies.
638
+ *
639
+ * @type {Map&lt;any, any&gt;}
640
+ */
641
+ const RemoteAuthCustomData = new Map();
642
+ &nbsp;
643
+ module.exports = function() {
644
+ const api = this;
645
+ const { models, services } = api.runtime;
646
+ &nbsp;
647
+ const logAlert = api.log( "hitchy:plugin:auth:alert" );
648
+ &nbsp;
649
+ /**
650
+ * Fetches named user's local profile.
651
+ *
652
+ * @param {string} strategyName name of strategy used to authenticate user
653
+ * @param {string} username name of user to search locally for related profile
654
+ * @param {boolean} createIfMissing set true to create user's profile if it's missing currenly
655
+ * @param {function(Error?, object):void} doneFn callback invoked with encountered error or user's profile
656
+ * @returns {void}
657
+ */
658
+ function getLocalProfile( strategyName, username, createIfMissing, doneFn ) {
659
+ models.User.find( { eq: { name: username } } )
660
+ .then( candidates =&gt; candidates.find( user =&gt; user.strategy === strategyName ) )
661
+ .then( match =&gt; {
662
+ if ( match ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
663
+ <span class="cstat-no" title="statement not covered" > return match;</span>
664
+ <span class="cstat-no" title="statement not covered" > }</span>
665
+ &nbsp;
666
+ if ( createIfMissing ) {
667
+ const newUser = new models.User();
668
+ newUser.name = username;
669
+ newUser.strategy = strategyName;
670
+ &nbsp;
671
+ return newUser.save();
672
+ }
673
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
674
+ <span class="cstat-no" title="statement not covered" > throw new TypeError( "selected user does not exist" );</span>
675
+ } )
676
+ .then( profile =&gt; doneFn( null, profile ) )
677
+ .catch( doneFn );
678
+ }
679
+ &nbsp;
680
+ /**
681
+ * Implements helpers for generating strategies for passport.js.
682
+ */
683
+ class AuthenticationStrategies {
684
+ /**
685
+ * Picks user based on provided name and checks if provided password is
686
+ * matching or not.
687
+ *
688
+ * @param {string} username name of user to authenticate
689
+ * @param {string} password named user's password for authentication
690
+ * @param {function(Error?, object, object)} done invoked with optional error, authenticated user or some message as feedback
691
+ * @returns {void}
692
+ */
693
+ static <span class="fstat-no" title="function not covered" >checkAuthentication( username, password, done ) {</span>
694
+ <span class="cstat-no" title="statement not covered" > models.User</span>
695
+ <span class="cstat-no" title="statement not covered" > .find( { eq: { username } }, {}, { loadRecords: true } )</span>
696
+ <span class="cstat-no" title="statement not covered" > .then( matches =&gt; {</span>
697
+ <span class="cstat-no" title="statement not covered" > switch ( matches.length ) {</span>
698
+ <span class="cstat-no" title="statement not covered" > case 0 :</span>
699
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: "Incorrect username." } );</span>
700
+ <span class="cstat-no" title="statement not covered" > return undefined;</span>
701
+ <span class="cstat-no" title="statement not covered" ></span>
702
+ <span class="cstat-no" title="statement not covered" > case 1 : {</span>
703
+ <span class="cstat-no" title="statement not covered" > const [user] = matches;</span>
704
+ <span class="cstat-no" title="statement not covered" ></span>
705
+ <span class="cstat-no" title="statement not covered" > if ( user.strategy &amp;&amp; user.strategy !== "local" ) {</span>
706
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: "Authenticating this user requires different strategy." } );</span>
707
+ <span class="cstat-no" title="statement not covered" > return undefined;</span>
708
+ <span class="cstat-no" title="statement not covered" > }</span>
709
+ <span class="cstat-no" title="statement not covered" ></span>
710
+ <span class="cstat-no" title="statement not covered" > return user.verifyPassword( password ).then( result =&gt; {</span>
711
+ <span class="cstat-no" title="statement not covered" > if ( result ) {</span>
712
+ <span class="cstat-no" title="statement not covered" > done( null, user );</span>
713
+ <span class="cstat-no" title="statement not covered" > } else {</span>
714
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: "Incorrect password." } );</span>
715
+ <span class="cstat-no" title="statement not covered" > }</span>
716
+ <span class="cstat-no" title="statement not covered" > } );</span>
717
+ <span class="cstat-no" title="statement not covered" > }</span>
718
+ <span class="cstat-no" title="statement not covered" ></span>
719
+ <span class="cstat-no" title="statement not covered" > default :</span>
720
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: "Ambiguous username." } );</span>
721
+ <span class="cstat-no" title="statement not covered" > return undefined;</span>
722
+ <span class="cstat-no" title="statement not covered" > }</span>
723
+ <span class="cstat-no" title="statement not covered" > } )</span>
724
+ <span class="cstat-no" title="statement not covered" > .catch( err =&gt; {</span>
725
+ <span class="cstat-no" title="statement not covered" > logAlert( err );</span>
726
+ <span class="cstat-no" title="statement not covered" > done( err );</span>
727
+ <span class="cstat-no" title="statement not covered" > } );</span>
728
+ <span class="cstat-no" title="statement not covered" > }</span>
729
+ &nbsp;
730
+ /**
731
+ * Generates local strategy authenticating user based on local user
732
+ * model managed in local ODM.
733
+ *
734
+ * @returns {Strategy} generated strategy for use with passport.js
735
+ */
736
+ static generateLocal() {
737
+ const strategy = new LocalStrategy( ( name, password, done ) =&gt; {
738
+ services.AuthManager.checkAuthentication( name, password, done )
739
+ .then( user =&gt; {
740
+ done( null, user );
741
+ } )
742
+ .catch( error =&gt; {
743
+ <span class="cstat-no" title="statement not covered" > if ( error instanceof services.HttpException &amp;&amp; error.statusCode === 400 ) {</span>
744
+ <span class="cstat-no" title="statement not covered" > done( null, false, { message: error.message } );</span>
745
+ <span class="cstat-no" title="statement not covered" > } else {</span>
746
+ <span class="cstat-no" title="statement not covered" > done( error );</span>
747
+ <span class="cstat-no" title="statement not covered" > }</span>
748
+ } );
749
+ } );
750
+ &nbsp;
751
+ strategy.passwordRequried = true;
752
+ &nbsp;
753
+ return strategy;
754
+ }
755
+ &nbsp;
756
+ /**
757
+ * Generates SAML strategy authenticating user against some remote IdP
758
+ * based on SAML v2.0 protocol.
759
+ *
760
+ * @param {string} strategyName name of resulting strategy in context of your application
761
+ * @param {Hitchy.Plugin.Auth.SamlConfig} config SAML protocol configuration
762
+ * @returns {Strategy} generated strategy for use with passport.js
763
+ */
764
+ static generateSaml( strategyName, config ) {
765
+ const verifyLocalProfileOnLogin = ( req, userInfo, done ) =&gt; {
766
+ RemoteAuthCustomData.set( `${strategyName}:${userInfo.nameID}`, { ...userInfo } );
767
+ &nbsp;
768
+ getLocalProfile( strategyName, userInfo.nameID, true, done );
769
+ };
770
+ &nbsp;
771
+ const verifyLocalProfileOnLogout = <span class="fstat-no" title="function not covered" >( req, userInfo, done ) =&gt; {</span>
772
+ <span class="cstat-no" title="statement not covered" > getLocalProfile( strategyName, userInfo.nameID, false, done );</span>
773
+ };
774
+ &nbsp;
775
+ const { Strategy } = require( "passport-saml" );
776
+ const strategy = new Strategy( {
777
+ ...config,
778
+ passReqToCallback: true,
779
+ }, verifyLocalProfileOnLogin, verifyLocalProfileOnLogout );
780
+ &nbsp;
781
+ /**
782
+ * Triggers requesting user being logged out remotely.
783
+ *
784
+ * @param {Hitchy.Core.IncomingMessage} req request descriptor
785
+ * @returns {Promise&lt;boolean&gt;} promises indicator if request was redirected to come back after remote logout succeeded
786
+ */
787
+ strategy.logOutRemotely = req =&gt; {
788
+ if ( req.query.SAMLResponse ) {
789
+ return Promise.resolve( false );
790
+ }
791
+ &nbsp;
792
+ const res = req.context.response;
793
+ &nbsp;
794
+ return new Promise( ( resolve, reject ) =&gt; {
795
+ const { user } = req;
796
+ &nbsp;
797
+ const remoteSessionKey = `${strategyName}:${user.name}`;
798
+ &nbsp;
799
+ if ( !user || user.strategy !== strategyName || !RemoteAuthCustomData.has( remoteSessionKey ) ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
800
+ <span class="cstat-no" title="statement not covered" > resolve( {} );</span>
801
+ } else {
802
+ // inject custom auth data into `req.user` as expected by passport-saml strategy
803
+ const data = RemoteAuthCustomData.get( remoteSessionKey );
804
+ &nbsp;
805
+ for ( const name of Object.keys( data ) ) {
806
+ user[name] = data[name];
807
+ }
808
+ &nbsp;
809
+ user.nameID = user.name;
810
+ &nbsp;
811
+ if ( !user.nameID || !user.nameIDFormat ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
812
+ <span class="cstat-no" title="statement not covered" > reject( new Error( "missing nameID and nameIDFormat of user required for requesting logout at IdP" ) );</span>
813
+ } else {
814
+ // ask strategy for generating logout URL for redirecting client to
815
+ strategy.logout( req, ( error, logoutUrl ) =&gt; {
816
+ if ( error ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
817
+ <span class="cstat-no" title="statement not covered" > reject( error );</span>
818
+ } else {
819
+ resolve( { name: remoteSessionKey, url: logoutUrl } );
820
+ }
821
+ } );
822
+ }
823
+ }
824
+ } )
825
+ .then( ( { name, url } ) =&gt; {
826
+ if ( url ) {
827
+ // first pass -&gt; redirect to IdP
828
+ res.redirect( 302, url );
829
+ return true;
830
+ }
831
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
832
+ <span class="cstat-no" title="statement not covered" > // second pass -&gt; returned from IdP</span>
833
+ <span class="cstat-no" title="statement not covered" ></span>
834
+ <span class="cstat-no" title="statement not covered" > if ( name ) {</span>
835
+ <span class="cstat-no" title="statement not covered" > RemoteAuthCustomData.delete( name );</span>
836
+ <span class="cstat-no" title="statement not covered" > }</span>
837
+ <span class="cstat-no" title="statement not covered" ></span>
838
+ <span class="cstat-no" title="statement not covered" > return false;</span>
839
+ } );
840
+ };
841
+ &nbsp;
842
+ Object.defineProperty( strategy, "$$doNotSeal$$", { value: true } );
843
+ &nbsp;
844
+ return strategy;
845
+ }
846
+ &nbsp;
847
+ /**
848
+ * Creates strategy for illustrating and testing integration with remote IdP
849
+ * supporting OpenID Connect with Authorization Code Flow.
850
+ *
851
+ * @param {string} strategyName name of resulting strategy in context of your application
852
+ * @param {ClientMetaData} config OpenID Connect client configuration
853
+ * @returns {Promise&lt;Strategy&gt;} promises generated strategy for use with passport.js
854
+ */
855
+ static async generateOpenIdConnect( strategyName, config ) { // eslint-disable-line consistent-this
856
+ const verifyLocalProfileOnLogin = ( req, tokens, userInfo, done ) =&gt; {
857
+ getLocalProfile( strategyName, userInfo.preferred_username, true, done );
858
+ };
859
+ &nbsp;
860
+ const { Issuer, Strategy } = require( "openid-client" );
861
+ const issuer = await Issuer.discover( config.discovery_url );
862
+ const client = new issuer.Client( config );
863
+ &nbsp;
864
+ const strategy = new Strategy( {
865
+ client,
866
+ passReqToCallback: true,
867
+ }, verifyLocalProfileOnLogin );
868
+ &nbsp;
869
+ strategy.logOutRemotely = req =&gt; {
870
+ const key = `${strategyName}:logout_state`;
871
+ &nbsp;
872
+ if ( req.session[key] &amp;&amp; req.query.state === req.session[key] ) {
873
+ return Promise.resolve( false );
874
+ }
875
+ &nbsp;
876
+ const state = req.session[key] = require( "crypto" ).randomBytes( 32 ).toString( "base64" ); // eslint-disable-line no-param-reassign
877
+ &nbsp;
878
+ // redirect user to discovered end_session_url of IdP
879
+ req.context.response.redirect( 302, client.endSessionUrl( { state } ) );
880
+ &nbsp;
881
+ return Promise.resolve( true );
882
+ };
883
+ &nbsp;
884
+ Object.defineProperty( strategy, "$$doNotSeal$$", { value: true } );
885
+ &nbsp;
886
+ return strategy;
887
+ }
888
+ &nbsp;
889
+ /**
890
+ * Retrieves name of strategy to use by default.
891
+ *
892
+ * @returns {string} name of strategy to use for user authentication
893
+ */
894
+ static defaultStrategy() {
895
+ const { defaultStrategy, strategies } = api.config.auth;
896
+ &nbsp;
897
+ if ( defaultStrategy ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
898
+ <span class="cstat-no" title="statement not covered" > return defaultStrategy;</span>
899
+ <span class="cstat-no" title="statement not covered" > }</span>
900
+ &nbsp;
901
+ const strategiesNames = Object.keys( strategies );
902
+ &nbsp;
903
+ return strategiesNames.length === 1 ? strategiesNames[0] : "local";
904
+ }
905
+ }
906
+ &nbsp;
907
+ return AuthenticationStrategies;
908
+ };
909
+ &nbsp;</pre></td></tr></table></pre>
910
+
911
+ <div class='push'></div><!-- for sticky footer -->
912
+ </div><!-- /wrapper -->
913
+ <div class='footer quiet pad2 space-top1 center small'>
914
+ Code coverage generated by
915
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
916
+ at Sun Mar 27 2022 22:51:56 GMT+0200 (Mitteleuropäische Sommerzeit)
917
+ </div>
918
+ </div>
919
+ <script src="../../../../prettify.js"></script>
920
+ <script>
921
+ window.onload = function () {
922
+ prettyPrint();
923
+ };
924
+ </script>
925
+ <script src="../../../../sorter.js"></script>
926
+ <script src="../../../../block-navigation.js"></script>
927
+ </body>
928
+ </html>
929
+