From 4144debb6c0317efcde3c97fc6d8b369c6530b6d Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Fri, 20 Jul 2018 13:34:33 -0700 Subject: entity ident (fcid) UUID helpers Could perhaps implement these as impl methods on the uuid::Uuid struct instead? --- rust/Cargo.lock | 9 ++++++++- rust/Cargo.toml | 1 + rust/src/lib.rs | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index c8dc516f..8528ed90 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -165,6 +165,11 @@ dependencies = [ "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "data-encoding" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "diesel" version = "1.3.0" @@ -292,6 +297,7 @@ version = "0.1.0" dependencies = [ "chrono 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", + "data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "diesel 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "diesel_migrations 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "dotenv 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -302,7 +308,7 @@ dependencies = [ "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "iron-slog 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "iron-test 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1264,6 +1270,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87" "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536" "checksum conduit-mime-types 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "95ca30253581af809925ef68c2641cc140d6183f43e12e0af4992d53768bd7b8" +"checksum data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "67df0571a74bf0d97fb8b2ed22abdd9a48475c96bd327db968b7d9cace99655e" "checksum diesel 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9db28a518f3e0c61bdb0044d9a8b2b369373c090c19fec07e49e3b8511dcffa" "checksum diesel_derives 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03bcaf77491f53e400d5ee3bdd57142ea4e1c47fe9217b3361ff9a76ca0e3d37" "checksum diesel_migrations 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b42c35d1ce9e8d57a3e7001b4127f2bc1b073a89708bb7019f5be27c991c28" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 1a584d84..07020e67 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -15,6 +15,7 @@ clap = "*" error-chain = "0.11" uuid = "0.5" log = "*" +data-encoding = "2.1" # API server chrono = { version = "0.4", features = ["serde"] } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index d9193f2f..9de94d86 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -16,6 +16,7 @@ extern crate iron; extern crate serde_json; #[macro_use] extern crate log; +extern crate data_encoding; pub mod api_helpers; pub mod api_server; @@ -32,6 +33,7 @@ mod errors { Uuid(::uuid::ParseError); Io(::std::io::Error) #[cfg(unix)]; Serde(::serde_json::Error); + Base32(::data_encoding::DecodeError); } } } @@ -47,6 +49,7 @@ use dotenv::dotenv; use iron::middleware::AfterMiddleware; use iron::{Request, Response}; use std::env; +use data_encoding::BASE32_NOPAD; #[cfg(feature = "postgres")] embed_migrations!("../migrations/"); @@ -100,3 +103,21 @@ impl AfterMiddleware for XClacksOverheadMiddleware { Ok(res) } } + +/// Convert fatcat IDs (base32 strings) to UUID +pub fn fcid2uuid(fcid: &str) -> Result { + if fcid.len() != 20 { + bail!("invalid fatcat ID (expecting 20-chars of base32"); + } + let mut raw = vec![0; 16]; + BASE32_NOPAD.decode_mut(fcid.to_uppercase().as_bytes(), &mut raw) + .map_err(|dp| dp.error)?; + // unwrap() is safe here, because we know raw is always 16 bytes + Ok(uuid::Uuid::from_bytes(&raw).unwrap()) +} + +/// Convert UUID to fatcat ID string (base32 encoded) +pub fn uuid2fcid(id: &uuid::Uuid) -> String { + let raw = id.as_bytes(); + BASE32_NOPAD.encode(raw).to_lowercase() +} -- cgit v1.2.3