Browse Source
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
pull/2873/head
Stefan Melmuk
2 years ago
No known key found for this signature in database
GPG Key ID: 817020C608FE9C09
2 changed files with
14 additions and
13 deletions
-
src/config.rs
-
src/db/mod.rs
|
|
@ -630,7 +630,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 { |
|
|
|
|
|
@ -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) |
|
|
|