From 051bcf22d5c494cc22bc0177ca0d7bba5d662e91 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Thu, 8 Aug 2024 23:31:34 -0700 Subject: [PATCH 01/14] bump: argyle 0.8 --- adbyss/Cargo.toml | 2 +- adbyss_core/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adbyss/Cargo.toml b/adbyss/Cargo.toml index b8e4dd5..6554178 100644 --- a/adbyss/Cargo.toml +++ b/adbyss/Cargo.toml @@ -90,7 +90,7 @@ items = [ ] [dependencies] -argyle = "0.7.2" +argyle = "0.8.*" dactyl = "0.7.*" fyi_msg = "0.13.*" libc = "0.2.*" diff --git a/adbyss_core/Cargo.toml b/adbyss_core/Cargo.toml index 34f32e5..4f9fd60 100644 --- a/adbyss_core/Cargo.toml +++ b/adbyss_core/Cargo.toml @@ -10,7 +10,7 @@ repository = "https://github.com/Blobfolio/adbyss" publish = false [dependencies] -argyle = "0.7.*" +argyle = "0.8.*" dactyl = "0.7.*" fyi_msg = "0.13.*" rayon = "1.10.*" From a4d7c9ef6a13922e9bf5b14061e46cf5f5ba8c89 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Sun, 11 Aug 2024 20:38:26 -0700 Subject: [PATCH 02/14] perf: simplify dupe check (build) --- adbyss_psl/build.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/adbyss_psl/build.rs b/adbyss_psl/build.rs index 2dfd1c6..bdd564c 100644 --- a/adbyss_psl/build.rs +++ b/adbyss_psl/build.rs @@ -127,14 +127,11 @@ fn psl_build_list(main: &RawMainMap, wild: &RawWildMap) -> (String, String, Stri } } - // Make sure the keys are unique. - { - let tmp: HashSet = map.iter().map(|(k, _)| *k).collect(); - assert_eq!(tmp.len(), map.len(), "Duplicate PSL hash keys."); - } - + // Sort and dedup. let len: usize = map.len(); map.sort_by(|a, b| a.0.cmp(&b.0)); + map.dedup_by(|a, b| a.0 == b.0); + if map.len() != len { panic!("Duplicate PSL hash keys."); } // Separate keys and values. let (map_keys, map_values): (Vec, Vec) = map.into_iter().unzip(); From be53d5594a7c61815d2f632fbc6069c19eaa7f25 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Sun, 11 Aug 2024 21:44:22 -0700 Subject: [PATCH 03/14] perf: reduce allocations (build) --- adbyss_psl/build.rs | 227 ++++++++++++++++++++++++++++---------------- 1 file changed, 144 insertions(+), 83 deletions(-) diff --git a/adbyss_psl/build.rs b/adbyss_psl/build.rs index bdd564c..742fb2a 100644 --- a/adbyss_psl/build.rs +++ b/adbyss_psl/build.rs @@ -4,6 +4,7 @@ use regex::Regex; use std::{ + borrow::Cow, collections::{ HashMap, HashSet, @@ -35,14 +36,6 @@ pub fn main() { println!("cargo:rerun-if-changed=skel/psl.rs.txt"); println!("cargo:rerun-if-changed=skel/raw/public_suffix_list.dat"); - // Sanity check. Obviously this won't change, but it is nice to know we - // thought of it. - assert_eq!( - u64::MAX.to_string().len(), - RANGE.len(), - "Number-formatting string has the wrong length.", - ); - psl(); } @@ -106,24 +99,24 @@ fn psl_build_list(main: &RawMainMap, wild: &RawWildMap) -> (String, String, Stri let (wild_map, wild_kinds, wild_arms) = psl_build_wild(wild); // Hold map key/value pairs. - let mut map: Vec<(u64, String)> = Vec::with_capacity(main.len() + wild.len()); + let mut map: Vec<(u64, Cow)> = Vec::with_capacity(main.len() + wild.len()); // Populate this with stringified tuples (bytes=>kind). for host in main { // We'll prioritize these. if host == "com" || host == "net" || host == "org" { continue; } let hash = hash_tld(host.as_bytes()); - map.push((hash, "SuffixKind::Tld".to_owned())); + map.push((hash, Cow::Borrowed("SuffixKind::Tld"))); } for (host, ex) in wild { let hash = hash_tld(host.as_bytes()); if ex.is_empty() { - map.push((hash, "SuffixKind::Wild".to_owned())); + map.push((hash, Cow::Borrowed("SuffixKind::Wild"))); } else { let ex = psl_format_wild(ex); let ex = wild_map.get(&ex).expect("Missing wild arm."); - map.push((hash, format!("SuffixKind::WildEx(WildKind::{ex})"))); + map.push((hash, Cow::Owned(format!("SuffixKind::WildEx(WildKind::{ex})")))); } } @@ -134,15 +127,17 @@ fn psl_build_list(main: &RawMainMap, wild: &RawWildMap) -> (String, String, Stri if map.len() != len { panic!("Duplicate PSL hash keys."); } // Separate keys and values. - let (map_keys, map_values): (Vec, Vec) = map.into_iter().unzip(); + let (map_keys, map_values): (Vec, Vec>) = map.into_iter().unzip(); // Format the arrays. let map = format!( - "/// # Map Keys.\nstatic MAP_K: [u64; {len}] = [{}];\n\n/// # Map Values.\nstatic MAP_V: [SuffixKind; {len}] = [{}];", - map_keys.into_iter() - .map(nice_u64) - .collect::>() - .join(", "), + r#"/// # Map Keys. +const MAP_K: &[u64; {len}] = &[{}]; + +/// # Map Values. +const MAP_V: &[SuffixKind; {len}] = &[{}]; +"#, + nice_map_keys(map_keys), map_values.join(", "), ); @@ -234,55 +229,73 @@ fn psl_format_wild(src: &[String]) -> String { /// doesn't support network actions — pull a stale copy included with this /// library. fn psl_load_data() -> (RawMainMap, RawWildMap) { + const FLAG_EXCEPTION: u8 = 0b0001; + const FLAG_WILDCARD: u8 = 0b0010; + const STUB: &str = "a.a."; + + /// # Domain to ASCII. + fn idna_to_ascii(src: &[u8]) -> Option> { + use idna::uts46::{AsciiDenyList, DnsLength, Hyphens, Uts46}; + + match Uts46::new().to_ascii(src, AsciiDenyList::STD3, Hyphens::CheckFirstLast, DnsLength::Verify) { + Ok(Cow::Borrowed(x)) => x.strip_prefix(STUB).map(Cow::Borrowed), + Ok(Cow::Owned(mut x)) => + if x.starts_with(STUB) { + x.drain(..STUB.len()); + Some(Cow::Owned(x)) + } + else { None }, + Err(_) => None, + } + } + // Let's build the thing we'll be writing about building. let mut psl_main: RawMainMap = HashSet::with_capacity(9500); let mut psl_wild: RawWildMap = HashMap::with_capacity(128); - const FLAG_EXCEPTION: u8 = 0b0001; - const FLAG_WILDCARD: u8 = 0b0010; - // Parse the raw data. - psl_fetch_suffixes().lines() - .filter(|line| ! line.is_empty() && ! line.starts_with("//")) - .filter_map(|mut line| { - let mut flags: u8 = 0; - - if line.starts_with('!') { - line = &line[1..]; - flags |= FLAG_EXCEPTION; - } - - if line.starts_with("*.") { - line = &line[2..]; - flags |= FLAG_WILDCARD; - } + let mut scratch = String::new(); + for mut line in psl_fetch_suffixes().lines() { + line = line.trim_end(); + if line.is_empty() || line.starts_with("//") { continue; } + + // Figure out what kind of entry this is. + let mut flags: u8 = 0; + if let Some(rest) = line.strip_prefix('!') { + line = rest; + flags |= FLAG_EXCEPTION; + } + if let Some(rest) = line.strip_prefix("*.") { + line = rest; + flags |= FLAG_WILDCARD; + } - // To correctly handle the suffixes, we'll need to prepend a - // hypothetical root and strip it off after. - idna::domain_to_ascii_strict(&["one.two.", line].concat()) - .ok() - .map(|mut x| x.split_off(8)) - .zip(Some(flags)) - }) - .for_each(|(host, flag)| - // This is a wildcard exception. - if 0 != flag & FLAG_EXCEPTION { - if let Some(idx) = host.bytes().position(|x| x == b'.') { - let (before, after) = host.split_at(idx); - psl_wild.entry(after[1..].to_string()) - .or_default() - .push(before.to_string()); + // To correctly handle the suffixes, we'll need to prepend a + // hypothetical root and strip it off after cleanup. + scratch.truncate(0); + scratch.push_str(STUB); + scratch.push_str(line); + let Some(host) = idna_to_ascii(scratch.as_bytes()) else { continue; }; + + // This is a wildcard exception. + if 0 != flags & FLAG_EXCEPTION { + if let Some((before, after)) = host.split_once('.') { + let before = before.to_owned(); + if let Some(v) = psl_wild.get_mut(after) { v.push(before); } + else { + psl_wild.insert(after.to_owned(), vec![before]); } } - // This is the main wildcard entry. - else if 0 != flag & FLAG_WILDCARD { - psl_wild.entry(host).or_default(); - } - // This is a normal suffix. - else { - psl_main.insert(host); - } - ); + } + // This is the main wildcard entry. + else if 0 != flags & FLAG_WILDCARD { + psl_wild.entry(host.into_owned()).or_default(); + } + // This is a normal suffix. + else { + psl_main.insert(host.into_owned()); + } + } (psl_main, psl_wild) } @@ -321,30 +334,78 @@ fn out_path(name: &str) -> PathBuf { out } -/// # Range covering the length of u64::MAX, stringified. -const RANGE: [usize; 20] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]; - -/// # Nice Number. +#[allow(unsafe_code, clippy::cast_possible_truncation, clippy::integer_division)] +/// # Stringify Map Keys. /// -/// This stringifies and returns a number with `_` separators, useful for -/// angering clippy with the code we're generating. -fn nice_u64(num: u64) -> String { - let digits = num.to_string(); - - // Return it straight if no separator is needed. - let len = digits.len(); - if len < 4 { return digits; } - - // Otherwise split it into chunks of three, starting at the end. - let mut parts: Vec<&str> = RANGE[..len].rchunks(3) - .map(|chunk| { - let (min, chunk) = chunk.split_first().unwrap(); - let max = chunk.split_last().map_or(min, |(max, _)| max); - &digits[*min..=*max] - }) - .collect(); +/// This returns a comma-separated list of stringified (numeric) keys, +/// including `_` thousand separators in all the right places to appease +/// clippy. +fn nice_map_keys(map: Vec) -> String { + /// # Decimals, 00-99. + const DOUBLE: [[u8; 2]; 100] = [ + [48, 48], [48, 49], [48, 50], [48, 51], [48, 52], [48, 53], [48, 54], [48, 55], [48, 56], [48, 57], + [49, 48], [49, 49], [49, 50], [49, 51], [49, 52], [49, 53], [49, 54], [49, 55], [49, 56], [49, 57], + [50, 48], [50, 49], [50, 50], [50, 51], [50, 52], [50, 53], [50, 54], [50, 55], [50, 56], [50, 57], + [51, 48], [51, 49], [51, 50], [51, 51], [51, 52], [51, 53], [51, 54], [51, 55], [51, 56], [51, 57], + [52, 48], [52, 49], [52, 50], [52, 51], [52, 52], [52, 53], [52, 54], [52, 55], [52, 56], [52, 57], + [53, 48], [53, 49], [53, 50], [53, 51], [53, 52], [53, 53], [53, 54], [53, 55], [53, 56], [53, 57], + [54, 48], [54, 49], [54, 50], [54, 51], [54, 52], [54, 53], [54, 54], [54, 55], [54, 56], [54, 57], + [55, 48], [55, 49], [55, 50], [55, 51], [55, 52], [55, 53], [55, 54], [55, 55], [55, 56], [55, 57], + [56, 48], [56, 49], [56, 50], [56, 51], [56, 52], [56, 53], [56, 54], [56, 55], [56, 56], [56, 57], + [57, 48], [57, 49], [57, 50], [57, 51], [57, 52], [57, 53], [57, 54], [57, 55], [57, 56], [57, 57] + ]; + + #[inline] + fn triple(idx: usize) -> [u8; 3] { + let a = (idx / 100) as u8 + b'0'; + let [b, c] = DOUBLE[idx % 100]; + [a, b, c] + } + + // A buffer to hold stringified numbers. The initial value doesn't really + // matter, but by starting with u64::MAX we can make sure that all commas + // are in the right place and we have enough space for any u64. + let mut buf: [u8; 26] = *b"18_446_744_073_709_551_615"; + let mut out = String::with_capacity(map.len() * 28); // Assume the worst; it'll be close. + + for mut num in map { + let mut from = buf.len(); + + // Stringify the trailing triplets first, if any. + for chunk in buf.rchunks_exact_mut(4) { + if 999 < num { + chunk[1..].copy_from_slice(triple((num % 1000) as usize).as_slice()); + num /= 1000; + from -= 4; + } + else { break; } + } + + // Three more. + if 99 < num { + from -= 3; + buf[from..from + 3].copy_from_slice(triple(num as usize).as_slice()); + } + // Two more. + else if 9 < num { + from -= 2; + buf[from..from + 2].copy_from_slice(DOUBLE[num as usize].as_slice()); + } + // One more. + else { + from -= 1; + buf[from] = (num as u8) + b'0'; + } + + // Safety: everything we've written/inherited will be an ASCII digit. + out.push_str(unsafe { + std::str::from_utf8_unchecked(&buf[from..]) + }); + out.push_str(", "); + } - // (Re)reverse and glue with the separator. - parts.reverse(); - parts.join("_") + // Remove the trailing punctuation. + if out.ends_with(", ") { out.truncate(out.len() - 2); } + + out } From b1faefe25733113e54ae9d52f91c6f03d8eee374 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Mon, 12 Aug 2024 13:03:01 -0700 Subject: [PATCH 04/14] misc: bump capacity --- adbyss_psl/build.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adbyss_psl/build.rs b/adbyss_psl/build.rs index 742fb2a..fdf4e06 100644 --- a/adbyss_psl/build.rs +++ b/adbyss_psl/build.rs @@ -250,8 +250,8 @@ fn psl_load_data() -> (RawMainMap, RawWildMap) { } // Let's build the thing we'll be writing about building. - let mut psl_main: RawMainMap = HashSet::with_capacity(9500); - let mut psl_wild: RawWildMap = HashMap::with_capacity(128); + let mut psl_main: RawMainMap = HashSet::with_capacity(10_000); + let mut psl_wild: RawWildMap = HashMap::with_capacity(256); // Parse the raw data. let mut scratch = String::new(); From 6f231294d0832ba7a2c2dcabece0c0813a0e86ac Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Mon, 12 Aug 2024 13:35:31 -0700 Subject: [PATCH 05/14] cleanup: simplify PSL sorting/searching misc: re-export RandomState --- adbyss_psl/build.rs | 68 +++++++++++++++++++++++++++---------------- adbyss_psl/src/lib.rs | 14 +++++++++ adbyss_psl/src/psl.rs | 27 ++++++----------- 3 files changed, 66 insertions(+), 43 deletions(-) diff --git a/adbyss_psl/build.rs b/adbyss_psl/build.rs index fdf4e06..a013a7a 100644 --- a/adbyss_psl/build.rs +++ b/adbyss_psl/build.rs @@ -6,6 +6,7 @@ use regex::Regex; use std::{ borrow::Cow, collections::{ + BTreeMap, HashMap, HashSet, }, @@ -98,33 +99,43 @@ fn psl_build_list(main: &RawMainMap, wild: &RawWildMap) -> (String, String, Stri // The wild stuff is the hardest. let (wild_map, wild_kinds, wild_arms) = psl_build_wild(wild); - // Hold map key/value pairs. - let mut map: Vec<(u64, Cow)> = Vec::with_capacity(main.len() + wild.len()); - - // Populate this with stringified tuples (bytes=>kind). - for host in main { - // We'll prioritize these. - if host == "com" || host == "net" || host == "org" { continue; } - let hash = hash_tld(host.as_bytes()); - map.push((hash, Cow::Borrowed("SuffixKind::Tld"))); - } - for (host, ex) in wild { - let hash = hash_tld(host.as_bytes()); - if ex.is_empty() { - map.push((hash, Cow::Borrowed("SuffixKind::Wild"))); - } - else { - let ex = psl_format_wild(ex); - let ex = wild_map.get(&ex).expect("Missing wild arm."); - map.push((hash, Cow::Owned(format!("SuffixKind::WildEx(WildKind::{ex})")))); - } + // We assume com/net/org are normal; let's verify that! + for i in ["com", "net", "org"] { + assert!(main.contains(i), "Normal tld list missing {i}!"); + assert!(! wild.contains_key(i), "Wild list contains {i}!"); } - // Sort and dedup. + // Combine the main and wild data into a single, deduped map, sorted for + // binary search compatibility, which is how lookups will end up working on + // the runtime side of the equation. + let map: BTreeMap> = main.iter() + .filter_map(|host| + // We handle these three common cases manually for performance + // reasons. + if host == "com" || host == "net" || host == "org" { None } + else { + Some((hash_tld(host.as_bytes()), Cow::Borrowed("SuffixKind::Tld"))) + } + ) + .chain( + wild.iter().map(|(host, ex)| { + let hash = hash_tld(host.as_bytes()); + if ex.is_empty() { + (hash, Cow::Borrowed("SuffixKind::Wild")) + } + else { + let ex = psl_format_wild(ex); + let ex = wild_map.get(&ex).expect("Missing wild arm."); + (hash, Cow::Owned(format!("SuffixKind::WildEx(WildKind::{ex})"))) + } + }) + ) + .collect(); + + // Double-check the lengths; if there's a mismatch we found an (improbable) + // hash collision and need to fix it. let len: usize = map.len(); - map.sort_by(|a, b| a.0.cmp(&b.0)); - map.dedup_by(|a, b| a.0 == b.0); - if map.len() != len { panic!("Duplicate PSL hash keys."); } + assert_eq!(len, main.len() + wild.len() - 3, "Duplicate PSL hash keys!"); // Separate keys and values. let (map_keys, map_values): (Vec, Vec>) = map.into_iter().unzip(); @@ -321,7 +332,14 @@ fn load_file(name: &str) -> String { /// what we use, both during build and at runtime (i.e. search needles) during /// lookup matching. fn hash_tld(src: &[u8]) -> u64 { - ahash::RandomState::with_seeds(13, 19, 23, 71).hash_one(src) + // Note: this needs to match the version exported by lib.rs! + const AHASHER: ahash::RandomState = ahash::RandomState::with_seeds( + 0x8596_cc44_bef0_1aa0, + 0x98d4_0948_da60_19ae, + 0x49f1_3013_c503_a6aa, + 0xc4d7_82ff_3c9f_7bef, + ); + AHASHER.hash_one(src) } /// # Out path. diff --git a/adbyss_psl/src/lib.rs b/adbyss_psl/src/lib.rs index aea3fb8..c7a46a7 100644 --- a/adbyss_psl/src/lib.rs +++ b/adbyss_psl/src/lib.rs @@ -126,6 +126,20 @@ use std::{ +/// # Static Hasher. +/// +/// This hasher is used internally for searching the (large) public suffix map, +/// and re-exported just in case any downstream users want to leverage the same +/// state for whatever reason. +pub const AHASHER: ahash::RandomState = ahash::RandomState::with_seeds( + 0x8596_cc44_bef0_1aa0, + 0x98d4_0948_da60_19ae, + 0x49f1_3013_c503_a6aa, + 0xc4d7_82ff_3c9f_7bef, +); + + + #[derive(Debug, Default, Clone)] /// # Domain. /// diff --git a/adbyss_psl/src/psl.rs b/adbyss_psl/src/psl.rs index c635514..8c0420d 100644 --- a/adbyss_psl/src/psl.rs +++ b/adbyss_psl/src/psl.rs @@ -31,23 +31,14 @@ impl SuffixKind { /// Match a suffix from a byte slice, e.g. `b"com"`. pub(super) fn from_slice(src: &[u8]) -> Option { if src == b"com" || src == b"net" || src == b"org" { Some(Self::Tld) } - else { map_get(src) } + else { + // Make sure the compiler understands a key for one is a key for + // all! + const { assert!(MAP_K.len() == MAP_V.len()); } + + let src: u64 = crate::AHASHER.hash_one(src); + let idx = MAP_K.binary_search(&src).ok()?; + Some(MAP_V[idx]) + } } } - - - -/// # Map Search. -/// -/// Look up an entry in the map and return its value if found. This ultimately -/// just uses a binary search. -/// -/// Internally, two static arrays are used to hold this data: -/// * `MAP_K`: all the pre-hashed `u64` keys (TLDs). -/// * `MAP_V`: the `SuffixKind`s associated with the keys. -/// -/// Both arrays are ordered the same way. -fn map_get(src: &[u8]) -> Option { - let src: u64 = ahash::RandomState::with_seeds(13, 19, 23, 71).hash_one(src); - MAP_K.binary_search(&src).ok().map(|idx| MAP_V[idx]) -} From de88210a8415c4eba9f023d93363a38458113ea9 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Tue, 27 Aug 2024 14:09:24 -0700 Subject: [PATCH 06/14] lints --- adbyss/src/main.rs | 46 +++++++++++++---- adbyss/src/settings.rs | 12 ++++- adbyss_core/src/hosts.rs | 24 +++++++-- adbyss_core/src/lib.rs | 44 ++++++++++++---- adbyss_psl/benches/psl_parse.rs | 8 +-- adbyss_psl/build.rs | 5 +- adbyss_psl/skel/psl.rs.txt | 1 + adbyss_psl/src/lib.rs | 89 ++++++++++++++++++++++----------- adbyss_psl/src/psl.rs | 7 ++- 9 files changed, 175 insertions(+), 61 deletions(-) diff --git a/adbyss/src/main.rs b/adbyss/src/main.rs index 682a23d..dcd634c 100644 --- a/adbyss/src/main.rs +++ b/adbyss/src/main.rs @@ -2,31 +2,54 @@ # `Adbyss` */ -#![deny(unsafe_code)] +#![deny( + clippy::allow_attributes_without_reason, + clippy::correctness, + unreachable_pub, + unsafe_code, +)] #![warn( - clippy::filetype_is_file, - clippy::integer_division, - clippy::needless_borrow, + clippy::complexity, clippy::nursery, clippy::pedantic, clippy::perf, - clippy::suboptimal_flops, + clippy::style, + + clippy::allow_attributes, + clippy::clone_on_ref_ptr, + clippy::create_dir, + clippy::filetype_is_file, + clippy::format_push_string, + clippy::get_unwrap, + clippy::impl_trait_in_params, + clippy::lossy_float_literal, + clippy::missing_assert_message, + clippy::missing_docs_in_private_items, + clippy::needless_raw_strings, + clippy::panic_in_result_fn, + clippy::pub_without_shorthand, + clippy::rest_pat_in_fully_bound_structs, + clippy::semicolon_inside_block, + clippy::str_to_string, + clippy::string_to_string, + clippy::todo, + clippy::undocumented_unsafe_blocks, clippy::unneeded_field_pattern, + clippy::unseparated_literal_suffix, + clippy::unwrap_in_result, + macro_use_extern_crate, missing_copy_implementations, - missing_debug_implementations, - missing_docs, non_ascii_idents, trivial_casts, trivial_numeric_casts, - unreachable_pub, unused_crate_dependencies, unused_extern_crates, unused_import_braces, )] -#![allow(clippy::redundant_pub_crate)] +#![expect(clippy::redundant_pub_crate, reason = "Unresolvable.")] @@ -214,19 +237,20 @@ Additional global settings are stored in /etc/adbyss.yaml. )); } -#[allow(unsafe_code)] +#[expect(unsafe_code, reason = "For root.")] /// # Require Root. /// /// This will restart the command with root privileges if necessary, or fail /// if that doesn't work. fn require_root() -> Result<(), AdbyssError> { - // See what privileges we have. + // Safety: we have to trust libc knows how to fetch the user and group! let (uid, e_uid) = unsafe { (libc::getuid(), libc::geteuid()) }; // We're already root. if uid == 0 && e_uid == 0 { Ok(()) } // We just need to SETUID. else if e_uid == 0 { + // Safety: again we have to trust this works correctly. unsafe { libc::setuid(0); } Ok(()) } diff --git a/adbyss/src/settings.rs b/adbyss/src/settings.rs index 5e5c50a..404b61e 100644 --- a/adbyss/src/settings.rs +++ b/adbyss/src/settings.rs @@ -18,38 +18,48 @@ use std::path::PathBuf; -#[allow(clippy::struct_excessive_bools)] // This is coming from Yaml. +#[expect(clippy::struct_excessive_bools, reason = "The fields mirror our YAML config.")] #[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize)] /// # Settings. pub(super) struct Settings { #[serde(default = "Settings::config")] + /// # Hosts File Path. hostfile: PathBuf, #[serde(default = "default_true")] + /// # Backup Original Hosts? backup: bool, #[serde(default = "default_false")] + /// # Join Hosts by TLD? compact: bool, #[serde(default = "default_true")] + /// # Use Adaway Sources? source_adaway: bool, #[serde(default = "default_true")] + /// # Use Adbyss Sources? source_adbyss: bool, #[serde(default = "default_true")] + /// # Use Steven Black Sources? source_stevenblack: bool, #[serde(default = "default_true")] + /// # Use Yoyo Sources? source_yoyo: bool, #[serde(default = "Vec::new")] + /// # Domains to Exclude. exclude: Vec, #[serde(default = "Vec::new")] + /// # Patterns to Exclude. regexclude: Vec, #[serde(default = "Vec::new")] + /// # Domains to Include. include: Vec, } diff --git a/adbyss_core/src/hosts.rs b/adbyss_core/src/hosts.rs index b59e6a0..6c78f43 100644 --- a/adbyss_core/src/hosts.rs +++ b/adbyss_core/src/hosts.rs @@ -57,9 +57,16 @@ const END_WATERMARK: &str = "## End of Adbyss Rules ##"; /// This is used to match the boundary between the custom hostfile entries and /// Adbyss' contributions. enum Watermark { + /// # No Match Yet. Zero, + + /// # Matched ### Opening. One, + + /// # Matched ADBYSS title. Two, + + /// # Matched ### Closing. Three, } @@ -105,11 +112,22 @@ impl Watermark { /// Results are cumulative, so if you plan on doing this more than once with /// different setups, instantiate a new object. pub struct Shitlist { + /// # Hosts File Path. hostfile: PathBuf, + + /// # Flags. flags: u8, + + /// # Domains to Exclude. exclude: HashSet, + + /// # Patterns to Exclude. regexclude: Option, + + /// # Found Entries. found: HashSet, + + /// # File Contents. out: Vec, } @@ -656,7 +674,7 @@ impl Shitlist { found } - #[allow(clippy::type_complexity)] // This is it. + #[expect(clippy::type_complexity, reason = "It is what it is.")] /// # Strip Ignores: Static Filter /// /// Because this filter could run 60K times or more, it is worth taking @@ -673,12 +691,12 @@ impl Shitlist { // Both, optimized static. (Some(re), Ordering::Equal) => { let re = re.clone(); - let val = self.exclude.iter().next().unwrap().clone(); + let val = self.exclude.iter().next()?.clone(); Some(Box::new(move |x| x == &&val || re.is_match(x))) }, // Optimized static. (None, Ordering::Equal) => { - let val = self.exclude.iter().next().unwrap().clone(); + let val = self.exclude.iter().next()?.clone(); Some(Box::new(move |x| x == &&val)) }, // Both, many statics. diff --git a/adbyss_core/src/lib.rs b/adbyss_core/src/lib.rs index b950654..434602f 100644 --- a/adbyss_core/src/lib.rs +++ b/adbyss_core/src/lib.rs @@ -4,29 +4,53 @@ #![forbid(unsafe_code)] +#![deny( + clippy::allow_attributes_without_reason, + clippy::correctness, + unreachable_pub, +)] + #![warn( - clippy::filetype_is_file, - clippy::integer_division, - clippy::needless_borrow, + clippy::complexity, clippy::nursery, clippy::pedantic, clippy::perf, - clippy::suboptimal_flops, + clippy::style, + + clippy::allow_attributes, + clippy::clone_on_ref_ptr, + clippy::create_dir, + clippy::filetype_is_file, + clippy::format_push_string, + clippy::get_unwrap, + clippy::impl_trait_in_params, + clippy::lossy_float_literal, + clippy::missing_assert_message, + clippy::missing_docs_in_private_items, + clippy::needless_raw_strings, + clippy::panic_in_result_fn, + clippy::pub_without_shorthand, + clippy::rest_pat_in_fully_bound_structs, + clippy::semicolon_inside_block, + clippy::str_to_string, + clippy::string_to_string, + clippy::todo, + clippy::undocumented_unsafe_blocks, clippy::unneeded_field_pattern, + clippy::unseparated_literal_suffix, + clippy::unwrap_in_result, + macro_use_extern_crate, missing_copy_implementations, - missing_debug_implementations, - missing_docs, non_ascii_idents, trivial_casts, trivial_numeric_casts, - unreachable_pub, unused_crate_dependencies, unused_extern_crates, unused_import_braces, )] -#![allow(clippy::module_name_repetitions)] +#![expect(clippy::module_name_repetitions, reason = "Repetition is preferred.")] @@ -108,7 +132,7 @@ mod tests { #[test] fn t_sanitize_domain() { - for (a, b) in [ + for (a, b) in &[ ("Blobfolio.com", Some(String::from("blobfolio.com"))), ("www.Blobfolio.com", Some(String::from("www.blobfolio.com"))), (" www.Blobfolio.com", Some(String::from("www.blobfolio.com"))), @@ -118,7 +142,7 @@ mod tests { ("☺.com", Some(String::from("xn--74h.com"))), ("www.☺.com", Some(String::from("www.xn--74h.com"))), ("www.xn--74h.com", Some(String::from("www.xn--74h.com"))), - ].iter() { + ] { assert_eq!(sanitize_domain(a), *b); } } diff --git a/adbyss_psl/benches/psl_parse.rs b/adbyss_psl/benches/psl_parse.rs index 66de23f..67b52ab 100644 --- a/adbyss_psl/benches/psl_parse.rs +++ b/adbyss_psl/benches/psl_parse.rs @@ -38,14 +38,14 @@ benches!( Bench::spacer(), Bench::new("adbyss_psl::Domain::try_from::(blobfolio.com)") - .run_seeded("blobfolio.com".to_owned(), |s| Domain::try_from(s)), + .run_seeded("blobfolio.com".to_owned(), Domain::try_from), Bench::new("adbyss_psl::Domain::try_from::(www.blobfolio.com)") - .run_seeded("www.blobfolio.com".to_owned(), |s| Domain::try_from(s)), + .run_seeded("www.blobfolio.com".to_owned(), Domain::try_from), Bench::new("adbyss_psl::Domain::try_from::(食狮.com.cn)") - .run_seeded("食狮.com.cn".to_owned(), |s| Domain::try_from(s)), + .run_seeded("食狮.com.cn".to_owned(), Domain::try_from), Bench::new("adbyss_psl::Domain::try_from::(xn--85x722f.com.cn)") - .run_seeded("xn--85x722f.com.cn".to_owned(), |s| Domain::try_from(s)), + .run_seeded("xn--85x722f.com.cn".to_owned(), Domain::try_from), ); diff --git a/adbyss_psl/build.rs b/adbyss_psl/build.rs index a013a7a..9155082 100644 --- a/adbyss_psl/build.rs +++ b/adbyss_psl/build.rs @@ -352,7 +352,8 @@ fn out_path(name: &str) -> PathBuf { out } -#[allow(unsafe_code, clippy::cast_possible_truncation, clippy::integer_division)] +#[expect(clippy::cast_possible_truncation, reason = "False positive.")] +#[expect(unsafe_code, reason = "Content is ASCII.")] /// # Stringify Map Keys. /// /// This returns a comma-separated list of stringified (numeric) keys, @@ -375,7 +376,7 @@ fn nice_map_keys(map: Vec) -> String { #[inline] fn triple(idx: usize) -> [u8; 3] { - let a = (idx / 100) as u8 + b'0'; + let a = idx.wrapping_div(100) as u8 + b'0'; let [b, c] = DOUBLE[idx % 100]; [a, b, c] } diff --git a/adbyss_psl/skel/psl.rs.txt b/adbyss_psl/skel/psl.rs.txt index 4abd7f8..22e4121 100644 --- a/adbyss_psl/skel/psl.rs.txt +++ b/adbyss_psl/skel/psl.rs.txt @@ -2,6 +2,7 @@ +#[expect(clippy::missing_docs_in_private_items, reason = "List is auto-generated.")] #[derive(Clone, Copy)] /// # Suffix Kinds. /// diff --git a/adbyss_psl/src/lib.rs b/adbyss_psl/src/lib.rs index c7a46a7..cbdbdbe 100644 --- a/adbyss_psl/src/lib.rs +++ b/adbyss_psl/src/lib.rs @@ -73,32 +73,53 @@ let owned = dom.take(); // "www.mydomain.com" #![forbid(unsafe_code)] +#![deny( + clippy::allow_attributes_without_reason, + clippy::correctness, + unreachable_pub, +)] + #![warn( - clippy::filetype_is_file, - clippy::integer_division, - clippy::needless_borrow, + clippy::complexity, clippy::nursery, clippy::pedantic, clippy::perf, - clippy::suboptimal_flops, + clippy::style, + + clippy::allow_attributes, + clippy::clone_on_ref_ptr, + clippy::create_dir, + clippy::filetype_is_file, + clippy::format_push_string, + clippy::get_unwrap, + clippy::impl_trait_in_params, + clippy::lossy_float_literal, + clippy::missing_assert_message, + clippy::missing_docs_in_private_items, + clippy::needless_raw_strings, + clippy::panic_in_result_fn, + clippy::pub_without_shorthand, + clippy::rest_pat_in_fully_bound_structs, + clippy::semicolon_inside_block, + clippy::str_to_string, + clippy::string_to_string, + clippy::todo, + clippy::undocumented_unsafe_blocks, clippy::unneeded_field_pattern, + clippy::unseparated_literal_suffix, + clippy::unwrap_in_result, + macro_use_extern_crate, missing_copy_implementations, - missing_debug_implementations, - missing_docs, non_ascii_idents, trivial_casts, trivial_numeric_casts, - unreachable_pub, unused_crate_dependencies, unused_extern_crates, unused_import_braces, )] -#![allow( - clippy::module_name_repetitions, - clippy::redundant_pub_crate, -)] +#![expect(clippy::redundant_pub_crate, reason = "Unresolvable.")] #![cfg_attr(docsrs, feature(doc_cfg))] @@ -187,8 +208,17 @@ pub const AHASHER: ahash::RandomState = ahash::RandomState::with_seeds( /// when it finds them, ensuring the resulting hostname will always be /// lowercase ASCII. pub struct Domain { + /// # Host. host: String, + + /// # Root. + /// + /// This holds the index range of `host` corresponding to the domain root. root: Range, + + /// # Root. + /// + /// This holds the index range of `host` corresponding to the domain suffix. suffix: Range, } @@ -241,6 +271,7 @@ impl PartialEq for Domain { fn eq(&self, other: &Self) -> bool { self.host == other.host } } +/// # Helper: Symmetrical `PartialEq`. macro_rules! partial_eq { // Dereference. (deref: $($cast:ident $ty:ty),+ $(,)?) => ($( @@ -285,6 +316,7 @@ impl PartialOrd for Domain { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } +/// # Helper: `TryFrom` impl. macro_rules! impl_try { ($($ty:ty),+) => ($( impl TryFrom<$ty> for Domain { @@ -511,7 +543,6 @@ impl Domain { /// # Conversion. impl Domain { - #[allow(clippy::missing_const_for_fn)] // Doesn't work. #[must_use] /// # Take String /// @@ -630,6 +661,7 @@ impl<'de> serde::Deserialize<'de> for Domain { /// Use the optional `serde` crate feature to enable serialization support. fn deserialize(deserializer: D) -> Result where D: serde::de::Deserializer<'de> { + /// # Visitor Instance. struct DomainVisitor; impl<'de> serde::de::Visitor<'de> for DomainVisitor { @@ -870,27 +902,26 @@ mod tests { ); } // We should have a TLD! + else if let Some(dom) = Domain::new(a) { + assert_eq!( + dom.tld(), + b.unwrap(), + "Failed parsing: {dom:?}", + ); + + // Again, the String impl is slightly different. + let Ok(dom2) = Domain::try_from(a.to_owned()) else { + panic!("Failed parsing: {a:?} (string)"); + }; + assert_eq!(dom, dom2, "String/str parsing mismatch for {a:?}"); + } else { - if let Some(dom) = Domain::new(a) { - assert_eq!( - dom.tld(), - b.unwrap(), - "Failed parsing: {dom:?}", - ); - - // Again, the String impl is slightly different. - let Ok(dom2) = Domain::try_from(a.to_owned()) else { - panic!("Failed parsing: {a:?} (string)"); - }; - assert_eq!(dom, dom2, "String/str parsing mismatch for {a:?}"); - } - else { - panic!("Failed parsing: {:?}", a); - } + panic!("Failed parsing: {a:?}"); } } #[test] + #[expect(clippy::cognitive_complexity, reason = "It is what it is.")] /// # Test Chunks. /// /// This makes sure that the individual host components line up correctly. @@ -903,7 +934,7 @@ mod tests { assert_eq!(dom.host(), "abc.www.xn--85x722f.xn--fiqs8s"); // Make sure dereference does the right thing. It should... - assert_eq!(dom.host(), dom.deref()); + assert_eq!(dom.host(), &*dom); dom = Domain::new("blobfolio.com").unwrap(); assert_eq!(dom.subdomain(), None); diff --git a/adbyss_psl/src/psl.rs b/adbyss_psl/src/psl.rs index 8c0420d..f88ef2d 100644 --- a/adbyss_psl/src/psl.rs +++ b/adbyss_psl/src/psl.rs @@ -19,8 +19,13 @@ include!(concat!(env!("OUT_DIR"), "/adbyss-psl.rs")); /// * `Wild`: it is itself and whatever part appears before it. /// * `WildEx`: it is itself and whatever part appears before it, unless that part matches an exception. pub(super) enum SuffixKind { + /// # Normal TLD. Tld, + + /// # Wildcard TLD. Wild, + + /// # Wildcard Exception. WildEx(WildKind), } @@ -34,7 +39,7 @@ impl SuffixKind { else { // Make sure the compiler understands a key for one is a key for // all! - const { assert!(MAP_K.len() == MAP_V.len()); } + const { assert!(MAP_K.len() == MAP_V.len(), "BUG: MAP_K and MAP_V have different sizes?!"); } let src: u64 = crate::AHASHER.hash_one(src); let idx = MAP_K.binary_search(&src).ok()?; From 5303c22cea9bd5273886acc9f12a024e819c0a10 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Sat, 31 Aug 2024 00:19:13 -0700 Subject: [PATCH 07/14] cleanup: remove rust-version --- .github/workflows/msrv.yaml | 2 -- adbyss/Cargo.toml | 1 - adbyss_core/Cargo.toml | 1 - 3 files changed, 4 deletions(-) diff --git a/.github/workflows/msrv.yaml b/.github/workflows/msrv.yaml index e522a10..ea0fa80 100644 --- a/.github/workflows/msrv.yaml +++ b/.github/workflows/msrv.yaml @@ -50,6 +50,4 @@ jobs: - name: MSRV run: | - cargo msrv --path adbyss verify - cargo msrv --path adbyss_core verify cargo msrv --path adbyss_psl verify -- cargo check --all-features diff --git a/adbyss/Cargo.toml b/adbyss/Cargo.toml index 6554178..d83987e 100644 --- a/adbyss/Cargo.toml +++ b/adbyss/Cargo.toml @@ -4,7 +4,6 @@ version = "0.12.0" license = "WTFPL" authors = ["Josh Stoik "] edition = "2021" -rust-version = "1.80" description = "Adbyss is a DNS blacklist manager for Linux." repository = "https://github.com/Blobfolio/adbyss" publish = false diff --git a/adbyss_core/Cargo.toml b/adbyss_core/Cargo.toml index 4f9fd60..be5d69b 100644 --- a/adbyss_core/Cargo.toml +++ b/adbyss_core/Cargo.toml @@ -4,7 +4,6 @@ version = "0.12.0" license = "WTFPL" authors = ["Josh Stoik "] edition = "2021" -rust-version = "1.80" description = "Library for Adbyss." repository = "https://github.com/Blobfolio/adbyss" publish = false From fa3cc445036843c834e56af2981a76d2a062e128 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Sat, 31 Aug 2024 00:20:09 -0700 Subject: [PATCH 08/14] bump: msrv 1.81 --- adbyss_psl/CHANGELOG.md | 16 ++++++++++++---- adbyss_psl/Cargo.toml | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/adbyss_psl/CHANGELOG.md b/adbyss_psl/CHANGELOG.md index a81beca..46caeb2 100644 --- a/adbyss_psl/CHANGELOG.md +++ b/adbyss_psl/CHANGELOG.md @@ -1,20 +1,28 @@ # Changelog + +## [0.13.0](https://github.com/Blobfolio/adbyss/releases/tag/v0.13.0) - TBD + +### Changed + +* Bump MSRV to `1.81` +* Minor code lints +* Update suffix database + + + ## [0.12.0](https://github.com/Blobfolio/adbyss/releases/tag/v0.12.0) - 2024-08-08 ### New * `Domain::try_from::>` -### Breaking - -* Bump MSRV to `1.80` - ### Changed * Specialize `Domain::try_from::` * Add dependency `trimothy` (lib) +* Bump MSRV to `1.80` * Bump `utc2k` to `0.9` * Update suffix database diff --git a/adbyss_psl/Cargo.toml b/adbyss_psl/Cargo.toml index 23c01ef..58f06d0 100644 --- a/adbyss_psl/Cargo.toml +++ b/adbyss_psl/Cargo.toml @@ -4,7 +4,7 @@ version = "0.12.0" license = "WTFPL" authors = ["Josh Stoik "] edition = "2021" -rust-version = "1.80" +rust-version = "1.81" description = "A minimal Public Suffix List hostname validator." repository = "https://github.com/Blobfolio/adbyss" keywords = [ "hostname", "validation", "publicsuffix", "idna", "punycode" ] From 2e612f21e2e7778734a3807acd2f9043197ae3ef Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Sun, 1 Sep 2024 01:58:34 -0700 Subject: [PATCH 09/14] misc: replace `serde_yaml` with `serde_yml` --- adbyss/Cargo.toml | 2 +- adbyss/src/settings.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adbyss/Cargo.toml b/adbyss/Cargo.toml index d83987e..be55962 100644 --- a/adbyss/Cargo.toml +++ b/adbyss/Cargo.toml @@ -93,7 +93,7 @@ argyle = "0.8.*" dactyl = "0.7.*" fyi_msg = "0.13.*" libc = "0.2.*" -serde_yaml = "0.9.*" +serde_yml = "=0.0.12" [dependencies.adbyss_core] path = "../adbyss_core" diff --git a/adbyss/src/settings.rs b/adbyss/src/settings.rs index 404b61e..ecc1438 100644 --- a/adbyss/src/settings.rs +++ b/adbyss/src/settings.rs @@ -87,7 +87,7 @@ impl TryFrom for Settings { std::fs::canonicalize(&path) .and_then(std::fs::read_to_string) .ok() - .and_then(|x| serde_yaml::from_str::(&x).ok()) + .and_then(|x| serde_yml::from_str::(&x).ok()) .ok_or_else(|| AdbyssError::Config(Box::from(path))) } } From c04c8340825239c42e56f0128c800de7cc86c660 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Sun, 1 Sep 2024 22:44:18 -0700 Subject: [PATCH 10/14] lints --- adbyss/src/main.rs | 1 + adbyss_core/src/lib.rs | 1 + adbyss_psl/src/lib.rs | 1 + 3 files changed, 3 insertions(+) diff --git a/adbyss/src/main.rs b/adbyss/src/main.rs index dcd634c..0e90424 100644 --- a/adbyss/src/main.rs +++ b/adbyss/src/main.rs @@ -41,6 +41,7 @@ macro_use_extern_crate, missing_copy_implementations, + missing_docs, non_ascii_idents, trivial_casts, trivial_numeric_casts, diff --git a/adbyss_core/src/lib.rs b/adbyss_core/src/lib.rs index 434602f..a11a85b 100644 --- a/adbyss_core/src/lib.rs +++ b/adbyss_core/src/lib.rs @@ -42,6 +42,7 @@ macro_use_extern_crate, missing_copy_implementations, + missing_docs, non_ascii_idents, trivial_casts, trivial_numeric_casts, diff --git a/adbyss_psl/src/lib.rs b/adbyss_psl/src/lib.rs index cbdbdbe..444c243 100644 --- a/adbyss_psl/src/lib.rs +++ b/adbyss_psl/src/lib.rs @@ -111,6 +111,7 @@ let owned = dom.take(); // "www.mydomain.com" macro_use_extern_crate, missing_copy_implementations, + missing_docs, non_ascii_idents, trivial_casts, trivial_numeric_casts, From 7a951ba7b25c87c76cab5489c6aff6f9ab7d3484 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Thu, 5 Sep 2024 11:59:47 -0700 Subject: [PATCH 11/14] bump: brunch 0.6 --- adbyss_psl/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adbyss_psl/Cargo.toml b/adbyss_psl/Cargo.toml index 58f06d0..991dd6d 100644 --- a/adbyss_psl/Cargo.toml +++ b/adbyss_psl/Cargo.toml @@ -27,7 +27,7 @@ version = "0.8.*" default-features = false [dev-dependencies] -brunch = "0.5.*" +brunch = "0.6.*" serde = "1.0.*" serde_json = "1.0.*" From d6649aae600b5eb12d01d2147f310efed9b60562 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Thu, 5 Sep 2024 12:58:07 -0700 Subject: [PATCH 12/14] bump: fyi_msg 0.14 --- adbyss/Cargo.toml | 2 +- adbyss_core/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adbyss/Cargo.toml b/adbyss/Cargo.toml index be55962..7cfd1b8 100644 --- a/adbyss/Cargo.toml +++ b/adbyss/Cargo.toml @@ -91,7 +91,7 @@ items = [ [dependencies] argyle = "0.8.*" dactyl = "0.7.*" -fyi_msg = "0.13.*" +fyi_msg = "0.14.*" libc = "0.2.*" serde_yml = "=0.0.12" diff --git a/adbyss_core/Cargo.toml b/adbyss_core/Cargo.toml index be5d69b..0669328 100644 --- a/adbyss_core/Cargo.toml +++ b/adbyss_core/Cargo.toml @@ -11,7 +11,7 @@ publish = false [dependencies] argyle = "0.8.*" dactyl = "0.7.*" -fyi_msg = "0.13.*" +fyi_msg = "0.14.*" rayon = "1.10.*" regex = "1.10.*" utc2k = "0.9.*" From f2da497eb0193b311f4e45eb1ce4138e2085ea80 Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Thu, 5 Sep 2024 13:01:45 -0700 Subject: [PATCH 13/14] bump: 0.13.0 --- adbyss/Cargo.toml | 2 +- adbyss_core/Cargo.toml | 2 +- adbyss_psl/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/adbyss/Cargo.toml b/adbyss/Cargo.toml index 7cfd1b8..7a8abdc 100644 --- a/adbyss/Cargo.toml +++ b/adbyss/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "adbyss" -version = "0.12.0" +version = "0.13.0" license = "WTFPL" authors = ["Josh Stoik "] edition = "2021" diff --git a/adbyss_core/Cargo.toml b/adbyss_core/Cargo.toml index 0669328..08c5638 100644 --- a/adbyss_core/Cargo.toml +++ b/adbyss_core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "adbyss_core" -version = "0.12.0" +version = "0.13.0" license = "WTFPL" authors = ["Josh Stoik "] edition = "2021" diff --git a/adbyss_psl/Cargo.toml b/adbyss_psl/Cargo.toml index 991dd6d..ab05850 100644 --- a/adbyss_psl/Cargo.toml +++ b/adbyss_psl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "adbyss_psl" -version = "0.12.0" +version = "0.13.0" license = "WTFPL" authors = ["Josh Stoik "] edition = "2021" From 1841489dc59ad3080905a8e23b8a9e3d2d2dcaef Mon Sep 17 00:00:00 2001 From: Josh Stoik Date: Thu, 5 Sep 2024 13:05:16 -0700 Subject: [PATCH 14/14] build: 0.13.0 --- CREDITS.md | 39 +++---- adbyss_psl/CHANGELOG.md | 6 +- adbyss_psl/skel/raw/public_suffix_list.dat | 122 +++++++++++++-------- release/man/adbyss.1 | 4 +- 4 files changed, 104 insertions(+), 67 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 94dd1f6..b75c43a 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,25 +1,26 @@ # Project Dependencies Package: adbyss - Version: 0.12.0 - Generated: 2024-08-09 05:10:46 UTC + Version: 0.13.0 + Generated: 2024-09-05 20:03:14 UTC | Package | Version | Author(s) | License | | ---- | ---- | ---- | ---- | -| [adbyss_core](https://github.com/Blobfolio/adbyss) | 0.12.0 | [Josh Stoik](mailto:josh@blobfolio.com) | WTFPL | -| [adbyss_psl](https://github.com/Blobfolio/adbyss) | 0.12.0 | [Josh Stoik](mailto:josh@blobfolio.com) | WTFPL | +| [adbyss_core](https://github.com/Blobfolio/adbyss) | 0.13.0 | [Josh Stoik](mailto:josh@blobfolio.com) | WTFPL | +| [adbyss_psl](https://github.com/Blobfolio/adbyss) | 0.13.0 | [Josh Stoik](mailto:josh@blobfolio.com) | WTFPL | | [ahash](https://github.com/tkaitchuck/ahash) | 0.8.11 | [Tom Kaitchuck](mailto:tom.kaitchuck@gmail.com) | Apache-2.0 or MIT | | [aho-corasick](https://github.com/BurntSushi/aho-corasick) | 1.1.3 | [Andrew Gallant](mailto:jamslam@gmail.com) | MIT or Unlicense | -| [argyle](https://github.com/Blobfolio/argyle) | 0.7.2 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | +| [anyhow](https://github.com/dtolnay/anyhow) | 1.0.86 | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | +| [argyle](https://github.com/Blobfolio/argyle) | 0.8.1 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | | [cfg-if](https://github.com/alexcrichton/cfg-if) | 1.0.0 | [Alex Crichton](mailto:alex@alexcrichton.com) | Apache-2.0 or MIT | | [crossbeam-deque](https://github.com/crossbeam-rs/crossbeam) | 0.8.5 | | Apache-2.0 or MIT | | [crossbeam-epoch](https://github.com/crossbeam-rs/crossbeam) | 0.9.18 | | Apache-2.0 or MIT | | [crossbeam-utils](https://github.com/crossbeam-rs/crossbeam) | 0.8.20 | | Apache-2.0 or MIT | -| [dactyl](https://github.com/Blobfolio/dactyl) | 0.7.2 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | +| [dactyl](https://github.com/Blobfolio/dactyl) | 0.7.3 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | | [displaydoc](https://github.com/yaahc/displaydoc) | 0.2.5 | [Jane Lusby](mailto:jlusby@yaah.dev) | Apache-2.0 or MIT | | [either](https://github.com/rayon-rs/either) | 1.13.0 | bluss | Apache-2.0 or MIT | | [equivalent](https://github.com/cuviper/equivalent) | 1.0.1 | | Apache-2.0 or MIT | -| [fastrand](https://github.com/smol-rs/fastrand) | 2.1.0 | [Stjepan Glavina](mailto:stjepang@gmail.com) | Apache-2.0 or MIT | -| [fyi_msg](https://github.com/Blobfolio/fyi) | 0.13.6 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | +| [fastrand](https://github.com/smol-rs/fastrand) | 2.1.1 | [Stjepan Glavina](mailto:stjepang@gmail.com) | Apache-2.0 or MIT | +| [fyi_msg](https://github.com/Blobfolio/fyi) | 0.14.0 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | | [getrandom](https://github.com/rust-random/getrandom) | 0.2.15 | The Rand Project Developers | Apache-2.0 or MIT | | [hashbrown](https://github.com/rust-lang/hashbrown) | 0.14.5 | [Amanieu d'Antras](mailto:amanieu@gmail.com) | Apache-2.0 or MIT | | [icu_collections](https://github.com/unicode-org/icu4x) | 1.5.0 | The ICU4X Project Developers | Unicode-3.0 | @@ -33,16 +34,17 @@ | [icu_provider](https://github.com/unicode-org/icu4x) | 1.5.0 | The ICU4X Project Developers | Unicode-3.0 | | [icu_provider_macros](https://github.com/unicode-org/icu4x) | 1.5.0 | The ICU4X Project Developers | Unicode-3.0 | | [idna](https://github.com/servo/rust-url/) | 1.0.2 | The rust-url developers | Apache-2.0 or MIT | -| [indexmap](https://github.com/indexmap-rs/indexmap) | 2.3.0 | | Apache-2.0 or MIT | +| [indexmap](https://github.com/indexmap-rs/indexmap) | 2.5.0 | | Apache-2.0 or MIT | | [itoa](https://github.com/dtolnay/itoa) | 1.0.11 | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | -| [libc](https://github.com/rust-lang/libc) | 0.2.155 | The Rust Project Developers | Apache-2.0 or MIT | +| [libc](https://github.com/rust-lang/libc) | 0.2.158 | The Rust Project Developers | Apache-2.0 or MIT | +| [libyml](https://github.com/sebastienrousseau/libyml) | 0.0.5 | LibYML Contributors | MIT | | [litemap](https://github.com/unicode-org/icu4x) | 0.7.3 | The ICU4X Project Developers | Unicode-3.0 | | [log](https://github.com/rust-lang/log) | 0.4.22 | The Rust Project Developers | Apache-2.0 or MIT | | [memchr](https://github.com/BurntSushi/memchr) | 2.7.4 | [Andrew Gallant](mailto:jamslam@gmail.com) and bluss | MIT or Unlicense | | [minreq](https://github.com/neonmoe/minreq) | 2.12.0 | [Jens Pitkanen](mailto:jens@neon.moe) | ISC | | [once_cell](https://github.com/matklad/once_cell) | 1.19.0 | [Aleksey Kladov](mailto:aleksey.kladov@gmail.com) | Apache-2.0 or MIT | | [proc-macro2](https://github.com/dtolnay/proc-macro2) | 1.0.86 | [David Tolnay](mailto:dtolnay@gmail.com) and [Alex Crichton](mailto:alex@alexcrichton.com) | Apache-2.0 or MIT | -| [quote](https://github.com/dtolnay/quote) | 1.0.36 | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | +| [quote](https://github.com/dtolnay/quote) | 1.0.37 | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | | [rayon](https://github.com/rayon-rs/rayon) | 1.10.0 | [Niko Matsakis](mailto:niko@alum.mit.edu) and [Josh Stone](mailto:cuviper@gmail.com) | Apache-2.0 or MIT | | [rayon-core](https://github.com/rayon-rs/rayon) | 1.12.1 | [Niko Matsakis](mailto:niko@alum.mit.edu) and [Josh Stone](mailto:cuviper@gmail.com) | Apache-2.0 or MIT | | [regex](https://github.com/rust-lang/regex) | 1.10.6 | The Rust Project Developers and [Andrew Gallant](mailto:jamslam@gmail.com) | Apache-2.0 or MIT | @@ -53,25 +55,24 @@ | [rustls-webpki](https://github.com/rustls/webpki) | 0.101.7 | | ISC | | [ryu](https://github.com/dtolnay/ryu) | 1.0.18 | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or BSL-1.0 | | [sct](https://github.com/rustls/sct.rs) | 0.7.1 | [Joseph Birr-Pixton](mailto:jpixton@gmail.com) | Apache-2.0, ISC, or MIT | -| [serde](https://github.com/serde-rs/serde) | 1.0.205 | [Erick Tryzelaar](mailto:erick.tryzelaar@gmail.com) and [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | -| [serde_derive](https://github.com/serde-rs/serde) | 1.0.205 | [Erick Tryzelaar](mailto:erick.tryzelaar@gmail.com) and [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | -| [serde_yaml](https://github.com/dtolnay/serde-yaml) | 0.9.34+deprecated | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | +| [serde](https://github.com/serde-rs/serde) | 1.0.209 | [Erick Tryzelaar](mailto:erick.tryzelaar@gmail.com) and [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | +| [serde_derive](https://github.com/serde-rs/serde) | 1.0.209 | [Erick Tryzelaar](mailto:erick.tryzelaar@gmail.com) and [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | +| [serde_yml](https://github.com/sebastienrousseau/serde_yml) | 0.0.12 | Serde YML Contributors | Apache-2.0 or MIT | | [smallvec](https://github.com/servo/rust-smallvec) | 1.13.2 | The Servo Project Developers | Apache-2.0 or MIT | | [stable_deref_trait](https://github.com/storyyeller/stable_deref_trait) | 1.2.0 | [Robert Grosse](mailto:n210241048576@gmail.com) | Apache-2.0 or MIT | -| [syn](https://github.com/dtolnay/syn) | 2.0.72 | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | +| [syn](https://github.com/dtolnay/syn) | 2.0.77 | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 or MIT | | [synstructure](https://github.com/mystor/synstructure) | 0.13.1 | [Nika Layzell](mailto:nika@thelayzells.com) | MIT | | [tempfile](https://github.com/Stebalien/tempfile) | 3.12.0 | [Steven Allen](mailto:steven@stebalien.com), The Rust Project Developers, [Ashley Mannix](mailto:ashleymannix@live.com.au), and [Jason White](mailto:me@jasonwhite.io) | Apache-2.0 or MIT | | [tinystr](https://github.com/unicode-org/icu4x) | 0.7.6 | The ICU4X Project Developers | Unicode-3.0 | -| [trimothy](https://github.com/Blobfolio/trimothy) | 0.3.0 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | +| [trimothy](https://github.com/Blobfolio/trimothy) | 0.3.1 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | | [unicode-ident](https://github.com/dtolnay/unicode-ident) | 1.0.12 | [David Tolnay](mailto:dtolnay@gmail.com) | Apache-2.0 AND Unicode-DFS-2016 or MIT | -| [unsafe-libyaml](https://github.com/dtolnay/unsafe-libyaml) | 0.2.11 | [David Tolnay](mailto:dtolnay@gmail.com) | MIT | | [untrusted](https://github.com/briansmith/untrusted) | 0.9.0 | [Brian Smith](mailto:brian@briansmith.org) | ISC | -| [utc2k](https://github.com/Blobfolio/utc2k) | 0.9.0 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | +| [utc2k](https://github.com/Blobfolio/utc2k) | 0.9.1 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | | [utf16_iter](https://github.com/hsivonen/utf16_iter) | 1.0.5 | [Henri Sivonen](mailto:hsivonen@hsivonen.fi) | Apache-2.0 or MIT | | [utf8_iter](https://github.com/hsivonen/utf8_iter) | 1.0.4 | [Henri Sivonen](mailto:hsivonen@hsivonen.fi) | Apache-2.0 or MIT | | [webpki-roots](https://github.com/rustls/webpki-roots) | 0.25.4 | | MPL-2.0 | | [write16](https://github.com/hsivonen/write16) | 1.0.0 | | Apache-2.0 or MIT | -| [write_atomic](https://github.com/Blobfolio/write_atomic) | 0.5.0 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | +| [write_atomic](https://github.com/Blobfolio/write_atomic) | 0.5.1 | [Blobfolio, LLC.](mailto:hello@blobfolio.com) | WTFPL | | [writeable](https://github.com/unicode-org/icu4x) | 0.5.5 | The ICU4X Project Developers | Unicode-3.0 | | [yoke](https://github.com/unicode-org/icu4x) | 0.7.4 | [Manish Goregaokar](mailto:manishsmail@gmail.com) | Unicode-3.0 | | [yoke-derive](https://github.com/unicode-org/icu4x) | 0.7.4 | [Manish Goregaokar](mailto:manishsmail@gmail.com) | Unicode-3.0 | diff --git a/adbyss_psl/CHANGELOG.md b/adbyss_psl/CHANGELOG.md index 46caeb2..e56ae52 100644 --- a/adbyss_psl/CHANGELOG.md +++ b/adbyss_psl/CHANGELOG.md @@ -2,12 +2,16 @@ -## [0.13.0](https://github.com/Blobfolio/adbyss/releases/tag/v0.13.0) - TBD +## [0.13.0](https://github.com/Blobfolio/adbyss/releases/tag/v0.13.0) - 2024-09-05 ### Changed * Bump MSRV to `1.81` +* Bump `brunch` to `0.6` +* Bump `fyi_msg` to `0.14` * Minor code lints +* Reduce build script allocations +* Replace `serde_yaml` with `serde_yml` * Update suffix database diff --git a/adbyss_psl/skel/raw/public_suffix_list.dat b/adbyss_psl/skel/raw/public_suffix_list.dat index 268816b..a8f9bc6 100644 --- a/adbyss_psl/skel/raw/public_suffix_list.dat +++ b/adbyss_psl/skel/raw/public_suffix_list.dat @@ -6723,7 +6723,7 @@ org.zw // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2024-07-12T15:14:39Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2024-08-25T15:14:38Z // This list is auto-generated, don't edit it manually. // aaa : American Automobile Association, Inc. // https://www.iana.org/domains/root/db/aaa.html @@ -8125,7 +8125,7 @@ forex // https://www.iana.org/domains/root/db/forsale.html forsale -// forum : Fegistry, LLC +// forum : Waterford Limited // https://www.iana.org/domains/root/db/forum.html forum @@ -9037,7 +9037,7 @@ maison // https://www.iana.org/domains/root/db/makeup.html makeup -// man : MAN SE +// man : MAN Truck & Bus SE // https://www.iana.org/domains/root/db/man.html man @@ -9697,7 +9697,7 @@ realestate // https://www.iana.org/domains/root/db/realtor.html realtor -// realty : Internet Naming Company LLC +// realty : Waterford Limited // https://www.iana.org/domains/root/db/realty.html realty @@ -12100,7 +12100,7 @@ eero-stage.online // Submitted by Apigee Security Team apigee.io -// Apis Networks: https://apisnetworks.com +// Apis Networks : https://apisnetworks.com // Submitted by Matt Saladna panel.dev @@ -12172,7 +12172,7 @@ onavstack.net *.awdev.ca *.advisor.ws -// AZ.pl sp. z.o.o: https://az.pl +// AZ.pl sp. z.o.o : https://az.pl // Submitted by Krzysztof Wolski ecommerce-shop.pl @@ -12223,10 +12223,6 @@ betainabox.com // Submitted by Nathan O'Sullivan bnr.la -// Bip : https://bip.sh -// Submitted by Joel Kennedy -bip.sh - // Bitbucket : http://bitbucket.org // Submitted by Andy Ortlieb bitbucket.io @@ -12524,7 +12520,7 @@ on.crisp.email // Submitted by Marvin Wiesner curv.dev -// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ +// Customer OCI - Oracle Dyn : https://cloud.oracle.com/home https://dyn.com/dns/ // Submitted by Gregory Drake // Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label *.customer-oci.com @@ -12651,8 +12647,8 @@ us.kg // Diher Solutions : https://diher.solutions // Submitted by Didi Hermawan -*.rss.my.id -*.diher.solutions +rss.my.id +diher.solutions // Discord Inc : https://discord.com // Submitted by Sahn Lam @@ -13009,7 +13005,6 @@ freeddns.org mywire.org webredirect.org myddns.rocks -blogsite.xyz // dynv6 : https://dynv6.com // Submitted by Dominik Menke @@ -13028,7 +13023,7 @@ easypanel.host // Submitted by *.ewp.live -// ECG Robotics, Inc: https://ecgrobotics.org +// ECG Robotics, Inc : https://ecgrobotics.org // Submitted by onred.one staging.onred.one @@ -13298,10 +13293,6 @@ filegear.me // Submitted by Chris Raynor firebaseapp.com -// Firewebkit : https://www.firewebkit.com -// Submitted by Majid Qureshi -fireweb.app - // FLAP : https://www.flap.cloud // Submitted by Louis Chemineau flap.id @@ -13335,7 +13326,7 @@ framer.photos framer.website framer.wiki -// Frederik Braun https://frederik-braun.com +// Frederik Braun : https://frederik-braun.com // Submitted by Frederik Braun 0e.vc @@ -13607,7 +13598,6 @@ codespot.com googleapis.com googlecode.com pagespeedmobilizer.com -publishproxy.com withgoogle.com withyoutube.com blogspot.cv @@ -13795,7 +13785,7 @@ sch.so // Submitted by Bohdan Dub ie.ua -// HostyHosting (https://hostyhosting.com) +// HostyHosting : https://hostyhosting.com hostyhosting.io // Hypernode B.V. : https://www.hypernode.com/ @@ -13823,12 +13813,12 @@ gr.com // Submitted by Hannu Aronsson iki.fi -// iliad italia: https://www.iliad.it +// iliad italia : https://www.iliad.it // Submitted by Marios Makassikis ibxos.it iliadboxos.it -// Incsub, LLC: https://incsub.com/ +// Incsub, LLC : https://incsub.com/ // Submitted by Aaron Edwards smushcdn.com wphostedmail.com @@ -13891,10 +13881,19 @@ to.leg.br // Submitted by Wolfgang Schwarz pixolino.com -// Internet-Pro, LLP: https://netangels.ru/ +// Internet-Pro, LLP : https://netangels.ru/ // Submitted by Vasiliy Sheredeko na4u.ru +// IONOS SE : https://www.ionos.com/, +// IONOS Group SE: https://www.ionos-group.com/ +// submitted by Henrik Willert +apps-1and1.com +live-website.com +apps-1and1.net +websitebuilder.online +app-ionos.space + // iopsys software solutions AB : https://iopsys.eu/ // Submitted by Roman Azarenko iopsys.se @@ -13907,6 +13906,10 @@ ipifony.net // Submitted by Ali Soizi ir.md +// is-a-good.dev : https://is-a-good.dev +// Submitted by William Harrison +is-a-good.dev + // is-a.dev : https://www.is-a.dev // Submitted by William Harrison is-a.dev @@ -14089,6 +14092,10 @@ lpusercontent.com // Submitted by Lelux Admin lelux.site +// libp2p project : https://libp2p.io +// Submitted by Interplanetary Shipyard +libp2p.direct + // Libre IT Ltd : https://libre.nz // Submitted by Tomas Maggio runcontainers.dev @@ -14119,14 +14126,15 @@ ip.linodeusercontent.com // Submitted by Victor Velchev we.bs +// Listen53 : https://www.l53.net +// Submitted by Gerry Keh +filegear-sg.me +ggff.net + // Localcert : https://localcert.dev // Submitted by Lann Martin *.user.localcert.dev -// localzone.xyz -// Submitted by Kenny Niehage -localzone.xyz - // Log'in Line : https://www.loginline.com/ // Submitted by Rémi Mach loginline.app @@ -14199,6 +14207,13 @@ barsyonline.co.uk // Submitted by Ilya Zaretskiy hb.cldmail.ru +// MathWorks : https://www.mathworks.com/ +// Submitted by Emily Reed +matlab.cloud +modelscape.com +mwcloudnonprod.com +polyspace.com + // May First - People Link : https://mayfirst.org/ // Submitted by Jamie McClelland mayfirst.info @@ -14288,6 +14303,13 @@ trafficmanager.net blob.core.windows.net servicebus.windows.net +// MikroTik: https://mikrotik.com +// Submitted by MikroTik SysAdmin Team +routingthecloud.com +sn.mynetname.net +routingthecloud.net +routingthecloud.org + // minion.systems : http://minion.systems // Submitted by Robert Böttinger csx.cc @@ -14514,9 +14536,6 @@ n4t.co ddnslive.com myiphost.com forumz.info -16-b.it -32-b.it -64-b.it soundcast.me tcp4.me dnsup.net @@ -14538,8 +14557,8 @@ zapto.xyz nsupdate.info nerdpol.ovh -// NYC.mn : http://www.information.nyc.mn -// Submitted by Matthew Brown +// NYC.mn : https://dot.nyc.mn/ +// Submitted by NYC.mn Subdomain Service nyc.mn // O3O.Foundation : https://o3o.foundation/ @@ -14555,7 +14574,7 @@ obl.ong observablehq.cloud static.observableusercontent.com -// OMG.LOL : +// OMG.LOL : https://omg.lol // Submitted by Adam Newbold omg.lol @@ -14591,6 +14610,7 @@ simplesite.pl // Open Domains : https://open-domains.net // Submitted by William Harrison +is-a-fullstack.dev is-cool.dev is-not-a.dev localplayer.dev @@ -14604,6 +14624,12 @@ opensocial.site // Submitted by Sven Marnach opencraft.hosting +// OpenHost : https://registry.openhost.uk +// Submitted by OpenHost Registry Team +16-b.it +32-b.it +64-b.it + // OpenResearch GmbH: https://openresearch.com/ // Submitted by Philipp Schmid orsites.com @@ -14794,7 +14820,7 @@ qoto.io // Submitted by Xavier De Cock qualifioapp.com -// Quality Unit: https://qualityunit.com +// Quality Unit : https://qualityunit.com // Submitted by Vasyl Tsalko ladesk.com @@ -14844,6 +14870,7 @@ ravpage.co.il // Read The Docs, Inc : https://www.readthedocs.org // Submitted by David Fischer +readthedocs-hosted.com readthedocs.io // Red Hat, Inc. OpenShift : https://openshift.redhat.com/ @@ -14905,11 +14932,6 @@ devices.resinstaging.io // Submitted by Chris Kastorff hzc.io -// Revitalised Limited : http://www.revitalised.co.uk -// Submitted by Jack Price -wellbeingzone.eu -wellbeingzone.co.uk - // Rico Developments Limited : https://adimo.co // Submitted by Colin Brown adimo.co.uk @@ -14948,6 +14970,10 @@ rocky.page // Submitted by Tech Support ras.ru +// Sakura Frp : https://www.natfrp.com +// Submitted by Bobo Liu +nyat.app + // SAKURA Internet Inc. : https://www.sakura.ad.jp/ // Submitted by Internet Service Department 180r.com @@ -15602,11 +15628,11 @@ wafflecell.com webflow.io webflowtest.io -// WebHare bv: https://www.webhare.com/ +// WebHare bv : https://www.webhare.com/ // Submitted by Arnold Hendriks *.webhare.dev -// WebHotelier Technologies Ltd: https://www.webhotelier.net/ +// WebHotelier Technologies Ltd : https://www.webhotelier.net/ // Submitted by Apostolos Tsakpinis bookonline.app hotelwithflight.com @@ -15622,7 +15648,7 @@ pdns.page plesk.page wpsquared.site -// WebWaddle Ltd: https://webwaddle.com/ +// WebWaddle Ltd : https://webwaddle.com/ // Submitted by Merlin Glander *.wadl.top @@ -15644,6 +15670,12 @@ toolforge.org wmcloud.org wmflabs.org +// William Harrison : https://wdharrison.com +// Submitted by William Harrison +wdh.app +preview.wdh.app +t.hrsn.net + // WISP : https://wisp.gg // Submitted by Stepan Fedotov panel.gg @@ -15698,7 +15730,7 @@ cistron.nl demon.nl xs4all.space -// Yandex.Cloud LLC: https://cloud.yandex.com +// Yandex.Cloud LLC : https://cloud.yandex.com // Submitted by Alexander Lodin yandexcloud.net storage.yandexcloud.net diff --git a/release/man/adbyss.1 b/release/man/adbyss.1 index f98ba7f..00c1c6f 100644 --- a/release/man/adbyss.1 +++ b/release/man/adbyss.1 @@ -1,6 +1,6 @@ -.TH "ADBYSS" "1" "August 2024" "Adbyss v0.12.0" "User Commands" +.TH "ADBYSS" "1" "September 2024" "Adbyss v0.13.0" "User Commands" .SH NAME -Adbyss \- Manual page for adbyss v0.12.0. +Adbyss \- Manual page for adbyss v0.13.0. .SH DESCRIPTION Adbyss is a DNS blacklist manager for Linux. .SS USAGE: