Fix/fix clippy warn (#434)
- Fixed following Clippy Warnings(previous warning count: 671 -> after: 4) - clippy::needless_return - clippy::println_empty_string - clippy::redundant_field_names - clippy::single_char_pattern - clippy::len_zero - clippy::iter_nth_zero - clippy::bool_comparison - clippy::question_mark - clippy::needless_collect - clippy::unnecessary_unwrap - clippy::ptr_arg - clippy::needless_collect - clippy::needless_borrow - clippy::new_without_default - clippy::assign_op_pattern - clippy::bool_assert_comparison - clippy::into_iter_on_ref - clippy::deref_addrof - clippy::while_let_on_iterator - clippy::match_like_matches_macro - clippy::or_fun_call - clippy::useless_conversion - clippy::let_and_return - clippy::redundant_clone - clippy::redundant_closure - clippy::cmp_owned - clippy::upper_case_acronyms - clippy::map_identity - clippy::unused_io_amount - clippy::assertions_on_constants - clippy::op_ref - clippy::useless_vec - clippy::vec_init_then_push - clippy::useless_format - clippy::bind_instead_of_map - clippy::bool_comparison - clippy::clone_on_copy - clippy::too_many_arguments - clippy::module_inception - fixed clippy::needless_lifetimes - fixed clippy::borrowed_box (Thanks for helping by hach1yon!)
This commit is contained in:
@@ -19,25 +19,25 @@ use std::string::String;
|
||||
|
||||
use super::detection::EvtxRecordInfo;
|
||||
|
||||
pub fn concat_selection_key(key_list: &Vec<String>) -> String {
|
||||
pub fn concat_selection_key(key_list: &[String]) -> String {
|
||||
return key_list
|
||||
.iter()
|
||||
.fold("detection -> selection".to_string(), |mut acc, cur| {
|
||||
acc = acc + " -> " + cur;
|
||||
return acc;
|
||||
acc
|
||||
});
|
||||
}
|
||||
|
||||
pub fn check_regex(string: &str, regex_list: &Vec<Regex>) -> bool {
|
||||
pub fn check_regex(string: &str, regex_list: &[Regex]) -> bool {
|
||||
for regex in regex_list {
|
||||
if regex.is_match(string) == false {
|
||||
if !regex.is_match(string) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
false
|
||||
}
|
||||
|
||||
/// replace string from all defined regex in input to replace_str
|
||||
@@ -45,9 +45,7 @@ pub fn replace_target_character<'a>(
|
||||
input_str: Option<&'a String>,
|
||||
replace_rule: Option<&'a DataFilterRule>,
|
||||
) -> Option<String> {
|
||||
if input_str.is_none() {
|
||||
return None;
|
||||
}
|
||||
input_str?;
|
||||
if replace_rule.is_none() {
|
||||
return Some(input_str.unwrap().to_string());
|
||||
}
|
||||
@@ -55,32 +53,32 @@ pub fn replace_target_character<'a>(
|
||||
let replace_regex_rule = &replace_rule.unwrap().regex_rule;
|
||||
let replace_str = &replace_rule.unwrap().replace_str;
|
||||
|
||||
return Some(
|
||||
Some(
|
||||
replace_regex_rule
|
||||
.replace_all(input_str.unwrap(), replace_str)
|
||||
.to_string(),
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
pub fn check_allowlist(target: &str, regexes: &Vec<Regex>) -> bool {
|
||||
pub fn check_allowlist(target: &str, regexes: &[Regex]) -> bool {
|
||||
for regex in regexes {
|
||||
if regex.is_match(target) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
false
|
||||
}
|
||||
|
||||
pub fn value_to_string(value: &Value) -> Option<String> {
|
||||
return match value {
|
||||
match value {
|
||||
Value::Null => Option::None,
|
||||
Value::Bool(b) => Option::Some(b.to_string()),
|
||||
Value::Number(n) => Option::Some(n.to_string()),
|
||||
Value::String(s) => Option::Some(s.to_string()),
|
||||
Value::Array(_) => Option::None,
|
||||
Value::Object(_) => Option::None,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
pub fn read_txt(filename: &str) -> Result<Vec<String>, String> {
|
||||
@@ -90,12 +88,12 @@ pub fn read_txt(filename: &str) -> Result<Vec<String>, String> {
|
||||
return Result::Err(errmsg);
|
||||
}
|
||||
let reader = BufReader::new(f.unwrap());
|
||||
return Result::Ok(
|
||||
Result::Ok(
|
||||
reader
|
||||
.lines()
|
||||
.map(|line| line.unwrap_or(String::default()))
|
||||
.map(|line| line.unwrap_or_default())
|
||||
.collect(),
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
pub fn read_csv(filename: &str) -> Result<Vec<Vec<String>>, String> {
|
||||
@@ -106,8 +104,8 @@ pub fn read_csv(filename: &str) -> Result<Vec<Vec<String>>, String> {
|
||||
let mut contents: String = String::new();
|
||||
let mut ret = vec![];
|
||||
let read_res = f.unwrap().read_to_string(&mut contents);
|
||||
if read_res.is_err() {
|
||||
return Result::Err(read_res.unwrap_err().to_string());
|
||||
if let Err(e) = read_res {
|
||||
return Result::Err(e.to_string());
|
||||
}
|
||||
|
||||
let mut rdr = csv::Reader::from_reader(contents.as_bytes());
|
||||
@@ -122,19 +120,19 @@ pub fn read_csv(filename: &str) -> Result<Vec<Vec<String>>, String> {
|
||||
ret.push(v);
|
||||
});
|
||||
|
||||
return Result::Ok(ret);
|
||||
Result::Ok(ret)
|
||||
}
|
||||
|
||||
pub fn is_target_event_id(s: &String) -> bool {
|
||||
return configs::CONFIG.read().unwrap().target_eventids.is_target(s);
|
||||
pub fn is_target_event_id(s: &str) -> bool {
|
||||
configs::CONFIG.read().unwrap().target_eventids.is_target(s)
|
||||
}
|
||||
|
||||
pub fn get_event_id_key() -> String {
|
||||
return "Event.System.EventID".to_string();
|
||||
"Event.System.EventID".to_string()
|
||||
}
|
||||
|
||||
pub fn get_event_time() -> String {
|
||||
return "Event.System.TimeCreated_attributes.SystemTime".to_string();
|
||||
"Event.System.TimeCreated_attributes.SystemTime".to_string()
|
||||
}
|
||||
|
||||
pub fn str_time_to_datetime(system_time_str: &str) -> Option<DateTime<Utc>> {
|
||||
@@ -146,30 +144,24 @@ pub fn str_time_to_datetime(system_time_str: &str) -> Option<DateTime<Utc>> {
|
||||
if rfc3339_time.is_err() {
|
||||
return Option::None;
|
||||
}
|
||||
let datetime = Utc
|
||||
.from_local_datetime(&rfc3339_time.unwrap().naive_utc())
|
||||
.single();
|
||||
if datetime.is_none() {
|
||||
return Option::None;
|
||||
} else {
|
||||
return Option::Some(datetime.unwrap());
|
||||
}
|
||||
Utc.from_local_datetime(&rfc3339_time.unwrap().naive_utc())
|
||||
.single()
|
||||
}
|
||||
|
||||
/// serde:Valueの型を確認し、文字列を返します。
|
||||
pub fn get_serde_number_to_string(value: &serde_json::Value) -> Option<String> {
|
||||
if value.is_string() {
|
||||
return Option::Some(value.as_str().unwrap_or("").to_string());
|
||||
Option::Some(value.as_str().unwrap_or("").to_string())
|
||||
} else if value.is_object() {
|
||||
// Object type is not specified record value.
|
||||
return Option::None;
|
||||
Option::None
|
||||
} else {
|
||||
return Option::Some(value.to_string());
|
||||
Option::Some(value.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_event_value<'a>(key: &String, event_value: &'a Value) -> Option<&'a Value> {
|
||||
if key.len() == 0 {
|
||||
pub fn get_event_value<'a>(key: &str, event_value: &'a Value) -> Option<&'a Value> {
|
||||
if key.is_empty() {
|
||||
return Option::None;
|
||||
}
|
||||
|
||||
@@ -180,28 +172,28 @@ pub fn get_event_value<'a>(key: &String, event_value: &'a Value) -> Option<&'a V
|
||||
let splits = configs::EVENTKEY_ALIAS.get_event_key_split(key);
|
||||
let mut start_idx = 0;
|
||||
for key in splits.unwrap() {
|
||||
if ret.is_object() == false {
|
||||
if !ret.is_object() {
|
||||
return Option::None;
|
||||
}
|
||||
|
||||
let val = &event_key[start_idx..(*key + start_idx)];
|
||||
ret = &ret[val];
|
||||
start_idx = *key + start_idx;
|
||||
start_idx += *key;
|
||||
start_idx += 1;
|
||||
}
|
||||
|
||||
return Option::Some(ret);
|
||||
Option::Some(ret)
|
||||
} else {
|
||||
let mut ret: &Value = event_value;
|
||||
let event_key = key;
|
||||
for key in event_key.split(".") {
|
||||
if ret.is_object() == false {
|
||||
for key in event_key.split('.') {
|
||||
if !ret.is_object() {
|
||||
return Option::None;
|
||||
}
|
||||
ret = &ret[key];
|
||||
}
|
||||
|
||||
return Option::Some(ret);
|
||||
Option::Some(ret)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,20 +203,20 @@ pub fn get_thread_num() -> usize {
|
||||
let threadnum = &conf
|
||||
.args
|
||||
.value_of("thread-number")
|
||||
.unwrap_or(def_thread_num_str.as_str());
|
||||
return threadnum.parse::<usize>().unwrap().clone();
|
||||
.unwrap_or_else(|| def_thread_num_str.as_str());
|
||||
threadnum.parse::<usize>().unwrap()
|
||||
}
|
||||
|
||||
pub fn create_tokio_runtime() -> Runtime {
|
||||
return Builder::new_multi_thread()
|
||||
Builder::new_multi_thread()
|
||||
.worker_threads(get_thread_num())
|
||||
.thread_name("yea-thread")
|
||||
.build()
|
||||
.unwrap();
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
// EvtxRecordInfoを作成します。
|
||||
pub fn create_rec_info(data: Value, path: String, keys: &Vec<String>) -> EvtxRecordInfo {
|
||||
pub fn create_rec_info(data: Value, path: String, keys: &[String]) -> EvtxRecordInfo {
|
||||
// EvtxRecordInfoを作る
|
||||
let data_str = data.to_string();
|
||||
let mut rec = EvtxRecordInfo {
|
||||
@@ -255,7 +247,7 @@ pub fn create_rec_info(data: Value, path: String, keys: &Vec<String>) -> EvtxRec
|
||||
rec.key_2_value.insert(key.to_string(), val.unwrap());
|
||||
}
|
||||
|
||||
return rec;
|
||||
rec
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -267,30 +259,32 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_check_regex() {
|
||||
let regexes = utils::read_txt("./rules/config/regex/detectlist_suspicous_services.txt")
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|regex_str| Regex::new(®ex_str).unwrap())
|
||||
.collect();
|
||||
let regexes: Vec<Regex> =
|
||||
utils::read_txt("./rules/config/regex/detectlist_suspicous_services.txt")
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|regex_str| Regex::new(®ex_str).unwrap())
|
||||
.collect();
|
||||
let regextext = utils::check_regex("\\cvtres.exe", ®exes);
|
||||
assert!(regextext == true);
|
||||
assert!(regextext);
|
||||
|
||||
let regextext = utils::check_regex("\\hogehoge.exe", ®exes);
|
||||
assert!(regextext == false);
|
||||
assert!(!regextext);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_check_allowlist() {
|
||||
let commandline = "\"C:\\Program Files\\Google\\Update\\GoogleUpdate.exe\"";
|
||||
let allowlist = utils::read_txt("./rules/config/regex/allowlist_legitimate_services.txt")
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|allow_str| Regex::new(&allow_str).unwrap())
|
||||
.collect();
|
||||
assert!(true == utils::check_allowlist(commandline, &allowlist));
|
||||
let allowlist: Vec<Regex> =
|
||||
utils::read_txt("./rules/config/regex/allowlist_legitimate_services.txt")
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|allow_str| Regex::new(&allow_str).unwrap())
|
||||
.collect();
|
||||
assert!(utils::check_allowlist(commandline, &allowlist));
|
||||
|
||||
let commandline = "\"C:\\Program Files\\Google\\Update\\GoogleUpdate2.exe\"";
|
||||
assert!(false == utils::check_allowlist(commandline, &allowlist));
|
||||
assert!(!utils::check_allowlist(commandline, &allowlist));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -360,15 +354,9 @@ mod tests {
|
||||
};
|
||||
let none_test_str: Option<&String> = None;
|
||||
|
||||
assert_eq!(
|
||||
utils::replace_target_character(none_test_str, None).is_none(),
|
||||
true
|
||||
);
|
||||
assert!(utils::replace_target_character(none_test_str, None).is_none());
|
||||
|
||||
assert_eq!(
|
||||
utils::replace_target_character(none_test_str, Some(&test_filter_rule)).is_none(),
|
||||
true
|
||||
);
|
||||
assert!(utils::replace_target_character(none_test_str, Some(&test_filter_rule)).is_none());
|
||||
|
||||
let tmp = "h\ra\ny\ta\tb\nu\r\nsa".to_string();
|
||||
let test_str: Option<&String> = Some(&tmp);
|
||||
|
||||
Reference in New Issue
Block a user