77
88use 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} ;
1414use 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