Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better enforce clippy lints #294

Merged
merged 2 commits into from Oct 21, 2020
Merged

Better enforce clippy lints #294

merged 2 commits into from Oct 21, 2020

Conversation

niklasmohrin
Copy link
Contributor

@niklasmohrin niklasmohrin commented Oct 18, 2020

Hey there, it's me again :D

I just saw that the clippy lints are run, but the annotations cannot be added to forked repos, so PR diffs cannot be annotated. To enforce the lints, I propose the following changes:

  1. Project-wide deny(clippy::all): This will have clippy error if any of the default warnings is emitted
  2. Project-wide warn(clippy::pedantic) with whitelisting: This will nit-pick things, which is why these are just warnings. Still, I would rather allow specific lints (like I did already) where needed if it is reasonable.
  3. Finally, make the clippy workflow a required pass, so that no new code that doesn't pass the default lints can be merged (I haven't figured out how to do this yet, is this some maintainer setting?)

I think 1) and 3) are needed, 2) is maybe a bit radical. Still, I think it would be a nice addition. Because the annotations are still there for code that is already on this repository, these lints can be fixed when someone is already working on the affected code. Let me know what you think!

src/tui.rs Outdated
@@ -1,3 +1,5 @@
#![allow(clippy::non_ascii_literal)]
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note to self: Move this back into main.rs, because the warning still shows up (probably because the lint is in a macro that gets expanded in main)

@bee-san
Copy link
Member

bee-san commented Oct 19, 2020

Finally, make the clippy workflow a required pass, so that no new code that doesn't pass the default lints can be merged (I haven't figured out how to do this yet, is this some maintainer setting?)

In CI, you just add it normally to either GitHub actions or Travis CI. You have to specify it's unrequired for it to be so. By adding it without specifying, it defaults to required :)

Let me know when you want this merged 👍

Alsssoooo 💖 if you submit a PR that isn't ready, please mark it as a draft 😄

@bee-san bee-san changed the title Better enforce clippy lints WIP Better enforce clippy lints Oct 19, 2020
@niklasmohrin niklasmohrin marked this pull request as draft October 19, 2020 16:55
@niklasmohrin
Copy link
Contributor Author

@bee-san In #287 I just edited the .yml file, none of the entries had any special "required" attribute set, which is why I was so confused, as they all show up as required here 🤔 I also did not untick anything or so. is this in some maintainer settings? I don't really know much about Github workflows

Good to know, elsewhere my PRs get ignored if I don't set them to ready-to-review. which is why I now understand "ready-for-review" more as a "looking for input" than "waiting for merge". Anyway, I am gonna mind that in the future on this repo.

What do you think about clippy::pedantic? Should the warnings stay in?

@bee-san
Copy link
Member

bee-san commented Oct 19, 2020

is this in some maintainer settings? I don't really know much about Github workflows
No, every entry is required unless specified that it isn't. We have no CI that is allowed to fail. It's not a maintainer setting either, it's a tag in the YML file for "allowed to fail" -- but we don't have that so everything in CI is set to be required :)

Project-wide warn(clippy::pedantic) with whitelisting: This will nit-pick things, which is why these are just warnings. Still, I would rather allow specific lints (like I did already) where needed if it is reasonable.

Honestly I'm not sure, I don't know how badly it'll nit-pick things -- what do you think? You are obviously more versed in this than I am 😄

@niklasmohrin
Copy link
Contributor Author

@bee-san This is what cargo clippy outputs (with the two allows from the diff set):

warning: more than 3 bools in a struct
   --> src/input.rs:71:1
    |
71  | / pub struct Opts {
72  | |     /// A list of comma separated CIDRs, IPs, or hosts to be scanned.
73  | |     #[structopt(short, long, use_delimiter = true)]
74  | |     pub addresses: Vec<String>,
...   |
136 | |     pub command: Vec<String>,
137 | | }
    | |_^
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::struct_excessive_bools)]` implied by `#[warn(clippy::pedantic)]`
    = help: consider using a state machine or refactoring bools into two-variant enums
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#struct_excessive_bools

warning: item name ends with its containing module's name
   --> src/scripts/mod.rs:64:1
    |
64  | / pub fn init_scripts(scripts: ScriptsRequired) -> Result<Vec<ScriptFile>> {
65  | |     let mut scripts_to_run: Vec<ScriptFile> = Vec::new();
66  | |
67  | |     match scripts {
...   |
118 | |     }
119 | | }
    | |_^
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::module_name_repetitions)]` implied by `#[warn(clippy::pedantic)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_name_repetitions

