From 981b4bf7aeaf097c979062e7cde81e786556c497 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 3 May 2021 23:39:18 +0100 Subject: [PATCH] AssetUrlKey: wip Signed-off-by: Ian Jackson --- src/bundles.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ src/global.rs | 3 +++ src/prelude.rs | 1 + 3 files changed, 46 insertions(+) diff --git a/src/bundles.rs b/src/bundles.rs index 7af582a8..bd84f294 100644 --- a/src/bundles.rs +++ b/src/bundles.rs @@ -47,6 +47,48 @@ hformat_as_display!{Id} const BUNDLES_MAX: Index = Index(64); +#[derive(Clone)] +pub enum AssetUrlKey { + Dummy, + Y(AssetUrlKeyRaw), +} +type AssetUrlKeyRaw = [u8; 32]; +impl Debug for AssetUrlKey { + #[throws(fmt::Error)] + fn fmt(&self, f: &mut Formatter) { + use AssetUrlKey::*; + match self { + Y(_) => write!(f, "AssetUrlKey::Y{{..}}")?, + Dummy => write!(f, "AssetUrlKey::Dummy")?, + } + } +} +impl AssetUrlKey { + #[throws(IE)] + pub fn new_random() -> AssetUrlKey { + let mut buf: AssetUrlKeyRaw = default(); + let mut rng: rand::rngs::ThreadRng = thread_rng(); + rand::RngCore::try_fill_bytes(&mut rng, &mut buf) + .context("generate new AssetUrlKey")?; + AssetUrlKey::Y(buf) + } +} +pub type AssetUrlToken = digest::Output; +impl AssetUrlKey { + pub fn token(&self, what: &str, v: V) -> AssetUrlToken + where V: Serialize { + let k = match self { + AssetUrlKey::Y(k) => k, + _ => panic!("dummy AssetUrlKey being used!"), + }; + let mut dw = DigestWrite::sink(); + write!(dw, "{}\0", what).unwrap(); + dw.write(&k[..]).unwrap(); + rmp_serde::encode::write(&mut dw, &v).expect("serialize failed!"); + dw.finish().0 + } +} + #[derive(Copy,Clone,Debug,Hash,PartialEq,Eq,Ord,PartialOrd)] #[derive(Serialize,Deserialize)] pub struct Id { pub index: Index, pub kind: Kind, } diff --git a/src/global.rs b/src/global.rs index c35a7d5c..22c02f30 100644 --- a/src/global.rs +++ b/src/global.rs @@ -57,6 +57,7 @@ pub struct Instance { pub acl: LoadedAcl, pub links: Arc, pub bundle_list: MgmtBundleList, // copy for easy access + pub asset_url_key: AssetUrlKey, } pub struct PlayerRecord { @@ -345,6 +346,7 @@ impl Instance { tokens_clients: default(), links: default(), bundle_list: default(), + asset_url_key: AssetUrlKey::new_random()?, }; let c = InstanceContainer { @@ -1158,6 +1160,7 @@ impl InstanceGuard<'_> { tokens_clients: default(), tokens_players: default(), bundle_list: default(), // set by load_game_bundles + asset_url_key: AssetUrlKey::Dummy, }; let b = InstanceBundles::load_game_bundles(&mut g)?; diff --git a/src/prelude.rs b/src/prelude.rs index 1f45a801..315830f0 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -123,6 +123,7 @@ pub use crate::accounts::*; pub use crate::authproofs::{self, Authorisation, Unauthorised}; pub use crate::authproofs::AuthorisationSuperuser; pub use crate::bundles::{self, InstanceBundles, MgmtBundleListExt}; +pub use crate::bundles::{AssetUrlKey, AssetUrlToken}; pub use crate::commands::{AccessTokenInfo, AccessTokenReport, MgmtError}; pub use crate::commands::{MgmtCommand, MgmtResponse}; pub use crate::commands::{MgmtGameInstruction, MgmtGameResponse}; -- 2.30.2