@@ -26,6 +26,7 @@ use crate::{
2626 } ,
2727} ;
2828
29+ // How much time the user has to approve remote MFA with mobile device
2930const REMOTE_AUTH_TIMEOUT : Duration = Duration :: from_secs ( 60 ) ;
3031
3132pub ( crate ) fn router ( ) -> Router < AppState > {
@@ -83,18 +84,23 @@ async fn handle_remote_auth_socket(
8384 let ( mut ws_tx, mut ws_rx) = socket. split ( ) ;
8485 let mut set = JoinSet :: new ( ) ;
8586
87+ let request = ClientRemoteMfaFinishRequest { token } ;
88+ let rx = match state. grpc_server . send (
89+ core_request:: Payload :: ClientRemoteMfaFinish ( request) ,
90+ device_info,
91+ ) {
92+ Ok ( rx) => rx,
93+ Err ( err) => {
94+ error ! ( "Failed to send ClientRemoteMfaFinishRequest: {err:?}" ) ;
95+ return ;
96+ }
97+ } ;
98+
99+ // Response to ClientRemoteMfaFinishRequest comes once the user concludes MFA with mobile device.
100+ // This task then sends the preshared key to the WebSocket where desktop client awaits for it.
86101 set. spawn ( async move {
87- let request = ClientRemoteMfaFinishRequest { token } ;
88- let rx = state
89- . grpc_server
90- . send (
91- core_request:: Payload :: ClientRemoteMfaFinish ( request) ,
92- device_info,
93- )
94- . unwrap ( ) ; // TODO(jck) unwrap
95- // TODO(jck) unwrap
96- match rx. await . unwrap ( ) {
97- Payload :: ClientRemoteMfaFinish ( response) => {
102+ match rx. await {
103+ Ok ( Payload :: ClientRemoteMfaFinish ( response) ) => {
98104 let ws_response = json ! ( {
99105 "type" : "mfa_success" ,
100106 "preshared_key" : & response. preshared_key,
@@ -106,13 +112,20 @@ async fn handle_remote_auth_socket(
106112 }
107113 }
108114 }
109- _ => {
110- error ! ( "Received wrong response type" ) ;
115+ Ok ( _) => {
116+ error ! ( "Received wrong response type, expected ClientRemoteMfaFinish" ) ;
117+ }
118+ Err ( err) => {
119+ error ! ( "Failed to receive preshared key from receiver: {err:?}" ) ;
111120 }
112121 } ;
122+
123+ // Close the websocket once we're done.
113124 let _ = ws_tx. close ( ) . await ;
114125 } ) ;
115126
127+ // Another task to monitor the websocket connection in case desktop client disconnects
128+ // or the connection errors-out.
116129 set. spawn ( async move {
117130 while let Some ( msg_result) = ws_rx. next ( ) . await {
118131 match msg_result {
@@ -129,6 +142,7 @@ async fn handle_remote_auth_socket(
129142 }
130143 } ) ;
131144
145+ // Wait for whichever task finishes first and kill the other one.
132146 let _ = set. join_next ( ) . await ;
133147 set. shutdown ( ) . await ;
134148}
0 commit comments