diff options
| author | troido <troido@protonmail.com> | 2020-04-23 23:34:51 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-23 23:34:51 +0200 |
| commit | 71744e0d16a23acde3e743c94838dbae9af057a9 (patch) | |
| tree | 30844ae01ee5d2745ce7c2f87161c7b509992b73 | |
| parent | d577a3f874a3fc2cb71708f400482ca817abc33e (diff) | |
hash the password server-side too
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/auth.rs | 16 | ||||
| -rw-r--r-- | src/gameserver.rs | 3 |
3 files changed, 18 insertions, 3 deletions
@@ -18,3 +18,5 @@ serde = { version = "1.0", features = ["derive"] } ctrlc = { version = "3.1", features = ["termination"] } structopt = "0.3" unicode_categories = "0.1.1" +base64 = "0.12.0" +sha2 = "0.8.1" diff --git a/src/auth.rs b/src/auth.rs index 8178593..af74b08 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -3,9 +3,12 @@ use std::path::{PathBuf}; use std::fs; use std::env; use std::io::ErrorKind; -use serde_json; +use serde_json; use serde::{Serialize, Deserialize}; +use sha2::{Sha256, Digest}; +use base64::decode; + use crate::{ PlayerId, errors::AnyError, @@ -31,6 +34,17 @@ pub struct User { pub role: UserRole } +impl User { + pub fn validate_token(&self, token: &str) -> bool { + if let (Ok(saved), Ok(given)) = (decode(&self.pass_token), decode(token)) { + let hashed: Vec<u8> = Sha256::digest(&given)[..].to_vec(); + hashed == saved + } else { + false + } + } +} + macro_rules! inv { ($code:expr) => {($code).map_err(|err| LoaderError::InvalidResource(Box::new(err)))} } diff --git a/src/gameserver.rs b/src/gameserver.rs index 37b889f..4947c8d 100644 --- a/src/gameserver.rs +++ b/src/gameserver.rs @@ -209,8 +209,7 @@ impl GameServer { println!("Name mismatch: user entry for {:?} has name {}", player, user.name); return Err(merr!("server", "name mismatch")); } - if token != user.pass_token { - println!("password mismatch: '{}' '{}'", token, user.pass_token); + if !user.validate_token(&token) { return Err(merr!("invalidtoken", "invalid pass token")); } () |
