diff --git a/Cargo.lock b/Cargo.lock index 962bec65..69dbc757 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -512,9 +512,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -2103,7 +2103,7 @@ dependencies = [ [[package]] name = "land-cli" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "clap", @@ -2121,7 +2121,7 @@ dependencies = [ [[package]] name = "land-common" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "clap", @@ -2136,7 +2136,7 @@ dependencies = [ [[package]] name = "land-dao" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "async-trait", @@ -2160,7 +2160,7 @@ dependencies = [ [[package]] name = "land-kernel" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "chrono", @@ -2180,7 +2180,7 @@ dependencies = [ [[package]] name = "land-sdk" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "http 1.1.0", @@ -2192,7 +2192,7 @@ dependencies = [ [[package]] name = "land-sdk-macro" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "http 1.1.0", @@ -2202,7 +2202,7 @@ dependencies = [ [[package]] name = "land-server" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "axum", @@ -2228,7 +2228,7 @@ dependencies = [ [[package]] name = "land-wit" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "tracing", @@ -2240,7 +2240,7 @@ dependencies = [ [[package]] name = "land-worker" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "clap", @@ -2259,7 +2259,7 @@ dependencies = [ [[package]] name = "land-worker-impl" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "async-trait", @@ -2280,7 +2280,7 @@ dependencies = [ [[package]] name = "land-worker-server" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "axum", @@ -3441,7 +3441,7 @@ dependencies = [ [[package]] name = "rust-helloworld" -version = "0.4.0" +version = "0.2.0" dependencies = [ "anyhow", "http 1.1.0", @@ -3861,9 +3861,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.32" +version = "0.9.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd075d994154d4a774f95b51fb96bdc2832b0ea48425c92546073816cda1f2f" +checksum = "a0623d197252096520c6f2a5e1171ee436e5af99a5d7caa2891e55e61950e6d9" dependencies = [ "indexmap", "itoa", @@ -4886,9 +4886,9 @@ dependencies = [ [[package]] name = "unsafe-libyaml" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" diff --git a/Cargo.toml b/Cargo.toml index 8007c62d..ca52c251 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ default-members = ["land-cli"] resolver = "2" [workspace.package] -version = "0.4.0" +version = "0.2.0" edition = "2021" authors = ["fuxiaohei "] diff --git a/deploy/docker-compose.yaml b/deploy/docker-compose.yaml index dcaee9a7..0e1f2f7f 100644 --- a/deploy/docker-compose.yaml +++ b/deploy/docker-compose.yaml @@ -8,7 +8,7 @@ services: proxy: platform: linux/amd64 image: traefik:v3.0 - command: --api.insecure=true --providers.docker=true --providers.docker.exposedByDefault=false --accesslog=true --providers.file.filename=/data/runtime-land/traefik.yaml + command: --api.insecure=true --providers.docker=true --providers.docker.exposedByDefault=false --accesslog=true --providers.file.filename=/data/runtime-land/traefik.yaml --providers.file.watch=true restart: always ports: - "80:80" diff --git a/land-server/src/server/dash/mod.rs b/land-server/src/server/dash/mod.rs index f125ce4d..662fad44 100644 --- a/land-server/src/server/dash/mod.rs +++ b/land-server/src/server/dash/mod.rs @@ -67,6 +67,8 @@ pub fn router(assets_dir: &str) -> Result { .route("/settings", get(settings::index)) .route("/settings/create-token", post(settings::create_token)) .route("/settings/manage", get(settings::manage)) + .route("/settings/update-domain", post(settings::update_domain)) + .route("/settings/update-storage", post(settings::update_storage)) .nest_service("/static", ServeDir::new(static_assets_dir)) .layer(CsrfLayer::new(config)) .with_state(Engine::from(hbs)) diff --git a/land-server/src/server/dash/settings.rs b/land-server/src/server/dash/settings.rs index e9fd83df..9a17cdf3 100644 --- a/land-server/src/server/dash/settings.rs +++ b/land-server/src/server/dash/settings.rs @@ -115,6 +115,9 @@ pub async fn manage( tokens: Vec, token_usage: String, workers: Vec, + domain: String, + protocol: String, + storage: String, } let csrf_token = csrf.authenticity_token()?; let token_values = user_token::list_by_user(user.id, Some(user_token::Usage::Worker)).await?; @@ -144,6 +147,15 @@ pub async fn manage( }); } + // domain, protocol + let (domain, protocol) = land_dao::settings::get_domain_settings().await?; + let storage_setting = land_dao::settings::get("storage").await?; + let storage_content = if let Some(m) = storage_setting { + m.value + } else { + "unknown".to_string() + }; + Ok(( csrf, RenderHtml( @@ -156,8 +168,54 @@ pub async fn manage( tokens, token_usage: Usage::Worker.to_string(), workers, + domain, + protocol, + storage: storage_content, }, ), ) .into_response()) } + +#[derive(Deserialize)] +pub struct UpdateDomainForm { + protocol: String, + domain: String, + csrf: String, +} + +/// update_domain is a handler for POST /settings/update-domain +pub async fn update_domain( + csrf: CsrfToken, + Extension(user): Extension, + Form(form): Form, +) -> Result { + if !user.is_admin { + return Err(ServerError::forbidden("Permission denied")); + } + csrf.verify(&form.csrf)?; + info!("Update domain settings: {},{}", form.protocol, form.domain); + land_dao::settings::set_domain_settings(form.domain, form.protocol).await?; + Ok(redirect_response("/settings/manage")) +} + +#[derive(Deserialize)] +pub struct UpdateStorageForm { + storage: String, + csrf: String, +} + +/// update_storage is a handler for POST /settings/update-storage +pub async fn update_storage( + csrf: CsrfToken, + Extension(user): Extension, + Form(form): Form, +) -> Result { + if !user.is_admin { + return Err(ServerError::forbidden("Permission denied")); + } + csrf.verify(&form.csrf)?; + info!("Update storage: {}", form.storage); + land_dao::settings::set("storage", &form.storage).await?; + Ok(redirect_response("/settings/manage")) +} diff --git a/land-server/src/server/mod.rs b/land-server/src/server/mod.rs index 4b846592..72ace476 100644 --- a/land-server/src/server/mod.rs +++ b/land-server/src/server/mod.rs @@ -59,6 +59,9 @@ impl ServerError { anyhow::anyhow!(msg.to_string()), ) } + pub fn forbidden(msg: &str) -> Self { + Self(StatusCode::FORBIDDEN, anyhow::anyhow!(msg.to_string())) + } } // Tell axum how to convert `AppError` into a response. diff --git a/land-server/tpls/manage.hbs b/land-server/tpls/manage.hbs index 5b1fe358..245a555a 100644 --- a/land-server/tpls/manage.hbs +++ b/land-server/tpls/manage.hbs @@ -135,12 +135,57 @@ +
+
+
+
Domains
+

Project domain suffix and protocol.

+
+
+
+
+ + + {project.domain}. + + +
+
+ +
+
+
+
+
+
+
+
+
Storage
+

Storage settings for WebAssembly modules

+
+
+
+ + +
+ +
+
+
+
+
{{> partials/footer.hbs}}