Skip to content
Clone

refactor(session): rename session models

ZhenYi committed
parent 8f74012 commit ed6525b Browse files

300 files changed

+1560 −741

This change is very large, so some diffs are not shown. Clone the repository to see the full change.

File tree 300
Modified app/adminhost/src/main.rs View app/adminhost/src/main.rs
@@ -9,7 +9,7 @@
99use axum::http::{HeaderMap, HeaderValue, Method, StatusCode, Uri, header};
1010use axum::response::IntoResponse;
1111use config::scoped::{AdminhostConfig, ScopedConfig};
12use session::{SessionLayer, store};
12use session_layer::{SessionLayer, store};
1313use tokio::net::TcpListener;
1414use tower_http::limit::RequestBodyLimitLayer;
1515use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer};
Modified app/adminhost/Cargo.toml View app/adminhost/Cargo.toml
@@ -9,7 +9,7 @@
99admin-web = { workspace = true }
1010config = { workspace = true }
1111export = { workspace = true }
12session = { workspace = true }
12session-layer = { workspace = true }
1313axum = { workspace = true }
1414anyhow = { workspace = true }
1515tokio = { workspace = true, features = ["signal", "net", "macros", "rt-multi-thread"] }
Modified app/apihost/Cargo.toml View app/apihost/Cargo.toml
@@ -10,7 +10,7 @@
1010chat = { workspace = true }
1111push = { workspace = true }
1212export = { workspace = true }
13session = { workspace = true }
13session-layer = { workspace = true }
1414config = { workspace = true }
1515axum = { workspace = true }
1616tokio = { workspace = true, features = ["signal", "net", "macros", "rt-multi-thread"] }
Modified app/im/src/gateway.rs View app/im/src/gateway.rs
@@ -10,7 +10,7 @@
1010use hyper::{Method, Request, Response, StatusCode};
1111use hyper_util::rt::TokioIo;
1212use sea_orm::{ConnectionTrait, DbBackend, Statement};
13use session::SessionGuard;
13use session_layer::SessionGuard;
1414use tokio_tungstenite::WebSocketStream;
1515use tokio_tungstenite::tungstenite::handshake::derive_accept_key;
1616use tokio_tungstenite::tungstenite::protocol::{Role, WebSocketConfig};
Modified app/im/Cargo.toml View app/im/Cargo.toml
@@ -8,7 +8,7 @@
88chat = { workspace = true }
99config = { workspace = true }
1010export = { workspace = true }
11session = { workspace = true }
11session-layer = { workspace = true }
1212anyhow = { workspace = true }
1313bytes = { workspace = true }
1414futures = { workspace = true }
Modified chart/values.yaml View chart/values.yaml
@@ -47,7 +47,7 @@
4747 # 副本间内存快照互不可见,会导致跨副本丢失 pow challenge / 2FA / 登录态。
4848 APP_SESSION__MEMORY_LIFESPAN_SECS: "0"
4949 # 上面的 0 会让无会话请求(/healthz、扫描器)产生一条无害的 warn 噪音,压掉它。
50 RUST_LOG: "info,axum_session::session_store=error"
50 RUST_LOG: "info,session::session_store=error"
5151
5252# 敏感配置(渲染为 Secret)。注意 AppConfig 的 Debug 会带出密钥,
5353# 切勿在任何日志里 {:?} 打印配置。
Modified deploy/values/prod.yaml View deploy/values/prod.yaml
@@ -1,7 +1,5 @@
11image:
22 repository: harbor.gitdata.me/app/gitdata
3 # 原来留空由 CI 传 --set image.tag=sha-<short>;CI 已删(81f2cbd5),改成钉住版本。
4 # 对应 commit d46785a6(oxcache→共享 Redis、移除 sagent 之后的第一版)。
53 tag: "sha-d46785a"
64 pullPolicy: IfNotPresent
75
@@ -13,14 +11,11 @@
1311 APP_REDIS__MODE: "cluster"
1412 APP_REDIS__POOL_SIZE: "8"
1513 APP_S3__ENDPOINT: "http://rustfs-svc.rustfs.svc.cluster.local:9000"
16 # 浏览器可见的预签名 URL 主机。本集群 rustfs 的对外 S3 入口是 object.gitdata.ai
17 # (Ingress rustfs-s3;旧的 s3.gitdata.ai 在本集群没有路由,取图会 HTTP 000)
1814 APP_S3__PUBLIC_ENDPOINT: "https://object.gitdata.ai"
1915 APP_S3__BUCKET: "gitdata"
2016 APP_S3__REGION: "us-east-1"
2117 APP_S3__PATH_STYLE: "true"
2218 APP_SEARCH__ENABLED: "true"
23 # 本集群 meilisearch 的 Service 名(旧集群是 meili-meilisearch.gitdata.svc)
2419 APP_SEARCH__URL: "http://meilisearch.meilisearch.svc.cluster.local:7700"
2520 APP_SEARCH__INDEX_PREFIX: "gitdata"
2621 APP_LIVEKIT__ENABLED: "true"
@@ -42,23 +37,20 @@
4237 APP_EMAIL__FROM_ADDRESS: "bot@mail.gitdata.ai"
4338 APP_EMAIL__FROM_NAME: "GitData"
4439 APP_EMAIL_QUEUE__ENABLED: "true"
45 RUST_LOG: "info,axum_session::session_store=error"
40 RUST_LOG: "info,session::session_store=error"
4641 OTEL_TRACES_SAMPLER: "parentbased_traceidratio"
4742 OTEL_TRACES_SAMPLER_ARG: "0.2"
4843
49# 集群内 LGTM(monitoring/otel-collector relay:traces->tempo、logs->loki、metrics->mimir)
50# 旧集群推的是外部 OpenObserve https://o2.gitdata.me/api/3JmB4...(其 Authorization headers 已不再需要)
44
5145metrics:
5246 otlpEndpoint: "http://otel-collector.monitoring.svc.cluster.local:4318"
5347
5448ingress:
5549 enabled: true
56 # 本集群只有 traefik(k3s 自带,3.7.8);*.git 由 chart 里的 IngressRoute + PathRegexp 接管
5750 controller: traefik
5851 className: traefik
5952 host: gitdata.ai
6053 annotations:
61 # 会话保持:traefik 的 sticky cookie(替代原先 nginx 的 affinity cookie 注解)
6254 traefik.ingress.kubernetes.io/service.sticky.cookie: "true"
6355 traefik.ingress.kubernetes.io/service.sticky.cookie.name: "GD-AFFINITY"
6456 traefik.ingress.kubernetes.io/service.sticky.cookie.httpOnly: "true"
@@ -67,8 +59,6 @@
6759 tls:
6860 enabled: true
6961 secretName: ""
70 # 主域名证书靠这条注解签发(chart 只读 ingress.tls.clusterIssuer;
71 # 原先写在 apihost.tls 下的那份是死配置,chart 从不读)
7262 clusterIssuer: cloudflare-acme-cluster-issuer
7363apihost:
7464 resources:
@@ -97,15 +87,10 @@
9787 - type: Pods
9888 value: 1
9989 periodSeconds: 60
100# 注:apihost.tls.* 与 apihost.proxy* 曾经写在这里,但 chart 的模板只读
101# .Values.ingress.{tls,proxy*} 的同名键,apihost 下这些键没人引用 → 已删除,
102# 对应设置已移到上面 ingress 块(tls)与 chart 的 nginx 默认注解(proxy*)。
10390
91
10492githost:
10593 enabled: true
106 # 首次部署留 1 副本:SSH host key 落在共享 PVC(/opt/gitdata/ssh_host_ed25519),
107 # 空 PVC 上多副本会各自生成一把 key,客户端 known_hosts 会抖动。
108 # 首启后把 key 固化到 PVC,再改回 2。
10994 replicaCount: 1
11095 httpPort: 9418
11196 ssh:
@@ -117,8 +102,6 @@
117102 type: LoadBalancer
118103 port: 22
119104 annotations:
120 # 本集群没有 MetalLB,这个注解当前不生效;k3s klipper 会把 22 端口发布到所有节点
121 # (47.239.98.8 是 node.1,ssh.gitdata.ai 指向它)。装了 MetalLB 后可原样用。
122105 metallb.universe.tf/loadBalancerIPs: "47.239.98.8"
123106
124107adminhost:
Modified lib/admin/src/handlers/auth.rs View lib/admin/src/handlers/auth.rs
@@ -3,7 +3,7 @@
33use axum::http::HeaderMap;
44use export::middleware::RequestId;
55use export::rest::{AppResponseData, NoData};
6use session::Session;
6use session_layer::Session;
77
88use crate::errors::AdminApiError;
99use crate::services::auth::{AdminDto, AdminLoginCmd, AdminLoginResp, ChangePasswordCmd};
Modified lib/admin/src/services/auth.rs View lib/admin/src/services/auth.rs
@@ -6,7 +6,7 @@
66};
77use serde::{Deserialize, Serialize};
88use serde_json::json;
9use session::Session;
9use session_layer::Session;
1010use time::OffsetDateTime;
1111use utoipa::ToSchema;
1212use uuid::Uuid;
Modified lib/admin/src/share/guard.rs View lib/admin/src/share/guard.rs
@@ -3,7 +3,7 @@
33use axum::response::{IntoResponse, Response};
44use models::admin::admin_user;
55use sea_orm::EntityTrait;
6use session::Session;
6use session_layer::Session;
77
88use crate::errors::AdminApiError;
99use crate::errors::password_change_required_response;
Modified lib/admin/src/share/session.rs View lib/admin/src/share/session.rs
@@ -1,6 +1,6 @@
11use models::admin::admin_user;
2use session::Session;
3use session::SessionUserMut;
2use session_layer::Session;
3use session_layer::SessionUserMut;
44use uuid::Uuid;
55
66pub const ADMIN_UID_KEY: &str = "admin:uid";
Modified lib/admin/Cargo.toml View lib/admin/Cargo.toml
@@ -17,7 +17,7 @@
1717sea-orm = { workspace = true }
1818serde = { workspace = true, features = ["derive"] }
1919serde_json = { workspace = true }
20session = { workspace = true }
20session-layer = { workspace = true }
2121storage = { workspace = true }
2222tokio = { workspace = true, features = ["macros", "time"] }
2323time = { workspace = true }
Modified lib/auth/src/handlers/accept_agreement.rs View lib/auth/src/handlers/accept_agreement.rs
@@ -3,13 +3,13 @@
33
44use export::rest::{AppResponseData, NoData};
55use serde::{Deserialize, Serialize};
6use session::Session;
6use session_layer::Session;
77use utoipa::ToSchema;
88
99use crate::errors::ApiError;
1010use crate::services::AuthService;
1111use crate::services::agreements::AcceptAgreementResp;
12use session::share::session::require_uid;
12use session_layer::share::session::require_uid;
1313
1414#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1515pub struct AcceptAgreementCmd {
Modified lib/auth/src/handlers/add_ssh_key.rs View lib/auth/src/handlers/add_ssh_key.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::ssh_keys::{AddSshKeyCmd, SshKeyDto};
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 post,
Modified lib/auth/src/handlers/cancel_deletion.rs View lib/auth/src/handlers/cancel_deletion.rs
@@ -1,10 +1,10 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
7use session::share::session::require_uid;
7use session_layer::share::session::require_uid;
88
99#[utoipa::path(
1010 delete,
Modified lib/auth/src/handlers/cancel_email_change.rs View lib/auth/src/handlers/cancel_email_change.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::AuthService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/auth/src/handlers/change_password.rs View lib/auth/src/handlers/change_password.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::password::ChangePasswordCmd;
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 post,
Modified lib/auth/src/handlers/confirm_email_change.rs View lib/auth/src/handlers/confirm_email_change.rs
@@ -3,13 +3,13 @@
33
44use export::rest::{AppResponseData, NoData};
55use serde::{Deserialize, Serialize};
6use session::Session;
6use session_layer::Session;
77use utoipa::ToSchema;
88use uuid::Uuid;
99
1010use crate::errors::ApiError;
1111use crate::services::AuthService;
12use session::share::session::require_uid;
12use session_layer::share::session::require_uid;
1313
1414#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1515pub struct ConfirmEmailChangeCmd {
Modified lib/auth/src/handlers/create_access_key.rs View lib/auth/src/handlers/create_access_key.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::access_keys::{CreateAccessKeyCmd, CreateAccessKeyResp};
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 post,
Modified lib/auth/src/handlers/create_report.rs View lib/auth/src/handlers/create_report.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::reports::{CreateReportCmd, ReportDto};
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 post,
Modified lib/auth/src/handlers/delete_access_key.rs View lib/auth/src/handlers/delete_access_key.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::AuthService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/auth/src/handlers/delete_notification.rs View lib/auth/src/handlers/delete_notification.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::AuthService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/auth/src/handlers/delete_ssh_key.rs View lib/auth/src/handlers/delete_ssh_key.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::AuthService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/auth/src/handlers/deletion_status.rs View lib/auth/src/handlers/deletion_status.rs
@@ -1,11 +1,11 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
77use crate::services::deletion::DeletionDto;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/auth/src/handlers/devices.rs View lib/auth/src/handlers/devices.rs
@@ -1,14 +1,14 @@
11use axum::Json;
22use axum::extract::{Path, Query, State};
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::devices::{DeviceDto, UpdateDeviceCmd};
1010use crate::share::types::ListQuery;
11use session::share::session::require_uid;
11use session_layer::share::session::require_uid;
1212
1313#[utoipa::path(
1414 get,
Modified lib/auth/src/handlers/forgot_password.rs View lib/auth/src/handlers/forgot_password.rs
@@ -2,7 +2,7 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
Modified lib/auth/src/handlers/get_preferences.rs View lib/auth/src/handlers/get_preferences.rs
@@ -1,11 +1,11 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
77use crate::services::preferences::UserPreferencesDto;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/auth/src/handlers/get_user.rs View lib/auth/src/handlers/get_user.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/auth/src/handlers/jwt_request.rs View lib/auth/src/handlers/jwt_request.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55
66use crate::errors::ApiError;
77use crate::services::AuthService;
Modified lib/auth/src/handlers/list_access_keys.rs View lib/auth/src/handlers/list_access_keys.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
77use crate::services::access_keys::AccessKeyDto;
88use crate::share::types::ListQuery;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/auth/src/handlers/list_notifications.rs View lib/auth/src/handlers/list_notifications.rs
@@ -1,13 +1,13 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::IntoParams;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::notifications::NotificationDto;
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[derive(Debug, Clone, Copy, Default, Deserialize, IntoParams)]
1313pub struct ListNotificationsQuery {
Modified lib/auth/src/handlers/list_ssh_keys.rs View lib/auth/src/handlers/list_ssh_keys.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
77use crate::services::ssh_keys::SshKeyDto;
88use crate::share::types::ListQuery;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/auth/src/handlers/login.rs View lib/auth/src/handlers/login.rs
@@ -3,7 +3,7 @@
33use axum::http::HeaderMap;
44
55use export::rest::{AppResponseData, NoData};
6use session::Session;
6use session_layer::Session;
77
88use crate::errors::ApiError;
99use crate::services::AuthService;
Modified lib/auth/src/handlers/login_2fa.rs View lib/auth/src/handlers/login_2fa.rs
@@ -2,7 +2,7 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
Modified lib/auth/src/handlers/logout.rs View lib/auth/src/handlers/logout.rs
@@ -1,6 +1,6 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
Modified lib/auth/src/handlers/mark_notifications_read.rs View lib/auth/src/handlers/mark_notifications_read.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33use export::rest::{AppResponseData, NoData};
44use serde::Deserialize;
5use session::Session;
5use session_layer::Session;
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::AuthService;
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[derive(Debug, Deserialize, utoipa::ToSchema)]
1313pub struct MarkNotificationsReadCmd {
Modified lib/auth/src/handlers/me.rs View lib/auth/src/handlers/me.rs
@@ -1,13 +1,13 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
33use serde::Serialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::ToSchema;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::profile::{ProfileDto, UserMeDto};
10use session::share::session::{require_uid, session_token_key};
10use session_layer::share::session::{require_uid, session_token_key};
1111
1212#[derive(Debug, Clone, Serialize, ToSchema)]
1313pub struct MeResp {
Modified lib/auth/src/handlers/pow_challenge.rs View lib/auth/src/handlers/pow_challenge.rs
@@ -1,7 +1,7 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
33use serde::Serialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::ToSchema;
66
77use crate::errors::ApiError;
Modified lib/auth/src/handlers/reclaim.rs View lib/auth/src/handlers/reclaim.rs
@@ -2,7 +2,7 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
Modified lib/auth/src/handlers/recovery_codes.rs View lib/auth/src/handlers/recovery_codes.rs
@@ -1,11 +1,11 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
77use crate::services::two_factor::RecoveryCodesResp;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/auth/src/handlers/regenerate_recovery_codes.rs View lib/auth/src/handlers/regenerate_recovery_codes.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::two_factor::{RecoveryCodesResp, RegenerateRecoveryCodesCmd};
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 put,
Modified lib/auth/src/handlers/register.rs View lib/auth/src/handlers/register.rs
@@ -2,7 +2,7 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
Modified lib/auth/src/handlers/request_deletion.rs View lib/auth/src/handlers/request_deletion.rs
@@ -3,13 +3,13 @@
33
44use export::rest::{AppResponseData, NoData};
55use serde::{Deserialize, Serialize};
6use session::Session;
6use session_layer::Session;
77use utoipa::ToSchema;
88
99use crate::errors::ApiError;
1010use crate::services::AuthService;
1111use crate::services::deletion::DeletionDto;
12use session::share::session::require_uid;
12use session_layer::share::session::require_uid;
1313
1414#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1515pub struct RequestDeletionCmd {
Modified lib/auth/src/handlers/request_email_change.rs View lib/auth/src/handlers/request_email_change.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::email::{EmailChangeTicketDto, RequestEmailChangeCmd};
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 post,
Modified lib/auth/src/handlers/resend_code.rs View lib/auth/src/handlers/resend_code.rs
@@ -2,7 +2,7 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
Modified lib/auth/src/handlers/rotate_access_key.rs View lib/auth/src/handlers/rotate_access_key.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::AuthService;
88use crate::services::access_keys::CreateAccessKeyResp;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/auth/src/handlers/totp_disable.rs View lib/auth/src/handlers/totp_disable.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::two_factor::TotpCodeCmd;
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 post,
Modified lib/auth/src/handlers/totp_enable.rs View lib/auth/src/handlers/totp_enable.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::two_factor::{RecoveryCodesResp, TotpEnableCmd};
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 post,
Modified lib/auth/src/handlers/totp_setup.rs View lib/auth/src/handlers/totp_setup.rs
@@ -1,11 +1,11 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
77use crate::services::two_factor::TotpSetupResp;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 post,
Modified lib/auth/src/handlers/totp_status.rs View lib/auth/src/handlers/totp_status.rs
@@ -1,11 +1,11 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::AuthService;
77use crate::services::two_factor::TotpStatusResp;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/auth/src/handlers/unread_notifications_count.rs View lib/auth/src/handlers/unread_notifications_count.rs
@@ -1,12 +1,12 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
33use serde::Serialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::ToSchema;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[derive(Debug, Clone, Serialize, ToSchema)]
1212pub struct UnreadCountResp {
Modified lib/auth/src/handlers/update_access_key.rs View lib/auth/src/handlers/update_access_key.rs
@@ -1,13 +1,13 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::access_keys::{AccessKeyDto, UpdateAccessKeyCmd};
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 patch,
Modified lib/auth/src/handlers/update_preferences.rs View lib/auth/src/handlers/update_preferences.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::preferences::{UpdatePreferencesCmd, UserPreferencesDto};
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 patch,
Modified lib/auth/src/handlers/update_profile.rs View lib/auth/src/handlers/update_profile.rs
@@ -2,12 +2,12 @@
22use axum::extract::State;
33
44use export::rest::{AppResponseData, NoData};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::profile::UpdateProfileCmd;
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 patch,
Modified lib/auth/src/handlers/users.rs View lib/auth/src/handlers/users.rs
@@ -2,8 +2,8 @@
22use axum::extract::{Path, Query, State};
33use export::rest::{AppResponseData, NoData};
44use serde::Deserialize;
5use session::Session;
6use session::share::session::require_uid;
5use session_layer::Session;
6use session_layer::share::session::require_uid;
77use utoipa::IntoParams;
88use uuid::Uuid;
99
Modified lib/auth/src/pow/store.rs View lib/auth/src/pow/store.rs
@@ -3,7 +3,7 @@
33
44use config::pow::PowConfig;
55use pow_solver::{Challenge, check};
6use session::Session;
6use session_layer::Session;
77use uuid::Uuid;
88
99use crate::pow::mac::{check_mac, sign_mac};
Modified lib/auth/src/services/email.rs View lib/auth/src/services/email.rs
@@ -5,7 +5,7 @@
55use sea_orm::sea_query::Expr;
66use sea_orm::{ActiveModelTrait, ColumnTrait, DbErr, EntityTrait, QueryFilter, Set};
77use serde::{Deserialize, Serialize};
8use session::Session;
8use session_layer::Session;
99use time::OffsetDateTime;
1010use uuid::Uuid;
1111
Modified lib/auth/src/services/jwt.rs View lib/auth/src/services/jwt.rs
@@ -1,6 +1,6 @@
11use serde::{Deserialize, Serialize};
2use session::Session;
3use session::share::session::session_token_key;
2use session_layer::Session;
3use session_layer::share::session::session_token_key;
44use utoipa::{IntoParams, ToSchema};
55use uuid::Uuid;
66
Modified lib/auth/src/services/login.rs View lib/auth/src/services/login.rs
@@ -3,7 +3,7 @@
33use models::users::{user_devices, user_emails};
44use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, QueryFilter, Set};
55use serde::{Deserialize, Serialize};
6use session::{AuthUser, Session};
6use session_layer::{AuthUser, Session};
77use time::OffsetDateTime;
88use uuid::Uuid;
99
@@ -288,9 +288,9 @@
288288 avatar_url: Some(export::resolve_user_avatar_url(user.uid, &user.avatar_url)),
289289 email,
290290 };
291 session::share::session::apply_login(session, auth_user, user.passwd_version);
291 session_layer::share::session::apply_login(session, auth_user, user.passwd_version);
292292 session.set(
293 &session::share::session::session_token_key(user.uid),
293 &session_layer::share::session::session_token_key(user.uid),
294294 token_hash,
295295 );
296296
Modified lib/auth/src/services/logout.rs View lib/auth/src/services/logout.rs
@@ -1,9 +1,9 @@
11use serde::{Deserialize, Serialize};
2use session::{Session, SessionUser, SessionUserMut};
2use session_layer::{Session, SessionUser, SessionUserMut};
33
44use super::AuthService;
55use crate::errors::AuthError;
6use session::share::session::session_token_key;
6use session_layer::share::session::session_token_key;
77
88#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)]
99pub struct LogoutResp {
Modified lib/auth/src/services/mod.rs View lib/auth/src/services/mod.rs
@@ -3,8 +3,8 @@
33use async_trait::async_trait;
44use config::AppConfig;
55use export::{AppDatabase, AppRedis, AppState};
6use session::SessionError;
7use session::share::guard::{SessionGuard, SessionWithUser};
6use session_layer::SessionError;
7use session_layer::share::guard::{SessionGuard, SessionWithUser};
88
99use crate::errors::AuthError;
1010
@@ -90,6 +90,6 @@
9090 &self,
9191 token_hash: &str,
9292 ) -> Result<Option<SessionWithUser>, SessionError> {
93 session::lookup_session_with_user(self.db().read(), token_hash).await
93 session_layer::lookup_session_with_user(self.db().read(), token_hash).await
9494 }
9595}
Modified lib/auth/src/services/password.rs View lib/auth/src/services/password.rs
@@ -1,7 +1,7 @@
11use models::users::{user, user_emails};
22use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, QueryFilter, Set};
33use serde::{Deserialize, Serialize};
4use session::Session;
4use session_layer::Session;
55use time::OffsetDateTime;
66use uuid::Uuid;
77
@@ -189,7 +189,7 @@
189189 active.updated_at = Set(now);
190190 active.update(db.write()).await?;
191191
192 session::share::session::apply_pwd_version(session, next_version);
192 session_layer::share::session::apply_pwd_version(session, next_version);
193193 Ok(())
194194 }
195195}
Modified lib/auth/src/services/pow.rs View lib/auth/src/services/pow.rs
@@ -1,5 +1,5 @@
11use pow_solver::Challenge;
2use session::Session;
2use session_layer::Session;
33
44use super::AuthService;
55use crate::errors::AuthError;
Modified lib/auth/src/services/register.rs View lib/auth/src/services/register.rs
@@ -3,7 +3,7 @@
33use models::users::{user, user_emails, user_profiles};
44use sea_orm::{ActiveModelTrait, ColumnTrait, DbErr, EntityTrait, QueryFilter, Set};
55use serde::{Deserialize, Serialize};
6use session::Session;
6use session_layer::Session;
77use time::{Date, OffsetDateTime};
88use uuid::Uuid;
99
Modified lib/auth/src/share/guard.rs View lib/auth/src/share/guard.rs
@@ -2,9 +2,9 @@
22use axum::http::StatusCode;
33use axum::middleware::Next;
44use axum::response::{IntoResponse, Response};
5use session::Session;
6use session::SessionUser;
7use session::share::guard::session_guard;
5use session_layer::Session;
6use session_layer::SessionUser;
7use session_layer::share::guard::session_guard;
88
99use crate::services::AuthService;
1010
Modified lib/auth/Cargo.toml View lib/auth/Cargo.toml
@@ -6,7 +6,7 @@
66[dependencies]
77async-trait = { workspace = true }
88config = { workspace = true }
9session = { workspace = true }
9session-layer = { workspace = true }
1010export = { workspace = true }
1111models = { workspace = true }
1212space = { workspace = true }
Modified lib/chat/src/handlers/attachments.rs View lib/chat/src/handlers/attachments.rs
@@ -4,8 +4,8 @@
44use export::rest::{AppResponseData, NoData};
55use imaging::layout::ImageVariant;
66use serde::Deserialize;
7use session::Session;
8use session::share::session::require_uid;
7use session_layer::Session;
8use session_layer::share::session::require_uid;
99use utoipa::{IntoParams, ToSchema};
1010use uuid::Uuid;
1111
Modified lib/chat/src/handlers/bookmarks.rs View lib/chat/src/handlers/bookmarks.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/dms.rs View lib/chat/src/handlers/dms.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/drafts.rs View lib/chat/src/handlers/drafts.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/emojis.rs View lib/chat/src/handlers/emojis.rs
@@ -2,8 +2,8 @@
22use axum::http::StatusCode;
33use axum::response::{IntoResponse, Response};
44use export::rest::{AppResponseData, NoData};
5use session::Session;
6use session::share::session::require_uid;
5use session_layer::Session;
6use session_layer::share::session::require_uid;
77use uuid::Uuid;
88
99use crate::errors::ApiError;
Modified lib/chat/src/handlers/messages.rs View lib/chat/src/handlers/messages.rs
@@ -1,8 +1,8 @@
11use axum::extract::{Json, Path, Query, State};
22use axum::response::IntoResponse;
33use export::rest::{AppResponseData, NoData};
4use session::Session;
5use session::share::session::require_uid;
4use session_layer::Session;
5use session_layer::share::session::require_uid;
66use uuid::Uuid;
77
88use crate::errors::ApiError;
Modified lib/chat/src/handlers/presence.rs View lib/chat/src/handlers/presence.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/reactions.rs View lib/chat/src/handlers/reactions.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/read_state.rs View lib/chat/src/handlers/read_state.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/reminders.rs View lib/chat/src/handlers/reminders.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/room_admin.rs View lib/chat/src/handlers/room_admin.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/rooms.rs View lib/chat/src/handlers/rooms.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/search.rs View lib/chat/src/handlers/search.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55
66use crate::errors::ApiError;
77use crate::services::search::{SearchPage, SearchQuery};
Modified lib/chat/src/handlers/settings.rs View lib/chat/src/handlers/settings.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/threads.rs View lib/chat/src/handlers/threads.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/handlers/voice.rs View lib/chat/src/handlers/voice.rs
@@ -5,8 +5,8 @@
55use livekit_api::access_token::TokenVerifier;
66use livekit_api::webhooks::WebhookReceiver;
77use serde::Deserialize;
8use session::Session;
9use session::share::session::require_uid;
8use session_layer::Session;
9use session_layer::share::session::require_uid;
1010use uuid::Uuid;
1111
1212use crate::errors::ApiError;
Modified lib/chat/src/handlers/webhooks.rs View lib/chat/src/handlers/webhooks.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
4use session::share::session::require_uid;
3use session_layer::Session;
4use session_layer::share::session::require_uid;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/chat/src/services/service.rs View lib/chat/src/services/service.rs
@@ -8,8 +8,8 @@
88use export::storage::AppStorage;
99use models::users::user;
1010use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
11use session::SessionError;
12use session::share::guard::{SessionGuard, SessionWithUser};
11use session_layer::SessionError;
12use session_layer::share::guard::{SessionGuard, SessionWithUser};
1313use space::services::spaces::UserDto;
1414use uuid::Uuid;
1515
@@ -112,6 +112,6 @@
112112 &self,
113113 token_hash: &str,
114114 ) -> Result<Option<SessionWithUser>, SessionError> {
115 session::lookup_session_with_user(self.db().read(), token_hash).await
115 session_layer::lookup_session_with_user(self.db().read(), token_hash).await
116116 }
117117}
Modified lib/chat/src/share/guard.rs View lib/chat/src/share/guard.rs
@@ -1,8 +1,8 @@
11use axum::extract::{Request, State};
22use axum::middleware::Next;
33use axum::response::Response;
4use session::Session;
5use session::share::guard::session_guard;
4use session_layer::Session;
5use session_layer::share::guard::session_guard;
66
77use crate::services::service::ChatService;
88
Modified lib/chat/Cargo.toml View lib/chat/Cargo.toml
@@ -12,7 +12,7 @@
1212models = { workspace = true }
1313search = { workspace = true }
1414social = { workspace = true }
15session = { workspace = true }
15session-layer = { workspace = true }
1616space = { workspace = true }
1717storage = { workspace = true }
1818axum = { workspace = true }
Modified lib/ci/src/handlers/artifacts.rs View lib/ci/src/handlers/artifacts.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use axum::response::Redirect;
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::handlers::runs::RepoPath;
Modified lib/ci/src/handlers/logs.rs View lib/ci/src/handlers/logs.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44use utoipa::IntoParams;
55
66use crate::errors::ApiError;
Modified lib/ci/src/handlers/runs.rs View lib/ci/src/handlers/runs.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, Query, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55use utoipa::IntoParams;
66
77use crate::errors::ApiError;
Modified lib/ci/src/handlers/space.rs View lib/ci/src/handlers/space.rs
@@ -3,7 +3,7 @@
33use axum::Json;
44use axum::extract::{Path, State};
55use export::rest::AppResponseData;
6use session::Session;
6use session_layer::Session;
77use utoipa::ToSchema;
88use uuid::Uuid;
99
Modified lib/ci/src/share/access.rs View lib/ci/src/share/access.rs
@@ -2,8 +2,8 @@
22use git::share::errors::GitError;
33use models::repo::repos;
44use models::space::spaces;
5use session::Session;
6use session::SessionUser;
5use session_layer::Session;
6use session_layer::SessionUser;
77use uuid::Uuid;
88
99use crate::errors::CiApiError;
Modified lib/ci/Cargo.toml View lib/ci/Cargo.toml
@@ -11,7 +11,7 @@
1111git = { workspace = true }
1212gitbaby = { workspace = true }
1313models = { workspace = true }
14session = { workspace = true }
14session-layer = { workspace = true }
1515space = { workspace = true }
1616storage = { workspace = true }
1717axum = { workspace = true }
Modified lib/export/src/api_error.rs View lib/export/src/api_error.rs
@@ -116,7 +116,7 @@
116116/// `IntoResponses` derive, envelope constructors, `IntoResponse`, and the
117117/// `From` impls shared by every crate (boxed self, `AppResponseData<()>`,
118118/// request rejections, `serde_json::Error`, `(StatusCode, &str)` and
119/// `session::SessionError`).
119/// `session_layer::SessionError`).
120120///
121121/// The enum must contain an `Internal` variant; `log` labels server-side
122122/// warnings as "`<log> handler failed`".
@@ -309,13 +309,13 @@
309309 }
310310 }
311311
312 impl From<::session::SessionError> for $name {
313 fn from(error: ::session::SessionError) -> Self {
312 impl From<::session_layer::SessionError> for $name {
313 fn from(error: ::session_layer::SessionError) -> Self {
314314 match error {
315 ::session::SessionError::Unauthorized => {
315 ::session_layer::SessionError::Unauthorized => {
316316 Self::build(401, Self::payload(401, "unauthorized"))
317317 }
318 ::session::SessionError::Database(message) => {
318 ::session_layer::SessionError::Database(message) => {
319319 ::tracing::warn!(error = %message, concat!($log, " handler failed"));
320320 Self::build(500, Self::payload(500, "internal server error"))
321321 }
Modified lib/git/src/handler/ai_review/list_commit_ai_reviews.rs View lib/git/src/handler/ai_review/list_commit_ai_reviews.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/ai_review/trigger_ai_review.rs View lib/git/src/handler/ai_review/trigger_ai_review.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/ai_summary/get_ai_summary.rs View lib/git/src/handler/ai_summary/get_ai_summary.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/ai_summary/trigger_ai_summary.rs View lib/git/src/handler/ai_summary/trigger_ai_summary.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55use uuid::Uuid;
66
77use crate::errors::{ApiError, GitApiError};
Modified lib/git/src/handler/analysis/code_activity.rs View lib/git/src/handler/analysis/code_activity.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/analysis/contributors.rs View lib/git/src/handler/analysis/contributors.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/analysis/languages.rs View lib/git/src/handler/analysis/languages.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::require_writer;
Modified lib/git/src/handler/analysis/languages_read.rs View lib/git/src/handler/analysis/languages_read.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/archives/create.rs View lib/git/src/handler/archives/create.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/archives/create_bundle.rs View lib/git/src/handler/archives/create_bundle.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/archives/download.rs View lib/git/src/handler/archives/download.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPathRev, resolve_reader};
Modified lib/git/src/handler/blobs/content.rs View lib/git/src/handler/blobs/content.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/blobs/list_lfs_pointers.rs View lib/git/src/handler/blobs/list_lfs_pointers.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/blobs/metadata.rs View lib/git/src/handler/blobs/metadata.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/branch_protection/create_policy.rs View lib/git/src/handler/branch_protection/create_policy.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::RepoPath;
Modified lib/git/src/handler/branch_protection/delete_policy.rs View lib/git/src/handler/branch_protection/delete_policy.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use axum::http::StatusCode;
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::branch_protection::PolicyPath;
Modified lib/git/src/handler/branch_protection/get_policy.rs View lib/git/src/handler/branch_protection/get_policy.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::branch_protection::PolicyPath;
Modified lib/git/src/handler/branch_protection/list_policies.rs View lib/git/src/handler/branch_protection/list_policies.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::RepoPath;
Modified lib/git/src/handler/branch_protection/update_policy.rs View lib/git/src/handler/branch_protection/update_policy.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::branch_protection::PolicyPath;
Modified lib/git/src/handler/branches/create.rs View lib/git/src/handler/branches/create.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/branches/delete.rs View lib/git/src/handler/branches/delete.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::require_writer;
Modified lib/git/src/handler/branches/get.rs View lib/git/src/handler/branches/get.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/branches/list.rs View lib/git/src/handler/branches/list.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/branches/rename.rs View lib/git/src/handler/branches/rename.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/branches/set_default.rs View lib/git/src/handler/branches/set_default.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::require_writer;
Modified lib/git/src/handler/code_comments/create_code_comment.rs View lib/git/src/handler/code_comments/create_code_comment.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/code_comments/list_code_comments.rs View lib/git/src/handler/code_comments/list_code_comments.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/code_comments/modify.rs View lib/git/src/handler/code_comments/modify.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55use uuid::Uuid;
66
77use crate::errors::{ApiError, GitApiError};
Modified lib/git/src/handler/code_comments/resolve_code_comment.rs View lib/git/src/handler/code_comments/resolve_code_comment.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::require_writer;
Modified lib/git/src/handler/commits/get.rs View lib/git/src/handler/commits/get.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
33use gitbaby::commit::types::CommitInfo;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/commits/is_ancestor.rs View lib/git/src/handler/commits/is_ancestor.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
33use serde::Serialize;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/commits/list.rs View lib/git/src/handler/commits/list.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/commits/list_commit_statuses.rs View lib/git/src/handler/commits/list_commit_statuses.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/commits/rev_parse.rs View lib/git/src/handler/commits/rev_parse.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/commits/set_commit_status.rs View lib/git/src/handler/commits/set_commit_status.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/commits/stats.rs View lib/git/src/handler/commits/stats.rs
@@ -3,7 +3,7 @@
33use axum::extract::{Path, Query, State};
44use export::rest::AppResponseData;
55use gitbaby::commit::types::CommitStats;
6use session::Session;
6use session_layer::Session;
77
88use crate::errors::{ApiError, GitApiError};
99use crate::handler::resolve_reader;
Modified lib/git/src/handler/commits/sync_commit.rs View lib/git/src/handler/commits/sync_commit.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
33use serde::Serialize;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/conflicts/detail.rs View lib/git/src/handler/conflicts/detail.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/conflicts/get_conflicts.rs View lib/git/src/handler/conflicts/get_conflicts.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/content/caller_signature.rs View lib/git/src/handler/content/caller_signature.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::State;
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55use time::OffsetDateTime;
66
77use crate::errors::{ApiError, GitApiError};
Modified lib/git/src/handler/content/commit_object.rs View lib/git/src/handler/content/commit_object.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/content/write_blob.rs View lib/git/src/handler/content/write_blob.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/content/write_tree_from_files.rs View lib/git/src/handler/content/write_tree_from_files.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/diffs/for_commit.rs View lib/git/src/handler/diffs/for_commit.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
33use gitbaby::diff::types::ChangedPath;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/diffs/get_diff.rs View lib/git/src/handler/diffs/get_diff.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/diffs/range_diff.rs View lib/git/src/handler/diffs/range_diff.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
33use gitbaby::diff::types::RangeDiffSpec;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/diffs/raw.rs View lib/git/src/handler/diffs/raw.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/hooks/execute_script.rs View lib/git/src/handler/hooks/execute_script.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/lfs/cleanup_unreferenced.rs View lib/git/src/handler/lfs/cleanup_unreferenced.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/lfs/list_locks.rs View lib/git/src/handler/lfs/list_locks.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, resolve_reader};
Modified lib/git/src/handler/lfs/lock.rs View lib/git/src/handler/lfs/lock.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/lfs/mod.rs View lib/git/src/handler/lfs/mod.rs
@@ -1,4 +1,4 @@
1use session::Session;
1use session_layer::Session;
22use uuid::Uuid;
33
44use crate::errors::ApiError;
Modified lib/git/src/handler/lfs/unlock.rs View lib/git/src/handler/lfs/unlock.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::RepoPath;
Modified lib/git/src/handler/lfs/unlock_by_id.rs View lib/git/src/handler/lfs/unlock_by_id.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::lfs::unlock_actor;
Modified lib/git/src/handler/lfs/verify_locks.rs View lib/git/src/handler/lfs/verify_locks.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/maintenance/fsck.rs View lib/git/src/handler/maintenance/fsck.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/maintenance/prune.rs View lib/git/src/handler/maintenance/prune.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/packs/ingest.rs View lib/git/src/handler/packs/ingest.rs
@@ -1,7 +1,7 @@
11use axum::body::Bytes;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/packs/repack.rs View lib/git/src/handler/packs/repack.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/packs/stats.rs View lib/git/src/handler/packs/stats.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, resolve_reader};
Modified lib/git/src/handler/patches/apply.rs View lib/git/src/handler/patches/apply.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/patches/generate.rs View lib/git/src/handler/patches/generate.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/patches/parse.rs View lib/git/src/handler/patches/parse.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::State;
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::ensure_caller;
Modified lib/git/src/handler/refs/branches.rs View lib/git/src/handler/refs/branches.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/refs/delete.rs View lib/git/src/handler/refs/delete.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::require_writer;
Modified lib/git/src/handler/refs/filtered.rs View lib/git/src/handler/refs/filtered.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
33use gitbaby::refs::types::RefInfo;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/refs/get.rs View lib/git/src/handler/refs/get.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
33use gitbaby::refs::types::RefInfo;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/refs/head.rs View lib/git/src/handler/refs/head.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/refs/is_object_in_ref.rs View lib/git/src/handler/refs/is_object_in_ref.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
33use serde::Serialize;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/refs/list.rs View lib/git/src/handler/refs/list.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
33use gitbaby::refs::types::RefInfo;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::resolve_reader;
Modified lib/git/src/handler/refs/resolve.rs View lib/git/src/handler/refs/resolve.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/refs/update.rs View lib/git/src/handler/refs/update.rs
@@ -2,7 +2,7 @@
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
44use serde::{Deserialize, Serialize};
5use session::Session;
5use session_layer::Session;
66
77use crate::errors::{ApiError, GitApiError};
88use crate::handler::require_writer;
Modified lib/git/src/handler/releases/create_release.rs View lib/git/src/handler/releases/create_release.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/releases/delete_release.rs View lib/git/src/handler/releases/delete_release.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{require_repo_admin, require_writer};
Modified lib/git/src/handler/releases/get_release.rs View lib/git/src/handler/releases/get_release.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/releases/list_releases.rs View lib/git/src/handler/releases/list_releases.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/releases/redraft_release.rs View lib/git/src/handler/releases/redraft_release.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::{ApiError, GitApiError};
Modified lib/git/src/handler/releases/update_release.rs View lib/git/src/handler/releases/update_release.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{require_repo_admin, require_writer};
Modified lib/git/src/handler/remotes/add.rs View lib/git/src/handler/remotes/add.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::require_writer;
Modified lib/git/src/handler/remotes/clone_import.rs View lib/git/src/handler/remotes/clone_import.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/remotes/fetch.rs View lib/git/src/handler/remotes/fetch.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/remotes/list.rs View lib/git/src/handler/remotes/list.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::RepoPath;
Modified lib/git/src/handler/remotes/push.rs View lib/git/src/handler/remotes/push.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::{ApiError, GitApiError};
77use crate::handler::{RepoPath, require_writer};
Modified lib/git/src/handler/remotes/remove.rs View lib/git/src/handler/remotes/remove.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::require_writer;
Modified lib/git/src/handler/repos/archive.rs View lib/git/src/handler/repos/archive.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::{RepoPath, ensure_caller};
Modified lib/git/src/handler/blame.rs View lib/git/src/handler/blame.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/graphql.rs View lib/git/src/handler/graphql.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::State;
33use axum::response::IntoResponse;
4use session::{Session, SessionUser};
4use session_layer::{Session, SessionUser};
55use uuid::Uuid;
66
77use crate::errors::ApiError;
Modified lib/git/src/handler/path_log.rs View lib/git/src/handler/path_log.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::{ApiError, GitApiError};
66use crate::handler::resolve_reader;
Modified lib/git/src/handler/share.rs View lib/git/src/handler/share.rs
@@ -1,7 +1,7 @@
11use axum::extract::{FromRequestParts, Path};
22use axum::http::request::Parts;
33use serde::Deserialize;
4use session::{Session, SessionUser};
4use session_layer::{Session, SessionUser};
55use utoipa::IntoParams;
66use uuid::Uuid;
77
Modified lib/git/src/handler/stars.rs View lib/git/src/handler/stars.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::IntoParams;
66
77use crate::errors::{ApiError, GitApiError};
Modified lib/git/src/handler/topics.rs View lib/git/src/handler/topics.rs
@@ -2,7 +2,7 @@
22use axum::extract::{Path, Query, State};
33use export::rest::{AppResponseData, NoData};
44use serde::{Deserialize, Serialize};
5use session::Session;
5use session_layer::Session;
66use utoipa::IntoParams;
77
88use crate::errors::{ApiError, GitApiError};
Modified lib/git/src/handler/watches.rs View lib/git/src/handler/watches.rs
@@ -3,7 +3,7 @@
33use export::rest::AppResponseData;
44use models::common::watch_mode::WatchMode;
55use serde::Deserialize;
6use session::Session;
6use session_layer::Session;
77use utoipa::IntoParams;
88
99use crate::errors::{ApiError, GitApiError};
Modified lib/git/src/handler/whitelists.rs View lib/git/src/handler/whitelists.rs
@@ -5,7 +5,7 @@
55use utoipa::IntoParams;
66use uuid::Uuid;
77
8use session::Session;
8use session_layer::Session;
99
1010use crate::errors::{ApiError, GitApiError};
1111use crate::handler::require_repo_admin;
Modified lib/git/Cargo.toml View lib/git/Cargo.toml
@@ -35,7 +35,7 @@
3535flate2 = { workspace = true }
3636rand = { workspace = true }
3737bytes = { workspace = true }
38session = { workspace = true }
38session-layer = { workspace = true }
3939search = { workspace = true }
4040utoipa = { workspace = true }
4141maud = { workspace = true }
Modified lib/import/src/handlers/cancel_import.rs View lib/import/src/handlers/cancel_import.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::caller;
Modified lib/import/src/handlers/create_import.rs View lib/import/src/handlers/create_import.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::handlers::caller;
Modified lib/import/src/handlers/get_import.rs View lib/import/src/handlers/get_import.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::caller;
Modified lib/import/src/handlers/list_imports.rs View lib/import/src/handlers/list_imports.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::caller;
Modified lib/import/src/handlers/mod.rs View lib/import/src/handlers/mod.rs
@@ -6,7 +6,7 @@
66pub mod requeue_imports;
77pub mod retry_import;
88
9use session::{Session, SessionUser};
9use session_layer::{Session, SessionUser};
1010use uuid::Uuid;
1111
1212use crate::errors::ApiError;
Modified lib/import/src/handlers/probe_import.rs View lib/import/src/handlers/probe_import.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::handlers::caller;
Modified lib/import/src/handlers/retry_import.rs View lib/import/src/handlers/retry_import.rs
@@ -1,7 +1,7 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::AppResponseData;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::handlers::caller;
Modified lib/import/src/share/guard.rs View lib/import/src/share/guard.rs
@@ -1,8 +1,8 @@
11use axum::extract::{Request, State};
22use axum::middleware::Next;
33use axum::response::Response;
4use session::Session;
5use session::share::guard::session_guard;
4use session_layer::Session;
5use session_layer::share::guard::session_guard;
66
77use crate::service::ImportService;
88
Modified lib/import/src/service.rs View lib/import/src/service.rs
@@ -680,11 +680,11 @@
680680}
681681
682682#[async_trait::async_trait]
683impl session::SessionGuard for ImportService {
683impl session_layer::SessionGuard for ImportService {
684684 async fn lookup_session_with_user(
685685 &self,
686686 token_hash: &str,
687 ) -> Result<Option<session::SessionWithUser>, session::SessionError> {
688 session::lookup_session_with_user(self.db_read(), token_hash).await
687 ) -> Result<Option<session_layer::SessionWithUser>, session_layer::SessionError> {
688 session_layer::lookup_session_with_user(self.db_read(), token_hash).await
689689 }
690690}
Modified lib/import/Cargo.toml View lib/import/Cargo.toml
@@ -16,7 +16,7 @@
1616sea-orm = { workspace = true }
1717serde = { workspace = true, features = ["derive"] }
1818serde_json = { workspace = true }
19session = { workspace = true }
19session-layer = { workspace = true }
2020thiserror = { workspace = true }
2121time = { workspace = true }
2222tokio = { workspace = true, features = ["fs", "process", "time", "sync", "rt", "macros"] }
Modified lib/issues/src/services/service.rs View lib/issues/src/services/service.rs
@@ -13,8 +13,8 @@
1313use models::users::user;
1414use models::users::user_notifications::{self, NotificationType};
1515use sea_orm::{ActiveModelTrait, ColumnTrait, ConnectionTrait, EntityTrait, QueryFilter, Set};
16use session::SessionError;
17use session::share::guard::{SessionGuard, SessionWithUser};
16use session_layer::SessionError;
17use session_layer::share::guard::{SessionGuard, SessionWithUser};
1818use space::services::spaces::UserDto;
1919use time::OffsetDateTime;
2020use uuid::Uuid;
@@ -277,6 +277,6 @@
277277 &self,
278278 token_hash: &str,
279279 ) -> Result<Option<SessionWithUser>, SessionError> {
280 session::lookup_session_with_user(self.db().read(), token_hash).await
280 session_layer::lookup_session_with_user(self.db().read(), token_hash).await
281281 }
282282}
Modified lib/issues/src/share/guard.rs View lib/issues/src/share/guard.rs
@@ -1,8 +1,8 @@
11use axum::extract::{Request, State};
22use axum::middleware::Next;
33use axum::response::Response;
4use session::Session;
5use session::share::guard::session_guard;
4use session_layer::Session;
5use session_layer::share::guard::session_guard;
66
77use crate::services::service::IssueService;
88
Modified lib/issues/Cargo.toml View lib/issues/Cargo.toml
@@ -10,7 +10,7 @@
1010i18n = { workspace = true }
1111email = { workspace = true }
1212models = { workspace = true }
13session = { workspace = true }
13session-layer = { workspace = true }
1414space = { workspace = true }
1515axum = { workspace = true }
1616sea-orm = { workspace = true }
Modified lib/pulls/src/handlers/inbox.rs View lib/pulls/src/handlers/inbox.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::AppResponseData;
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::inbox::{InboxPage, InboxQuery};
Modified lib/pulls/src/services/service.rs View lib/pulls/src/services/service.rs
@@ -7,7 +7,7 @@
77 ActiveModelTrait, ActiveValue::Set, ColumnTrait, DatabaseConnection, EntityTrait,
88 PaginatorTrait, QueryFilter,
99};
10use session::Session;
10use session_layer::Session;
1111use uuid::Uuid;
1212
1313use crate::errors::PullError;
@@ -42,7 +42,7 @@
4242 }
4343
4444 pub fn uid(session: &Session) -> Result<Uuid, PullError> {
45 use session::SessionUser;
45 use session_layer::SessionUser;
4646 session.uid().ok_or(PullError::Unauthorized)
4747 }
4848
Modified lib/pulls/src/share/lookup.rs View lib/pulls/src/share/lookup.rs
@@ -2,7 +2,7 @@
22use git::share::access::authorize_repo_access;
33use models::pull_request::pull_requests;
44use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
5use session::{Session, SessionUser};
5use session_layer::{Session, SessionUser};
66use uuid::Uuid;
77
88use crate::errors::PullError;
Modified lib/pulls/Cargo.toml View lib/pulls/Cargo.toml
@@ -9,7 +9,7 @@
99git = { workspace = true }
1010issues = { workspace = true }
1111models = { workspace = true }
12session = { workspace = true }
12session-layer = { workspace = true }
1313space = { workspace = true }
1414axum = { workspace = true }
1515sea-orm = { workspace = true }
Modified lib/session/src/config.rs View lib/session/src/config.rs
@@ -1,218 +1,921 @@
1use axum_session::{Key, SameSite as AxumSameSite, SessionConfig, SessionMode as AxumSessionMode};
2use base64::Engine as _;
3use chrono::TimeDelta;
4use config::session::{SameSite, SessionConfig as AppSessionConfig, SessionMode};
1use chrono::Duration;
2pub use cookie::{Key, SameSite};
3use std::{
4 borrow::Cow,
5 fmt::{Debug, Formatter, Result},
6 sync::Arc,
7};
8use uuid::Uuid;
59
6/// `axum_session` keys contain a 32-byte signing key plus a 32-byte
7/// encryption key; anything shorter is rejected by the `cookie` crate.
8const MIN_KEY_LEN: usize = 64;
10/// Mode at which the Session will function As.
11///
12/// # Examples
13/// ```rust
14/// use session::{SessionConfig, SessionMode};
15///
16/// let config = SessionConfig::default().with_mode(SessionMode::Persistent);
17/// ```
18///
19#[derive(Debug, Clone)]
20pub enum SessionMode {
21 /// Creates a SessionID Without SessionData.The End user must run `session.create_data()`
22 /// to create the SessionData.
23 /// Functions will emit a Info warning and do nothing until Created.
24 /// Deletes SessionData and cookie if `session.store` is false.
25 /// if SessionData.store is true retains SessionData and Syncs with Database.
26 /// You can Set SessionData.store to true using 'session.set_store(true)'
27 Manual,
28 /// Always Creates a Session.
29 /// Deletes SessionData and cookie if `session.store` is false.
30 /// if SessionData.store is true retains SessionData and Syncs with Database.
31 /// You can Set SessionData.store to true using 'session.set_store(true)'
32 OptIn,
33 /// Always Creates a Session
34 /// Always retains in Memory and syncs with Database.
35 Persistent,
36}
937
10pub fn build_session_config(config: &AppSessionConfig) -> Result<SessionConfig, String> {
11 validate(config)?;
38impl SessionMode {
39 /// Checks if the Mode is set to only if OptIn or Manual.
40 ///
41 pub fn is_opt_in(&self) -> bool {
42 matches!(self, SessionMode::OptIn | SessionMode::Manual)
43 }
44 /// Checks if the user needs to manually create the SessionData per user.
45 /// When created the Session will get Set to loaded.
46 pub fn is_manual(&self) -> bool {
47 matches!(self, SessionMode::Manual)
48 }
49}
1250
13 let mut session = SessionConfig::default();
51#[derive(Clone)]
52pub struct CookieAndHeaderConfig {
53 /// The Cookie or Header name that contains a boolean for session saving.
54 /// only used when session_mode is set to SessionMode::OptIn or Manual.
55 pub(crate) store_name: Cow<'static, str>,
56 /// Session Cookie or Header name.
57 pub(crate) session_name: Cow<'static, str>,
58 /// Session cookie domain.
59 pub(crate) cookie_domain: Option<Cow<'static, str>>,
60 /// Session cookie http only flag.
61 pub(crate) cookie_http_only: bool,
62 /// Session cookie max age None means the browser deletes cookie on close.
63 /// Please make sure the Duration is longer than max_lifespan.
64 pub(crate) cookie_max_age: Option<Duration>,
65 /// Session cookie path.
66 pub(crate) cookie_path: Cow<'static, str>,
67 /// Resticts how Cookies are sent cross-site. Default is `SameSite::Lax`.
68 pub(crate) cookie_same_site: SameSite,
69 /// Session cookie secure flag.
70 pub(crate) cookie_secure: bool,
71 /// Encyption Key used to sign cookies and header for integrity, and authenticity.
72 pub(crate) key: Option<Key>,
73 /// This is used to append __Host- to the front of all Cookie names to prevent sub domain usage.
74 /// This will not append to Headers only Cookies. It is enabled by default.
75 pub(crate) prefix_with_host: bool,
76 /// If Key is Some and this is true then the ip and user agent will be used to further sign cookies
77 /// and header values. This will help prevent others from spoofing your cookies and headers.
78 /// It is enabled by default.
79 pub(crate) with_ip_and_user_agent: bool,
80}
1481
15 if let Some(mode) = config.mode {
16 session = session.with_mode(match mode {
17 SessionMode::Manual => AxumSessionMode::Manual,
18 SessionMode::OptIn => AxumSessionMode::OptIn,
19 SessionMode::Persistent => AxumSessionMode::Persistent,
20 });
82impl Debug for CookieAndHeaderConfig {
83 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
84 f.debug_struct("CookieAndHeaderConfig")
85 .field("store_name", &self.store_name)
86 .field("cookie_domain", &self.cookie_domain)
87 .field("cookie_http_only", &self.cookie_http_only)
88 .field("cookie_max_age", &self.cookie_max_age)
89 .field("session_name", &self.session_name)
90 .field("cookie_path", &self.cookie_path)
91 .field("cookie_same_site", &self.cookie_same_site)
92 .field("cookie_secure", &self.cookie_secure)
93 .field("prefix_with_host", &self.prefix_with_host)
94 .field("with_ip_and_user_agent", &self.with_ip_and_user_agent)
95 .field("key", &"key hidden")
96 .finish()
2197 }
98}
2299
23 if let Some(name) = &config.cookie_name {
24 session = session.with_session_name(name.clone());
100#[derive(Clone)]
101pub struct DatabaseConfig {
102 /// Encyption Key used to encypt Session data stored in the database for confidentiality.
103 pub(crate) database_key: Option<Key>,
104 /// Session Database table name default is sessions.
105 pub(crate) table_name: Cow<'static, str>,
106 /// This value represents the duration for how often session's data gets purged from the database per request.
107 pub(crate) purge_database_update: Duration,
108 /// Ignore's the update checks and will always save the session to the database if set to true.
109 pub(crate) always_save: bool,
110 /// Minimum time interval between database updates for the same session.
111 /// Sessions will only be updated in the database if this duration has elapsed
112 /// since the last database update. This helps reduce database write load
113 /// for frequently accessed sessions. Default is 10 seconds.
114 pub(crate) db_update_interval: Duration,
115}
116
117impl Debug for DatabaseConfig {
118 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
119 f.debug_struct("DatabaseConfig")
120 .field("table_name", &self.table_name)
121 .field("purge_database_update", &self.purge_database_update)
122 .field("always_save", &self.always_save)
123 .field("db_update_interval", &self.db_update_interval)
124 .field("database_key", &"key hidden")
125 .finish()
25126 }
26 if let Some(domain) = &config.cookie_domain
27 && !domain.is_empty()
28 {
29 session = session.with_cookie_domain(domain.clone());
127}
128
129#[derive(Clone)]
130pub struct MemoryConfig {
131 /// This value represents the duration for how often session's data gets purged from memory per request.
132 pub(crate) purge_update: Duration,
133 /// Session Memory lifespan, determines when to unload it from memory
134 /// this works fine since the data can stay in the database till its needed
135 /// if not yet expired.
136 pub(crate) memory_lifespan: Duration,
137 /// How many Elements could we see at one time in the Table?
138 /// So if you have 1000 unique visitors a second and each generate a UUID.
139 /// That would be 1000 * 60(secs) * 60(mins) * 24(hours) to get 1 days worth of visitors.
140 pub(crate) filter_expected_elements: u64,
141 /// The probability of how many allowable false positives you want to have based on the expected elements.
142 /// 0.01 is a good starting point.
143 pub(crate) filter_false_positive_probability: f64,
144 /// This enabled using a counting bloom filter. If this is taking to much Memory or is to slow or you just dont want
145 /// the false positives it can give you can disable it by setting it to false. This will reduce memory usage.
146 /// By default this is enabled unless the specific database cant function with it then disabled.
147 pub(crate) use_bloom_filters: bool,
148}
149
150impl Debug for MemoryConfig {
151 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
152 f.debug_struct("MemoryConfig")
153 .field("memory_lifespan", &self.memory_lifespan)
154 .field("filter_expected_elements", &self.filter_expected_elements)
155 .field("use_bloom_filters", &self.use_bloom_filters)
156 .field("purge_update", &self.purge_update)
157 .field(
158 "filter_false_positive_probability",
159 &self.filter_false_positive_probability,
160 )
161 .finish()
30162 }
31 if let Some(path) = &config.cookie_path {
32 session = session.with_cookie_path(path.clone());
163}
164
165#[derive(Clone)]
166pub struct IpUserAgentConfig {
167 /// Uses the Direct Socket IP addresss of the socket connection.
168 pub(crate) use_ip: bool,
169 /// (XFF) request header is a de-facto standard header for identifying the originating
170 /// IP address of a client connecting to a web server through a proxy server
171 pub(crate) use_xforward_ip: bool,
172 /// Contains information that may be added by reverse proxy servers
173 pub(crate) use_forward_ip: bool,
174 /// The last remote peers ip addresss.
175 pub(crate) use_real_ip: bool,
176 /// The Browser user agent.
177 pub(crate) use_user_agent: bool,
178}
179
180impl Debug for IpUserAgentConfig {
181 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
182 f.debug_struct("IpUserAgentConfig")
183 .field("use_ip", &self.use_ip)
184 .field("use_xforward_ip", &self.use_xforward_ip)
185 .field("use_forward_ip", &self.use_forward_ip)
186 .field("use_real_ip", &self.use_real_ip)
187 .field("use_user_agent", &self.use_user_agent)
188 .finish()
33189 }
34 if let Some(value) = config.cookie_http_only {
35 session = session.with_http_only(value);
190}
191
192pub trait IdGenerator: Debug + Send + Sync + 'static {
193 fn generate(&self) -> String;
194}
195
196impl IdGenerator for Uuid {
197 fn generate(&self) -> String {
198 Uuid::new_v4().to_string()
36199 }
37 if let Some(value) = config.cookie_secure {
38 session = session.with_secure(value);
200}
201
202/// Configuration for how the Session and Cookies are used.
203///
204/// # Examples
205/// ```rust
206/// use session::SessionConfig;
207///
208/// let config = SessionConfig::default();
209/// ```
210///
211#[derive(Clone)]
212pub struct SessionConfig {
213 /// Disables the need to avoid session saving.
214 pub(crate) session_mode: SessionMode,
215 pub(crate) id_generator: Arc<dyn IdGenerator>,
216 /// Minimal lifespan of database store and cookie before expiring.
217 /// This is set to the Cookie before sending and to the database before updating/inserting.
218 pub(crate) lifespan: Duration,
219 /// Maximum lifespan of database store and cookie before expiring.
220 /// This is set to the Cookie before sending and to the database before updating/inserting.
221 /// Only Set when Long Term is true.
222 pub(crate) max_lifespan: Duration,
223 /// This is to be used when your handling multiple Parallel Sessions to prevent the next one from unloaded data.
224 pub(crate) clear_check_on_load: bool,
225 /// where All Database Storage options exist.
226 pub(crate) database: DatabaseConfig,
227 /// where All In Memory Storage options exist.
228 pub(crate) memory: MemoryConfig,
229 /// where All the cookie and header Options Exist.
230 pub(crate) cookie_and_header: CookieAndHeaderConfig,
231 /// tells how we should build the string for hashing to secure the cookie.
232 pub(crate) ip_user_agent: IpUserAgentConfig,
233 pub(crate) thread_sleep_duration: Duration,
234}
235
236impl Debug for SessionConfig {
237 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
238 f.debug_struct("SessionConfig")
239 .field("id_generator", &self.id_generator)
240 .field("database", &self.database)
241 .field("memory", &self.memory)
242 .field("cookie_and_header", &self.cookie_and_header)
243 .field("session_mode", &self.session_mode)
244 .field("lifespan", &self.lifespan)
245 .field("max_lifespan", &self.max_lifespan)
246 .field("clear_check_on_load", &self.clear_check_on_load)
247 .field("thread_sleep_duration", &self.thread_sleep_duration)
248 .finish()
39249 }
40 if let Some(same_site) = config.cookie_same_site {
41 session = session.with_cookie_same_site(match same_site {
42 SameSite::Strict => AxumSameSite::Strict,
43 SameSite::Lax => AxumSameSite::Lax,
44 SameSite::None => AxumSameSite::None,
45 });
250}
251
252impl SessionConfig {
253 /// Creates [`Default`] configuration of [`SessionConfig`].
254 /// This is equivalent to the [`SessionConfig::default()`].
255 #[inline]
256 pub fn new() -> Self {
257 Default::default()
46258 }
47 if let Some(secs) = config.cookie_max_age_secs {
48 // A zero max-age makes browsers delete the cookie on receipt, which
49 // breaks every session; validation rejects it before we get here.
50 session = session.with_max_age(Some(TimeDelta::seconds(secs)));
259
260 /// Set a custom session ID generator.
261 /// By default session IDs are UUIDs, but this allows for custom
262 /// session ID formats. For example, to generate an ID that matches
263 /// those from another web framework.
264 ///
265 /// # Examples
266 /// ```rust
267 /// use session::{IdGenerator, SessionConfig};
268 ///
269 /// #[derive(Debug)]
270 /// struct CustomSessionId();
271 ///
272 /// impl CustomSessionId {
273 /// pub fn new() -> Self {
274 /// CustomSessionId()
275 /// }
276 /// }
277 ///
278 /// impl IdGenerator for CustomSessionId {
279 /// fn generate(&self) -> String {
280 /// // Return a custom Session ID...
281 /// "something random".into()
282 /// }
283 /// }
284 ///
285 /// let config = SessionConfig::default().with_id_generator(CustomSessionId::new());
286 /// ```
287 #[must_use]
288 pub fn with_id_generator(mut self, id_generator: impl IdGenerator) -> Self {
289 self.id_generator = Arc::new(id_generator);
290 self
51291 }
52 if let Some(value) = config.cookie_prefix_host {
53 session = session.with_prefix_with_host(value);
292
293 /// Set the session's store Cookie or Header name.
294 ///
295 /// # Examples
296 /// ```rust
297 /// use session::SessionConfig;
298 ///
299 /// let config = SessionConfig::default().with_store_name("my_stored_cookie".to_owned());
300 /// ```
301 ///
302 #[must_use]
303 pub fn with_store_name(mut self, name: impl Into<Cow<'static, str>>) -> Self {
304 self.cookie_and_header.store_name = name.into();
305 self
54306 }
55 if let Some(value) = config.cookie_encode_ip_and_user_agent {
56 session = session.with_ip_and_user_agent(value);
307
308 /// Set's the session's cookie's domain name.
309 ///
310 /// # Examples
311 /// ```rust
312 /// use session::SessionConfig;
313 ///
314 /// let config = SessionConfig::default().with_cookie_domain("www.helpme.com".to_string());
315 /// ```
316 ///
317 #[must_use]
318 pub fn with_cookie_domain(mut self, name: impl Into<Cow<'static, str>>) -> Self {
319 self.cookie_and_header.cookie_domain = Some(name.into());
320 self
321 }
322
323 /// Set's the session's Cookie or Header name.
324 ///
325 /// # Examples
326 /// ```rust
327 /// use session::SessionConfig;
328 ///
329 /// let config = SessionConfig::default().with_session_name("my_cookie");
330 /// ```
331 ///
332 #[must_use]
333 pub fn with_session_name(mut self, name: impl Into<Cow<'static, str>>) -> Self {
334 self.cookie_and_header.session_name = name.into();
335 self
336 }
337
338 /// Set's the session's cookie's path.
339 ///
340 /// This is used to determine when the cookie takes effect within the website path.
341 /// Leave as default ("/") for cookie to be used site wide.
342 ///
343 /// # Examples
344 /// ```rust
345 /// use session::SessionConfig;
346 ///
347 /// let config = SessionConfig::default().with_cookie_path("/");
348 /// ```
349 ///
350 #[must_use]
351 pub fn with_cookie_path(mut self, path: impl Into<Cow<'static, str>>) -> Self {
352 self.cookie_and_header.cookie_path = path.into();
353 self
354 }
355
356 /// Set's the session's cookie's Same Site Setting for Cross-Site restrictions.
357 ///
358 /// # Examples
359 /// ```rust
360 /// use session::SessionConfig;
361 /// use cookie::SameSite;
362 ///
363 /// let config = SessionConfig::default().with_cookie_same_site(SameSite::Strict);
364 /// ```
365 ///
366 #[must_use]
367 pub fn with_cookie_same_site(mut self, same_site: SameSite) -> Self {
368 self.cookie_and_header.cookie_same_site = same_site;
369 self
370 }
371
372 /// Set's whether the session Persistantly stores data or on stores if storable.
373 ///
374 /// # Examples
375 /// ```rust
376 /// use session::{SessionMode, SessionConfig};
377 /// use cookie::SameSite;
378 ///
379 /// let config = SessionConfig::default().with_mode(SessionMode::Persistent);
380 /// ```
381 ///
382 #[must_use]
383 pub fn with_mode(mut self, mode: SessionMode) -> Self {
384 self.session_mode = mode;
385 self
386 }
387
388 /// Set's the session's cookie's to http only.
389 ///
390 /// # Examples
391 /// ```rust
392 /// use session::SessionConfig;
393 ///
394 /// let config = SessionConfig::default().with_http_only(false);
395 /// ```
396 ///
397 #[must_use]
398 pub fn with_http_only(mut self, is_set: bool) -> Self {
399 self.cookie_and_header.cookie_http_only = is_set;
400 self
401 }
402
403 /// Set's the session's lifetime (expiration time) within database storage.
404 /// This should be equal too or less than the Cookies Expiration time.
405 /// # Examples
406 /// ```rust
407 /// use session::SessionConfig;
408 /// use chrono::Duration;
409 ///
410 /// let config = SessionConfig::default().with_lifetime(Duration::days(32));
411 /// ```
412 ///
413 #[must_use]
414 pub fn with_lifetime(mut self, time: Duration) -> Self {
415 self.lifespan = time;
416 self
417 }
418
419 /// Set's the session's cookies max_age (expiration time).
420 ///
421 /// If this is set to None then the Cookie will be unloaded on browser Close.
422 /// Set this to be the duration of max_lifespan or longer to prevent session drops.
423 /// This is generally in a duration of how many Days a cookie should live in the browser.
424 /// Please Ensure the Duration is greater or equal to max_lifespan for proper storage.
425 /// # Examples
426 /// ```rust
427 /// use session::SessionConfig;
428 /// use chrono::Duration;
429 ///
430 /// let config = SessionConfig::default().with_max_age(Some(Duration::days(64)));
431 /// ```
432 ///
433 #[must_use]
434 pub fn with_max_age(mut self, time: Option<Duration>) -> Self {
435 self.cookie_and_header.cookie_max_age = time;
436 self
437 }
438
439 /// Set's the session's long term lifetime (expiration time) within database storage.
440 ///
441 /// # Examples
442 /// ```rust
443 /// use session::SessionConfig;
444 /// use chrono::Duration;
445 ///
446 /// let config = SessionConfig::default().with_max_lifetime(Duration::days(32));
447 /// ```
448 ///
449 #[must_use]
450 pub fn with_max_lifetime(mut self, time: Duration) -> Self {
451 self.max_lifespan = time;
452 self
453 }
454
455 /// Set's the session's lifetime (expiration time) within memory storage.
456 /// This setting should be Less than lifespan and max_lifespan. This is to
457 /// Unload the data from memory and allow it to stay stored in the database.
458 ///
459 /// Set this to Duration::zero() if you dont want it to stay in memory.
460 /// Warning: This will cause it to be loaded from the database each request.
461 ///
462 /// # Examples
463 /// ```rust
464 /// use session::SessionConfig;
465 /// use chrono::Duration;
466 ///
467 /// let config = SessionConfig::default().with_memory_lifetime(Duration::days(32));
468 /// ```
469 ///
470 #[must_use]
471 pub fn with_memory_lifetime(mut self, time: Duration) -> Self {
472 self.memory.memory_lifespan = time;
473 self
474 }
475
476 /// This value represents the offset duration for how often session purge for memory is ran.
477 ///
478 /// # Examples
479 /// ```rust
480 /// use session::SessionConfig;
481 /// use chrono::Duration;
482 ///
483 /// let config = SessionConfig::default().with_purge_update(Duration::hours(1));
484 /// ```
485 ///
486 #[must_use]
487 pub fn with_purge_update(mut self, duration: Duration) -> Self {
488 self.memory.purge_update = duration;
489 self
490 }
491
492 /// This value represents the offset duration for how often session purge for database is ran.
493 /// If using Redis or any auto purge database this Setting will be ignored.
494 ///
495 /// # Examples
496 /// ```rust
497 /// use session::SessionConfig;
498 /// use chrono::Duration;
499 ///
500 /// let config = SessionConfig::default().with_purge_database_update(Duration::hours(5));
501 /// ```
502 ///
503 #[must_use]
504 pub fn with_purge_database_update(mut self, duration: Duration) -> Self {
505 self.database.purge_database_update = duration;
506 self
507 }
508
509 /// This value represents if the database should check for updates to save or
510 /// to just save the data regardless of updates. When set to true it will disable the
511 /// update checks.
512 ///
513 /// # Examples
514 /// ```rust
515 /// use session::SessionConfig;
516 /// use chrono::Duration;
517 ///
518 /// let config = SessionConfig::default().with_always_save(true);
519 /// ```
520 ///
521 #[must_use]
522 pub fn with_always_save(mut self, always_save: bool) -> Self {
523 self.database.always_save = always_save;
524 self
525 }
526
527 /// Set the database update interval for throttling session saves.
528 /// This controls how frequently a session's data is persisted to the database.
529 /// Only sessions that haven't been updated to the database within this interval
530 /// will have their data saved on the next request.
531 ///
532 /// # Examples
533 /// ```rust
534 /// use session::SessionConfig;
535 /// use chrono::Duration;
536 ///
537 /// let config = SessionConfig::default()
538 /// .with_db_update_interval(Duration::try_seconds(10).unwrap_or_default());
539 /// ```
540 ///
541 #[must_use]
542 pub fn with_db_update_interval(mut self, interval: Duration) -> Self {
543 self.database.db_update_interval = interval;
544 self
545 }
546
547 /// Set's the session's secure flag for if it gets sent over https.
548 ///
549 /// # Examples
550 /// ```rust
551 /// use session::SessionConfig;
552 ///
553 /// let config = SessionConfig::default().with_secure(true);
554 /// ```
555 ///
556 #[must_use]
557 pub fn with_secure(mut self, is_set: bool) -> Self {
558 self.cookie_and_header.cookie_secure = is_set;
559 self
560 }
561
562 /// Set's the session's database table name.
563 ///
564 /// # Examples
565 /// ```rust
566 /// use session::SessionConfig;
567 ///
568 /// let config = SessionConfig::default().with_table_name("my_table");
569 /// ```
570 ///
571 #[must_use]
572 pub fn with_table_name(mut self, table_name: impl Into<Cow<'static, str>>) -> Self {
573 self.database.table_name = table_name.into();
574 self
575 }
576
577 /// Set's the session's cookie encyption key enabling Signed cookies.
578 ///
579 /// When Set it will enforce Signed cookies across all Sessions.
580 /// If you use Key::generate() it will make a new key each server reboot.
581 /// To prevent this make and save a key to a config file for long term usage.
582 /// For Extra Security Regenerate the key every so many months to a year.
583 /// A new key will invalidate all old Sessions so it be wise to run session_store.clear_store() on reboot.
584 ///
585 /// Must be Set to Some() in order to use Security::PerSession.
586 ///
587 /// # Examples
588 /// ```rust
589 /// use session::{Key, SessionConfig};
590 ///
591 /// let config = SessionConfig::default().with_key(Key::generate());
592 /// ```
593 ///
594 #[must_use]
595 pub fn with_key(mut self, key: Key) -> Self {
596 self.cookie_and_header.key = Some(key);
597 self
598 }
599
600 /// Set's the session's database encyption key for per session key storage.
601 ///
602 /// Must be Set to Some() in order to use Security::PerSession or will panic if not.
603 ///
604 /// # Examples
605 /// ```rust
606 /// use session::{Key, SessionConfig};
607 ///
608 /// let config = SessionConfig::default().with_key(Key::generate());
609 /// ```
610 ///
611 #[must_use]
612 pub fn with_database_key(mut self, key: Key) -> Self {
613 self.database.database_key = Some(key);
614 self
615 }
616
617 /// Set's the session's filters expected elements.
618 /// Please Set this by a daily value.
619 /// Example: 1000 * 60(secs) * 60(mins) * 24(hours) to get 1 days worth of visitors.
620 ///
621 /// # Examples
622 /// ```rust
623 /// use session::SessionConfig;
624 ///
625 /// let config = SessionConfig::default().with_filter_expected_elements(100_000);
626 /// ```
627 ///
628 #[must_use]
629 pub fn with_filter_expected_elements(mut self, elements: u64) -> Self {
630 self.memory.filter_expected_elements = elements;
631 self
632 }
633
634 /// Set's the session's filters False Posistive probability when creating and comparing UUID.
635 ///
636 /// # Examples
637 /// ```rust
638 /// use session::SessionConfig;
639 ///
640 /// let config = SessionConfig::default().with_filter_false_positive_probability(0.01);
641 /// ```
642 ///
643 #[must_use]
644 pub fn with_filter_false_positive_probability(mut self, probability: f64) -> Self {
645 self.memory.filter_false_positive_probability = probability;
646 self
647 }
648
649 /// Set's the session's bloom filters to be disabled or enabled. By default they are enabled.
650 ///
651 /// # Examples
652 /// ```rust
653 /// use session::SessionConfig;
654 ///
655 /// let config = SessionConfig::default().with_bloom_filter(true);
656 /// ```
657 ///
658 #[must_use]
659 pub fn with_bloom_filter(mut self, enable: bool) -> Self {
660 self.memory.use_bloom_filters = enable;
661 self
662 }
663
664 /// Get's the session's Cookie/Header name
665 ///
666 /// # Examples
667 /// ```rust
668 /// use session::SessionConfig;
669 ///
670 /// let name = SessionConfig::default().get_session_name();
671 /// ```
672 ///
673 pub fn get_session_name(&self) -> String {
674 self.cookie_and_header.session_name.to_string()
675 }
676
677 /// Get's the session's store booleans Cookie/Header name
678 ///
679 /// # Examples
680 /// ```rust
681 /// use session::SessionConfig;
682 ///
683 /// let name = SessionConfig::default().get_store_name();
684 /// ```
685 ///
686 pub fn get_store_name(&self) -> String {
687 self.cookie_and_header.store_name.to_string()
688 }
689
690 /// Set's the session's loading to either true: unload data if checks fail or false: bypass.
691 ///
692 /// # Examples
693 /// ```rust
694 /// use session::SessionConfig;
695 ///
696 /// let config = SessionConfig::default().with_bloom_filter(true);
697 /// ```
698 ///
699 #[must_use]
700 pub fn with_clear_check_on_load(mut self, enable: bool) -> Self {
701 self.clear_check_on_load = enable;
702 self
703 }
704
705 /// Set's the session's prefix_with_host to either true: __Host- gets prefixed to the cookie names false: __Host- does not get prepended.
706 ///
707 /// __Host- prefix: Cookies with names starting with __Host- must be set with the secure flag, must be from a secure page (HTTPS),
708 /// must not have a domain specified (and therefore, are not sent to subdomains), and the path must be /.
709 ///
710 /// # Examples
711 /// ```rust
712 /// use session::SessionConfig;
713 ///
714 /// let config = SessionConfig::default().with_prefix_with_host(true);
715 /// ```
716 ///
717 #[must_use]
718 pub fn with_prefix_with_host(mut self, enable: bool) -> Self {
719 self.cookie_and_header.prefix_with_host = enable;
720 self
721 }
722
723 /// Set's the session's with_ip_and_user_agent.
724 ///
725 /// If Key is Some and this is true then the ip and user agent will be used to further sign cookies
726 /// and header values. This will help prevent others from spoofing your cookies and headers.
727 /// It is enabled by default.
728 ///
729 /// # Examples
730 /// ```rust
731 /// use session::SessionConfig;
732 ///
733 /// let config = SessionConfig::default().with_ip_and_user_agent(false);
734 /// ```
735 ///
736 #[must_use]
737 pub fn with_ip_and_user_agent(mut self, enable: bool) -> Self {
738 self.cookie_and_header.with_ip_and_user_agent = enable;
739 self
740 }
741
742 /// Set's the session's to use the Socket connected IP when hashing and verifying the cookies integrity.
743 /// Only if with_ip_and_user_agent is also enabled.
744 ///
745 /// # Examples
746 /// ```rust
747 /// use session::SessionConfig;
748 ///
749 /// let config = SessionConfig::default().with_hashed_ip(true);
750 /// ```
751 ///
752 #[must_use]
753 pub fn with_hashed_ip(mut self, enable: bool) -> Self {
754 self.ip_user_agent.use_ip = enable;
755 self
756 }
757
758 /// Set's the session's to use the xforward information when hashing and verifying the cookies integrity.
759 /// Only if with_ip_and_user_agent is also enabled.
760 ///
761 /// # Examples
762 /// ```rust
763 /// use session::SessionConfig;
764 ///
765 /// let config = SessionConfig::default().with_hashed_xforward(true);
766 /// ```
767 ///
768 #[must_use]
769 pub fn with_hashed_xforward(mut self, enable: bool) -> Self {
770 self.ip_user_agent.use_xforward_ip = enable;
771 self
772 }
773
774 /// Set's the session's to use the forward information when hashing and verifying the cookies integrity.
775 /// Only if with_ip_and_user_agent is also enabled.
776 ///
777 /// # Examples
778 /// ```rust
779 /// use session::SessionConfig;
780 ///
781 /// let config = SessionConfig::default().with_hashed_forward(true);
782 /// ```
783 ///
784 #[must_use]
785 pub fn with_hashed_forward(mut self, enable: bool) -> Self {
786 self.ip_user_agent.use_forward_ip = enable;
787 self
57788 }
58789
59 if let Some(secs) = config.lifespan_secs {
60 session = session.with_lifetime(TimeDelta::seconds(secs));
790 /// Set's the session's to use the real ip information when hashing and verifying the cookies integrity.
791 /// Only if with_ip_and_user_agent is also enabled.
792 ///
793 /// # Examples
794 /// ```rust
795 /// use session::SessionConfig;
796 ///
797 /// let config = SessionConfig::default().with_hashed_real_ip(true);
798 /// ```
799 ///
800 #[must_use]
801 pub fn with_hashed_real_ip(mut self, enable: bool) -> Self {
802 self.ip_user_agent.use_real_ip = enable;
803 self
61804 }
62 if let Some(secs) = config.max_lifespan_secs {
63 session = session.with_max_lifetime(TimeDelta::seconds(secs));
64 }
65 if let Some(secs) = config.memory_lifespan_secs {
66 session = session.with_memory_lifetime(TimeDelta::seconds(secs));
67 }
68 if let Some(secs) = config.db_update_interval_secs {
69 session = session.with_db_update_interval(TimeDelta::seconds(secs));
70 }
71 if let Some(secs) = config.purge_database_update_secs {
72 session = session.with_purge_database_update(TimeDelta::seconds(secs));
73 }
74 if let Some(value) = config.always_save {
75 session = session.with_always_save(value);
76 }
77 if let Some(value) = config.enable_bloom_filter {
78 session = session.with_bloom_filter(value);
79 }
80 if let Some(name) = &config.table_name {
81 session = session.with_table_name(name.clone());
805
806 /// Set's the session's to use the browsers user agent information when hashing and verifying the cookies integrity.
807 /// Only if with_ip_and_user_agent is also enabled.
808 ///
809 /// # Examples
810 /// ```rust
811 /// use session::SessionConfig;
812 ///
813 /// let config = SessionConfig::default().with_hashed_user_agent(true);
814 /// ```
815 ///
816 #[must_use]
817 pub fn with_hashed_user_agent(mut self, enable: bool) -> Self {
818 self.ip_user_agent.use_user_agent = enable;
819 self
82820 }
83821
84 if let Some(key) = &config.key {
85 session = session.with_key(decode_key(key)?);
86 }
87 if let Some(key) = &config.database_key {
88 session = session.with_database_key(decode_key(key)?);
822 /// Set's the session's thread Sleep Timer to reduce CPU cycle times.
823 ///
824 /// # Examples
825 /// ```rust
826 /// use session::SessionConfig;
827 /// use chrono::Duration;
828 ///
829 /// let config = SessionConfig::default().with_thread_sleep_duration(Duration::try_minutes(5).unwrap_or_default());
830 /// ```
831 ///
832 #[must_use]
833 pub fn with_thread_sleep_duration(mut self, duration: Duration) -> Self {
834 self.thread_sleep_duration = duration;
835 self
89836 }
90
91 Ok(session)
92837}
93838
94fn validate(config: &AppSessionConfig) -> Result<(), String> {
95 if let Some(name) = &config.table_name {
96 if name.is_empty() {
97 return Err(
98 "table_name must not be empty: it prefixes session keys in Redis and an empty \
99 prefix would make scans/deletes target unrelated keys"
100 .into(),
101 );
102 }
103 for c in ['*', '?', '[', ']', '\\'] {
104 if name.contains(c) {
105 return Err(format!(
106 "table_name must not contain glob character '{c}': {name:?}"
107 ));
108 }
839impl Default for SessionConfig {
840 fn default() -> Self {
841 Self {
842 id_generator: Arc::new(Uuid::default()),
843 // Set to a 6 hour default in Database Session stores unloading.
844 lifespan: Duration::try_hours(6).unwrap_or_default(),
845 cookie_and_header: CookieAndHeaderConfig::default(),
846 database: DatabaseConfig::default(),
847 memory: MemoryConfig::default(),
848 // Unload long term session after 60 days if it has not been accessed.
849 max_lifespan: Duration::try_days(60).unwrap_or_default(),
850 session_mode: SessionMode::Persistent,
851 clear_check_on_load: true,
852 ip_user_agent: IpUserAgentConfig::default(),
853 thread_sleep_duration: Duration::try_minutes(5).unwrap_or_default(),
109854 }
110855 }
856}
111857
112 let secure = config.cookie_secure.unwrap_or(false);
113 if config.cookie_same_site == Some(SameSite::None) && !secure {
114 return Err(
115 "cookie_same_site = none requires cookie_secure = true: browsers reject non-Secure \
116 cookies with SameSite=None"
117 .into(),
118 );
858impl Default for MemoryConfig {
859 fn default() -> Self {
860 Self {
861 // Unload memory after 60 minutes if it has not been accessed.
862 memory_lifespan: Duration::try_minutes(60).unwrap_or_default(),
863 // Default to purge old sessions every 1 hours.
864 purge_update: Duration::try_hours(1).unwrap_or_default(),
865 // Simple is the Default mode for compatibilty with older versions of the crate.
866 filter_expected_elements: 100_000,
867 // The probability of how many allowable false positives you want to have based on the expected elements.
868 // 0.01 is a good starting point.
869 filter_false_positive_probability: 0.01,
870 // Always set to on.
871 use_bloom_filters: true,
872 }
119873 }
120 if config.cookie_prefix_host == Some(true) && !secure {
121 return Err(
122 "cookie_prefix_host = true requires cookie_secure = true: browsers reject non-Secure \
123 cookies with the __Host- prefix"
124 .into(),
125 );
126 }
127 if config.cookie_prefix_host == Some(true)
128 && config
129 .cookie_domain
130 .as_deref()
131 .is_some_and(|domain| !domain.is_empty())
132 {
133 return Err(
134 "cookie_prefix_host = true forbids a cookie_domain: __Host- cookies must not carry \
135 a Domain attribute"
136 .into(),
137 );
138 }
139 if !secure {
140 tracing::warn!(
141 "session cookies are not marked Secure (cookie_secure is not true); enable it when \
142 serving over TLS in production"
143 );
144 }
874}
145875
146 check_duration("lifespan_secs", config.lifespan_secs, false)?;
147 check_duration("max_lifespan_secs", config.max_lifespan_secs, false)?;
148 check_duration("memory_lifespan_secs", config.memory_lifespan_secs, true)?;
149 check_duration("cookie_max_age_secs", config.cookie_max_age_secs, false)?;
150 check_duration(
151 "db_update_interval_secs",
152 config.db_update_interval_secs,
153 true,
154 )?;
155 check_duration(
156 "purge_database_update_secs",
157 config.purge_database_update_secs,
158 true,
159 )?;
160
161 if let (Some(lifespan), Some(max_lifespan)) = (config.lifespan_secs, config.max_lifespan_secs)
162 && max_lifespan < lifespan
163 {
164 return Err(format!(
165 "max_lifespan_secs ({max_lifespan}) must be greater than or equal to \
166 lifespan_secs ({lifespan})"
167 ));
168 }
169
170 if let Some(key) = &config.key {
171 check_key("key", key)?;
876impl Default for DatabaseConfig {
877 fn default() -> Self {
878 Self {
879 // Set to a 6 hour default in Database Session stores unloading.
880 table_name: "sessions".into(),
881 // Default to purge old sessions in the database every 5 hours per request.
882 purge_database_update: Duration::try_hours(5).unwrap_or_default(),
883 always_save: false,
884 // Database key is set to None it will panic if you attempt to use SecurityMode::PerSession.
885 database_key: None,
886 // Default to 10 seconds between database updates for the same session.
887 db_update_interval: Duration::try_seconds(10).unwrap_or_default(),
888 }
172889 }
173 if let Some(key) = &config.database_key {
174 check_key("database_key", key)?;
175 }
176
177 Ok(())
178890}
179891
180fn check_duration(name: &str, secs: Option<i64>, allow_zero: bool) -> Result<(), String> {
181 if let Some(secs) = secs
182 && (secs < 0 || (secs == 0 && !allow_zero))
183 {
184 return Err(format!("{name} must be positive, got {secs}"));
892impl Default for CookieAndHeaderConfig {
893 fn default() -> Self {
894 Self {
895 session_name: "session".into(),
896 cookie_path: "/".into(),
897 cookie_max_age: Some(Duration::try_days(100).unwrap_or_default()),
898 cookie_http_only: true,
899 cookie_secure: false,
900 cookie_domain: None,
901 cookie_same_site: SameSite::Lax,
902 store_name: "store".into(),
903 // Key is set to None so Private cookies are not used by default. Please set this if you want to use private cookies.
904 key: None,
905 prefix_with_host: false,
906 with_ip_and_user_agent: true,
907 }
185908 }
186
187 Ok(())
188909}
189910
190fn check_key(name: &str, value: &str) -> Result<(), String> {
191 let bytes = base64::engine::general_purpose::STANDARD
192 .decode(value)
193 .map_err(|err| format!("invalid base64 session key for {name}: {err}"))?;
194
195 if bytes.len() < MIN_KEY_LEN {
196 return Err(format!(
197 "{name} is too short: expected at least {MIN_KEY_LEN} randomly generated bytes \
198 (base64-encoded), got {} bytes",
199 bytes.len()
200 ));
911impl Default for IpUserAgentConfig {
912 fn default() -> Self {
913 Self {
914 use_ip: true,
915 use_xforward_ip: false,
916 use_forward_ip: false,
917 use_real_ip: false,
918 use_user_agent: true,
919 }
201920 }
202 if bytes.len() > MIN_KEY_LEN {
203 tracing::warn!(
204 "{name} is longer than {MIN_KEY_LEN} bytes; only the first {MIN_KEY_LEN} bytes \
205 will be used"
206 );
207 }
208
209 Ok(())
210}
211
212fn decode_key(value: &str) -> Result<Key, String> {
213 let bytes = base64::engine::general_purpose::STANDARD
214 .decode(value)
215 .map_err(|err| format!("invalid base64 session key: {err}"))?;
216
217 Key::try_from(bytes.as_slice()).map_err(|err| err.to_string())
218921}
Modified lib/session/src/lib.rs View lib/session/src/lib.rs
@@ -1,15 +1,29 @@
1pub mod config;
2pub mod error;
3pub mod share;
4pub mod store;
5pub mod user;
1#![doc = include_str!("../README.md")]
2#![allow(dead_code)]
3#![warn(clippy::all, nonstandard_style, future_incompatible)]
4#![forbid(unsafe_code)]
5#![cfg_attr(docsrs, feature(doc_cfg))]
6
7mod config;
8pub mod databases;
9mod errors;
10mod handler;
11pub(crate) mod headers;
12mod layer;
13mod sec;
14mod service;
15mod session;
16mod session_data;
17mod session_store;
18
19pub use config::{IdGenerator, Key, SameSite, SessionConfig, SessionMode};
20pub use databases::*;
21pub use errors::SessionError;
22pub use layer::SessionLayer;
23pub use sec::*;
24pub use session::{ReadOnlySession, Session};
25pub use session_store::SessionStore;
626
7pub use config::build_session_config;
8pub use error::SessionError;
9pub use share::guard::{SessionGuard, SessionWithUser, lookup_session_with_user, session_guard};
10pub use share::session::{
11 PWD_VERSION_KEY, apply_login, pwd_version_matches, require_uid, session_token_key,
12 validate_session_pwd_version,
13};
14pub use store::{ReadOnlySession, Session, SessionLayer, SessionRedisPool, SessionStore};
15pub use user::{AuthUser, SessionUser, SessionUserMut, UID_KEY, USERS_KEY};
27pub(crate) use handler::*;
28pub(crate) use service::SessionService;
29pub(crate) use session_data::{SessionData, SessionTimers};
Modified lib/session/Cargo.toml View lib/session/Cargo.toml
@@ -1,20 +1,143 @@
1# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
2#
3# When uploading crates to the registry Cargo will automatically
4# "normalize" Cargo.toml files for maximal compatibility
5# with all versions of Cargo and also rewrite `path` dependencies
6# to registry (e.g., crates.io) dependencies.
7#
8# If you are reading this file be aware that the original Cargo.toml
9# will likely look very different (and much more reasonable).
10# See Cargo.toml.orig for the original contents.
11
112[package]
13edition = "2021"
14rust-version = "1.78"
215name = "session"
3version.workspace = true
4edition.workspace = true
16version = "0.21.0"
17publish = false
18authors = ["Andrew Wheeler <genusistimelord@gmail.com>"]
19build = false
20autolib = false
21autobins = false
22autoexamples = false
23autotests = false
24autobenches = false
25description = "📝 Session management layer for axum that supports HTTP and Rest."
26documentation = "https://docs.rs/axum_session"
27readme = "README.md"
28keywords = [
29 "Axum",
30 "Tower",
31 "Session",
32 "Store",
33]
34license = "MIT OR Apache-2.0"
35repository = "https://github.com/AscendingCreations/AxumSession"
536
6[dependencies]
7async-trait = { workspace = true }
8models = { workspace = true }
9axum = { workspace = true }
10base64 = { workspace = true }
11chrono = { workspace = true }
12config = { workspace = true }
13export = { workspace = true }
14axum_session = { workspace = true }
15redis = { workspace = true }
16sea-orm = { workspace = true }
17serde = { workspace = true, features = ["derive"] }
18time = { workspace = true }
19tracing = { workspace = true }
20uuid = { workspace = true }
No newline at end of file
37[package.metadata.docs.rs]
38features = [
39 "key-store",
40 "advanced",
41]
42rustdoc-args = [
43 "--document-private-items",
44 "--cfg",
45 "docsrs",
46]
47
48[features]
49advanced = []
50key-store = ["fastbloom-rs"]
51rest_mode = []
52
53[lib]
54name = "session"
55path = "src/lib.rs"
56
57[dependencies.aes-gcm]
58version = "0.11.0"
59
60[dependencies.async-trait]
61version = "0.1.92"
62
63[dependencies.axum]
64version = "0.8.9"
65
66[dependencies.base64]
67version = "0.23.1"
68
69[dependencies.bytes]
70version = "1.12.1"
71
72[dependencies.chrono]
73version = "0.4.45"
74features = [
75 "clock",
76 "serde",
77]
78default-features = false
79
80[dependencies.cookie]
81version = "0.18.2"
82features = [
83 "percent-encode",
84 "private",
85]
86
87[dependencies.dashmap]
88version = "6.2.1"
89
90[dependencies.fastbloom-rs]
91version = "0.5.10"
92optional = true
93
94[dependencies.forwarded-header-value]
95version = "0.1.1"
96
97[dependencies.futures]
98version = "0.3.33"
99
100[dependencies.hmac]
101version = "0.13.0"
102
103[dependencies.http]
104version = "1.5.0"
105
106[dependencies.http-body]
107version = "1.1.0"
108
109[dependencies.rand]
110version = "0.10.2"
111
112[dependencies.serde]
113version = "1.0.229"
114features = ["derive"]
115
116[dependencies.serde_json]
117version = "1.0.151"
118
119[dependencies.sha2]
120version = "0.11.0"
121
122[dependencies.thiserror]
123version = "2.0.20"
124
125[dependencies.tokio]
126version = "1.53.1"
127features = ["full"]
128
129[dependencies.tower-layer]
130version = "0.3.3"
131
132[dependencies.tower-service]
133version = "0.3.3"
134
135[dependencies.tracing]
136version = "0.1.44"
137
138[dependencies.uuid]
139version = "1.24.0"
140features = [
141 "serde",
142 "v4",
143]
Modified lib/social/src/parse/youtube.rs View lib/social/src/parse/youtube.rs
@@ -29,12 +29,10 @@
2929 Some(EmbedRule::wide(r"^/(?:watch\?v=|embed/|shorts/|live/|v/)([A-Za-z0-9_-]{6,})", "https://www.youtube.com/embed/{id}"))
3030 }
3131
32 /// 播放列表与频道页走 `videoseries`,不是单个视频的 `embed/{id}`。
3332 fn parse(&self, url: &url::Url) -> Option<crate::Resolved> {
3433 use crate::parse::{capture_args, default_parse, platform_resolved};
3534 use crate::EmbedKind;
3635
37 // `watch?v=…&list=…` 有具体视频时优先放视频,纯 `playlist?list=` 才放列表。
3836 let only_list = capture_args(r"^/playlist.*[?&]list=([A-Za-z0-9_-]+)", url);
3937 if let Some(caps) = only_list {
4038 return Some(platform_resolved(
@@ -48,8 +46,6 @@
4846 crate::Aspect::Wide,
4947 ));
5048 }
51 // 频道页不做内嵌:`listType=user_uploads` 已在 YouTube 侧停用
52 // (实测返回 152-4),硬塞 iframe 只会给用户一个错误框,不如留卡片。
5349 default_parse(self, url)
5450 }
5551 fn oembed(&self) -> Option<&'static str> {
Modified lib/space/src/handlers/accept_invite.rs View lib/space/src/handlers/accept_invite.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Json, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::invites::AcceptInviteCmd;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 post,
Modified lib/space/src/handlers/add_member.rs View lib/space/src/handlers/add_member.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::members::{AddMemberCmd, MemberDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/assign_group.rs View lib/space/src/handlers/assign_group.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_member::MemberPath;
77use crate::services::groups::AssignGroupCmd;
88use crate::services::service::SpaceService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/ban_user.rs View lib/space/src/handlers/ban_user.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::bans::{BanDto, BanUserCmd};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/create_dir_node.rs View lib/space/src/handlers/create_dir_node.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::dir::{CreateDirCmd, DirNodeDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/create_group.rs View lib/space/src/handlers/create_group.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::groups::{CreateGroupCmd, GroupDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/create_invite.rs View lib/space/src/handlers/create_invite.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::invites::{CreateInviteCmd, InviteDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/create_join_rule.rs View lib/space/src/handlers/create_join_rule.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::join_rules::{CreateJoinRuleCmd, JoinRuleDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/create_room.rs View lib/space/src/handlers/create_room.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::rooms::{CreateRoomCmd, RoomDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/create_space.rs View lib/space/src/handlers/create_space.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Json, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
77use crate::services::spaces::{CreateSpaceCmd, SpaceDto};
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 post,
Modified lib/space/src/handlers/delete_group.rs View lib/space/src/handlers/delete_group.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_group::GroupPath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/delete_join_rule.rs View lib/space/src/handlers/delete_join_rule.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::join_rules::JoinRulePath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/delete_room.rs View lib/space/src/handlers/delete_room.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/delete_space.rs View lib/space/src/handlers/delete_space.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
77use crate::services::spaces::SpaceNamePath;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/delete_space_image.rs View lib/space/src/handlers/delete_space_image.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::images::SpaceImageKindPath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/explore_spaces.rs View lib/space/src/handlers/explore_spaces.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::{Session, SessionUser};
3use session_layer::{Session, SessionUser};
44
55use crate::errors::ApiError;
66use crate::services::join_requests::{
@@ -9,7 +9,7 @@
99};
1010use crate::services::service::SpaceService;
1111use crate::services::spaces::SpaceNamePath;
12use session::share::session::require_uid;
12use session_layer::share::session::require_uid;
1313
1414#[utoipa::path(
1515 get,
Modified lib/space/src/handlers/get_ban.rs View lib/space/src/handlers/get_ban.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_member::MemberPath;
77use crate::services::bans::BanDto;
88use crate::services::service::SpaceService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/space/src/handlers/get_group.rs View lib/space/src/handlers/get_group.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
33use serde::Deserialize;
4use session::{Session, SessionUser};
4use session_layer::{Session, SessionUser};
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
Modified lib/space/src/handlers/get_member.rs View lib/space/src/handlers/get_member.rs
@@ -1,14 +1,14 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::members::MemberDto;
1010use crate::services::service::SpaceService;
11use session::share::session::require_uid;
11use session_layer::share::session::require_uid;
1212
1313#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1414pub struct MemberPath {
Modified lib/space/src/handlers/get_space.rs View lib/space/src/handlers/get_space.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::{Session, SessionUser};
3use session_layer::{Session, SessionUser};
44
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
Modified lib/space/src/handlers/get_space_dir_tree.rs View lib/space/src/handlers/get_space_dir_tree.rs
@@ -1,13 +1,13 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::services::dir::DirNodeDto;
88use crate::services::service::SpaceService;
99use crate::services::spaces::SpaceNamePath;
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[derive(Debug, Clone, Deserialize, utoipa::IntoParams)]
1313pub struct DirTreeQuery {
Modified lib/space/src/handlers/get_space_image.rs View lib/space/src/handlers/get_space_image.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::{Session, SessionUser};
3use session_layer::{Session, SessionUser};
44
55use crate::errors::ApiError;
66use crate::services::images::{SpaceImageDto, SpaceImageKindPath};
Modified lib/space/src/handlers/get_space_image_file.rs View lib/space/src/handlers/get_space_image_file.rs
@@ -3,7 +3,7 @@
33use axum::response::Response;
44use imaging::layout::ImageVariant;
55use serde::Deserialize;
6use session::{Session, SessionUser};
6use session_layer::{Session, SessionUser};
77use utoipa::{IntoParams, ToSchema};
88
99use crate::errors::ApiError;
Modified lib/space/src/handlers/join_group_self.rs View lib/space/src/handlers/join_group_self.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_group::GroupPath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 post,
Modified lib/space/src/handlers/join_requests.rs View lib/space/src/handlers/join_requests.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::join_requests::{CreateJoinRequestCmd, JoinRequestDto, JoinRequestPath};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/leave_group_self.rs View lib/space/src/handlers/leave_group_self.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_group::GroupPath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/list_bans.rs View lib/space/src/handlers/list_bans.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::bans::BanPage;
77use crate::services::service::SpaceService;
88use crate::services::spaces::{PageQuery, SpaceNamePath};
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/space/src/handlers/list_dir_group_overwrites.rs View lib/space/src/handlers/list_dir_group_overwrites.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::dir::{DirPath, GroupOverwriteDto};
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/space/src/handlers/list_dir_user_overwrites.rs View lib/space/src/handlers/list_dir_user_overwrites.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::dir::{DirPath, UserOverwriteDto};
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/space/src/handlers/list_groups.rs View lib/space/src/handlers/list_groups.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::groups::GroupPage;
77use crate::services::service::SpaceService;
88use crate::services::spaces::{PageQuery, SpaceNamePath};
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/space/src/handlers/list_invites.rs View lib/space/src/handlers/list_invites.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::invites::InvitePage;
77use crate::services::service::SpaceService;
88use crate::services::spaces::{PageQuery, SpaceNamePath};
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/space/src/handlers/list_join_rules.rs View lib/space/src/handlers/list_join_rules.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::join_rules::JoinRuleDto;
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/space/src/handlers/list_members.rs View lib/space/src/handlers/list_members.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::members::MemberPage;
77use crate::services::service::SpaceService;
88use crate::services::spaces::{PageQuery, SpaceNamePath};
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/space/src/handlers/list_spaces.rs View lib/space/src/handlers/list_spaces.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
77use crate::services::spaces::{PageQuery, SpacePage};
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/space/src/handlers/move_dir_node.rs View lib/space/src/handlers/move_dir_node.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::dir::{DirNodeDto, DirPath, MoveDirCmd};
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 patch,
Modified lib/space/src/handlers/reject_invite.rs View lib/space/src/handlers/reject_invite.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Json, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::invites::AcceptInviteCmd;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 post,
Modified lib/space/src/handlers/remove_dir_group_overwrite.rs View lib/space/src/handlers/remove_dir_group_overwrite.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::set_dir_group_overwrite::DirGroupPath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/remove_dir_user_overwrite.rs View lib/space/src/handlers/remove_dir_user_overwrite.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::set_dir_user_overwrite::DirUserPath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/remove_member.rs View lib/space/src/handlers/remove_member.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_member::MemberPath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/repair_dir_parents.rs View lib/space/src/handlers/repair_dir_parents.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::dir::RepairDirResp;
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/space/src/handlers/revoke_invite.rs View lib/space/src/handlers/revoke_invite.rs
@@ -1,14 +1,14 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::invites::InviteDto;
1010use crate::services::service::SpaceService;
11use session::share::session::require_uid;
11use session_layer::share::session::require_uid;
1212
1313#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1414pub struct InvitePath {
Modified lib/space/src/handlers/self_member.rs View lib/space/src/handlers/self_member.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::members::{MemberDto, UpdateMemberCmd};
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 patch,
Modified lib/space/src/handlers/set_dir_group_overwrite.rs View lib/space/src/handlers/set_dir_group_overwrite.rs
@@ -1,14 +1,14 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::dir::{GroupOverwriteDto, SetOverwriteCmd};
1010use crate::services::service::SpaceService;
11use session::share::session::require_uid;
11use session_layer::share::session::require_uid;
1212
1313#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1414pub struct DirGroupPath {
Modified lib/space/src/handlers/set_dir_user_overwrite.rs View lib/space/src/handlers/set_dir_user_overwrite.rs
@@ -1,14 +1,14 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::dir::{SetOverwriteCmd, UserOverwriteDto};
1010use crate::services::service::SpaceService;
11use session::share::session::require_uid;
11use session_layer::share::session::require_uid;
1212
1313#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1414pub struct DirUserPath {
Modified lib/space/src/handlers/unassign_group.rs View lib/space/src/handlers/unassign_group.rs
@@ -1,13 +1,13 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
33use serde::Deserialize;
4use session::Session;
4use session_layer::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::service::SpaceService;
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1313pub struct MemberGroupPath {
Modified lib/space/src/handlers/unban_user.rs View lib/space/src/handlers/unban_user.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_member::MemberPath;
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/space/src/handlers/update_ban.rs View lib/space/src/handlers/update_ban.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_member::MemberPath;
77use crate::services::bans::{BanDto, UpdateBanCmd};
88use crate::services::service::SpaceService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 patch,
Modified lib/space/src/handlers/update_dir_node.rs View lib/space/src/handlers/update_dir_node.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::dir::{DirNodeDto, DirPath, UpdateDirCmd};
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 patch,
Modified lib/space/src/handlers/update_group.rs View lib/space/src/handlers/update_group.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_group::GroupPath;
77use crate::services::groups::{GroupDto, UpdateGroupCmd};
88use crate::services::service::SpaceService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 patch,
Modified lib/space/src/handlers/update_join_rule.rs View lib/space/src/handlers/update_join_rule.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::join_rules::{JoinRuleDto, JoinRulePath, UpdateJoinRuleCmd};
77use crate::services::service::SpaceService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 patch,
Modified lib/space/src/handlers/update_member.rs View lib/space/src/handlers/update_member.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::handlers::get_member::MemberPath;
77use crate::services::members::{MemberDto, UpdateMemberCmd};
88use crate::services::service::SpaceService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 patch,
Modified lib/space/src/handlers/update_space.rs View lib/space/src/handlers/update_space.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
77use crate::services::spaces::{SpaceDto, SpaceNamePath, UpdateSpaceCmd};
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 patch,
Modified lib/space/src/handlers/upload_space_image.rs View lib/space/src/handlers/upload_space_image.rs
@@ -3,12 +3,12 @@
33use axum::http::HeaderMap;
44use axum::http::header::CONTENT_TYPE;
55use export::rest::{AppResponseData, NoData};
6use session::Session;
6use session_layer::Session;
77
88use crate::errors::ApiError;
99use crate::services::images::{SpaceImageDto, SpaceImageKindPath, SpaceImageUploadQuery};
1010use crate::services::service::SpaceService;
11use session::share::session::require_uid;
11use session_layer::share::session::require_uid;
1212
1313#[utoipa::path(
1414 put,
Modified lib/space/src/services/service.rs View lib/space/src/services/service.rs
@@ -4,8 +4,8 @@
44use config::AppConfig;
55use email::EmailService;
66use export::{AppDatabase, AppState, AppStorage};
7use session::SessionError;
8use session::share::guard::{SessionGuard, SessionWithUser};
7use session_layer::SessionError;
8use session_layer::share::guard::{SessionGuard, SessionWithUser};
99
1010use uuid::Uuid;
1111
@@ -67,6 +67,6 @@
6767 &self,
6868 token_hash: &str,
6969 ) -> Result<Option<SessionWithUser>, SessionError> {
70 session::lookup_session_with_user(self.db().read(), token_hash).await
70 session_layer::lookup_session_with_user(self.db().read(), token_hash).await
7171 }
7272}
Modified lib/space/src/share/guard.rs View lib/space/src/share/guard.rs
@@ -1,8 +1,8 @@
11use axum::extract::{Request, State};
22use axum::middleware::Next;
33use axum::response::Response;
4use session::Session;
5use session::share::guard::session_guard;
4use session_layer::Session;
5use session_layer::share::guard::session_guard;
66
77use crate::services::service::SpaceService;
88
Modified lib/space/Cargo.toml View lib/space/Cargo.toml
@@ -13,7 +13,7 @@
1313imaging = { workspace = true }
1414models = { workspace = true }
1515search = { workspace = true }
16session = { workspace = true }
16session-layer = { workspace = true }
1717storage = { workspace = true }
1818axum = { workspace = true }
1919sea-orm = { workspace = true }
Modified lib/user/src/handlers/add_email.rs View lib/user/src/handlers/add_email.rs
@@ -1,12 +1,12 @@
11use axum::Json;
22use axum::extract::State;
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::services::emails::{AddEmailCmd, AddEmailResp};
88use crate::services::service::UserService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/user/src/handlers/create_meme.rs View lib/user/src/handlers/create_meme.rs
@@ -1,12 +1,12 @@
11use axum::Json;
22use axum::extract::State;
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::services::profile::{MemeDto, UpsertMemeCmd};
88use crate::services::service::UserService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/user/src/handlers/delete_avatar.rs View lib/user/src/handlers/delete_avatar.rs
@@ -1,10 +1,10 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::service::UserService;
7use session::share::session::require_uid;
7use session_layer::share::session::require_uid;
88
99#[utoipa::path(
1010 delete,
Modified lib/user/src/handlers/delete_email.rs View lib/user/src/handlers/delete_email.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/user/src/handlers/delete_meme.rs View lib/user/src/handlers/delete_meme.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/user/src/handlers/delete_push_subscription.rs View lib/user/src/handlers/delete_push_subscription.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/user/src/handlers/get_avatar.rs View lib/user/src/handlers/get_avatar.rs
@@ -1,11 +1,11 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::avatar::AvatarDto;
77use crate::services::service::UserService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/user/src/handlers/get_profile_detail.rs View lib/user/src/handlers/get_profile_detail.rs
@@ -1,6 +1,6 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::{Session, SessionUser};
3use session_layer::{Session, SessionUser};
44use uuid::Uuid;
55
66use crate::errors::ApiError;
Modified lib/user/src/handlers/get_session.rs View lib/user/src/handlers/get_session.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
88use crate::services::sessions::SessionDto;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
@@ -26,7 +26,7 @@
2626 Path(session_id): Path<Uuid>,
2727) -> Result<AppResponseData<SessionDto>, ApiError> {
2828 let uid = require_uid(&session)?;
29 let token = session.get::<String>(&session::share::session::session_token_key(uid));
29 let token = session.get::<String>(&session_layer::share::session::session_token_key(uid));
3030 let dto = service
3131 .get_session(uid, session_id, token.as_deref())
3232 .await?;
Modified lib/user/src/handlers/get_user_avatar.rs View lib/user/src/handlers/get_user_avatar.rs
@@ -3,8 +3,8 @@
33use axum::response::Response;
44use imaging::layout::ImageVariant;
55use serde::Deserialize;
6use session::Session;
7use session::share::session::require_uid;
6use session_layer::Session;
7use session_layer::share::session::require_uid;
88use utoipa::{IntoParams, ToSchema};
99use uuid::Uuid;
1010
Modified lib/user/src/handlers/list_emails.rs View lib/user/src/handlers/list_emails.rs
@@ -1,11 +1,11 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::emails::EmailDto;
77use crate::services::service::UserService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/user/src/handlers/list_memes.rs View lib/user/src/handlers/list_memes.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::profile::{ListLimitQuery, MemeDto};
77use crate::services::service::UserService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/user/src/handlers/list_push_subscriptions.rs View lib/user/src/handlers/list_push_subscriptions.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::push_subscriptions::PushSubscriptionDto;
77use crate::services::service::UserService;
88use crate::share::page::PageQuery;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/user/src/handlers/list_saved_messages.rs View lib/user/src/handlers/list_saved_messages.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::notifications::SavedMessageDto;
77use crate::services::service::UserService;
88use crate::share::page::PageQuery;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/user/src/handlers/list_sessions.rs View lib/user/src/handlers/list_sessions.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::service::UserService;
77use crate::services::sessions::{ListSessionsQuery, SessionDto};
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
@@ -27,7 +27,7 @@
2727 Query(query): Query<ListSessionsQuery>,
2828) -> Result<AppResponseData<export::pagination::Page<SessionDto>>, ApiError> {
2929 let uid = require_uid(&session)?;
30 let token = session.get::<String>(&session::share::session::session_token_key(uid));
30 let token = session.get::<String>(&session_layer::share::session::session_token_key(uid));
3131 let sessions = service
3232 .list_sessions(uid, query.clone(), token.as_deref())
3333 .await?;
Modified lib/user/src/handlers/my_reports.rs View lib/user/src/handlers/my_reports.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::notifications::UserReportDto;
77use crate::services::service::UserService;
88use crate::share::page::PageQuery;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/user/src/handlers/my_spaces.rs View lib/user/src/handlers/my_spaces.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::profile::MySpaceDto;
77use crate::services::service::UserService;
88use crate::share::page::PageQuery;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/user/src/handlers/my_suspensions.rs View lib/user/src/handlers/my_suspensions.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::service::UserService;
77use crate::services::suspensions::{IncludeRevokedQuery, SuspensionDto};
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 get,
Modified lib/user/src/handlers/recent_mentions.rs View lib/user/src/handlers/recent_mentions.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::notifications::RecentMentionDto;
77use crate::services::profile::ListLimitQuery;
88use crate::services::service::UserService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 get,
Modified lib/user/src/handlers/revoke_all_sessions.rs View lib/user/src/handlers/revoke_all_sessions.rs
@@ -1,11 +1,11 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44
55use crate::errors::ApiError;
66use crate::services::service::UserService;
77use crate::services::sessions::CountResp;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/user/src/handlers/revoke_session.rs View lib/user/src/handlers/revoke_session.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/user/src/handlers/save_message.rs View lib/user/src/handlers/save_message.rs
@@ -1,12 +1,12 @@
11use axum::Json;
22use axum::extract::State;
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::services::notifications::{SaveMessageCmd, SavedMessageDto};
88use crate::services::service::UserService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/user/src/handlers/set_primary_email.rs View lib/user/src/handlers/set_primary_email.rs
@@ -1,12 +1,12 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::emails::EmailDto;
88use crate::services::service::UserService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 patch,
Modified lib/user/src/handlers/unsave_message.rs View lib/user/src/handlers/unsave_message.rs
@@ -1,11 +1,11 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use session::Session;
3use session_layer::Session;
44use uuid::Uuid;
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
8use session::share::session::require_uid;
8use session_layer::share::session::require_uid;
99
1010#[utoipa::path(
1111 delete,
Modified lib/user/src/handlers/update_meme.rs View lib/user/src/handlers/update_meme.rs
@@ -1,13 +1,13 @@
11use axum::Json;
22use axum::extract::{Path, State};
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
88use crate::services::profile::{MemeDto, UpsertMemeCmd};
99use crate::services::service::UserService;
10use session::share::session::require_uid;
10use session_layer::share::session::require_uid;
1111
1212#[utoipa::path(
1313 put,
Modified lib/user/src/handlers/upload_avatar.rs View lib/user/src/handlers/upload_avatar.rs
@@ -3,12 +3,12 @@
33use axum::http::HeaderMap;
44use axum::http::header::CONTENT_TYPE;
55use export::rest::{AppResponseData, NoData};
6use session::Session;
6use session_layer::Session;
77
88use crate::errors::ApiError;
99use crate::services::avatar::AvatarDto;
1010use crate::services::service::UserService;
11use session::share::session::require_uid;
11use session_layer::share::session::require_uid;
1212
1313#[utoipa::path(
1414 put,
Modified lib/user/src/handlers/upsert_push_subscription.rs View lib/user/src/handlers/upsert_push_subscription.rs
@@ -1,12 +1,12 @@
11use axum::Json;
22use axum::extract::State;
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::services::push_subscriptions::{PushSubscriptionDto, UpsertPushCmd};
88use crate::services::service::UserService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/user/src/handlers/verify_add_email.rs View lib/user/src/handlers/verify_add_email.rs
@@ -1,12 +1,12 @@
11use axum::Json;
22use axum::extract::State;
33use export::rest::{AppResponseData, NoData};
4use session::Session;
4use session_layer::Session;
55
66use crate::errors::ApiError;
77use crate::services::emails::{EmailDto, VerifyAddEmailCmd};
88use crate::services::service::UserService;
9use session::share::session::require_uid;
9use session_layer::share::session::require_uid;
1010
1111#[utoipa::path(
1212 post,
Modified lib/user/src/services/service.rs View lib/user/src/services/service.rs
@@ -3,8 +3,8 @@
33use async_trait::async_trait;
44use config::AppConfig;
55use export::{AppDatabase, AppState, AppStorage};
6use session::SessionError;
7use session::share::guard::{SessionGuard, SessionWithUser};
6use session_layer::SessionError;
7use session_layer::share::guard::{SessionGuard, SessionWithUser};
88use uuid::Uuid;
99
1010#[derive(Clone)]
@@ -42,6 +42,6 @@
4242 &self,
4343 token_hash: &str,
4444 ) -> Result<Option<SessionWithUser>, SessionError> {
45 session::lookup_session_with_user(self.db().read(), token_hash).await
45 session_layer::lookup_session_with_user(self.db().read(), token_hash).await
4646 }
4747}
Modified lib/user/src/share/guard.rs View lib/user/src/share/guard.rs
@@ -1,8 +1,8 @@
11use axum::extract::{Request, State};
22use axum::middleware::Next;
33use axum::response::Response;
4use session::Session;
5use session::share::guard::session_guard;
4use session_layer::Session;
5use session_layer::share::guard::session_guard;
66
77use crate::services::service::UserService;
88
Modified lib/user/Cargo.toml View lib/user/Cargo.toml
@@ -11,7 +11,7 @@
1111i18n = { workspace = true }
1212imaging = { workspace = true }
1313email = { workspace = true }
14session = { workspace = true }
14session-layer = { workspace = true }
1515storage = { workspace = true }
1616axum = { workspace = true }
1717sea-orm = { workspace = true }
Modified lib/webapi/src/lib.rs View lib/webapi/src/lib.rs
@@ -6,7 +6,7 @@
66use axum::Router;
77use export::AppState;
88use export::middleware::AppTraceLayer;
9use session::{SessionLayer, store};
9use session_layer::{SessionLayer, store};
1010use tower_http::limit::RequestBodyLimitLayer;
1111use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer};
1212use tracing::Level;
@@ -43,7 +43,7 @@
4343 ])
4444}
4545
46pub async fn router(state: AppState) -> Result<Router, axum_session::SessionError> {
46pub async fn router(state: AppState) -> Result<Router, session::SessionError> {
4747 let store = store::connect(state.redis.clone(), &state.config.session).await?;
4848
4949 let cors = build_cors_layer(&state.config.web);
Modified lib/webapi/src/search.rs View lib/webapi/src/search.rs
@@ -5,7 +5,7 @@
55use axum::{Json, Router};
66use export::rest::{AppResponseData, NoData};
77use serde::Deserialize;
8use session::{Session, SessionUser};
8use session_layer::{Session, SessionUser};
99use utoipa::{IntoParams, OpenApi, ToSchema};
1010use uuid::Uuid;
1111
Modified lib/webapi/Cargo.toml View lib/webapi/Cargo.toml
@@ -16,9 +16,9 @@
1616import = { workspace = true }
1717search = { workspace = true }
1818export = { workspace = true }
19session-layer = { workspace = true }
20axum = { workspace = true }
1921session = { workspace = true }
20axum = { workspace = true }
21axum_session = { workspace = true }
2222tower-http = { workspace = true }
2323tracing = { workspace = true }
2424utoipa = { workspace = true }
Modified Cargo.lock View Cargo.lock
@@ -31,7 +31,7 @@
3131 "sea-orm",
3232 "serde",
3333 "serde_json",
34 "session",
34 "session-layer",
3535 "storage",
3636 "time 0.3.55",
3737 "tokio",
@@ -54,7 +54,7 @@
5454 "axum",
5555 "config",
5656 "export",
57 "session",
57 "session-layer",
5858 "tokio",
5959 "tower-http 0.7.0",
6060 "tracing",
@@ -279,7 +279,7 @@
279279 "config",
280280 "export",
281281 "push",
282 "session",
282 "session-layer",
283283 "tokio",
284284 "tokio-util",
285285 "tracing",
@@ -717,7 +717,7 @@
717717 "sea-orm",
718718 "serde",
719719 "serde_json",
720 "session",
720 "session-layer",
721721 "sha1 0.11.0",
722722 "sha2 0.11.0",
723723 "space",
@@ -855,36 +855,6 @@
855855]
856856
857857[[package]]
858name = "axum_session"
859version = "0.21.0"
860dependencies = [
861 "aes-gcm 0.11.0",
862 "async-trait",
863 "axum",
864 "base64 0.23.1",
865 "bytes",
866 "chrono",
867 "cookie",
868 "dashmap",
869 "fastbloom-rs",
870 "forwarded-header-value",
871 "futures",
872 "hmac 0.13.0",
873 "http 1.5.0",
874 "http-body 1.1.0",
875 "rand 0.10.2",
876 "serde",
877 "serde_json",
878 "sha2 0.11.0",
879 "thiserror 2.0.20",
880 "tokio",
881 "tower-layer",
882 "tower-service",
883 "tracing",
884 "uuid",
885]
886
887[[package]]
888858name = "backon"
889859version = "1.6.0"
890860source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1297,7 +1267,7 @@
12971267 "search",
12981268 "serde",
12991269 "serde_json",
1300 "session",
1270 "session-layer",
13011271 "sha2 0.11.0",
13021272 "social",
13031273 "space",
@@ -1348,7 +1318,7 @@
13481318 "serde",
13491319 "serde_json",
13501320 "serde_yaml_ng",
1351 "session",
1321 "session-layer",
13521322 "sha2 0.11.0",
13531323 "space",
13541324 "storage",
@@ -3002,7 +2972,7 @@
30022972 "search",
30032973 "serde",
30042974 "serde_json",
3005 "session",
2975 "session-layer",
30062976 "sha2 0.11.0",
30072977 "space",
30082978 "ssh-key 0.6.7",
@@ -4715,7 +4685,7 @@
47154685 "sea-orm",
47164686 "serde",
47174687 "serde_json",
4718 "session",
4688 "session-layer",
47194689 "time 0.3.55",
47204690 "tokio",
47214691 "tokio-tungstenite",
@@ -4778,7 +4748,7 @@
47784748 "sea-orm",
47794749 "serde",
47804750 "serde_json",
4781 "session",
4751 "session-layer",
47824752 "thiserror 2.0.20",
47834753 "time 0.3.55",
47844754 "tokio",
@@ -4888,7 +4858,7 @@
48884858 "search",
48894859 "serde",
48904860 "serde_json",
4891 "session",
4861 "session-layer",
48924862 "space",
48934863 "time 0.3.55",
48944864 "tracing",
@@ -7143,7 +7113,7 @@
71437113 "search",
71447114 "serde",
71457115 "serde_json",
7146 "session",
7116 "session-layer",
71477117 "space",
71487118 "time 0.3.55",
71497119 "tracing",
@@ -8422,11 +8392,40 @@
84228392
84238393[[package]]
84248394name = "session"
8395version = "0.21.0"
8396dependencies = [
8397 "aes-gcm 0.11.0",
8398 "async-trait",
8399 "axum",
8400 "base64 0.23.1",
8401 "bytes",
8402 "chrono",
8403 "cookie",
8404 "dashmap",
8405 "fastbloom-rs",
8406 "forwarded-header-value",
8407 "futures",
8408 "hmac 0.13.0",
8409 "http 1.5.0",
8410 "http-body 1.1.0",
8411 "rand 0.10.2",
8412 "serde",
8413 "serde_json",
8414 "sha2 0.11.0",
8415 "thiserror 2.0.20",
8416 "tokio",
8417 "tower-layer",
8418 "tower-service",
8419 "tracing",
8420 "uuid",
8421]
8422
8423[[package]]
8424name = "session-layer"
84258425version = "1.0.0"
84268426dependencies = [
84278427 "async-trait",
84288428 "axum",
8429 "axum_session",
84308429 "base64 0.23.1",
84318430 "chrono",
84328431 "config",
@@ -8435,6 +8434,7 @@
84358434 "redis",
84368435 "sea-orm",
84378436 "serde",
8437 "session",
84388438 "time 0.3.55",
84398439 "tracing",
84408440 "uuid",
@@ -8714,7 +8714,7 @@
87148714 "search",
87158715 "serde",
87168716 "serde_json",
8717 "session",
8717 "session-layer",
87188718 "storage",
87198719 "time 0.3.55",
87208720 "tracing",
@@ -9992,7 +9992,7 @@
99929992 "sea-orm",
99939993 "serde",
99949994 "serde_json",
9995 "session",
9995 "session-layer",
99969996 "sha2 0.11.0",
99979997 "space",
99989998 "storage",
@@ -10293,7 +10293,6 @@
1029310293 "auth",
1029410294 "axum",
1029510295 "axum-otel-metrics",
10296 "axum_session",
1029710296 "chat",
1029810297 "ci",
1029910298 "config",
@@ -10308,6 +10307,7 @@
1030810307 "search",
1030910308 "serde",
1031010309 "session",
10310 "session-layer",
1031110311 "space",
1031210312 "tower-http 0.7.0",
1031310313 "tracing",
Modified Cargo.toml View Cargo.toml
@@ -30,7 +30,7 @@
3030models = { path = "lib/models" }
3131pow-solver = { path = "lib/pow-solver" }
3232push = { path = "lib/push" }
33session = { path = "lib/session" }
33session-layer = { path = "lib/session-layer" }
3434storage = { path = "lib/storage" }
3535user = { path = "lib/user" }
3636space = { path = "lib/space" }
@@ -51,7 +51,7 @@
5151serde = "1.0.229"
5252serde_json = "1.0.151"
5353axum = { version = "0.8.9", features = ["ws"] }
54axum_session = { path = "lib/axum-session", features = ["key-store"] }
54session = { path = "lib/session", features = ["key-store"] }
5555tower = "0.5.3"
5656tower-http = { version = "0.7.0", features = ["trace", "limit", "cors"] }
5757axum-otel-metrics = "0.14.1"