+addUser ∷ MonadIO m ⇒ AuthDB → Text → Text → m ()
+addUser adb name pass
+ = liftIO $
+ do sha1 ← fromJust <$> getDigestByName "SHA1"
+ let hash = digestBS' sha1 $ T.encodeUtf8 pass
+ m ← atomically $ do m ← readTVar (adbUserMap adb)
+ let m' = M.insert name hash m
+ writeTVar (adbUserMap adb) m'
+ return m'
+ saveUserMap (adbFilePath adb) m
+
+delUser ∷ MonadIO m ⇒ AuthDB → Text → m ()
+delUser adb name
+ = liftIO $
+ do m ← atomically $ do m ← readTVar (adbUserMap adb)
+ let m' = M.delete name m
+ writeTVar (adbUserMap adb) m'
+ return m'
+ saveUserMap (adbFilePath adb) m
+
+loadUserMap ∷ FilePath → IO UserMap