Start setting AVT cookie on /v1/session endpoint

This commit is contained in:
Brandon Thomas
2023-10-19 04:24:50 -04:00
parent d6a3d4887f
commit d5b28d2d3e
16 changed files with 51 additions and 17 deletions
@@ -13,6 +13,7 @@ const VISITOR_COOKIE_NAME : &str = "visitor";
/// Handle "anonymous visitor tracking" cookies.
/// This enables us to associate results with an anonymous user for a better experience,
/// as well as do some form of return visitor tracking.
#[derive(Clone)]
pub struct AvtCookieManager {
cookie_domain: String,
jwt_signer: JwtSigner,
@@ -1,2 +1,2 @@
pub mod session_cookie_manager;
pub mod session_cookie_payload;
pub mod anonymous_visitor_tracking;
pub mod session;
@@ -0,0 +1,2 @@
pub mod session_cookie_manager;
pub mod session_cookie_payload;
@@ -13,7 +13,7 @@ use log::warn;
use cookies::jwt_signer::JwtSigner;
use errors::AnyhowResult;
use crate::cookies::session_cookie_payload::SessionCookiePayload;
use crate::cookies::session::session_cookie_payload::SessionCookiePayload;
/**
* Cookie version history
@@ -136,7 +136,7 @@ impl SessionCookieManager {
#[cfg(test)]
mod tests {
use crate::cookies::session_cookie_manager::SessionCookieManager;
use crate::cookies::session::session_cookie_manager::SessionCookieManager;
#[test]
fn test_cookie_payload() {
@@ -29,6 +29,11 @@ pub fn add_suggested_api_v1_account_creation_and_session_routes<T, B> (app: App<
.route(web::post().to(create_account_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/v1/create_account")
.route(web::post().to(create_account_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/login")
.route(web::post().to(login_handler))
@@ -21,7 +21,7 @@ use mysql_queries::queries::users::user_sessions::create_user_session::create_us
use mysql_queries::tokens::Tokens;
use user_input_common::check_for_slurs::contains_slurs;
use crate::cookies::session_cookie_manager::SessionCookieManager;
use crate::cookies::session::session_cookie_manager::SessionCookieManager;
use crate::utils::email_to_gravatar::email_to_gravatar;
use crate::validations::is_reserved_username::is_reserved_username;
use crate::validations::validate_passwords::validate_passwords;
@@ -19,7 +19,7 @@ use mysql_queries::queries::users::user::lookup_user_for_login_by_email::lookup_
use mysql_queries::queries::users::user::lookup_user_for_login_by_username::lookup_user_for_login_by_username;
use mysql_queries::queries::users::user_sessions::create_user_session::create_user_session;
use crate::cookies::session_cookie_manager::SessionCookieManager;
use crate::cookies::session::session_cookie_manager::SessionCookieManager;
#[derive(Deserialize)]
pub struct LoginRequest {
@@ -14,7 +14,7 @@ use sqlx::MySqlPool;
use http_server_common::response::response_error_helpers::to_simple_json_error;
use mysql_queries::queries::users::user_sessions::delete_user_session::delete_user_session;
use crate::cookies::session_cookie_manager::SessionCookieManager;
use crate::cookies::session::session_cookie_manager::SessionCookieManager;
#[derive(Serialize)]
pub struct LogoutSuccessResponse {
@@ -13,6 +13,7 @@ use sqlx::MySqlPool;
use http_server_common::response::response_error_helpers::to_simple_json_error;
use crate::cookies::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use crate::utils::session_checker::SessionChecker;
#[derive(Serialize, Copy, Clone)]
@@ -109,6 +110,7 @@ pub async fn session_info_handler(
http_request: HttpRequest,
mysql_pool: web::Data<MySqlPool>,
session_checker: web::Data<SessionChecker>,
avt_manager: web::Data<AvtCookieManager>,
) -> Result<HttpResponse, SessionInfoError>
{
let mut mysql_connection = mysql_pool.acquire()
@@ -174,6 +176,18 @@ pub async fn session_info_handler(
}
}
let maybe_avt_cookie = match avt_manager.decode_cookie_payload_from_request(&http_request) {
Ok(Some(_avt_cookie)) => None,
_ => {
let cookie = avt_manager.make_new_cookie()
.map_err(|e| {
warn!("avt cookie creation error: {:?}", e);
SessionInfoError::ServerError
})?;
Some(cookie)
}
};
let response = SessionInfoSuccessResponse {
success: true,
logged_in,
@@ -183,7 +197,13 @@ pub async fn session_info_handler(
let body = serde_json::to_string(&response)
.map_err(|_e| SessionInfoError::ServerError)?;
Ok(HttpResponse::Ok()
let mut response_builder = HttpResponse::Ok();
if let Some(cookie) = maybe_avt_cookie {
response_builder.cookie(cookie);
}
Ok(response_builder
.content_type("application/json")
.body(body))
}
@@ -15,7 +15,7 @@ use mysql_queries::queries::users::user_subscriptions::list_active_user_subscrip
use redis_caching::redis_ttl_cache::{RedisTtlCache, RedisTtlCacheConnection};
use redis_common::redis_cache_keys::RedisCacheKeys;
use crate::cookies::session_cookie_manager::SessionCookieManager;
use crate::cookies::session::session_cookie_manager::SessionCookieManager;
use crate::utils::user_session_extended::{UserSessionExtended, UserSessionPreferences, UserSessionPremiumPlanInfo, UserSessionRoleAndPermissions, UserSessionSubscriptionPlan, UserSessionUserDetails};
#[derive(Clone)]
@@ -1 +0,0 @@
pub mod anonymous_visitor_tracking;
+10 -5
View File
@@ -64,7 +64,8 @@ use redis_caching::redis_ttl_cache::RedisTtlCache;
use reusable_types::server_environment::ServerEnvironment;
use twitch_common::twitch_secrets::TwitchSecrets;
use url_config::third_party_url_redirector::ThirdPartyUrlRedirector;
use users_component::cookies::session_cookie_manager::SessionCookieManager;
use users_component::cookies::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use users_component::cookies::session::session_cookie_manager::SessionCookieManager;
use users_component::utils::session_checker::SessionChecker;
use crate::billing::internal_product_to_stripe_lookup_impl::InternalProductToStripeLookupImpl;
@@ -240,9 +241,11 @@ async fn main() -> AnyhowResult<()> {
let website_homepage_redirect =
easyenv::get_env_string_or_default("WEBSITE_HOMEPAGE_REDIRECT", "https://vo.codes/");
let cookie_manager = SessionCookieManager::new(&cookie_domain, &hmac_secret);
let session_cookie_manager = SessionCookieManager::new(&cookie_domain, &hmac_secret);
let avt_cookie_manager = AvtCookieManager::new(&cookie_domain, &hmac_secret)?;
let session_checker = SessionChecker::new_with_cache(
&cookie_manager,
&session_cookie_manager,
redis_ttl_cache.clone(),
);
@@ -457,7 +460,8 @@ async fn main() -> AnyhowResult<()> {
},
firehose_publisher,
badge_granter,
cookie_manager,
avt_cookie_manager,
session_cookie_manager,
session_checker,
private_bucket_client,
public_bucket_client,
@@ -634,7 +638,8 @@ pub async fn serve(server_state: ServerState) -> AnyhowResult<()>
.app_data(web::Data::new(server_state_arc.redis_pool.clone()))
.app_data(web::Data::new(server_state_arc.redis_ttl_cache.clone()))
.app_data(web::Data::new(server_state_arc.session_checker.clone()))
.app_data(web::Data::new(server_state_arc.cookie_manager.clone()))
.app_data(web::Data::new(server_state_arc.avt_cookie_manager.clone()))
.app_data(web::Data::new(server_state_arc.session_cookie_manager.clone()))
.app_data(web::Data::new(server_state_arc.stripe.clone().config.clone()))
.app_data(web::Data::new(server_state_arc.stripe.clone().client.clone()))
.app_data(web::Data::new(server_state_arc.third_party_url_redirector.clone()))
@@ -15,7 +15,8 @@ use mysql_queries::queries::w2l::w2l_templates::list_w2l_templates::W2lTemplateR
use redis_caching::redis_ttl_cache::RedisTtlCache;
use reusable_types::server_environment::ServerEnvironment;
use url_config::third_party_url_redirector::ThirdPartyUrlRedirector;
use users_component::cookies::session_cookie_manager::SessionCookieManager;
use users_component::cookies::anonymous_visitor_tracking::avt_cookie_manager::AvtCookieManager;
use users_component::cookies::session::session_cookie_manager::SessionCookieManager;
use users_component::utils::session_checker::SessionChecker;
use crate::http_server::endpoints::categories::tts::list_fully_computed_assigned_tts_categories::list_fully_computed_assigned_tts_categories::ModelTokensByCategoryToken;
@@ -58,7 +59,8 @@ pub struct ServerState {
pub redis_rate_limiters: RedisRateLimiters,
pub cookie_manager: SessionCookieManager,
pub session_cookie_manager: SessionCookieManager,
pub avt_cookie_manager: AvtCookieManager,
pub session_checker: SessionChecker,