diff --git a/rc_chat_room/src/operations/mod.rs b/rc_chat_room/src/operations/mod.rs index b61f223..9e0216a 100644 --- a/rc_chat_room/src/operations/mod.rs +++ b/rc_chat_room/src/operations/mod.rs @@ -14,7 +14,7 @@ use polariton_server::operations::OperationsHandler; pub fn handler(chat_system: crate::state::chat::ChatImpl, conf: &oj_rc_core::persist::config::ConfigImpl) -> OperationsHandler { OperationsHandler::new() - .modify(oj_rc_core::polariton::RcOpModifier) + .modify(>::polariton_operation_modifier(conf)) .add(more_auth::MoreLobbyAuth::new()) .add(chat_ignores::ignores_provider()) .add(pending_sanctions::pending_sanctions_checker()) diff --git a/rc_core/src/lib.rs b/rc_core/src/lib.rs index 2e63335..940f55a 100644 --- a/rc_core/src/lib.rs +++ b/rc_core/src/lib.rs @@ -9,6 +9,7 @@ pub use persist::user::{UserImpl, UserProvider, UserAuthenticator}; pub use persist::config::{ConfigImpl, ConfigProvider}; pub mod polariton; +pub use polariton::OpModImpl; pub mod factory; diff --git a/rc_core/src/persist/config/cubes_json.rs b/rc_core/src/persist/config/cubes_json.rs index be727b4..0637025 100644 --- a/rc_core/src/persist/config/cubes_json.rs +++ b/rc_core/src/persist/config/cubes_json.rs @@ -637,4 +637,8 @@ impl super::ConfigProvider for CubeConfig { defederated: self.federation.defederated.clone(), }) } + + fn polariton_operation_modifier(&self) -> crate::OpModImpl { + crate::OpModImpl::new(self.settings.polariton.clone()) + } } diff --git a/rc_core/src/persist/config/traits.rs b/rc_core/src/persist/config/traits.rs index c466133..55071be 100644 --- a/rc_core/src/persist/config/traits.rs +++ b/rc_core/src/persist/config/traits.rs @@ -48,6 +48,7 @@ pub trait ConfigProvider { fn redacted_json(&self) -> String; /// None when federation is not enabled fn federation(&self) -> Option; + fn polariton_operation_modifier(&self) -> crate::OpModImpl; } pub struct DevMessageProvider { diff --git a/rc_core/src/persist/mod.rs b/rc_core/src/persist/mod.rs index f4fd348..887cf6c 100644 --- a/rc_core/src/persist/mod.rs +++ b/rc_core/src/persist/mod.rs @@ -28,6 +28,7 @@ pub use client_config::{GameplaySettings, PlatformSettings}; mod settings; pub use settings::{Settings, QueueMode}; +pub(crate) use settings::PolaritonSettings; mod chat; pub use chat::{ChatConfig, ChatCommand, ChatOperation, BuiltInChatOperation, IntercomChatOperation, ChatPermission, SystemChatOperation}; diff --git a/rc_core/src/persist/settings.rs b/rc_core/src/persist/settings.rs index 991dad5..c4dcb0f 100644 --- a/rc_core/src/persist/settings.rs +++ b/rc_core/src/persist/settings.rs @@ -10,6 +10,10 @@ pub struct Settings { pub garage_upgrades: Vec, #[serde(default = "default_server_conf")] pub server: ServerSettings, + #[serde(default = "default_pun_conf", alias = "photon")] + pub polariton: PolaritonSettings, + #[serde(default = "default_lnl_conf", alias = "lnl")] + pub lrl: LiteRustLibSettings, } impl super::config::SelfValidator for Settings { @@ -27,6 +31,8 @@ impl super::config::RedactedClone for Settings { banners: self.banners.clone(), garage_upgrades: self.garage_upgrades.clone(), server: self.server.redacted_clone(), + polariton: self.polariton.clone(), + lrl: self.lrl.clone(), } } } @@ -214,3 +220,29 @@ fn default_game_version() -> u32 { fn default_true() -> bool { true } + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct PolaritonSettings { + #[serde(default = "default_true")] + pub force_encrypt_responses: bool, + #[serde(default = "default_true")] + pub add_unique_response_param: bool, +} + +fn default_pun_conf() -> PolaritonSettings { + PolaritonSettings { + force_encrypt_responses: true, + add_unique_response_param: true, + } +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct LiteRustLibSettings { + +} + +fn default_lnl_conf() -> LiteRustLibSettings { + LiteRustLibSettings { + + } +} diff --git a/rc_core/src/polariton/mod.rs b/rc_core/src/polariton/mod.rs index d2f435c..aec2d6d 100644 --- a/rc_core/src/polariton/mod.rs +++ b/rc_core/src/polariton/mod.rs @@ -1,2 +1,2 @@ mod op_mod; -pub use op_mod::RcOpModifier; +pub use op_mod::{OpModImpl, RcOpModifier}; diff --git a/rc_core/src/polariton/op_mod.rs b/rc_core/src/polariton/op_mod.rs index 510a32c..de30e38 100644 --- a/rc_core/src/polariton/op_mod.rs +++ b/rc_core/src/polariton/op_mod.rs @@ -1,9 +1,26 @@ use polariton_server::operations::OperationModifier; -pub struct RcOpModifier; +pub type OpModImpl = RcOpModifier; + +pub struct RcOpModifier { + settings: crate::persist::PolaritonSettings, + unique_param_value: std::sync::atomic::AtomicI64, +} impl RcOpModifier { const SERVICE_MAPPING_KEY: u8 = 0; + const SAFE_UNIQUE_RESPONSE_PARAM: u8 = 255; + + pub(crate) fn new(settings: crate::persist::PolaritonSettings) -> Self { + let now = chrono::Utc::now(); + Self { + settings, + unique_param_value: std::sync::atomic::AtomicI64::new( + now.timestamp_nanos_opt() + .unwrap_or(now.timestamp_millis()) + ), + } + } } impl OperationModifier for RcOpModifier { @@ -13,6 +30,16 @@ impl OperationModifier for RcOpModifier { resp.params.insert(Self::SERVICE_MAPPING_KEY, svelto_service_id.to_owned()); } } - *flags |= 0x80; + if self.settings.force_encrypt_responses { + *flags |= 0x80; + } + if self.settings.add_unique_response_param { + #[cfg(debug_assertions)] + if resp.params.get(&Self::SAFE_UNIQUE_RESPONSE_PARAM).is_some() { + log::warn!("Smashed param {} of polariton response {}", Self::SAFE_UNIQUE_RESPONSE_PARAM, resp.code); + } + let new_val = self.unique_param_value.fetch_add(1, std::sync::atomic::Ordering::SeqCst); + resp.params.insert(Self::SAFE_UNIQUE_RESPONSE_PARAM, polariton::operation::Typed::Long(new_val)); + } } } diff --git a/rc_lobby_room/src/operations/mod.rs b/rc_lobby_room/src/operations/mod.rs index a7b839f..0dbf20f 100644 --- a/rc_lobby_room/src/operations/mod.rs +++ b/rc_lobby_room/src/operations/mod.rs @@ -7,7 +7,7 @@ use polariton_server::operations::OperationsHandler; pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler { OperationsHandler::::new() - .modify(oj_rc_core::polariton::RcOpModifier) + .modify(>::polariton_operation_modifier(&init_ctx.config)) .add(more_auth::MoreLobbyAuth) //.add(eac::EacChallengeIgnorer) .add(polariton_server::operations::Ack::<2, _>::default()) diff --git a/rc_services_room/src/operations/mod.rs b/rc_services_room/src/operations/mod.rs index d451dce..c489ee3 100644 --- a/rc_services_room/src/operations/mod.rs +++ b/rc_services_room/src/operations/mod.rs @@ -122,7 +122,7 @@ use polariton_server::operations::OperationsHandler; pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler { OperationsHandler::new() - .modify(oj_rc_core::polariton::RcOpModifier) + .modify(>::polariton_operation_modifier(&init_ctx.cubes)) .add(eac::EacChallengeIgnorer) .add(more_auth::more_auth_provider(&init_ctx.user_mesh)) .add(versioner::version_teller(&init_ctx.cubes)) diff --git a/rc_singleplayer_room/src/operations/mod.rs b/rc_singleplayer_room/src/operations/mod.rs index bbbb1b3..12ceb2e 100644 --- a/rc_singleplayer_room/src/operations/mod.rs +++ b/rc_singleplayer_room/src/operations/mod.rs @@ -7,7 +7,7 @@ use polariton_server::operations::OperationsHandler; pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler { OperationsHandler::::new() - .modify(oj_rc_core::polariton::RcOpModifier) + .modify(>::polariton_operation_modifier(&init_ctx.config)) .add(more_auth::MoreLobbyAuth) .add(eac::EacChallengeIgnorer) .add(load_ai_robots::tdm_machines_provider(&init_ctx.factory, init_ctx.parsers.weapon_order(), &init_ctx.config, init_ctx.parsers.cpu_counter())) diff --git a/rc_social_room/src/operations/mod.rs b/rc_social_room/src/operations/mod.rs index 148a796..915288e 100644 --- a/rc_social_room/src/operations/mod.rs +++ b/rc_social_room/src/operations/mod.rs @@ -42,7 +42,7 @@ use polariton_server::operations::OperationsHandler; pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler { OperationsHandler::::new() - .modify(oj_rc_core::polariton::RcOpModifier) + .modify(>::polariton_operation_modifier(&init_ctx.config)) .add(more_auth::more_lobby_auth(init_ctx)) .add(friend_list::friends_provider(init_ctx)) // TODO friend object parsing Token: 0x0200169C RID: 5788 .add(settings::settings_provider()) // TODO save settings persistently