diff --git a/resources/migrations/sql/create_tables_001.sql b/resources/migrations/sql/create_tables_001.sql index 78a6d40..6fb4169 100644 --- a/resources/migrations/sql/create_tables_001.sql +++ b/resources/migrations/sql/create_tables_001.sql @@ -2,12 +2,14 @@ PRAGMA journal_mode= WAL; CREATE TABLE IF NOT EXISTS ledger_internal ( + -- th id INTEGER PRIMARY KEY AUTOINCREMENT, creation_time DATETIME DEFAULT CURRENT_TIMESTAMP, cookie_secret TEXT NOT NULL - ); +INSERT INTO ledger_internal(cookie_secret) VALUES ('aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkk'); + CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, diff --git a/src/db/_ledger_internal.rs b/src/db/_ledger_internal.rs index 337a2f1..771dbc8 100644 --- a/src/db/_ledger_internal.rs +++ b/src/db/_ledger_internal.rs @@ -5,6 +5,10 @@ use base64::{Engine as _, engine::general_purpose}; struct LedgerInternal {} impl LedgerInternal { + pub fn new() -> LedgerInternal { + LedgerInternal {} + } + fn _decode_cookie_secret(row: &Row) -> Result> { let encoded: String = row.get(0)?; let ret = general_purpose::STANDARD.decode(encoded).unwrap(); @@ -14,26 +18,63 @@ impl LedgerInternal { pub fn get_cookie_secret(&self, tx: &Transaction) -> CustomResult> { let q = "SELECT cookie_secret FROM ledger_internal - ORDER BY cookie_secret DESC + ORDER BY id DESC LIMIT 1"; tx.query_row(q, params![], Self::_decode_cookie_secret) .map_err(Error::SqlError) } - pub fn set_cookie_secret(&self, tx: &Transaction, secret: &Vec) { + pub fn set_cookie_secret(&self, tx: &mut Transaction, secret: &Vec) -> CustomResult<()> { + let encoded = general_purpose::STANDARD.encode(&secret); let q = "CREATE TEMPORARY TABLE foo AS SELECT * FROM ledger_internal - ORDER BY cookie_secret DESC + ORDER BY id DESC LIMIT 1"; + tx.execute(q, params![]).map_err(Error::SqlError)?; + + let q = "UPDATE foo SET id = NULL, cookie_secret = ?1"; + tx.execute(q, params![encoded]).map_err(Error::SqlError)?; + + let q = "INSERT INTO ledger_internal SELECT * FROM foo"; + tx.execute(q, params![]).map_err(Error::SqlError)?; + + let q = "DROP TABLE foo"; + tx.execute(q, params![]).map_err(Error::SqlError)?; + + Ok(()) } } #[cfg(test)] mod test_ledger_internal { + use crate::migration; use super::*; #[test] - fn test_foo() { + fn test_initial_cookie_secret() -> CustomResult<()>{ + let mut conn = Connection::open_in_memory().unwrap(); + migration::apply_migrations(&mut conn).unwrap(); + let tx = conn.transaction().unwrap(); + let service = LedgerInternal::new(); + let foo = service.get_cookie_secret(&tx)?; + assert!(foo.len() >= 32); + Ok(()) + } + + #[test] + fn test_cookie_secret() -> CustomResult<()> { + let mut conn = Connection::open_in_memory().unwrap(); + migration::apply_migrations(&mut conn).unwrap(); + let mut tx = conn.transaction().unwrap(); + let service = LedgerInternal::new(); + service.set_cookie_secret(&mut tx, &vec![3u8])?; + let foo = service.get_cookie_secret(&tx)?; + assert_eq!(foo, vec![3u8]); + + service.set_cookie_secret(&mut tx, &vec![7u8, 1u8, 4u8])?; + let foo = service.get_cookie_secret(&tx)?; + assert_eq!(foo, vec![7u8, 1u8, 4u8]); + Ok(()) } }