@hitchy/plugin-auth 0.3.5 → 0.3.6
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 +1 -1
- 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,964 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for plugin-auth/api/service/auth/manager.js</title>
|
|
7
|
-
<meta charset="utf-8" />
|
|
8
|
-
<link rel="stylesheet" href="../../../../prettify.css" />
|
|
9
|
-
<link rel="stylesheet" href="../../../../base.css" />
|
|
10
|
-
<link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.png" />
|
|
11
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
-
<style type='text/css'>
|
|
13
|
-
.coverage-summary .sorter {
|
|
14
|
-
background-image: url(../../../../sort-arrow-sprite.png);
|
|
15
|
-
}
|
|
16
|
-
</style>
|
|
17
|
-
</head>
|
|
18
|
-
|
|
19
|
-
<body>
|
|
20
|
-
<div class='wrapper'>
|
|
21
|
-
<div class='pad1'>
|
|
22
|
-
<h1><a href="../../../../index.html">All files</a> / <a href="index.html">plugin-auth/api/service/auth</a> manager.js</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">96.24% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>282/293</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">86.95% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>60/69</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">100% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>10/10</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">96.24% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>282/293</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 high'></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>
|
|
350
|
-
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
-
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
-
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
-
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
-
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
-
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
-
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
-
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
-
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
-
<a name='L294'></a><a href='#L294'>294</a></td><td class="line-coverage quiet"><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">19x</span>
|
|
363
|
-
<span class="cline-any cline-yes">19x</span>
|
|
364
|
-
<span class="cline-any cline-yes">19x</span>
|
|
365
|
-
<span class="cline-any cline-yes">19x</span>
|
|
366
|
-
<span class="cline-any cline-yes">19x</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">109x</span>
|
|
381
|
-
<span class="cline-any cline-no"> </span>
|
|
382
|
-
<span class="cline-any cline-no"> </span>
|
|
383
|
-
<span class="cline-any cline-yes">109x</span>
|
|
384
|
-
<span class="cline-any cline-yes">109x</span>
|
|
385
|
-
<span class="cline-any cline-yes">109x</span>
|
|
386
|
-
<span class="cline-any cline-yes">31x</span>
|
|
387
|
-
<span class="cline-any cline-yes">109x</span>
|
|
388
|
-
<span class="cline-any cline-yes">31x</span>
|
|
389
|
-
<span class="cline-any cline-yes">109x</span>
|
|
390
|
-
<span class="cline-any cline-yes">95x</span>
|
|
391
|
-
<span class="cline-any cline-yes">95x</span>
|
|
392
|
-
<span class="cline-any cline-yes">14x</span>
|
|
393
|
-
<span class="cline-any cline-yes">109x</span>
|
|
394
|
-
<span class="cline-any cline-no"> </span>
|
|
395
|
-
<span class="cline-any cline-no"> </span>
|
|
396
|
-
<span class="cline-any cline-yes">14x</span>
|
|
397
|
-
<span class="cline-any cline-yes">109x</span>
|
|
398
|
-
<span class="cline-any cline-yes">4x</span>
|
|
399
|
-
<span class="cline-any cline-yes">4x</span>
|
|
400
|
-
<span class="cline-any cline-yes">10x</span>
|
|
401
|
-
<span class="cline-any cline-yes">10x</span>
|
|
402
|
-
<span class="cline-any cline-yes">10x</span>
|
|
403
|
-
<span class="cline-any cline-yes">109x</span>
|
|
404
|
-
<span class="cline-any cline-yes">109x</span>
|
|
405
|
-
<span class="cline-any cline-yes">109x</span>
|
|
406
|
-
<span class="cline-any cline-yes">109x</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-yes">123x</span>
|
|
418
|
-
<span class="cline-any cline-no"> </span>
|
|
419
|
-
<span class="cline-any cline-no"> </span>
|
|
420
|
-
<span class="cline-any cline-yes">123x</span>
|
|
421
|
-
<span class="cline-any cline-yes">123x</span>
|
|
422
|
-
<span class="cline-any cline-yes">123x</span>
|
|
423
|
-
<span class="cline-any cline-yes">123x</span>
|
|
424
|
-
<span class="cline-any cline-yes">75x</span>
|
|
425
|
-
<span class="cline-any cline-yes">75x</span>
|
|
426
|
-
<span class="cline-any cline-yes">75x</span>
|
|
427
|
-
<span class="cline-any cline-yes">2x</span>
|
|
428
|
-
<span class="cline-any cline-yes">2x</span>
|
|
429
|
-
<span class="cline-any cline-yes">75x</span>
|
|
430
|
-
<span class="cline-any cline-yes">121x</span>
|
|
431
|
-
<span class="cline-any cline-yes">123x</span>
|
|
432
|
-
<span class="cline-any cline-yes">73x</span>
|
|
433
|
-
<span class="cline-any cline-yes">123x</span>
|
|
434
|
-
<span class="cline-any cline-yes">73x</span>
|
|
435
|
-
<span class="cline-any cline-yes">123x</span>
|
|
436
|
-
<span class="cline-any cline-yes">75x</span>
|
|
437
|
-
<span class="cline-any cline-yes">75x</span>
|
|
438
|
-
<span class="cline-any cline-yes">46x</span>
|
|
439
|
-
<span class="cline-any cline-yes">123x</span>
|
|
440
|
-
<span class="cline-any cline-no"> </span>
|
|
441
|
-
<span class="cline-any cline-no"> </span>
|
|
442
|
-
<span class="cline-any cline-yes">46x</span>
|
|
443
|
-
<span class="cline-any cline-yes">123x</span>
|
|
444
|
-
<span class="cline-any cline-yes">2x</span>
|
|
445
|
-
<span class="cline-any cline-yes">2x</span>
|
|
446
|
-
<span class="cline-any cline-yes">44x</span>
|
|
447
|
-
<span class="cline-any cline-yes">44x</span>
|
|
448
|
-
<span class="cline-any cline-yes">44x</span>
|
|
449
|
-
<span class="cline-any cline-yes">123x</span>
|
|
450
|
-
<span class="cline-any cline-yes">123x</span>
|
|
451
|
-
<span class="cline-any cline-yes">123x</span>
|
|
452
|
-
<span class="cline-any cline-yes">123x</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">19x</span>
|
|
462
|
-
<span class="cline-any cline-yes">19x</span>
|
|
463
|
-
<span class="cline-any cline-yes">49x</span>
|
|
464
|
-
<span class="cline-any cline-yes">49x</span>
|
|
465
|
-
<span class="cline-any cline-yes">49x</span>
|
|
466
|
-
<span class="cline-any cline-yes">49x</span>
|
|
467
|
-
<span class="cline-any cline-yes">49x</span>
|
|
468
|
-
<span class="cline-any cline-yes">49x</span>
|
|
469
|
-
<span class="cline-any cline-yes">49x</span>
|
|
470
|
-
<span class="cline-any cline-yes">49x</span>
|
|
471
|
-
<span class="cline-any cline-yes">38x</span>
|
|
472
|
-
<span class="cline-any cline-yes">38x</span>
|
|
473
|
-
<span class="cline-any cline-yes">38x</span>
|
|
474
|
-
<span class="cline-any cline-no"> </span>
|
|
475
|
-
<span class="cline-any cline-yes">38x</span>
|
|
476
|
-
<span class="cline-any cline-yes">38x</span>
|
|
477
|
-
<span class="cline-any cline-yes">38x</span>
|
|
478
|
-
<span class="cline-any cline-yes">38x</span>
|
|
479
|
-
<span class="cline-any cline-yes">49x</span>
|
|
480
|
-
<span class="cline-any cline-yes">49x</span>
|
|
481
|
-
<span class="cline-any cline-yes">49x</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">19x</span>
|
|
489
|
-
<span class="cline-any cline-yes">19x</span>
|
|
490
|
-
<span class="cline-any cline-yes">19x</span>
|
|
491
|
-
<span class="cline-any cline-yes">19x</span>
|
|
492
|
-
<span class="cline-any cline-yes">27x</span>
|
|
493
|
-
<span class="cline-any cline-yes">26x</span>
|
|
494
|
-
<span class="cline-any cline-yes">26x</span>
|
|
495
|
-
<span class="cline-any cline-yes">26x</span>
|
|
496
|
-
<span class="cline-any cline-yes">26x</span>
|
|
497
|
-
<span class="cline-any cline-yes">26x</span>
|
|
498
|
-
<span class="cline-any cline-yes">26x</span>
|
|
499
|
-
<span class="cline-any cline-yes">27x</span>
|
|
500
|
-
<span class="cline-any cline-yes">8x</span>
|
|
501
|
-
<span class="cline-any cline-yes">8x</span>
|
|
502
|
-
<span class="cline-any cline-yes">8x</span>
|
|
503
|
-
<span class="cline-any cline-yes">2x</span>
|
|
504
|
-
<span class="cline-any cline-yes">8x</span>
|
|
505
|
-
<span class="cline-any cline-yes">6x</span>
|
|
506
|
-
<span class="cline-any cline-yes">6x</span>
|
|
507
|
-
<span class="cline-any cline-yes">8x</span>
|
|
508
|
-
<span class="cline-any cline-yes">26x</span>
|
|
509
|
-
<span class="cline-any cline-yes">27x</span>
|
|
510
|
-
<span class="cline-any cline-yes">27x</span>
|
|
511
|
-
<span class="cline-any cline-yes">19x</span>
|
|
512
|
-
<span class="cline-any cline-yes">19x</span>
|
|
513
|
-
<span class="cline-any cline-yes">19x</span>
|
|
514
|
-
<span class="cline-any cline-yes">19x</span>
|
|
515
|
-
<span class="cline-any cline-yes">19x</span>
|
|
516
|
-
<span class="cline-any cline-yes">19x</span>
|
|
517
|
-
<span class="cline-any cline-yes">19x</span>
|
|
518
|
-
<span class="cline-any cline-yes">19x</span>
|
|
519
|
-
<span class="cline-any cline-yes">19x</span>
|
|
520
|
-
<span class="cline-any cline-yes">19x</span>
|
|
521
|
-
<span class="cline-any cline-yes">36x</span>
|
|
522
|
-
<span class="cline-any cline-yes">35x</span>
|
|
523
|
-
<span class="cline-any cline-yes">35x</span>
|
|
524
|
-
<span class="cline-any cline-yes">35x</span>
|
|
525
|
-
<span class="cline-any cline-yes">35x</span>
|
|
526
|
-
<span class="cline-any cline-yes">35x</span>
|
|
527
|
-
<span class="cline-any cline-yes">36x</span>
|
|
528
|
-
<span class="cline-any cline-yes">2x</span>
|
|
529
|
-
<span class="cline-any cline-yes">2x</span>
|
|
530
|
-
<span class="cline-any cline-yes">2x</span>
|
|
531
|
-
<span class="cline-any cline-yes">2x</span>
|
|
532
|
-
<span class="cline-any cline-yes">33x</span>
|
|
533
|
-
<span class="cline-any cline-yes">33x</span>
|
|
534
|
-
<span class="cline-any cline-yes">33x</span>
|
|
535
|
-
<span class="cline-any cline-yes">33x</span>
|
|
536
|
-
<span class="cline-any cline-yes">33x</span>
|
|
537
|
-
<span class="cline-any cline-yes">33x</span>
|
|
538
|
-
<span class="cline-any cline-yes">36x</span>
|
|
539
|
-
<span class="cline-any cline-yes">19x</span>
|
|
540
|
-
<span class="cline-any cline-yes">19x</span>
|
|
541
|
-
<span class="cline-any cline-yes">19x</span>
|
|
542
|
-
<span class="cline-any cline-yes">19x</span>
|
|
543
|
-
<span class="cline-any cline-yes">19x</span>
|
|
544
|
-
<span class="cline-any cline-yes">19x</span>
|
|
545
|
-
<span class="cline-any cline-yes">19x</span>
|
|
546
|
-
<span class="cline-any cline-yes">19x</span>
|
|
547
|
-
<span class="cline-any cline-yes">19x</span>
|
|
548
|
-
<span class="cline-any cline-yes">19x</span>
|
|
549
|
-
<span class="cline-any cline-yes">5x</span>
|
|
550
|
-
<span class="cline-any cline-yes">4x</span>
|
|
551
|
-
<span class="cline-any cline-yes">4x</span>
|
|
552
|
-
<span class="cline-any cline-yes">4x</span>
|
|
553
|
-
<span class="cline-any cline-yes">4x</span>
|
|
554
|
-
<span class="cline-any cline-yes">4x</span>
|
|
555
|
-
<span class="cline-any cline-yes">5x</span>
|
|
556
|
-
<span class="cline-any cline-yes">2x</span>
|
|
557
|
-
<span class="cline-any cline-yes">2x</span>
|
|
558
|
-
<span class="cline-any cline-yes">2x</span>
|
|
559
|
-
<span class="cline-any cline-yes">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">4x</span>
|
|
563
|
-
<span class="cline-any cline-yes">4x</span>
|
|
564
|
-
<span class="cline-any cline-yes">5x</span>
|
|
565
|
-
<span class="cline-any cline-yes">19x</span>
|
|
566
|
-
<span class="cline-any cline-yes">19x</span>
|
|
567
|
-
<span class="cline-any cline-yes">19x</span>
|
|
568
|
-
<span class="cline-any cline-yes">19x</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">48x</span>
|
|
574
|
-
<span class="cline-any cline-yes">48x</span>
|
|
575
|
-
<span class="cline-any cline-yes">48x</span>
|
|
576
|
-
<span class="cline-any cline-yes">48x</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">19x</span>
|
|
580
|
-
<span class="cline-any cline-yes">19x</span>
|
|
581
|
-
<span class="cline-any cline-yes">19x</span>
|
|
582
|
-
<span class="cline-any cline-yes">19x</span>
|
|
583
|
-
<span class="cline-any cline-yes">19x</span>
|
|
584
|
-
<span class="cline-any cline-yes">21x</span>
|
|
585
|
-
<span class="cline-any cline-yes">21x</span>
|
|
586
|
-
<span class="cline-any cline-yes">21x</span>
|
|
587
|
-
<span class="cline-any cline-yes">21x</span>
|
|
588
|
-
<span class="cline-any cline-yes">1x</span>
|
|
589
|
-
<span class="cline-any cline-yes">1x</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">20x</span>
|
|
593
|
-
<span class="cline-any cline-yes">20x</span>
|
|
594
|
-
<span class="cline-any cline-yes">20x</span>
|
|
595
|
-
<span class="cline-any cline-yes">20x</span>
|
|
596
|
-
<span class="cline-any cline-yes">20x</span>
|
|
597
|
-
<span class="cline-any cline-yes">21x</span>
|
|
598
|
-
<span class="cline-any cline-yes">1x</span>
|
|
599
|
-
<span class="cline-any cline-yes">21x</span>
|
|
600
|
-
<span class="cline-any cline-yes">19x</span>
|
|
601
|
-
<span class="cline-any cline-yes">19x</span>
|
|
602
|
-
<span class="cline-any cline-yes">19x</span>
|
|
603
|
-
<span class="cline-any cline-yes">19x</span>
|
|
604
|
-
<span class="cline-any cline-yes">19x</span>
|
|
605
|
-
<span class="cline-any cline-yes">19x</span>
|
|
606
|
-
<span class="cline-any cline-yes">19x</span>
|
|
607
|
-
<span class="cline-any cline-yes">19x</span>
|
|
608
|
-
<span class="cline-any cline-yes">19x</span>
|
|
609
|
-
<span class="cline-any cline-yes">19x</span>
|
|
610
|
-
<span class="cline-any cline-yes">19x</span>
|
|
611
|
-
<span class="cline-any cline-yes">20x</span>
|
|
612
|
-
<span class="cline-any cline-yes">20x</span>
|
|
613
|
-
<span class="cline-any cline-yes">20x</span>
|
|
614
|
-
<span class="cline-any cline-yes">20x</span>
|
|
615
|
-
<span class="cline-any cline-yes">21x</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">19x</span>
|
|
619
|
-
<span class="cline-any cline-yes">19x</span>
|
|
620
|
-
<span class="cline-any cline-yes">19x</span>
|
|
621
|
-
<span class="cline-any cline-yes">19x</span>
|
|
622
|
-
<span class="cline-any cline-yes">19x</span>
|
|
623
|
-
<span class="cline-any cline-yes">19x</span>
|
|
624
|
-
<span class="cline-any cline-yes">19x</span>
|
|
625
|
-
<span class="cline-any cline-yes">19x</span>
|
|
626
|
-
<span class="cline-any cline-yes">11x</span>
|
|
627
|
-
<span class="cline-any cline-yes">11x</span>
|
|
628
|
-
<span class="cline-any cline-yes">11x</span>
|
|
629
|
-
<span class="cline-any cline-yes">11x</span>
|
|
630
|
-
<span class="cline-any cline-yes">11x</span>
|
|
631
|
-
<span class="cline-any cline-yes">11x</span>
|
|
632
|
-
<span class="cline-any cline-no"> </span>
|
|
633
|
-
<span class="cline-any cline-yes">11x</span>
|
|
634
|
-
<span class="cline-any cline-yes">11x</span>
|
|
635
|
-
<span class="cline-any cline-yes">11x</span>
|
|
636
|
-
<span class="cline-any cline-yes">11x</span>
|
|
637
|
-
<span class="cline-any cline-yes">11x</span>
|
|
638
|
-
<span class="cline-any cline-yes">10x</span>
|
|
639
|
-
<span class="cline-any cline-yes">10x</span>
|
|
640
|
-
<span class="cline-any cline-yes">1x</span>
|
|
641
|
-
<span class="cline-any cline-yes">1x</span>
|
|
642
|
-
<span class="cline-any cline-yes">1x</span>
|
|
643
|
-
<span class="cline-any cline-yes">11x</span>
|
|
644
|
-
<span class="cline-any cline-yes">11x</span>
|
|
645
|
-
<span class="cline-any cline-no"> </span>
|
|
646
|
-
<span class="cline-any cline-yes">11x</span>
|
|
647
|
-
<span class="cline-any cline-yes">11x</span>
|
|
648
|
-
<span class="cline-any cline-yes">19x</span>
|
|
649
|
-
<span class="cline-any cline-yes">19x</span>
|
|
650
|
-
<span class="cline-any cline-yes">19x</span>
|
|
651
|
-
<span class="cline-any cline-yes">1x</span>
|
|
652
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
|
|
653
|
-
|
|
654
|
-
module.exports = function() {
|
|
655
|
-
const api = this;
|
|
656
|
-
const { models, services } = api.runtime;
|
|
657
|
-
|
|
658
|
-
const logDebug = api.log( "hitchy:plugin:auth:debug" );
|
|
659
|
-
|
|
660
|
-
/**
|
|
661
|
-
* Implements several helper methods meant to simplify user/role management.
|
|
662
|
-
*/
|
|
663
|
-
class AuthManager {
|
|
664
|
-
/**
|
|
665
|
-
* Qualifies selected user by means of loading or creating it when
|
|
666
|
-
* providing a user's name, only.
|
|
667
|
-
*
|
|
668
|
-
* @param {string|Hitchy.Plugin.Auth.User} user a user's name or model instance
|
|
669
|
-
* @param {boolean} createIfMissing set true to create any missing user
|
|
670
|
-
* @returns {Promise<Hitchy.Plugin.Auth.User>} promises selected user properly set up in database
|
|
671
|
-
*/
|
|
672
|
-
static async asUser( user, createIfMissing = false ) {
|
|
673
|
-
if ( !user ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
674
|
-
<span class="cstat-no" title="statement not covered" > throw new TypeError( "missing user information" );</span>
|
|
675
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
676
|
-
|
|
677
|
-
const { User } = models;
|
|
678
|
-
const users = user instanceof User ? [user] : await User.find( {
|
|
679
|
-
eq: { name: "name", value: user.name || user },
|
|
680
|
-
} );
|
|
681
|
-
|
|
682
|
-
if ( users.length === 1 ) {
|
|
683
|
-
return users[0];
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
if ( users.length > 1 ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
687
|
-
<span class="cstat-no" title="statement not covered" > throw new Error( "selecting user did not yield unique match" );</span>
|
|
688
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
689
|
-
|
|
690
|
-
if ( !createIfMissing ) {
|
|
691
|
-
throw new Error( "selecting user did not yield any match" );
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
const newUser = new User();
|
|
695
|
-
|
|
696
|
-
newUser.name = user.name || user;
|
|
697
|
-
|
|
698
|
-
return await newUser.save();
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
/**
|
|
702
|
-
* Qualifies selected role by means of loading or creating it when
|
|
703
|
-
* providing a role's name, only.
|
|
704
|
-
*
|
|
705
|
-
* @param {string|Hitchy.Plugin.Auth.Role} role a role's name or model instance
|
|
706
|
-
* @param {boolean} createIfMissing set true to create any missing user
|
|
707
|
-
* @returns {Promise<Hitchy.Plugin.Auth.Role>} promises selected role properly set up in database
|
|
708
|
-
*/
|
|
709
|
-
static async asRole( role, createIfMissing = false ) {
|
|
710
|
-
if ( !role ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
711
|
-
<span class="cstat-no" title="statement not covered" > throw new TypeError( "missing role information" );</span>
|
|
712
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
713
|
-
|
|
714
|
-
const { Role } = models;
|
|
715
|
-
|
|
716
|
-
if ( !( role instanceof Role ) ) {
|
|
717
|
-
role = String( role ); // eslint-disable-line no-param-reassign
|
|
718
|
-
|
|
719
|
-
if ( !/^[a-z_]/i.test( role ) || /\s/.test( role ) ) {
|
|
720
|
-
throw new TypeError( "missing role information" );
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
const roles = role instanceof Role ? [role] : await Role.find( {
|
|
725
|
-
eq: { name: "name", value: role.name || role },
|
|
726
|
-
} );
|
|
727
|
-
|
|
728
|
-
if ( roles.length === 1 ) {
|
|
729
|
-
return roles[0];
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
if ( roles.length > 1 ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
733
|
-
<span class="cstat-no" title="statement not covered" > throw new Error( "selecting role did not yield unique match" );</span>
|
|
734
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
735
|
-
|
|
736
|
-
if ( !createIfMissing ) {
|
|
737
|
-
throw new Error( "selecting role did not yield any match" );
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
const newRole = new Role();
|
|
741
|
-
|
|
742
|
-
newRole.name = role.name || role;
|
|
743
|
-
|
|
744
|
-
return await newRole.save();
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
/**
|
|
748
|
-
* Fetches list of provided user's roles.
|
|
749
|
-
*
|
|
750
|
-
* @param {string|Hitchy.Plugin.Auth.User} user user to assign role to (given by instance or by its name)
|
|
751
|
-
* @param {boolean} createIfMissing set true to create any missing user
|
|
752
|
-
* @param {boolean} uuidsOnly true to prevent associated users' instances being loaded
|
|
753
|
-
* @returns {Promise<Role[]>} promises list of (unloaded) roles assigned to selected user
|
|
754
|
-
*/
|
|
755
|
-
static async listRolesOfUser( user, createIfMissing = false, uuidsOnly = false ) {
|
|
756
|
-
const { $uuid: userUuid } = await this.asUser( user, createIfMissing );
|
|
757
|
-
const { Role, UserToRole } = models;
|
|
758
|
-
|
|
759
|
-
const associations = await UserToRole.find( { eq: { name: "user", value: userUuid } } );
|
|
760
|
-
const numAssociations = associations.length;
|
|
761
|
-
const roles = new Array( numAssociations );
|
|
762
|
-
|
|
763
|
-
for ( let i = 0; i < numAssociations; i++ ) {
|
|
764
|
-
const { role: roleUuid } = associations[i];
|
|
765
|
-
|
|
766
|
-
if ( uuidsOnly ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
767
|
-
<span class="cstat-no" title="statement not covered" > roles[i] = new Role( roleUuid );</span>
|
|
768
|
-
} else {
|
|
769
|
-
roles[i] = new Role( roleUuid ).load();
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
return uuidsOnly <span class="branch-0 cbranch-no" title="branch not covered" >? roles </span>: Promise.all( roles );
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
/**
|
|
777
|
-
* Searches local database for user's with a role selected by its name.
|
|
778
|
-
*
|
|
779
|
-
* @param {string|Hitchy.Plugin.Auth.Role} role name of role to search for or that role's instance
|
|
780
|
-
* @param {boolean} createIfMissing set true to create any missing role
|
|
781
|
-
* @param {boolean} uuidsOnly true to prevent associated users' instances being loaded
|
|
782
|
-
* @returns {Promise<User[]>} promises list of users with selected role
|
|
783
|
-
*/
|
|
784
|
-
static async listUsersOfRole( role, createIfMissing = false, uuidsOnly = false ) {
|
|
785
|
-
const { $uuid: roleUuid } = await this.asRole( role, createIfMissing );
|
|
786
|
-
const { User, UserToRole } = models;
|
|
787
|
-
|
|
788
|
-
const associations = await UserToRole.find( { eq: { name: "role", value: roleUuid } } );
|
|
789
|
-
const numAssociations = associations.length;
|
|
790
|
-
const users = new Array( numAssociations );
|
|
791
|
-
|
|
792
|
-
for ( let i = 0; i < numAssociations; i++ ) {
|
|
793
|
-
const { user: userUuid } = associations[i];
|
|
794
|
-
|
|
795
|
-
if ( uuidsOnly ) {
|
|
796
|
-
users[i] = new User( userUuid );
|
|
797
|
-
} else {
|
|
798
|
-
users[i] = new User( userUuid ).load();
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
return uuidsOnly ? users : Promise.all( users );
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
/**
|
|
806
|
-
* Assigns selected role to selected user.
|
|
807
|
-
*
|
|
808
|
-
* @param {string|Hitchy.Plugin.Auth.Role} role role to assign user to (given by instance or by its name)
|
|
809
|
-
* @param {string|Hitchy.Plugin.Auth.User} user user to assign role to (given by instance or by its name)
|
|
810
|
-
* @param {boolean} createIfMissing set true to create any missing user/role
|
|
811
|
-
* @returns {Promise<void>} promises role assigned to user
|
|
812
|
-
*/
|
|
813
|
-
static async grantRoleToUser( role, user, createIfMissing = false ) {
|
|
814
|
-
const { $uuid: userUuid } = await this.asUser( user, createIfMissing );
|
|
815
|
-
const { $uuid: roleUuid } = await this.asRole( role, createIfMissing );
|
|
816
|
-
|
|
817
|
-
const matches = await models.UserToRole.find( { eq: { name: "user", value: userUuid } } );
|
|
818
|
-
const numMatches = matches.length;
|
|
819
|
-
|
|
820
|
-
for ( let i = 0; i < numMatches; i++ ) {
|
|
821
|
-
if ( matches[i].role.equals( roleUuid ) ) {
|
|
822
|
-
return;
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
const association = new models.UserToRole();
|
|
827
|
-
association.user = userUuid;
|
|
828
|
-
association.role = roleUuid;
|
|
829
|
-
|
|
830
|
-
await association.save();
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
/**
|
|
834
|
-
* Drops assignment of selected role and selected user.
|
|
835
|
-
*
|
|
836
|
-
* @param {string|Hitchy.Plugin.Auth.Role} role role to assign user to (given by instance or by its name)
|
|
837
|
-
* @param {string|Hitchy.Plugin.Auth.User} user user to assign role to (given by instance or by its name)
|
|
838
|
-
* @param {boolean} createIfMissing set true to create any missing user/role
|
|
839
|
-
* @returns {Promise<void>} promises role assigned to user
|
|
840
|
-
*/
|
|
841
|
-
static async revokeRoleFromUser( role, user, createIfMissing = false ) {
|
|
842
|
-
const { $uuid: userUuid } = await this.asUser( user, createIfMissing );
|
|
843
|
-
const { $uuid: roleUuid } = await this.asRole( role, createIfMissing );
|
|
844
|
-
|
|
845
|
-
const associations = await models.UserToRole.find( { eq: { name: "user", value: userUuid } } );
|
|
846
|
-
const promises = [];
|
|
847
|
-
|
|
848
|
-
for ( let i = 0, count = associations.length; i < count; i++ ) {
|
|
849
|
-
const association = associations[i];
|
|
850
|
-
|
|
851
|
-
if ( association.role.equals( roleUuid ) ) {
|
|
852
|
-
promises.push( association.remove() );
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
return Promise.all( promises );
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
/**
|
|
860
|
-
* Provides configurable name of role implicitly granting full access to
|
|
861
|
-
* its associated users.
|
|
862
|
-
*
|
|
863
|
-
* @returns {string} configured name of role
|
|
864
|
-
*/
|
|
865
|
-
static get adminRole() {
|
|
866
|
-
const config = api.config.auth.admin;
|
|
867
|
-
|
|
868
|
-
return process.env.HITCHY_ADMIN_ROLE || ( config ? config.role : "" ) || "admin";
|
|
869
|
-
}
|
|
870
|
-
|
|
871
|
-
/**
|
|
872
|
-
* Creates user with admin role if missing in database.
|
|
873
|
-
*
|
|
874
|
-
* @returns {Promise<Hitchy.Plugin.Auth.User[]>} promises list of eventually existing users with admin role
|
|
875
|
-
*/
|
|
876
|
-
static async createAdminUserIfMissing() {
|
|
877
|
-
const role = await this.asRole( this.adminRole, true );
|
|
878
|
-
const users = await this.listUsersOfRole( role );
|
|
879
|
-
|
|
880
|
-
if ( users.length > 0 ) {
|
|
881
|
-
logDebug( "admin user found" );
|
|
882
|
-
|
|
883
|
-
return users;
|
|
884
|
-
}
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
const existingAdmins = await models.User.find( { eq: { name: "admin" } } );
|
|
888
|
-
let user;
|
|
889
|
-
|
|
890
|
-
if ( existingAdmins.length > 0 ) {
|
|
891
|
-
user = existingAdmins[0];
|
|
892
|
-
} else {
|
|
893
|
-
const config = api.config.auth.admin;
|
|
894
|
-
|
|
895
|
-
logDebug( "creating admin user" );
|
|
896
|
-
|
|
897
|
-
user = new models.User();
|
|
898
|
-
|
|
899
|
-
user.name = process.env.HITCHY_ADMIN_NAME || ( config ? config.name : "" ) || "admin";
|
|
900
|
-
|
|
901
|
-
await user.setPassword( process.env.HITCHY_ADMIN_PASSWORD || ( config ? config.password : "" ) || "nimda" );
|
|
902
|
-
await user.save();
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
await this.grantRoleToUser( role, user );
|
|
906
|
-
|
|
907
|
-
return [user];
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
/**
|
|
911
|
-
* Checks if named user can be authenticated locally using provided
|
|
912
|
-
* password.
|
|
913
|
-
*
|
|
914
|
-
* @param {string} username name of user to authenticate
|
|
915
|
-
* @param {string} password password of named to user
|
|
916
|
-
* @return {Promise<User>} promises successfully authenticated user
|
|
917
|
-
*/
|
|
918
|
-
static async checkAuthentication( username, password ) {
|
|
919
|
-
const candidates = ( await models.User
|
|
920
|
-
.find( { eq: { name: username } }, {}, { loadRecords: true } ) )
|
|
921
|
-
.filter( user => !user.strategy <span class="branch-0 cbranch-no" title="branch not covered" >|| user.strategy === "local" </span>);
|
|
922
|
-
|
|
923
|
-
switch ( candidates.length ) {
|
|
924
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case 0 :</span>
|
|
925
|
-
<span class="cstat-no" title="statement not covered" > throw new services.HttpException( 400, `no such local user: ${username}` );</span>
|
|
926
|
-
|
|
927
|
-
case 1 : {
|
|
928
|
-
const [user] = candidates;
|
|
929
|
-
|
|
930
|
-
if ( await user.verifyPassword( password ) ) {
|
|
931
|
-
return user;
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
throw new services.HttpException( 403, "invalid password" );
|
|
935
|
-
}
|
|
936
|
-
|
|
937
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > default :</span>
|
|
938
|
-
<span class="cstat-no" title="statement not covered" > throw new services.HttpException( 400, "ambiguous username" );</span>
|
|
939
|
-
}
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
return AuthManager;
|
|
944
|
-
};
|
|
945
|
-
</pre></td></tr></table></pre>
|
|
946
|
-
|
|
947
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
948
|
-
</div><!-- /wrapper -->
|
|
949
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
950
|
-
Code coverage generated by
|
|
951
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
952
|
-
at Mon May 30 2022 17:10:50 GMT+0200 (Mitteleuropäische Sommerzeit)
|
|
953
|
-
</div>
|
|
954
|
-
<script src="../../../../prettify.js"></script>
|
|
955
|
-
<script>
|
|
956
|
-
window.onload = function () {
|
|
957
|
-
prettyPrint();
|
|
958
|
-
};
|
|
959
|
-
</script>
|
|
960
|
-
<script src="../../../../sorter.js"></script>
|
|
961
|
-
<script src="../../../../block-navigation.js"></script>
|
|
962
|
-
</body>
|
|
963
|
-
</html>
|
|
964
|
-
|