move avt cookie code

This commit is contained in:
Brandon Thomas committed 2026-04-06 21:23:00 -04:00
1 parent a0e50067bb
commit efae7b5ade
13 files changed
+63 -24

No files matched your search

@@ -0,0 +1,34 @@
use std::error::Error;
use std::fmt::{Display, Formatter};
use jwt_signer::jwt_signer_error::JwtSignerError;
#[derive(Debug)]
pub enum AvtCookieError {
/// AVT cookie payload is missing a required field.
MissingField(&'static str),
/// Generic decode error (e.g. invalid integer for cookie_version).
DecodeError(String),
/// Error encoding, decoding, or constructing the JWT signer.
JwtSigner(JwtSignerError),
}
impl Display for AvtCookieError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::MissingField(field) => write!(f, "AVT cookie missing field: {}", field),
Self::DecodeError(reason) => write!(f, "AVT cookie decode error: {}", reason),
Self::JwtSigner(e) => write!(f, "JWT signer error: {}", e),
}
}
}
impl Error for AvtCookieError {}
impl From<JwtSignerError> for AvtCookieError {
fn from(err: JwtSignerError) -> Self {
Self::JwtSigner(err)
}
}
@@ -1,13 +1,11 @@
use actix_web::cookie::time::OffsetDateTime;
use actix_web::cookie::{Cookie, SameSite};
use actix_web::HttpRequest;
use anyhow::anyhow;
use log::warn;
use crate::error::internal_error::InternalError;
use crate::http_server::cookies::anonymous_visitor_tracking::avt_cookie_payload::AvtCookiePayload;
use crate::anonymous_visitor_tracking::avt_cookie_error::AvtCookieError;
use crate::anonymous_visitor_tracking::avt_cookie_payload::AvtCookiePayload;
use jwt_signer::jwt_signer::JwtSigner;
use errors::AnyhowResult;
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
const VISITOR_COOKIE_NAME : &str = "visitor";
@@ -23,19 +21,19 @@ pub struct AvtCookieManager {
impl AvtCookieManager {
pub fn new(cookie_domain: &str, hmac_secret: &str) -> AnyhowResult<Self> {
pub fn new(cookie_domain: &str, hmac_secret: &str) -> Result<Self, AvtCookieError> {
Ok(Self {
cookie_domain: cookie_domain.to_string(),
jwt_signer: JwtSigner::new(hmac_secret)?,
})
}
pub fn make_new_cookie(&self) -> AnyhowResult<Cookie> {
pub fn make_new_cookie(&self) -> Result<Cookie, AvtCookieError> {
let token = AnonymousVisitorTrackingToken::generate();
self.make_new_cookie_with_apriori_token(&token)
}
pub fn make_new_cookie_with_apriori_token(&self, token: &AnonymousVisitorTrackingToken) -> AnyhowResult<Cookie> {
pub fn make_new_cookie_with_apriori_token(&self, token: &AnonymousVisitorTrackingToken) -> Result<Cookie, AvtCookieError> {
let payload = AvtCookiePayload::from_token(token.clone());
let claims = payload.to_map();
let jwt_string = self.jwt_signer.claims_to_jwt(&claims)?;
@@ -68,14 +66,14 @@ impl AvtCookieManager {
cookie
}
pub fn decode_cookie_payload(&self, visitor_cookie: &Cookie) -> AnyhowResult<AvtCookiePayload> {
pub fn decode_cookie_payload(&self, visitor_cookie: &Cookie) -> Result<AvtCookiePayload, AvtCookieError> {
let cookie_contents = visitor_cookie.value().to_string();
let claims = self.jwt_signer.jwt_to_claims(&cookie_contents)?;
let payload = AvtCookiePayload::from_map(claims)?;
Ok(payload)
}
pub fn decode_cookie_payload_from_request(&self, request: &HttpRequest) -> Result<Option<AvtCookiePayload>, InternalError> {
pub fn decode_cookie_payload_from_request(&self, request: &HttpRequest) -> Result<Option<AvtCookiePayload>, AvtCookieError> {
let cookie = match request.cookie(VISITOR_COOKIE_NAME) {
None => return Ok(None),
Some(cookie) => cookie,
@@ -84,7 +82,7 @@ impl AvtCookieManager {
match self.decode_cookie_payload(&cookie) {
Err(e) => {
warn!("Visitor cookie decode error: {:?}", e);
Err(InternalError::VisitorCookieError(e.to_string()))
Err(e)
},
Ok(payload) => Ok(Some(payload)),
}
@@ -1,7 +1,7 @@
use std::collections::BTreeMap;
use std::str::FromStr;
use crate::error::internal_error::InternalError;
use crate::anonymous_visitor_tracking::avt_cookie_error::AvtCookieError;
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
/**
@@ -43,18 +43,18 @@ impl AvtCookiePayload {
}
}
pub fn from_map(map: BTreeMap<String, String>) -> Result<Self, InternalError> {
pub fn from_map(map: BTreeMap<String, String>) -> Result<Self, AvtCookieError> {
let avt_token = map.get("avt_token")
.ok_or_else(|| InternalError::VisitorCookieMissingField("avt_token"))?;
.ok_or(AvtCookieError::MissingField("avt_token"))?;
let cookie_version = map
.get("cookie_version")
.ok_or_else(|| InternalError::VisitorCookieMissingField("cookie_version"))?;
.ok_or(AvtCookieError::MissingField("cookie_version"))?;
let avt_token = AnonymousVisitorTrackingToken::new_from_str(avt_token);
let cookie_version = u32::from_str(cookie_version)
.map_err(|e| InternalError::VisitorCookieError(
.map_err(|e| AvtCookieError::DecodeError(
format!("invalid integer for cookie_version: {:?}, version: {}", e, cookie_version)))?;
Ok(AvtCookiePayload {
@@ -75,7 +75,7 @@ impl AvtCookiePayload {
mod tests {
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
use crate::http_server::cookies::anonymous_visitor_tracking::avt_cookie_payload::AvtCookiePayload;
use crate::anonymous_visitor_tracking::avt_cookie_payload::AvtCookiePayload;
#[test]
fn test_new() {
@@ -0,0 +1,3 @@
pub mod avt_cookie_error;
pub mod avt_cookie_manager;
pub mod avt_cookie_payload;
+1
View File
@@ -17,5 +17,6 @@
#![allow(dead_code)]
#![allow(non_snake_case)]
pub mod anonymous_visitor_tracking;
pub mod requests;
pub mod sessions;
@@ -204,6 +204,13 @@ impl From<HttpUserSessionPayloadError> for AdvancedCommonWebError {
}
}
impl From<actix_artcraft::anonymous_visitor_tracking::avt_cookie_error::AvtCookieError> for AdvancedCommonWebError {
fn from(err: actix_artcraft::anonymous_visitor_tracking::avt_cookie_error::AvtCookieError) -> Self {
// AVT cookie errors are non-critical: log and treat as a server error.
Self::from_error(err)
}
}
impl From<SessionCheckerError> for AdvancedCommonWebError {
fn from(value: SessionCheckerError) -> Self {
match value {
@@ -1,2 +0,0 @@
pub mod avt_cookie_manager;
pub mod avt_cookie_payload;
@@ -1 +0,0 @@
pub mod anonymous_visitor_tracking;
@@ -1,4 +1,4 @@
use crate::http_server::cookies::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use actix_artcraft::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use crate::http_server::endpoints::app_state::components::get_permissions::{get_permissions, AppStatePermissions};
use crate::http_server::endpoints::app_state::components::get_premium_info::{get_premium_info, AppStatePremiumInfo};
use crate::http_server::endpoints::app_state::components::get_server_info::{get_server_info, AppStateServerInfo};
@@ -12,7 +12,7 @@ use enums::by_table::users::user_feature_flag::UserFeatureFlag;
use crate::http_server::common_responses::advanced_common_web_error::AdvancedCommonWebError;
use crate::http_server::common_responses::user_details_lite_builder::UserDetailsLightBuilder;
use crate::http_server::cookies::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use actix_artcraft::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use crate::http_server::session::lookup::user_session_feature_flags::UserSessionFeatureFlags;
use crate::http_server::session::session_checker::SessionChecker;
@@ -1,7 +1,6 @@
pub mod common_requests;
pub mod common_responses;
pub mod endpoint_helpers;
pub mod cookies;
pub mod deprecated_endpoints;
pub mod endpoints;
pub mod middleware;
@@ -71,7 +71,7 @@ use crate::billing::stripe_internal_user_lookup_impl::StripeInternalUserLookupIm
use crate::configs::app_startup::redis_rate_limiters::configure_redis_rate_limiters;
use crate::configs::connect_to_database::connect_to_database;
use crate::configs::static_api_tokens::StaticApiTokenSet;
use crate::http_server::cookies::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use actix_artcraft::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use crate::http_server::middleware::error_alerting_middleware::error_alerting_middleware::ErrorAlertingMiddleware;
use crate::http_server::middleware::pushback_filter_middleware::PushbackFilter;
use crate::http_server::routes::add_routes::add_routes;
@@ -25,7 +25,7 @@ use url_config::third_party_url_redirector::ThirdPartyUrlRedirector;
use crate::configs::app_startup::username_set::UsernameSet;
use crate::configs::static_api_tokens::StaticApiTokenSet;
use crate::http_server::cookies::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use actix_artcraft::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use crate::http_server::deprecated_endpoints::categories::tts::list_fully_computed_assigned_tts_categories::list_fully_computed_assigned_tts_categories::ModelTokensByCategoryToken;
use crate::http_server::deprecated_endpoints::leaderboard::get_leaderboard::LeaderboardInfo;
use crate::http_server::endpoints::media_files::list::list_featured_media_files_handler::ListFeaturedMediaFilesQueryParams;