warning: item name ends with its containing module's name
   --> src/scripts/mod.rs:121:1
    |
121 | / pub fn parse_scripts(scripts: Vec<PathBuf>) -> Vec<ScriptFile> {
122 | |     let mut parsed_scripts: Vec<ScriptFile> = Vec::with_capacity(scripts.len());
123 | |     for script in scripts {
124 | |         debug!("Parsing script {}", &script.display());
...   |
129 | |     parsed_scripts
130 | | }
    | |_^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_name_repetitions

warning: item name ends with its containing module's name
   --> src/scripts/mod.rs:270:1
    |
270 | / pub fn find_scripts(mut path: PathBuf) -> Result<Vec<PathBuf>> {
271 | |     path.push(".rustscan_scripts");
272 | |     if path.is_dir() {
273 | |         debug!("Scripts folder found {}", &path.display());
...   |
282 | |     }
283 | | }
    | |_^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_name_repetitions

warning: Unnecessary boolean `not` operation
   --> src/main.rs:230:9
    |
230 | /         if !parsed_ips.is_empty() {
231 | |             ips.extend(parsed_ips);
232 | |         } else {
233 | |             unresolved_addresses.push(address);
234 | |         }
    | |_________^
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::if_not_else)]` implied by `#[warn(clippy::pedantic)]`
    = help: remove the `!` and swap the blocks of the `if`/`else`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_not_else

warning: redundant closure found
  --> src/input.rs:44:14
   |
44 |         .map(|x| x.parse::<u16>())
   |              ^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `str::parse`
   |
note: the lint level is defined here
  --> src/main.rs:2:9
   |
2  | #![warn(clippy::pedantic)]
   |         ^^^^^^^^^^^^^^^^
   = note: `#[warn(clippy::redundant_closure_for_method_calls)]` implied by `#[warn(clippy::pedantic)]`
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure_for_method_calls

warning: usage of wildcard import
 --> src/scanner/mod.rs:9:5
  |
9 | use colored::*;
  |     ^^^^^^^^^^ help: try: `colored::Colorize`
  |
note: the lint level is defined here
 --> src/main.rs:2:9
  |
2 | #![warn(clippy::pedantic)]
  |         ^^^^^^^^^^^^^^^^
  = note: `#[warn(clippy::wildcard_imports)]` implied by `#[warn(clippy::pedantic)]`
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wildcard_imports

warning: redundant closure found
  --> src/scanner/mod.rs:52:33
   |
52 |             ips: ips.iter().map(|ip| ip.to_owned()).collect(),
   |                                 ^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `std::borrow::ToOwned::to_owned`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure_for_method_calls

warning: casting `u32` to `u16` may truncate the value
  --> src/port_strategy/range_iterator.rs:63:14
   |
63 |         Some((self.actual_start + current_pick) as u16)
   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
note: the lint level is defined here
  --> src/main.rs:2:9
   |
2  | #![warn(clippy::pedantic)]
   |         ^^^^^^^^^^^^^^^^
   = note: `#[warn(clippy::cast_possible_truncation)]` implied by `#[warn(clippy::pedantic)]`
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_possible_truncation

warning: this argument is passed by value, but not consumed in the function body
  --> src/port_strategy/mod.rs:19:24
   |
19 |     pub fn pick(range: Option<PortRange>, ports: Option<Vec<u16>>, order: ScanOrder) -> Self {
   |                        ^^^^^^^^^^^^^^^^^ help: consider taking a reference instead: `&Option<PortRange>`
   |
note: the lint level is defined here
  --> src/main.rs:2:9
   |
2  | #![warn(clippy::pedantic)]
   |         ^^^^^^^^^^^^^^^^
   = note: `#[warn(clippy::needless_pass_by_value)]` implied by `#[warn(clippy::pedantic)]`
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_pass_by_value

warning: this argument is passed by value, but not consumed in the function body
  --> src/port_strategy/mod.rs:19:75
   |
19 |     pub fn pick(range: Option<PortRange>, ports: Option<Vec<u16>>, order: ScanOrder) -> Self {
   |                                                                           ^^^^^^^^^ help: consider taking a reference instead: `&ScanOrder`
   |
help: consider marking this type as `Copy`
  --> src/input.rs:9:1
   |
9  | / arg_enum! {
10 | |     /// Represents the strategy in which the port scanning will run.
11 | |     ///   - Serial will run from start to end, for example 1 to 1_000.
12 | |     ///   - Random will randomize the order in which ports will be scanned.
...  |
17 | |     }
18 | | }
   | |_^
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_pass_by_value
   = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

warning: redundant closure found
   --> src/scripts/mod.rs:200:18
    |
200 |             .map(|port| port.to_string())
    |                  ^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `std::string::ToString::to_string`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure_for_method_calls

warning: redundant closure found
   --> src/scripts/mod.rs:236:22
    |
236 |                 .map(|arg| arg.to_string())
    |                      ^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `std::string::ToString::to_string`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure_for_method_calls

warning: wildcard match will miss any future added variants
   --> src/scripts/mod.rs:256:17
    |
256 |                 _ => -1,
    |                 ^ help: try this: `subprocess::ExitStatus::Undetermined`
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::match_wildcard_for_single_variants)]` implied by `#[warn(clippy::pedantic)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_wildcard_for_single_variants

