From 4ab1d72a1340401248d64f55a8ab1f47b513c77a Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 25 Nov 2020 23:15:40 +0000 Subject: [PATCH] put token in ? parameters Signed-off-by: Ian Jackson --- src/bin/daemon-otter.rs | 34 +++++++++++++++++++++------------- src/global.rs | 10 +++++----- src/session.rs | 2 +- templates/script.ts | 4 +++- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/bin/daemon-otter.rs b/src/bin/daemon-otter.rs index 864e83d3..a91ba444 100644 --- a/src/bin/daemon-otter.rs +++ b/src/bin/daemon-otter.rs @@ -14,13 +14,6 @@ use otter::imports::*; #[derive(Serialize,Debug)] struct FrontPageRenderContext { } -#[get("/")] -#[throws(OE)] -fn index() -> Template { - let c = FrontPageRenderContext { }; - Template::render("front",&c) -} - #[derive(Copy,Clone,Debug)] enum ResourceLocation { Main, Wasm(&'static str), } type RL = ResourceLocation; @@ -66,14 +59,30 @@ impl<'r> FromParam<'r> for CheckedResourceLeaf { struct LoadingRenderContext<'r> { ptoken : &'r RawTokenVal, } -#[get("/")] +#[get("/")] #[throws(OE)] -fn loading(ptoken : InstanceAccess) -> Template { - let c = LoadingRenderContext { ptoken : ptoken.raw_token }; - Template::render("loading",&c) +fn loading(ptoken: WholeQueryString) -> Template { + if let Some(ptoken) = ptoken.0 { + let c = LoadingRenderContext { ptoken : RawTokenVal::from_str(ptoken) }; + Template::render("loading",&c) + } else { + let c = FrontPageRenderContext { }; + Template::render("front",&c) + } +} + +struct WholeQueryString<'r>(pub Option<&'r str>); + +impl<'a,'r> FromRequest<'a,'r> for WholeQueryString<'a> { + type Error = Impossible; + fn from_request(r: &'a rocket::Request<'r>) -> rocket::Outcome>::Error), ()> { + eprintln!("REQUEST uri={:?}", &r.uri()); + let q = r.uri().query(); + rocket::Outcome::Success(WholeQueryString(q)) + } } -#[get("/_/updates//")] +#[get("/_/updates?&")] #[throws(OE)] fn updates<'r>(ctoken : InstanceAccess, gen: u64, cors: rocket_cors::Guard<'r>) @@ -200,7 +209,6 @@ fn main() { .attach(Template::fairing()) .manage(cors_state) .mount("/", routes![ - index, loading, resource, updates, diff --git a/src/global.rs b/src/global.rs index 935c458b..f88ca22e 100644 --- a/src/global.rs +++ b/src/global.rs @@ -238,7 +238,7 @@ impl RawTokenVal { // str is [u8] with a funny hat on, so &str is pointer + byte count. // nomicon says &SomeStruct([T]) is pointer plus number of elements. // So &str and &SomeStruct(str) have the same layout - fn from_str(s: &str) -> &RawTokenVal { unsafe { mem::transmute(s) } } + pub fn from_str(s: &str) -> &RawTokenVal { unsafe { mem::transmute(s) } } } impl Borrow for RawToken { @@ -739,8 +739,8 @@ impl<'ig> InstanceGuard<'ig> { let ipl = &self.c.g.iplayers.byid(player)?.ipl; let gpl = self.c.g.gs.players.byid(player)?; - let url = format!("{}/{}", - &config().public_url.trim_start_matches("/"), + let url = format!("{}/?{}", + &config().public_url.trim_end_matches("/"), token.0); let info = AccessTokenInfo { url }; let report = access.deliver(&gpl, &ipl, info)?; @@ -1140,12 +1140,12 @@ pub fn lookup_token(s : &RawTokenVal) .ok_or(Id::ERROR) } -impl<'r, Id> FromParam<'r> for InstanceAccess<'r, Id> +impl<'r, Id> FromFormValue<'r> for InstanceAccess<'r, Id> where Id : AccessId, OE : From { type Error = OE; #[throws(OE)] - fn from_param(param: &'r RawStr) -> Self { + fn from_form_value(param: &'r RawStr) -> Self { let g = Id::global_tokens(PRIVATE_Y).read().unwrap(); let token = RawTokenVal::from_str(param.as_str()); let i = g.get(token).ok_or(Id::ERROR)?; diff --git a/src/session.rs b/src/session.rs index b919ec6c..736f5a79 100644 --- a/src/session.rs +++ b/src/session.rs @@ -187,7 +187,7 @@ fn session(form : Json) -> Result { &player, client, &c.nick, &c.ctoken, iad.gref.lock().ok().as_ref().map(|ig| &**ig)); - Ok(Template::render("landscape",&c)) + Ok(Template::render("session",&c)) } pub fn mount(rocket_instance: Rocket) -> Rocket { diff --git a/templates/script.ts b/templates/script.ts index 577a0311..2610224d 100644 --- a/templates/script.ts +++ b/templates/script.ts @@ -1096,7 +1096,9 @@ function startup() { redisplay_ancillaries(piece,p); } - var es = new EventSource(sse_url_prefix + "/_/updates/"+ctoken+'/'+gen); + var es = new EventSource( + sse_url_prefix + "/_/updates?ctoken="+ctoken+'&gen='+gen + ); es.onmessage = function(event) { console.log('GOTEVE', event); var k; -- 2.30.2