Implement WebDAV VFS integration: dav-server 0.11 compatible
- Add webdav.rs module: VfsDavFs, VfsDavFile, VfsDavMetaData - Implement DavFileSystem + Clone for GuardedFileSystem blanket impl - Add clone_boxed to VfsBackend trait (required for Sync) - Update CLI webdav.rs to use VFS instead of SQLite - Add bytes dependency - All 155 tests pass
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
use axum::{extract::Request, response::IntoResponse, Extension};
|
||||
use clap::Subcommand;
|
||||
use dav_server::{fakels::FakeLs, DavHandler};
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(Subcommand)]
|
||||
pub enum WebdavCommand {
|
||||
@@ -15,22 +18,22 @@ pub enum WebdavCommand {
|
||||
pub async fn handle_webdav_command(cmd: WebdavCommand) -> anyhow::Result<()> {
|
||||
match cmd {
|
||||
WebdavCommand::Start { port, user } => {
|
||||
let db_path = std::path::PathBuf::from(crate::FileTree::user_db_path(&user));
|
||||
let home_dir = PathBuf::from("/Users/accusys/momentry/var/sftpgo/data").join(&user);
|
||||
|
||||
if !db_path.exists() {
|
||||
if !home_dir.exists() {
|
||||
return Err(anyhow::anyhow!(
|
||||
"User database not found: {}",
|
||||
db_path.display()
|
||||
"User home directory not found: {}",
|
||||
home_dir.display()
|
||||
));
|
||||
}
|
||||
|
||||
println!("=== MarkBase WebDAV Server ===");
|
||||
println!("=== MarkBase WebDAV Server (VFS) ===");
|
||||
println!("User: {}", user);
|
||||
println!("Port: {}", port);
|
||||
println!("Database: {}", db_path.display());
|
||||
println!("Home: {}", home_dir.display());
|
||||
println!();
|
||||
|
||||
run_webdav_server(port, user, db_path).await?;
|
||||
run_webdav_server(port, home_dir, user).await?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
@@ -38,14 +41,22 @@ pub async fn handle_webdav_command(cmd: WebdavCommand) -> anyhow::Result<()> {
|
||||
|
||||
async fn run_webdav_server(
|
||||
port: u16,
|
||||
home_dir: PathBuf,
|
||||
user: String,
|
||||
db_path: std::path::PathBuf,
|
||||
) -> anyhow::Result<()> {
|
||||
use axum::{routing::any, Extension, Router};
|
||||
use axum::{routing::any, Router};
|
||||
use tokio::net::TcpListener;
|
||||
|
||||
let webdav = markbase_webdav::webdav::MarkBaseWebDAV::new(user, db_path);
|
||||
let dav_handler = webdav.create_handler();
|
||||
let vfs = Box::new(crate::vfs::local_fs::LocalFs::new());
|
||||
let upload_hook = None;
|
||||
|
||||
let dav_fs = crate::webdav::VfsDavFs::new(vfs, home_dir, upload_hook, user);
|
||||
|
||||
let dav_handler = DavHandler::builder()
|
||||
.filesystem(dav_fs)
|
||||
.locksystem(FakeLs::new())
|
||||
.strip_prefix("/webdav")
|
||||
.build_handler();
|
||||
|
||||
let app = Router::new()
|
||||
.route("/webdav", any(handle_dav))
|
||||
@@ -67,7 +78,7 @@ async fn run_webdav_server(
|
||||
}
|
||||
|
||||
async fn handle_dav(
|
||||
Extension(dav): Extension<dav_server::DavHandler>,
|
||||
Extension(dav): Extension<DavHandler>,
|
||||
req: Request,
|
||||
) -> impl IntoResponse {
|
||||
dav.handle(req).await
|
||||
|
||||
Reference in New Issue
Block a user