warning: casting `u32` to `i32` may wrap around the value
   --> src/scripts/mod.rs:253:42
    |
253 |                 ExitStatus::Exited(c) => c as i32,
    |                                          ^^^^^^^^
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::cast_possible_wrap)]` implied by `#[warn(clippy::pedantic)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_possible_wrap

warning: casting `u8` to `i32` may become silently lossy if you later change the type
   --> src/scripts/mod.rs:254:44
    |
254 |                 ExitStatus::Signaled(c) => c as i32,
    |                                            ^^^^^^^^ help: try: `i32::from(c)`
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::cast_lossless)]` implied by `#[warn(clippy::pedantic)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless

warning: usage of wildcard import
  --> src/main.rs:35:26
   |
35 | use trust_dns_resolver::{config::*, Resolver};
   |                          ^^^^^^^^^ help: try: `config::{ResolverConfig, ResolverOpts}`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wildcard_imports

warning: this function has a large number of lines
   --> src/main.rs:51:1
    |
51  | / fn main() {
52  | |     env_logger::init();
53  | |     let mut benchmarks = Benchmark::init();
54  | |     let mut rustscan_bench = NamedTimer::start("RustScan");
...   |
190 | |     info!("{}", benchmarks.summary());
191 | | }
    | |_^
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::too_many_lines)]` implied by `#[warn(clippy::pedantic)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_lines

warning: it is more concise to loop over references to containers instead of using explicit iteration methods
   --> src/main.rs:127:24
    |
127 |     for (ip, ports) in ports_per_ip.iter_mut() {
    |                        ^^^^^^^^^^^^^^^^^^^^^^^ help: to write this more concisely, try: `&mut ports_per_ip`
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::explicit_iter_loop)]` implied by `#[warn(clippy::pedantic)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_iter_loop

warning: redundant closure found
   --> src/main.rs:128:59
    |
128 |         let vec_str_ports: Vec<String> = ports.iter().map(|port| port.to_string()).collect();
    |                                                           ^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `std::string::ToString::to_string`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure_for_method_calls

warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let`
   --> src/main.rs:315:9
    |
315 | /         match setrlimit(Resource::NOFILE, limit, limit) {
316 | |             Ok(_) => {
317 | |                 detail!(
318 | |                     format!("Automatically increasing ulimit value to {}.", limit),
...   |
329 | |             }
330 | |         }
    | |_________^
    |
note: the lint level is defined here
   --> src/main.rs:2:9
    |
2   | #![warn(clippy::pedantic)]
    |         ^^^^^^^^^^^^^^^^
    = note: `#[warn(clippy::single_match_else)]` implied by `#[warn(clippy::pedantic)]`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match_else
help: try this
    |
