This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
1 | <?php |
||||||
2 | |||||||
3 | declare(strict_types = 1); |
||||||
4 | |||||||
5 | namespace App\Model; |
||||||
6 | |||||||
7 | use App\Repository\AutoEditsRepository; |
||||||
8 | use App\Repository\EditRepository; |
||||||
9 | use App\Repository\PageRepository; |
||||||
10 | use App\Repository\UserRepository; |
||||||
11 | |||||||
12 | /** |
||||||
13 | * AutoEdits returns statistics about automated edits made by a user. |
||||||
14 | */ |
||||||
15 | class AutoEdits extends Model |
||||||
16 | { |
||||||
17 | protected EditRepository $editRepo; |
||||||
18 | protected PageRepository $pageRepo; |
||||||
19 | protected UserRepository $userRepo; |
||||||
20 | |||||||
21 | /** @var null|string The tool we're searching for when fetching (semi-)automated edits. */ |
||||||
22 | protected ?string $tool; |
||||||
23 | |||||||
24 | /** @var Edit[] The list of non-automated contributions. */ |
||||||
25 | protected array $nonAutomatedEdits; |
||||||
26 | |||||||
27 | /** @var Edit[] The list of automated contributions. */ |
||||||
28 | protected array $automatedEdits; |
||||||
29 | |||||||
30 | /** @var int Total number of edits. */ |
||||||
31 | protected int $editCount; |
||||||
32 | |||||||
33 | /** @var int Total number of non-automated edits. */ |
||||||
34 | protected int $automatedCount; |
||||||
35 | |||||||
36 | /** @var array Counts of known automated tools used by the given user. */ |
||||||
37 | protected array $toolCounts; |
||||||
38 | |||||||
39 | /** @var int Total number of edits made with the tools. */ |
||||||
40 | protected int $toolsTotal; |
||||||
41 | |||||||
42 | /** @var int Default number of results to show per page when fetching (non-)automated edits. */ |
||||||
43 | public const RESULTS_PER_PAGE = 50; |
||||||
44 | |||||||
45 | /** |
||||||
46 | * Constructor for the AutoEdits class. |
||||||
47 | * @param AutoEditsRepository $repository |
||||||
48 | * @param EditRepository $editRepo |
||||||
49 | * @param PageRepository $pageRepo |
||||||
50 | * @param UserRepository $userRepo |
||||||
51 | * @param Project $project |
||||||
52 | * @param User $user |
||||||
53 | * @param int|string $namespace Namespace ID or 'all' |
||||||
54 | * @param false|int $start Start date as Unix timestamp. |
||||||
55 | * @param false|int $end End date as Unix timestamp. |
||||||
56 | * @param null $tool The tool we're searching for when fetching (semi-)automated edits. |
||||||
0 ignored issues
–
show
Documentation
Bug
introduced
by
![]() |
|||||||
57 | * @param false|int $offset Unix timestamp. Used for pagination. |
||||||
58 | * @param int|null $limit Number of results to return. |
||||||
59 | */ |
||||||
60 | public function __construct( |
||||||
61 | AutoEditsRepository $repository, |
||||||
62 | EditRepository $editRepo, |
||||||
63 | PageRepository $pageRepo, |
||||||
64 | UserRepository $userRepo, |
||||||
65 | Project $project, |
||||||
66 | User $user, |
||||||
67 | $namespace = 0, |
||||||
68 | $start = false, |
||||||
69 | $end = false, |
||||||
70 | $tool = null, |
||||||
71 | $offset = false, |
||||||
72 | ?int $limit = self::RESULTS_PER_PAGE |
||||||
73 | ) { |
||||||
74 | $this->repository = $repository; |
||||||
75 | $this->editRepo = $editRepo; |
||||||
76 | $this->pageRepo = $pageRepo; |
||||||
77 | $this->userRepo = $userRepo; |
||||||
78 | $this->project = $project; |
||||||
79 | $this->user = $user; |
||||||
80 | $this->namespace = $namespace; |
||||||
81 | $this->start = $start; |
||||||
82 | $this->end = $end; |
||||||
83 | $this->tool = $tool; |
||||||
84 | $this->offset = $offset; |
||||||
85 | $this->limit = $limit ?? self::RESULTS_PER_PAGE; |
||||||
86 | } |
||||||
87 | |||||||
88 | /** |
||||||
89 | * The tool we're limiting the results to when fetching |
||||||
90 | * (semi-)automated contributions. |
||||||
91 | * @return null|string |
||||||
92 | */ |
||||||
93 | public function getTool(): ?string |
||||||
94 | { |
||||||
95 | return $this->tool; |
||||||
96 | } |
||||||
97 | |||||||
98 | /** |
||||||
99 | * Get the raw edit count of the user. |
||||||
100 | * @return int |
||||||
101 | */ |
||||||
102 | public function getEditCount(): int |
||||||
103 | { |
||||||
104 | if (!isset($this->editCount)) { |
||||||
105 | $this->editCount = $this->user->countEdits( |
||||||
0 ignored issues
–
show
The method
countEdits() does not exist on null .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. ![]() |
|||||||
106 | $this->project, |
||||||
107 | $this->namespace, |
||||||
108 | $this->start, |
||||||
109 | $this->end |
||||||
110 | ); |
||||||
111 | } |
||||||
112 | |||||||
113 | return $this->editCount; |
||||||
114 | } |
||||||
115 | |||||||
116 | /** |
||||||
117 | * Get the number of edits this user made using semi-automated tools. |
||||||
118 | * This is not the same as self::getToolCounts because the regex can overlap. |
||||||
119 | * @return int Result of query, see below. |
||||||
120 | */ |
||||||
121 | public function getAutomatedCount(): int |
||||||
122 | { |
||||||
123 | if (isset($this->automatedCount)) { |
||||||
124 | return $this->automatedCount; |
||||||
125 | } |
||||||
126 | |||||||
127 | $this->automatedCount = $this->repository->countAutomatedEdits( |
||||||
0 ignored issues
–
show
The method
countAutomatedEdits() does not exist on App\Repository\Repository . It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\EditCounterRepository or App\Repository\AutoEditsRepository .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
128 | $this->project, |
||||||
129 | $this->user, |
||||||
130 | $this->namespace, |
||||||
131 | $this->start, |
||||||
132 | $this->end |
||||||
133 | ); |
||||||
134 | |||||||
135 | return $this->automatedCount; |
||||||
136 | } |
||||||
137 | |||||||
138 | /** |
||||||
139 | * Get the percentage of all edits made using automated tools. |
||||||
140 | * @return float |
||||||
141 | */ |
||||||
142 | public function getAutomatedPercentage(): float |
||||||
143 | { |
||||||
144 | return $this->getEditCount() > 0 |
||||||
145 | ? ($this->getAutomatedCount() / $this->getEditCount()) * 100 |
||||||
146 | : 0; |
||||||
147 | } |
||||||
148 | |||||||
149 | /** |
||||||
150 | * Get non-automated contributions for this user. |
||||||
151 | * @param bool $forJson |
||||||
152 | * @return string[]|Edit[] |
||||||
153 | */ |
||||||
154 | public function getNonAutomatedEdits(bool $forJson = false): array |
||||||
155 | { |
||||||
156 | if (isset($this->nonAutomatedEdits)) { |
||||||
157 | return $this->nonAutomatedEdits; |
||||||
158 | } |
||||||
159 | |||||||
160 | $revs = $this->repository->getNonAutomatedEdits( |
||||||
0 ignored issues
–
show
The method
getNonAutomatedEdits() does not exist on App\Repository\Repository . It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\AutoEditsRepository .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
161 | $this->project, |
||||||
162 | $this->user, |
||||||
163 | $this->namespace, |
||||||
164 | $this->start, |
||||||
165 | $this->end, |
||||||
166 | $this->offset, |
||||||
167 | $this->limit |
||||||
168 | ); |
||||||
169 | |||||||
170 | $this->nonAutomatedEdits = Edit::getEditsFromRevs( |
||||||
171 | $this->pageRepo, |
||||||
172 | $this->editRepo, |
||||||
173 | $this->userRepo, |
||||||
174 | $this->project, |
||||||
175 | $this->user, |
||||||
0 ignored issues
–
show
It seems like
$this->user can also be of type null ; however, parameter $user of App\Model\Edit::getEditsFromRevs() does only seem to accept App\Model\User , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
176 | $revs |
||||||
177 | ); |
||||||
178 | |||||||
179 | if ($forJson) { |
||||||
180 | return array_map(function (Edit $edit) { |
||||||
181 | return $edit->getForJson(); |
||||||
182 | }, $this->nonAutomatedEdits); |
||||||
183 | } |
||||||
184 | |||||||
185 | return $this->nonAutomatedEdits; |
||||||
186 | } |
||||||
187 | |||||||
188 | /** |
||||||
189 | * Get automated contributions for this user. |
||||||
190 | * @param bool $forJson |
||||||
191 | * @return Edit[] |
||||||
192 | */ |
||||||
193 | public function getAutomatedEdits(bool $forJson = false): array |
||||||
194 | { |
||||||
195 | if (isset($this->automatedEdits)) { |
||||||
196 | return $this->automatedEdits; |
||||||
197 | } |
||||||
198 | |||||||
199 | $revs = $this->repository->getAutomatedEdits( |
||||||
0 ignored issues
–
show
The method
getAutomatedEdits() does not exist on App\Repository\Repository . It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\AutoEditsRepository .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
200 | $this->project, |
||||||
201 | $this->user, |
||||||
202 | $this->namespace, |
||||||
203 | $this->start, |
||||||
204 | $this->end, |
||||||
205 | $this->tool, |
||||||
206 | $this->offset, |
||||||
207 | $this->limit |
||||||
208 | ); |
||||||
209 | |||||||
210 | $this->automatedEdits = Edit::getEditsFromRevs( |
||||||
211 | $this->pageRepo, |
||||||
212 | $this->editRepo, |
||||||
213 | $this->userRepo, |
||||||
214 | $this->project, |
||||||
215 | $this->user, |
||||||
0 ignored issues
–
show
It seems like
$this->user can also be of type null ; however, parameter $user of App\Model\Edit::getEditsFromRevs() does only seem to accept App\Model\User , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
216 | $revs |
||||||
217 | ); |
||||||
218 | |||||||
219 | if ($forJson) { |
||||||
220 | return array_map(function (Edit $edit) { |
||||||
221 | return $edit->getForJson(); |
||||||
222 | }, $this->automatedEdits); |
||||||
223 | } |
||||||
224 | |||||||
225 | return $this->automatedEdits; |
||||||
226 | } |
||||||
227 | |||||||
228 | /** |
||||||
229 | * Get counts of known automated tools used by the given user. |
||||||
230 | * @return array Each tool that they used along with the count and link: |
||||||
231 | * [ |
||||||
232 | * 'Twinkle' => [ |
||||||
233 | * 'count' => 50, |
||||||
234 | * 'link' => 'Wikipedia:Twinkle', |
||||||
235 | * ], |
||||||
236 | * ] |
||||||
237 | */ |
||||||
238 | public function getToolCounts(): array |
||||||
239 | { |
||||||
240 | if (isset($this->toolCounts)) { |
||||||
241 | return $this->toolCounts; |
||||||
242 | } |
||||||
243 | |||||||
244 | $this->toolCounts = $this->repository->getToolCounts( |
||||||
0 ignored issues
–
show
The method
getToolCounts() does not exist on App\Repository\Repository . It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\AutoEditsRepository .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
245 | $this->project, |
||||||
246 | $this->user, |
||||||
247 | $this->namespace, |
||||||
248 | $this->start, |
||||||
249 | $this->end |
||||||
250 | ); |
||||||
251 | |||||||
252 | return $this->toolCounts; |
||||||
253 | } |
||||||
254 | |||||||
255 | /** |
||||||
256 | * Get a list of all available tools for the Project. |
||||||
257 | * @return array |
||||||
258 | */ |
||||||
259 | public function getAllTools(): array |
||||||
260 | { |
||||||
261 | return $this->repository->getTools($this->project); |
||||||
0 ignored issues
–
show
The method
getTools() does not exist on App\Repository\Repository . Did you maybe mean getToolsConnection() ?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. ![]() |
|||||||
262 | } |
||||||
263 | |||||||
264 | /** |
||||||
265 | * Get the combined number of edits made with each tool. This is calculated separately from |
||||||
266 | * self::getAutomatedCount() because the regex can sometimes overlap, and the counts are actually different. |
||||||
267 | * @return int |
||||||
268 | */ |
||||||
269 | public function getToolsTotal(): int |
||||||
270 | { |
||||||
271 | if (!isset($this->toolsTotal)) { |
||||||
272 | $this->toolsTotal = array_reduce($this->getToolCounts(), function ($a, $b) { |
||||||
273 | return $a + $b['count']; |
||||||
274 | }); |
||||||
275 | } |
||||||
276 | |||||||
277 | return $this->toolsTotal; |
||||||
278 | } |
||||||
279 | |||||||
280 | /** |
||||||
281 | * @return bool |
||||||
282 | */ |
||||||
283 | public function getUseSandbox(): bool |
||||||
284 | { |
||||||
285 | return $this->repository->getUseSandbox(); |
||||||
0 ignored issues
–
show
The method
getUseSandbox() does not exist on App\Repository\Repository . It seems like you code against a sub-type of App\Repository\Repository such as App\Repository\AutoEditsRepository .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
286 | } |
||||||
287 | } |
||||||
288 |