@@ -40,28 +40,23 @@ impl SshxService for GrpcServer {
40
40
type ChannelStream = ReceiverStream < Result < ServerUpdate , Status > > ;
41
41
42
42
async fn open ( & self , request : Request < OpenRequest > ) -> RR < OpenResponse > {
43
- use dashmap:: mapref:: entry:: Entry :: * ;
44
-
45
43
let request = request. into_inner ( ) ;
46
- let origin = match & self . 0 . override_origin {
47
- Some ( origin) => origin. clone ( ) ,
48
- None => request. origin ,
49
- } ;
44
+ let origin = self . 0 . override_origin ( ) . unwrap_or ( request. origin ) ;
50
45
if origin. is_empty ( ) {
51
46
return Err ( Status :: invalid_argument ( "origin is empty" ) ) ;
52
47
}
53
48
let name = rand_alphanumeric ( 10 ) ;
54
49
info ! ( %name, "creating new session" ) ;
55
- match self . 0 . store . entry ( name. clone ( ) ) {
56
- Occupied ( _) => return Err ( Status :: already_exists ( "generated duplicate ID" ) ) ,
57
- Vacant ( v ) => {
50
+ match self . 0 . lookup ( & name) {
51
+ Some ( _) => return Err ( Status :: already_exists ( "generated duplicate ID" ) ) ,
52
+ None => {
58
53
let metadata = Metadata {
59
- encrypted_zeros : request. encrypted_zeros . into ( ) ,
54
+ encrypted_zeros : request. encrypted_zeros ,
60
55
} ;
61
- v . insert ( Session :: new ( metadata) . into ( ) ) ;
56
+ self . 0 . insert ( & name , Arc :: new ( Session :: new ( metadata) ) ) ;
62
57
}
63
58
} ;
64
- let token = self . 0 . mac . clone ( ) . chain_update ( & name) . finalize ( ) ;
59
+ let token = self . 0 . mac ( ) . chain_update ( & name) . finalize ( ) ;
65
60
let url = format ! ( "{origin}/s/{name}" ) ;
66
61
Ok ( Response :: new ( OpenResponse {
67
62
name,
@@ -81,14 +76,18 @@ impl SshxService for GrpcServer {
81
76
let ( name, token) = hello
82
77
. split_once ( ',' )
83
78
. ok_or_else ( || Status :: invalid_argument ( "missing name and token" ) ) ?;
84
- validate_token ( & self . 0 . mac , name, token) ?;
79
+ validate_token ( self . 0 . mac ( ) , name, token) ?;
85
80
name. to_string ( )
86
81
}
87
82
_ => return Err ( Status :: invalid_argument ( "invalid first message" ) ) ,
88
83
} ;
89
- let session = match self . 0 . store . get ( & session_name) {
90
- Some ( session) => Arc :: clone ( & session) ,
91
- None => return Err ( Status :: not_found ( "session not found" ) ) ,
84
+ let session = match self . 0 . backend_connect ( & session_name) . await {
85
+ Ok ( Some ( session) ) => session,
86
+ Ok ( None ) => return Err ( Status :: not_found ( "session not found" ) ) ,
87
+ Err ( err) => {
88
+ error ! ( ?err, "failed to connect to backend session" ) ;
89
+ return Err ( Status :: internal ( err. to_string ( ) ) ) ;
90
+ }
92
91
} ;
93
92
94
93
// We now spawn an asynchronous task that sends updates to the client. Note that
@@ -106,22 +105,19 @@ impl SshxService for GrpcServer {
106
105
107
106
async fn close ( & self , request : Request < CloseRequest > ) -> RR < CloseResponse > {
108
107
let request = request. into_inner ( ) ;
109
- validate_token ( & self . 0 . mac , & request. name , & request. token ) ?;
110
- let exists = match self . 0 . store . remove ( & request. name ) {
111
- Some ( ( _, session) ) => {
112
- session. shutdown ( ) ;
113
- true
114
- }
115
- None => false ,
116
- } ;
117
- Ok ( Response :: new ( CloseResponse { exists } ) )
108
+ validate_token ( self . 0 . mac ( ) , & request. name , & request. token ) ?;
109
+ if let Err ( err) = self . 0 . close_session ( & request. name ) . await {
110
+ error ! ( ?err, "failed to close session" ) ;
111
+ return Err ( Status :: internal ( err. to_string ( ) ) ) ;
112
+ }
113
+ Ok ( Response :: new ( CloseResponse { } ) )
118
114
}
119
115
}
120
116
121
117
/// Validate the client token for a session.
122
- fn validate_token ( mac : & ( impl Mac + Clone ) , name : & str , token : & str ) -> Result < ( ) , Status > {
118
+ fn validate_token ( mac : impl Mac , name : & str , token : & str ) -> Result < ( ) , Status > {
123
119
if let Ok ( token) = BASE64_STANDARD . decode ( token) {
124
- if mac. clone ( ) . chain_update ( name) . verify_slice ( & token) . is_ok ( ) {
120
+ if mac. chain_update ( name) . verify_slice ( & token) . is_ok ( ) {
125
121
return Ok ( ( ) ) ;
126
122
}
127
123
}
@@ -182,7 +178,7 @@ async fn handle_update(tx: &ServerTx, session: &Session, update: ClientUpdate) -
182
178
return send_err ( tx, "unexpected hello" . into ( ) ) . await ;
183
179
}
184
180
Some ( ClientMessage :: Data ( data) ) => {
185
- if let Err ( err) = session. add_data ( Sid ( data. id ) , data. data . into ( ) , data. seq ) {
181
+ if let Err ( err) = session. add_data ( Sid ( data. id ) , data. data , data. seq ) {
186
182
return send_err ( tx, format ! ( "add data: {:?}" , err) ) . await ;
187
183
}
188
184
}
0 commit comments