@@ -19,6 +19,9 @@ fn register_signatures(
19
19
. and ( middlewares:: with_certifier_service (
20
20
dependency_manager. clone ( ) ,
21
21
) )
22
+ . and ( middlewares:: with_single_signature_authenticator (
23
+ dependency_manager,
24
+ ) )
22
25
. and_then ( handlers:: register_signatures)
23
26
}
24
27
@@ -34,19 +37,22 @@ mod handlers {
34
37
http_server:: routes:: reply,
35
38
message_adapters:: FromRegisterSingleSignatureAdapter ,
36
39
services:: { CertifierService , CertifierServiceError , RegistrationStatus } ,
40
+ unwrap_to_internal_server_error, SingleSignatureAuthenticator ,
37
41
} ;
38
42
39
43
/// Register Signatures
40
44
pub async fn register_signatures (
41
45
message : RegisterSignatureMessage ,
42
46
certifier_service : Arc < dyn CertifierService > ,
47
+ single_signer_authenticator : Arc < SingleSignatureAuthenticator > ,
43
48
) -> Result < impl warp:: Reply , Infallible > {
44
49
debug ! ( "⇄ HTTP SERVER: register_signatures/{:?}" , message) ;
45
50
trace ! ( "⇄ HTTP SERVER: register_signatures" ; "complete_message" => #?message ) ;
46
51
47
52
let signed_entity_type = message. signed_entity_type . clone ( ) ;
53
+ let signed_message = message. signed_message . clone ( ) ;
48
54
49
- let signatures = match FromRegisterSingleSignatureAdapter :: try_adapt ( message) {
55
+ let mut signatures = match FromRegisterSingleSignatureAdapter :: try_adapt ( message) {
50
56
Ok ( signature) => signature,
51
57
Err ( err) => {
52
58
warn ! ( "register_signatures::payload decoding error" ; "error" => ?err) ;
@@ -58,6 +64,15 @@ mod handlers {
58
64
}
59
65
} ;
60
66
67
+ if let Some ( signed_message) = signed_message {
68
+ unwrap_to_internal_server_error ! (
69
+ single_signer_authenticator
70
+ . authenticate( & mut signatures, & signed_message)
71
+ . await ,
72
+ "single_signer_authenticator::error"
73
+ ) ;
74
+ }
75
+
61
76
match certifier_service
62
77
. register_single_signature ( & signed_entity_type, & signatures)
63
78
. await
@@ -97,6 +112,7 @@ mod tests {
97
112
http_server:: SERVER_BASE_PATH ,
98
113
initialize_dependencies,
99
114
services:: { CertifierServiceError , MockCertifierService , RegistrationStatus } ,
115
+ SingleSignatureAuthenticator ,
100
116
} ;
101
117
102
118
use super :: * ;
@@ -114,6 +130,64 @@ mod tests {
114
130
. and ( routes ( dependency_manager) . with ( cors) )
115
131
}
116
132
133
+ #[ tokio:: test]
134
+ async fn test_register_signatures_try_to_authenticate_signature_with_signed_message ( ) {
135
+ let mut mock_certifier_service = MockCertifierService :: new ( ) ;
136
+ mock_certifier_service
137
+ . expect_register_single_signature ( )
138
+ . withf ( |_, signature| signature. is_authenticated ( ) )
139
+ . once ( )
140
+ . return_once ( move |_, _| Ok ( RegistrationStatus :: Registered ) ) ;
141
+ let mut dependency_manager = initialize_dependencies ( ) . await ;
142
+ dependency_manager. certifier_service = Arc :: new ( mock_certifier_service) ;
143
+ dependency_manager. single_signer_authenticator =
144
+ Arc :: new ( SingleSignatureAuthenticator :: new_that_authenticate_everything ( ) ) ;
145
+
146
+ let message = RegisterSignatureMessage {
147
+ signed_message : Some ( "message" . to_string ( ) ) ,
148
+ ..RegisterSignatureMessage :: dummy ( )
149
+ } ;
150
+
151
+ let method = Method :: POST . as_str ( ) ;
152
+ let path = "/register-signatures" ;
153
+
154
+ request ( )
155
+ . method ( method)
156
+ . path ( & format ! ( "/{SERVER_BASE_PATH}{path}" ) )
157
+ . json ( & message)
158
+ . reply ( & setup_router ( Arc :: new ( dependency_manager) ) )
159
+ . await ;
160
+ }
161
+
162
+ #[ tokio:: test]
163
+ async fn test_register_signatures_send_unauthenticated_signature_if_authentication_fail ( ) {
164
+ let mut mock_certifier_service = MockCertifierService :: new ( ) ;
165
+ mock_certifier_service
166
+ . expect_register_single_signature ( )
167
+ . withf ( |_, signature| !signature. is_authenticated ( ) )
168
+ . once ( )
169
+ . return_once ( move |_, _| Ok ( RegistrationStatus :: Registered ) ) ;
170
+ let mut dependency_manager = initialize_dependencies ( ) . await ;
171
+ dependency_manager. certifier_service = Arc :: new ( mock_certifier_service) ;
172
+ dependency_manager. single_signer_authenticator =
173
+ Arc :: new ( SingleSignatureAuthenticator :: new_that_reject_everything ( ) ) ;
174
+
175
+ let message = RegisterSignatureMessage {
176
+ signed_message : Some ( "message" . to_string ( ) ) ,
177
+ ..RegisterSignatureMessage :: dummy ( )
178
+ } ;
179
+
180
+ let method = Method :: POST . as_str ( ) ;
181
+ let path = "/register-signatures" ;
182
+
183
+ request ( )
184
+ . method ( method)
185
+ . path ( & format ! ( "/{SERVER_BASE_PATH}{path}" ) )
186
+ . json ( & message)
187
+ . reply ( & setup_router ( Arc :: new ( dependency_manager) ) )
188
+ . await ;
189
+ }
190
+
117
191
#[ tokio:: test]
118
192
async fn test_register_signatures_post_ok_201 ( ) {
119
193
let mut mock_certifier_service = MockCertifierService :: new ( ) ;
0 commit comments