fix logout

The reason this is so labyrinthine is because of the users and billing
components. They bind dynamic behaviors that are defined in
storyteller-web (one of them being clearing the redis session cache).

Actually, the users component _didn't_, because it was defined in the
billing component. So I hoisted it out into a new component library.

In the fullness of time I imagine all of this will be consolidated back
under storyteller-web so we don't have to worry about binding actions at
a distance.

Anyway, this is tested and works locally.
This commit is contained in:
Brandon Thomas committed 2023-12-14 16:58:37 -05:00
1 parent a88d888c18
commit 60d4199216
17 files changed
+82 -16

No files matched your search

Generated
+13
View File
@@ -813,6 +813,7 @@ dependencies = [
"tokio",
"toml 0.5.11",
"url_config",
"user_traits_component",
]
[[package]]
@@ -5954,6 +5955,7 @@ dependencies = [
"twitch_oauth2",
"url_config",
"user_input_common",
"user_traits_component",
"users_component",
"utoipa",
"utoipa-swagger-ui",
@@ -7066,6 +7068,16 @@ dependencies = [
"unicode-segmentation",
]
[[package]]
name = "user_traits_component"
version = "0.0.1"
dependencies = [
"actix-web",
"errors",
"mockall",
"my-workspace-hack",
]
[[package]]
name = "users_component"
version = "0.0.1"
@@ -7109,6 +7121,7 @@ dependencies = [
"tokens",
"toml 0.5.11",
"user_input_common",
"user_traits_component",
]
[[package]]
+1
View File
@@ -83,6 +83,7 @@ members = [
# Service Plugins: complete subsystems that can be plugged into services (users, billing, etc.)
"crates/service/plugins/billing",
"crates/service/plugins/inference_workloads",
"crates/service/plugins/user_traits_component",
"crates/service/plugins/users",
# Vendored code
@@ -20,6 +20,7 @@ http_server_common = { path = "../../../lib/deprecated/http_server_common" }
mysql_queries = { path = "../../../lib/mysql_queries" }
reusable_types = { path = "../../../_types/reusable_types" }
url_config = { path = "../../../lib/url_config" }
user_traits_component = { path = "../user_traits_component" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
@@ -3,12 +3,12 @@ use actix_web::web::Json;
use reusable_types::server_environment::ServerEnvironment;
use url_config::third_party_url_redirector::ThirdPartyUrlRedirector;
use user_traits_component::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::stripe::http_endpoints::checkout::create::stripe_create_checkout_session_error::CreateCheckoutSessionError;
use crate::stripe::http_endpoints::checkout::create::stripe_create_checkout_session_shared::stripe_create_checkout_session_shared;
use crate::stripe::stripe_config::StripeConfig;
use crate::stripe::traits::internal_product_to_stripe_lookup::InternalProductToStripeLookup;
use crate::stripe::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::stripe::traits::internal_user_lookup::InternalUserLookup;
// =============== Request ===============
@@ -4,12 +4,12 @@ use actix_web::web::Query;
use reusable_types::server_environment::ServerEnvironment;
use url_config::third_party_url_redirector::ThirdPartyUrlRedirector;
use user_traits_component::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::stripe::http_endpoints::checkout::create::stripe_create_checkout_session_error::CreateCheckoutSessionError;
use crate::stripe::http_endpoints::checkout::create::stripe_create_checkout_session_shared::stripe_create_checkout_session_shared;
use crate::stripe::stripe_config::StripeConfig;
use crate::stripe::traits::internal_product_to_stripe_lookup::InternalProductToStripeLookup;
use crate::stripe::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::stripe::traits::internal_user_lookup::InternalUserLookup;
// =============== Request ===============
@@ -2,12 +2,12 @@ use actix_web::{HttpRequest, HttpResponse, web};
use actix_web::web::Json;
use url_config::third_party_url_redirector::ThirdPartyUrlRedirector;
use user_traits_component::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::stripe::http_endpoints::customer_portal::stripe_create_customer_portal_session_error::CreateCustomerPortalSessionError;
use crate::stripe::http_endpoints::customer_portal::stripe_create_customer_portal_session_shared::stripe_create_customer_portal_session_shared;
use crate::stripe::stripe_config::StripeConfig;
use crate::stripe::traits::internal_product_to_stripe_lookup::InternalProductToStripeLookup;
use crate::stripe::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::stripe::traits::internal_user_lookup::InternalUserLookup;
// =============== Request ===============
@@ -3,12 +3,12 @@ use actix_web::{HttpRequest, HttpResponse, web};
use actix_web::web::Query;
use url_config::third_party_url_redirector::ThirdPartyUrlRedirector;
use user_traits_component::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::stripe::http_endpoints::customer_portal::stripe_create_customer_portal_session_error::CreateCustomerPortalSessionError;
use crate::stripe::http_endpoints::customer_portal::stripe_create_customer_portal_session_shared::stripe_create_customer_portal_session_shared;
use crate::stripe::stripe_config::StripeConfig;
use crate::stripe::traits::internal_product_to_stripe_lookup::InternalProductToStripeLookup;
use crate::stripe::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::stripe::traits::internal_user_lookup::InternalUserLookup;
// =============== Request ===============
@@ -1,4 +1,3 @@
pub mod internal_product_to_stripe_lookup;
pub mod internal_session_cache_purge;
pub mod internal_subscription_product_lookup;
pub mod internal_user_lookup;
@@ -0,0 +1,27 @@
[package]
publish = false
name = "user_traits_component"
edition = "2018"
version = "0.0.1"
authors = [
"Brandon Thomas <bt@brand.io>",
"Brandon Thomas <echelon@gmail.com>",
]
[lib]
name = "user_traits_component"
path = "src/lib.rs"
[dependencies]
# Internal
errors = { path = "../../../lib/errors" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
# Web
actix-web = "4.4.0"
[dev-dependencies]
mockall = "0.11.3"
@@ -0,0 +1,21 @@
//! user_traits_component
//!
//! Expose some traits for other plugins / components.
//! This will probably go away once we start consolidating the plugins into the main service.
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
#![forbid(unreachable_patterns)]
#![forbid(unused_imports)]
#![forbid(unused_mut)]
#![forbid(unused_variables)]
// Always allow
#![allow(dead_code)]
#![allow(non_snake_case)]
pub mod traits;
@@ -0,0 +1 @@
pub mod internal_session_cache_purge;
+1
View File
@@ -30,6 +30,7 @@ reusable_types = { path = "../../../_types/reusable_types" }
server_environment = { path = "../../../lib/server_environment" }
tokens = { path = "../../../_types/tokens" }
user_input_common = { path = "../../../lib/user_input_common" }
user_traits_component = { path = "../user_traits_component" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
@@ -13,6 +13,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 user_traits_component::traits::internal_session_cache_purge::InternalSessionCachePurge;
use crate::cookies::session::session_cookie_manager::SessionCookieManager;
@@ -53,8 +54,12 @@ pub async fn logout_handler(
http_request: HttpRequest,
session_cookie_manager: web::Data<SessionCookieManager>,
mysql_pool: web::Data<MySqlPool>,
internal_session_cache_purge: web::Data<dyn InternalSessionCachePurge>,
) -> Result<HttpResponse, LogoutError>
{
// Best effort to delete Redis session cache
internal_session_cache_purge.best_effort_purge_session_cache(&http_request);
let mut delete_cookie = match http_request.cookie("session") {
Some(cookie) => {
match session_cookie_manager.decode_session_token(&cookie) {
@@ -52,6 +52,7 @@ user_input_common = { path = "../../../lib/user_input_common" }
# Internal Components
billing_component = { path = "../../plugins/billing" }
user_traits_component = { path = "../../plugins/user_traits_component" }
users_component = { path = "../../plugins/users" }
# Workspace hack (faster compile times)
@@ -1,8 +1,8 @@
use actix_web::HttpRequest;
use billing_component::stripe::traits::internal_session_cache_purge::InternalSessionCachePurge;
use redis_caching::redis_ttl_cache::RedisTtlCache;
use redis_common::redis_cache_keys::RedisCacheKeys;
use user_traits_component::traits::internal_session_cache_purge::InternalSessionCachePurge;
use users_component::utils::session_checker::SessionChecker;
pub struct InternalSessionCachePurgeImpl {
+6 -10
View File
@@ -20,15 +20,13 @@
use std::sync::Arc;
use std::time::Duration;
use actix_cors::Cors;
use actix_web::{App, HttpResponse, HttpServer, middleware, web};
use actix_web::{App, HttpServer, middleware, web};
use actix_web::middleware::{DefaultHeaders, Logger};
use anyhow::anyhow;
use elasticsearch::Elasticsearch;
use elasticsearch::http::transport::Transport;
use futures::Future;
use limitation::Limiter;
use log::{error, info};
use log::info;
use r2d2_redis::r2d2;
use r2d2_redis::redis::Commands;
use r2d2_redis::RedisConnectionManager;
@@ -48,7 +46,6 @@ use actix_helpers::middleware::disabled_endpoint_filter::disabled_endpoints::exa
use actix_helpers::middleware::disabled_endpoint_filter::disabled_endpoints::prefix_disabled_endpoints::PrefixDisabledEndpoints;
use billing_component::stripe::stripe_config::{FullUrlOrPath, StripeCheckoutConfigs, StripeConfig, StripeCustomerPortalConfigs, StripeSecrets};
use billing_component::stripe::traits::internal_product_to_stripe_lookup::InternalProductToStripeLookup;
use billing_component::stripe::traits::internal_session_cache_purge::InternalSessionCachePurge;
use billing_component::stripe::traits::internal_subscription_product_lookup::InternalSubscriptionProductLookup;
use billing_component::stripe::traits::internal_user_lookup::InternalUserLookup;
use bootstrap::bootstrap::{bootstrap, BootstrapArgs};
@@ -56,10 +53,9 @@ use cloud_storage::bucket_client::BucketClient;
use config::common_env::CommonEnv;
use config::shared_constants::DEFAULT_MYSQL_CONNECTION_STRING;
use config::shared_constants::DEFAULT_RUST_LOG;
use container_common::files::read_toml_file_to_struct::read_toml_file_to_struct;
use email_sender::smtp_email_sender::SmtpEmailSender;
use errors::AnyhowResult;
use http_server_common::cors::{build_cors_config, build_production_cors_config};
use http_server_common::cors::build_cors_config;
use memory_caching::single_item_ttl_cache::SingleItemTtlCache;
use mysql_queries::mediators::badge_granter::BadgeGranter;
use mysql_queries::mediators::firehose_publisher::FirehosePublisher;
@@ -67,6 +63,7 @@ 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 user_traits_component::traits::internal_session_cache_purge::InternalSessionCachePurge;
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;
@@ -76,12 +73,11 @@ use crate::billing::internal_session_cache_purge_impl::InternalSessionCachePurge
use crate::billing::stripe_internal_subscription_product_lookup_impl::StripeInternalSubscriptionProductLookupImpl;
use crate::billing::stripe_internal_user_lookup_impl::StripeInternalUserLookupImpl;
use crate::configs::app_startup::redis_rate_limiters::configure_redis_rate_limiters;
use crate::configs::static_api_tokens::{StaticApiTokenConfig, StaticApiTokens, StaticApiTokenSet};
use crate::configs::static_api_tokens::StaticApiTokenSet;
use crate::http_server::middleware::pushback_filter_middleware::PushbackFilter;
use crate::http_server::web_utils::redis_rate_limiter::RedisRateLimiter;
use crate::memory_cache::model_token_to_info_cache::ModelTokenToInfoCache;
use crate::routes::add_routes;
use crate::server_state::{DurableInMemoryCaches, EnvConfig, EphemeralInMemoryCaches, InMemoryCaches, RedisRateLimiters, ServerInfo, ServerState, StaticFeatureFlags, StripeSettings, TrollBans, TwitchOauth, TwitchOauthSecrets};
use crate::server_state::{DurableInMemoryCaches, EnvConfig, EphemeralInMemoryCaches, InMemoryCaches, ServerInfo, ServerState, StaticFeatureFlags, StripeSettings, TrollBans, TwitchOauth, TwitchOauthSecrets};
use crate::threads::db_health_checker_thread::db_health_check_status::HealthCheckStatus;
use crate::threads::db_health_checker_thread::db_health_checker_thread::db_health_checker_thread;
use crate::threads::poll_ip_banlist_thread::poll_ip_bans;