@@ -9,7 +9,9 @@ use ::futures::future::BoxFuture;
9
9
use :: futures:: { Stream , StreamExt } ;
10
10
use bytes:: Bytes ;
11
11
pub use context:: { ContextInternal , InputMetadata } ;
12
- use restate_sdk_shared_core:: { CoreVM , Header , HeaderMap , ResponseHead , VMError , VM } ;
12
+ use restate_sdk_shared_core:: {
13
+ CoreVM , Header , HeaderMap , IdentityVerifier , KeyError , ResponseHead , VMError , VerifyError , VM ,
14
+ } ;
13
15
use std:: collections:: HashMap ;
14
16
use std:: future:: poll_fn;
15
17
use std:: pin:: Pin ;
@@ -88,6 +90,7 @@ impl Error {
88
90
| ErrorInner :: HandlerResult { .. } => 500 ,
89
91
ErrorInner :: BadDiscovery ( _) => 415 ,
90
92
ErrorInner :: Header { .. } | ErrorInner :: BadPath { .. } => 400 ,
93
+ ErrorInner :: IdentityVerification ( _) => 401 ,
91
94
}
92
95
}
93
96
}
@@ -100,6 +103,8 @@ enum ErrorInner {
100
103
UnknownServiceHandler ( String , String ) ,
101
104
#[ error( "Error when processing the request: {0:?}" ) ]
102
105
VM ( #[ from] VMError ) ,
106
+ #[ error( "Error when verifying identity: {0:?}" ) ]
107
+ IdentityVerification ( #[ from] VerifyError ) ,
103
108
#[ error( "Cannot convert header '{0}', reason: {1}" ) ]
104
109
Header ( String , #[ source] BoxError ) ,
105
110
#[ error( "Cannot reply to discovery, got accept header '{0}' but currently supported discovery is {DISCOVERY_CONTENT_TYPE}" ) ]
@@ -165,6 +170,7 @@ impl Service for BoxedService {
165
170
pub struct Builder {
166
171
svcs : HashMap < String , BoxedService > ,
167
172
discovery : crate :: discovery:: Endpoint ,
173
+ identity_verifier : IdentityVerifier ,
168
174
}
169
175
170
176
impl Default for Builder {
@@ -177,6 +183,7 @@ impl Default for Builder {
177
183
protocol_mode : Some ( crate :: discovery:: ProtocolMode :: BidiStream ) ,
178
184
services : vec ! [ ] ,
179
185
} ,
186
+ identity_verifier : Default :: default ( ) ,
180
187
}
181
188
}
182
189
}
@@ -204,10 +211,16 @@ impl Builder {
204
211
self
205
212
}
206
213
214
+ pub fn with_identity_key ( mut self , key : & str ) -> Result < Self , KeyError > {
215
+ self . identity_verifier = self . identity_verifier . with_key ( key) ?;
216
+ Ok ( self )
217
+ }
218
+
207
219
pub fn build ( self ) -> Endpoint {
208
220
Endpoint ( Arc :: new ( EndpointInner {
209
221
svcs : self . svcs ,
210
222
discovery : self . discovery ,
223
+ identity_verifier : self . identity_verifier ,
211
224
} ) )
212
225
}
213
226
}
@@ -224,6 +237,7 @@ impl Endpoint {
224
237
pub struct EndpointInner {
225
238
svcs : HashMap < String , BoxedService > ,
226
239
discovery : crate :: discovery:: Endpoint ,
240
+ identity_verifier : IdentityVerifier ,
227
241
}
228
242
229
243
impl Endpoint {
@@ -232,6 +246,10 @@ impl Endpoint {
232
246
H : HeaderMap ,
233
247
<H as HeaderMap >:: Error : std:: error:: Error + Send + Sync + ' static ,
234
248
{
249
+ if let Err ( e) = self . 0 . identity_verifier . verify_identity ( & headers, path) {
250
+ return Err ( ErrorInner :: IdentityVerification ( e) . into ( ) ) ;
251
+ }
252
+
235
253
let parts: Vec < & str > = path. split ( '/' ) . collect ( ) ;
236
254
237
255
if parts. last ( ) == Some ( & "discover" ) {
0 commit comments