cleanup require_moderator

This commit is contained in:
Brandon Thomas committed 2026-06-13 04:45:26 -04:00
1 parent 9a6e613d91
commit e6b59a7a7e
34 files changed
+259 -159

No files matched your search

@@ -14,7 +14,7 @@ use mysql_queries::queries::users::user_profiles::get_user_profile_by_username::
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, RequireModeratorArgs};
use crate::state::server_state::ServerState;
const MAXIMUM_KEYS : u32 = 100;
@@ -60,7 +60,12 @@ pub async fn create_beta_keys_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<HttpResponse, CommonWebError>
{
let user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|err| match err {
RequireModeratorError::ServerError => CommonWebError::from_error(err),
@@ -14,7 +14,7 @@ use tokens::tokens::w2l_results::W2lResultToken;
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// For the URL PathInfo
@@ -58,7 +58,12 @@ pub async fn edit_beta_key_distributed_flag_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<HttpResponse, CommonWebError>
{
let user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|err| match err {
RequireModeratorError::ServerError => CommonWebError::from_error(err),
@@ -13,7 +13,7 @@ use tokens::tokens::beta_keys::BetaKeyToken;
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// For the URL PathInfo
@@ -57,7 +57,12 @@ pub async fn edit_beta_key_note_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<HttpResponse, CommonWebError>
{
let user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|err| match err {
RequireModeratorError::ServerError => CommonWebError::from_error(err),
@@ -23,7 +23,7 @@ use tokens::tokens::media_files::MediaFileToken;
use crate::http_server::endpoints::media_files::upload::upload_error::MediaFileUploadError;
use crate::http_server::endpoints::media_files::upload::upload_pmx::extract_and_upload_pmx_files::{extract_and_upload_pmx_files, PmxError};
use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// Form-multipart request fields.
@@ -115,7 +115,12 @@ pub async fn upload_pmx_media_file_handler(
// ==================== READ SESSION ==================== //
// NB: We require a moderator to upload PMX files.
let user_session = require_moderator(&http_request, &server_state, UseDatabase::FromPool(&mut mysql_connection))
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &mut *mysql_connection,
phantom: Default::default(),
})
.await
.map_err(|err| match err {
RequireModeratorError::ServerError => MediaFileUploadError::ServerError,
@@ -14,7 +14,7 @@ use mysql_queries::queries::staff_audit_logs::insert_staff_audit_log::{
use pager::notification::notification_details_builder::NotificationDetailsBuilder;
use pager::notification::notification_urgency::NotificationUrgency;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// Send a test alert via the pager system. Moderators only.
@@ -35,7 +35,12 @@ pub async fn moderation_send_alert_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModerationSendAlertResponse>, CommonWebError> {
let user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
@@ -16,7 +16,7 @@ use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -74,11 +74,12 @@ pub async fn moderation_list_debug_logs_for_token_handler(
query: web::Query<ListDebugLogsQueryParams>,
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListDebugLogsSuccessResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -25,7 +25,7 @@ use tokens::tokens::users::UserToken;
use crate::http_server::web_utils::serialize_as_json_error::serialize_as_json_error;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorError, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// For the URL PathInfo
@@ -60,7 +60,12 @@ pub async fn moderator_get_token_info_handler(
server_state: web::Data<Arc<ServerState>>
) -> Result<HttpResponse, CommonWebError> {
let user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|err| match err {
RequireModeratorError::ServerError => CommonWebError::from_error(err),
@@ -17,7 +17,7 @@ use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -92,11 +92,12 @@ pub async fn moderation_get_job_by_token_handler(
path: web::Path<GetJobByTokenPathInfo>,
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<GetJobByTokenSuccessResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -13,7 +13,7 @@ use mysql_queries::queries::generic_inference::web::list_user_jobs_for_moderatio
use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// List jobs for a user (moderation)
@@ -36,7 +36,12 @@ pub async fn list_user_jobs_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListUserJobsResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -14,7 +14,7 @@ use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -76,11 +76,12 @@ pub async fn moderator_list_staff_audit_logs_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListStaffAuditLogsSuccessResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -15,7 +15,7 @@ use mysql_queries::queries::users::user::list::list_subscribing_users_by_signup_
};
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// List subscribing users by signup date (descending), for moderators.
@@ -36,7 +36,12 @@ pub async fn moderator_list_subscribing_users_by_signup_date_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorListSubscribingUsersBySignupDateResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -15,7 +15,7 @@ use mysql_queries::queries::users::user::list::list_users_by_signup_date_for_mod
};
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// List users by signup date (descending), for moderators.
@@ -36,7 +36,12 @@ pub async fn moderator_list_users_by_signup_date_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorListUsersBySignupDateResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -12,7 +12,7 @@ use artcraft_api_defs::moderation::user::user_lookup_by_stripe_customer_id::{
use mysql_queries::queries::users::user_subscriptions::lookup_users_by_stripe_customer_id::lookup_users_by_stripe_customer_id;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// Moderator User Lookup by Stripe Customer ID
@@ -33,7 +33,12 @@ pub async fn moderator_user_lookup_by_stripe_customer_id_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorUserLookupByStripeCustomerIdResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -17,7 +17,7 @@ use mysql_queries::queries::users::user::get::lookup_user_for_moderation::{
use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
const LEGACY_USER_TOKEN_PREFIX: &str = "U:";
@@ -40,7 +40,12 @@ pub async fn moderator_user_lookup_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorUserLookupSuccessResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -19,7 +19,7 @@ use mysql_queries::queries::users::user_profiles::get_user_profile_by_username::
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -61,11 +61,12 @@ pub async fn moderation_ban_user_handler(
) -> Result<Json<ModerationBanUserSuccessResponse>, CommonWebError> {
// 1. Require moderator with ban permissions.
let user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -25,7 +25,7 @@ use users::email::validate_email_address_format::validate_email_address_format;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -71,11 +71,12 @@ pub async fn moderator_change_user_email_handler(
) -> Result<Json<ModeratorChangeUserEmailSuccessResponse>, CommonWebError> {
// 1. Require moderator.
let user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -16,7 +16,7 @@ use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -103,11 +103,12 @@ pub async fn moderator_list_email_address_changes_for_user_handler(
) -> Result<Json<ModeratorListUserEmailChangesSuccessResponse>, CommonWebError> {
// 1. Require moderator.
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -28,7 +28,7 @@ use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
use crate::http_server::web_utils::response_success_helpers::simple_json_success;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
use artcraft_api_defs::common::responses::simple_generic_json_success::SimpleGenericJsonSuccess;
@@ -89,11 +89,12 @@ pub async fn moderator_edit_user_feature_flags_handler(
redis_pool: Data<r2d2::Pool<Client>>,
) -> Result<HttpResponse, CommonWebError> {
let user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -9,7 +9,7 @@ use enums::by_table::users::user_feature_flag::UserFeatureFlag;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -49,11 +49,12 @@ pub async fn moderator_list_all_available_user_feature_flags_handler(
http_request: HttpRequest,
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorListUserFeatureFlagsResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -13,7 +13,7 @@ use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::session::lookup::user_session_feature_flags::UserSessionFeatureFlags;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -56,11 +56,12 @@ pub async fn moderator_list_user_feature_flags_handler(
path: Path<ListUserFeatureFlagsPathInfo>,
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorListUserFeatureFlagsResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -14,7 +14,7 @@ use mysql_queries::queries::user_referrals::list_global_user_referrals::{
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -42,11 +42,12 @@ pub async fn moderator_list_global_user_referrals_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListGlobalUserReferralsSuccessResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -17,7 +17,7 @@ use mysql_queries::queries::user_referrals::list_user_referrals_for_user::{
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -47,11 +47,12 @@ pub async fn moderator_list_user_referrals_for_user_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListUserReferralsForUserSuccessResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -13,7 +13,7 @@ use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -81,11 +81,12 @@ pub async fn moderator_list_user_session_impersonation_requests_for_user_handler
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListUserImpersonationRequestsSuccessResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -13,7 +13,7 @@ use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -75,11 +75,12 @@ pub async fn moderator_list_user_session_impersonation_requests_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListAllImpersonationRequestsSuccessResponse>, CommonWebError> {
let _user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -26,7 +26,7 @@ use mysql_queries::queries::users::user::get::lookup_user_for_moderation::{
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{
require_moderator, UseDatabase,
require_moderator, RequireModeratorArgs,
};
use crate::state::server_state::ServerState;
@@ -71,11 +71,12 @@ pub async fn moderator_user_session_impersonation_request_handler(
) -> Result<Json<ModerationImpersonateSuccessResponse>, CommonWebError> {
// 1. Require moderator session.
let user_session = require_moderator(
&http_request,
&server_state,
UseDatabase::GrabNewConnection,
).await.map_err(|err| {
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
}).await.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
CommonWebError::NotAuthorized
})?;
@@ -16,7 +16,7 @@ use mysql_queries::queries::users::user_subscriptions::list_stripe_customer_ids_
use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// Get all stripe customer ids on file for a user (moderation)
@@ -43,11 +43,12 @@ pub async fn moderator_get_user_stripe_customer_ids_handler(
.acquire()
.await?;
let _moderator_session = require_moderator(
&http_request,
&server_state,
UseDatabase::FromPool(&mut mysql_connection),
)
let _moderator_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &mut *mysql_connection,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -13,7 +13,7 @@ use mysql_queries::queries::wallet_ledger_entries::list_wallet_ledger_entries_by
use tokens::tokens::wallets::WalletToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// List wallet ledger entries by wallet token (moderation)
@@ -36,7 +36,12 @@ pub async fn list_wallet_ledger_entries_by_wallet_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListWalletLedgerEntriesByWalletResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -13,7 +13,7 @@ use mysql_queries::queries::wallet_ledger_entries::get_wallet_ledger_entry_for_m
use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// Get a single wallet ledger entry by token (moderation)
@@ -36,7 +36,12 @@ pub async fn moderator_get_wallet_ledger_entry_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorGetWalletLedgerEntryResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -13,7 +13,7 @@ use mysql_queries::queries::wallets::list_user_wallets_for_moderation::list_user
use tokens::tokens::users::UserToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// List wallets for a user (moderation)
@@ -36,7 +36,12 @@ pub async fn list_user_wallets_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ListUserWalletsResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -21,7 +21,7 @@ use mysql_queries::queries::wallets::add_durable_banked_balance_to_wallet::add_d
use tokens::tokens::wallets::WalletToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// Add banked credits to a wallet (moderation)
@@ -46,7 +46,12 @@ pub async fn moderator_add_banked_balance_to_wallet_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorAddBankedBalanceToWalletResponse>, CommonWebError> {
let user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|err| {
warn!("Moderator check failed: {:?}", err);
@@ -15,7 +15,7 @@ use mysql_queries::queries::wallets::create_new_wallet_for_owner_user::create_ne
use mysql_queries::queries::wallets::find_primary_wallet_token_for_owner::find_primary_wallet_token_for_owner_using_connection;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// Create a wallet for a user (moderation)
@@ -37,7 +37,12 @@ pub async fn moderator_create_wallet_for_user_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorCreateWalletForUserResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -13,7 +13,7 @@ use mysql_queries::queries::wallets::get_wallet_for_moderation::get_wallet_for_m
use tokens::tokens::wallets::WalletToken;
use crate::http_server::common_responses::common_web_error::CommonWebError;
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, RequireModeratorArgs};
use crate::state::server_state::ServerState;
/// Get a single wallet by token (moderation)
@@ -36,7 +36,12 @@ pub async fn moderator_get_wallet_handler(
server_state: web::Data<Arc<ServerState>>,
) -> Result<Json<ModeratorGetWalletResponse>, CommonWebError> {
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
let _user_session = require_moderator(RequireModeratorArgs {
http_request: &http_request,
server_state: &server_state,
mysql_executor: &server_state.mysql_pool,
phantom: Default::default(),
})
.await
.map_err(|_| CommonWebError::NotAuthorized)?;
@@ -140,6 +140,17 @@ impl SessionChecker {
}
pub async fn maybe_get_user_session_from_executor<'e, 'c : 'e, E>(
&self,
request: &HttpRequest,
mysql_executor: E,
) -> Result<Option<SessionUserRecord>, SessionCheckerError>
where E: 'e + Executor<'c, Database = MySql>
{
self.do_user_session_lookup_and_cookie_decode(request, mysql_executor).await
}
async fn do_user_session_lookup_and_cookie_decode<'e, 'c : 'e, E>(
&self,
request: &HttpRequest,
@@ -1,15 +1,30 @@
use std::error::Error;
use std::fmt::{Display, Formatter};
use std::marker::PhantomData;
use actix_web::HttpRequest;
use log::warn;
use sqlx::pool::PoolConnection;
use sqlx::MySql;
use sqlx::{Executor, MySql};
use mysql_queries::queries::users::user_sessions::get_user_session_by_token::SessionUserRecord;
use crate::state::server_state::ServerState;
pub struct RequireModeratorArgs<'e, 'c, E>
where E: 'e + Executor<'c, Database = MySql>
{
pub http_request: &'e HttpRequest,
pub server_state: &'e ServerState,
/// The executor to run the session lookup against. Pass `&server_state.mysql_pool` to
/// grab a fresh connection, or an in-flight connection (`&mut *connection`) to reuse one
/// the handler already holds.
pub mysql_executor: E,
// NB: phantom can be passed as `Default::default()`.
pub phantom: PhantomData<&'c E>,
}
#[derive(Debug)]
pub enum RequireModeratorError {
ServerError,
@@ -27,40 +42,14 @@ impl Display for RequireModeratorError {
impl Error for RequireModeratorError {}
pub enum UseDatabase<'a> {
GrabNewConnection,
FromPool(&'a mut PoolConnection<MySql>),
}
pub async fn require_moderator(
http_request: &HttpRequest,
server_state: &ServerState,
database: UseDatabase<'_>,
) -> Result<SessionUserRecord, RequireModeratorError> {
// NB: Save a reference to a connection we open in a branch until the function ends.
let mut saved_connection = None;
let mysql_connection = match database {
UseDatabase::GrabNewConnection => {
let mut connection = server_state.mysql_pool
.acquire()
.await
.map_err(|err| {
warn!("MySql pool error: {:?}", err);
RequireModeratorError::ServerError
})?;
saved_connection = Some(connection);
// NB: We just saved it, so it shouldn't error. Safer than unwrap/expect.
saved_connection.as_mut().ok_or(RequireModeratorError::ServerError)?
},
UseDatabase::FromPool(pool) => pool,
};
let maybe_user_session = server_state
pub async fn require_moderator<'e, 'c : 'e, E>(
args: RequireModeratorArgs<'e, 'c, E>,
) -> Result<SessionUserRecord, RequireModeratorError>
where E: 'e + Executor<'c, Database = MySql>
{
let maybe_user_session = args.server_state
.session_checker
.maybe_get_user_session_from_connection(&http_request, mysql_connection)
.maybe_get_user_session_from_executor(args.http_request, args.mysql_executor)
.await
.map_err(|e| {
warn!("Session checker error: {:?}", e);