New upstream version 2.7.2
Daniel Ruiz de Alegría
1 year, 4 months ago
439 | 439 | "contributions": [ |
440 | 440 | "ideas" |
441 | 441 | ] |
442 | }, | |
443 | { | |
444 | "login": "herrcykel", | |
445 | "name": "O", | |
446 | "avatar_url": "https://avatars.githubusercontent.com/u/1936757?v=4", | |
447 | "profile": "https://github.com/herrcykel", | |
448 | "contributions": [ | |
449 | "code" | |
450 | ] | |
451 | }, | |
452 | { | |
453 | "login": "udoprog", | |
454 | "name": "John-John Tedro", | |
455 | "avatar_url": "https://avatars.githubusercontent.com/u/111092?v=4", | |
456 | "profile": "http://udoprog.github.io/", | |
457 | "contributions": [ | |
458 | "code" | |
459 | ] | |
442 | 460 | } |
443 | 461 | ], |
444 | 462 | "contributorsPerLine": 7, |
446 | 464 | "projectOwner": "epi052", |
447 | 465 | "repoType": "github", |
448 | 466 | "repoHost": "https://github.com", |
449 | "skipCi": true | |
467 | "skipCi": true, | |
468 | "commitConvention": "angular" | |
450 | 469 | } |
3 | 3 | |
4 | 4 | [[package]] |
5 | 5 | name = "aho-corasick" |
6 | version = "0.7.18" | |
7 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
8 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" | |
6 | version = "0.7.19" | |
7 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
8 | checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" | |
9 | 9 | dependencies = [ |
10 | 10 | "memchr", |
11 | 11 | ] |
12 | 12 | |
13 | 13 | [[package]] |
14 | 14 | name = "anyhow" |
15 | version = "1.0.57" | |
16 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
17 | checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" | |
15 | version = "1.0.66" | |
16 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
17 | checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" | |
18 | 18 | |
19 | 19 | [[package]] |
20 | 20 | name = "ascii-canvas" |
27 | 27 | |
28 | 28 | [[package]] |
29 | 29 | name = "assert-json-diff" |
30 | version = "2.0.1" | |
31 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
32 | checksum = "50f1c3703dd33532d7f0ca049168930e9099ecac238e23cf932f3a69c42f06da" | |
30 | version = "2.0.2" | |
31 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
32 | checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" | |
33 | 33 | dependencies = [ |
34 | 34 | "serde", |
35 | 35 | "serde_json", |
37 | 37 | |
38 | 38 | [[package]] |
39 | 39 | name = "assert_cmd" |
40 | version = "2.0.4" | |
41 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
42 | checksum = "93ae1ddd39efd67689deb1979d80bad3bf7f2b09c6e6117c8d1f2443b5e2f83e" | |
40 | version = "2.0.6" | |
41 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
42 | checksum = "ba45b8163c49ab5f972e59a8a5a03b6d2972619d486e19ec9fe744f7c2753d3c" | |
43 | 43 | dependencies = [ |
44 | 44 | "bstr", |
45 | 45 | "doc-comment", |
51 | 51 | |
52 | 52 | [[package]] |
53 | 53 | name = "async-channel" |
54 | version = "1.6.1" | |
55 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
56 | checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" | |
57 | dependencies = [ | |
58 | "concurrent-queue", | |
54 | version = "1.7.1" | |
55 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
56 | checksum = "e14485364214912d3b19cc3435dde4df66065127f05fa0d75c712f36f12c2f28" | |
57 | dependencies = [ | |
58 | "concurrent-queue 1.2.4", | |
59 | 59 | "event-listener", |
60 | 60 | "futures-core", |
61 | 61 | ] |
62 | 62 | |
63 | 63 | [[package]] |
64 | 64 | name = "async-executor" |
65 | version = "1.4.1" | |
66 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
67 | checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" | |
68 | dependencies = [ | |
65 | version = "1.5.0" | |
66 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
67 | checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" | |
68 | dependencies = [ | |
69 | "async-lock", | |
69 | 70 | "async-task", |
70 | "concurrent-queue", | |
71 | "concurrent-queue 2.0.0", | |
71 | 72 | "fastrand", |
72 | 73 | "futures-lite", |
73 | "once_cell", | |
74 | 74 | "slab", |
75 | 75 | ] |
76 | 76 | |
77 | 77 | [[package]] |
78 | 78 | name = "async-global-executor" |
79 | version = "2.0.4" | |
80 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
81 | checksum = "c290043c9a95b05d45e952fb6383c67bcb61471f60cfa21e890dba6654234f43" | |
79 | version = "2.3.1" | |
80 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
81 | checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" | |
82 | 82 | dependencies = [ |
83 | 83 | "async-channel", |
84 | 84 | "async-executor", |
85 | 85 | "async-io", |
86 | "async-mutex", | |
86 | "async-lock", | |
87 | 87 | "blocking", |
88 | 88 | "futures-lite", |
89 | "num_cpus", | |
90 | 89 | "once_cell", |
91 | 90 | ] |
92 | 91 | |
93 | 92 | [[package]] |
94 | 93 | name = "async-io" |
95 | version = "1.6.0" | |
96 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
97 | checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" | |
98 | dependencies = [ | |
99 | "concurrent-queue", | |
94 | version = "1.10.0" | |
95 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
96 | checksum = "e8121296a9f05be7f34aa4196b1747243b3b62e048bb7906f644f3fbfc490cf7" | |
97 | dependencies = [ | |
98 | "async-lock", | |
99 | "autocfg", | |
100 | "concurrent-queue 1.2.4", | |
100 | 101 | "futures-lite", |
101 | 102 | "libc", |
102 | 103 | "log", |
103 | "once_cell", | |
104 | 104 | "parking", |
105 | 105 | "polling", |
106 | 106 | "slab", |
111 | 111 | |
112 | 112 | [[package]] |
113 | 113 | name = "async-lock" |
114 | version = "2.5.0" | |
115 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
116 | checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" | |
114 | version = "2.6.0" | |
115 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
116 | checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" | |
117 | 117 | dependencies = [ |
118 | 118 | "event-listener", |
119 | ] | |
120 | ||
121 | [[package]] | |
122 | name = "async-mutex" | |
123 | version = "1.4.0" | |
124 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
125 | checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" | |
126 | dependencies = [ | |
127 | "event-listener", | |
119 | "futures-lite", | |
128 | 120 | ] |
129 | 121 | |
130 | 122 | [[package]] |
138 | 130 | |
139 | 131 | [[package]] |
140 | 132 | name = "async-process" |
141 | version = "1.4.0" | |
142 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
143 | checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c" | |
133 | version = "1.5.0" | |
134 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
135 | checksum = "02111fd8655a613c25069ea89fc8d9bb89331fa77486eb3bc059ee757cfa481c" | |
144 | 136 | dependencies = [ |
145 | 137 | "async-io", |
138 | "autocfg", | |
146 | 139 | "blocking", |
147 | 140 | "cfg-if", |
148 | 141 | "event-listener", |
155 | 148 | |
156 | 149 | [[package]] |
157 | 150 | name = "async-std" |
158 | version = "1.11.0" | |
159 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
160 | checksum = "52580991739c5cdb36cde8b2a516371c0a3b70dda36d916cc08b82372916808c" | |
151 | version = "1.12.0" | |
152 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
153 | checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" | |
161 | 154 | dependencies = [ |
162 | 155 | "async-channel", |
163 | 156 | "async-global-executor", |
173 | 166 | "kv-log-macro", |
174 | 167 | "log", |
175 | 168 | "memchr", |
176 | "num_cpus", | |
177 | 169 | "once_cell", |
178 | 170 | "pin-project-lite", |
179 | 171 | "pin-utils", |
183 | 175 | |
184 | 176 | [[package]] |
185 | 177 | name = "async-task" |
186 | version = "4.2.0" | |
187 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
188 | checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" | |
178 | version = "4.3.0" | |
179 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
180 | checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" | |
189 | 181 | |
190 | 182 | [[package]] |
191 | 183 | name = "async-trait" |
192 | version = "0.1.53" | |
193 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
194 | checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" | |
184 | version = "0.1.58" | |
185 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
186 | checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" | |
195 | 187 | dependencies = [ |
196 | 188 | "proc-macro2", |
197 | 189 | "quote", |
223 | 215 | |
224 | 216 | [[package]] |
225 | 217 | name = "base64" |
226 | version = "0.13.0" | |
227 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
228 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" | |
218 | version = "0.13.1" | |
219 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
220 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" | |
229 | 221 | |
230 | 222 | [[package]] |
231 | 223 | name = "basic-cookies" |
240 | 232 | |
241 | 233 | [[package]] |
242 | 234 | name = "bit-set" |
243 | version = "0.5.2" | |
244 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
245 | checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" | |
235 | version = "0.5.3" | |
236 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
237 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" | |
246 | 238 | dependencies = [ |
247 | 239 | "bit-vec", |
248 | 240 | ] |
275 | 267 | |
276 | 268 | [[package]] |
277 | 269 | name = "bstr" |
278 | version = "0.2.17" | |
279 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
280 | checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" | |
281 | dependencies = [ | |
282 | "lazy_static", | |
270 | version = "1.0.1" | |
271 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
272 | checksum = "fca0852af221f458706eb0725c03e4ed6c46af9ac98e6a689d5e634215d594dd" | |
273 | dependencies = [ | |
283 | 274 | "memchr", |
275 | "once_cell", | |
284 | 276 | "regex-automata", |
277 | "serde", | |
285 | 278 | ] |
286 | 279 | |
287 | 280 | [[package]] |
288 | 281 | name = "bumpalo" |
289 | version = "3.9.1" | |
290 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
291 | checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" | |
282 | version = "3.11.1" | |
283 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
284 | checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" | |
292 | 285 | |
293 | 286 | [[package]] |
294 | 287 | name = "byteorder" |
298 | 291 | |
299 | 292 | [[package]] |
300 | 293 | name = "bytes" |
301 | version = "1.1.0" | |
302 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
303 | checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" | |
294 | version = "1.2.1" | |
295 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
296 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" | |
304 | 297 | |
305 | 298 | [[package]] |
306 | 299 | name = "cache-padded" |
316 | 309 | |
317 | 310 | [[package]] |
318 | 311 | name = "cc" |
319 | version = "1.0.73" | |
320 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
321 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" | |
312 | version = "1.0.76" | |
313 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
314 | checksum = "76a284da2e6fe2092f2353e51713435363112dfd60030e22add80be333fb928f" | |
322 | 315 | |
323 | 316 | [[package]] |
324 | 317 | name = "cfg-if" |
328 | 321 | |
329 | 322 | [[package]] |
330 | 323 | name = "clap" |
331 | version = "3.1.18" | |
332 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
333 | checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" | |
324 | version = "4.0.26" | |
325 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
326 | checksum = "2148adefda54e14492fb9bddcc600b4344c5d1a3123bd666dcb939c6f0e0e57e" | |
334 | 327 | dependencies = [ |
335 | 328 | "atty", |
336 | 329 | "bitflags", |
337 | 330 | "clap_lex", |
338 | "indexmap", | |
339 | "lazy_static", | |
331 | "once_cell", | |
340 | 332 | "strsim", |
341 | 333 | "termcolor", |
342 | "terminal_size", | |
343 | "textwrap", | |
334 | "terminal_size 0.2.2", | |
344 | 335 | ] |
345 | 336 | |
346 | 337 | [[package]] |
347 | 338 | name = "clap_complete" |
348 | version = "3.1.4" | |
349 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
350 | checksum = "da92e6facd8d73c22745a5d3cbb59bdf8e46e3235c923e516527d8e81eec14a4" | |
339 | version = "4.0.5" | |
340 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
341 | checksum = "96b0fba905b035a30d25c1b585bf1171690712fbb0ad3ac47214963aa4acc36c" | |
351 | 342 | dependencies = [ |
352 | 343 | "clap", |
353 | 344 | ] |
354 | 345 | |
355 | 346 | [[package]] |
356 | 347 | name = "clap_lex" |
357 | version = "0.2.0" | |
358 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
359 | checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" | |
348 | version = "0.3.0" | |
349 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
350 | checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" | |
360 | 351 | dependencies = [ |
361 | 352 | "os_str_bytes", |
362 | 353 | ] |
363 | 354 | |
364 | 355 | [[package]] |
365 | 356 | name = "concurrent-queue" |
366 | version = "1.2.2" | |
367 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
368 | checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" | |
357 | version = "1.2.4" | |
358 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
359 | checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c" | |
369 | 360 | dependencies = [ |
370 | 361 | "cache-padded", |
371 | 362 | ] |
372 | 363 | |
373 | 364 | [[package]] |
365 | name = "concurrent-queue" | |
366 | version = "2.0.0" | |
367 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
368 | checksum = "bd7bef69dc86e3c610e4e7aed41035e2a7ed12e72dd7530f61327a6579a4390b" | |
369 | dependencies = [ | |
370 | "crossbeam-utils", | |
371 | ] | |
372 | ||
373 | [[package]] | |
374 | 374 | name = "console" |
375 | version = "0.15.0" | |
376 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
377 | checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" | |
375 | version = "0.15.2" | |
376 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
377 | checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c" | |
378 | 378 | dependencies = [ |
379 | 379 | "encode_unicode", |
380 | "libc", | |
381 | "once_cell", | |
382 | "regex", | |
383 | "terminal_size", | |
380 | "lazy_static", | |
381 | "libc", | |
382 | "terminal_size 0.1.17", | |
384 | 383 | "unicode-width", |
385 | 384 | "winapi", |
386 | 385 | ] |
409 | 408 | |
410 | 409 | [[package]] |
411 | 410 | name = "crossbeam-utils" |
412 | version = "0.8.8" | |
413 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
414 | checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" | |
411 | version = "0.8.12" | |
412 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
413 | checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" | |
415 | 414 | dependencies = [ |
416 | 415 | "cfg-if", |
417 | "lazy_static", | |
418 | 416 | ] |
419 | 417 | |
420 | 418 | [[package]] |
421 | 419 | name = "crossterm" |
422 | version = "0.23.2" | |
423 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
424 | checksum = "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17" | |
420 | version = "0.25.0" | |
421 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
422 | checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" | |
425 | 423 | dependencies = [ |
426 | 424 | "bitflags", |
427 | 425 | "crossterm_winapi", |
477 | 475 | |
478 | 476 | [[package]] |
479 | 477 | name = "ctor" |
480 | version = "0.1.22" | |
481 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
482 | checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" | |
478 | version = "0.1.26" | |
479 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
480 | checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" | |
483 | 481 | dependencies = [ |
484 | 482 | "quote", |
485 | 483 | "syn", |
487 | 485 | |
488 | 486 | [[package]] |
489 | 487 | name = "ctrlc" |
490 | version = "3.2.2" | |
491 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
492 | checksum = "b37feaa84e6861e00a1f5e5aa8da3ee56d605c9992d33e082786754828e20865" | |
488 | version = "3.2.3" | |
489 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
490 | checksum = "1d91974fbbe88ec1df0c24a4f00f99583667a7e2e6272b2b92d294d81e462173" | |
493 | 491 | dependencies = [ |
494 | 492 | "nix", |
495 | 493 | "winapi", |
497 | 495 | |
498 | 496 | [[package]] |
499 | 497 | name = "curl" |
500 | version = "0.4.43" | |
501 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
502 | checksum = "37d855aeef205b43f65a5001e0997d81f8efca7badad4fad7d897aa7f0d0651f" | |
498 | version = "0.4.44" | |
499 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
500 | checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" | |
503 | 501 | dependencies = [ |
504 | 502 | "curl-sys", |
505 | 503 | "libc", |
512 | 510 | |
513 | 511 | [[package]] |
514 | 512 | name = "curl-sys" |
515 | version = "0.4.54+curl-7.83.0" | |
516 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
517 | checksum = "25debbc3365c3e7ee79e30918df5759e84dbd4485807a18829188abf1786ec4e" | |
513 | version = "0.4.59+curl-7.86.0" | |
514 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
515 | checksum = "6cfce34829f448b08f55b7db6d0009e23e2e86a34e8c2b366269bf5799b4a407" | |
518 | 516 | dependencies = [ |
519 | 517 | "cc", |
520 | 518 | "libc", |
541 | 539 | |
542 | 540 | [[package]] |
543 | 541 | name = "diff" |
544 | version = "0.1.12" | |
545 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
546 | checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" | |
542 | version = "0.1.13" | |
543 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
544 | checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" | |
547 | 545 | |
548 | 546 | [[package]] |
549 | 547 | name = "difflib" |
621 | 619 | |
622 | 620 | [[package]] |
623 | 621 | name = "either" |
624 | version = "1.6.1" | |
625 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
626 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" | |
622 | version = "1.8.0" | |
623 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
624 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" | |
627 | 625 | |
628 | 626 | [[package]] |
629 | 627 | name = "ena" |
651 | 649 | |
652 | 650 | [[package]] |
653 | 651 | name = "env_logger" |
654 | version = "0.9.0" | |
655 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
656 | checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" | |
652 | version = "0.9.3" | |
653 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
654 | checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" | |
657 | 655 | dependencies = [ |
658 | 656 | "atty", |
659 | 657 | "humantime", |
663 | 661 | ] |
664 | 662 | |
665 | 663 | [[package]] |
664 | name = "errno" | |
665 | version = "0.2.8" | |
666 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
667 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" | |
668 | dependencies = [ | |
669 | "errno-dragonfly", | |
670 | "libc", | |
671 | "winapi", | |
672 | ] | |
673 | ||
674 | [[package]] | |
675 | name = "errno-dragonfly" | |
676 | version = "0.1.2" | |
677 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
678 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" | |
679 | dependencies = [ | |
680 | "cc", | |
681 | "libc", | |
682 | ] | |
683 | ||
684 | [[package]] | |
666 | 685 | name = "event-listener" |
667 | version = "2.5.2" | |
668 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
669 | checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" | |
686 | version = "2.5.3" | |
687 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
688 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" | |
670 | 689 | |
671 | 690 | [[package]] |
672 | 691 | name = "fastrand" |
673 | version = "1.7.0" | |
674 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
675 | checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" | |
692 | version = "1.8.0" | |
693 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
694 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" | |
676 | 695 | dependencies = [ |
677 | 696 | "instant", |
678 | 697 | ] |
716 | 735 | |
717 | 736 | [[package]] |
718 | 737 | name = "fixedbitset" |
719 | version = "0.4.1" | |
720 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
721 | checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" | |
738 | version = "0.4.2" | |
739 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
740 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" | |
722 | 741 | |
723 | 742 | [[package]] |
724 | 743 | name = "float-cmp" |
752 | 771 | |
753 | 772 | [[package]] |
754 | 773 | name = "form_urlencoded" |
755 | version = "1.0.1" | |
756 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
757 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" | |
758 | dependencies = [ | |
759 | "matches", | |
774 | version = "1.1.0" | |
775 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
776 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" | |
777 | dependencies = [ | |
760 | 778 | "percent-encoding", |
761 | 779 | ] |
762 | 780 | |
772 | 790 | |
773 | 791 | [[package]] |
774 | 792 | name = "futures" |
775 | version = "0.3.21" | |
776 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
777 | checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" | |
793 | version = "0.3.25" | |
794 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
795 | checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" | |
778 | 796 | dependencies = [ |
779 | 797 | "futures-channel", |
780 | 798 | "futures-core", |
787 | 805 | |
788 | 806 | [[package]] |
789 | 807 | name = "futures-channel" |
790 | version = "0.3.21" | |
791 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
792 | checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" | |
808 | version = "0.3.25" | |
809 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
810 | checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" | |
793 | 811 | dependencies = [ |
794 | 812 | "futures-core", |
795 | 813 | "futures-sink", |
797 | 815 | |
798 | 816 | [[package]] |
799 | 817 | name = "futures-core" |
800 | version = "0.3.21" | |
801 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
802 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" | |
818 | version = "0.3.25" | |
819 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
820 | checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" | |
803 | 821 | |
804 | 822 | [[package]] |
805 | 823 | name = "futures-executor" |
806 | version = "0.3.21" | |
807 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
808 | checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" | |
824 | version = "0.3.25" | |
825 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
826 | checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" | |
809 | 827 | dependencies = [ |
810 | 828 | "futures-core", |
811 | 829 | "futures-task", |
814 | 832 | |
815 | 833 | [[package]] |
816 | 834 | name = "futures-io" |
817 | version = "0.3.21" | |
818 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
819 | checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" | |
835 | version = "0.3.25" | |
836 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
837 | checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" | |
820 | 838 | |
821 | 839 | [[package]] |
822 | 840 | name = "futures-lite" |
835 | 853 | |
836 | 854 | [[package]] |
837 | 855 | name = "futures-macro" |
838 | version = "0.3.21" | |
839 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
840 | checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" | |
856 | version = "0.3.25" | |
857 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
858 | checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" | |
841 | 859 | dependencies = [ |
842 | 860 | "proc-macro2", |
843 | 861 | "quote", |
846 | 864 | |
847 | 865 | [[package]] |
848 | 866 | name = "futures-sink" |
849 | version = "0.3.21" | |
850 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
851 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" | |
867 | version = "0.3.25" | |
868 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
869 | checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" | |
852 | 870 | |
853 | 871 | [[package]] |
854 | 872 | name = "futures-task" |
855 | version = "0.3.21" | |
856 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
857 | checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" | |
873 | version = "0.3.25" | |
874 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
875 | checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" | |
858 | 876 | |
859 | 877 | [[package]] |
860 | 878 | name = "futures-util" |
861 | version = "0.3.21" | |
862 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
863 | checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" | |
879 | version = "0.3.25" | |
880 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
881 | checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" | |
864 | 882 | dependencies = [ |
865 | 883 | "futures-channel", |
866 | 884 | "futures-core", |
911 | 929 | |
912 | 930 | [[package]] |
913 | 931 | name = "getrandom" |
914 | version = "0.2.6" | |
915 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
916 | checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" | |
932 | version = "0.2.8" | |
933 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
934 | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" | |
917 | 935 | dependencies = [ |
918 | 936 | "cfg-if", |
919 | 937 | "libc", |
920 | "wasi 0.10.2+wasi-snapshot-preview1", | |
938 | "wasi 0.11.0+wasi-snapshot-preview1", | |
921 | 939 | ] |
922 | 940 | |
923 | 941 | [[package]] |
934 | 952 | |
935 | 953 | [[package]] |
936 | 954 | name = "h2" |
937 | version = "0.3.13" | |
938 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
939 | checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" | |
955 | version = "0.3.15" | |
956 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
957 | checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" | |
940 | 958 | dependencies = [ |
941 | 959 | "bytes", |
942 | 960 | "fnv", |
953 | 971 | |
954 | 972 | [[package]] |
955 | 973 | name = "hashbrown" |
956 | version = "0.11.2" | |
957 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
958 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" | |
974 | version = "0.12.3" | |
975 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
976 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" | |
959 | 977 | |
960 | 978 | [[package]] |
961 | 979 | name = "hermit-abi" |
982 | 1000 | |
983 | 1001 | [[package]] |
984 | 1002 | name = "http" |
985 | version = "0.2.7" | |
986 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
987 | checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" | |
1003 | version = "0.2.8" | |
1004 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1005 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" | |
988 | 1006 | dependencies = [ |
989 | 1007 | "bytes", |
990 | 1008 | "fnv", |
991 | "itoa 1.0.1", | |
1009 | "itoa 1.0.4", | |
992 | 1010 | ] |
993 | 1011 | |
994 | 1012 | [[package]] |
995 | 1013 | name = "http-body" |
996 | version = "0.4.4" | |
997 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
998 | checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" | |
1014 | version = "0.4.5" | |
1015 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1016 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" | |
999 | 1017 | dependencies = [ |
1000 | 1018 | "bytes", |
1001 | 1019 | "http", |
1004 | 1022 | |
1005 | 1023 | [[package]] |
1006 | 1024 | name = "httparse" |
1007 | version = "1.7.1" | |
1008 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1009 | checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" | |
1025 | version = "1.8.0" | |
1026 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1027 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" | |
1010 | 1028 | |
1011 | 1029 | [[package]] |
1012 | 1030 | name = "httpdate" |
1050 | 1068 | |
1051 | 1069 | [[package]] |
1052 | 1070 | name = "hyper" |
1053 | version = "0.14.18" | |
1054 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1055 | checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" | |
1071 | version = "0.14.23" | |
1072 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1073 | checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" | |
1056 | 1074 | dependencies = [ |
1057 | 1075 | "bytes", |
1058 | 1076 | "futures-channel", |
1063 | 1081 | "http-body", |
1064 | 1082 | "httparse", |
1065 | 1083 | "httpdate", |
1066 | "itoa 1.0.1", | |
1084 | "itoa 1.0.4", | |
1067 | 1085 | "pin-project-lite", |
1068 | 1086 | "socket2", |
1069 | 1087 | "tokio", |
1087 | 1105 | |
1088 | 1106 | [[package]] |
1089 | 1107 | name = "idna" |
1090 | version = "0.2.3" | |
1091 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1092 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" | |
1093 | dependencies = [ | |
1094 | "matches", | |
1108 | version = "0.3.0" | |
1109 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1110 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" | |
1111 | dependencies = [ | |
1095 | 1112 | "unicode-bidi", |
1096 | 1113 | "unicode-normalization", |
1097 | 1114 | ] |
1098 | 1115 | |
1099 | 1116 | [[package]] |
1100 | 1117 | name = "indexmap" |
1101 | version = "1.8.1" | |
1102 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1103 | checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" | |
1118 | version = "1.9.1" | |
1119 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1120 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" | |
1104 | 1121 | dependencies = [ |
1105 | 1122 | "autocfg", |
1106 | 1123 | "hashbrown", |
1128 | 1145 | ] |
1129 | 1146 | |
1130 | 1147 | [[package]] |
1148 | name = "io-lifetimes" | |
1149 | version = "0.7.5" | |
1150 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1151 | checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074" | |
1152 | ||
1153 | [[package]] | |
1131 | 1154 | name = "ipnet" |
1132 | version = "2.5.0" | |
1133 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1134 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" | |
1155 | version = "2.5.1" | |
1156 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1157 | checksum = "f88c5561171189e69df9d98bcf18fd5f9558300f7ea7b801eb8a0fd748bd8745" | |
1135 | 1158 | |
1136 | 1159 | [[package]] |
1137 | 1160 | name = "isahc" |
1138 | version = "1.7.1" | |
1139 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1140 | checksum = "480d9158c9977bff0bc024a11dcad04efcd3955c1e55301092b13fc439d41720" | |
1161 | version = "1.7.2" | |
1162 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1163 | checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" | |
1141 | 1164 | dependencies = [ |
1142 | 1165 | "async-channel", |
1143 | 1166 | "castaway", |
1162 | 1185 | |
1163 | 1186 | [[package]] |
1164 | 1187 | name = "itertools" |
1165 | version = "0.10.3" | |
1166 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1167 | checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" | |
1188 | version = "0.10.5" | |
1189 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1190 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" | |
1168 | 1191 | dependencies = [ |
1169 | 1192 | "either", |
1170 | 1193 | ] |
1177 | 1200 | |
1178 | 1201 | [[package]] |
1179 | 1202 | name = "itoa" |
1180 | version = "1.0.1" | |
1181 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1182 | checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" | |
1203 | version = "1.0.4" | |
1204 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1205 | checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" | |
1183 | 1206 | |
1184 | 1207 | [[package]] |
1185 | 1208 | name = "js-sys" |
1186 | version = "0.3.57" | |
1187 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1188 | checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" | |
1209 | version = "0.3.60" | |
1210 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1211 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" | |
1189 | 1212 | dependencies = [ |
1190 | 1213 | "wasm-bindgen", |
1191 | 1214 | ] |
1239 | 1262 | |
1240 | 1263 | [[package]] |
1241 | 1264 | name = "leaky-bucket" |
1242 | version = "0.10.0" | |
1243 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1244 | checksum = "152656838516227a1aeeafa54e6c5997f5dbeb625d2ed01e0732b97bbca4574e" | |
1245 | dependencies = [ | |
1246 | "futures-util", | |
1247 | "lazy_static", | |
1248 | "log", | |
1249 | "thiserror", | |
1265 | version = "0.12.1" | |
1266 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1267 | checksum = "28d6c39b1cdaa514a898cd9cfcfbdb03a220264fb9ee08931495291cdda3fe7e" | |
1268 | dependencies = [ | |
1269 | "parking_lot", | |
1250 | 1270 | "tokio", |
1251 | "tokio-stream", | |
1271 | "tracing", | |
1252 | 1272 | ] |
1253 | 1273 | |
1254 | 1274 | [[package]] |
1259 | 1279 | |
1260 | 1280 | [[package]] |
1261 | 1281 | name = "libc" |
1262 | version = "0.2.125" | |
1263 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1264 | checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" | |
1282 | version = "0.2.137" | |
1283 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1284 | checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" | |
1265 | 1285 | |
1266 | 1286 | [[package]] |
1267 | 1287 | name = "libnghttp2-sys" |
1275 | 1295 | |
1276 | 1296 | [[package]] |
1277 | 1297 | name = "libz-sys" |
1278 | version = "1.1.6" | |
1279 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1280 | checksum = "92e7e15d7610cce1d9752e137625f14e61a28cd45929b6e12e47b50fe154ee2e" | |
1298 | version = "1.1.8" | |
1299 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1300 | checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" | |
1281 | 1301 | dependencies = [ |
1282 | 1302 | "cc", |
1283 | 1303 | "libc", |
1286 | 1306 | ] |
1287 | 1307 | |
1288 | 1308 | [[package]] |
1309 | name = "linux-raw-sys" | |
1310 | version = "0.0.46" | |
1311 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1312 | checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" | |
1313 | ||
1314 | [[package]] | |
1289 | 1315 | name = "lock_api" |
1290 | version = "0.4.7" | |
1291 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1292 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" | |
1316 | version = "0.4.9" | |
1317 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1318 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" | |
1293 | 1319 | dependencies = [ |
1294 | 1320 | "autocfg", |
1295 | 1321 | "scopeguard", |
1345 | 1371 | |
1346 | 1372 | [[package]] |
1347 | 1373 | name = "mio" |
1348 | version = "0.8.3" | |
1349 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1350 | checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" | |
1374 | version = "0.8.5" | |
1375 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1376 | checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" | |
1351 | 1377 | dependencies = [ |
1352 | 1378 | "libc", |
1353 | 1379 | "log", |
1354 | 1380 | "wasi 0.11.0+wasi-snapshot-preview1", |
1355 | "windows-sys", | |
1381 | "windows-sys 0.42.0", | |
1356 | 1382 | ] |
1357 | 1383 | |
1358 | 1384 | [[package]] |
1359 | 1385 | name = "native-tls" |
1360 | version = "0.2.10" | |
1361 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1362 | checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" | |
1386 | version = "0.2.11" | |
1387 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1388 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" | |
1363 | 1389 | dependencies = [ |
1364 | 1390 | "lazy_static", |
1365 | 1391 | "libc", |
1381 | 1407 | |
1382 | 1408 | [[package]] |
1383 | 1409 | name = "nix" |
1384 | version = "0.24.1" | |
1385 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1386 | checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" | |
1387 | dependencies = [ | |
1410 | version = "0.25.0" | |
1411 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1412 | checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" | |
1413 | dependencies = [ | |
1414 | "autocfg", | |
1388 | 1415 | "bitflags", |
1389 | 1416 | "cfg-if", |
1390 | 1417 | "libc", |
1413 | 1440 | |
1414 | 1441 | [[package]] |
1415 | 1442 | name = "num_cpus" |
1416 | version = "1.13.1" | |
1417 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1418 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" | |
1443 | version = "1.14.0" | |
1444 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1445 | checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" | |
1419 | 1446 | dependencies = [ |
1420 | 1447 | "hermit-abi", |
1421 | 1448 | "libc", |
1429 | 1456 | |
1430 | 1457 | [[package]] |
1431 | 1458 | name = "once_cell" |
1432 | version = "1.10.0" | |
1433 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1434 | checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" | |
1459 | version = "1.16.0" | |
1460 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1461 | checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" | |
1435 | 1462 | |
1436 | 1463 | [[package]] |
1437 | 1464 | name = "openssl" |
1438 | version = "0.10.40" | |
1439 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1440 | checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" | |
1465 | version = "0.10.42" | |
1466 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1467 | checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13" | |
1441 | 1468 | dependencies = [ |
1442 | 1469 | "bitflags", |
1443 | 1470 | "cfg-if", |
1467 | 1494 | |
1468 | 1495 | [[package]] |
1469 | 1496 | name = "openssl-src" |
1470 | version = "111.18.0+1.1.1n" | |
1471 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1472 | checksum = "7897a926e1e8d00219127dc020130eca4292e5ca666dd592480d72c3eca2ff6c" | |
1497 | version = "111.24.0+1.1.1s" | |
1498 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1499 | checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd" | |
1473 | 1500 | dependencies = [ |
1474 | 1501 | "cc", |
1475 | 1502 | ] |
1476 | 1503 | |
1477 | 1504 | [[package]] |
1478 | 1505 | name = "openssl-sys" |
1479 | version = "0.9.73" | |
1480 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1481 | checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" | |
1506 | version = "0.9.77" | |
1507 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1508 | checksum = "b03b84c3b2d099b81f0953422b4d4ad58761589d0229b5506356afca05a3670a" | |
1482 | 1509 | dependencies = [ |
1483 | 1510 | "autocfg", |
1484 | 1511 | "cc", |
1490 | 1517 | |
1491 | 1518 | [[package]] |
1492 | 1519 | name = "os_str_bytes" |
1493 | version = "6.0.0" | |
1494 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1495 | checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" | |
1520 | version = "6.4.0" | |
1521 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1522 | checksum = "7b5bf27447411e9ee3ff51186bf7a08e16c341efdde93f4d823e8844429bed7e" | |
1496 | 1523 | |
1497 | 1524 | [[package]] |
1498 | 1525 | name = "parking" |
1502 | 1529 | |
1503 | 1530 | [[package]] |
1504 | 1531 | name = "parking_lot" |
1505 | version = "0.12.0" | |
1506 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1507 | checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" | |
1532 | version = "0.12.1" | |
1533 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1534 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" | |
1508 | 1535 | dependencies = [ |
1509 | 1536 | "lock_api", |
1510 | 1537 | "parking_lot_core", |
1512 | 1539 | |
1513 | 1540 | [[package]] |
1514 | 1541 | name = "parking_lot_core" |
1515 | version = "0.9.3" | |
1516 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1517 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" | |
1542 | version = "0.9.4" | |
1543 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1544 | checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" | |
1518 | 1545 | dependencies = [ |
1519 | 1546 | "cfg-if", |
1520 | 1547 | "libc", |
1521 | 1548 | "redox_syscall", |
1522 | 1549 | "smallvec", |
1523 | "windows-sys", | |
1550 | "windows-sys 0.42.0", | |
1524 | 1551 | ] |
1525 | 1552 | |
1526 | 1553 | [[package]] |
1527 | 1554 | name = "percent-encoding" |
1528 | version = "2.1.0" | |
1529 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1530 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" | |
1555 | version = "2.2.0" | |
1556 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1557 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" | |
1531 | 1558 | |
1532 | 1559 | [[package]] |
1533 | 1560 | name = "petgraph" |
1534 | version = "0.6.0" | |
1535 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1536 | checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" | |
1561 | version = "0.6.2" | |
1562 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1563 | checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" | |
1537 | 1564 | dependencies = [ |
1538 | 1565 | "fixedbitset", |
1539 | 1566 | "indexmap", |
1639 | 1666 | |
1640 | 1667 | [[package]] |
1641 | 1668 | name = "pin-project" |
1642 | version = "1.0.10" | |
1643 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1644 | checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" | |
1669 | version = "1.0.12" | |
1670 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1671 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" | |
1645 | 1672 | dependencies = [ |
1646 | 1673 | "pin-project-internal", |
1647 | 1674 | ] |
1648 | 1675 | |
1649 | 1676 | [[package]] |
1650 | 1677 | name = "pin-project-internal" |
1651 | version = "1.0.10" | |
1652 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1653 | checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" | |
1678 | version = "1.0.12" | |
1679 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1680 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" | |
1654 | 1681 | dependencies = [ |
1655 | 1682 | "proc-macro2", |
1656 | 1683 | "quote", |
1671 | 1698 | |
1672 | 1699 | [[package]] |
1673 | 1700 | name = "pkg-config" |
1674 | version = "0.3.25" | |
1675 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1676 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" | |
1701 | version = "0.3.26" | |
1702 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1703 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" | |
1677 | 1704 | |
1678 | 1705 | [[package]] |
1679 | 1706 | name = "polling" |
1680 | version = "2.2.0" | |
1681 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1682 | checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" | |
1683 | dependencies = [ | |
1707 | version = "2.4.0" | |
1708 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1709 | checksum = "ab4609a838d88b73d8238967b60dd115cc08d38e2bbaf51ee1e4b695f89122e2" | |
1710 | dependencies = [ | |
1711 | "autocfg", | |
1684 | 1712 | "cfg-if", |
1685 | 1713 | "libc", |
1686 | 1714 | "log", |
1690 | 1718 | |
1691 | 1719 | [[package]] |
1692 | 1720 | name = "ppv-lite86" |
1693 | version = "0.2.16" | |
1694 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1695 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" | |
1721 | version = "0.2.17" | |
1722 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1723 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" | |
1696 | 1724 | |
1697 | 1725 | [[package]] |
1698 | 1726 | name = "precomputed-hash" |
1702 | 1730 | |
1703 | 1731 | [[package]] |
1704 | 1732 | name = "predicates" |
1705 | version = "2.1.1" | |
1706 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1707 | checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" | |
1733 | version = "2.1.3" | |
1734 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1735 | checksum = "ed6bd09a7f7e68f3f0bf710fb7ab9c4615a488b58b5f653382a687701e458c92" | |
1708 | 1736 | dependencies = [ |
1709 | 1737 | "difflib", |
1710 | 1738 | "float-cmp", |
1716 | 1744 | |
1717 | 1745 | [[package]] |
1718 | 1746 | name = "predicates-core" |
1719 | version = "1.0.3" | |
1720 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1721 | checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb" | |
1747 | version = "1.0.5" | |
1748 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1749 | checksum = "72f883590242d3c6fc5bf50299011695fa6590c2c70eac95ee1bdb9a733ad1a2" | |
1722 | 1750 | |
1723 | 1751 | [[package]] |
1724 | 1752 | name = "predicates-tree" |
1725 | version = "1.0.5" | |
1726 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1727 | checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032" | |
1753 | version = "1.0.7" | |
1754 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1755 | checksum = "54ff541861505aabf6ea722d2131ee980b8276e10a1297b94e896dd8b621850d" | |
1728 | 1756 | dependencies = [ |
1729 | 1757 | "predicates-core", |
1730 | 1758 | "termtree", |
1738 | 1766 | |
1739 | 1767 | [[package]] |
1740 | 1768 | name = "proc-macro2" |
1741 | version = "1.0.38" | |
1742 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1743 | checksum = "9027b48e9d4c9175fa2218adf3557f91c1137021739951d4932f5f8268ac48aa" | |
1744 | dependencies = [ | |
1745 | "unicode-xid", | |
1769 | version = "1.0.47" | |
1770 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1771 | checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" | |
1772 | dependencies = [ | |
1773 | "unicode-ident", | |
1746 | 1774 | ] |
1747 | 1775 | |
1748 | 1776 | [[package]] |
1749 | 1777 | name = "quote" |
1750 | version = "1.0.18" | |
1751 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1752 | checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" | |
1778 | version = "1.0.21" | |
1779 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1780 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" | |
1753 | 1781 | dependencies = [ |
1754 | 1782 | "proc-macro2", |
1755 | 1783 | ] |
1776 | 1804 | dependencies = [ |
1777 | 1805 | "libc", |
1778 | 1806 | "rand_chacha 0.3.1", |
1779 | "rand_core 0.6.3", | |
1807 | "rand_core 0.6.4", | |
1780 | 1808 | ] |
1781 | 1809 | |
1782 | 1810 | [[package]] |
1796 | 1824 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" |
1797 | 1825 | dependencies = [ |
1798 | 1826 | "ppv-lite86", |
1799 | "rand_core 0.6.3", | |
1827 | "rand_core 0.6.4", | |
1800 | 1828 | ] |
1801 | 1829 | |
1802 | 1830 | [[package]] |
1810 | 1838 | |
1811 | 1839 | [[package]] |
1812 | 1840 | name = "rand_core" |
1813 | version = "0.6.3" | |
1814 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1815 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" | |
1816 | dependencies = [ | |
1817 | "getrandom 0.2.6", | |
1841 | version = "0.6.4" | |
1842 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1843 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" | |
1844 | dependencies = [ | |
1845 | "getrandom 0.2.8", | |
1818 | 1846 | ] |
1819 | 1847 | |
1820 | 1848 | [[package]] |
1837 | 1865 | |
1838 | 1866 | [[package]] |
1839 | 1867 | name = "redox_syscall" |
1840 | version = "0.2.13" | |
1841 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1842 | checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" | |
1868 | version = "0.2.16" | |
1869 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1870 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" | |
1843 | 1871 | dependencies = [ |
1844 | 1872 | "bitflags", |
1845 | 1873 | ] |
1850 | 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" |
1851 | 1879 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" |
1852 | 1880 | dependencies = [ |
1853 | "getrandom 0.2.6", | |
1881 | "getrandom 0.2.8", | |
1854 | 1882 | "redox_syscall", |
1855 | 1883 | "thiserror", |
1856 | 1884 | ] |
1857 | 1885 | |
1858 | 1886 | [[package]] |
1859 | 1887 | name = "regex" |
1860 | version = "1.5.5" | |
1861 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1862 | checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" | |
1888 | version = "1.7.0" | |
1889 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1890 | checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" | |
1863 | 1891 | dependencies = [ |
1864 | 1892 | "aho-corasick", |
1865 | 1893 | "memchr", |
1874 | 1902 | |
1875 | 1903 | [[package]] |
1876 | 1904 | name = "regex-syntax" |
1877 | version = "0.6.25" | |
1878 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1879 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" | |
1905 | version = "0.6.28" | |
1906 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1907 | checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" | |
1880 | 1908 | |
1881 | 1909 | [[package]] |
1882 | 1910 | name = "remove_dir_all" |
1889 | 1917 | |
1890 | 1918 | [[package]] |
1891 | 1919 | name = "reqwest" |
1892 | version = "0.11.10" | |
1893 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1894 | checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" | |
1920 | version = "0.11.13" | |
1921 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1922 | checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" | |
1895 | 1923 | dependencies = [ |
1896 | 1924 | "base64", |
1897 | 1925 | "bytes", |
1905 | 1933 | "hyper-tls", |
1906 | 1934 | "ipnet", |
1907 | 1935 | "js-sys", |
1908 | "lazy_static", | |
1909 | 1936 | "log", |
1910 | 1937 | "mime", |
1911 | 1938 | "native-tls", |
1939 | "once_cell", | |
1912 | 1940 | "percent-encoding", |
1913 | 1941 | "pin-project-lite", |
1914 | 1942 | "serde", |
1917 | 1945 | "tokio", |
1918 | 1946 | "tokio-native-tls", |
1919 | 1947 | "tokio-socks", |
1948 | "tower-service", | |
1920 | 1949 | "url", |
1921 | 1950 | "wasm-bindgen", |
1922 | 1951 | "wasm-bindgen-futures", |
1943 | 1972 | ] |
1944 | 1973 | |
1945 | 1974 | [[package]] |
1975 | name = "rustix" | |
1976 | version = "0.35.13" | |
1977 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1978 | checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" | |
1979 | dependencies = [ | |
1980 | "bitflags", | |
1981 | "errno", | |
1982 | "io-lifetimes", | |
1983 | "libc", | |
1984 | "linux-raw-sys", | |
1985 | "windows-sys 0.42.0", | |
1986 | ] | |
1987 | ||
1988 | [[package]] | |
1946 | 1989 | name = "rustversion" |
1947 | version = "1.0.6" | |
1948 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1949 | checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" | |
1990 | version = "1.0.9" | |
1991 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1992 | checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" | |
1950 | 1993 | |
1951 | 1994 | [[package]] |
1952 | 1995 | name = "ryu" |
1953 | version = "1.0.9" | |
1954 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1955 | checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" | |
1996 | version = "1.0.11" | |
1997 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1998 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" | |
1956 | 1999 | |
1957 | 2000 | [[package]] |
1958 | 2001 | name = "schannel" |
1959 | version = "0.1.19" | |
1960 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1961 | checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" | |
2002 | version = "0.1.20" | |
2003 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2004 | checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" | |
1962 | 2005 | dependencies = [ |
1963 | 2006 | "lazy_static", |
1964 | "winapi", | |
2007 | "windows-sys 0.36.1", | |
1965 | 2008 | ] |
1966 | 2009 | |
1967 | 2010 | [[package]] |
1988 | 2031 | |
1989 | 2032 | [[package]] |
1990 | 2033 | name = "security-framework" |
1991 | version = "2.6.1" | |
1992 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
1993 | checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" | |
2034 | version = "2.7.0" | |
2035 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2036 | checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" | |
1994 | 2037 | dependencies = [ |
1995 | 2038 | "bitflags", |
1996 | 2039 | "core-foundation", |
2031 | 2074 | |
2032 | 2075 | [[package]] |
2033 | 2076 | name = "semver" |
2034 | version = "1.0.9" | |
2035 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2036 | checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" | |
2077 | version = "1.0.14" | |
2078 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2079 | checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" | |
2037 | 2080 | |
2038 | 2081 | [[package]] |
2039 | 2082 | name = "serde" |
2040 | version = "1.0.137" | |
2041 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2042 | checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" | |
2083 | version = "1.0.147" | |
2084 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2085 | checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" | |
2043 | 2086 | dependencies = [ |
2044 | 2087 | "serde_derive", |
2045 | 2088 | ] |
2046 | 2089 | |
2047 | 2090 | [[package]] |
2048 | 2091 | name = "serde_derive" |
2049 | version = "1.0.137" | |
2050 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2051 | checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" | |
2092 | version = "1.0.147" | |
2093 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2094 | checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" | |
2052 | 2095 | dependencies = [ |
2053 | 2096 | "proc-macro2", |
2054 | 2097 | "quote", |
2057 | 2100 | |
2058 | 2101 | [[package]] |
2059 | 2102 | name = "serde_json" |
2060 | version = "1.0.81" | |
2061 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2062 | checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" | |
2063 | dependencies = [ | |
2064 | "itoa 1.0.1", | |
2103 | version = "1.0.87" | |
2104 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2105 | checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" | |
2106 | dependencies = [ | |
2107 | "itoa 1.0.4", | |
2065 | 2108 | "ryu", |
2066 | 2109 | "serde", |
2067 | 2110 | ] |
2083 | 2126 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" |
2084 | 2127 | dependencies = [ |
2085 | 2128 | "form_urlencoded", |
2086 | "itoa 1.0.1", | |
2129 | "itoa 1.0.4", | |
2087 | 2130 | "ryu", |
2088 | 2131 | "serde", |
2089 | 2132 | ] |
2100 | 2143 | |
2101 | 2144 | [[package]] |
2102 | 2145 | name = "signal-hook" |
2103 | version = "0.3.13" | |
2104 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2105 | checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" | |
2146 | version = "0.3.14" | |
2147 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2148 | checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" | |
2106 | 2149 | dependencies = [ |
2107 | 2150 | "libc", |
2108 | 2151 | "signal-hook-registry", |
2130 | 2173 | |
2131 | 2174 | [[package]] |
2132 | 2175 | name = "similar" |
2133 | version = "2.1.0" | |
2134 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2135 | checksum = "2e24979f63a11545f5f2c60141afe249d4f19f84581ea2138065e400941d83d3" | |
2176 | version = "2.2.1" | |
2177 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2178 | checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf" | |
2136 | 2179 | |
2137 | 2180 | [[package]] |
2138 | 2181 | name = "siphasher" |
2142 | 2185 | |
2143 | 2186 | [[package]] |
2144 | 2187 | name = "slab" |
2145 | version = "0.4.6" | |
2146 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2147 | checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" | |
2188 | version = "0.4.7" | |
2189 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2190 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" | |
2191 | dependencies = [ | |
2192 | "autocfg", | |
2193 | ] | |
2148 | 2194 | |
2149 | 2195 | [[package]] |
2150 | 2196 | name = "sluice" |
2159 | 2205 | |
2160 | 2206 | [[package]] |
2161 | 2207 | name = "smallvec" |
2162 | version = "1.8.0" | |
2163 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2164 | checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" | |
2208 | version = "1.10.0" | |
2209 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2210 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" | |
2165 | 2211 | |
2166 | 2212 | [[package]] |
2167 | 2213 | name = "socket2" |
2168 | version = "0.4.4" | |
2169 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2170 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" | |
2214 | version = "0.4.7" | |
2215 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2216 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" | |
2171 | 2217 | dependencies = [ |
2172 | 2218 | "libc", |
2173 | 2219 | "winapi", |
2213 | 2259 | |
2214 | 2260 | [[package]] |
2215 | 2261 | name = "syn" |
2216 | version = "1.0.93" | |
2217 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2218 | checksum = "04066589568b72ec65f42d65a1a52436e954b168773148893c020269563decf2" | |
2262 | version = "1.0.103" | |
2263 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2264 | checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" | |
2219 | 2265 | dependencies = [ |
2220 | 2266 | "proc-macro2", |
2221 | 2267 | "quote", |
2222 | "unicode-xid", | |
2268 | "unicode-ident", | |
2223 | 2269 | ] |
2224 | 2270 | |
2225 | 2271 | [[package]] |
2278 | 2324 | ] |
2279 | 2325 | |
2280 | 2326 | [[package]] |
2327 | name = "terminal_size" | |
2328 | version = "0.2.2" | |
2329 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2330 | checksum = "40ca90c434fd12083d1a6bdcbe9f92a14f96c8a1ba600ba451734ac334521f7a" | |
2331 | dependencies = [ | |
2332 | "rustix", | |
2333 | "windows-sys 0.42.0", | |
2334 | ] | |
2335 | ||
2336 | [[package]] | |
2281 | 2337 | name = "termtree" |
2282 | version = "0.2.4" | |
2283 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2284 | checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" | |
2285 | ||
2286 | [[package]] | |
2287 | name = "textwrap" | |
2288 | version = "0.15.0" | |
2289 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2290 | checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" | |
2291 | dependencies = [ | |
2292 | "terminal_size", | |
2293 | ] | |
2338 | version = "0.4.0" | |
2339 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2340 | checksum = "95059e91184749cb66be6dc994f67f182b6d897cb3df74a5bf66b5e709295fd8" | |
2294 | 2341 | |
2295 | 2342 | [[package]] |
2296 | 2343 | name = "thin-slice" |
2300 | 2347 | |
2301 | 2348 | [[package]] |
2302 | 2349 | name = "thiserror" |
2303 | version = "1.0.31" | |
2304 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2305 | checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" | |
2350 | version = "1.0.37" | |
2351 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2352 | checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" | |
2306 | 2353 | dependencies = [ |
2307 | 2354 | "thiserror-impl", |
2308 | 2355 | ] |
2309 | 2356 | |
2310 | 2357 | [[package]] |
2311 | 2358 | name = "thiserror-impl" |
2312 | version = "1.0.31" | |
2313 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2314 | checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" | |
2359 | version = "1.0.37" | |
2360 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2361 | checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" | |
2315 | 2362 | dependencies = [ |
2316 | 2363 | "proc-macro2", |
2317 | 2364 | "quote", |
2344 | 2391 | |
2345 | 2392 | [[package]] |
2346 | 2393 | name = "tokio" |
2347 | version = "1.18.2" | |
2348 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2349 | checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395" | |
2350 | dependencies = [ | |
2394 | version = "1.21.2" | |
2395 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2396 | checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" | |
2397 | dependencies = [ | |
2398 | "autocfg", | |
2351 | 2399 | "bytes", |
2352 | 2400 | "libc", |
2353 | 2401 | "memchr", |
2354 | 2402 | "mio", |
2355 | 2403 | "num_cpus", |
2356 | "once_cell", | |
2357 | 2404 | "parking_lot", |
2358 | 2405 | "pin-project-lite", |
2359 | 2406 | "signal-hook-registry", |
2364 | 2411 | |
2365 | 2412 | [[package]] |
2366 | 2413 | name = "tokio-macros" |
2367 | version = "1.7.0" | |
2368 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2369 | checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" | |
2414 | version = "1.8.0" | |
2415 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2416 | checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" | |
2370 | 2417 | dependencies = [ |
2371 | 2418 | "proc-macro2", |
2372 | 2419 | "quote", |
2396 | 2443 | ] |
2397 | 2444 | |
2398 | 2445 | [[package]] |
2399 | name = "tokio-stream" | |
2400 | version = "0.1.8" | |
2401 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2402 | checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" | |
2403 | dependencies = [ | |
2404 | "futures-core", | |
2405 | "pin-project-lite", | |
2406 | "tokio", | |
2407 | ] | |
2408 | ||
2409 | [[package]] | |
2410 | 2446 | name = "tokio-util" |
2411 | version = "0.7.1" | |
2412 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2413 | checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" | |
2447 | version = "0.7.4" | |
2448 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2449 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" | |
2414 | 2450 | dependencies = [ |
2415 | 2451 | "bytes", |
2416 | 2452 | "futures-core", |
2431 | 2467 | |
2432 | 2468 | [[package]] |
2433 | 2469 | name = "tower-service" |
2434 | version = "0.3.1" | |
2435 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2436 | checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" | |
2470 | version = "0.3.2" | |
2471 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2472 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" | |
2437 | 2473 | |
2438 | 2474 | [[package]] |
2439 | 2475 | name = "tracing" |
2440 | version = "0.1.34" | |
2441 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2442 | checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" | |
2476 | version = "0.1.37" | |
2477 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2478 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" | |
2443 | 2479 | dependencies = [ |
2444 | 2480 | "cfg-if", |
2445 | 2481 | "log", |
2450 | 2486 | |
2451 | 2487 | [[package]] |
2452 | 2488 | name = "tracing-attributes" |
2453 | version = "0.1.21" | |
2454 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2455 | checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" | |
2489 | version = "0.1.23" | |
2490 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2491 | checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" | |
2456 | 2492 | dependencies = [ |
2457 | 2493 | "proc-macro2", |
2458 | 2494 | "quote", |
2461 | 2497 | |
2462 | 2498 | [[package]] |
2463 | 2499 | name = "tracing-core" |
2464 | version = "0.1.26" | |
2465 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2466 | checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" | |
2467 | dependencies = [ | |
2468 | "lazy_static", | |
2500 | version = "0.1.30" | |
2501 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2502 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" | |
2503 | dependencies = [ | |
2504 | "once_cell", | |
2469 | 2505 | ] |
2470 | 2506 | |
2471 | 2507 | [[package]] |
2491 | 2527 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" |
2492 | 2528 | |
2493 | 2529 | [[package]] |
2530 | name = "unicode-ident" | |
2531 | version = "1.0.5" | |
2532 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2533 | checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" | |
2534 | ||
2535 | [[package]] | |
2494 | 2536 | name = "unicode-normalization" |
2495 | version = "0.1.19" | |
2496 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2497 | checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" | |
2537 | version = "0.1.22" | |
2538 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2539 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" | |
2498 | 2540 | dependencies = [ |
2499 | 2541 | "tinyvec", |
2500 | 2542 | ] |
2501 | 2543 | |
2502 | 2544 | [[package]] |
2503 | 2545 | name = "unicode-width" |
2504 | version = "0.1.9" | |
2505 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2506 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" | |
2546 | version = "0.1.10" | |
2547 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2548 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" | |
2507 | 2549 | |
2508 | 2550 | [[package]] |
2509 | 2551 | name = "unicode-xid" |
2510 | version = "0.2.3" | |
2511 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2512 | checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" | |
2552 | version = "0.2.4" | |
2553 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2554 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" | |
2513 | 2555 | |
2514 | 2556 | [[package]] |
2515 | 2557 | name = "url" |
2516 | version = "2.2.2" | |
2517 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2518 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" | |
2558 | version = "2.3.1" | |
2559 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2560 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" | |
2519 | 2561 | dependencies = [ |
2520 | 2562 | "form_urlencoded", |
2521 | 2563 | "idna", |
2522 | "matches", | |
2523 | 2564 | "percent-encoding", |
2524 | 2565 | "serde", |
2525 | 2566 | ] |
2532 | 2573 | |
2533 | 2574 | [[package]] |
2534 | 2575 | name = "uuid" |
2535 | version = "1.0.0" | |
2536 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2537 | checksum = "8cfcd319456c4d6ea10087ed423473267e1a071f3bc0aa89f80d60997843c6f0" | |
2538 | dependencies = [ | |
2539 | "getrandom 0.2.6", | |
2576 | version = "1.2.2" | |
2577 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2578 | checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" | |
2579 | dependencies = [ | |
2580 | "getrandom 0.2.8", | |
2540 | 2581 | ] |
2541 | 2582 | |
2542 | 2583 | [[package]] |
2594 | 2635 | |
2595 | 2636 | [[package]] |
2596 | 2637 | name = "wasi" |
2597 | version = "0.10.2+wasi-snapshot-preview1" | |
2598 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2599 | checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" | |
2600 | ||
2601 | [[package]] | |
2602 | name = "wasi" | |
2603 | 2638 | version = "0.11.0+wasi-snapshot-preview1" |
2604 | 2639 | source = "registry+https://github.com/rust-lang/crates.io-index" |
2605 | 2640 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" |
2606 | 2641 | |
2607 | 2642 | [[package]] |
2608 | 2643 | name = "wasm-bindgen" |
2609 | version = "0.2.80" | |
2610 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2611 | checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" | |
2644 | version = "0.2.83" | |
2645 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2646 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" | |
2612 | 2647 | dependencies = [ |
2613 | 2648 | "cfg-if", |
2614 | 2649 | "wasm-bindgen-macro", |
2616 | 2651 | |
2617 | 2652 | [[package]] |
2618 | 2653 | name = "wasm-bindgen-backend" |
2619 | version = "0.2.80" | |
2620 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2621 | checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" | |
2654 | version = "0.2.83" | |
2655 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2656 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" | |
2622 | 2657 | dependencies = [ |
2623 | 2658 | "bumpalo", |
2624 | "lazy_static", | |
2625 | 2659 | "log", |
2660 | "once_cell", | |
2626 | 2661 | "proc-macro2", |
2627 | 2662 | "quote", |
2628 | 2663 | "syn", |
2631 | 2666 | |
2632 | 2667 | [[package]] |
2633 | 2668 | name = "wasm-bindgen-futures" |
2634 | version = "0.4.30" | |
2635 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2636 | checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" | |
2669 | version = "0.4.33" | |
2670 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2671 | checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" | |
2637 | 2672 | dependencies = [ |
2638 | 2673 | "cfg-if", |
2639 | 2674 | "js-sys", |
2643 | 2678 | |
2644 | 2679 | [[package]] |
2645 | 2680 | name = "wasm-bindgen-macro" |
2646 | version = "0.2.80" | |
2647 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2648 | checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" | |
2681 | version = "0.2.83" | |
2682 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2683 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" | |
2649 | 2684 | dependencies = [ |
2650 | 2685 | "quote", |
2651 | 2686 | "wasm-bindgen-macro-support", |
2653 | 2688 | |
2654 | 2689 | [[package]] |
2655 | 2690 | name = "wasm-bindgen-macro-support" |
2656 | version = "0.2.80" | |
2657 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2658 | checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" | |
2691 | version = "0.2.83" | |
2692 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2693 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" | |
2659 | 2694 | dependencies = [ |
2660 | 2695 | "proc-macro2", |
2661 | 2696 | "quote", |
2666 | 2701 | |
2667 | 2702 | [[package]] |
2668 | 2703 | name = "wasm-bindgen-shared" |
2669 | version = "0.2.80" | |
2670 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2671 | checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" | |
2704 | version = "0.2.83" | |
2705 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2706 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" | |
2672 | 2707 | |
2673 | 2708 | [[package]] |
2674 | 2709 | name = "web-sys" |
2675 | version = "0.3.57" | |
2676 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2677 | checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" | |
2710 | version = "0.3.60" | |
2711 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2712 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" | |
2678 | 2713 | dependencies = [ |
2679 | 2714 | "js-sys", |
2680 | 2715 | "wasm-bindgen", |
2726 | 2761 | source = "registry+https://github.com/rust-lang/crates.io-index" |
2727 | 2762 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" |
2728 | 2763 | dependencies = [ |
2729 | "windows_aarch64_msvc", | |
2730 | "windows_i686_gnu", | |
2731 | "windows_i686_msvc", | |
2732 | "windows_x86_64_gnu", | |
2733 | "windows_x86_64_msvc", | |
2734 | ] | |
2764 | "windows_aarch64_msvc 0.36.1", | |
2765 | "windows_i686_gnu 0.36.1", | |
2766 | "windows_i686_msvc 0.36.1", | |
2767 | "windows_x86_64_gnu 0.36.1", | |
2768 | "windows_x86_64_msvc 0.36.1", | |
2769 | ] | |
2770 | ||
2771 | [[package]] | |
2772 | name = "windows-sys" | |
2773 | version = "0.42.0" | |
2774 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2775 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" | |
2776 | dependencies = [ | |
2777 | "windows_aarch64_gnullvm", | |
2778 | "windows_aarch64_msvc 0.42.0", | |
2779 | "windows_i686_gnu 0.42.0", | |
2780 | "windows_i686_msvc 0.42.0", | |
2781 | "windows_x86_64_gnu 0.42.0", | |
2782 | "windows_x86_64_gnullvm", | |
2783 | "windows_x86_64_msvc 0.42.0", | |
2784 | ] | |
2785 | ||
2786 | [[package]] | |
2787 | name = "windows_aarch64_gnullvm" | |
2788 | version = "0.42.0" | |
2789 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2790 | checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" | |
2735 | 2791 | |
2736 | 2792 | [[package]] |
2737 | 2793 | name = "windows_aarch64_msvc" |
2740 | 2796 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" |
2741 | 2797 | |
2742 | 2798 | [[package]] |
2799 | name = "windows_aarch64_msvc" | |
2800 | version = "0.42.0" | |
2801 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2802 | checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" | |
2803 | ||
2804 | [[package]] | |
2743 | 2805 | name = "windows_i686_gnu" |
2744 | 2806 | version = "0.36.1" |
2745 | 2807 | source = "registry+https://github.com/rust-lang/crates.io-index" |
2746 | 2808 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" |
2747 | 2809 | |
2748 | 2810 | [[package]] |
2811 | name = "windows_i686_gnu" | |
2812 | version = "0.42.0" | |
2813 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2814 | checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" | |
2815 | ||
2816 | [[package]] | |
2749 | 2817 | name = "windows_i686_msvc" |
2750 | 2818 | version = "0.36.1" |
2751 | 2819 | source = "registry+https://github.com/rust-lang/crates.io-index" |
2752 | 2820 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" |
2753 | 2821 | |
2754 | 2822 | [[package]] |
2823 | name = "windows_i686_msvc" | |
2824 | version = "0.42.0" | |
2825 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2826 | checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" | |
2827 | ||
2828 | [[package]] | |
2755 | 2829 | name = "windows_x86_64_gnu" |
2756 | 2830 | version = "0.36.1" |
2757 | 2831 | source = "registry+https://github.com/rust-lang/crates.io-index" |
2758 | 2832 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" |
2759 | 2833 | |
2760 | 2834 | [[package]] |
2835 | name = "windows_x86_64_gnu" | |
2836 | version = "0.42.0" | |
2837 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2838 | checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" | |
2839 | ||
2840 | [[package]] | |
2841 | name = "windows_x86_64_gnullvm" | |
2842 | version = "0.42.0" | |
2843 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2844 | checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" | |
2845 | ||
2846 | [[package]] | |
2761 | 2847 | name = "windows_x86_64_msvc" |
2762 | 2848 | version = "0.36.1" |
2763 | 2849 | source = "registry+https://github.com/rust-lang/crates.io-index" |
2764 | 2850 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" |
2765 | 2851 | |
2766 | 2852 | [[package]] |
2853 | name = "windows_x86_64_msvc" | |
2854 | version = "0.42.0" | |
2855 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
2856 | checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" | |
2857 | ||
2858 | [[package]] | |
2767 | 2859 | name = "winreg" |
2768 | 2860 | version = "0.10.1" |
2769 | 2861 | source = "registry+https://github.com/rust-lang/crates.io-index" |
0 | 0 | [package] |
1 | 1 | name = "feroxbuster" |
2 | version = "2.7.1" | |
2 | version = "2.7.2" | |
3 | 3 | authors = ["Ben 'epi' Risher (@epi052)"] |
4 | 4 | license = "MIT" |
5 | 5 | edition = "2021" |
21 | 21 | maintenance = { status = "actively-developed" } |
22 | 22 | |
23 | 23 | [build-dependencies] |
24 | clap = { version = "3.1.18", features = ["wrap_help", "cargo"] } | |
25 | clap_complete = "3.1.4" | |
24 | clap = { version = "4.0.8", features = ["wrap_help", "cargo"] } | |
25 | clap_complete = "4.0.2" | |
26 | 26 | regex = "1.5.5" |
27 | 27 | lazy_static = "1.4.0" |
28 | 28 | dirs = "4.0.0" |
38 | 38 | # uses feature unification to add 'serde' to reqwest::Url |
39 | 39 | url = { version = "2.2.2", features = ["serde"] } |
40 | 40 | serde_regex = "1.1.0" |
41 | clap = { version = "3.1.18", features = ["wrap_help", "cargo"] } | |
41 | clap = { version = "4.0.8", features = ["wrap_help", "cargo"] } | |
42 | 42 | lazy_static = "1.4.0" |
43 | 43 | toml = "0.5.9" |
44 | 44 | serde = { version = "1.0.137", features = ["derive", "rc"] } |
45 | 45 | serde_json = "1.0.81" |
46 | 46 | uuid = { version = "1.0.0", features = ["v4"] } |
47 | 47 | indicatif = "0.15" |
48 | console = "0.15.0" | |
48 | console = "0.15.2" | |
49 | 49 | openssl = { version = "0.10.40", features = ["vendored"] } |
50 | 50 | dirs = "4.0.0" |
51 | 51 | regex = "1.5.5" |
52 | crossterm = "0.23.2" | |
52 | crossterm = "0.25.0" | |
53 | 53 | rlimit = "0.8.3" |
54 | 54 | ctrlc = "3.2.2" |
55 | 55 | fuzzyhash = "0.2.1" |
56 | 56 | anyhow = "1.0.57" |
57 | leaky-bucket = "0.10.0" | |
57 | leaky-bucket = "0.12.1" | |
58 | 58 | |
59 | 59 | [dev-dependencies] |
60 | 60 | tempfile = "3.3.0" |
10 | 10 | # dependency management |
11 | 11 | [tasks.upgrade-deps] |
12 | 12 | command = "cargo" |
13 | args = ["upgrade", "--exclude", "indicatif", "leaky-bucket"] | |
13 | args = ["upgrade", "--exclude", "indicatif"] | |
14 | 14 | |
15 | 15 | [tasks.update] |
16 | 16 | command = "cargo" |
180 | 180 | <!-- prettier-ignore-start --> |
181 | 181 | <!-- markdownlint-disable --> |
182 | 182 | <table> |
183 | <tr> | |
184 | <td align="center"><a href="https://io.fi"><img src="https://avatars.githubusercontent.com/u/5235109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joona Hoikkala</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=joohoi" title="Documentation">📖</a></td> | |
185 | <td align="center"><a href="https://github.com/jsav0"><img src="https://avatars.githubusercontent.com/u/20546041?v=4?s=100" width="100px;" alt=""/><br /><sub><b>J Savage</b></sub></a><br /><a href="#infra-jsav0" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=jsav0" title="Documentation">📖</a></td> | |
186 | <td align="center"><a href="http://www.tgotwig.dev"><img src="https://avatars.githubusercontent.com/u/30773779?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Thomas Gotwig</b></sub></a><br /><a href="#infra-TGotwig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=TGotwig" title="Documentation">📖</a></td> | |
187 | <td align="center"><a href="https://github.com/spikecodes"><img src="https://avatars.githubusercontent.com/u/19519553?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Spike</b></sub></a><br /><a href="#infra-spikecodes" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=spikecodes" title="Documentation">📖</a></td> | |
188 | <td align="center"><a href="https://github.com/evanrichter"><img src="https://avatars.githubusercontent.com/u/330292?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Evan Richter</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Documentation">📖</a></td> | |
189 | <td align="center"><a href="https://github.com/mzpqnxow"><img src="https://avatars.githubusercontent.com/u/8016228?v=4?s=100" width="100px;" alt=""/><br /><sub><b>AG</b></sub></a><br /><a href="#ideas-mzpqnxow" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=mzpqnxow" title="Documentation">📖</a></td> | |
190 | <td align="center"><a href="https://n-thumann.de/"><img src="https://avatars.githubusercontent.com/u/46975855?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nicolas Thumann</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Documentation">📖</a></td> | |
191 | </tr> | |
192 | <tr> | |
193 | <td align="center"><a href="https://github.com/tomtastic"><img src="https://avatars.githubusercontent.com/u/302127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tom Matthews</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=tomtastic" title="Documentation">📖</a></td> | |
194 | <td align="center"><a href="https://github.com/bsysop"><img src="https://avatars.githubusercontent.com/u/9998303?v=4?s=100" width="100px;" alt=""/><br /><sub><b>bsysop</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bsysop" title="Documentation">📖</a></td> | |
195 | <td align="center"><a href="http://bpsizemore.me"><img src="https://avatars.githubusercontent.com/u/11645898?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brian Sizemore</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bpsizemore" title="Code">💻</a></td> | |
196 | <td align="center"><a href="https://pwn.by/noraj"><img src="https://avatars.githubusercontent.com/u/16578570?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexandre ZANNI</b></sub></a><br /><a href="#infra-noraj" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=noraj" title="Documentation">📖</a></td> | |
197 | <td align="center"><a href="https://github.com/craig"><img src="https://avatars.githubusercontent.com/u/99729?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Craig</b></sub></a><br /><a href="#infra-craig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
198 | <td align="center"><a href="https://www.reddit.com/u/EONRaider"><img src="https://avatars.githubusercontent.com/u/15611424?v=4?s=100" width="100px;" alt=""/><br /><sub><b>EONRaider</b></sub></a><br /><a href="#infra-EONRaider" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
199 | <td align="center"><a href="https://github.com/wtwver"><img src="https://avatars.githubusercontent.com/u/53866088?v=4?s=100" width="100px;" alt=""/><br /><sub><b>wtwver</b></sub></a><br /><a href="#infra-wtwver" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
200 | </tr> | |
201 | <tr> | |
202 | <td align="center"><a href="https://tib3rius.com"><img src="https://avatars.githubusercontent.com/u/48113936?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tib3rius</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ATib3rius" title="Bug reports">🐛</a></td> | |
203 | <td align="center"><a href="https://github.com/0xdf"><img src="https://avatars.githubusercontent.com/u/1489045?v=4?s=100" width="100px;" alt=""/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf" title="Bug reports">🐛</a></td> | |
204 | <td align="center"><a href="http://secure77.de"><img src="https://avatars.githubusercontent.com/u/31564517?v=4?s=100" width="100px;" alt=""/><br /><sub><b>secure-77</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asecure-77" title="Bug reports">🐛</a></td> | |
205 | <td align="center"><a href="https://github.com/sbrun"><img src="https://avatars.githubusercontent.com/u/7712154?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sophie Brun</b></sub></a><br /><a href="#infra-sbrun" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
206 | <td align="center"><a href="https://github.com/black-A"><img src="https://avatars.githubusercontent.com/u/30686803?v=4?s=100" width="100px;" alt=""/><br /><sub><b>black-A</b></sub></a><br /><a href="#ideas-black-A" title="Ideas, Planning, & Feedback">🤔</a></td> | |
207 | <td align="center"><a href="https://github.com/dinosn"><img src="https://avatars.githubusercontent.com/u/3851678?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nicolas Krassas</b></sub></a><br /><a href="#ideas-dinosn" title="Ideas, Planning, & Feedback">🤔</a></td> | |
208 | <td align="center"><a href="https://github.com/N0ur5"><img src="https://avatars.githubusercontent.com/u/24260009?v=4?s=100" width="100px;" alt=""/><br /><sub><b>N0ur5</b></sub></a><br /><a href="#ideas-N0ur5" title="Ideas, Planning, & Feedback">🤔</a></td> | |
209 | </tr> | |
210 | <tr> | |
211 | <td align="center"><a href="https://github.com/moscowchill"><img src="https://avatars.githubusercontent.com/u/72578879?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mchill</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Amoscowchill" title="Bug reports">🐛</a></td> | |
212 | <td align="center"><a href="http://BitThr3at.github.io"><img src="https://avatars.githubusercontent.com/u/45028933?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Naman</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ABitThr3at" title="Bug reports">🐛</a></td> | |
213 | <td align="center"><a href="https://github.com/Sicks3c"><img src="https://avatars.githubusercontent.com/u/32225186?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ayoub Elaich</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asicks3c" title="Bug reports">🐛</a></td> | |
214 | <td align="center"><a href="https://github.com/HenryHoggard"><img src="https://avatars.githubusercontent.com/u/1208121?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Henry</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AHenryHoggard" title="Bug reports">🐛</a></td> | |
215 | <td align="center"><a href="https://github.com/SleepiPanda"><img src="https://avatars.githubusercontent.com/u/6428561?v=4?s=100" width="100px;" alt=""/><br /><sub><b>SleepiPanda</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ASleepiPanda" title="Bug reports">🐛</a></td> | |
216 | <td align="center"><a href="https://github.com/uBadRequest"><img src="https://avatars.githubusercontent.com/u/47282747?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bad Requests</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AuBadRequest" title="Bug reports">🐛</a></td> | |
217 | <td align="center"><a href="https://home.dnaka91.rocks"><img src="https://avatars.githubusercontent.com/u/36804488?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominik Nakamura</b></sub></a><br /><a href="#infra-dnaka91" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
218 | </tr> | |
219 | <tr> | |
220 | <td align="center"><a href="https://github.com/hunter0x8"><img src="https://avatars.githubusercontent.com/u/46222314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Muhammad Ahsan</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ahunter0x8" title="Bug reports">🐛</a></td> | |
221 | <td align="center"><a href="https://github.com/cortantief"><img src="https://avatars.githubusercontent.com/u/34527333?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cortantief</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Acortantief" title="Bug reports">🐛</a> <a href="https://github.com/epi052/feroxbuster/commits?author=cortantief" title="Code">💻</a></td> | |
222 | <td align="center"><a href="https://github.com/dsaxton"><img src="https://avatars.githubusercontent.com/u/2658661?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Saxton</b></sub></a><br /><a href="#ideas-dsaxton" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=dsaxton" title="Code">💻</a></td> | |
223 | <td align="center"><a href="https://github.com/narkopolo"><img src="https://avatars.githubusercontent.com/u/16690056?v=4?s=100" width="100px;" alt=""/><br /><sub><b>narkopolo</b></sub></a><br /><a href="#ideas-narkopolo" title="Ideas, Planning, & Feedback">🤔</a></td> | |
224 | <td align="center"><a href="https://ring0.lol"><img src="https://avatars.githubusercontent.com/u/1893909?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Justin Steven</b></sub></a><br /><a href="#ideas-justinsteven" title="Ideas, Planning, & Feedback">🤔</a></td> | |
225 | <td align="center"><a href="https://github.com/7047payloads"><img src="https://avatars.githubusercontent.com/u/95562424?v=4?s=100" width="100px;" alt=""/><br /><sub><b>7047payloads</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=7047payloads" title="Code">💻</a></td> | |
226 | <td align="center"><a href="https://github.com/unkn0wnsyst3m"><img src="https://avatars.githubusercontent.com/u/21272239?v=4?s=100" width="100px;" alt=""/><br /><sub><b>unkn0wnsyst3m</b></sub></a><br /><a href="#ideas-unkn0wnsyst3m" title="Ideas, Planning, & Feedback">🤔</a></td> | |
227 | </tr> | |
228 | <tr> | |
229 | <td align="center"><a href="https://ironwort.me/"><img src="https://avatars.githubusercontent.com/u/15280042?v=4?s=100" width="100px;" alt=""/><br /><sub><b>0x08</b></sub></a><br /><a href="#ideas-its0x08" title="Ideas, Planning, & Feedback">🤔</a></td> | |
230 | <td align="center"><a href="https://github.com/MD-Levitan"><img src="https://avatars.githubusercontent.com/u/12116508?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kusok</b></sub></a><br /><a href="#ideas-MD-Levitan" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=MD-Levitan" title="Code">💻</a></td> | |
231 | <td align="center"><a href="https://github.com/godylockz"><img src="https://avatars.githubusercontent.com/u/81207744?v=4?s=100" width="100px;" alt=""/><br /><sub><b>godylockz</b></sub></a><br /><a href="#ideas-godylockz" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=godylockz" title="Code">💻</a></td> | |
232 | <td align="center"><a href="http://ryanmontgomery.me"><img src="https://avatars.githubusercontent.com/u/44453666?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ryan Montgomery</b></sub></a><br /><a href="#ideas-0dayCTF" title="Ideas, Planning, & Feedback">🤔</a></td> | |
233 | <td align="center"><a href="https://github.com/IppSec"><img src="https://avatars.githubusercontent.com/u/24677271?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ippsec</b></sub></a><br /><a href="#ideas-ippsec" title="Ideas, Planning, & Feedback">🤔</a></td> | |
234 | <td align="center"><a href="https://github.com/gtjamesa"><img src="https://avatars.githubusercontent.com/u/2078364?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Agtjamesa" title="Bug reports">🐛</a></td> | |
235 | <td align="center"><a href="https://twitter.com/Jhaddix"><img src="https://avatars.githubusercontent.com/u/3488554?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jason Haddix</b></sub></a><br /><a href="#ideas-jhaddix" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ajhaddix" title="Bug reports">🐛</a></td> | |
236 | </tr> | |
237 | <tr> | |
238 | <td align="center"><a href="https://github.com/ThisLimn0"><img src="https://avatars.githubusercontent.com/u/67125885?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Limn0</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AThisLimn0" title="Bug reports">🐛</a></td> | |
239 | <td align="center"><a href="https://github.com/0xdf223"><img src="https://avatars.githubusercontent.com/u/76954092?v=4?s=100" width="100px;" alt=""/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf223" title="Bug reports">🐛</a> <a href="#ideas-0xdf223" title="Ideas, Planning, & Feedback">🤔</a></td> | |
240 | <td align="center"><a href="https://github.com/Flangyver"><img src="https://avatars.githubusercontent.com/u/59575870?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Flangyver</b></sub></a><br /><a href="#ideas-Flangyver" title="Ideas, Planning, & Feedback">🤔</a></td> | |
241 | <td align="center"><a href="https://github.com/DonatoReis"><img src="https://avatars.githubusercontent.com/u/93531354?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PeakyBlinder</b></sub></a><br /><a href="#ideas-DonatoReis" title="Ideas, Planning, & Feedback">🤔</a></td> | |
242 | <td align="center"><a href="https://postmodern.github.io/"><img src="https://avatars.githubusercontent.com/u/12671?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Postmodern</b></sub></a><br /><a href="#ideas-postmodern" title="Ideas, Planning, & Feedback">🤔</a></td> | |
243 | </tr> | |
183 | <tbody> | |
184 | <tr> | |
185 | <td align="center"><a href="https://io.fi"><img src="https://avatars.githubusercontent.com/u/5235109?v=4?s=100" width="100px;" alt="Joona Hoikkala"/><br /><sub><b>Joona Hoikkala</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=joohoi" title="Documentation">📖</a></td> | |
186 | <td align="center"><a href="https://github.com/jsav0"><img src="https://avatars.githubusercontent.com/u/20546041?v=4?s=100" width="100px;" alt="J Savage"/><br /><sub><b>J Savage</b></sub></a><br /><a href="#infra-jsav0" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=jsav0" title="Documentation">📖</a></td> | |
187 | <td align="center"><a href="http://www.tgotwig.dev"><img src="https://avatars.githubusercontent.com/u/30773779?v=4?s=100" width="100px;" alt="Thomas Gotwig"/><br /><sub><b>Thomas Gotwig</b></sub></a><br /><a href="#infra-TGotwig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=TGotwig" title="Documentation">📖</a></td> | |
188 | <td align="center"><a href="https://github.com/spikecodes"><img src="https://avatars.githubusercontent.com/u/19519553?v=4?s=100" width="100px;" alt="Spike"/><br /><sub><b>Spike</b></sub></a><br /><a href="#infra-spikecodes" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=spikecodes" title="Documentation">📖</a></td> | |
189 | <td align="center"><a href="https://github.com/evanrichter"><img src="https://avatars.githubusercontent.com/u/330292?v=4?s=100" width="100px;" alt="Evan Richter"/><br /><sub><b>Evan Richter</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Documentation">📖</a></td> | |
190 | <td align="center"><a href="https://github.com/mzpqnxow"><img src="https://avatars.githubusercontent.com/u/8016228?v=4?s=100" width="100px;" alt="AG"/><br /><sub><b>AG</b></sub></a><br /><a href="#ideas-mzpqnxow" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=mzpqnxow" title="Documentation">📖</a></td> | |
191 | <td align="center"><a href="https://n-thumann.de/"><img src="https://avatars.githubusercontent.com/u/46975855?v=4?s=100" width="100px;" alt="Nicolas Thumann"/><br /><sub><b>Nicolas Thumann</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Documentation">📖</a></td> | |
192 | </tr> | |
193 | <tr> | |
194 | <td align="center"><a href="https://github.com/tomtastic"><img src="https://avatars.githubusercontent.com/u/302127?v=4?s=100" width="100px;" alt="Tom Matthews"/><br /><sub><b>Tom Matthews</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=tomtastic" title="Documentation">📖</a></td> | |
195 | <td align="center"><a href="https://github.com/bsysop"><img src="https://avatars.githubusercontent.com/u/9998303?v=4?s=100" width="100px;" alt="bsysop"/><br /><sub><b>bsysop</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bsysop" title="Documentation">📖</a></td> | |
196 | <td align="center"><a href="http://bpsizemore.me"><img src="https://avatars.githubusercontent.com/u/11645898?v=4?s=100" width="100px;" alt="Brian Sizemore"/><br /><sub><b>Brian Sizemore</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bpsizemore" title="Code">💻</a></td> | |
197 | <td align="center"><a href="https://pwn.by/noraj"><img src="https://avatars.githubusercontent.com/u/16578570?v=4?s=100" width="100px;" alt="Alexandre ZANNI"/><br /><sub><b>Alexandre ZANNI</b></sub></a><br /><a href="#infra-noraj" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=noraj" title="Documentation">📖</a></td> | |
198 | <td align="center"><a href="https://github.com/craig"><img src="https://avatars.githubusercontent.com/u/99729?v=4?s=100" width="100px;" alt="Craig"/><br /><sub><b>Craig</b></sub></a><br /><a href="#infra-craig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
199 | <td align="center"><a href="https://www.reddit.com/u/EONRaider"><img src="https://avatars.githubusercontent.com/u/15611424?v=4?s=100" width="100px;" alt="EONRaider"/><br /><sub><b>EONRaider</b></sub></a><br /><a href="#infra-EONRaider" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
200 | <td align="center"><a href="https://github.com/wtwver"><img src="https://avatars.githubusercontent.com/u/53866088?v=4?s=100" width="100px;" alt="wtwver"/><br /><sub><b>wtwver</b></sub></a><br /><a href="#infra-wtwver" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
201 | </tr> | |
202 | <tr> | |
203 | <td align="center"><a href="https://tib3rius.com"><img src="https://avatars.githubusercontent.com/u/48113936?v=4?s=100" width="100px;" alt="Tib3rius"/><br /><sub><b>Tib3rius</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ATib3rius" title="Bug reports">🐛</a></td> | |
204 | <td align="center"><a href="https://github.com/0xdf"><img src="https://avatars.githubusercontent.com/u/1489045?v=4?s=100" width="100px;" alt="0xdf"/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf" title="Bug reports">🐛</a></td> | |
205 | <td align="center"><a href="http://secure77.de"><img src="https://avatars.githubusercontent.com/u/31564517?v=4?s=100" width="100px;" alt="secure-77"/><br /><sub><b>secure-77</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asecure-77" title="Bug reports">🐛</a></td> | |
206 | <td align="center"><a href="https://github.com/sbrun"><img src="https://avatars.githubusercontent.com/u/7712154?v=4?s=100" width="100px;" alt="Sophie Brun"/><br /><sub><b>Sophie Brun</b></sub></a><br /><a href="#infra-sbrun" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
207 | <td align="center"><a href="https://github.com/black-A"><img src="https://avatars.githubusercontent.com/u/30686803?v=4?s=100" width="100px;" alt="black-A"/><br /><sub><b>black-A</b></sub></a><br /><a href="#ideas-black-A" title="Ideas, Planning, & Feedback">🤔</a></td> | |
208 | <td align="center"><a href="https://github.com/dinosn"><img src="https://avatars.githubusercontent.com/u/3851678?v=4?s=100" width="100px;" alt="Nicolas Krassas"/><br /><sub><b>Nicolas Krassas</b></sub></a><br /><a href="#ideas-dinosn" title="Ideas, Planning, & Feedback">🤔</a></td> | |
209 | <td align="center"><a href="https://github.com/N0ur5"><img src="https://avatars.githubusercontent.com/u/24260009?v=4?s=100" width="100px;" alt="N0ur5"/><br /><sub><b>N0ur5</b></sub></a><br /><a href="#ideas-N0ur5" title="Ideas, Planning, & Feedback">🤔</a></td> | |
210 | </tr> | |
211 | <tr> | |
212 | <td align="center"><a href="https://github.com/moscowchill"><img src="https://avatars.githubusercontent.com/u/72578879?v=4?s=100" width="100px;" alt="mchill"/><br /><sub><b>mchill</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Amoscowchill" title="Bug reports">🐛</a></td> | |
213 | <td align="center"><a href="http://BitThr3at.github.io"><img src="https://avatars.githubusercontent.com/u/45028933?v=4?s=100" width="100px;" alt="Naman"/><br /><sub><b>Naman</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ABitThr3at" title="Bug reports">🐛</a></td> | |
214 | <td align="center"><a href="https://github.com/Sicks3c"><img src="https://avatars.githubusercontent.com/u/32225186?v=4?s=100" width="100px;" alt="Ayoub Elaich"/><br /><sub><b>Ayoub Elaich</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asicks3c" title="Bug reports">🐛</a></td> | |
215 | <td align="center"><a href="https://github.com/HenryHoggard"><img src="https://avatars.githubusercontent.com/u/1208121?v=4?s=100" width="100px;" alt="Henry"/><br /><sub><b>Henry</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AHenryHoggard" title="Bug reports">🐛</a></td> | |
216 | <td align="center"><a href="https://github.com/SleepiPanda"><img src="https://avatars.githubusercontent.com/u/6428561?v=4?s=100" width="100px;" alt="SleepiPanda"/><br /><sub><b>SleepiPanda</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ASleepiPanda" title="Bug reports">🐛</a></td> | |
217 | <td align="center"><a href="https://github.com/uBadRequest"><img src="https://avatars.githubusercontent.com/u/47282747?v=4?s=100" width="100px;" alt="Bad Requests"/><br /><sub><b>Bad Requests</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AuBadRequest" title="Bug reports">🐛</a></td> | |
218 | <td align="center"><a href="https://home.dnaka91.rocks"><img src="https://avatars.githubusercontent.com/u/36804488?v=4?s=100" width="100px;" alt="Dominik Nakamura"/><br /><sub><b>Dominik Nakamura</b></sub></a><br /><a href="#infra-dnaka91" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> | |
219 | </tr> | |
220 | <tr> | |
221 | <td align="center"><a href="https://github.com/hunter0x8"><img src="https://avatars.githubusercontent.com/u/46222314?v=4?s=100" width="100px;" alt="Muhammad Ahsan"/><br /><sub><b>Muhammad Ahsan</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ahunter0x8" title="Bug reports">🐛</a></td> | |
222 | <td align="center"><a href="https://github.com/cortantief"><img src="https://avatars.githubusercontent.com/u/34527333?v=4?s=100" width="100px;" alt="cortantief"/><br /><sub><b>cortantief</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Acortantief" title="Bug reports">🐛</a> <a href="https://github.com/epi052/feroxbuster/commits?author=cortantief" title="Code">💻</a></td> | |
223 | <td align="center"><a href="https://github.com/dsaxton"><img src="https://avatars.githubusercontent.com/u/2658661?v=4?s=100" width="100px;" alt="Daniel Saxton"/><br /><sub><b>Daniel Saxton</b></sub></a><br /><a href="#ideas-dsaxton" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=dsaxton" title="Code">💻</a></td> | |
224 | <td align="center"><a href="https://github.com/narkopolo"><img src="https://avatars.githubusercontent.com/u/16690056?v=4?s=100" width="100px;" alt="narkopolo"/><br /><sub><b>narkopolo</b></sub></a><br /><a href="#ideas-narkopolo" title="Ideas, Planning, & Feedback">🤔</a></td> | |
225 | <td align="center"><a href="https://ring0.lol"><img src="https://avatars.githubusercontent.com/u/1893909?v=4?s=100" width="100px;" alt="Justin Steven"/><br /><sub><b>Justin Steven</b></sub></a><br /><a href="#ideas-justinsteven" title="Ideas, Planning, & Feedback">🤔</a></td> | |
226 | <td align="center"><a href="https://github.com/7047payloads"><img src="https://avatars.githubusercontent.com/u/95562424?v=4?s=100" width="100px;" alt="7047payloads"/><br /><sub><b>7047payloads</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=7047payloads" title="Code">💻</a></td> | |
227 | <td align="center"><a href="https://github.com/unkn0wnsyst3m"><img src="https://avatars.githubusercontent.com/u/21272239?v=4?s=100" width="100px;" alt="unkn0wnsyst3m"/><br /><sub><b>unkn0wnsyst3m</b></sub></a><br /><a href="#ideas-unkn0wnsyst3m" title="Ideas, Planning, & Feedback">🤔</a></td> | |
228 | </tr> | |
229 | <tr> | |
230 | <td align="center"><a href="https://ironwort.me/"><img src="https://avatars.githubusercontent.com/u/15280042?v=4?s=100" width="100px;" alt="0x08"/><br /><sub><b>0x08</b></sub></a><br /><a href="#ideas-its0x08" title="Ideas, Planning, & Feedback">🤔</a></td> | |
231 | <td align="center"><a href="https://github.com/MD-Levitan"><img src="https://avatars.githubusercontent.com/u/12116508?v=4?s=100" width="100px;" alt="kusok"/><br /><sub><b>kusok</b></sub></a><br /><a href="#ideas-MD-Levitan" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=MD-Levitan" title="Code">💻</a></td> | |
232 | <td align="center"><a href="https://github.com/godylockz"><img src="https://avatars.githubusercontent.com/u/81207744?v=4?s=100" width="100px;" alt="godylockz"/><br /><sub><b>godylockz</b></sub></a><br /><a href="#ideas-godylockz" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=godylockz" title="Code">💻</a></td> | |
233 | <td align="center"><a href="http://ryanmontgomery.me"><img src="https://avatars.githubusercontent.com/u/44453666?v=4?s=100" width="100px;" alt="Ryan Montgomery"/><br /><sub><b>Ryan Montgomery</b></sub></a><br /><a href="#ideas-0dayCTF" title="Ideas, Planning, & Feedback">🤔</a></td> | |
234 | <td align="center"><a href="https://github.com/IppSec"><img src="https://avatars.githubusercontent.com/u/24677271?v=4?s=100" width="100px;" alt="ippsec"/><br /><sub><b>ippsec</b></sub></a><br /><a href="#ideas-ippsec" title="Ideas, Planning, & Feedback">🤔</a></td> | |
235 | <td align="center"><a href="https://github.com/gtjamesa"><img src="https://avatars.githubusercontent.com/u/2078364?v=4?s=100" width="100px;" alt="James"/><br /><sub><b>James</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Agtjamesa" title="Bug reports">🐛</a></td> | |
236 | <td align="center"><a href="https://twitter.com/Jhaddix"><img src="https://avatars.githubusercontent.com/u/3488554?v=4?s=100" width="100px;" alt="Jason Haddix"/><br /><sub><b>Jason Haddix</b></sub></a><br /><a href="#ideas-jhaddix" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ajhaddix" title="Bug reports">🐛</a></td> | |
237 | </tr> | |
238 | <tr> | |
239 | <td align="center"><a href="https://github.com/ThisLimn0"><img src="https://avatars.githubusercontent.com/u/67125885?v=4?s=100" width="100px;" alt="Limn0"/><br /><sub><b>Limn0</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AThisLimn0" title="Bug reports">🐛</a></td> | |
240 | <td align="center"><a href="https://github.com/0xdf223"><img src="https://avatars.githubusercontent.com/u/76954092?v=4?s=100" width="100px;" alt="0xdf"/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf223" title="Bug reports">🐛</a> <a href="#ideas-0xdf223" title="Ideas, Planning, & Feedback">🤔</a></td> | |
241 | <td align="center"><a href="https://github.com/Flangyver"><img src="https://avatars.githubusercontent.com/u/59575870?v=4?s=100" width="100px;" alt="Flangyver"/><br /><sub><b>Flangyver</b></sub></a><br /><a href="#ideas-Flangyver" title="Ideas, Planning, & Feedback">🤔</a></td> | |
242 | <td align="center"><a href="https://github.com/DonatoReis"><img src="https://avatars.githubusercontent.com/u/93531354?v=4?s=100" width="100px;" alt="PeakyBlinder"/><br /><sub><b>PeakyBlinder</b></sub></a><br /><a href="#ideas-DonatoReis" title="Ideas, Planning, & Feedback">🤔</a></td> | |
243 | <td align="center"><a href="https://postmodern.github.io/"><img src="https://avatars.githubusercontent.com/u/12671?v=4?s=100" width="100px;" alt="Postmodern"/><br /><sub><b>Postmodern</b></sub></a><br /><a href="#ideas-postmodern" title="Ideas, Planning, & Feedback">🤔</a></td> | |
244 | <td align="center"><a href="https://github.com/herrcykel"><img src="https://avatars.githubusercontent.com/u/1936757?v=4?s=100" width="100px;" alt="O"/><br /><sub><b>O</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=herrcykel" title="Code">💻</a></td> | |
245 | <td align="center"><a href="http://udoprog.github.io/"><img src="https://avatars.githubusercontent.com/u/111092?v=4?s=100" width="100px;" alt="John-John Tedro"/><br /><sub><b>John-John Tedro</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=udoprog" title="Code">💻</a></td> | |
246 | </tr> | |
247 | </tbody> | |
244 | 248 | </table> |
245 | 249 | |
246 | 250 | <!-- markdownlint-restore --> |
58 | 58 | if !config_dir.exists() { |
59 | 59 | // recursively create the feroxbuster directory and all of its parent components if |
60 | 60 | // they are missing |
61 | if !config_dir.exists() { | |
62 | // recursively create the feroxbuster directory and all of its parent components if | |
63 | // they are missing | |
64 | if create_dir_all(&config_dir).is_err() { | |
65 | // only copy the config file when we're not running in the CI/CD pipeline | |
66 | // which fails with permission denied | |
67 | eprintln!("Couldn't create one or more directories needed to copy the config file"); | |
68 | return; | |
69 | } | |
61 | if create_dir_all(&config_dir).is_err() { | |
62 | // only copy the config file when we're not running in the CI/CD pipeline | |
63 | // which fails with permission denied | |
64 | eprintln!("Couldn't create one or more directories needed to copy the config file"); | |
65 | return; | |
70 | 66 | } |
71 | 67 | } |
72 | 68 |
68 | 68 | '-o+[Output file to write results to (use w/ --json for JSON entries)]:FILE:_files' \ |
69 | 69 | '--output=[Output file to write results to (use w/ --json for JSON entries)]:FILE:_files' \ |
70 | 70 | '--debug-log=[Output file to write log entries (use w/ --json for JSON entries)]:FILE:_files' \ |
71 | '-h[Print help information]' \ | |
72 | '--help[Print help information]' \ | |
73 | '-V[Print version information]' \ | |
74 | '--version[Print version information]' \ | |
75 | 71 | '(-u --url)--stdin[Read url(s) from STDIN]' \ |
76 | 72 | '(-p --proxy -k --insecure --burp-replay)--burp[Set --proxy to http://127.0.0.1:8080 and set --insecure to true]' \ |
77 | 73 | '(-P --replay-proxy -k --insecure)--burp-replay[Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true]' \ |
107 | 103 | '--quiet[Hide progress bars and banner (good for tmux windows w/ notifications)]' \ |
108 | 104 | '--json[Emit JSON logs to --output and --debug-log instead of normal text]' \ |
109 | 105 | '--no-state[Disable state output file (*.state)]' \ |
106 | '-h[Print help information (use `--help` for more detail)]' \ | |
107 | '--help[Print help information (use `--help` for more detail)]' \ | |
108 | '-V[Print version information]' \ | |
109 | '--version[Print version information]' \ | |
110 | 110 | && ret=0 |
111 | 111 | } |
112 | 112 |
74 | 74 | [CompletionResult]::new('-o', 'o', [CompletionResultType]::ParameterName, 'Output file to write results to (use w/ --json for JSON entries)') |
75 | 75 | [CompletionResult]::new('--output', 'output', [CompletionResultType]::ParameterName, 'Output file to write results to (use w/ --json for JSON entries)') |
76 | 76 | [CompletionResult]::new('--debug-log', 'debug-log', [CompletionResultType]::ParameterName, 'Output file to write log entries (use w/ --json for JSON entries)') |
77 | [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') | |
78 | [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') | |
79 | [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Print version information') | |
80 | [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version information') | |
81 | 77 | [CompletionResult]::new('--stdin', 'stdin', [CompletionResultType]::ParameterName, 'Read url(s) from STDIN') |
82 | 78 | [CompletionResult]::new('--burp', 'burp', [CompletionResultType]::ParameterName, 'Set --proxy to http://127.0.0.1:8080 and set --insecure to true') |
83 | 79 | [CompletionResult]::new('--burp-replay', 'burp-replay', [CompletionResultType]::ParameterName, 'Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true') |
113 | 109 | [CompletionResult]::new('--quiet', 'quiet', [CompletionResultType]::ParameterName, 'Hide progress bars and banner (good for tmux windows w/ notifications)') |
114 | 110 | [CompletionResult]::new('--json', 'json', [CompletionResultType]::ParameterName, 'Emit JSON logs to --output and --debug-log instead of normal text') |
115 | 111 | [CompletionResult]::new('--no-state', 'no-state', [CompletionResultType]::ParameterName, 'Disable state output file (*.state)') |
112 | [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information (use `--help` for more detail)') | |
113 | [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information (use `--help` for more detail)') | |
114 | [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Print version information') | |
115 | [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version information') | |
116 | 116 | break |
117 | 117 | } |
118 | 118 | }) |
7 | 7 | |
8 | 8 | for i in ${COMP_WORDS[@]} |
9 | 9 | do |
10 | case "${i}" in | |
11 | "$1") | |
10 | case "${cmd},${i}" in | |
11 | ",$1") | |
12 | 12 | cmd="feroxbuster" |
13 | 13 | ;; |
14 | 14 | *) |
18 | 18 | |
19 | 19 | case "${cmd}" in |
20 | 20 | feroxbuster) |
21 | opts="-h -V -u -p -P -R -a -A -x -m -H -b -Q -f -S -X -W -N -C -s -T -r -k -t -n -d -e -L -w -D -E -B -g -I -v -q -o --help --version --url --stdin --resume-from --burp --burp-replay --smart --thorough --proxy --replay-proxy --replay-codes --user-agent --random-agent --extensions --methods --data --headers --cookies --query --add-slash --dont-scan --filter-size --filter-regex --filter-words --filter-lines --filter-status --filter-similar-to --status-codes --timeout --redirects --insecure --threads --no-recursion --depth --force-recursion --extract-links --scan-limit --parallel --rate-limit --time-limit --wordlist --auto-tune --auto-bail --dont-filter --collect-extensions --collect-backups --collect-words --dont-collect --verbosity --silent --quiet --json --output --debug-log --no-state" | |
21 | opts="-u -p -P -R -a -A -x -m -H -b -Q -f -S -X -W -N -C -s -T -r -k -t -n -d -e -L -w -D -E -B -g -I -v -q -o -h -V --url --stdin --resume-from --burp --burp-replay --smart --thorough --proxy --replay-proxy --replay-codes --user-agent --random-agent --extensions --methods --data --headers --cookies --query --add-slash --dont-scan --filter-size --filter-regex --filter-words --filter-lines --filter-status --filter-similar-to --status-codes --timeout --redirects --insecure --threads --no-recursion --depth --force-recursion --extract-links --scan-limit --parallel --rate-limit --time-limit --wordlist --auto-tune --auto-bail --dont-filter --collect-extensions --collect-backups --collect-words --dont-collect --verbosity --silent --quiet --json --output --debug-log --no-state --help --version" | |
22 | 22 | if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then |
23 | 23 | COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) |
24 | 24 | return 0 |
71 | 71 | cand -o 'Output file to write results to (use w/ --json for JSON entries)' |
72 | 72 | cand --output 'Output file to write results to (use w/ --json for JSON entries)' |
73 | 73 | cand --debug-log 'Output file to write log entries (use w/ --json for JSON entries)' |
74 | cand -h 'Print help information' | |
75 | cand --help 'Print help information' | |
76 | cand -V 'Print version information' | |
77 | cand --version 'Print version information' | |
78 | 74 | cand --stdin 'Read url(s) from STDIN' |
79 | 75 | cand --burp 'Set --proxy to http://127.0.0.1:8080 and set --insecure to true' |
80 | 76 | cand --burp-replay 'Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true' |
110 | 106 | cand --quiet 'Hide progress bars and banner (good for tmux windows w/ notifications)' |
111 | 107 | cand --json 'Emit JSON logs to --output and --debug-log instead of normal text' |
112 | 108 | cand --no-state 'Disable state output file (*.state)' |
109 | cand -h 'Print help information (use `--help` for more detail)' | |
110 | cand --help 'Print help information (use `--help` for more detail)' | |
111 | cand -V 'Print version information' | |
112 | cand --version 'Print version information' | |
113 | 113 | } |
114 | 114 | ] |
115 | 115 | $completions[$command] |
8 | 8 | DEFAULT_CONFIG_NAME, |
9 | 9 | }; |
10 | 10 | use anyhow::{anyhow, Context, Result}; |
11 | use clap::ArgMatches; | |
11 | use clap::{parser::ValueSource, ArgMatches}; | |
12 | 12 | use regex::Regex; |
13 | 13 | use reqwest::{Client, Method, StatusCode, Url}; |
14 | 14 | use serde::{Deserialize, Serialize}; |
21 | 21 | |
22 | 22 | /// macro helper to abstract away repetitive configuration updates |
23 | 23 | macro_rules! update_config_if_present { |
24 | ($conf_val:expr, $matches:ident, $arg_name:expr) => { | |
25 | match $matches.value_of_t($arg_name) { | |
26 | Ok(value) => *$conf_val = value, // Update value | |
27 | Err(err) => { | |
28 | if !matches!(err.kind(), clap::ErrorKind::ArgumentNotFound) { | |
29 | // Do nothing if argument not found | |
30 | err.exit() // Exit with error on any other parse error | |
31 | } | |
32 | } | |
24 | ($conf_val:expr, $matches:ident, $arg_name:expr, $arg_type:ty) => { | |
25 | match $matches.get_one::<$arg_type>($arg_name) { | |
26 | Some(value) => *$conf_val = value.to_owned(), // Update value | |
27 | None => {} | |
33 | 28 | } |
34 | 29 | }; |
35 | 30 | } |
39 | 34 | ($old:expr, $new:expr, $default:expr) => { |
40 | 35 | if $new != $default { |
41 | 36 | *$old = $new; |
37 | } | |
38 | }; | |
39 | } | |
40 | ||
41 | /// macro helper to abstract away repetitive checks to see if the user has specified a value | |
42 | /// for a given argument from the commandline or if we just had a default value in the parser | |
43 | macro_rules! came_from_cli { | |
44 | ($matches:ident, $arg_name:expr) => { | |
45 | matches!( | |
46 | $matches.value_source($arg_name), | |
47 | Some(ValueSource::CommandLine) | |
48 | ) | |
49 | }; | |
50 | } | |
51 | ||
52 | /// macro helper to abstract away repetitive if not default: update checks, specifically for | |
53 | /// values that are number types, i.e. usize, u64, etc | |
54 | macro_rules! update_config_with_num_type_if_present { | |
55 | ($conf_val:expr, $matches:ident, $arg_name:expr, $arg_type:ty) => { | |
56 | if let Some(val) = $matches.get_one::<String>($arg_name) { | |
57 | match val.parse::<$arg_type>() { | |
58 | Ok(v) => *$conf_val = v, | |
59 | Err(_) => { | |
60 | report_and_exit(&format!( | |
61 | "Invalid value for --{}, must be a positive integer", | |
62 | $arg_name | |
63 | )); | |
64 | } | |
65 | } | |
42 | 66 | } |
43 | 67 | }; |
44 | 68 | } |
459 | 483 | |
460 | 484 | // --resume-from used, need to first read the Configuration from disk, and then |
461 | 485 | // merge the cli_config into the resumed config |
462 | if let Some(filename) = args.value_of("resume_from") { | |
486 | if let Some(filename) = args.get_one::<String>("resume_from") { | |
463 | 487 | // when resuming a scan, instead of normal configuration loading, we just |
464 | 488 | // load the config from disk by calling resume_scan |
465 | 489 | let mut previous_config = resume_scan(filename); |
545 | 569 | fn parse_cli_args(args: &ArgMatches) -> Self { |
546 | 570 | let mut config = Configuration::default(); |
547 | 571 | |
548 | update_config_if_present!(&mut config.threads, args, "threads"); | |
549 | update_config_if_present!(&mut config.depth, args, "depth"); | |
550 | update_config_if_present!(&mut config.scan_limit, args, "scan_limit"); | |
551 | update_config_if_present!(&mut config.parallel, args, "parallel"); | |
552 | update_config_if_present!(&mut config.rate_limit, args, "rate_limit"); | |
553 | update_config_if_present!(&mut config.wordlist, args, "wordlist"); | |
554 | update_config_if_present!(&mut config.output, args, "output"); | |
555 | update_config_if_present!(&mut config.debug_log, args, "debug_log"); | |
556 | update_config_if_present!(&mut config.time_limit, args, "time_limit"); | |
557 | update_config_if_present!(&mut config.resume_from, args, "resume_from"); | |
558 | ||
559 | if let Some(arg) = args.values_of("status_codes") { | |
572 | update_config_with_num_type_if_present!(&mut config.threads, args, "threads", usize); | |
573 | update_config_with_num_type_if_present!(&mut config.parallel, args, "parallel", usize); | |
574 | update_config_with_num_type_if_present!(&mut config.depth, args, "depth", usize); | |
575 | update_config_with_num_type_if_present!(&mut config.scan_limit, args, "scan_limit", usize); | |
576 | update_config_with_num_type_if_present!(&mut config.rate_limit, args, "rate_limit", usize); | |
577 | update_config_if_present!(&mut config.wordlist, args, "wordlist", String); | |
578 | update_config_if_present!(&mut config.output, args, "output", String); | |
579 | update_config_if_present!(&mut config.debug_log, args, "debug_log", String); | |
580 | update_config_if_present!(&mut config.resume_from, args, "resume_from", String); | |
581 | ||
582 | if let Ok(Some(inner)) = args.try_get_one::<String>("time_limit") { | |
583 | config.time_limit = inner.to_owned(); | |
584 | } | |
585 | ||
586 | if let Some(arg) = args.get_many::<String>("status_codes") { | |
560 | 587 | config.status_codes = arg |
561 | 588 | .map(|code| { |
562 | 589 | StatusCode::from_bytes(code.as_bytes()) |
566 | 593 | .collect(); |
567 | 594 | } |
568 | 595 | |
569 | if let Some(arg) = args.values_of("replay_codes") { | |
596 | if let Some(arg) = args.get_many::<String>("replay_codes") { | |
570 | 597 | // replay codes passed in by the user |
571 | 598 | config.replay_codes = arg |
572 | 599 | .map(|code| { |
580 | 607 | config.replay_codes = config.status_codes.clone(); |
581 | 608 | } |
582 | 609 | |
583 | if let Some(arg) = args.values_of("filter_status") { | |
610 | if let Some(arg) = args.get_many::<String>("filter_status") { | |
584 | 611 | config.filter_status = arg |
585 | 612 | .map(|code| { |
586 | 613 | StatusCode::from_bytes(code.as_bytes()) |
590 | 617 | .collect(); |
591 | 618 | } |
592 | 619 | |
593 | if let Some(arg) = args.values_of("extensions") { | |
620 | if let Some(arg) = args.get_many::<String>("extensions") { | |
594 | 621 | config.extensions = arg |
595 | 622 | .map(|val| val.trim_start_matches('.').to_string()) |
596 | 623 | .collect(); |
597 | 624 | } |
598 | 625 | |
599 | if let Some(arg) = args.values_of("dont_collect") { | |
626 | if let Some(arg) = args.get_many::<String>("dont_collect") { | |
600 | 627 | config.dont_collect = arg.map(|val| val.to_string()).collect(); |
601 | 628 | } |
602 | 629 | |
603 | if let Some(arg) = args.values_of("methods") { | |
630 | if let Some(arg) = args.get_many::<String>("methods") { | |
604 | 631 | config.methods = arg |
605 | 632 | .map(|val| { |
606 | 633 | // Check methods if they are correct |
612 | 639 | .collect(); |
613 | 640 | } |
614 | 641 | |
615 | if let Some(arg) = args.value_of("data") { | |
642 | if let Some(arg) = args.get_one::<String>("data") { | |
616 | 643 | if let Some(stripped) = arg.strip_prefix('@') { |
617 | 644 | config.data = |
618 | 645 | std::fs::read(stripped).unwrap_or_else(|e| report_and_exit(&e.to_string())); |
621 | 648 | } |
622 | 649 | } |
623 | 650 | |
624 | if args.is_present("stdin") { | |
651 | if came_from_cli!(args, "stdin") { | |
625 | 652 | config.stdin = true; |
626 | } else if let Some(url) = args.value_of("url") { | |
627 | config.target_url = String::from(url); | |
628 | } | |
629 | ||
630 | if let Some(arg) = args.values_of("url_denylist") { | |
653 | } else if let Some(url) = args.get_one::<String>("url") { | |
654 | config.target_url = url.into(); | |
655 | } | |
656 | ||
657 | if let Some(arg) = args.get_many::<String>("url_denylist") { | |
631 | 658 | // compile all regular expressions and absolute urls used for --dont-scan |
632 | 659 | // |
633 | 660 | // when --dont-scan is used, the should_deny_url function is called at least once per |
671 | 698 | } |
672 | 699 | } |
673 | 700 | |
674 | if let Some(arg) = args.values_of("filter_regex") { | |
701 | if let Some(arg) = args.get_many::<String>("filter_regex") { | |
675 | 702 | config.filter_regex = arg.map(|val| val.to_string()).collect(); |
676 | 703 | } |
677 | 704 | |
678 | if let Some(arg) = args.values_of("filter_similar") { | |
705 | if let Some(arg) = args.get_many::<String>("filter_similar") { | |
679 | 706 | config.filter_similar = arg.map(|val| val.to_string()).collect(); |
680 | 707 | } |
681 | 708 | |
682 | if let Some(arg) = args.values_of("filter_size") { | |
709 | if let Some(arg) = args.get_many::<String>("filter_size") { | |
683 | 710 | config.filter_size = arg |
684 | 711 | .map(|size| { |
685 | 712 | size.parse::<u64>() |
688 | 715 | .collect(); |
689 | 716 | } |
690 | 717 | |
691 | if let Some(arg) = args.values_of("filter_words") { | |
718 | if let Some(arg) = args.get_many::<String>("filter_words") { | |
692 | 719 | config.filter_word_count = arg |
693 | 720 | .map(|size| { |
694 | 721 | size.parse::<usize>() |
697 | 724 | .collect(); |
698 | 725 | } |
699 | 726 | |
700 | if let Some(arg) = args.values_of("filter_lines") { | |
727 | if let Some(arg) = args.get_many::<String>("filter_lines") { | |
701 | 728 | config.filter_line_count = arg |
702 | 729 | .map(|size| { |
703 | 730 | size.parse::<usize>() |
706 | 733 | .collect(); |
707 | 734 | } |
708 | 735 | |
709 | if args.is_present("silent") { | |
736 | if came_from_cli!(args, "silent") { | |
710 | 737 | // the reason this is protected by an if statement: |
711 | 738 | // consider a user specifying silent = true in ferox-config.toml |
712 | 739 | // if the line below is outside of the if, we'd overwrite true with |
715 | 742 | config.output_level = OutputLevel::Silent; |
716 | 743 | } |
717 | 744 | |
718 | if args.is_present("quiet") { | |
745 | if came_from_cli!(args, "quiet") { | |
719 | 746 | config.quiet = true; |
720 | 747 | config.output_level = OutputLevel::Quiet; |
721 | 748 | } |
722 | 749 | |
723 | if args.is_present("auto_tune") || args.is_present("smart") || args.is_present("thorough") { | |
750 | if came_from_cli!(args, "auto_tune") | |
751 | || came_from_cli!(args, "smart") | |
752 | || came_from_cli!(args, "thorough") | |
753 | { | |
724 | 754 | config.auto_tune = true; |
725 | 755 | config.requester_policy = RequesterPolicy::AutoTune; |
726 | 756 | } |
727 | 757 | |
728 | if args.is_present("auto_bail") { | |
758 | if came_from_cli!(args, "auto_bail") { | |
729 | 759 | config.auto_bail = true; |
730 | 760 | config.requester_policy = RequesterPolicy::AutoBail; |
731 | 761 | } |
732 | 762 | |
733 | if args.is_present("no_state") { | |
763 | if came_from_cli!(args, "no_state") { | |
734 | 764 | config.save_state = false; |
735 | 765 | } |
736 | 766 | |
737 | if args.is_present("dont_filter") { | |
767 | if came_from_cli!(args, "dont_filter") { | |
738 | 768 | config.dont_filter = true; |
739 | 769 | } |
740 | 770 | |
741 | if args.is_present("collect_extensions") || args.is_present("thorough") { | |
771 | if came_from_cli!(args, "collect_extensions") || came_from_cli!(args, "thorough") { | |
742 | 772 | config.collect_extensions = true; |
743 | 773 | } |
744 | 774 | |
745 | if args.is_present("collect_backups") | |
746 | || args.is_present("smart") | |
747 | || args.is_present("thorough") | |
775 | if came_from_cli!(args, "collect_backups") | |
776 | || came_from_cli!(args, "smart") | |
777 | || came_from_cli!(args, "thorough") | |
748 | 778 | { |
749 | 779 | config.collect_backups = true; |
750 | 780 | } |
751 | 781 | |
752 | if args.is_present("collect_words") | |
753 | || args.is_present("smart") | |
754 | || args.is_present("thorough") | |
782 | if came_from_cli!(args, "collect_words") | |
783 | || came_from_cli!(args, "smart") | |
784 | || came_from_cli!(args, "thorough") | |
755 | 785 | { |
756 | 786 | config.collect_words = true; |
757 | 787 | } |
758 | 788 | |
759 | if args.occurrences_of("verbosity") > 0 { | |
789 | if args.get_count("verbosity") > 0 { | |
760 | 790 | // occurrences_of returns 0 if none are found; this is protected in |
761 | 791 | // an if block for the same reason as the quiet option |
762 | config.verbosity = args.occurrences_of("verbosity") as u8; | |
763 | } | |
764 | ||
765 | if args.is_present("no_recursion") { | |
792 | config.verbosity = args.get_count("verbosity") as u8; | |
793 | } | |
794 | ||
795 | if came_from_cli!(args, "no_recursion") { | |
766 | 796 | config.no_recursion = true; |
767 | 797 | } |
768 | 798 | |
769 | if args.is_present("add_slash") { | |
799 | if came_from_cli!(args, "add_slash") { | |
770 | 800 | config.add_slash = true; |
771 | 801 | } |
772 | 802 | |
773 | if args.is_present("extract_links") | |
774 | || args.is_present("smart") | |
775 | || args.is_present("thorough") | |
803 | if came_from_cli!(args, "extract_links") | |
804 | || came_from_cli!(args, "smart") | |
805 | || came_from_cli!(args, "thorough") | |
776 | 806 | { |
777 | 807 | config.extract_links = true; |
778 | 808 | } |
779 | 809 | |
780 | if args.is_present("json") { | |
810 | if came_from_cli!(args, "json") { | |
781 | 811 | config.json = true; |
782 | 812 | } |
783 | 813 | |
784 | if args.is_present("force_recursion") { | |
814 | if came_from_cli!(args, "force_recursion") { | |
785 | 815 | config.force_recursion = true; |
786 | 816 | } |
787 | 817 | |
788 | 818 | //// |
789 | 819 | // organizational breakpoint; all options below alter the Client configuration |
790 | 820 | //// |
791 | update_config_if_present!(&mut config.proxy, args, "proxy"); | |
792 | update_config_if_present!(&mut config.replay_proxy, args, "replay_proxy"); | |
793 | update_config_if_present!(&mut config.user_agent, args, "user_agent"); | |
794 | update_config_if_present!(&mut config.timeout, args, "timeout"); | |
795 | ||
796 | if args.is_present("burp") { | |
821 | update_config_if_present!(&mut config.proxy, args, "proxy", String); | |
822 | update_config_if_present!(&mut config.replay_proxy, args, "replay_proxy", String); | |
823 | update_config_if_present!(&mut config.user_agent, args, "user_agent", String); | |
824 | update_config_with_num_type_if_present!(&mut config.timeout, args, "timeout", u64); | |
825 | ||
826 | if came_from_cli!(args, "burp") { | |
797 | 827 | config.proxy = String::from("http://127.0.0.1:8080"); |
798 | 828 | } |
799 | 829 | |
800 | if args.is_present("burp_replay") { | |
830 | if came_from_cli!(args, "burp_replay") { | |
801 | 831 | config.replay_proxy = String::from("http://127.0.0.1:8080"); |
802 | 832 | } |
803 | 833 | |
804 | if args.is_present("random_agent") { | |
834 | if came_from_cli!(args, "random_agent") { | |
805 | 835 | config.random_agent = true; |
806 | 836 | } |
807 | 837 | |
808 | if args.is_present("redirects") { | |
838 | if came_from_cli!(args, "redirects") { | |
809 | 839 | config.redirects = true; |
810 | 840 | } |
811 | 841 | |
812 | if args.is_present("insecure") || args.is_present("burp") || args.is_present("burp_replay") | |
842 | if came_from_cli!(args, "insecure") | |
843 | || came_from_cli!(args, "burp") | |
844 | || came_from_cli!(args, "burp_replay") | |
813 | 845 | { |
814 | 846 | config.insecure = true; |
815 | 847 | } |
816 | 848 | |
817 | if let Some(headers) = args.values_of("headers") { | |
849 | if let Some(headers) = args.get_many::<String>("headers") { | |
818 | 850 | for val in headers { |
819 | 851 | let mut split_val = val.split(':'); |
820 | 852 | |
828 | 860 | } |
829 | 861 | } |
830 | 862 | |
831 | if let Some(cookies) = args.values_of("cookies") { | |
863 | if let Some(cookies) = args.get_many::<String>("cookies") { | |
832 | 864 | config.headers.insert( |
833 | 865 | // we know the header name is always "cookie" |
834 | 866 | "Cookie".to_string(), |
844 | 876 | ); |
845 | 877 | } |
846 | 878 | |
847 | if let Some(queries) = args.values_of("queries") { | |
879 | if let Some(queries) = args.get_many::<String>("queries") { | |
848 | 880 | for val in queries { |
849 | 881 | // same basic logic used as reading in the headers HashMap above |
850 | 882 | let mut split_val = val.split('='); |
956 | 988 | update_if_not_default!(&mut conf.force_recursion, new.force_recursion, false); |
957 | 989 | update_if_not_default!(&mut conf.extract_links, new.extract_links, false); |
958 | 990 | update_if_not_default!(&mut conf.extensions, new.extensions, Vec::<String>::new()); |
959 | update_if_not_default!(&mut conf.methods, new.methods, Vec::<String>::new()); | |
991 | update_if_not_default!(&mut conf.methods, new.methods, methods()); | |
960 | 992 | update_if_not_default!(&mut conf.data, new.data, Vec::<u8>::new()); |
961 | 993 | update_if_not_default!(&mut conf.url_denylist, new.url_denylist, Vec::<Url>::new()); |
962 | 994 | if !new.regex_denylist.is_empty() { |
80 | 80 | } |
81 | 81 | |
82 | 82 | /// enum representing the three possible states for informational output (not logging verbosity) |
83 | #[derive(Debug, Copy, Clone, PartialEq)] | |
83 | #[derive(Debug, Copy, Clone, PartialEq, Eq)] | |
84 | 84 | pub enum OutputLevel { |
85 | 85 | /// normal scan, no --quiet|--silent |
86 | 86 | Default, |
115 | 115 | } |
116 | 116 | |
117 | 117 | /// represents actions the Requester should take in certain situations |
118 | #[derive(Debug, PartialEq, Copy, Clone)] | |
118 | #[derive(Debug, PartialEq, Eq, Copy, Clone)] | |
119 | 119 | pub enum RequesterPolicy { |
120 | 120 | /// automatically try to lower request rate in order to reduce errors |
121 | 121 | AutoTune, |
11 | 11 | /// ref: https://developers.google.com/search/reference/robots_txt |
12 | 12 | pub(super) const ROBOTS_TXT_REGEX: &str = |
13 | 13 | r#"(?m)^ *(Allow|Disallow): *(?P<url_path>[a-zA-Z0-9._/?#@!&'()+,;%=-]+?)$"#; // multi-line (?m) |
14 | ||
15 | /// Regular expression to filter bad characters from extracted url paths | |
16 | /// | |
17 | /// ref: https://www.rfc-editor.org/rfc/rfc3986#section-2 | |
18 | pub(super) const URL_CHARS_REGEX: &str = r#"["<>\\^`{|} ]"#; | |
14 | 19 | |
15 | 20 | /// Which type of extraction should be performed |
16 | 21 | #[derive(Debug, Copy, Clone)] |
89 | 94 | Ok(Extractor { |
90 | 95 | links_regex: Regex::new(LINKFINDER_REGEX).unwrap(), |
91 | 96 | robots_regex: Regex::new(ROBOTS_TXT_REGEX).unwrap(), |
97 | url_regex: Regex::new(URL_CHARS_REGEX).unwrap(), | |
92 | 98 | response: if self.response.is_some() { |
93 | 99 | Some(self.response.unwrap()) |
94 | 100 | } else { |
16 | 16 | use anyhow::{bail, Context, Result}; |
17 | 17 | use reqwest::{Client, StatusCode, Url}; |
18 | 18 | use scraper::{Html, Selector}; |
19 | use std::collections::HashSet; | |
19 | use std::{borrow::Cow, collections::HashSet}; | |
20 | 20 | |
21 | 21 | /// Whether an active scan is recursive or not |
22 | 22 | #[derive(Debug)] |
36 | 36 | |
37 | 37 | /// `ROBOTS_TXT_REGEX` as a regex::Regex type |
38 | 38 | pub(super) robots_regex: Regex, |
39 | ||
40 | /// regex to validate a url | |
41 | pub(super) url_regex: Regex, | |
39 | 42 | |
40 | 43 | /// Response from which to extract links |
41 | 44 | pub(super) response: Option<&'a FeroxResponse>, |
219 | 222 | self.extract_links_by_attr(resp_url, links, html, "div", "src"); |
220 | 223 | self.extract_links_by_attr(resp_url, links, html, "frame", "src"); |
221 | 224 | self.extract_links_by_attr(resp_url, links, html, "embed", "src"); |
225 | self.extract_links_by_attr(resp_url, links, html, "link", "href"); | |
222 | 226 | } |
223 | 227 | |
224 | 228 | /// Given the body of a `reqwest::Response`, perform the following actions |
331 | 335 | let normalized_path = self.normalize_url_path(path); |
332 | 336 | |
333 | 337 | // filter out any empty strings caused by .split |
334 | let mut parts: Vec<&str> = normalized_path | |
338 | let mut parts: Vec<Cow<_>> = normalized_path | |
335 | 339 | .split('/') |
340 | .map(|s| self.url_regex.replace_all(s, "")) | |
336 | 341 | .filter(|s| !s.is_empty()) |
337 | 342 | .collect(); |
338 | 343 | |
391 | 396 | .join(link) |
392 | 397 | .with_context(|| format!("Could not join {} with {}", old_url, link))?; |
393 | 398 | |
399 | if old_url.domain() != new_url.domain() || old_url.host() != old_url.host() { | |
400 | // domains/ips are not the same, don't scan things that aren't part of the original | |
401 | // target url | |
402 | log::debug!( | |
403 | "Skipping {} because it's not part of the original target", | |
404 | new_url | |
405 | ); | |
406 | log::trace!("exit: add_link_to_set_of_links"); | |
407 | return Ok(()); | |
408 | } | |
409 | ||
394 | 410 | links.insert(new_url.to_string()); |
395 | 411 | |
396 | 412 | log::trace!("exit: add_link_to_set_of_links"); |
412 | 428 | |
413 | 429 | let scanned_urls = self.handles.ferox_scans()?; |
414 | 430 | |
415 | if scanned_urls.get_scan_by_url(&new_url.to_string()).is_some() { | |
431 | if scanned_urls.get_scan_by_url(new_url.as_ref()).is_some() { | |
416 | 432 | //we've seen the url before and don't need to scan again |
417 | 433 | log::trace!("exit: request_link -> None"); |
418 | 434 | bail!("previously seen url"); |
0 | use super::builder::{LINKFINDER_REGEX, ROBOTS_TXT_REGEX}; | |
0 | use super::builder::{LINKFINDER_REGEX, ROBOTS_TXT_REGEX, URL_CHARS_REGEX}; | |
1 | 1 | use super::*; |
2 | 2 | use crate::config::{Configuration, OutputLevel}; |
3 | 3 | use crate::scan_manager::ScanOrder; |
272 | 272 | let extractor = Extractor { |
273 | 273 | links_regex: Regex::new(LINKFINDER_REGEX).unwrap(), |
274 | 274 | robots_regex: Regex::new(ROBOTS_TXT_REGEX).unwrap(), |
275 | url_regex: Regex::new(URL_CHARS_REGEX).unwrap(), | |
275 | 276 | response: Some(&ferox_response), |
276 | 277 | url: String::new(), |
277 | 278 | target: ExtractionTarget::ResponseBody, |
300 | 301 | let extractor = Extractor { |
301 | 302 | links_regex: Regex::new(LINKFINDER_REGEX).unwrap(), |
302 | 303 | robots_regex: Regex::new(ROBOTS_TXT_REGEX).unwrap(), |
304 | url_regex: Regex::new(URL_CHARS_REGEX).unwrap(), | |
303 | 305 | response: None, |
304 | 306 | url: srv.url("/api/users/stuff/things"), |
305 | 307 | target: ExtractionTarget::RobotsTxt, |
0 | 0 | use super::*; |
1 | 1 | |
2 | 2 | /// Dummy filter for internal shenanigans |
3 | #[derive(Default, Debug, PartialEq)] | |
3 | #[derive(Default, Debug, PartialEq, Eq)] | |
4 | 4 | pub struct EmptyFilter {} |
5 | 5 | |
6 | 6 | impl FeroxFilter for EmptyFilter { |
1 | 1 | |
2 | 2 | /// Simple implementor of FeroxFilter; used to filter out responses based on the number of lines |
3 | 3 | /// in a Response body; specified using -N|--filter-lines |
4 | #[derive(Default, Debug, PartialEq, Serialize, Deserialize)] | |
4 | #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)] | |
5 | 5 | pub struct LinesFilter { |
6 | 6 | /// Number of lines in a Response's body that should be filtered |
7 | 7 | pub line_count: usize, |
2 | 2 | |
3 | 3 | /// Simple implementor of FeroxFilter; used to filter out responses based on the similarity of a |
4 | 4 | /// Response body with a known response; specified using --filter-similar-to |
5 | #[derive(Default, Debug, PartialEq, Serialize, Deserialize)] | |
5 | #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)] | |
6 | 6 | pub struct SimilarityFilter { |
7 | 7 | /// Hash of Response's body to be used during similarity comparison |
8 | 8 | pub hash: String, |
19 | 19 | /// Check `FeroxResponse::text` against what was requested from the site passed in via |
20 | 20 | /// --filter-similar-to |
21 | 21 | fn should_filter_response(&self, response: &FeroxResponse) -> bool { |
22 | let other = FuzzyHash::new(&response.text()); | |
22 | let other = FuzzyHash::new(response.text()); | |
23 | 23 | |
24 | 24 | if let Ok(result) = FuzzyHash::compare(&self.hash, &other.to_string()) { |
25 | 25 | return result >= self.threshold; |
1 | 1 | |
2 | 2 | /// Simple implementor of FeroxFilter; used to filter out responses based on the length of a |
3 | 3 | /// Response body; specified using -S|--filter-size |
4 | #[derive(Default, Debug, PartialEq, Serialize, Deserialize)] | |
4 | #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)] | |
5 | 5 | pub struct SizeFilter { |
6 | 6 | /// Overall length of a Response's body that should be filtered |
7 | 7 | pub content_length: u64, |
1 | 1 | |
2 | 2 | /// Simple implementor of FeroxFilter; used to filter out status codes specified using |
3 | 3 | /// -C|--filter-status |
4 | #[derive(Default, Debug, PartialEq, Serialize, Deserialize)] | |
4 | #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)] | |
5 | 5 | pub struct StatusCodeFilter { |
6 | 6 | /// Status code that should not be displayed to the user |
7 | 7 | pub filter_code: u16, |
40 | 40 | } |
41 | 41 | |
42 | 42 | // hash the response body and store the resulting hash in the filter object |
43 | let hash = FuzzyHash::new(&fr.text()).to_string(); | |
43 | let hash = FuzzyHash::new(fr.text()).to_string(); | |
44 | 44 | |
45 | 45 | Ok(SimilarityFilter { |
46 | 46 | hash, |
8 | 8 | /// |
9 | 9 | /// `size` is size of the response that should be included with filters passed via runtime |
10 | 10 | /// configuration and any static wildcard lengths. |
11 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | |
11 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] | |
12 | 12 | pub struct WildcardFilter { |
13 | 13 | /// size of the response that will later be combined with the length of the path of the url |
14 | 14 | /// requested |
1 | 1 | |
2 | 2 | /// Simple implementor of FeroxFilter; used to filter out responses based on the number of words |
3 | 3 | /// in a Response body; specified using -W|--filter-words |
4 | #[derive(Default, Debug, PartialEq, Serialize, Deserialize)] | |
4 | #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)] | |
5 | 5 | pub struct WordsFilter { |
6 | 6 | /// Number of words in a Response's body that should be filtered |
7 | 7 | pub word_count: usize, |
47 | 47 | fn get_unique_words_from_wordlist(path: &str) -> Result<Arc<Vec<String>>> { |
48 | 48 | log::trace!("enter: get_unique_words_from_wordlist({})", path); |
49 | 49 | |
50 | let file = File::open(&path).with_context(|| format!("Could not open {}", path))?; | |
50 | let file = File::open(path).with_context(|| format!("Could not open {}", path))?; | |
51 | 51 | |
52 | 52 | let reader = BufReader::new(file); |
53 | 53 |
0 | use clap::ArgAction; | |
0 | 1 | use clap::{ |
1 | 2 | crate_authors, crate_description, crate_name, crate_version, Arg, ArgGroup, Command, ValueHint, |
2 | 3 | }; |
24 | 25 | } |
25 | 26 | |
26 | 27 | /// Create and return an instance of [clap::App](https://docs.rs/clap/latest/clap/struct.App.html), i.e. the Command Line Interface's configuration |
27 | pub fn initialize() -> Command<'static> { | |
28 | pub fn initialize() -> Command { | |
28 | 29 | let app = Command::new(crate_name!()) |
29 | 30 | .version(crate_version!()) |
30 | 31 | .author(crate_authors!()) |
38 | 39 | Arg::new("url") |
39 | 40 | .short('u') |
40 | 41 | .long("url") |
41 | .required_unless_present_any(&["stdin", "resume_from"]) | |
42 | .required_unless_present_any(["stdin", "resume_from"]) | |
42 | 43 | .help_heading("Target selection") |
43 | 44 | .value_name("URL") |
44 | 45 | .use_value_delimiter(true) |
49 | 50 | Arg::new("stdin") |
50 | 51 | .long("stdin") |
51 | 52 | .help_heading("Target selection") |
52 | .takes_value(false) | |
53 | .num_args(0) | |
53 | 54 | .help("Read url(s) from STDIN") |
54 | 55 | .conflicts_with("url") |
55 | 56 | ) |
61 | 62 | .help_heading("Target selection") |
62 | 63 | .help("State file from which to resume a partially complete scan (ex. --resume-from ferox-1606586780.state)") |
63 | 64 | .conflicts_with("url") |
64 | .takes_value(true), | |
65 | .num_args(1), | |
65 | 66 | ); |
66 | 67 | |
67 | 68 | ///////////////////////////////////////////////////////////////////// |
71 | 72 | .arg( |
72 | 73 | Arg::new("burp") |
73 | 74 | .long("burp") |
75 | .num_args(0) | |
74 | 76 | .help_heading("Composite settings") |
75 | .conflicts_with_all(&["proxy", "insecure", "burp_replay"]) | |
77 | .conflicts_with_all(["proxy", "insecure", "burp_replay"]) | |
76 | 78 | .help("Set --proxy to http://127.0.0.1:8080 and set --insecure to true"), |
77 | 79 | ) |
78 | 80 | .arg( |
79 | 81 | Arg::new("burp_replay") |
80 | 82 | .long("burp-replay") |
83 | .num_args(0) | |
81 | 84 | .help_heading("Composite settings") |
82 | .conflicts_with_all(&["replay_proxy", "insecure"]) | |
85 | .conflicts_with_all(["replay_proxy", "insecure"]) | |
83 | 86 | .help("Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true"), |
84 | 87 | ) |
85 | 88 | .arg( |
86 | 89 | Arg::new("smart") |
87 | 90 | .long("smart") |
91 | .num_args(0) | |
88 | 92 | .help_heading("Composite settings") |
89 | 93 | .help("Set --extract-links, --auto-tune, --collect-words, and --collect-backups to true"), |
90 | 94 | ).arg( |
91 | 95 | Arg::new("thorough") |
92 | 96 | .long("thorough") |
97 | .num_args(0) | |
93 | 98 | .help_heading("Composite settings") |
94 | 99 | .help("Use the same settings as --smart and set --collect-extensions to true"), |
95 | 100 | ); |
102 | 107 | Arg::new("proxy") |
103 | 108 | .short('p') |
104 | 109 | .long("proxy") |
105 | .takes_value(true) | |
110 | .num_args(1) | |
106 | 111 | .value_name("PROXY") |
107 | 112 | .value_hint(ValueHint::Url) |
108 | 113 | .help_heading("Proxy settings") |
114 | 119 | Arg::new("replay_proxy") |
115 | 120 | .short('P') |
116 | 121 | .long("replay-proxy") |
117 | .takes_value(true) | |
122 | .num_args(1) | |
118 | 123 | .value_hint(ValueHint::Url) |
119 | 124 | .value_name("REPLAY_PROXY") |
120 | 125 | .help_heading("Proxy settings") |
127 | 132 | .short('R') |
128 | 133 | .long("replay-codes") |
129 | 134 | .value_name("REPLAY_CODE") |
130 | .takes_value(true) | |
131 | .multiple_values(true) | |
132 | .multiple_occurrences(true) | |
135 | .num_args(1..) | |
136 | .action(ArgAction::Append) | |
133 | 137 | .use_value_delimiter(true) |
134 | 138 | .requires("replay_proxy") |
135 | 139 | .help_heading("Proxy settings") |
147 | 151 | .short('a') |
148 | 152 | .long("user-agent") |
149 | 153 | .value_name("USER_AGENT") |
150 | .takes_value(true) | |
154 | .num_args(1) | |
151 | 155 | .help_heading("Request settings") |
152 | 156 | .help(&**DEFAULT_USER_AGENT), |
153 | 157 | ) |
155 | 159 | Arg::new("random_agent") |
156 | 160 | .short('A') |
157 | 161 | .long("random-agent") |
158 | .takes_value(false) | |
162 | .num_args(0) | |
159 | 163 | .help_heading("Request settings") |
160 | 164 | .help("Use a random User-Agent"), |
161 | 165 | ) |
164 | 168 | .short('x') |
165 | 169 | .long("extensions") |
166 | 170 | .value_name("FILE_EXTENSION") |
167 | .takes_value(true) | |
168 | .multiple_values(true) | |
169 | .multiple_occurrences(true) | |
171 | .num_args(1..) | |
172 | .action(ArgAction::Append) | |
170 | 173 | .use_value_delimiter(true) |
171 | 174 | .help_heading("Request settings") |
172 | 175 | .help( |
178 | 181 | .short('m') |
179 | 182 | .long("methods") |
180 | 183 | .value_name("HTTP_METHODS") |
181 | .takes_value(true) | |
182 | .multiple_values(true) | |
183 | .multiple_occurrences(true) | |
184 | .num_args(1..) | |
185 | .action(ArgAction::Append) | |
184 | 186 | .use_value_delimiter(true) |
185 | 187 | .help_heading("Request settings") |
186 | 188 | .help( |
191 | 193 | Arg::new("data") |
192 | 194 | .long("data") |
193 | 195 | .value_name("DATA") |
194 | .takes_value(true) | |
196 | .num_args(1) | |
195 | 197 | .help_heading("Request settings") |
196 | 198 | .help( |
197 | 199 | "Request's Body; can read data from a file if input starts with an @ (ex: @post.bin)", |
202 | 204 | .short('H') |
203 | 205 | .long("headers") |
204 | 206 | .value_name("HEADER") |
205 | .takes_value(true) | |
206 | .help_heading("Request settings") | |
207 | .multiple_values(true) | |
208 | .multiple_occurrences(true) | |
207 | .num_args(1..) | |
208 | .action(ArgAction::Append) | |
209 | .help_heading("Request settings") | |
209 | 210 | .use_value_delimiter(true) |
210 | 211 | .help( |
211 | 212 | "Specify HTTP headers to be used in each request (ex: -H Header:val -H 'stuff: things')", |
216 | 217 | .short('b') |
217 | 218 | .long("cookies") |
218 | 219 | .value_name("COOKIE") |
219 | .takes_value(true) | |
220 | .multiple_values(true) | |
221 | .multiple_occurrences(true) | |
220 | .num_args(1..) | |
221 | .action(ArgAction::Append) | |
222 | 222 | .use_value_delimiter(true) |
223 | 223 | .help_heading("Request settings") |
224 | 224 | .help( |
230 | 230 | .short('Q') |
231 | 231 | .long("query") |
232 | 232 | .value_name("QUERY") |
233 | .takes_value(true) | |
234 | .multiple_values(true) | |
235 | .multiple_occurrences(true) | |
233 | .num_args(1..) | |
234 | .action(ArgAction::Append) | |
236 | 235 | .use_value_delimiter(true) |
237 | 236 | .help_heading("Request settings") |
238 | 237 | .help( |
244 | 243 | .short('f') |
245 | 244 | .long("add-slash") |
246 | 245 | .help_heading("Request settings") |
247 | .takes_value(false) | |
246 | .num_args(0) | |
248 | 247 | .help("Append / to each request's URL") |
249 | 248 | ); |
250 | 249 | |
255 | 254 | Arg::new("url_denylist") |
256 | 255 | .long("dont-scan") |
257 | 256 | .value_name("URL") |
258 | .takes_value(true) | |
259 | .multiple_values(true) | |
260 | .multiple_occurrences(true) | |
257 | .num_args(1..) | |
258 | .action(ArgAction::Append) | |
261 | 259 | .use_value_delimiter(true) |
262 | 260 | .help_heading("Request filters") |
263 | 261 | .help("URL(s) or Regex Pattern(s) to exclude from recursion/scans"), |
272 | 270 | .short('S') |
273 | 271 | .long("filter-size") |
274 | 272 | .value_name("SIZE") |
275 | .takes_value(true) | |
276 | .multiple_values(true) | |
277 | .multiple_occurrences(true) | |
273 | .num_args(1..) | |
274 | .action(ArgAction::Append) | |
278 | 275 | .use_value_delimiter(true) |
279 | 276 | .help_heading("Response filters") |
280 | 277 | .help( |
286 | 283 | .short('X') |
287 | 284 | .long("filter-regex") |
288 | 285 | .value_name("REGEX") |
289 | .takes_value(true) | |
290 | .multiple_values(true) | |
291 | .multiple_occurrences(true) | |
286 | .num_args(1..) | |
287 | .action(ArgAction::Append) | |
292 | 288 | .use_value_delimiter(true) |
293 | 289 | .help_heading("Response filters") |
294 | 290 | .help( |
300 | 296 | .short('W') |
301 | 297 | .long("filter-words") |
302 | 298 | .value_name("WORDS") |
303 | .takes_value(true) | |
304 | .multiple_values(true) | |
305 | .multiple_occurrences(true) | |
299 | .num_args(1..) | |
300 | .action(ArgAction::Append) | |
306 | 301 | .use_value_delimiter(true) |
307 | 302 | .help_heading("Response filters") |
308 | 303 | .help( |
314 | 309 | .short('N') |
315 | 310 | .long("filter-lines") |
316 | 311 | .value_name("LINES") |
317 | .takes_value(true) | |
318 | .multiple_values(true) | |
319 | .multiple_occurrences(true) | |
312 | .num_args(1..) | |
313 | .action(ArgAction::Append) | |
320 | 314 | .use_value_delimiter(true) |
321 | 315 | .help_heading("Response filters") |
322 | 316 | .help( |
328 | 322 | .short('C') |
329 | 323 | .long("filter-status") |
330 | 324 | .value_name("STATUS_CODE") |
331 | .takes_value(true) | |
332 | .multiple_values(true) | |
333 | .multiple_occurrences(true) | |
325 | .num_args(1..) | |
326 | .action(ArgAction::Append) | |
334 | 327 | .use_value_delimiter(true) |
335 | 328 | .conflicts_with("status_codes") |
336 | 329 | .help_heading("Response filters") |
342 | 335 | Arg::new("filter_similar") |
343 | 336 | .long("filter-similar-to") |
344 | 337 | .value_name("UNWANTED_PAGE") |
345 | .takes_value(true) | |
346 | .multiple_values(true) | |
347 | .multiple_occurrences(true) | |
338 | .num_args(1..) | |
339 | .action(ArgAction::Append) | |
348 | 340 | .value_hint(ValueHint::Url) |
349 | 341 | .use_value_delimiter(true) |
350 | 342 | .help_heading("Response filters") |
357 | 349 | .short('s') |
358 | 350 | .long("status-codes") |
359 | 351 | .value_name("STATUS_CODE") |
360 | .takes_value(true) | |
361 | .multiple_values(true) | |
362 | .multiple_occurrences(true) | |
352 | .num_args(1..) | |
353 | .action(ArgAction::Append) | |
363 | 354 | .use_value_delimiter(true) |
364 | 355 | .help_heading("Response filters") |
365 | 356 | .help( |
376 | 367 | .short('T') |
377 | 368 | .long("timeout") |
378 | 369 | .value_name("SECONDS") |
379 | .takes_value(true) | |
370 | .num_args(1) | |
380 | 371 | .help_heading("Client settings") |
381 | 372 | .help("Number of seconds before a client's request times out (default: 7)"), |
382 | 373 | ) |
384 | 375 | Arg::new("redirects") |
385 | 376 | .short('r') |
386 | 377 | .long("redirects") |
387 | .takes_value(false) | |
378 | .num_args(0) | |
388 | 379 | .help_heading("Client settings") |
389 | 380 | .help("Allow client to follow redirects"), |
390 | 381 | ) |
392 | 383 | Arg::new("insecure") |
393 | 384 | .short('k') |
394 | 385 | .long("insecure") |
395 | .takes_value(false) | |
386 | .num_args(0) | |
396 | 387 | .help_heading("Client settings") |
397 | 388 | .help("Disables TLS certificate validation in the client"), |
398 | 389 | ); |
406 | 397 | .short('t') |
407 | 398 | .long("threads") |
408 | 399 | .value_name("THREADS") |
409 | .takes_value(true) | |
400 | .num_args(1) | |
410 | 401 | .help_heading("Scan settings") |
411 | 402 | .help("Number of concurrent threads (default: 50)"), |
412 | 403 | ) |
414 | 405 | Arg::new("no_recursion") |
415 | 406 | .short('n') |
416 | 407 | .long("no-recursion") |
417 | .takes_value(false) | |
408 | .num_args(0) | |
418 | 409 | .help_heading("Scan settings") |
419 | 410 | .help("Do not scan recursively"), |
420 | 411 | ) |
423 | 414 | .short('d') |
424 | 415 | .long("depth") |
425 | 416 | .value_name("RECURSION_DEPTH") |
426 | .takes_value(true) | |
417 | .num_args(1) | |
427 | 418 | .help_heading("Scan settings") |
428 | 419 | .help("Maximum recursion depth, a depth of 0 is infinite recursion (default: 4)"), |
429 | 420 | ).arg( |
430 | 421 | Arg::new("force_recursion") |
431 | 422 | .long("force-recursion") |
423 | .num_args(0) | |
432 | 424 | .conflicts_with("no_recursion") |
433 | 425 | .help_heading("Scan settings") |
434 | 426 | .help("Force recursion attempts on all 'found' endpoints (still respects recursion depth)"), |
436 | 428 | Arg::new("extract_links") |
437 | 429 | .short('e') |
438 | 430 | .long("extract-links") |
439 | .takes_value(false) | |
431 | .num_args(0) | |
440 | 432 | .help_heading("Scan settings") |
441 | 433 | .help("Extract links from response body (html, javascript, etc...); make new requests based on findings") |
442 | 434 | ) |
445 | 437 | .short('L') |
446 | 438 | .long("scan-limit") |
447 | 439 | .value_name("SCAN_LIMIT") |
448 | .takes_value(true) | |
440 | .num_args(1) | |
449 | 441 | .help_heading("Scan settings") |
450 | 442 | .help("Limit total number of concurrent scans (default: 0, i.e. no limit)") |
451 | 443 | ) |
453 | 445 | Arg::new("parallel") |
454 | 446 | .long("parallel") |
455 | 447 | .value_name("PARALLEL_SCANS") |
456 | .takes_value(true) | |
448 | .num_args(1) | |
457 | 449 | .requires("stdin") |
458 | 450 | .help_heading("Scan settings") |
459 | 451 | .help("Run parallel feroxbuster instances (one child process per url passed via stdin)") |
462 | 454 | Arg::new("rate_limit") |
463 | 455 | .long("rate-limit") |
464 | 456 | .value_name("RATE_LIMIT") |
465 | .takes_value(true) | |
457 | .num_args(1) | |
466 | 458 | .conflicts_with("auto_tune") |
467 | 459 | .help_heading("Scan settings") |
468 | 460 | .help("Limit number of requests per second (per directory) (default: 0, i.e. no limit)") |
471 | 463 | Arg::new("time_limit") |
472 | 464 | .long("time-limit") |
473 | 465 | .value_name("TIME_SPEC") |
474 | .takes_value(true) | |
475 | .validator(valid_time_spec) | |
466 | .num_args(1) | |
467 | .value_parser(valid_time_spec) | |
476 | 468 | .help_heading("Scan settings") |
477 | 469 | .help("Limit total run time of all scans (ex: --time-limit 10m)") |
478 | 470 | ) |
484 | 476 | .value_name("FILE") |
485 | 477 | .help("Path to the wordlist") |
486 | 478 | .help_heading("Scan settings") |
487 | .takes_value(true), | |
479 | .num_args(1), | |
488 | 480 | ).arg( |
489 | 481 | Arg::new("auto_tune") |
490 | 482 | .long("auto-tune") |
491 | .takes_value(false) | |
483 | .num_args(0) | |
492 | 484 | .conflicts_with("auto_bail") |
493 | 485 | .help_heading("Scan settings") |
494 | 486 | .help("Automatically lower scan rate when an excessive amount of errors are encountered") |
496 | 488 | .arg( |
497 | 489 | Arg::new("auto_bail") |
498 | 490 | .long("auto-bail") |
499 | .takes_value(false) | |
491 | .num_args(0) | |
500 | 492 | .help_heading("Scan settings") |
501 | 493 | .help("Automatically stop scanning when an excessive amount of errors are encountered") |
502 | 494 | ).arg( |
503 | 495 | Arg::new("dont_filter") |
504 | 496 | .short('D') |
505 | 497 | .long("dont-filter") |
506 | .takes_value(false) | |
498 | .num_args(0) | |
507 | 499 | .help_heading("Scan settings") |
508 | 500 | .help("Don't auto-filter wildcard responses") |
509 | 501 | ).arg( |
510 | 502 | Arg::new("collect_extensions") |
511 | 503 | .short('E') |
512 | 504 | .long("collect-extensions") |
513 | .takes_value(false) | |
505 | .num_args(0) | |
514 | 506 | .help_heading("Dynamic collection settings") |
515 | 507 | .help("Automatically discover extensions and add them to --extensions (unless they're in --dont-collect)") |
516 | 508 | ).arg( |
517 | 509 | Arg::new("collect_backups") |
518 | 510 | .short('B') |
519 | 511 | .long("collect-backups") |
520 | .takes_value(false) | |
512 | .num_args(0) | |
521 | 513 | .help_heading("Dynamic collection settings") |
522 | 514 | .help("Automatically request likely backup extensions for \"found\" urls") |
523 | 515 | ).arg( |
524 | 516 | Arg::new("collect_words") |
525 | 517 | .short('g') |
526 | 518 | .long("collect-words") |
527 | .takes_value(false) | |
519 | .num_args(0) | |
528 | 520 | .help_heading("Dynamic collection settings") |
529 | 521 | .help("Automatically discover important words from within responses and add them to the wordlist") |
530 | 522 | ).arg( |
532 | 524 | .short('I') |
533 | 525 | .long("dont-collect") |
534 | 526 | .value_name("FILE_EXTENSION") |
535 | .takes_value(true) | |
536 | .multiple_values(true) | |
537 | .multiple_occurrences(true) | |
527 | .num_args(1..) | |
528 | .action(ArgAction::Append) | |
538 | 529 | .use_value_delimiter(true) |
539 | 530 | .help_heading("Dynamic collection settings") |
540 | 531 | .help( |
550 | 541 | Arg::new("verbosity") |
551 | 542 | .short('v') |
552 | 543 | .long("verbosity") |
553 | .takes_value(false) | |
554 | .multiple_occurrences(true) | |
544 | .num_args(0) | |
545 | .action(ArgAction::Count) | |
555 | 546 | .conflicts_with("silent") |
556 | 547 | .help_heading("Output settings") |
557 | 548 | .help("Increase verbosity level (use -vv or more for greater effect. [CAUTION] 4 -v's is probably too much)"), |
558 | 549 | ).arg( |
559 | 550 | Arg::new("silent") |
560 | 551 | .long("silent") |
561 | .takes_value(false) | |
552 | .num_args(0) | |
562 | 553 | .conflicts_with("quiet") |
563 | 554 | .help_heading("Output settings") |
564 | 555 | .help("Only print URLs + turn off logging (good for piping a list of urls to other commands)") |
567 | 558 | Arg::new("quiet") |
568 | 559 | .short('q') |
569 | 560 | .long("quiet") |
570 | .takes_value(false) | |
561 | .num_args(0) | |
571 | 562 | .help_heading("Output settings") |
572 | 563 | .help("Hide progress bars and banner (good for tmux windows w/ notifications)") |
573 | 564 | ) |
575 | 566 | .arg( |
576 | 567 | Arg::new("json") |
577 | 568 | .long("json") |
578 | .takes_value(false) | |
569 | .num_args(0) | |
579 | 570 | .requires("output_files") |
580 | 571 | .help_heading("Output settings") |
581 | 572 | .help("Emit JSON logs to --output and --debug-log instead of normal text") |
587 | 578 | .value_name("FILE") |
588 | 579 | .help_heading("Output settings") |
589 | 580 | .help("Output file to write results to (use w/ --json for JSON entries)") |
590 | .takes_value(true), | |
581 | .num_args(1), | |
591 | 582 | ) |
592 | 583 | .arg( |
593 | 584 | Arg::new("debug_log") |
596 | 587 | .value_hint(ValueHint::FilePath) |
597 | 588 | .help_heading("Output settings") |
598 | 589 | .help("Output file to write log entries (use w/ --json for JSON entries)") |
599 | .takes_value(true), | |
590 | .num_args(1), | |
600 | 591 | ) |
601 | 592 | .arg( |
602 | 593 | Arg::new("no_state") |
603 | 594 | .long("no-state") |
604 | .takes_value(false) | |
595 | .num_args(0) | |
605 | 596 | .help_heading("Output settings") |
606 | 597 | .help("Disable state output file (*.state)") |
607 | 598 | ); |
612 | 603 | let mut app = app |
613 | 604 | .group( |
614 | 605 | ArgGroup::new("output_files") |
615 | .args(&["debug_log", "output"]) | |
606 | .args(["debug_log", "output"]) | |
616 | 607 | .multiple(true), |
617 | 608 | ) |
618 | 609 | .after_long_help(EPILOGUE); |
640 | 631 | } |
641 | 632 | |
642 | 633 | /// Validate that a string is formatted as a number followed by s, m, h, or d (10d, 30s, etc...) |
643 | fn valid_time_spec(time_spec: &str) -> Result<(), String> { | |
634 | fn valid_time_spec(time_spec: &str) -> Result<String, String> { | |
644 | 635 | match TIMESPEC_REGEX.is_match(time_spec) { |
645 | true => Ok(()), | |
636 | true => Ok(time_spec.to_string()), | |
646 | 637 | false => { |
647 | 638 | let msg = format!( |
648 | 639 | "Expected a non-negative, whole number followed by s, m, h, or d (case insensitive); received {}", |
686 | 677 | ./feroxbuster -u http://127.1 --extract-links |
687 | 678 | |
688 | 679 | Ludicrous speed... go! |
689 | ./feroxbuster -u http://127.1 -threads 200 | |
680 | ./feroxbuster -u http://127.1 --threads 200 | |
690 | 681 | |
691 | 682 | Limit to a total of 60 active requests at any given time (threads * scan limit) |
692 | 683 | ./feroxbuster -u http://127.1 --threads 30 --scan-limit 2 |
31 | 31 | /// The URL that to be scanned |
32 | 32 | pub(super) url: String, |
33 | 33 | |
34 | /// A url used solely for comparison to other URLs | |
35 | pub(super) normalized_url: String, | |
36 | ||
34 | 37 | /// The type of scan |
35 | 38 | pub scan_type: ScanType, |
36 | 39 | |
78 | 81 | num_requests: 0, |
79 | 82 | scan_order: ScanOrder::Latest, |
80 | 83 | url: String::new(), |
84 | normalized_url: String::new(), | |
81 | 85 | progress_bar: Mutex::new(None), |
82 | 86 | scan_type: ScanType::File, |
83 | 87 | output_level: Default::default(), |
190 | 194 | ) -> Arc<Self> { |
191 | 195 | Arc::new(Self { |
192 | 196 | url: url.to_string(), |
197 | normalized_url: format!("{}/", url.trim_end_matches('/')), | |
193 | 198 | scan_type, |
194 | 199 | scan_order, |
195 | 200 | num_requests, |
331 | 336 | where |
332 | 337 | S: Serializer, |
333 | 338 | { |
334 | let mut state = serializer.serialize_struct("FeroxScan", 4)?; | |
339 | let mut state = serializer.serialize_struct("FeroxScan", 6)?; | |
335 | 340 | |
336 | 341 | state.serialize_field("id", &self.id)?; |
337 | 342 | state.serialize_field("url", &self.url)?; |
343 | state.serialize_field("normalized_url", &self.normalized_url)?; | |
338 | 344 | state.serialize_field("scan_type", &self.scan_type)?; |
339 | 345 | state.serialize_field("status", &self.status)?; |
340 | 346 | state.serialize_field("num_requests", &self.num_requests)?; |
384 | 390 | "url" => { |
385 | 391 | if let Some(url) = value.as_str() { |
386 | 392 | scan.url = url.to_string(); |
393 | } | |
394 | } | |
395 | "normalized_url" => { | |
396 | if let Some(normalized_url) = value.as_str() { | |
397 | scan.normalized_url = normalized_url.to_string(); | |
387 | 398 | } |
388 | 399 | } |
389 | 400 | "num_requests" => { |
479 | 490 | let scan = FeroxScan { |
480 | 491 | id: "".to_string(), |
481 | 492 | url: "".to_string(), |
493 | normalized_url: String::from("/"), | |
482 | 494 | scan_type: ScanType::Directory, |
483 | 495 | scan_order: ScanOrder::Initial, |
484 | 496 | num_requests: 0, |
74 | 74 | let mut seq = serializer.serialize_seq(Some(scans.len() + 1))?; |
75 | 75 | |
76 | 76 | for scan in scans.iter() { |
77 | seq.serialize_element(&*scan).unwrap_or_default(); | |
77 | seq.serialize_element(scan).unwrap_or_default(); | |
78 | 78 | } |
79 | 79 | seq.end() |
80 | 80 | } |
212 | 212 | /// on the given URL |
213 | 213 | pub fn contains(&self, url: &str) -> bool { |
214 | 214 | if let Ok(scans) = self.scans.read() { |
215 | let normalized = format!("{}/", url.trim_end_matches('/')); | |
216 | ||
215 | 217 | for scan in scans.iter() { |
216 | if scan.url == url { | |
218 | if scan.normalized_url == normalized { | |
217 | 219 | return true; |
218 | 220 | } |
219 | 221 | } |
224 | 226 | /// Find and return a `FeroxScan` based on the given URL |
225 | 227 | pub fn get_scan_by_url(&self, url: &str) -> Option<Arc<FeroxScan>> { |
226 | 228 | if let Ok(guard) = self.scans.read() { |
229 | let normalized = format!("{}/", url.trim_end_matches('/')); | |
230 | ||
227 | 231 | for scan in guard.iter() { |
228 | if scan.url == url { | |
232 | if scan.normalized_url == normalized { | |
229 | 233 | return Some(scan.clone()); |
230 | 234 | } |
231 | 235 | } |
588 | 592 | /// |
589 | 593 | /// Also return a reference to the new `FeroxScan` |
590 | 594 | pub fn add_directory_scan(&self, url: &str, scan_order: ScanOrder) -> (bool, Arc<FeroxScan>) { |
591 | self.add_scan(url, ScanType::Directory, scan_order) | |
595 | let normalized = format!("{}/", url.trim_end_matches('/')); | |
596 | self.add_scan(&normalized, ScanType::Directory, scan_order) | |
592 | 597 | } |
593 | 598 | |
594 | 599 | /// Given a url, create a new `FeroxScan` and add it to `FeroxScans` as a File Scan |
276 | 276 | None, |
277 | 277 | ); |
278 | 278 | let fs_json = format!( |
279 | r#"{{"id":"{}","url":"https://spiritanimal.com","scan_type":"Directory","status":"NotStarted","num_requests":0}}"#, | |
279 | r#"{{"id":"{}","url":"https://spiritanimal.com","normalized_url":"https://spiritanimal.com/","scan_type":"Directory","status":"NotStarted","num_requests":0}}"#, | |
280 | 280 | fs.id |
281 | 281 | ); |
282 | 282 | assert_eq!(fs_json, serde_json::to_string(&*fs).unwrap()); |
295 | 295 | ); |
296 | 296 | let ferox_scans = FeroxScans::default(); |
297 | 297 | let ferox_scans_json = format!( |
298 | r#"[{{"id":"{}","url":"https://spiritanimal.com","scan_type":"Directory","status":"NotStarted","num_requests":0}}]"#, | |
298 | r#"[{{"id":"{}","url":"https://spiritanimal.com","normalized_url":"https://spiritanimal.com/","scan_type":"Directory","status":"NotStarted","num_requests":0}}]"#, | |
299 | 299 | ferox_scan.id |
300 | 300 | ); |
301 | 301 | ferox_scans.scans.write().unwrap().push(ferox_scan); |
555 | 555 | let scan = FeroxScan { |
556 | 556 | id: "".to_string(), |
557 | 557 | url: String::from("http://localhost"), |
558 | normalized_url: String::from("http://localhost/"), | |
558 | 559 | scan_order: ScanOrder::Latest, |
559 | 560 | scan_type: Default::default(), |
560 | 561 | num_requests: 0, |
599 | 600 | let scan = FeroxScan { |
600 | 601 | id: "".to_string(), |
601 | 602 | url: String::from("http://localhost"), |
603 | normalized_url: String::from("http://localhost/"), | |
602 | 604 | scan_order: ScanOrder::Latest, |
603 | 605 | scan_type: Default::default(), |
604 | 606 | num_requests: 0, |
0 | use std::fmt::Write as _; | |
0 | 1 | use std::sync::atomic::AtomicBool; |
1 | 2 | use std::{ops::Deref, sync::atomic::Ordering, sync::Arc, time::Instant}; |
2 | 3 | |
283 | 284 | let mut message = format!("=> {}", style("Directory listing").blue().bright()); |
284 | 285 | |
285 | 286 | if !self.handles.config.extract_links { |
286 | message | |
287 | .push_str(&format!(" (add {} to scan)", style("-e").bright().yellow())) | |
287 | write!(message, " (add {} to scan)", style("-e").bright().yellow())?; | |
288 | 288 | } |
289 | 289 | |
290 | 290 | progress_bar.reset_eta(); |
5 | 5 | |
6 | 6 | use anyhow::Result; |
7 | 7 | use lazy_static::lazy_static; |
8 | use leaky_bucket::LeakyBucket; | |
8 | use leaky_bucket::RateLimiter; | |
9 | 9 | use tokio::{ |
10 | 10 | sync::RwLock, |
11 | 11 | time::{sleep, Duration}, |
44 | 44 | target_url: String, |
45 | 45 | |
46 | 46 | /// limits requests per second if present |
47 | rate_limiter: RwLock<Option<LeakyBucket>>, | |
47 | rate_limiter: RwLock<Option<RateLimiter>>, | |
48 | 48 | |
49 | 49 | /// data regarding policy and metadata about last enforced trigger etc... |
50 | 50 | policy_data: PolicyData, |
93 | 93 | }) |
94 | 94 | } |
95 | 95 | |
96 | /// build a LeakyBucket, given a rate limit (as requests per second) | |
97 | fn build_a_bucket(limit: usize) -> Result<LeakyBucket> { | |
96 | /// build a RateLimiter, given a rate limit (as requests per second) | |
97 | fn build_a_bucket(limit: usize) -> Result<RateLimiter> { | |
98 | 98 | let refill = max((limit as f64 / 10.0).round() as usize, 1); // minimum of 1 per second |
99 | 99 | let tokens = max((limit as f64 / 2.0).round() as usize, 1); |
100 | 100 | let interval = if refill == 1 { 1000 } else { 100 }; // 1 second if refill is 1 |
101 | 101 | |
102 | Ok(LeakyBucket::builder() | |
103 | .refill_interval(Duration::from_millis(interval)) // add tokens every 0.1s | |
104 | .refill_amount(refill) // ex: 100 req/s -> 10 tokens per 0.1s | |
105 | .tokens(tokens) // reduce initial burst, 2 is arbitrary, but felt good | |
102 | Ok(RateLimiter::builder() | |
103 | .interval(Duration::from_millis(interval)) // add tokens every 0.1s | |
104 | .refill(refill) // ex: 100 req/s -> 10 tokens per 0.1s | |
105 | .initial(tokens) // reduce initial burst, 2 is arbitrary, but felt good | |
106 | 106 | .max(limit) |
107 | .build()?) | |
107 | .build()) | |
108 | 108 | } |
109 | 109 | |
110 | 110 | /// sleep and set a flag that can be checked by other threads |
126 | 126 | let guard = self.rate_limiter.read().await; |
127 | 127 | |
128 | 128 | if guard.is_some() { |
129 | guard.as_ref().unwrap().acquire_one().await?; | |
129 | guard.as_ref().unwrap().acquire_one().await; | |
130 | 130 | } |
131 | 131 | |
132 | 132 | Ok(()) |
207 | 207 | } else { |
208 | 208 | // errors can only be incremented, so an else is sufficient |
209 | 209 | *guard += 1; |
210 | self.policy_data.adjust_up(&*guard); | |
210 | self.policy_data.adjust_up(&guard); | |
211 | 211 | } |
212 | 212 | } |
213 | 213 | |
924 | 924 | /// decrease the scan rate |
925 | 925 | async fn adjust_limit_resets_streak_counter_on_downward_movement() { |
926 | 926 | let (handles, _) = setup_requester_test(None).await; |
927 | let mut buckets = leaky_bucket::LeakyBuckets::new(); | |
928 | let coordinator = buckets.coordinate().unwrap(); | |
929 | tokio::spawn(async move { coordinator.await.expect("coordinator errored") }); | |
930 | let limiter = buckets.rate_limiter().max(200).build().unwrap(); | |
927 | let limiter = RateLimiter::builder() | |
928 | .interval(Duration::from_secs(1)) | |
929 | .max(200) | |
930 | .build(); | |
931 | 931 | |
932 | 932 | let scan = FeroxScan::default(); |
933 | 933 | scan.add_error(); |
946 | 946 | requester.policy_data.set_reqs_sec(400); |
947 | 947 | requester.policy_data.set_errors(1); |
948 | 948 | |
949 | let mut guard = requester.tuning_lock.lock().unwrap(); | |
950 | *guard = 2; | |
951 | drop(guard); | |
949 | { | |
950 | let mut guard = requester.tuning_lock.lock().unwrap(); | |
951 | *guard = 2; | |
952 | } | |
952 | 953 | |
953 | 954 | requester |
954 | 955 | .adjust_limit(PolicyTrigger::Errors, false) |
1035 | 1036 | /// set_rate_limiter should exit early when new limit equals the current bucket's max |
1036 | 1037 | async fn set_rate_limiter_early_exit() { |
1037 | 1038 | let (handles, _) = setup_requester_test(None).await; |
1038 | let mut buckets = leaky_bucket::LeakyBuckets::new(); | |
1039 | let coordinator = buckets.coordinate().unwrap(); | |
1040 | tokio::spawn(async move { coordinator.await.expect("coordinator errored") }); | |
1041 | let limiter = buckets.rate_limiter().max(200).build().unwrap(); | |
1039 | let limiter = RateLimiter::builder() | |
1040 | .interval(Duration::from_secs(1)) | |
1041 | .max(200) | |
1042 | .build(); | |
1042 | 1043 | |
1043 | 1044 | let requester = Requester { |
1044 | 1045 | handles, |
1067 | 1068 | async fn tune_sets_expected_values_and_then_waits() { |
1068 | 1069 | let (handles, _) = setup_requester_test(None).await; |
1069 | 1070 | |
1070 | let mut buckets = leaky_bucket::LeakyBuckets::new(); | |
1071 | let coordinator = buckets.coordinate().unwrap(); | |
1072 | tokio::spawn(async move { coordinator.await.expect("coordinator errored") }); | |
1073 | let limiter = buckets.rate_limiter().max(200).build().unwrap(); | |
1071 | let limiter = RateLimiter::builder() | |
1072 | .interval(Duration::from_secs(1)) | |
1073 | .max(200) | |
1074 | .build(); | |
1074 | 1075 | |
1075 | 1076 | let scan = FeroxScan::new( |
1076 | 1077 | "http://localhost", |
0 | #[derive(Copy, Clone, PartialEq, Debug)] | |
0 | #[derive(Copy, Clone, PartialEq, Eq, Debug)] | |
1 | 1 | /// represents different situations where different criteria can trigger auto-tune/bail behavior |
2 | 2 | pub enum PolicyTrigger { |
3 | 3 | /// excessive 403 trigger |
525 | 525 | String::new() |
526 | 526 | }; |
527 | 527 | |
528 | let slug = url.replace("://", "_").replace('/', "_").replace('.', "_"); | |
528 | let slug = url.replace("://", "_").replace(['/', '.'], "_"); | |
529 | 529 | |
530 | 530 | let filename = format!("{}{}-{}.{}", altered_prefix, slug, ts, suffix); |
531 | 531 |
198 | 198 | let sub_dir = output_dir.as_ref().join(&sub_dir); |
199 | 199 | |
200 | 200 | // created directory like output-file-1627845741.logs/ |
201 | assert!(dir_regex.is_match(&sub_dir.to_string_lossy().to_string())); | |
201 | assert!(dir_regex.is_match(&sub_dir.to_string_lossy())); | |
202 | 202 | |
203 | 203 | for entry in sub_dir.read_dir()? { |
204 | 204 | let entry = entry?; |
41 | 41 | .arg("-h") |
42 | 42 | .assert() |
43 | 43 | .success() |
44 | .stdout(predicate::str::contains( | |
45 | "[CAUTION] 4 -v's is probably too much", | |
46 | )); | |
44 | .stdout( | |
45 | predicate::str::contains("[CAUTION]") | |
46 | .and(predicate::str::contains("4")) | |
47 | .and(predicate::str::contains("-v's")) | |
48 | .and(predicate::str::contains("is")) | |
49 | .and(predicate::str::contains("probably")) | |
50 | .and(predicate::str::contains("too")) | |
51 | .and(predicate::str::contains("much")), | |
52 | ); | |
47 | 53 | } |
19 | 19 | // localhost:PORT/ <- complete |
20 | 20 | // localhost:PORT/js <- will get scanned with /css and /stuff |
21 | 21 | let complete_scan = format!( |
22 | r#"{{"id":"057016a14769414aac9a7a62707598cb","url":"{}","scan_type":"Directory","status":"Complete"}}"#, | |
23 | srv.url("/") | |
22 | r#"{{"id":"057016a14769414aac9a7a62707598cb","url":"{}","normalized_url":"{}","scan_type":"Directory","status":"Complete"}}"#, | |
23 | srv.url("/"), | |
24 | srv.url("/"), | |
24 | 25 | ); |
25 | 26 | let incomplete_scan = format!( |
26 | r#"{{"id":"400b2323a16f43468a04ffcbbeba34c6","url":"{}","scan_type":"Directory","status":"NotStarted"}}"#, | |
27 | r#"{{"id":"400b2323a16f43468a04ffcbbeba34c6","url":"{}","normalized_url":"{}/","scan_type":"Directory","status":"NotStarted"}}"#, | |
28 | srv.url("/js"), | |
27 | 29 | srv.url("/js") |
28 | 30 | ); |
29 | 31 | let scans = format!(r#""scans":[{},{}]"#, complete_scan, incomplete_scan); |