From f3ede6f9a6c03b9e1f6506646b3e11d4ecc63397 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sat, 5 Apr 2025 09:06:05 +0200 Subject: [PATCH 1/3] test(gpodder_sqlite): update tests so they work again --- gpodder_sqlite/tests/auth_test.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gpodder_sqlite/tests/auth_test.rs b/gpodder_sqlite/tests/auth_test.rs index 5ff25ae..f395848 100644 --- a/gpodder_sqlite/tests/auth_test.rs +++ b/gpodder_sqlite/tests/auth_test.rs @@ -35,7 +35,7 @@ fn test_create_session() { let new_session = Session { id: 123, - // + user_agent: None, last_seen: chrono::Utc::now().trunc_subsecs(0), user: users[0].clone(), }; @@ -56,7 +56,7 @@ fn test_remove_session() { let new_session = Session { id: 123, - // + user_agent: None, last_seen: chrono::Utc::now().trunc_subsecs(0), user: users[0].clone(), }; @@ -86,7 +86,7 @@ fn test_refresh_session() { let mut new_session = Session { id: 123, - // + user_agent: None, last_seen: chrono::Utc::now().trunc_subsecs(0) - TimeDelta::seconds(10), user: users[0].clone(), }; @@ -124,6 +124,7 @@ fn test_remove_old_sessions() { store .insert_session(&Session { id: i as i64, + user_agent: None, last_seen: ts, user: users[0].clone(), }) @@ -143,6 +144,7 @@ fn test_remove_old_sessions() { store.get_session(0).expect("get session shouldn't fail"), Some(Session { id: 0, + user_agent: None, last_seen: now, user: users[0].clone(), }) From 279983c64c7bf1420a9e50d61b3c021eef3b9ac0 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sat, 5 Apr 2025 09:20:41 +0200 Subject: [PATCH 2/3] chore: remove all compiler and clippy warnings --- gpodder_sqlite/src/models/device.rs | 2 -- gpodder_sqlite/src/models/device_subscription.rs | 2 -- gpodder_sqlite/src/models/episode_action.rs | 3 --- src/server/gpodder/advanced/auth.rs | 4 ++-- src/server/gpodder/advanced/devices.rs | 5 ++++- src/server/gpodder/advanced/subscriptions.rs | 5 ++++- src/server/gpodder/advanced/sync.rs | 5 ++++- src/server/gpodder/format.rs | 2 +- src/server/gpodder/simple/subscriptions.rs | 5 ++++- 9 files changed, 19 insertions(+), 14 deletions(-) diff --git a/gpodder_sqlite/src/models/device.rs b/gpodder_sqlite/src/models/device.rs index 1c72f89..24c15eb 100644 --- a/gpodder_sqlite/src/models/device.rs +++ b/gpodder_sqlite/src/models/device.rs @@ -17,10 +17,8 @@ use crate::schema::*; pub struct Device { pub id: i64, pub device_id: String, - pub user_id: i64, pub caption: String, pub type_: DeviceType, - pub sync_group_id: Option, } #[derive(Insertable)] diff --git a/gpodder_sqlite/src/models/device_subscription.rs b/gpodder_sqlite/src/models/device_subscription.rs index a77d2a3..39c7c42 100644 --- a/gpodder_sqlite/src/models/device_subscription.rs +++ b/gpodder_sqlite/src/models/device_subscription.rs @@ -6,8 +6,6 @@ use crate::schema::*; #[diesel(table_name = device_subscriptions)] #[diesel(check_for_backend(diesel::sqlite::Sqlite))] pub struct DeviceSubscription { - pub id: i64, - pub device_id: i64, pub podcast_url: String, pub time_changed: i64, pub deleted: bool, diff --git a/gpodder_sqlite/src/models/episode_action.rs b/gpodder_sqlite/src/models/episode_action.rs index faef14f..687db92 100644 --- a/gpodder_sqlite/src/models/episode_action.rs +++ b/gpodder_sqlite/src/models/episode_action.rs @@ -16,9 +16,6 @@ use crate::schema::*; #[diesel(table_name = episode_actions)] #[diesel(check_for_backend(diesel::sqlite::Sqlite))] pub struct EpisodeAction { - pub id: i64, - pub user_id: i64, - pub device_id: Option, pub podcast_url: String, pub episode_url: String, pub time_changed: i64, diff --git a/src/server/gpodder/advanced/auth.rs b/src/server/gpodder/advanced/auth.rs index 8dc2288..b7d98dd 100644 --- a/src/server/gpodder/advanced/auth.rs +++ b/src/server/gpodder/advanced/auth.rs @@ -20,7 +20,7 @@ use crate::server::{ pub fn router() -> Router { Router::new() .route("/{username}/login.json", post(post_login)) - .route("/{username}/logout.json", post(post_logout)) + .route("/{_username}/logout.json", post(post_logout)) } async fn post_login( @@ -85,7 +85,7 @@ async fn post_login( async fn post_logout( State(ctx): State, - Path(username): Path, + Path(_username): Path, jar: CookieJar, ) -> AppResult { if let Some(session_id) = jar.get(SESSION_ID_COOKIE) { diff --git a/src/server/gpodder/advanced/devices.rs b/src/server/gpodder/advanced/devices.rs index 9a23e38..ed85bf2 100644 --- a/src/server/gpodder/advanced/devices.rs +++ b/src/server/gpodder/advanced/devices.rs @@ -19,7 +19,10 @@ pub fn router(ctx: Context) -> Router { Router::new() .route("/{username}", get(get_devices)) .route("/{username}/{id}", post(post_device)) - .layer(middleware::from_fn_with_state(ctx.clone(), auth_api_middleware)) + .layer(middleware::from_fn_with_state( + ctx.clone(), + auth_api_middleware, + )) } async fn get_devices( diff --git a/src/server/gpodder/advanced/subscriptions.rs b/src/server/gpodder/advanced/subscriptions.rs index ad5d552..0395874 100644 --- a/src/server/gpodder/advanced/subscriptions.rs +++ b/src/server/gpodder/advanced/subscriptions.rs @@ -22,7 +22,10 @@ pub fn router(ctx: Context) -> Router { "/{username}/{id}", post(post_subscription_changes).get(get_subscription_changes), ) - .layer(middleware::from_fn_with_state(ctx.clone(), auth_api_middleware)) + .layer(middleware::from_fn_with_state( + ctx.clone(), + auth_api_middleware, + )) } pub async fn post_subscription_changes( diff --git a/src/server/gpodder/advanced/sync.rs b/src/server/gpodder/advanced/sync.rs index d8ea4e1..63f8c7c 100644 --- a/src/server/gpodder/advanced/sync.rs +++ b/src/server/gpodder/advanced/sync.rs @@ -21,7 +21,10 @@ pub fn router(ctx: Context) -> Router { "/{username}", get(get_sync_status).post(post_sync_status_changes), ) - .layer(middleware::from_fn_with_state(ctx.clone(), auth_api_middleware)) + .layer(middleware::from_fn_with_state( + ctx.clone(), + auth_api_middleware, + )) } pub async fn get_sync_status( diff --git a/src/server/gpodder/format.rs b/src/server/gpodder/format.rs index 286c61f..8839219 100644 --- a/src/server/gpodder/format.rs +++ b/src/server/gpodder/format.rs @@ -34,7 +34,7 @@ impl<'de> Deserialize<'de> for StringWithFormat { { struct StrVisitor; - impl<'de> Visitor<'de> for StrVisitor { + impl Visitor<'_> for StrVisitor { type Value = StringWithFormat; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { diff --git a/src/server/gpodder/simple/subscriptions.rs b/src/server/gpodder/simple/subscriptions.rs index 016fb37..027e575 100644 --- a/src/server/gpodder/simple/subscriptions.rs +++ b/src/server/gpodder/simple/subscriptions.rs @@ -18,7 +18,10 @@ pub fn router(ctx: Context) -> Router { get(get_device_subscriptions).put(put_device_subscriptions), ) .route("/{username}", get(get_user_subscriptions)) - .layer(middleware::from_fn_with_state(ctx.clone(), auth_api_middleware)) + .layer(middleware::from_fn_with_state( + ctx.clone(), + auth_api_middleware, + )) } pub async fn get_device_subscriptions( From 7abce21aee2d407523be958e4e999c94f505d8f3 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sat, 5 Apr 2025 10:19:19 +0200 Subject: [PATCH 3/3] refactor: move server to own package; set up workspace dependencies --- Cargo.lock | 2 +- Cargo.toml | 26 +++--------------- gpodder/Cargo.toml | 5 ++-- gpodder_sqlite/Cargo.toml | 10 ++++--- server/Cargo.toml | 27 +++++++++++++++++++ {src => server/src}/cli/db.rs | 0 {src => server/src}/cli/gpo.rs | 0 {src => server/src}/cli/mod.rs | 0 {src => server/src}/cli/serve.rs | 0 {src => server/src}/config.rs | 0 {src => server/src}/main.rs | 0 {src => server/src}/server/error.rs | 0 .../src}/server/gpodder/advanced/auth.rs | 0 .../src}/server/gpodder/advanced/devices.rs | 0 .../src}/server/gpodder/advanced/episodes.rs | 0 .../src}/server/gpodder/advanced/mod.rs | 0 .../server/gpodder/advanced/subscriptions.rs | 0 .../src}/server/gpodder/advanced/sync.rs | 0 {src => server/src}/server/gpodder/format.rs | 0 {src => server/src}/server/gpodder/mod.rs | 0 {src => server/src}/server/gpodder/models.rs | 0 .../src}/server/gpodder/simple/mod.rs | 0 .../server/gpodder/simple/subscriptions.rs | 0 {src => server/src}/server/mod.rs | 0 .../src}/server/static/htmx_2.0.4.min.js | 0 {src => server/src}/server/static/mod.rs | 0 .../static/pico_2.1.1.classless.jade.min.css | 0 {src => server/src}/server/web/mod.rs | 1 - {src => server/src}/web/mod.rs | 0 {src => server/src}/web/page.rs | 0 {src => server/src}/web/templates/base.html | 0 .../src}/web/templates/views/index.html | 0 .../src}/web/templates/views/login.html | 0 {src => server/src}/web/view.rs | 0 34 files changed, 41 insertions(+), 30 deletions(-) create mode 100644 server/Cargo.toml rename {src => server/src}/cli/db.rs (100%) rename {src => server/src}/cli/gpo.rs (100%) rename {src => server/src}/cli/mod.rs (100%) rename {src => server/src}/cli/serve.rs (100%) rename {src => server/src}/config.rs (100%) rename {src => server/src}/main.rs (100%) rename {src => server/src}/server/error.rs (100%) rename {src => server/src}/server/gpodder/advanced/auth.rs (100%) rename {src => server/src}/server/gpodder/advanced/devices.rs (100%) rename {src => server/src}/server/gpodder/advanced/episodes.rs (100%) rename {src => server/src}/server/gpodder/advanced/mod.rs (100%) rename {src => server/src}/server/gpodder/advanced/subscriptions.rs (100%) rename {src => server/src}/server/gpodder/advanced/sync.rs (100%) rename {src => server/src}/server/gpodder/format.rs (100%) rename {src => server/src}/server/gpodder/mod.rs (100%) rename {src => server/src}/server/gpodder/models.rs (100%) rename {src => server/src}/server/gpodder/simple/mod.rs (100%) rename {src => server/src}/server/gpodder/simple/subscriptions.rs (100%) rename {src => server/src}/server/mod.rs (100%) rename {src => server/src}/server/static/htmx_2.0.4.min.js (100%) rename {src => server/src}/server/static/mod.rs (100%) rename {src => server/src}/server/static/pico_2.1.1.classless.jade.min.css (100%) rename {src => server/src}/server/web/mod.rs (99%) rename {src => server/src}/web/mod.rs (100%) rename {src => server/src}/web/page.rs (100%) rename {src => server/src}/web/templates/base.html (100%) rename {src => server/src}/web/templates/views/index.html (100%) rename {src => server/src}/web/templates/views/login.html (100%) rename {src => server/src}/web/view.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index d2cb279..221c1f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1243,7 +1243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] -name = "otter" +name = "otterd" version = "0.1.0" dependencies = [ "axum", diff --git a/Cargo.toml b/Cargo.toml index c7f23d6..7957462 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,30 +1,12 @@ [workspace] +resolver = '2' members = [ + 'server', 'gpodder', 'gpodder_sqlite' ] -[package] -name = "otter" -version = "0.1.0" -edition = "2021" - -[dependencies] -gpodder = { path = "./gpodder" } -gpodder_sqlite = { path = "./gpodder_sqlite" } - -axum = { version = "0.8.1", features = ["macros"] } -axum-extra = { version = "0.10", features = ["cookie", "typed-header"] } -chrono = { version = "0.4.39", features = ["serde"] } -clap = { version = "4.5.30", features = ["derive", "env"] } -cookie = "0.18.1" -figment = { version = "0.10.19", features = ["env", "toml"] } -http-body-util = "0.1.3" +[workspace.dependencies] rand = "0.8.5" -serde = { version = "1.0.218", features = ["derive"] } -tokio = { version = "1.43.0", features = ["full"] } -tower-http = { version = "0.6.2", features = ["set-header", "trace"] } tracing = "0.1.41" -tracing-subscriber = "0.3.19" -tera = "1.20.0" -axum-range = "0.5.0" +chrono = "0.4.39" diff --git a/gpodder/Cargo.toml b/gpodder/Cargo.toml index 650529a..d7a178e 100644 --- a/gpodder/Cargo.toml +++ b/gpodder/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -chrono = { version = "0.4.39", features = ["serde"] } +rand = { workspace = true } +chrono = { workspace = true } + argon2 = "0.5.3" -rand = "0.8.5" diff --git a/gpodder_sqlite/Cargo.toml b/gpodder_sqlite/Cargo.toml index 87ee613..75832d5 100644 --- a/gpodder_sqlite/Cargo.toml +++ b/gpodder_sqlite/Cargo.toml @@ -9,12 +9,14 @@ harness = false [dependencies] gpodder = { path = "../gpodder" } + +rand = { workspace = true } +tracing = { workspace = true } +chrono = { workspace = true, features = ["serde"] } + +libsqlite3-sys = { version = "0.31.0", features = ["bundled"] } diesel = { version = "2.2.7", features = ["r2d2", "sqlite", "returning_clauses_for_sqlite_3_35"] } diesel_migrations = { version = "2.2.0", features = ["sqlite"] } -tracing = "0.1.41" -chrono = { version = "0.4.39", features = ["serde"] } -rand = "0.8.5" -libsqlite3-sys = { version = "0.31.0", features = ["bundled"] } [dev-dependencies] criterion = "0.5.1" diff --git a/server/Cargo.toml b/server/Cargo.toml new file mode 100644 index 0000000..0bfb343 --- /dev/null +++ b/server/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "otterd" +version = "0.1.0" +edition = "2021" + +[dependencies] +gpodder = { path = "../gpodder" } +gpodder_sqlite = { path = "../gpodder_sqlite" } + +chrono = { workspace = true, features = ["serde"] } +rand = { workspace = true } +tracing = { workspace = true } + +serde = { version = "1.0.218", features = ["derive"] } +figment = { version = "0.10.19", features = ["env", "toml"] } +clap = { version = "4.5.30", features = ["derive", "env"] } + +tower-http = { version = "0.6.2", features = ["set-header", "trace"] } +axum = { version = "0.8.1", features = ["macros"] } +axum-extra = { version = "0.10", features = ["cookie", "typed-header"] } +axum-range = "0.5.0" + +cookie = "0.18.1" +http-body-util = "0.1.3" +tokio = { version = "1.43.0", features = ["full"] } +tracing-subscriber = "0.3.19" +tera = "1.20.0" diff --git a/src/cli/db.rs b/server/src/cli/db.rs similarity index 100% rename from src/cli/db.rs rename to server/src/cli/db.rs diff --git a/src/cli/gpo.rs b/server/src/cli/gpo.rs similarity index 100% rename from src/cli/gpo.rs rename to server/src/cli/gpo.rs diff --git a/src/cli/mod.rs b/server/src/cli/mod.rs similarity index 100% rename from src/cli/mod.rs rename to server/src/cli/mod.rs diff --git a/src/cli/serve.rs b/server/src/cli/serve.rs similarity index 100% rename from src/cli/serve.rs rename to server/src/cli/serve.rs diff --git a/src/config.rs b/server/src/config.rs similarity index 100% rename from src/config.rs rename to server/src/config.rs diff --git a/src/main.rs b/server/src/main.rs similarity index 100% rename from src/main.rs rename to server/src/main.rs diff --git a/src/server/error.rs b/server/src/server/error.rs similarity index 100% rename from src/server/error.rs rename to server/src/server/error.rs diff --git a/src/server/gpodder/advanced/auth.rs b/server/src/server/gpodder/advanced/auth.rs similarity index 100% rename from src/server/gpodder/advanced/auth.rs rename to server/src/server/gpodder/advanced/auth.rs diff --git a/src/server/gpodder/advanced/devices.rs b/server/src/server/gpodder/advanced/devices.rs similarity index 100% rename from src/server/gpodder/advanced/devices.rs rename to server/src/server/gpodder/advanced/devices.rs diff --git a/src/server/gpodder/advanced/episodes.rs b/server/src/server/gpodder/advanced/episodes.rs similarity index 100% rename from src/server/gpodder/advanced/episodes.rs rename to server/src/server/gpodder/advanced/episodes.rs diff --git a/src/server/gpodder/advanced/mod.rs b/server/src/server/gpodder/advanced/mod.rs similarity index 100% rename from src/server/gpodder/advanced/mod.rs rename to server/src/server/gpodder/advanced/mod.rs diff --git a/src/server/gpodder/advanced/subscriptions.rs b/server/src/server/gpodder/advanced/subscriptions.rs similarity index 100% rename from src/server/gpodder/advanced/subscriptions.rs rename to server/src/server/gpodder/advanced/subscriptions.rs diff --git a/src/server/gpodder/advanced/sync.rs b/server/src/server/gpodder/advanced/sync.rs similarity index 100% rename from src/server/gpodder/advanced/sync.rs rename to server/src/server/gpodder/advanced/sync.rs diff --git a/src/server/gpodder/format.rs b/server/src/server/gpodder/format.rs similarity index 100% rename from src/server/gpodder/format.rs rename to server/src/server/gpodder/format.rs diff --git a/src/server/gpodder/mod.rs b/server/src/server/gpodder/mod.rs similarity index 100% rename from src/server/gpodder/mod.rs rename to server/src/server/gpodder/mod.rs diff --git a/src/server/gpodder/models.rs b/server/src/server/gpodder/models.rs similarity index 100% rename from src/server/gpodder/models.rs rename to server/src/server/gpodder/models.rs diff --git a/src/server/gpodder/simple/mod.rs b/server/src/server/gpodder/simple/mod.rs similarity index 100% rename from src/server/gpodder/simple/mod.rs rename to server/src/server/gpodder/simple/mod.rs diff --git a/src/server/gpodder/simple/subscriptions.rs b/server/src/server/gpodder/simple/subscriptions.rs similarity index 100% rename from src/server/gpodder/simple/subscriptions.rs rename to server/src/server/gpodder/simple/subscriptions.rs diff --git a/src/server/mod.rs b/server/src/server/mod.rs similarity index 100% rename from src/server/mod.rs rename to server/src/server/mod.rs diff --git a/src/server/static/htmx_2.0.4.min.js b/server/src/server/static/htmx_2.0.4.min.js similarity index 100% rename from src/server/static/htmx_2.0.4.min.js rename to server/src/server/static/htmx_2.0.4.min.js diff --git a/src/server/static/mod.rs b/server/src/server/static/mod.rs similarity index 100% rename from src/server/static/mod.rs rename to server/src/server/static/mod.rs diff --git a/src/server/static/pico_2.1.1.classless.jade.min.css b/server/src/server/static/pico_2.1.1.classless.jade.min.css similarity index 100% rename from src/server/static/pico_2.1.1.classless.jade.min.css rename to server/src/server/static/pico_2.1.1.classless.jade.min.css diff --git a/src/server/web/mod.rs b/server/src/server/web/mod.rs similarity index 99% rename from src/server/web/mod.rs rename to server/src/server/web/mod.rs index 6b93f6c..98f5d1e 100644 --- a/src/server/web/mod.rs +++ b/server/src/server/web/mod.rs @@ -61,7 +61,6 @@ struct LoginForm { async fn post_login( State(ctx): State, user_agent: Option>, - _headers: HeaderMap, jar: CookieJar, Form(login): Form, ) -> AppResult { diff --git a/src/web/mod.rs b/server/src/web/mod.rs similarity index 100% rename from src/web/mod.rs rename to server/src/web/mod.rs diff --git a/src/web/page.rs b/server/src/web/page.rs similarity index 100% rename from src/web/page.rs rename to server/src/web/page.rs diff --git a/src/web/templates/base.html b/server/src/web/templates/base.html similarity index 100% rename from src/web/templates/base.html rename to server/src/web/templates/base.html diff --git a/src/web/templates/views/index.html b/server/src/web/templates/views/index.html similarity index 100% rename from src/web/templates/views/index.html rename to server/src/web/templates/views/index.html diff --git a/src/web/templates/views/login.html b/server/src/web/templates/views/login.html similarity index 100% rename from src/web/templates/views/login.html rename to server/src/web/templates/views/login.html diff --git a/src/web/view.rs b/server/src/web/view.rs similarity index 100% rename from src/web/view.rs rename to server/src/web/view.rs