diff options
Diffstat (limited to 'server/src/main.rs')
| -rw-r--r-- | server/src/main.rs | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index db02c29..c481eec 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -7,10 +7,17 @@ #![allow(clippy::needless_borrows_for_generic_args)] #![recursion_limit = "4096"] -use crate::{auth::token::SessionKey, logger::setup_logger}; +use crate::{ + auth::{hash_password, token::SessionKey}, + logger::setup_logger, +}; use anyhow::{Result, anyhow}; use jellycache::Cache; -use jellydb::Database; +use jellycommon::{ + TAGREG, USER_LOGIN, USER_PASSWORD, + jellyobject::{ObjectBuffer, Path}, +}; +use jellydb::{Database, Filter, Query, Sort}; use log::{error, info}; use routes::build_rocket; use serde::Deserialize; @@ -29,6 +36,7 @@ pub mod ui; #[rocket::main] async fn main() { setup_logger(); + jellydb::DEBUG_TAGREG.set(TAGREG.clone()).ok().unwrap(); let state = match create_state() { Ok(s) => s, @@ -58,6 +66,7 @@ pub struct State { pub struct Config { pub ui: jellyui::Config, pub session_key: String, + pub admin_password: String, pub asset_path: PathBuf, pub database_path: PathBuf, pub cache_path: PathBuf, @@ -73,12 +82,37 @@ pub fn create_state() -> Result<Arc<State>> { let config: Config = serde_yaml_ng::from_str(&read_to_string(config_path)?)?; let cache_storage = jellykv::rocksdb::new(&config.cache_path)?; - let db_storage = jellykv::rocksdb::new(&config.database_path)?; + // let db_storage = jellykv::rocksdb::new(&config.database_path)?; + let db_storage = jellykv::memory::new(); - Ok(Arc::new(State { + let state = Arc::new(State { cache: Cache::new(Box::new(cache_storage), config.max_memory_cache_size), database: Arc::new(db_storage), session_key: SessionKey::parse(&config.session_key)?, config, - })) + }); + + create_admin_user(&state)?; + + Ok(state) +} + +fn create_admin_user(state: &State) -> Result<()> { + state.database.transaction(&mut |txn| { + let admin_row = txn.query_single(Query { + filter: Filter::Match(Path(vec![USER_LOGIN.0]), "admin".as_bytes().to_vec()), + sort: Sort::None, + })?; + if admin_row.is_none() { + info!("Creating new admin user"); + let pwhash = hash_password("admin", &state.config.admin_password); + txn.insert(ObjectBuffer::new(&mut [ + (USER_LOGIN.0, &"admin"), + (USER_PASSWORD.0, &pwhash.as_slice()), + ]))?; + } + + Ok(()) + })?; + Ok(()) } |