diff --git a/Cargo.lock b/Cargo.lock index 221c1f0..d2cb279 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 = "otterd" +name = "otter" version = "0.1.0" dependencies = [ "axum", diff --git a/Cargo.toml b/Cargo.toml index 7957462..c7f23d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,30 @@ [workspace] -resolver = '2' members = [ - 'server', 'gpodder', 'gpodder_sqlite' ] -[workspace.dependencies] +[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" 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" -chrono = "0.4.39" +tracing-subscriber = "0.3.19" +tera = "1.20.0" +axum-range = "0.5.0" diff --git a/gpodder/Cargo.toml b/gpodder/Cargo.toml index d7a178e..650529a 100644 --- a/gpodder/Cargo.toml +++ b/gpodder/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" edition = "2021" [dependencies] -rand = { workspace = true } -chrono = { workspace = true } - +chrono = { version = "0.4.39", features = ["serde"] } argon2 = "0.5.3" +rand = "0.8.5" diff --git a/gpodder_sqlite/Cargo.toml b/gpodder_sqlite/Cargo.toml index 75832d5..87ee613 100644 --- a/gpodder_sqlite/Cargo.toml +++ b/gpodder_sqlite/Cargo.toml @@ -9,14 +9,12 @@ 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/gpodder_sqlite/src/models/device.rs b/gpodder_sqlite/src/models/device.rs index 24c15eb..1c72f89 100644 --- a/gpodder_sqlite/src/models/device.rs +++ b/gpodder_sqlite/src/models/device.rs @@ -17,8 +17,10 @@ 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 39c7c42..a77d2a3 100644 --- a/gpodder_sqlite/src/models/device_subscription.rs +++ b/gpodder_sqlite/src/models/device_subscription.rs @@ -6,6 +6,8 @@ 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 687db92..faef14f 100644 --- a/gpodder_sqlite/src/models/episode_action.rs +++ b/gpodder_sqlite/src/models/episode_action.rs @@ -16,6 +16,9 @@ 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/gpodder_sqlite/tests/auth_test.rs b/gpodder_sqlite/tests/auth_test.rs index f395848..5ff25ae 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,7 +124,6 @@ fn test_remove_old_sessions() { store .insert_session(&Session { id: i as i64, - user_agent: None, last_seen: ts, user: users[0].clone(), }) @@ -144,7 +143,6 @@ 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(), }) diff --git a/server/Cargo.toml b/server/Cargo.toml deleted file mode 100644 index 0bfb343..0000000 --- a/server/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[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/server/src/cli/db.rs b/src/cli/db.rs similarity index 100% rename from server/src/cli/db.rs rename to src/cli/db.rs diff --git a/server/src/cli/gpo.rs b/src/cli/gpo.rs similarity index 100% rename from server/src/cli/gpo.rs rename to src/cli/gpo.rs diff --git a/server/src/cli/mod.rs b/src/cli/mod.rs similarity index 100% rename from server/src/cli/mod.rs rename to src/cli/mod.rs diff --git a/server/src/cli/serve.rs b/src/cli/serve.rs similarity index 100% rename from server/src/cli/serve.rs rename to src/cli/serve.rs diff --git a/server/src/config.rs b/src/config.rs similarity index 100% rename from server/src/config.rs rename to src/config.rs diff --git a/server/src/main.rs b/src/main.rs similarity index 100% rename from server/src/main.rs rename to src/main.rs diff --git a/server/src/server/error.rs b/src/server/error.rs similarity index 100% rename from server/src/server/error.rs rename to src/server/error.rs diff --git a/server/src/server/gpodder/advanced/auth.rs b/src/server/gpodder/advanced/auth.rs similarity index 96% rename from server/src/server/gpodder/advanced/auth.rs rename to src/server/gpodder/advanced/auth.rs index b7d98dd..8dc2288 100644 --- a/server/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/server/src/server/gpodder/advanced/devices.rs b/src/server/gpodder/advanced/devices.rs similarity index 92% rename from server/src/server/gpodder/advanced/devices.rs rename to src/server/gpodder/advanced/devices.rs index ed85bf2..9a23e38 100644 --- a/server/src/server/gpodder/advanced/devices.rs +++ b/src/server/gpodder/advanced/devices.rs @@ -19,10 +19,7 @@ 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/server/src/server/gpodder/advanced/episodes.rs b/src/server/gpodder/advanced/episodes.rs similarity index 100% rename from server/src/server/gpodder/advanced/episodes.rs rename to src/server/gpodder/advanced/episodes.rs diff --git a/server/src/server/gpodder/advanced/mod.rs b/src/server/gpodder/advanced/mod.rs similarity index 100% rename from server/src/server/gpodder/advanced/mod.rs rename to src/server/gpodder/advanced/mod.rs diff --git a/server/src/server/gpodder/advanced/subscriptions.rs b/src/server/gpodder/advanced/subscriptions.rs similarity index 95% rename from server/src/server/gpodder/advanced/subscriptions.rs rename to src/server/gpodder/advanced/subscriptions.rs index 0395874..ad5d552 100644 --- a/server/src/server/gpodder/advanced/subscriptions.rs +++ b/src/server/gpodder/advanced/subscriptions.rs @@ -22,10 +22,7 @@ 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/server/src/server/gpodder/advanced/sync.rs b/src/server/gpodder/advanced/sync.rs similarity index 95% rename from server/src/server/gpodder/advanced/sync.rs rename to src/server/gpodder/advanced/sync.rs index 63f8c7c..d8ea4e1 100644 --- a/server/src/server/gpodder/advanced/sync.rs +++ b/src/server/gpodder/advanced/sync.rs @@ -21,10 +21,7 @@ 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/server/src/server/gpodder/format.rs b/src/server/gpodder/format.rs similarity index 97% rename from server/src/server/gpodder/format.rs rename to src/server/gpodder/format.rs index 8839219..286c61f 100644 --- a/server/src/server/gpodder/format.rs +++ b/src/server/gpodder/format.rs @@ -34,7 +34,7 @@ impl<'de> Deserialize<'de> for StringWithFormat { { struct StrVisitor; - impl Visitor<'_> for StrVisitor { + impl<'de> Visitor<'de> for StrVisitor { type Value = StringWithFormat; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { diff --git a/server/src/server/gpodder/mod.rs b/src/server/gpodder/mod.rs similarity index 100% rename from server/src/server/gpodder/mod.rs rename to src/server/gpodder/mod.rs diff --git a/server/src/server/gpodder/models.rs b/src/server/gpodder/models.rs similarity index 100% rename from server/src/server/gpodder/models.rs rename to src/server/gpodder/models.rs diff --git a/server/src/server/gpodder/simple/mod.rs b/src/server/gpodder/simple/mod.rs similarity index 100% rename from server/src/server/gpodder/simple/mod.rs rename to src/server/gpodder/simple/mod.rs diff --git a/server/src/server/gpodder/simple/subscriptions.rs b/src/server/gpodder/simple/subscriptions.rs similarity index 94% rename from server/src/server/gpodder/simple/subscriptions.rs rename to src/server/gpodder/simple/subscriptions.rs index 027e575..016fb37 100644 --- a/server/src/server/gpodder/simple/subscriptions.rs +++ b/src/server/gpodder/simple/subscriptions.rs @@ -18,10 +18,7 @@ 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( diff --git a/server/src/server/mod.rs b/src/server/mod.rs similarity index 100% rename from server/src/server/mod.rs rename to src/server/mod.rs diff --git a/server/src/server/static/htmx_2.0.4.min.js b/src/server/static/htmx_2.0.4.min.js similarity index 100% rename from server/src/server/static/htmx_2.0.4.min.js rename to src/server/static/htmx_2.0.4.min.js diff --git a/server/src/server/static/mod.rs b/src/server/static/mod.rs similarity index 100% rename from server/src/server/static/mod.rs rename to src/server/static/mod.rs diff --git a/server/src/server/static/pico_2.1.1.classless.jade.min.css b/src/server/static/pico_2.1.1.classless.jade.min.css similarity index 100% rename from server/src/server/static/pico_2.1.1.classless.jade.min.css rename to src/server/static/pico_2.1.1.classless.jade.min.css diff --git a/server/src/server/web/mod.rs b/src/server/web/mod.rs similarity index 99% rename from server/src/server/web/mod.rs rename to src/server/web/mod.rs index 98f5d1e..6b93f6c 100644 --- a/server/src/server/web/mod.rs +++ b/src/server/web/mod.rs @@ -61,6 +61,7 @@ struct LoginForm { async fn post_login( State(ctx): State, user_agent: Option>, + _headers: HeaderMap, jar: CookieJar, Form(login): Form, ) -> AppResult { diff --git a/server/src/web/mod.rs b/src/web/mod.rs similarity index 100% rename from server/src/web/mod.rs rename to src/web/mod.rs diff --git a/server/src/web/page.rs b/src/web/page.rs similarity index 100% rename from server/src/web/page.rs rename to src/web/page.rs diff --git a/server/src/web/templates/base.html b/src/web/templates/base.html similarity index 100% rename from server/src/web/templates/base.html rename to src/web/templates/base.html diff --git a/server/src/web/templates/views/index.html b/src/web/templates/views/index.html similarity index 100% rename from server/src/web/templates/views/index.html rename to src/web/templates/views/index.html diff --git a/server/src/web/templates/views/login.html b/src/web/templates/views/login.html similarity index 100% rename from server/src/web/templates/views/login.html rename to src/web/templates/views/login.html diff --git a/server/src/web/view.rs b/src/web/view.rs similarity index 100% rename from server/src/web/view.rs rename to src/web/view.rs