Skip to content

Commit 5d08498

Browse files
committed
feat(engine): Add feature flag for v4 spec
Have to explicitly turn it on since we're still in beta for the spec.
1 parent f4900cc commit 5d08498

File tree

6 files changed

+50
-16
lines changed

6 files changed

+50
-16
lines changed

crates/buttplug_server/src/server.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ impl ButtplugServer {
118118
self.client_name.get().cloned()
119119
}
120120

121+
pub fn spec_version(&self) -> Option<ButtplugMessageSpecVersion> {
122+
self.spec_version.get().cloned()
123+
}
124+
121125
/// Retreive an async stream of ButtplugServerMessages. This is how the server sends out
122126
/// non-query-related updates to the system, including information on devices being added/removed,
123127
/// client disconnection, etc...
@@ -215,6 +219,14 @@ impl ButtplugServer {
215219
let features = self.device_manager().feature_map();
216220
let msg_id = msg.id();
217221
trace!("Server received: {:?}", msg);
222+
let v = msg.version();
223+
let spec_version = *self.spec_version.get_or_init(|| {
224+
info!(
225+
"Setting Buttplug Server Message Spec version to {}",
226+
v
227+
);
228+
v
229+
});
218230
match msg {
219231
ButtplugClientMessageVariant::V4(msg) => {
220232
let internal_msg =
@@ -241,15 +253,7 @@ impl ButtplugServer {
241253
.boxed()
242254
}
243255
msg => {
244-
let v = msg.version();
245256
let converter = ButtplugServerMessageConverter::new(Some(msg.clone()));
246-
let spec_version = *self.spec_version.get_or_init(|| {
247-
info!(
248-
"Setting Buttplug Server Message Spec Downgrade version to {}",
249-
v
250-
);
251-
v
252-
});
253257
match ButtplugCheckedClientMessageV4::try_from_client_message(msg, &features) {
254258
Ok(converted_msg) => {
255259
trace!("Converted message: {:?}", converted_msg);

crates/intiface_engine/src/backdoor_server.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ impl BackdoorServer {
3737
let (s_in, r_in) = mpsc::channel(255);
3838
let (s_stream, _) = broadcast::channel(255);
3939
tokio::spawn(async move {
40+
// Backdoor server can always use latest spec.
4041
if let Err(e) = server
4142
.start(ButtplugRemoteServerConnector::<
4243
_,
4344
ButtplugServerJSONSerializer,
44-
>::new(ButtplugStreamTransport::new(s_out, r_in)))
45+
>::new(ButtplugStreamTransport::new(s_out, r_in)), true)
4546
.await
4647
{
4748
// We can't do much if the server fails, but we *can* yell into the logs!

crates/intiface_engine/src/bin/main.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@ pub struct IntifaceCLIArguments {
168168
#[argh(switch)]
169169
#[getset(get_copy = "pub")]
170170
crash_task_thread: bool,
171+
172+
/// allow usage of the beta v4 api spec
173+
#[argh(switch)]
174+
#[getset(get_copy = "pub")]
175+
allow_v4_spec: bool,
171176
}
172177

173178
pub fn setup_console_logging(log_level: Option<Level>) {
@@ -243,6 +248,7 @@ impl TryFrom<IntifaceCLIArguments> for EngineOptions {
243248
.use_device_websocket_server(args.use_device_websocket_server())
244249
.max_ping_time(args.max_ping_time())
245250
.server_name(args.server_name())
251+
.allow_v4_spec(args.allow_v4_spec)
246252
.broadcast_server_mdns(args.broadcast_server_mdns());
247253

248254
#[cfg(debug_assertions)]

crates/intiface_engine/src/buttplug_server.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ pub async fn run_server(
161161
.port(port)
162162
.listen_on_all_interfaces(options.websocket_use_all_interfaces())
163163
.finish(),
164-
))
164+
), options.allow_v4_spec())
165165
.await
166166
} else if let Some(addr) = options.websocket_client_address() {
167167
server
@@ -170,7 +170,7 @@ pub async fn run_server(
170170
ButtplugServerJSONSerializer,
171171
>::new(
172172
ButtplugWebsocketClientTransport::new_insecure_connector(addr),
173-
))
173+
), options.allow_v4_spec())
174174
.await
175175
} else {
176176
panic!(

crates/intiface_engine/src/options.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ pub struct EngineOptions {
5656
repeater_remote_address: Option<String>,
5757
#[getset(get_copy = "pub")]
5858
rest_api_port: Option<u16>,
59+
#[getset(get_copy = "pub")]
60+
allow_v4_spec: bool,
5961
}
6062

6163
#[derive(Default, Debug, Clone)]
@@ -87,6 +89,7 @@ pub struct EngineOptionsExternal {
8789
pub repeater_local_port: Option<u16>,
8890
pub repeater_remote_address: Option<String>,
8991
pub rest_api_port: Option<u16>,
92+
pub allow_v4_spec: bool
9093
}
9194

9295
impl From<EngineOptionsExternal> for EngineOptions {
@@ -119,6 +122,7 @@ impl From<EngineOptionsExternal> for EngineOptions {
119122
repeater_local_port: other.repeater_local_port,
120123
repeater_remote_address: other.repeater_remote_address,
121124
rest_api_port: other.rest_api_port,
125+
allow_v4_spec: other.allow_v4_spec
122126
}
123127
}
124128
}
@@ -272,6 +276,11 @@ impl EngineOptionsBuilder {
272276
self
273277
}
274278

279+
pub fn allow_v4_spec(&mut self, allow: bool) -> &mut Self {
280+
self.options.allow_v4_spec = allow;
281+
self
282+
}
283+
275284
pub fn finish(&mut self) -> EngineOptions {
276285
self.options.clone()
277286
}

crates/intiface_engine/src/remote_server.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
use buttplug_core::{
99
connector::ButtplugConnector,
10-
errors::ButtplugError,
11-
message::ButtplugServerMessageV4,
10+
errors::{ButtplugError, ButtplugHandshakeError, ButtplugMessageError},
11+
message::{ButtplugMessageSpecVersion, ButtplugServerMessageV4},
1212
util::{async_manager, stream::convert_broadcast_receiver_to_stream},
1313
};
1414
use buttplug_server::{
@@ -123,6 +123,7 @@ async fn run_server<ConnectorType>(
123123
connector: ConnectorType,
124124
mut connector_receiver: mpsc::Receiver<ButtplugClientMessageVariant>,
125125
disconnect_notifier: Arc<Notify>,
126+
allow_v4_spec: bool
126127
) where
127128
ConnectorType:
128129
ButtplugConnector<ButtplugServerMessageVariant, ButtplugClientMessageVariant> + 'static,
@@ -149,15 +150,26 @@ async fn run_server<ConnectorType>(
149150
let connected = server_clone.connected();
150151
let connector_clone = shared_connector.clone();
151152
let remote_event_sender_clone = remote_event_sender.clone();
153+
let disconnect_notifier = disconnect_notifier.clone();
152154
async_manager::spawn(async move {
153155
match server_clone.parse_message(client_message.clone()).await {
154156
Ok(ret_msg) => {
155157
// Only send event if we just connected. Sucks to check it on every message but the boolean check should be quick.
156-
if !connected && server_clone.connected()
157-
&& remote_event_sender_clone.receiver_count() > 0
158+
if !connected && server_clone.connected() {
159+
// Check to see what message version was requested. If we're not allowing v4, kill the connection.
160+
info!("CHECKING SPEC: {} {:?}", allow_v4_spec, server_clone.spec_version());
161+
if !allow_v4_spec && server_clone.spec_version() == Some(ButtplugMessageSpecVersion::Version4) {
162+
error!("Cannot connect v4 client with this server (Allow v4 spec is off).");
163+
connector_clone.send(ButtplugServerMessageVariant::V4(ButtplugServerMessageV4::Error(ButtplugError::from(ButtplugHandshakeError::UnhandledMessageSpecVersionRequested(ButtplugMessageSpecVersion::Version4)).into()))).await;
164+
disconnect_notifier.notify_waiters();
165+
return;
166+
}
167+
168+
if remote_event_sender_clone.receiver_count() > 0
158169
&& remote_event_sender_clone.send(ButtplugRemoteServerEvent::ClientConnected(server_clone.client_name().unwrap_or("Buttplug Client (No name specified)".to_owned()).clone())).is_err() {
159170
error!("Cannot send event to owner, dropping and assuming local server thread has exited.");
160-
}
171+
}
172+
}
161173
if connector_clone.send(ret_msg).await.is_err() {
162174
error!("Cannot send reply to server, dropping and assuming remote server thread has exited.");
163175
}
@@ -273,6 +285,7 @@ impl ButtplugRemoteServer {
273285
pub fn start<ConnectorType>(
274286
&self,
275287
mut connector: ConnectorType,
288+
allow_v4_spec: bool
276289
) -> impl Future<Output = Result<(), ButtplugServerConnectorError>> + use<ConnectorType>
277290
where
278291
ConnectorType:
@@ -296,6 +309,7 @@ impl ButtplugRemoteServer {
296309
connector,
297310
connector_receiver,
298311
disconnect_notifier,
312+
allow_v4_spec
299313
)
300314
.await;
301315
Ok(())

0 commit comments

Comments
 (0)