mirror of
https://github.com/lennart-k/rustical.git
synced 2025-12-13 19:22:26 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de2a8a2a8e | ||
|
|
51d2293ff9 | ||
|
|
5c77719ce4 | ||
|
|
91996465f9 | ||
|
|
83f4506578 | ||
|
|
a5bbb82712 | ||
|
|
6a26f44dd7 | ||
|
|
f8a660c222 |
22
Cargo.lock
generated
22
Cargo.lock
generated
@@ -3026,7 +3026,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"argon2",
|
||||
@@ -3069,7 +3069,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_caldav"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"async-std",
|
||||
"async-trait",
|
||||
@@ -3109,7 +3109,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_carddav"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"axum",
|
||||
@@ -3141,7 +3141,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_dav"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"axum",
|
||||
@@ -3166,7 +3166,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_dav_push"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"axum",
|
||||
@@ -3191,7 +3191,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_frontend"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"askama",
|
||||
"askama_web",
|
||||
@@ -3224,7 +3224,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_ical"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"axum",
|
||||
"chrono",
|
||||
@@ -3242,7 +3242,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_oidc"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"axum",
|
||||
@@ -3257,7 +3257,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_store"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -3291,7 +3291,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_store_sqlite"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"chrono",
|
||||
@@ -3312,7 +3312,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustical_xml"
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
dependencies = [
|
||||
"quick-xml",
|
||||
"thiserror 2.0.12",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
members = ["crates/*"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.8.3"
|
||||
version = "0.8.6"
|
||||
edition = "2024"
|
||||
description = "A CalDAV server"
|
||||
repository = "https://github.com/lennart-k/rustical"
|
||||
|
||||
@@ -183,6 +183,7 @@ impl<S: SubscriptionStore> DavPushController<S> {
|
||||
header::CONTENT_TYPE,
|
||||
HeaderValue::from_static("application/octet-stream"),
|
||||
);
|
||||
hdrs.insert("TTL", HeaderValue::from(60));
|
||||
client.execute(request).await?;
|
||||
|
||||
Ok(())
|
||||
|
||||
@@ -45,38 +45,38 @@ pub fn frontend_router<AP: AuthenticationProvider, CS: CalendarStore, AS: Addres
|
||||
frontend_config: FrontendConfig,
|
||||
oidc_config: Option<OidcConfig>,
|
||||
) -> Router {
|
||||
let mut router = Router::new();
|
||||
router = router
|
||||
.route("/", get(route_root))
|
||||
.route("/user", get(route_get_home))
|
||||
.route("/user/{user}", get(route_user_named::<CS, AS, AP>))
|
||||
let user_router = Router::new()
|
||||
.route("/", get(route_get_home))
|
||||
.route("/{user}", get(route_user_named::<CS, AS, AP>))
|
||||
// App token management
|
||||
.route("/user/{user}/app_token", post(route_post_app_token::<AP>))
|
||||
.route("/{user}/app_token", post(route_post_app_token::<AP>))
|
||||
.route(
|
||||
// POST because HTML5 forms don't support DELETE method
|
||||
"/user/{user}/app_token/{id}/delete",
|
||||
"/{user}/app_token/{id}/delete",
|
||||
post(route_delete_app_token::<AP>),
|
||||
)
|
||||
// Calendar
|
||||
.route("/user/{user}/calendar", get(route_calendars::<CS>))
|
||||
.route("/{user}/calendar", get(route_calendars::<CS>))
|
||||
.route("/{user}/calendar/{calendar}", get(route_calendar::<CS>))
|
||||
.route(
|
||||
"/user/{user}/calendar/{calendar}",
|
||||
get(route_calendar::<CS>),
|
||||
)
|
||||
.route(
|
||||
"/user/{user}/calendar/{calendar}/restore",
|
||||
"/{user}/calendar/{calendar}/restore",
|
||||
post(route_calendar_restore::<CS>),
|
||||
)
|
||||
// Addressbook
|
||||
.route("/user/{user}/addressbook", get(route_addressbooks::<AS>))
|
||||
.route("/{user}/addressbook", get(route_addressbooks::<AS>))
|
||||
.route(
|
||||
"/user/{user}/addressbook/{addressbook}",
|
||||
"/{user}/addressbook/{addressbook}",
|
||||
get(route_addressbook::<AS>),
|
||||
)
|
||||
.route(
|
||||
"/user/{user}/addressbook/{addressbook}/restore",
|
||||
"/{user}/addressbook/{addressbook}/restore",
|
||||
post(route_addressbook_restore::<AS>),
|
||||
)
|
||||
.layer(middleware::from_fn(unauthorized_handler));
|
||||
|
||||
let router = Router::new()
|
||||
.route("/", get(route_root))
|
||||
.nest("/user", user_router)
|
||||
.route("/login", get(route_get_login).post(route_post_login::<AP>))
|
||||
.route("/logout", post(route_post_logout));
|
||||
|
||||
@@ -109,8 +109,7 @@ pub fn frontend_router<AP: AuthenticationProvider, CS: CalendarStore, AS: Addres
|
||||
.layer(Extension(cal_store.clone()))
|
||||
.layer(Extension(addr_store.clone()))
|
||||
.layer(Extension(frontend_config.clone()))
|
||||
.layer(Extension(oidc_config.clone()))
|
||||
.layer(middleware::from_fn(unauthorized_handler));
|
||||
.layer(Extension(oidc_config.clone()));
|
||||
|
||||
Router::new()
|
||||
.nest(prefix, router)
|
||||
|
||||
@@ -13,7 +13,7 @@ use http::StatusCode;
|
||||
use rustical_store::auth::AuthenticationProvider;
|
||||
use serde::Deserialize;
|
||||
use tower_sessions::Session;
|
||||
use tracing::instrument;
|
||||
use tracing::{instrument, warn};
|
||||
use url::Url;
|
||||
|
||||
#[derive(Template, WebTemplate)]
|
||||
@@ -98,6 +98,7 @@ pub async fn route_post_login<AP: AuthenticationProvider>(
|
||||
session.insert("user", user.id).await.unwrap();
|
||||
Redirect::to(&redirect_uri).into_response()
|
||||
} else {
|
||||
warn!("Failed password login attempt as {username}");
|
||||
StatusCode::UNAUTHORIZED.into_response()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ impl Default for CalendarObjectComponent {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct CalendarObject<const VERIFIED: bool = true> {
|
||||
pub struct CalendarObject {
|
||||
data: CalendarObjectComponent,
|
||||
properties: Vec<Property>,
|
||||
ics: String,
|
||||
|
||||
@@ -126,6 +126,7 @@ pub fn make_app<AS: AddressbookStore, CS: CalendarStore, S: SubscriptionStore>(
|
||||
router
|
||||
.layer(
|
||||
SessionManagerLayer::new(session_store)
|
||||
.with_name("rustical_session")
|
||||
.with_secure(true)
|
||||
.with_same_site(SameSite::Strict)
|
||||
.with_expiry(Expiry::OnInactivity(
|
||||
|
||||
Reference in New Issue
Block a user