Clippy fixes.

This commit is contained in:
Eduard Tolosa 2025-04-20 14:47:21 -05:00
parent 482b6f6e21
commit d72e115859
9 changed files with 51 additions and 47 deletions

View file

@ -11,6 +11,7 @@ use {
}; };
#[allow(clippy::cognitive_complexity)] #[allow(clippy::cognitive_complexity)]
#[must_use]
pub fn get_args() -> Args { pub fn get_args() -> Args {
let yaml = load_yaml!("cli.yml"); let yaml = load_yaml!("cli.yml");
let matches = App::from_yaml(yaml) let matches = App::from_yaml(yaml)

View file

@ -1,5 +1,8 @@
use { use {
crate::{errors::*, structs::Args}, crate::{
errors::{Result, ResultExt},
structs::Args,
},
log::error, log::error,
prettytable::Table, prettytable::Table,
std::{ std::{
@ -10,6 +13,7 @@ use {
}, },
}; };
#[must_use]
pub fn return_file_targets(args: &Args, mut files: Vec<String>) -> Vec<String> { pub fn return_file_targets(args: &Args, mut files: Vec<String>) -> Vec<String> {
let mut targets: Vec<String> = Vec::new(); let mut targets: Vec<String> = Vec::new();
files.sort(); files.sort();
@ -23,13 +27,10 @@ pub fn return_file_targets(args: &Args, mut files: Vec<String>) -> Vec<String> {
} }
Err(e) => { Err(e) => {
if args.files.len() == 1 { if args.files.len() == 1 {
error!("Can not open file {}. Error: {}\n", f, e); error!("Can not open file {f}. Error: {e}\n");
std::process::exit(1) std::process::exit(1)
} else if !args.quiet_flag { } else if !args.quiet_flag {
error!( error!("Can not open file {f}, working with next file. Error: {e}\n");
"Can not open file {}, working with next file. Error: {}\n",
f, e
);
} }
} }
} }
@ -44,6 +45,7 @@ pub fn table_to_file(table: &Table, file_name: Option<std::fs::File>) -> Result<
Ok(()) Ok(())
} }
#[must_use]
pub fn return_output_file(args: &Args) -> Option<File> { pub fn return_output_file(args: &Args) -> Option<File> {
if args.file_name.is_empty() || !args.with_output { if args.file_name.is_empty() || !args.with_output {
None None
@ -59,6 +61,7 @@ pub fn return_output_file(args: &Args) -> Option<File> {
} }
} }
#[must_use]
pub fn check_full_path(full_path: &str) -> bool { pub fn check_full_path(full_path: &str) -> bool {
(Path::new(full_path).exists() && Path::new(full_path).is_dir()) (Path::new(full_path).exists() && Path::new(full_path).is_dir())
|| fs::create_dir_all(full_path).is_ok() || fs::create_dir_all(full_path).is_ok()
@ -68,7 +71,7 @@ pub fn delete_files(paths: &HashSet<String>) {
for file in paths { for file in paths {
if Path::new(&file).exists() { if Path::new(&file).exists() {
match std::fs::remove_file(file) { match std::fs::remove_file(file) {
Ok(_) => (), Ok(()) => (),
Err(e) => error!("Error deleting the file {}. Description: {}", &file, e), Err(e) => error!("Error deleting the file {}. Description: {}", &file, e),
} }
} }

View file

@ -21,10 +21,10 @@ impl Log for SimpleLogger {
} }
fn log(&self, record: &Record) { fn log(&self, record: &Record) {
let target = if !record.target().is_empty() { let target = if record.target().is_empty() {
record.target()
} else {
record.module_path().unwrap_or_default() record.module_path().unwrap_or_default()
} else {
record.target()
}; };
if target.contains("unimap") && self.enabled(record.metadata()) { if target.contains("unimap") && self.enabled(record.metadata()) {
let level_string = { let level_string = {

View file

@ -1,27 +1,27 @@
use { use {
log::{error, Level}, log::{error, Level},
std::{collections::HashSet, iter::FromIterator}, std::{collections::HashSet, iter::FromIterator},
unimap::{args, errors::*, files::return_file_targets, logger, misc, resolver_engine}, unimap::{args, errors::Result, files::return_file_targets, logger, misc, resolver_engine},
}; };
fn run() -> Result<()> { fn run() -> Result<()> {
if std::env::var("UNIMAP_LOG_LEVEL").is_ok() { if std::env::var("UNIMAP_LOG_LEVEL").is_ok() {
logger::init_by_env() logger::init_by_env();
} else { } else {
logger::init_with_level(Level::Info).unwrap() logger::init_with_level(Level::Info).unwrap();
} }
let mut arguments = args::get_args(); let mut arguments = args::get_args();
if !arguments.files.is_empty() { if !arguments.files.is_empty() {
arguments.targets = arguments.targets =
HashSet::from_iter(return_file_targets(&arguments, arguments.files.clone())) HashSet::from_iter(return_file_targets(&arguments, arguments.files.clone()));
} else if !arguments.target.is_empty() { } else if !arguments.target.is_empty() {
arguments.targets.insert(arguments.target.clone()); arguments.targets.insert(arguments.target.clone());
} else { } else {
arguments.targets = misc::read_stdin() arguments.targets = misc::read_stdin();
} }
if arguments.targets.len() < 50 { if arguments.targets.len() < 50 {
arguments.threads = arguments.targets.len() arguments.threads = arguments.targets.len();
} }
rayon::ThreadPoolBuilder::new() rayon::ThreadPoolBuilder::new()
@ -29,19 +29,19 @@ fn run() -> Result<()> {
.build_global() .build_global()
.unwrap(); .unwrap();
if !arguments.targets.is_empty() { if arguments.targets.is_empty() {
resolver_engine::parallel_resolver_all(&mut arguments)
} else {
error!("Error: Target is empty or invalid!\n"); error!("Error: Target is empty or invalid!\n");
std::process::exit(1) std::process::exit(1)
} else {
resolver_engine::parallel_resolver_all(&mut arguments)
} }
} }
fn main() { fn main() {
if let Err(err) = run() { if let Err(err) = run() {
error!("Error: {}", err); error!("Error: {err}");
for cause in err.iter_chain().skip(1) { for cause in err.iter_chain().skip(1) {
error!("Error description: {}\n", cause); error!("Error description: {cause}\n");
} }
std::process::exit(1); std::process::exit(1);
} }

View file

@ -3,6 +3,7 @@ use std::{
io::{self, Read}, io::{self, Read},
}; };
#[must_use]
pub fn sanitize_target_string(target: String) -> String { pub fn sanitize_target_string(target: String) -> String {
target target
.replace("www.", "") .replace("www.", "")

View file

@ -10,7 +10,7 @@ use {
pub fn get_records(resolver: &Resolver, domain: &str) -> String { pub fn get_records(resolver: &Resolver, domain: &str) -> String {
if let Ok(ips) = resolver.ipv4_lookup(domain) { if let Ok(ips) = resolver.ipv4_lookup(domain) {
ips.iter() ips.iter()
.map(|x| x.to_string()) .map(std::string::ToString::to_string)
.next() .next()
.expect("Failed to get IPV4.") .expect("Failed to get IPV4.")
} else { } else {

View file

@ -132,17 +132,17 @@ pub fn get_nmap_data(
]; ];
if !min_rate.is_empty() { if !min_rate.is_empty() {
nmap_args.append(&mut vec!["--min-rate", &min_rate]) nmap_args.append(&mut vec!["--min-rate", &min_rate]);
} }
if fast_scan { if fast_scan {
nmap_args.append(&mut vec!["--host-timeout", "20m"]) nmap_args.append(&mut vec!["--host-timeout", "20m"]);
} else { } else {
nmap_args.append(&mut vec!["-sV"]) nmap_args.append(&mut vec!["-sV"]);
} }
if !ports.is_empty() { if !ports.is_empty() {
nmap_args.append(&mut vec!["-p", ports]) nmap_args.append(&mut vec!["-p", ports]);
} }
nmap_args.push(host); nmap_args.push(host);
@ -159,8 +159,7 @@ pub fn get_nmap_data(
} }
Err(e) => { Err(e) => {
error!( error!(
"Error waiting command to finish for {}, continuing with remaining hosts. Description: {}", "Error waiting command to finish for {host}, continuing with remaining hosts. Description: {e}"
host, e
); );
Ok(Nmaprun::default()) Ok(Nmaprun::default())
} }

View file

@ -1,7 +1,7 @@
use { use {
crate::{ crate::{
args, args,
errors::*, errors::Result,
files, logic, networking, files, logic, networking,
nmap::{self, Nmaprun}, nmap::{self, Nmaprun},
structs::{Args, ResolvData}, structs::{Args, ResolvData},
@ -30,7 +30,7 @@ lazy_static! {
match r.parse::<Ipv4Addr>() { match r.parse::<Ipv4Addr>() {
Ok(ip) => resolver_ips.push(ip), Ok(ip) => resolver_ips.push(ip),
Err(e) => { Err(e) => {
error!("Error parsing the {} IP from resolvers file to IP address. Please check and try again. Error: {}\n", r, e); error!("Error parsing the {r} IP from resolvers file to IP address. Please check and try again. Error: {e}\n");
std::process::exit(1) std::process::exit(1)
} }
} }
@ -40,7 +40,7 @@ lazy_static! {
match r.parse::<Ipv4Addr>() { match r.parse::<Ipv4Addr>() {
Ok(ip) => resolver_ips.push(ip), Ok(ip) => resolver_ips.push(ip),
Err(e) => { Err(e) => {
error!("Error parsing the {} IP from resolvers file to IP address. Please check and try again. Error: {}\n", r, e); error!("Error parsing the {r} IP from resolvers file to IP address. Please check and try again. Error: {e}\n");
std::process::exit(1) std::process::exit(1)
} }
} }
@ -51,13 +51,16 @@ lazy_static! {
} }
pub fn parallel_resolver_all(args: &mut Args) -> Result<()> { pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
files::check_full_path(&args.logs_dir); if !files::check_full_path(&args.logs_dir) {
error!("The logs directory {} does not exist.\n", args.logs_dir);
std::process::exit(1)
}
if !args.quiet_flag { if !args.quiet_flag {
info!( info!(
"Performing parallel resolution for {} targets with {} threads, it will take a while...\n", "Performing parallel resolution for {} targets with {} threads, it will take a while...\n",
args.targets.len(), args.threads args.targets.len(), args.threads
) );
} }
let opts = ResolverOpts { let opts = ResolverOpts {
@ -79,9 +82,9 @@ pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
"SERVICES" "SERVICES"
]); ]);
if args.raw_output && !args.quiet_flag { if args.raw_output && !args.quiet_flag {
println!("HOST,IP,PORT,SERVICE,VERSION,PRODUCT,OS,EXTRAINFO") println!("HOST,IP,PORT,SERVICE,VERSION,PRODUCT,OS,EXTRAINFO");
} else if args.url_output && !args.quiet_flag { } else if args.url_output && !args.quiet_flag {
println!("HOST:IP") println!("HOST:IP");
} }
for (target, resolv_data) in &data { for (target, resolv_data) in &data {
if !resolv_data.ip.is_empty() { if !resolv_data.ip.is_empty() {
@ -120,11 +123,11 @@ pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
.extrainfo .extrainfo
.clone() .clone()
.unwrap_or_else(|| "NULL".to_string()) .unwrap_or_else(|| "NULL".to_string())
) );
} }
} else if args.url_output { } else if args.url_output {
for port_data in &resolv_data.ports_data { for port_data in &resolv_data.ports_data {
println!("{}:{}", target, port_data.portid) println!("{}:{}", target, port_data.portid);
} }
} else { } else {
let mut services_table = Table::new(); let mut services_table = Table::new();
@ -179,7 +182,7 @@ pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
error!( error!(
"An error occurred while writing the output file {}.\n", "An error occurred while writing the output file {}.\n",
args.file_name args.file_name
) );
} }
if !args.quiet_flag && !args.raw_output && !args.url_output { if !args.quiet_flag && !args.raw_output && !args.url_output {
table.printstd(); table.printstd();
@ -206,7 +209,7 @@ fn parallel_resolver_engine(
let resolv_data: HashMap<String, ResolvData> = targets let resolv_data: HashMap<String, ResolvData> = targets
.par_iter() .par_iter()
.map(|target| { .map(|target| {
let fqdn_target = format!("{}.", target); let fqdn_target = format!("{target}.");
let mut resolv_data = ResolvData::default(); let mut resolv_data = ResolvData::default();
resolv_data.ip = networking::get_records(&resolver, &fqdn_target); resolv_data.ip = networking::get_records(&resolver, &fqdn_target);
(target.to_owned(), resolv_data) (target.to_owned(), resolv_data)
@ -227,10 +230,7 @@ fn parallel_resolver_engine(
}); });
if nmap_ips.is_empty() { if nmap_ips.is_empty() {
error!( error!("No valid IPs found for scanning. IPs found: {nmap_ips_orig:?}\n");
"No valid IPs found for scanning. IPs found: {:?}\n",
nmap_ips_orig
);
std::process::exit(1) std::process::exit(1)
} else { } else {
let nmap_data: HashMap<String, Nmaprun> = nmap_ips let nmap_data: HashMap<String, Nmaprun> = nmap_ips
@ -254,7 +254,7 @@ fn parallel_resolver_engine(
.port .port
.retain(|f| f.state.state == "open"); .retain(|f| f.state.state == "open");
if args.no_keep_nmap_logs && std::fs::remove_file(&filename).is_err() { if args.no_keep_nmap_logs && std::fs::remove_file(&filename).is_err() {
error!("Error removing filename {}.", &filename) error!("Error removing filename {}.", &filename);
} }
(ip.clone(), nmap_data) (ip.clone(), nmap_data)
} }
@ -268,7 +268,7 @@ fn parallel_resolver_engine(
// Delete the args.logs_dir directory if it's empty // Delete the args.logs_dir directory if it's empty
if args.no_keep_nmap_logs && std::fs::remove_dir(&args.logs_dir).is_err() { if args.no_keep_nmap_logs && std::fs::remove_dir(&args.logs_dir).is_err() {
error!("Error removing directory {}.", &args.logs_dir) error!("Error removing directory {}.", &args.logs_dir);
} }
resolv_data resolv_data

View file

@ -35,8 +35,8 @@ pub struct ResolvData {
pub ports_data: Vec<Port>, pub ports_data: Vec<Port>,
} }
impl ResolvData { impl ResolvData {
pub fn default() -> ResolvData { pub const fn default() -> Self {
ResolvData { Self {
ip: String::new(), ip: String::new(),
ports_data: Vec::new(), ports_data: Vec::new(),
} }