chiark / gitweb /
fix player access errors
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 23:20:27 +0000 (00:20 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 23:20:27 +0000 (00:20 +0100)
src/commands.rs
src/global.rs

index d34f29b8a210cbf691047bf2808f0d4c1455612b..e08870267ad41106e52ff60789c9a58f6e4e9100 100644 (file)
@@ -17,6 +17,7 @@ pub enum MgmtCommand {
 pub enum MgmtGameInstruction {
   Noop { },
   AddPiece(PiecesSpec),
+  // todo: RemovePiece
   AddPlayer(PlayerState),
   RemovePlayer(PlayerId),
 }
@@ -50,6 +51,7 @@ pub enum MgmtError {
   GameBeingDestroyed,
   GameNotFound,
   GameCorrupted,
+  PlayerNotFound,
   LimitExceeded,
   SVGProcessingFailed(#[from] SVGProcessingError),
   GameError(#[from] GameError),
index d5c5e7dd59ec83721e129c52419ab9f50bc35e37..79944ddc65cc719ca0eb13a29878b05805d9c94f 100644 (file)
@@ -428,12 +428,15 @@ impl InstanceGuard<'_> {
     self.token_register(token, iad);
   }
 
-  #[throws(OE)]
+  #[throws(MgmtError)]
   pub fn player_access_reset(&mut self, players: &[PlayerId])
                              -> Vec<RawToken> {
     // tokens can't persist unless game is never destroyed ?
     // so a game is like a tables, and persistent
     // xxx boxes feature maybe
+    for &player in players {
+      self.c.g.gs.players.get(player).ok_or(MgmtError::PlayerNotFound)?;
+    }
     self.tokens_deregister_for_id(|id:PlayerId| players.contains(&id));
     self.save_access_now()?;
     let mut tokens = vec![];
@@ -442,7 +445,7 @@ impl InstanceGuard<'_> {
         gref : self.gref.clone(),
         ident : player
       };
-      let token = RawToken::new_random()?;
+      let token = RawToken::new_random();
       self.token_register(token.clone(), iad);
       tokens.push(token);
     }
@@ -618,7 +621,6 @@ impl AccessId for ClientId {
 }
 
 impl RawToken {
-  #[throws(OE)]
   fn new_random() -> Self {
     let mut rng = thread_rng();
     let token = RawToken (
@@ -653,7 +655,7 @@ pub fn record_token<Id : AccessId> (
   ig : &mut InstanceGuard,
   iad : InstanceAccessDetails<Id>
 ) -> RawToken {
-  let token = RawToken::new_random()?;
+  let token = RawToken::new_random();
   ig.token_register(token.clone(), iad);
   token
 }