From 84639fa3b5e83cb650fb0efc6912bd6dd7f53b48 Mon Sep 17 00:00:00 2001 From: CenTdemeern1 Date: Mon, 13 Jan 2025 07:31:48 +0100 Subject: [PATCH] Add the ability to detect software from semver build metadata --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + known-software.json | 25 +++++++++++++++++++++++++ src/api/instance_info.rs | 8 ++++++-- src/known_software.rs | 33 +++++++++++++++++++++++++-------- 5 files changed, 64 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index febcf91..9369bf3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -281,6 +281,7 @@ version = "0.1.0" dependencies = [ "reqwest", "rocket", + "semver", "serde", "serde_json", "url", @@ -1537,6 +1538,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" + [[package]] name = "serde" version = "1.0.217" diff --git a/Cargo.toml b/Cargo.toml index f90a32a..9df5c41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] reqwest = "0.12.12" rocket = { version = "0.5.1", features = ["json"] } +semver = "1.0.24" serde = { version = "1.0.217", features = ["derive"] } serde_json = "1.0.135" url = "2.5.4" diff --git a/known-software.json b/known-software.json index 45bd4fc..828ad18 100644 --- a/known-software.json +++ b/known-software.json @@ -88,6 +88,31 @@ ], "forkOf": "mastodon" }, + "glitch-soc": { + "name": "Mastodon Glitch Edition", + "nodeinfoName": "mastodon", + "buildMetadata": "glitch", + "aliases": [ + "glitch" + ], + "groups": [ + "mastodon-compliant", + "mastodon-compliant-api" + ], + "forkOf": "mastodon" + }, + "chuckya": { + "name": "Chuckya", + "nodeinfoName": "mastodon", + "buildMetadata": "chuckya", + "aliases": [ + "chuckya" + ], + "groups": [ + "mastodon-compliant" + ], + "forkOf": "mastodon" + }, "misskey": { "name": "Misskey", "nodeinfoName": "misskey", diff --git a/src/api/instance_info.rs b/src/api/instance_info.rs index 47732f6..a670d0a 100644 --- a/src/api/instance_info.rs +++ b/src/api/instance_info.rs @@ -53,6 +53,7 @@ struct NodeInfo { #[derive(Deserialize)] struct NodeInfoSoftware { name: String, + version: String, } #[derive(Deserialize)] @@ -105,8 +106,11 @@ pub async fn instance_info(secure: bool, host: &str) -> Option = LazyLock::new(|| serde_json::from_str(include_str!("../known-software.json")).unwrap()); pub static KNOWN_SOFTWARE_NAMES: LazyLock> = LazyLock::new(|| KNOWN_SOFTWARE.get_name_map()); -pub static KNOWN_SOFTWARE_NODEINFO_NAMES: LazyLock> = - LazyLock::new(|| KNOWN_SOFTWARE.get_nodeinfo_name_map()); +pub static KNOWN_SOFTWARE_NODEINFO_NAMES: LazyLock< + HashMap)>, +> = LazyLock::new(|| KNOWN_SOFTWARE.get_nodeinfo_name_map()); #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct Software { name: String, nodeinfo_name: String, + build_metadata: Option, aliases: HashSet, groups: HashSet, fork_of: Option, @@ -50,13 +52,28 @@ impl KnownSoftware { map } - fn get_nodeinfo_name_map(&self) -> HashMap { - let mut map = HashMap::new(); + fn get_nodeinfo_name_map(&self) -> HashMap)> { + let mut map: HashMap)> = HashMap::new(); self.software.iter().for_each(|(name, software)| { - assert_eq!( - map.insert(software.nodeinfo_name.to_owned(), name.to_owned()), - None - ); + if let Some((mut_name, mut_map)) = map.get_mut(&software.nodeinfo_name) { + if let Some(build_metadata) = &software.build_metadata { + assert_eq!( + mut_map.insert(build_metadata.to_owned(), name.to_owned()), + None + ); + } else { + *mut_name = name.to_owned(); + } + } else { + let mut build_metadata_map = HashMap::new(); + if let Some(build_metadata) = &software.build_metadata { + build_metadata_map.insert(build_metadata.to_owned(), name.to_owned()); + } + map.insert( + software.nodeinfo_name.to_owned(), + (name.to_owned(), build_metadata_map), + ); + } }); map }