chiark / gitweb /
wip new arrangements
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 28 Jun 2020 23:27:51 +0000 (00:27 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 28 Jun 2020 23:27:51 +0000 (00:27 +0100)
src/bin/server.rs
src/global.rs
src/imports.rs
templates/loading.tera
templates/script.js
templates/test.tera

index c085931fec33a09584ac2709fd8a9e2ff0ac9a4f..ef03879f9f7fc9c4981721770111e0ce39ce3f1e 100644 (file)
@@ -41,18 +41,17 @@ impl<'r> FromParam<'r> for CheckedResourceLeaf {
 
 #[derive(Serialize,Debug)]
 struct LoadingRenderContext<'r> {
-  token : &'r str,
+  ptoken : &'r str,
 }
-
-#[get("/<token>")]
-fn loading(token : InstanceAccess<PlayerId>) -> Result<Template,RE> {
-  let c = LoadingRenderContext { token : token.raw_token };
+#[get("/<ptoken>")]
+fn loading(ptoken : InstanceAccess<PlayerId>) -> Result<Template,RE> {
+  let c = LoadingRenderContext { ptoken : ptoken.raw_token };
   Ok(Template::render("loading",&c))
 }
 
 #[derive(Serialize,Debug)]
 struct SessionRenderContext {
-  clientid : ClientId,
+  ctoken : String,
   player : PlayerId,
   defs : Vec<String>,
   uses : Vec<String>,
@@ -60,19 +59,26 @@ struct SessionRenderContext {
 
 #[derive(Deserialize)]
 struct SessionForm {
-  token : String,
+  ptoken : String,
 }
 #[post("/_/session", format="json", data="<form>")]
 fn session(form : Json<SessionForm>) -> Result<Template,RE> {
   // make session in this game, log a message to other players
-  let iad = lookup_token(&form.token).ok_or_else(|| anyhow!("unknown token"))?;
+  let iad = lookup_token(&form.ptoken)
+    .ok_or_else(|| anyhow!("unknown token"))?;
   let player = iad.ident;
   let c = {
     let mut ig = iad.g.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?;
-    let pl = ig.gs.players.get_mut(player)
+    let _pl = ig.gs.players.get_mut(player)
       .ok_or_else(|| anyhow!("player deleted"))?;
-    let client = Client { player };
-    let clientid = ig.clients.insert(client);
+    let cl = Client { player };
+    let client = ig.clients.insert(cl);
+
+    let ciad = InstanceAccessDetails {
+      g : iad.g.clone(),
+      ident : client,
+    };
+    let ctoken = record_token(ciad);
 
     let mut uses = vec![];
     let mut defs = vec![];
@@ -104,7 +110,7 @@ fn session(form : Json<SessionForm>) -> Result<Template,RE> {
     }
 
     SessionRenderContext {
-      clientid,
+      ctoken : ctoken.0,
       player,
       defs,
       uses,
@@ -146,7 +152,7 @@ fn api_grab(form : Json<ApiGrab>) -> impl response::Responder<'static> {
     let u_gen =
       if client == p.lastclient { p.gen_lastclient }
       else { p.gen_before_lastclient };
-    if u_gen > form.g { Err(OpError::Conflict)? }
+    if u_gen > q_gen { Err(OpError::Conflict)? }
     if p.held != None { Err(OpError::PieceHeld)? };
     p.held = Some(player);
     gs.gen += 1;
@@ -230,17 +236,17 @@ struct APIForm {
 }
  */
 
-#[get("/_/updates/<token>")]
+#[get("/_/updates/<ctoken>")]
 #[throws(RE)]
-fn updates(token : InstanceAccess<ClientId>)
+fn updates(ctoken : InstanceAccess<ClientId>)
            -> impl response::Responder<'static> {
-  let iad = token.i;
+  let iad = ctoken.i;
   let client = iad.ident;
   let _ = {
     let mut ig = iad.g.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?;
-    let g = &mut ig.gs;
+    let _g = &mut ig.gs;
     let cl = ig.clients.get(client).ok_or_else(|| anyhow!("no client"))?;
-    let player = cl.player;
+    let _player = cl.player;
   };
   let tc = TestCounterInner { next : 0 };
   let tc = BufReader::new(tc);
index b8180d3f9dad886223fff5e985e192166c4cf85a..50a02a54b5b29967fe08c4280b2dd15178607d79 100644 (file)
@@ -8,7 +8,7 @@ visible_slotmap_key!{ ClientId('C') }
 visible_slotmap_key!{ PlayerId('#') }
 
 #[derive(Clone,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]
-pub struct RawToken (String);
+pub struct RawToken (pub String);
 impl Borrow<str> for RawToken {
   fn borrow(&self) -> &str { &self.0 }
 }
@@ -70,6 +70,17 @@ pub fn lookup_token<Id : AccessId>(s : &str)
   Id::global_tokens().read().unwrap().get(s).cloned()
 }
 
+pub fn record_token<Id : AccessId>(iad : InstanceAccessDetails<Id>)
+                                   -> RawToken {
+  let mut rng = thread_rng();
+  let token = RawToken (
+    repeat_with(|| rng.sample(Alphanumeric))
+      .take(64).collect()
+  );
+  Id::global_tokens().write().unwrap().insert(token.clone(), iad);
+  token
+}
+
 const XXX_PLAYERS_TOKENS : &[(&str, &str)] = &[
   ("kmqAKPwK4TfReFjMor8MJhdRPBcwIBpe", "alice"),
   ("ccg9kzoTh758QrVE1xMY7BQWB36dNJTx", "bob"),
index 4b5693b6ace762f1e32bbde00f4e0c791ef32caf..1cf8593e12523e36590bbcccf8c9f8ca0b75e9c2 100644 (file)
@@ -9,6 +9,7 @@ pub use std::collections::HashMap;
 pub use std::borrow::Borrow;
 pub use std::convert::TryFrom;
 pub use std::str::FromStr;
+pub use std::iter::repeat_with;
 
 pub use thiserror::Error;
 pub use anyhow::{Context,anyhow};
@@ -27,6 +28,10 @@ pub use rocket::request::{FromParam,FromRequest,FromFormValue,LenientForm};
 pub use rocket::response::NamedFile;
 pub use rocket::response;
 
+pub use rand::thread_rng;
+pub use rand::Rng;
+pub use rand::distributions::Alphanumeric;
+
 pub use slotmap::dense::DenseSlotMap;
 pub type SecondarySlotMap<K,V> = slotmap::secondary::SecondaryMap<K,V>;
 pub use index_vec::{define_index_type,index_vec,IndexVec};
index 7cb658f11ee2a91b0cf90b478bbf79aacc111ef4..c16b24c0d62530cf3b1dcd4002ae1c717ab212b3 100644 (file)
@@ -1,4 +1,4 @@
 <body id="loading_body">
-<h1 id="loading_token" data-token="{{ token }}">Loading!</h1>
+<h1 id="loading_token" data-ptoken="{{ ptoken }}">Loading!</h1>
 <div id="error"></div>
 <script src="/_/script.js"></script>
index bac8d4989cfbf361c64ac7c8a4f4112ada116257..4150e90d3e7fb34eec9b4f346843b11086c0498a 100644 (file)
@@ -95,10 +95,9 @@ function drag_mousedown(e) {
     dragging = DRAGGING.MAYBE_GRAB;
     set_grab(delt, us);
     api('grab', {
-      t : token,
+      t : ctoken,
       g : gen,
       p : delt.dataset.p,
-      c : clientid,
       s : 0,
     })
   }
@@ -182,7 +181,7 @@ messages.TestCounter = function(data) {
 
 function startup() {
   var body = document.getElementById("main-body");
-  clientid = body.dataset.clientid;
+  ctoken = body.dataset.ctoken;
   us = body.dataset.us;
   status_node = document.getElementById('status');
   status_node.innerHTML = 'js-done'
@@ -190,7 +189,7 @@ function startup() {
   space = document.getElementById('space');
   svg_ns = space.getAttribute('xmlns');
 
-  es = new EventSource("/_/updates/"+token+"/"+clientid);
+  es = new EventSource("/_/updates/"+ctoken);
   es.onmessage = function(event) {
     var j = JSON.parse(event.data);
     var k = Object.keys(j)[0];
@@ -210,9 +209,9 @@ function startup() {
 function doload(){
   console.log('DOLOAD');
   var elem = document.getElementById('loading_token');
-  token = elem.dataset.token;
+  ptoken = elem.dataset.ptoken;
   xhr_post_then('/_/session', 
-               JSON.stringify({ token : token }),
+               JSON.stringify({ ptoken : ptoken }),
                loaded);
 }
 
index a787df008044bce50f81343cf6a7f9080d09be27..6b55a747071f73829a0b09bf70409bb8ac0f903d 100644 (file)
@@ -1,4 +1,4 @@
-<body id="main-body" data-clientid="{{clientid}}" data-us="{{player}}">
+<body id="main-body" data-ctoken="{{ctoken}}" data-us="{{player}}">
 <h1>Hi!</h1>
 <div id="error"></div>
 <p>