chiark / gitweb /
put token in ? parameters
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 25 Nov 2020 23:15:40 +0000 (23:15 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 25 Nov 2020 23:15:40 +0000 (23:15 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/daemon-otter.rs
src/global.rs
src/session.rs
templates/script.ts

index 864e83d3e9eeef88c3d17368e788956a9d5ff600..a91ba444e75b56a7f04190533a05b736ef934be3 100644 (file)
@@ -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("/<ptoken>")]
+#[get("/")]
 #[throws(OE)]
-fn loading(ptoken : InstanceAccess<PlayerId>) -> 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<Self, (rocket::http::Status, <Self as rocket::request::FromRequest<'a, 'r>>::Error), ()> {
+    eprintln!("REQUEST uri={:?}", &r.uri());
+    let q = r.uri().query();
+    rocket::Outcome::Success(WholeQueryString(q))
+  }
 }
 
-#[get("/_/updates/<ctoken>/<gen>")]
+#[get("/_/updates?<ctoken>&<gen>")]
 #[throws(OE)]
 fn updates<'r>(ctoken : InstanceAccess<ClientId>, 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,
index 935c458ba53105edd1e1158d77a0dc650ae5a556..f88ca22ec7e4cff7fdb357991b3cb0676cbaaa71 100644 (file)
@@ -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<RawTokenVal> 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<Id : AccessId>(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<Id::Error>
 {
   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)?;
index b919ec6c449e86737577642fd166c27626719a13..736f5a797dc79154d6530d7be1fb771b3d40709e 100644 (file)
@@ -187,7 +187,7 @@ fn session(form : Json<SessionForm>) -> Result<Template,OE> {
         &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 {
index 577a0311a40111631dbbfec64fc40667515252ca..2610224d295a18f06b682611f8cf6dd6601d3fd7 100644 (file)
@@ -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;