vw_small

Hardened fork of Vaultwarden (https://github.com/dani-garcia/vaultwarden) with fewer features.
git clone https://git.philomathiclife.com/repos/vw_small
Log | Files | Refs | README

commit 8837660ba7d7c5fd069f1ee65ab13dd82683ac87
parent 464a489b44fb477184b4f51da1ca8f728ba2d016
Author: Stefan Melmuk <stefan.melmuk@gmail.com>
Date:   Tue, 22 Nov 2022 04:40:20 +0100

check if sqlite folder exists

instead of creating the parent folders to a sqlite database
vaultwarden should just exit if it does not.

this should fix issues like #2835 when a wrongly configured
`DATABASE_URL` falls back to using sqlite

Diffstat:
Msrc/config.rs | 10+++++++++-
Msrc/db/mod.rs | 17+++++------------
2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/config.rs b/src/config.rs @@ -638,7 +638,15 @@ make_config! { fn validate_config(cfg: &ConfigItems) -> Result<(), Error> { // Validate connection URL is valid and DB feature is enabled - DbConnType::from_url(&cfg.database_url)?; + let url = &cfg.database_url; + if DbConnType::from_url(url)? == DbConnType::sqlite { + let path = std::path::Path::new(&url); + if let Some(parent) = path.parent() { + if !parent.exists() { + err!(format!("SQLite database directory `{}` does not exist", parent.display())); + } + } + } let limit = 256; if cfg.database_max_conns < 1 || cfg.database_max_conns > limit { diff --git a/src/db/mod.rs b/src/db/mod.rs @@ -424,22 +424,15 @@ mod sqlite_migrations { pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!("migrations/sqlite"); pub fn run_migrations() -> Result<(), super::Error> { - // Make sure the directory exists + use diesel::{Connection, RunQueryDsl}; let url = crate::CONFIG.database_url(); - let path = std::path::Path::new(&url); - if let Some(parent) = path.parent() { - if std::fs::create_dir_all(parent).is_err() { - error!("Error creating database directory"); - std::process::exit(1); - } - } + // Establish a connection to the sqlite database (this will create a new one, if it does + // not exist, and exit if there is an error). + let mut connection = diesel::sqlite::SqliteConnection::establish(&url)?; - use diesel::{Connection, RunQueryDsl}; - // Make sure the database is up to date (create if it doesn't exist, or run the migrations) - let mut connection = diesel::sqlite::SqliteConnection::establish(&crate::CONFIG.database_url())?; + // Run the migrations after successfully establishing a connection // Disable Foreign Key Checks during migration - // Scoped to a connection. diesel::sql_query("PRAGMA foreign_keys = OFF") .execute(&mut connection)