@hitchy/plugin-auth 0.3.5 → 0.3.7
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.
- package/package.json +15 -15
- package/.gitlab-ci.yml +0 -69
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -236
- package/coverage/plugin-auth/api/controller/index.html +0 -116
- package/coverage/plugin-auth/api/controller/user.js.html +0 -373
- package/coverage/plugin-auth/api/model/authorization/index.html +0 -116
- package/coverage/plugin-auth/api/model/authorization/rule.js.html +0 -232
- package/coverage/plugin-auth/api/model/index.html +0 -146
- package/coverage/plugin-auth/api/model/role.js.html +0 -205
- package/coverage/plugin-auth/api/model/user-to-role.js.html +0 -172
- package/coverage/plugin-auth/api/model/user.js.html +0 -757
- package/coverage/plugin-auth/api/policy/authentication.js.html +0 -784
- package/coverage/plugin-auth/api/policy/authorization.js.html +0 -187
- package/coverage/plugin-auth/api/policy/index.html +0 -146
- package/coverage/plugin-auth/api/policy/user.js.html +0 -484
- package/coverage/plugin-auth/api/service/auth/index.html +0 -116
- package/coverage/plugin-auth/api/service/auth/manager.js.html +0 -964
- package/coverage/plugin-auth/api/service/authentication/index.html +0 -131
- package/coverage/plugin-auth/api/service/authentication/passport.js.html +0 -298
- package/coverage/plugin-auth/api/service/authentication/strategies.js.html +0 -934
- package/coverage/plugin-auth/api/service/authorization/index.html +0 -146
- package/coverage/plugin-auth/api/service/authorization/node.js.html +0 -949
- package/coverage/plugin-auth/api/service/authorization/policy-generator.js.html +0 -391
- package/coverage/plugin-auth/api/service/authorization/tree.js.html +0 -988
- package/coverage/plugin-auth/config/auth.js.html +0 -145
- package/coverage/plugin-auth/config/index.html +0 -116
- package/coverage/plugin-auth/index.html +0 -116
- package/coverage/plugin-auth/index.js.html +0 -388
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/tmp/coverage-2884-1653923449663-0.json +0 -1
- package/docs/.vuepress/config.js +0 -55
- package/docs/.vuepress/styles/palette.styl +0 -4
- package/docs/api/config.md +0 -180
- package/docs/api/controller/readme.md +0 -10
- package/docs/api/controller/user.md +0 -44
- package/docs/api/model/authorization-rule.md +0 -38
- package/docs/api/model/readme.md +0 -13
- package/docs/api/model/role.md +0 -22
- package/docs/api/model/user-to-role.md +0 -26
- package/docs/api/model/user.md +0 -50
- package/docs/api/policy/authentication.md +0 -44
- package/docs/api/policy/authorization.md +0 -27
- package/docs/api/policy/readme.md +0 -12
- package/docs/api/policy/user.md +0 -22
- package/docs/api/readme.md +0 -52
- package/docs/api/routing.md +0 -101
- package/docs/api/service/auth-manager.md +0 -86
- package/docs/api/service/authentication-passport.md +0 -21
- package/docs/api/service/authentication-strategies.md +0 -22
- package/docs/api/service/authorization-node.md +0 -102
- package/docs/api/service/authorization-policy-generator.md +0 -66
- package/docs/api/service/authorization-tree.md +0 -123
- package/docs/api/service/readme.md +0 -15
- package/docs/guides/getting-started.md +0 -69
- package/docs/guides/idp-login.png +0 -0
- package/docs/guides/idp-saml-cert.png +0 -0
- package/docs/guides/openid-connect.md +0 -164
- package/docs/guides/readme.md +0 -12
- package/docs/guides/saml.md +0 -161
- package/docs/introduction.md +0 -78
- package/docs/readme.md +0 -11
|
@@ -1,934 +0,0 @@
|
|
|
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
|
-
<template id="filterTemplate">
|
|
58
|
-
<div class="quiet">
|
|
59
|
-
Filter:
|
|
60
|
-
<input oninput="onInput()" type="search" id="fileSearch">
|
|
61
|
-
</div>
|
|
62
|
-
</template>
|
|
63
|
-
</div>
|
|
64
|
-
<div class='status-line medium'></div>
|
|
65
|
-
<pre><table class="coverage">
|
|
66
|
-
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
-
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
-
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
-
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
-
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
-
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
-
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
-
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
-
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
-
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
-
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
-
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
-
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
-
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
-
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
-
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
-
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
-
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
-
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
-
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
-
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
-
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
-
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
-
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
-
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
-
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
-
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
-
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
-
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
-
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
-
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
-
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
-
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
-
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
-
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
-
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
-
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
-
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
-
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
-
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
-
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
-
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
-
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
-
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
-
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
-
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
-
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
-
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
-
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
-
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
-
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
-
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
-
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
-
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
-
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
-
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
-
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
-
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
-
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
-
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
-
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
-
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
-
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
-
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
-
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
-
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
-
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
-
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
-
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
-
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
-
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
-
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
-
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
-
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
-
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
-
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
-
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
-
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
-
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
-
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
-
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
-
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
-
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
-
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
-
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
-
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
-
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
-
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
-
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
-
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
-
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
-
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
-
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
-
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
-
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
-
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
-
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
-
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
-
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
-
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
-
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
-
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
-
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
-
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
-
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
-
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
-
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
-
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
-
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
-
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
-
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
-
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
-
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
-
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
-
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
-
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
-
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
-
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
-
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
-
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
-
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
-
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
-
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
-
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
-
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
-
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
-
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
-
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
-
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
-
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
-
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
-
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
-
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
-
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
-
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
-
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
-
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
-
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
-
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
-
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
-
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
-
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
-
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
-
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
-
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
-
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
-
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
-
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
-
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
-
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
-
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
-
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
-
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
-
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
-
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
-
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
-
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
-
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
-
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
-
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
-
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
-
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
-
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
-
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
-
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
-
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
-
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
-
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
-
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
-
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
-
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
-
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
-
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
-
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
-
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
-
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
-
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
-
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
-
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
-
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
-
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
-
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
-
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
-
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
-
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
-
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
-
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
-
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
-
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
-
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
-
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
-
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
-
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
-
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
-
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
-
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
-
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
-
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
-
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
-
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
-
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
-
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
-
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
-
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
-
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
-
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
-
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
-
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
-
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
-
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
-
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
-
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
-
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
-
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
-
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
-
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
-
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
-
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
-
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
-
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
-
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
-
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
-
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
-
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
-
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
-
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
-
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
-
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
-
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
-
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
-
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
-
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
-
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
-
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
-
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
-
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
-
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
-
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
-
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
-
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
-
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
-
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
-
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
-
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
-
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
-
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
-
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
-
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
-
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
-
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
-
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
-
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
-
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
-
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
-
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
-
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
-
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
-
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
-
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
-
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
-
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
-
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
-
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
-
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
-
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
-
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
-
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
-
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
-
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
-
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
-
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
-
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
-
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
-
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
-
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
-
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
-
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
-
<a name='L284'></a><a href='#L284'>284</a></td><td class="line-coverage quiet"><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">1x</span>
|
|
362
|
-
<span class="cline-any cline-yes">1x</span>
|
|
363
|
-
<span class="cline-any cline-yes">1x</span>
|
|
364
|
-
<span class="cline-any cline-yes">1x</span>
|
|
365
|
-
<span class="cline-any cline-yes">1x</span>
|
|
366
|
-
<span class="cline-any cline-yes">1x</span>
|
|
367
|
-
<span class="cline-any cline-yes">19x</span>
|
|
368
|
-
<span class="cline-any cline-yes">19x</span>
|
|
369
|
-
<span class="cline-any cline-yes">19x</span>
|
|
370
|
-
<span class="cline-any cline-yes">19x</span>
|
|
371
|
-
<span class="cline-any cline-yes">19x</span>
|
|
372
|
-
<span class="cline-any cline-yes">19x</span>
|
|
373
|
-
<span class="cline-any cline-yes">19x</span>
|
|
374
|
-
<span class="cline-any cline-yes">19x</span>
|
|
375
|
-
<span class="cline-any cline-yes">19x</span>
|
|
376
|
-
<span class="cline-any cline-yes">19x</span>
|
|
377
|
-
<span class="cline-any cline-yes">19x</span>
|
|
378
|
-
<span class="cline-any cline-yes">19x</span>
|
|
379
|
-
<span class="cline-any cline-yes">19x</span>
|
|
380
|
-
<span class="cline-any cline-yes">19x</span>
|
|
381
|
-
<span class="cline-any cline-yes">19x</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-no"> </span>
|
|
387
|
-
<span class="cline-any cline-no"> </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-yes">2x</span>
|
|
391
|
-
<span class="cline-any cline-yes">2x</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-no"> </span>
|
|
397
|
-
<span class="cline-any cline-no"> </span>
|
|
398
|
-
<span class="cline-any cline-yes">2x</span>
|
|
399
|
-
<span class="cline-any cline-yes">2x</span>
|
|
400
|
-
<span class="cline-any cline-yes">2x</span>
|
|
401
|
-
<span class="cline-any cline-yes">2x</span>
|
|
402
|
-
<span class="cline-any cline-yes">19x</span>
|
|
403
|
-
<span class="cline-any cline-yes">19x</span>
|
|
404
|
-
<span class="cline-any cline-yes">19x</span>
|
|
405
|
-
<span class="cline-any cline-yes">19x</span>
|
|
406
|
-
<span class="cline-any cline-yes">19x</span>
|
|
407
|
-
<span class="cline-any cline-yes">19x</span>
|
|
408
|
-
<span class="cline-any cline-yes">19x</span>
|
|
409
|
-
<span class="cline-any cline-yes">19x</span>
|
|
410
|
-
<span class="cline-any cline-yes">19x</span>
|
|
411
|
-
<span class="cline-any cline-yes">19x</span>
|
|
412
|
-
<span class="cline-any cline-yes">19x</span>
|
|
413
|
-
<span class="cline-any cline-yes">19x</span>
|
|
414
|
-
<span class="cline-any cline-yes">19x</span>
|
|
415
|
-
<span class="cline-any cline-yes">19x</span>
|
|
416
|
-
<span class="cline-any cline-yes">19x</span>
|
|
417
|
-
<span class="cline-any cline-no"> </span>
|
|
418
|
-
<span class="cline-any cline-no"> </span>
|
|
419
|
-
<span class="cline-any cline-no"> </span>
|
|
420
|
-
<span class="cline-any cline-no"> </span>
|
|
421
|
-
<span class="cline-any cline-no"> </span>
|
|
422
|
-
<span class="cline-any cline-no"> </span>
|
|
423
|
-
<span class="cline-any cline-no"> </span>
|
|
424
|
-
<span class="cline-any cline-no"> </span>
|
|
425
|
-
<span class="cline-any cline-no"> </span>
|
|
426
|
-
<span class="cline-any cline-no"> </span>
|
|
427
|
-
<span class="cline-any cline-no"> </span>
|
|
428
|
-
<span class="cline-any cline-no"> </span>
|
|
429
|
-
<span class="cline-any cline-no"> </span>
|
|
430
|
-
<span class="cline-any cline-no"> </span>
|
|
431
|
-
<span class="cline-any cline-no"> </span>
|
|
432
|
-
<span class="cline-any cline-no"> </span>
|
|
433
|
-
<span class="cline-any cline-no"> </span>
|
|
434
|
-
<span class="cline-any cline-no"> </span>
|
|
435
|
-
<span class="cline-any cline-no"> </span>
|
|
436
|
-
<span class="cline-any cline-no"> </span>
|
|
437
|
-
<span class="cline-any cline-no"> </span>
|
|
438
|
-
<span class="cline-any cline-no"> </span>
|
|
439
|
-
<span class="cline-any cline-no"> </span>
|
|
440
|
-
<span class="cline-any cline-no"> </span>
|
|
441
|
-
<span class="cline-any cline-no"> </span>
|
|
442
|
-
<span class="cline-any cline-no"> </span>
|
|
443
|
-
<span class="cline-any cline-no"> </span>
|
|
444
|
-
<span class="cline-any cline-no"> </span>
|
|
445
|
-
<span class="cline-any cline-no"> </span>
|
|
446
|
-
<span class="cline-any cline-no"> </span>
|
|
447
|
-
<span class="cline-any cline-no"> </span>
|
|
448
|
-
<span class="cline-any cline-no"> </span>
|
|
449
|
-
<span class="cline-any cline-no"> </span>
|
|
450
|
-
<span class="cline-any cline-no"> </span>
|
|
451
|
-
<span class="cline-any cline-no"> </span>
|
|
452
|
-
<span class="cline-any cline-yes">19x</span>
|
|
453
|
-
<span class="cline-any cline-yes">19x</span>
|
|
454
|
-
<span class="cline-any cline-yes">19x</span>
|
|
455
|
-
<span class="cline-any cline-yes">19x</span>
|
|
456
|
-
<span class="cline-any cline-yes">19x</span>
|
|
457
|
-
<span class="cline-any cline-yes">19x</span>
|
|
458
|
-
<span class="cline-any cline-yes">19x</span>
|
|
459
|
-
<span class="cline-any cline-yes">19x</span>
|
|
460
|
-
<span class="cline-any cline-yes">19x</span>
|
|
461
|
-
<span class="cline-any cline-yes">9x</span>
|
|
462
|
-
<span class="cline-any cline-yes">9x</span>
|
|
463
|
-
<span class="cline-any cline-yes">9x</span>
|
|
464
|
-
<span class="cline-any cline-yes">9x</span>
|
|
465
|
-
<span class="cline-any cline-yes">9x</span>
|
|
466
|
-
<span class="cline-any cline-no"> </span>
|
|
467
|
-
<span class="cline-any cline-no"> </span>
|
|
468
|
-
<span class="cline-any cline-no"> </span>
|
|
469
|
-
<span class="cline-any cline-no"> </span>
|
|
470
|
-
<span class="cline-any cline-no"> </span>
|
|
471
|
-
<span class="cline-any cline-yes">9x</span>
|
|
472
|
-
<span class="cline-any cline-yes">19x</span>
|
|
473
|
-
<span class="cline-any cline-yes">19x</span>
|
|
474
|
-
<span class="cline-any cline-yes">19x</span>
|
|
475
|
-
<span class="cline-any cline-yes">19x</span>
|
|
476
|
-
<span class="cline-any cline-yes">19x</span>
|
|
477
|
-
<span class="cline-any cline-yes">19x</span>
|
|
478
|
-
<span class="cline-any cline-yes">19x</span>
|
|
479
|
-
<span class="cline-any cline-yes">19x</span>
|
|
480
|
-
<span class="cline-any cline-yes">19x</span>
|
|
481
|
-
<span class="cline-any cline-yes">19x</span>
|
|
482
|
-
<span class="cline-any cline-yes">19x</span>
|
|
483
|
-
<span class="cline-any cline-yes">19x</span>
|
|
484
|
-
<span class="cline-any cline-yes">19x</span>
|
|
485
|
-
<span class="cline-any cline-yes">19x</span>
|
|
486
|
-
<span class="cline-any cline-yes">19x</span>
|
|
487
|
-
<span class="cline-any cline-yes">19x</span>
|
|
488
|
-
<span class="cline-any cline-yes">2x</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">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-no"> </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">2x</span>
|
|
507
|
-
<span class="cline-any cline-yes">2x</span>
|
|
508
|
-
<span class="cline-any cline-yes">2x</span>
|
|
509
|
-
<span class="cline-any cline-yes">2x</span>
|
|
510
|
-
<span class="cline-any cline-yes">2x</span>
|
|
511
|
-
<span class="cline-any cline-yes">2x</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-yes">1x</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-no"> </span>
|
|
524
|
-
<span class="cline-any cline-yes">1x</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-yes">11x</span>
|
|
530
|
-
<span class="cline-any cline-yes">11x</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-yes">1x</span>
|
|
535
|
-
<span class="cline-any cline-no"> </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-no"> </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-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">1x</span>
|
|
554
|
-
<span class="cline-any cline-no"> </span>
|
|
555
|
-
<span class="cline-any cline-no"> </span>
|
|
556
|
-
<span class="cline-any cline-no"> </span>
|
|
557
|
-
<span class="cline-any cline-no"> </span>
|
|
558
|
-
<span class="cline-any cline-no"> </span>
|
|
559
|
-
<span class="cline-any cline-no"> </span>
|
|
560
|
-
<span class="cline-any cline-no"> </span>
|
|
561
|
-
<span class="cline-any cline-no"> </span>
|
|
562
|
-
<span class="cline-any cline-yes">1x</span>
|
|
563
|
-
<span class="cline-any cline-yes">2x</span>
|
|
564
|
-
<span class="cline-any cline-yes">2x</span>
|
|
565
|
-
<span class="cline-any cline-yes">2x</span>
|
|
566
|
-
<span class="cline-any cline-yes">2x</span>
|
|
567
|
-
<span class="cline-any cline-yes">2x</span>
|
|
568
|
-
<span class="cline-any cline-yes">2x</span>
|
|
569
|
-
<span class="cline-any cline-yes">19x</span>
|
|
570
|
-
<span class="cline-any cline-yes">19x</span>
|
|
571
|
-
<span class="cline-any cline-yes">19x</span>
|
|
572
|
-
<span class="cline-any cline-yes">19x</span>
|
|
573
|
-
<span class="cline-any cline-yes">19x</span>
|
|
574
|
-
<span class="cline-any cline-yes">19x</span>
|
|
575
|
-
<span class="cline-any cline-yes">19x</span>
|
|
576
|
-
<span class="cline-any cline-yes">19x</span>
|
|
577
|
-
<span class="cline-any cline-yes">19x</span>
|
|
578
|
-
<span class="cline-any cline-yes">19x</span>
|
|
579
|
-
<span class="cline-any cline-yes">2x</span>
|
|
580
|
-
<span class="cline-any cline-yes">1x</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">2x</span>
|
|
591
|
-
<span class="cline-any cline-yes">2x</span>
|
|
592
|
-
<span class="cline-any cline-yes">2x</span>
|
|
593
|
-
<span class="cline-any cline-yes">2x</span>
|
|
594
|
-
<span class="cline-any cline-yes">2x</span>
|
|
595
|
-
<span class="cline-any cline-yes">2x</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">1x</span>
|
|
600
|
-
<span class="cline-any cline-yes">1x</span>
|
|
601
|
-
<span class="cline-any cline-yes">1x</span>
|
|
602
|
-
<span class="cline-any cline-yes">1x</span>
|
|
603
|
-
<span class="cline-any cline-yes">1x</span>
|
|
604
|
-
<span class="cline-any cline-yes">1x</span>
|
|
605
|
-
<span class="cline-any cline-yes">2x</span>
|
|
606
|
-
<span class="cline-any cline-yes">2x</span>
|
|
607
|
-
<span class="cline-any cline-yes">2x</span>
|
|
608
|
-
<span class="cline-any cline-yes">2x</span>
|
|
609
|
-
<span class="cline-any cline-yes">2x</span>
|
|
610
|
-
<span class="cline-any cline-yes">2x</span>
|
|
611
|
-
<span class="cline-any cline-yes">19x</span>
|
|
612
|
-
<span class="cline-any cline-yes">19x</span>
|
|
613
|
-
<span class="cline-any cline-yes">19x</span>
|
|
614
|
-
<span class="cline-any cline-yes">19x</span>
|
|
615
|
-
<span class="cline-any cline-yes">19x</span>
|
|
616
|
-
<span class="cline-any cline-yes">19x</span>
|
|
617
|
-
<span class="cline-any cline-yes">19x</span>
|
|
618
|
-
<span class="cline-any cline-yes">52x</span>
|
|
619
|
-
<span class="cline-any cline-yes">52x</span>
|
|
620
|
-
<span class="cline-any cline-yes">52x</span>
|
|
621
|
-
<span class="cline-any cline-no"> </span>
|
|
622
|
-
<span class="cline-any cline-no"> </span>
|
|
623
|
-
<span class="cline-any cline-yes">52x</span>
|
|
624
|
-
<span class="cline-any cline-yes">52x</span>
|
|
625
|
-
<span class="cline-any cline-yes">52x</span>
|
|
626
|
-
<span class="cline-any cline-yes">52x</span>
|
|
627
|
-
<span class="cline-any cline-yes">52x</span>
|
|
628
|
-
<span class="cline-any cline-yes">19x</span>
|
|
629
|
-
<span class="cline-any cline-yes">19x</span>
|
|
630
|
-
<span class="cline-any cline-yes">19x</span>
|
|
631
|
-
<span class="cline-any cline-yes">1x</span>
|
|
632
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
|
|
633
|
-
|
|
634
|
-
const LocalStrategy = require( "passport-local" ).Strategy;
|
|
635
|
-
|
|
636
|
-
/**
|
|
637
|
-
* Temporarily tracks additional session data per remotely authenticated user.
|
|
638
|
-
*
|
|
639
|
-
* Some strategies (such as passport-saml) expect certain strategy-related data
|
|
640
|
-
* per authenticated user to be present on `req.user` prior to accepting request
|
|
641
|
-
* for logging out. In hitchy, `req.user` is fetched from database on every
|
|
642
|
-
* request and thus no temporary data is available. Hence, this local map is
|
|
643
|
-
* used instead to track any additional data for those strategies.
|
|
644
|
-
*
|
|
645
|
-
* @type {Map<any, any>}
|
|
646
|
-
*/
|
|
647
|
-
const RemoteAuthCustomData = new Map();
|
|
648
|
-
|
|
649
|
-
module.exports = function() {
|
|
650
|
-
const api = this;
|
|
651
|
-
const { models, services } = api.runtime;
|
|
652
|
-
|
|
653
|
-
const logAlert = api.log( "hitchy:plugin:auth:alert" );
|
|
654
|
-
|
|
655
|
-
/**
|
|
656
|
-
* Fetches named user's local profile.
|
|
657
|
-
*
|
|
658
|
-
* @param {string} strategyName name of strategy used to authenticate user
|
|
659
|
-
* @param {string} username name of user to search locally for related profile
|
|
660
|
-
* @param {boolean} createIfMissing set true to create user's profile if it's missing currenly
|
|
661
|
-
* @param {function(Error?, object):void} doneFn callback invoked with encountered error or user's profile
|
|
662
|
-
* @returns {void}
|
|
663
|
-
*/
|
|
664
|
-
function getLocalProfile( strategyName, username, createIfMissing, doneFn ) {
|
|
665
|
-
models.User.find( { eq: { name: username } } )
|
|
666
|
-
.then( candidates => candidates.find( user => user.strategy === strategyName ) )
|
|
667
|
-
.then( match => {
|
|
668
|
-
if ( match ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
669
|
-
<span class="cstat-no" title="statement not covered" > return match;</span>
|
|
670
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
671
|
-
|
|
672
|
-
if ( createIfMissing ) {
|
|
673
|
-
const newUser = new models.User();
|
|
674
|
-
newUser.name = username;
|
|
675
|
-
newUser.strategy = strategyName;
|
|
676
|
-
|
|
677
|
-
return newUser.save();
|
|
678
|
-
}
|
|
679
|
-
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
680
|
-
<span class="cstat-no" title="statement not covered" > throw new TypeError( "selected user does not exist" );</span>
|
|
681
|
-
} )
|
|
682
|
-
.then( profile => doneFn( null, profile ) )
|
|
683
|
-
.catch( doneFn );
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
/**
|
|
687
|
-
* Implements helpers for generating strategies for passport.js.
|
|
688
|
-
*/
|
|
689
|
-
class AuthenticationStrategies {
|
|
690
|
-
/**
|
|
691
|
-
* Picks user based on provided name and checks if provided password is
|
|
692
|
-
* matching or not.
|
|
693
|
-
*
|
|
694
|
-
* @param {string} username name of user to authenticate
|
|
695
|
-
* @param {string} password named user's password for authentication
|
|
696
|
-
* @param {function(Error?, object, object)} done invoked with optional error, authenticated user or some message as feedback
|
|
697
|
-
* @returns {void}
|
|
698
|
-
*/
|
|
699
|
-
static <span class="fstat-no" title="function not covered" >checkAuthentication( username, password, done ) {</span>
|
|
700
|
-
<span class="cstat-no" title="statement not covered" > models.User</span>
|
|
701
|
-
<span class="cstat-no" title="statement not covered" > .find( { eq: { username } }, {}, { loadRecords: true } )</span>
|
|
702
|
-
<span class="cstat-no" title="statement not covered" > .then( matches => {</span>
|
|
703
|
-
<span class="cstat-no" title="statement not covered" > switch ( matches.length ) {</span>
|
|
704
|
-
<span class="cstat-no" title="statement not covered" > case 0 :</span>
|
|
705
|
-
<span class="cstat-no" title="statement not covered" > done( null, false, { message: "Incorrect username." } );</span>
|
|
706
|
-
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
707
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
708
|
-
<span class="cstat-no" title="statement not covered" > case 1 : {</span>
|
|
709
|
-
<span class="cstat-no" title="statement not covered" > const [user] = matches;</span>
|
|
710
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
711
|
-
<span class="cstat-no" title="statement not covered" > if ( user.strategy && user.strategy !== "local" ) {</span>
|
|
712
|
-
<span class="cstat-no" title="statement not covered" > done( null, false, { message: "Authenticating this user requires different strategy." } );</span>
|
|
713
|
-
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
714
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
715
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
716
|
-
<span class="cstat-no" title="statement not covered" > return user.verifyPassword( password ).then( result => {</span>
|
|
717
|
-
<span class="cstat-no" title="statement not covered" > if ( result ) {</span>
|
|
718
|
-
<span class="cstat-no" title="statement not covered" > done( null, user );</span>
|
|
719
|
-
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
720
|
-
<span class="cstat-no" title="statement not covered" > done( null, false, { message: "Incorrect password." } );</span>
|
|
721
|
-
<span class="cstat-no" title="statement not covered" > }</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" ></span>
|
|
725
|
-
<span class="cstat-no" title="statement not covered" > default :</span>
|
|
726
|
-
<span class="cstat-no" title="statement not covered" > done( null, false, { message: "Ambiguous username." } );</span>
|
|
727
|
-
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
728
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
729
|
-
<span class="cstat-no" title="statement not covered" > } )</span>
|
|
730
|
-
<span class="cstat-no" title="statement not covered" > .catch( err => {</span>
|
|
731
|
-
<span class="cstat-no" title="statement not covered" > logAlert( err );</span>
|
|
732
|
-
<span class="cstat-no" title="statement not covered" > done( err );</span>
|
|
733
|
-
<span class="cstat-no" title="statement not covered" > } );</span>
|
|
734
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
735
|
-
|
|
736
|
-
/**
|
|
737
|
-
* Generates local strategy authenticating user based on local user
|
|
738
|
-
* model managed in local ODM.
|
|
739
|
-
*
|
|
740
|
-
* @returns {Strategy} generated strategy for use with passport.js
|
|
741
|
-
*/
|
|
742
|
-
static generateLocal() {
|
|
743
|
-
const strategy = new LocalStrategy( ( name, password, done ) => {
|
|
744
|
-
services.AuthManager.checkAuthentication( name, password, done )
|
|
745
|
-
.then( user => {
|
|
746
|
-
done( null, user );
|
|
747
|
-
} )
|
|
748
|
-
.catch( error => {
|
|
749
|
-
<span class="cstat-no" title="statement not covered" > if ( error instanceof services.HttpException && Math.floor( error.statusCode / 100 ) === 4 ) {</span>
|
|
750
|
-
<span class="cstat-no" title="statement not covered" > done( null, false, { message: error.message } );</span>
|
|
751
|
-
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
752
|
-
<span class="cstat-no" title="statement not covered" > done( error );</span>
|
|
753
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
754
|
-
} );
|
|
755
|
-
} );
|
|
756
|
-
|
|
757
|
-
strategy.passwordRequried = true;
|
|
758
|
-
|
|
759
|
-
return strategy;
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
/**
|
|
763
|
-
* Generates SAML strategy authenticating user against some remote IdP
|
|
764
|
-
* based on SAML v2.0 protocol.
|
|
765
|
-
*
|
|
766
|
-
* @param {string} strategyName name of resulting strategy in context of your application
|
|
767
|
-
* @param {Hitchy.Plugin.Auth.SamlConfig} config SAML protocol configuration
|
|
768
|
-
* @returns {Strategy} generated strategy for use with passport.js
|
|
769
|
-
*/
|
|
770
|
-
static generateSaml( strategyName, config ) {
|
|
771
|
-
const verifyLocalProfileOnLogin = ( req, userInfo, done ) => {
|
|
772
|
-
RemoteAuthCustomData.set( `${strategyName}:${userInfo.nameID}`, { ...userInfo } );
|
|
773
|
-
|
|
774
|
-
getLocalProfile( strategyName, userInfo.nameID, true, done );
|
|
775
|
-
};
|
|
776
|
-
|
|
777
|
-
const verifyLocalProfileOnLogout = <span class="fstat-no" title="function not covered" >( req, userInfo, done ) => {</span>
|
|
778
|
-
<span class="cstat-no" title="statement not covered" > getLocalProfile( strategyName, userInfo.nameID, false, done );</span>
|
|
779
|
-
};
|
|
780
|
-
|
|
781
|
-
const { Strategy } = require( "passport-saml" );
|
|
782
|
-
const strategy = new Strategy( {
|
|
783
|
-
...config,
|
|
784
|
-
passReqToCallback: true,
|
|
785
|
-
}, verifyLocalProfileOnLogin, verifyLocalProfileOnLogout );
|
|
786
|
-
|
|
787
|
-
/**
|
|
788
|
-
* Triggers requesting user being logged out remotely.
|
|
789
|
-
*
|
|
790
|
-
* @param {Hitchy.Core.IncomingMessage} req request descriptor
|
|
791
|
-
* @returns {Promise<boolean>} promises indicator if request was redirected to come back after remote logout succeeded
|
|
792
|
-
*/
|
|
793
|
-
strategy.logOutRemotely = req => {
|
|
794
|
-
if ( req.query.SAMLResponse ) {
|
|
795
|
-
return Promise.resolve( false );
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
const res = req.context.response;
|
|
799
|
-
|
|
800
|
-
return new Promise( ( resolve, reject ) => {
|
|
801
|
-
const { user } = req;
|
|
802
|
-
|
|
803
|
-
const remoteSessionKey = `${strategyName}:${user.name}`;
|
|
804
|
-
|
|
805
|
-
if ( !user || user.strategy !== strategyName || !RemoteAuthCustomData.has( remoteSessionKey ) ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
806
|
-
<span class="cstat-no" title="statement not covered" > resolve( {} );</span>
|
|
807
|
-
} else {
|
|
808
|
-
// inject custom auth data into `req.user` as expected by passport-saml strategy
|
|
809
|
-
const data = RemoteAuthCustomData.get( remoteSessionKey );
|
|
810
|
-
|
|
811
|
-
for ( const name of Object.keys( data ) ) {
|
|
812
|
-
user[name] = data[name];
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
user.nameID = user.name;
|
|
816
|
-
|
|
817
|
-
if ( !user.nameID || !user.nameIDFormat ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
818
|
-
<span class="cstat-no" title="statement not covered" > reject( new Error( "missing nameID and nameIDFormat of user required for requesting logout at IdP" ) );</span>
|
|
819
|
-
} else {
|
|
820
|
-
// ask strategy for generating logout URL for redirecting client to
|
|
821
|
-
strategy.logout( req, ( error, logoutUrl ) => {
|
|
822
|
-
if ( error ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
823
|
-
<span class="cstat-no" title="statement not covered" > reject( error );</span>
|
|
824
|
-
} else {
|
|
825
|
-
resolve( { name: remoteSessionKey, url: logoutUrl } );
|
|
826
|
-
}
|
|
827
|
-
} );
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
} )
|
|
831
|
-
.then( ( { name, url } ) => {
|
|
832
|
-
if ( url ) {
|
|
833
|
-
// first pass -> redirect to IdP
|
|
834
|
-
res.redirect( 302, url );
|
|
835
|
-
return true;
|
|
836
|
-
}
|
|
837
|
-
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
838
|
-
<span class="cstat-no" title="statement not covered" > // second pass -> returned from IdP</span>
|
|
839
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
840
|
-
<span class="cstat-no" title="statement not covered" > if ( name ) {</span>
|
|
841
|
-
<span class="cstat-no" title="statement not covered" > RemoteAuthCustomData.delete( name );</span>
|
|
842
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
843
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
844
|
-
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
845
|
-
} );
|
|
846
|
-
};
|
|
847
|
-
|
|
848
|
-
Object.defineProperty( strategy, "$$doNotSeal$$", { value: true } );
|
|
849
|
-
|
|
850
|
-
return strategy;
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
/**
|
|
854
|
-
* Creates strategy for illustrating and testing integration with remote IdP
|
|
855
|
-
* supporting OpenID Connect with Authorization Code Flow.
|
|
856
|
-
*
|
|
857
|
-
* @param {string} strategyName name of resulting strategy in context of your application
|
|
858
|
-
* @param {ClientMetaData} config OpenID Connect client configuration
|
|
859
|
-
* @returns {Promise<Strategy>} promises generated strategy for use with passport.js
|
|
860
|
-
*/
|
|
861
|
-
static async generateOpenIdConnect( strategyName, config ) { // eslint-disable-line consistent-this
|
|
862
|
-
const verifyLocalProfileOnLogin = ( req, tokens, userInfo, done ) => {
|
|
863
|
-
getLocalProfile( strategyName, userInfo.preferred_username, true, done );
|
|
864
|
-
};
|
|
865
|
-
|
|
866
|
-
const { Issuer, Strategy } = require( "openid-client" );
|
|
867
|
-
const issuer = await Issuer.discover( config.discovery_url );
|
|
868
|
-
const client = new issuer.Client( config );
|
|
869
|
-
|
|
870
|
-
const strategy = new Strategy( {
|
|
871
|
-
client,
|
|
872
|
-
passReqToCallback: true,
|
|
873
|
-
}, verifyLocalProfileOnLogin );
|
|
874
|
-
|
|
875
|
-
strategy.logOutRemotely = req => {
|
|
876
|
-
const key = `${strategyName}:logout_state`;
|
|
877
|
-
|
|
878
|
-
if ( req.session[key] && req.query.state === req.session[key] ) {
|
|
879
|
-
return Promise.resolve( false );
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
const state = req.session[key] = require( "crypto" ).randomBytes( 32 ).toString( "base64" ); // eslint-disable-line no-param-reassign
|
|
883
|
-
|
|
884
|
-
// redirect user to discovered end_session_url of IdP
|
|
885
|
-
req.context.response.redirect( 302, client.endSessionUrl( { state } ) );
|
|
886
|
-
|
|
887
|
-
return Promise.resolve( true );
|
|
888
|
-
};
|
|
889
|
-
|
|
890
|
-
Object.defineProperty( strategy, "$$doNotSeal$$", { value: true } );
|
|
891
|
-
|
|
892
|
-
return strategy;
|
|
893
|
-
}
|
|
894
|
-
|
|
895
|
-
/**
|
|
896
|
-
* Retrieves name of strategy to use by default.
|
|
897
|
-
*
|
|
898
|
-
* @returns {string} name of strategy to use for user authentication
|
|
899
|
-
*/
|
|
900
|
-
static defaultStrategy() {
|
|
901
|
-
const { defaultStrategy, strategies } = api.config.auth;
|
|
902
|
-
|
|
903
|
-
if ( defaultStrategy ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
904
|
-
<span class="cstat-no" title="statement not covered" > return defaultStrategy;</span>
|
|
905
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
906
|
-
|
|
907
|
-
const strategiesNames = Object.keys( strategies );
|
|
908
|
-
|
|
909
|
-
return strategiesNames.length === 1 ? strategiesNames[0] : "local";
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
return AuthenticationStrategies;
|
|
914
|
-
};
|
|
915
|
-
</pre></td></tr></table></pre>
|
|
916
|
-
|
|
917
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
918
|
-
</div><!-- /wrapper -->
|
|
919
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
920
|
-
Code coverage generated by
|
|
921
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
922
|
-
at Mon May 30 2022 17:10:50 GMT+0200 (Mitteleuropäische Sommerzeit)
|
|
923
|
-
</div>
|
|
924
|
-
<script src="../../../../prettify.js"></script>
|
|
925
|
-
<script>
|
|
926
|
-
window.onload = function () {
|
|
927
|
-
prettyPrint();
|
|
928
|
-
};
|
|
929
|
-
</script>
|
|
930
|
-
<script src="../../../../sorter.js"></script>
|
|
931
|
-
<script src="../../../../block-navigation.js"></script>
|
|
932
|
-
</body>
|
|
933
|
-
</html>
|
|
934
|
-
|