From: Ian Jackson Date: Mon, 3 May 2021 22:42:30 +0000 (+0100) Subject: bundles download: Add download route X-Git-Tag: otter-0.6.0~399 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=81f2507c77d3a8cbcfc8e9999d9081139aaf5a7a;p=otter.git bundles download: Add download route Client is not told about this yet. Signed-off-by: Ian Jackson --- diff --git a/daemon/main.rs b/daemon/main.rs index f0df055c..e78deef4 100644 --- a/daemon/main.rs +++ b/daemon/main.rs @@ -201,6 +201,36 @@ fn resource<'r>(leaf: CheckedResourceLeaf) -> impl Responder<'r> { Content(leaf.ctype, NamedFile::open(path)?) } +#[derive(Error,Debug)] +enum BundleDownloadError { + BadAssetUrlToken(#[from] BadAssetUrlToken), + NotFound, + IE(#[from] IE), +} +display_as_debug!{BundleDownloadError} + +#[get("/_/bundle///")] +#[throws(BundleDownloadError)] +fn bundle<'r>(instance: Parse, + id: Parse, + token: Parse) -> impl Responder<'r> { + let instance = &instance.0; + let id = id.0; + let gref = Instance::lookup_by_name_unauth(instance) + .map_err(|_| BadAssetUrlToken)?; + let auth = { + let gref = gref.by_ref(Authorisation::authorise_any()); + let ig = gref.lock().map_err(|_| BadAssetUrlToken)?; + ig.asset_url_key.check("bundle", &(instance, id), &token.0)? + }.map(|(_,id)| id); + let f = id.open_by_name(instance, auth).map_err(IE::from)?; + let ctype = match id.kind { + bundles::Kind::Zip => ContentType::ZIP, + }; + if_let!{ Some(f) = f; else throw!(BundleDownloadError::NotFound) } + Content(ctype, rocket::response::Stream::from(f)) +} + #[derive(Debug,Copy,Clone)] struct ContentTypeFixup; impl fairing::Fairing for ContentTypeFixup { @@ -335,6 +365,7 @@ fn main() { .mount("/", routes![ loading_l, loading_p, + bundle, resource, updates, ])