315 |         if let Ok(_) = setrlimit(Resource::NOFILE, limit, limit) {
316 |             detail!(
317 |                 format!("Automatically increasing ulimit value to {}.", limit),
318 |                 opts.greppable,
319 |                 opts.accessible
320 |             );
  ...

warning: casting `u64` to `u16` may truncate the value
   --> src/main.rs:371:5
    |
371 |     batch_size as u16
    |     ^^^^^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_possible_truncation

warning: 22 warnings emitted

    Finished dev [unoptimized + debuginfo] target(s) in 0.27s

I think some of these are really high quality messages, but not all of them are helpful. On this output for example, I personally disagree with clippy::if_not_else. I think over time, more allows will accumulate, but I would still keep the rest of them on (I mean look at how great some of these are 😄).


Are you saying that clippy is required right now? Like I said, I just adapted the .yml config to what was already there, but this is what I am seeing under PRs:

image

Am I not getting something here? Workflows are confusing me hard right now .. 🤣

@bee-san
Copy link
Member

bee-san commented Oct 19, 2020

Ah no, you didn't upload the Clippy yml. We have Clippy that doesn't run (cause I commented it out) but it appears in the output. Your PR does not include a new github action for Clippy, so this exact PR's Actions do not include your Action :)

I think originally months ago we had Clippy, but I turned it off because I just wanted to force push out RustScan 1.0 haha!

I can tell you haven't included the GitHub action because of the committed files tab:
https://github.com/RustScan/RustScan/pull/294/files

If you can make a change and add it, that'll be great.

@niklasmohrin
Copy link
Contributor Author

I don't fully understand what you mean, the edits to basic.yml are already merged in #287. I just cannot figure out why some jobs under Continuous integration show up as required and some do not although none of them have anything set where they are defined and I can't find any further references to the workflow elsewhere.

@bee-san
Copy link
Member

bee-san commented Oct 20, 2020

I don't fully understand what you mean, the edits to basic.yml are already merged in #287. I just cannot figure out why some jobs under Continuous integration show up as required and some do not although none of them have anything set where they are defined and I can't find any further references to the workflow elsewhere.

You are right, I have literally no idea why it's not required :(

@niklasmohrin
Copy link
Contributor Author

I think I have finally found something. All CI checks and things like "This branch is out-of-date with the base branch" are called "status checks" (making it rather hard to find the articles when only looking for articles on workflows..). The can be adjusted in the repository settings. Setting them to required can also be done there:

https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/enabling-required-status-checks

On the basic article (https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/about-required-status-checks), it also says that applications with certain access rights can also adjust these settings (including their own), which would explain why some are already required.

It would be nice if you required them from there :) (only if you agree of course)

@bee-san
Copy link
Member

bee-san commented Oct 20, 2020

Wow! I must look like a right idiot! I enabled them, I think you might have to push again to see it? But Clippy is now 100% required!

@niklasmohrin
Copy link
Contributor Author

Nah, I am just as confused by the weird naming 😓 It already shows up here, I will fix some existing warnings before marking ready.

@niklasmohrin
Copy link
Contributor Author

Alright, I fixed every pedantic complaint (including one from nightly 🎉) and I think it is all well now. I also rebased onto the current master.

Somehow there is another clippy status check showing up for me:

image

The "CI / Clippy" one is from my last PR but the just "clippy" one is new (and it does not seem to report back). Is this intended?

@bee-san bee-san changed the title WIP Better enforce clippy lints Better enforce clippy lints Oct 21, 2020
@bee-san bee-san marked this pull request as ready for review October 21, 2020 18:43
@bee-san
Copy link
Member

bee-san commented Oct 21, 2020

I fixed by making it non required. :) Also! If you didn't know, when you are ready for a PR to be submitted unmark it as a draft. Generally:

  • Want comments on your PR but don't want it to be merged? Submit it as a draft and request a code review
  • Want your PR to be merged? Undraft it / submit it normally

😄

Anywhooo~~~~
💖 congrats on this PR getting accepted! :D Thank you so much for fixing all the clippy linting, that must have taken you forever 😅

@bee-san bee-san merged commit f9a7586 into RustScan:master Oct 21, 2020
@niklasmohrin
Copy link
Contributor Author

I was gonna mark it ready once the status thing was talked through, but this is fine too. Fixing was not too bad, as you saw I sometimes just allowed stuff (like main having too many lines).

Contributing here is fun with you guys always responding relatively quickly :)

bee-san added a commit that referenced this pull request Nov 2, 2022
* Bump rlimit from 0.3.0 to 0.4.0

