chiark / gitweb /
wip new account etc., adding acctid etc.
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 26 Oct 2020 18:57:06 +0000 (18:57 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 26 Oct 2020 18:57:06 +0000 (18:57 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/cmdlistener.rs
src/error.rs
src/global.rs

index ed7fca36d4b76ad5dd255ee0483832c077979f0d..4d5cb91a891ecb1f97a27f7bf3144f099d48b7bc 100644 (file)
@@ -120,7 +120,7 @@ fn execute(cs: &mut CommandStream, cmd: MgmtCommand) -> MgmtResponse {
 
     DeleteAccount(account) => {
       let auth = authorise_for_account(cs, &account)?;
-      AccountRecord::remove_entry(&account auth)?;
+      AccountRecord::remove_entry(&account, auth)?;
       Fine
     }
 
index 26b9690cb0a961238672a833e5b9f85a281e3916..8e213f771ffc5c05f38cfcd576151b4433a514c1 100644 (file)
@@ -61,6 +61,7 @@ impl From<InternalError> for SpecError {
 pub enum ErrorSignaledViaUpdate {
   InternalError,
   PlayerRemoved,
+  TokenRevoked,
   PieceOpError {
     piece: VisiblePieceId,
     error: PieceOpError,
index ba0395d160b8eca33c213b1f723977b26eb01f36..a199c5343be1a329e03ab4fb71f095ac00590837 100644 (file)
@@ -449,6 +449,30 @@ impl InstanceGuard<'_> {
     (player, logentry)
   }
 
+  pub fn remove_clients(&mut self,
+                        player: PlayerId,
+                        signal: ErrorSignaledViaUpdate) {
+    let mut clients_to_remove = HashSet::new();
+    self.clients.retain(|k,v| {
+      let remove = v.player == oldplayer;
+      if remove { clients_to_remove.insert(k); }
+      !remove
+    });
+
+    let gen = self.c.g.gs.gen;
+    if let Some(iplayer) = self.iplayers.get_mut(player) {
+      iplayer.u.push(PreparedUpdate {
+        gen,
+        when: Instant::now(),
+        us : vec![ PreparedUpdateEntry::Error(
+          None,
+          signal,
+        )],
+      });
+    };
+    self.tokens_deregister_for_id(|id| clients_to_remove.contains(&id));
+  }
+
   //  #[throws(ServerFailure)]
   //  https://github.com/withoutboats/fehler/issues/62
   pub fn player_remove(&mut self, oldplayer: PlayerId)
@@ -528,29 +552,10 @@ impl InstanceGuard<'_> {
       }
       buf.finish();
 
-      let mut clients_to_remove = HashSet::new();
-      self.clients.retain(|k,v| {
-        let remove = v.player == oldplayer;
-        if remove { clients_to_remove.insert(k); }
-        !remove
-      });
-      let pst = if let Some(PlayerRecord { u: mut updates, pst })
-        = self.iplayers.remove(oldplayer)
-      {
-        updates.push(PreparedUpdate {
-          gen: self.c.g.gs.gen,
-          when: Instant::now(),
-          us : vec![ PreparedUpdateEntry::Error(
-            None,
-            ErrorSignaledViaUpdate::PlayerRemoved
-          )],
-        });
-        Some(pst)
-      } else {
-        None
-      };
+      self.remove_clients(player, ErrorSignaledViaUpdate::PlayerRemoved);
       self.tokens_deregister_for_id(|id:PlayerId| id==oldplayer);
-      self.tokens_deregister_for_id(|id| clients_to_remove.contains(&id));
+      let iplayer = self.iplayers.remove(oldplayer);
+      let pst = iplayer.map(|iplayer| iplayer.pst);
       self.save_access_now().unwrap_or_else(
         |e| warn!(
           "trouble garbage collecting accesses for deleted player: {:?}",
@@ -565,7 +570,16 @@ impl InstanceGuard<'_> {
   #[throws(InternalError)]
   pub fn invalidate_tokens(&mut self, player: PlayerId) {
     let old_tokens = self.tokens_players.get(player).clone();
-    xxx much of middle of the infallible bit of player_remove
+    self.tokens_deregister_for_id(|id:PlayerId| id==oldplayer);
+    save_access_now().map_err(|e|{
+      // oof
+      self.tokens.players.insert(player, old_tokens);
+      e
+    })?;
+    // ppoint of no return
+    (||{
+      self.remove_clients(player, ErrorSignaledViaUpdate::TokenRevoked);
+    })(); // <- No ?, ensures that IEFE is infallible (barring panics)
   }
 
   #[throws(MgmtError)]
@@ -1056,7 +1070,7 @@ pub fn record_token<Id : AccessId> (
 #[throws(E)]
 pub fn process_all_players_for_account<
     E: Error,
-    F: FnMut(&mut InstanceGuard, player: PlayerId) -> Result<(),E>
+    F: FnMut(&mut InstanceGuard, PlayerId) -> Result<(),E>
     >
   (acctid: AccountId, f: F)
 {