chiark / gitweb /
wip player access
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 22:34:54 +0000 (23:34 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 22:34:59 +0000 (23:34 +0100)
src/global.rs
src/spec.rs

index 63b5515d8fb0deeb627d7e70337b563ba45db418..d068d0e6c3c5b8e1941a453420fb80a1d2ef90bf 100644 (file)
@@ -418,15 +418,33 @@ impl InstanceGuard<'_> {
   }
 
   #[throws(OE)]
-  pub fn player_access_register(&mut self, token: RawToken, player: PlayerId) {
-    // xxx server has to not allow unpriv users to define tokens
-    // xxx which is a shame because it means tokens can't persist,
-    // xxx unless game is never destroyed ?
-    // xxx these things are then more like tables, and persistent
-    // xxx boxes feature maybe
-    let iad = InstanceAccessDetails { gref : self.gref.clone(), ident : player };
+  pub fn player_access_register_xxx(&mut self, token: RawToken, player: PlayerId) {
+    // xxx server has to not allow even facilitators to define tokens
+    // xxx this fn should become part of player_access_add
+    let iad = InstanceAccessDetails {
+      gref : self.gref.clone(),
+      ident : player
+    };
     self.token_register(token, iad);
+  }
+
+  #[throws(OE)]
+  pub fn player_access_reset(&mut self, player: PlayerId) -> RawToken {
+    // tokens can't persist unless game is never destroyed ?
+    // so a game is like a tables, and persistent
+    // xxx boxes feature maybe
+    self.tokens_deregister_for_id(|id:PlayerId| id==player);
+    self.save_access_now()?;
+    let iad = InstanceAccessDetails {
+      gref : self.gref.clone(),
+      ident : player
+    };
+    let token = RawToken::new_random()?;
+    self.token_register(token.clone(), iad);
     self.save_access_now()?;
+    // If the save fails, we don't return the token so no-one can use
+    // it.  Therefore we don't need to bother deleting it.
+    token
   }
 
   fn token_register<Id:AccessId>(
@@ -596,7 +614,7 @@ impl AccessId for ClientId {
 
 impl RawToken {
   #[throws(OE)]
-  pub fn new_random() -> Self {
+  fn new_random() -> Self {
     let mut rng = thread_rng();
     let token = RawToken (
       repeat_with(|| rng.sample(Alphanumeric))
@@ -654,6 +672,6 @@ pub fn xxx_global_setup() {
     let player = g.player_new(PlayerState {
       nick : nick.to_string(),
     })?;
-    g.player_access_register(RawToken(token.to_string()), player)?;
+    g.player_access_register_xxx(RawToken(token.to_string()), player)?;
   }
 }
index fb284e9802120800297933292ef681536fabba63..ff69d38630c6a5250c1980912a71aaff9d319ac9 100644 (file)
@@ -30,14 +30,5 @@ pub struct PiecesSpec {
 #[typetag::serde(tag="access")]
 pub trait PlayerAccessSpec : Debug {
   #[throws(OE)]
-  fn make_token(&self) -> RawToken { RawToken::new_random()? }
   fn deliver_token(&mut self) -> Result<(),OE>;
 }
-
-#[typetag::serde]
-impl PlayerAccessSpec for RawToken {
-  #[throws(OE)]
-  fn make_token(&self) -> RawToken { self.clone() }
-  #[throws(OE)]
-  fn deliver_token(&mut self) { }
-}