diff options
Diffstat (limited to 'server/src/db.rs')
-rw-r--r-- | server/src/db.rs | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/server/src/db.rs b/server/src/db.rs index 2bc3f9b..bad748d 100644 --- a/server/src/db.rs +++ b/server/src/db.rs @@ -101,16 +101,64 @@ fn generate_login_token() -> String { base64_encode(&bytes) } +fn current_time() -> i64 { + SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs() as i64 +} + pub async fn create_login_token(db: DB, username: &str) -> Result<String, ()> { let mut conn = db.lock().await; - let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs(); + let now = current_time(); let token = generate_login_token(); match sqlx::query("insert into Logins (user, token, expire) values ($1, $2, $3)") .bind(username) .bind(&token) - .bind(now as i64 + LOGIN_TOKEN_EXPIRE_SECS) + .bind(now + LOGIN_TOKEN_EXPIRE_SECS) .execute(conn.deref_mut()).await { Ok(_) => Ok(token), Err(_) => Err(()), } } + +pub async fn drop_token(db: DB, token: &str) { + let mut conn = db.lock().await; + // ignore errors + let _ = sqlx::query("delete from Logins where token = $1") + .bind(token) + .execute(conn.deref_mut()).await; +} + +async fn set_token_expire(conn: &mut SqliteConnection, token: &str, expire: i64) -> Result<(), String> { + match sqlx::query("update Logins set expire = $1 where token = $2") + .bind(expire) + .bind(token) + .execute(conn).await { + Ok(_) => Ok(()), + Err(err) => { + eprintln!("set_token_expire: err = {err}"); + Err("Server error".to_string()) + } + } +} + +pub async fn maybe_refresh_token(db: DB, token: &str) -> Result<(), String> { + let mut conn = db.lock().await; + let now = current_time(); + match sqlx::query("select expire from Logins where token = $1") + .bind(token) + .fetch_optional(conn.deref_mut()).await { + Ok(Some(row)) => { + if now >= row.get::<i64, _>(0) - LOGIN_TOKEN_REFRESH_MARGIN { + set_token_expire(conn.deref_mut(), token, now + LOGIN_TOKEN_EXPIRE_SECS).await + } else { + Ok(()) + } + }, + Ok(None) => { + Err("Not logged in".to_string()) + }, + Err(err) => { + eprintln!("maybe_refresh_token: err = {err}"); + Err("Server error".to_string()) + } + } +} |