Bumps [rlimit](https://github.com/Nugine/rlimit) from 0.3.0 to 0.4.0.
- [Release notes](https://github.com/Nugine/rlimit/releases)
- [Commits](Nugine/rlimit@v0.3.0...v0.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* Updated README to include instructions on building the new Dockerfile

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* Bump async-std from 1.6.2 to 1.6.3

Bumps [async-std](https://github.com/async-rs/async-std) from 1.6.2 to 1.6.3.
- [Release notes](https://github.com/async-rs/async-std/releases)
- [Changelog](https://github.com/async-rs/async-std/blob/master/CHANGELOG.md)
- [Commits](https://github.com/async-rs/async-std/commits/v1.6.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* docs: fix typo in README.md, link to GitHub flow in contributing doc

* Add host resolution

For now if we can establish a socket on port 80 we can infer the IP of the
host. This might change in the future if we start considering other
ports like 443.

* Updated README to use the rustscan dockerhub alpine image

+ Added another step to clarify process for Docker as the build will fail if the user is not in the downloaded repo

+ DockerHub has CI with master branch and two images tags `latest` and `alpine` where `alpine` is tagged on feature releases (currently 1.7.1)

* Update README to add a disclaimer about the DockerHub Images

+ Instruct user to use the `alpine` image as it's considered the latest major release as per the release page

+ Formatting instructions

* Reduce crate size

* Use absolute image URLs instead of relative

* Add --port and --range options

These options are mutually exclusive, this means that when a user
selects manual ports we will ignore ranges and vice-versa.

Manually specifying ports won't allow scan randomization for now.

* updated config file to feature nmap top 1k ports

* removed -A from nmap

* updated AUR package in readme

* Allow randomized order for manual ports

Before this change we would always scan manually specified ports in
sequential way, this is not the case anymore. This is an important
change since we are planning to introduce a config file with the top 1K
ports and we would like to scan those in a randomized way.

* Reduce binary size from 2.4MB to 1.9MB

By default, Cargo instructs compilation units to be compiled and optimized
in isolation. LTO instructs the linker to optimize at the link stage.
This can, for example, remove dead code and often times reduces binary size.

By default, when Rust code encounters a situation when it must call panic!(),
it unwinds the stack and produces a helpful backtrace. The unwinding code,
however, does require extra binary size. rustc can be instructed to abort
immediately rather than unwind, which removes the need for this extra unwinding code.

For more information see: https://github.com/johnthagen/min-sized-rust

* 2000 milliseconds not seconds

* Bump structopt from 0.3.16 to 0.3.17

Bumps [structopt](https://github.com/TeXitoi/structopt) from 0.3.16 to 0.3.17.
- [Release notes](https://github.com/TeXitoi/structopt/releases)
- [Changelog](https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md)
- [Commits](TeXitoi/structopt@v0.3.16...v0.3.17)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* Fixed small typo in a warning message

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* Convert -T to -t

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* Add Travis configuration to publish doc to GitHub pages

* added submodule

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* 1.8.0 publish

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* Cleanup Dockerfile

* Pin Alpine 3.12 to prevent breakages in the future

* Prevent cache bustages

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* added travis token

* Remove argument placeholders in docker alias

* Mark code blocks as bash commands in README

* Move "rustscan -h" and output together

* updated logo

* Update README.md

* Add Fedora/CentOS installation instructions

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* Add configuration file

This configuration file will be read from the home directory of the
user. Options set within this file will have priority over arguments
from the command line unless the `--no-config` option is passed to the
program.

* Update README.md

Typo fix in the Debian / Kali install section.

* Check '.config/rustscan/config.toml' for config

When reading the config file '$CONFIG_DIR/.config/rustscan/config.toml'
should also be checked. If both '~/.rustscan.toml' and
'$CONFIG_DIR/.config/rustscan/config.toml' exist, then later will be
used.

* Introduce the -no-nmap option

As the name implies this will allow RustScan to to run the scan without
starting an nmap scan with ports that are found.

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* Update FUNDING.yml

* Add CIDR support

Add CIDR support for ips_or_hosts argument. This will allow our users to
specify multiple IPs within a network at once which is pretty
convenient.

* Improved scanner engine to work more efficient and consistent with scanning.

* Small improvement at an if.

* Fix format.

* Remove unnecessary comment.
Fix mistake at adding futures to the initial stream.

* added release drafter

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* Fix incorrect timeout option

* Logic at adding targets to the FuturesUnordered rolled back to the initial.
In case of batchsize higher than all sockets to scan, we could end up in an infinite loop. Fixed with breaking out of the loop if that's the case.

* Introduce SocketIterator

The goal of this iterator is to generate sockets based on combinations
of IPs and ports in a memory-bounded way, we only consume the next item
of this iterator when a socket has been processed by our scanner.

Before this change we were generating every combination of IP and port
and storing it in a VecDeque, and while this is fine for a small subset
of IPs and ports it can quickly get out of hand with multiple IPs and
a big port range.

* Bump serde from 1.0.115 to 1.0.116

Bumps [serde](https://github.com/serde-rs/serde) from 1.0.115 to 1.0.116.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.115...v1.0.116)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* Bump serde_derive from 1.0.115 to 1.0.116

Bumps [serde_derive](https://github.com/serde-rs/serde) from 1.0.115 to 1.0.116.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.115...v1.0.116)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* fixed debug log

* cargo fmt

* Fix behaviour of --no-nmap flag

At some point we forgot to check for this flag before actually running
our post scanning tasks. I've also adjusted some of our messages for
reporting.

* Updated README to reflect v1.8.0 DockerHub tag

v1.8.0 is the most recent published version of RustScan, the alpine tag quickly became depreciated - meaning people had to rely on `latest` to get any features made within the last month.

Version tags will build as per major realease i.e. `v1.9.0`

* Update README.md

Small typos after initial commit to #224

* Bump async-std from 1.6.3 to 1.6.4

Bumps [async-std](https://github.com/async-rs/async-std) from 1.6.3 to 1.6.4.
- [Release notes](https://github.com/async-rs/async-std/releases)
- [Changelog](https://github.com/async-rs/async-std/blob/master/CHANGELOG.md)
- [Commits](async-rs/async-std@v1.6.3...v1.6.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* Runtime measurement implementation, better debugging, and better error handling for unreachable hosts.

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* fix typo

* Added top ports, fixed accessibility. (#230)

* Refactored scanner struct for accessibility, fixed macros

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* fixed accessible issues

* socket_iterator: use itertools.iproducts for ip x ports set (#231)

Replace the current manual iterator-like implementation
with the call to the itertools.iproduct macro
to generate the cartesian product of the IPs and ports.

stdlib reference:
https://docs.rs/itertools/0.9.0/itertools/macro.iproduct.html

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* releasing

* Update README for v1.9.0 release

DockerHub tag for v1.9.0 release has been pushed too

* Update README for v1.9.0 release (#233)

DockerHub tag for v1.9.0 release has been pushed too

* typo in docker instructions

* Refactored test, intorduced default() in test context for structs for easier test writing, Scanner struct quiet changed to greppable. (#235)

* Increase code coverage (#236)

* Updated code coverage

* README updates

* docs: add dmitris as a contributor (#232)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Update Dockerfile to encourage layer caching (#241)

At the moment the Dockerfile brings the entire current directory in as a context for the building container. We can encourage some caching here by only bringing forward the essentials:
`cargo.tml`, `cargo.lock` and the `src`

+ Added a maintainer label

* Fixed output error, Warning! ran when file opened (#237)

Take file of addresses as input

* Bump structopt from 0.3.17 to 0.3.18 (#243)

Bumps [structopt](https://github.com/TeXitoi/structopt) from 0.3.17 to 0.3.18.
- [Release notes](https://github.com/TeXitoi/structopt/releases)
- [Changelog](https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md)
- [Commits](TeXitoi/structopt@v0.3.17...v0.3.18)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Added DNS lookup using Google DNS, refactored IP code (#246)

* Added DNS lookup using Google DNS, refactored IP code

* fixed comments & cargo fmt

* Fixed code review comments, added tests, removed unwrap() panics

* Added assertion to test

* 1.10.0 release

* 1.10.0 release

* building CI

* building CI

* Added HomeBrew Bump + More CI Tests (#252)

* CI and more tests

* included package name

* Update README for instructions for v.10.0 & detail history (#251)

DockerHub now contains every major release from `v1.0.1` to `1.10.0`

Waiting for this README PR to approve before I remove the `v1.9.0` DockerHub tag as it no longer conforms with standards.

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Add integration tests with timeout (#254)

* Add integration tests with timeout

* cargo fmt

* Fix travis command line

* Add extra margins for the timeout values

* Increase the time to scan

Output the time taken after each test

* docs: add bofh69 as a contributor (#256)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Updated the person of README. (#255)

Fixed some minor description corrections in README.

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Update documentation to include greppable (#253)

* Update documentation include greppable

* Replace quiet mode for greppable mode

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Fix cosmetic issues, change maintainer to rustscan (#249)

Changing only a few lines does not give you maintainer. Also people might contact the person if they need to reach out about something which is probably not intended.

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* docs: add mattcorbin as a contributor (#261)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>

* Fix archives-generation from Makefile 👷‍♂️ (#263)

* Bump futures from 0.3.5 to 0.3.6 (#265)

Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.5 to 0.3.6.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.5...0.3.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Bump structopt from 0.3.18 to 0.3.19 (#267)

Bumps [structopt](https://github.com/TeXitoi/structopt) from 0.3.18 to 0.3.19.
- [Release notes](https://github.com/TeXitoi/structopt/releases)
- [Changelog](https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md)
- [Commits](TeXitoi/structopt@v0.3.18...v0.3.19)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Update .SRCINFO url (#268)

Update the .SRCINFO file to point to new repo URL

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* docs: add rootsploit as a contributor (#274)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>

* Bump structopt from 0.3.19 to 0.3.20 (#272)

Bumps [structopt](https://github.com/TeXitoi/structopt) from 0.3.19 to 0.3.20.
- [Release notes](https://github.com/TeXitoi/structopt/releases)
- [Changelog](https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md)
- [Commits](TeXitoi/structopt@v0.3.19...v0.3.20)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Bump toml from 0.5.6 to 0.5.7 (#270)

Bumps [toml](https://github.com/alexcrichton/toml-rs) from 0.5.6 to 0.5.7.
- [Release notes](https://github.com/alexcrichton/toml-rs/releases)
- [Commits](toml-rs/toml-rs@0.5.6...0.5.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Make address an optional instead of a positional argument (#271)

This has the benefit of making the input flexible and fixing an existing
bug that happens when a single port is specified, see #211.

Other benefits:
  - We are now parsing only failures as a file, reducing the amount of
    attempts to open a file.
  - We check if a file exists before trying to open it.

Fixes #211

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* docs: add eiffel-fl as a contributor (#281)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>

* docs: add niklasmohrin as a contributor (#282)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>

* Add tries to scan_socket. (#266)

By default the number of try is 1, it can be set on the command line by using
--tries option.

This should close #38.

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Bump serde from 1.0.116 to 1.0.117 (#278)

Bumps [serde](https://github.com/serde-rs/serde) from 1.0.116 to 1.0.117.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.116...v1.0.117)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Fix Rlimit breaking change. (#283) (#284)

* Replace rlimit::rlim with rlimit::RawRlim

Signed-off-by: u5surf <u5.horie@gmail.com>

* docs: add u5surf as a contributor (#285)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Scripting Engine Implementation.

* Fix clippy warnings around match expressions

* Fix clippy warnings about syntax

* Fix clippy warnings around return statements that could just be expressions

* Fix clippy warnings around under-specific method calls

* Add clippy workflow

* Additional small if let refactors

* docs: add niklasmohrin as a contributor (#288)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Add tests for rustscan scripting engine (#286) (#289)

* Add tests for rustscan scripting engine (#286)

* Increase test coverage

* Add more scripting tests

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* docs: add okrplay as a contributor (#290)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>

* Bump env_logger from 0.7.1 to 0.8.1 (#295)

Bumps [env_logger](https://github.com/env-logger-rs/env_logger) from 0.7.1 to 0.8.1.
- [Release notes](https://github.com/env-logger-rs/env_logger/releases)
- [Changelog](https://github.com/env-logger-rs/env_logger/blob/master/CHANGELOG.md)
- [Commits](rust-cli/env_logger@v0.7.1...v0.8.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Add some instructions to create contributing development environment. (#298)

A new Dockerfile "contributing.Dockerfile" was added.
This Dockerfile permits creating a "ready to develop" container image to ease
contributing to RustScan.
The instructions to use it are detailed in contributing.md.

* Better enforce clippy lints (#294)

* Clippy deny default lints and warn for clippy::pedantic

* Fix all existing pedantic clippy lints on stable and nightly

* Improve error handling in scripts init (#300)

* Changed the dns resolving to use std::net::ToSocketAddrs (#264)

* Changed dns resolving library to to_socket_addrs and removed the usage of trust-dns

* Reverted automatic IDE spacing

* Ran cargo fmt on the code

* Made trust-dns a fallback dns resolver and reverted cargo toml and lock

* Reverted cargo.lock

* Ran cargo fmt

* Changed style of err checking

* Fixed errors

* Fixed merging errors

* Changed for CR

Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Bump futures from 0.3.6 to 0.3.7 (#302)

Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.6 to 0.3.7.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.6...0.3.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Redesign of README (#293)

Updated README

Co-authored-by: bee <bee@pop-os.localdomain>

* Bump async-std from 1.6.5 to 1.7.0 (#306)

Bumps [async-std](https://github.com/async-rs/async-std) from 1.6.5 to 1.7.0.
- [Release notes](https://github.com/async-rs/async-std/releases)
- [Changelog](https://github.com/async-rs/async-std/blob/master/CHANGELOG.md)
- [Commits](async-rs/async-std@v1.6.5...v1.7.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* Bump anyhow from 1.0.33 to 1.0.34 (#304)

Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.33 to 1.0.34.
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](dtolnay/anyhow@1.0.33...1.0.34)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>

* cargo.lock

* 2.0

* Delete bump.yml

* update logo

* fixing cargo lock

* Bump env_logger from 0.8.1 to 0.8.2 (#317)

Bumps [env_logger](https://github.com/env-logger-rs/env_logger) from 0.8.1 to 0.8.2.
- [Release notes](https://github.com/env-logger-rs/env_logger/releases)
- [Changelog](https://github.com/env-logger-rs/env_logger/blob/master/CHANGELOG.md)
- [Commits](rust-cli/env_logger@v0.8.1...v0.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Scripting engine extra user argument interpretation error fixed. Scanner engine errors and error handling clarified. (#325)

* Update README.md

* Partially fix #362: Fix examples (#363)

Include -a to specify addresses

* Bump serde from 1.0.117 to 1.0.124 (#361)

Bumps [serde](https://github.com/serde-rs/serde) from 1.0.117 to 1.0.124.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.117...v1.0.124)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Bump anyhow from 1.0.34 to 1.0.40 (#368)

Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.34 to 1.0.40.
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](dtolnay/anyhow@1.0.34...1.0.40)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Bump cidr-utils from 0.5.0 to 0.5.1 (#367)

Bumps [cidr-utils](https://github.com/magiclen/cidr-utils) from 0.5.0 to 0.5.1.
- [Release notes](https://github.com/magiclen/cidr-utils/releases)
- [Commits](magiclen/cidr-utils@v0.5.0...v0.5.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Brandon <github@skerritt.blog>

* Bump rlimit from 0.5.2 to 0.5.4 (#360)

Bumps [rlimit](https://github.com/Nugine/rlimit) from 0.5.2 to 0.5.4.
- [Release notes](https://github.com/Nugine/rlimit/releases)
- [Commits](Nugine/rlimit@v0.5.2...v0.5.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Brandon <github@skerritt.blog>

* Bump futures from 0.3.7 to 0.3.13 (#358)

Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.7 to 0.3.13.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.7...0.3.13)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Brandon <github@skerritt.blog>

* Update tui.rs (#396)

added a quote

* Update Cargo.lock file to support latest version of Rust (#435)

* 2.1.0 release

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
Signed-off-by: u5surf <u5.horie@gmail.com>
Co-authored-by: Bernardo Araujo <bernardo.amc@gmail.com>
Co-authored-by: Brandon <10378052+brandonskerritt@users.noreply.github.com>
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Ben (CMNatic) <ben@cmnatic.co.uk>
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: andy5995 <andy400-dev@yahoo.com>
Co-authored-by: Spenser Black <spenserblack01@gmail.com>
Co-authored-by: Brandon <brandonskerritt51@gmail.com>
Co-authored-by: Phenomite <8285537+Phenomite@users.noreply.github.com>
Co-authored-by: Ferry <alessandroferry@protonmail.com>
Co-authored-by: Sandro Jäckel <sandro.jaeckel@gmail.com>
Co-authored-by: remigourdon <gourdon.remi@gmail.com>
Co-authored-by: Niklas Mohrin <47574893+niklasmohrin@users.noreply.github.com>
Co-authored-by: Artem Polishchuk <tim77@users.noreply.github.com>
Co-authored-by: Gabriel <26032081+usrGabriel@users.noreply.github.com>
Co-authored-by: mulc <buermarc2@gmail.com>
Co-authored-by: Bee <10378052+bee-san@users.noreply.github.com>
Co-authored-by: bergabman <bergabman@protonmail.com>
Co-authored-by: Martin Chrástek <chrastek12@gmail.com>
Co-authored-by: Dmitry Savintsev <dmitris@users.noreply.github.com>
Co-authored-by: bergabman <44554109+bergabman@users.noreply.github.com>
Co-authored-by: Sebastian Andersson <sebastian@bittr.nu>
Co-authored-by: Hardeep Singh <54495695+holmes-py@users.noreply.github.com>
Co-authored-by: Teofilo Monteiro <teofilojmmonteiro@gmail.com>
Co-authored-by: Thomas Gotwig <tgotwig@gmail.com>
Co-authored-by: Frederik B <freddyb@users.noreply.github.com>
Co-authored-by: eiffel-fl <laniel_francis@privacyrequired.com>
Co-authored-by: Y.Horie <u5.horie@gmail.com>
Co-authored-by: Niklas Mohrin <niklas.mohrin@gmail.com>
Co-authored-by: Oskar <32576280+okrplay@users.noreply.github.com>
Co-authored-by: shahar481 <45289173+shahar481@users.noreply.github.com>
Co-authored-by: bee <bee@pop-os.localdomain>
Co-authored-by: Brandon <github@skerritt.blog>
Co-authored-by: Thomas de Queiroz Barros <38295417+thomasqueirozb@users.noreply.github.com>
Co-authored-by: Ryan Montgomery <44453666+0dayCTF@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants