@@ -407,22 +407,29 @@ impl Relay {
407
407
408
408
// If auth required, wait for authentication adn resend it
409
409
if let Some ( MachineReadablePrefix :: AuthRequired ) = MachineReadablePrefix :: parse ( & message) {
410
- // Check if NIP42 auth is enabled and signer is set
411
- let has_signer: bool = self . inner . state . has_signer ( ) . await ;
412
- if self . inner . state . is_auto_authentication_enabled ( ) && has_signer {
413
- // Wait that relay authenticate
414
- self . wait_for_authentication ( & mut notifications, WAIT_FOR_AUTHENTICATION_TIMEOUT )
410
+ // Check if NIP42 auth is enabled and middleware is set
411
+ if let Some ( middleware) = & self . inner . state . auth_middleware {
412
+ let is_enabled: bool = self . inner . state . is_auto_authentication_enabled ( ) ;
413
+ let is_ready: bool = middleware. is_ready ( ) . await ;
414
+
415
+ if is_enabled && is_ready {
416
+ // Wait that relay authenticate
417
+ self . wait_for_authentication (
418
+ & mut notifications,
419
+ WAIT_FOR_AUTHENTICATION_TIMEOUT ,
420
+ )
415
421
. await ?;
416
422
417
- // Try to resend event
418
- let ( status, message) = self . _send_event ( & mut notifications, event) . await ?;
423
+ // Try to resend event
424
+ let ( status, message) = self . _send_event ( & mut notifications, event) . await ?;
419
425
420
- // Check status
421
- return if status {
422
- Ok ( event. id )
423
- } else {
424
- Err ( Error :: RelayMessage ( message) )
425
- } ;
426
+ // Check status
427
+ return if status {
428
+ Ok ( event. id )
429
+ } else {
430
+ Err ( Error :: RelayMessage ( message) )
431
+ } ;
432
+ }
426
433
}
427
434
}
428
435
@@ -746,9 +753,10 @@ mod tests {
746
753
747
754
use async_utility:: time;
748
755
use nostr_relay_builder:: prelude:: * ;
756
+ use tokio:: sync:: RwLock ;
749
757
750
758
use super :: { Error , * } ;
751
- use crate :: policy:: { AdmitPolicy , PolicyError } ;
759
+ use crate :: policy:: { AdmitPolicy , AuthenticationMiddleware , PolicyError } ;
752
760
753
761
#[ derive( Debug ) ]
754
762
struct CustomTestPolicy {
@@ -770,10 +778,55 @@ mod tests {
770
778
}
771
779
}
772
780
781
+ #[ derive( Debug , Default ) ]
782
+ struct AuthenticationPolicy {
783
+ signer : RwLock < Option < Arc < dyn NostrSigner > > > ,
784
+ }
785
+
786
+ impl AuthenticationPolicy {
787
+ async fn set_signer ( & self , signer : Option < Arc < dyn NostrSigner > > ) {
788
+ let mut s = self . signer . write ( ) . await ;
789
+ * s = signer;
790
+ }
791
+ }
792
+
793
+ impl AuthenticationMiddleware for AuthenticationPolicy {
794
+ fn is_ready ( & self ) -> BoxedFuture < ' _ , bool > {
795
+ Box :: pin ( async move { self . signer . read ( ) . await . is_some ( ) } )
796
+ }
797
+
798
+ fn authenticate < ' a > (
799
+ & ' a self ,
800
+ _relay_url : & ' a RelayUrl ,
801
+ builder : EventBuilder ,
802
+ ) -> BoxedFuture < ' a , Result < Event , PolicyError > > {
803
+ Box :: pin ( async move {
804
+ let signer = self . signer . read ( ) . await ;
805
+
806
+ match signer. as_ref ( ) {
807
+ Some ( signer) => builder. sign ( signer) . await . map_err ( PolicyError :: backend) ,
808
+ None => {
809
+ return Err ( PolicyError :: backend ( Error :: AuthenticationFailed ) ) ;
810
+ }
811
+ }
812
+ } )
813
+ }
814
+ }
815
+
773
816
fn new_relay ( url : RelayUrl , opts : RelayOptions ) -> Relay {
774
817
Relay :: new ( url, SharedState :: default ( ) , opts)
775
818
}
776
819
820
+ fn new_relay_with_auth_middleware (
821
+ url : RelayUrl ,
822
+ middleware : Arc < dyn AuthenticationMiddleware > ,
823
+ opts : RelayOptions ,
824
+ ) -> Relay {
825
+ let mut state: SharedState = SharedState :: default ( ) ;
826
+ state. auth_middleware = Some ( middleware) ;
827
+ Relay :: new ( url, state, opts)
828
+ }
829
+
777
830
/// Setup public (without NIP42 auth) relay with N events to test event fetching
778
831
///
779
832
/// **Adds ONLY text notes**
@@ -1161,7 +1214,10 @@ mod tests {
1161
1214
let mock = LocalRelay :: run ( builder) . await . unwrap ( ) ;
1162
1215
let url = RelayUrl :: parse ( & mock. url ( ) ) . unwrap ( ) ;
1163
1216
1164
- let relay: Relay = new_relay ( url, RelayOptions :: default ( ) ) ;
1217
+ let middleware = Arc :: new ( AuthenticationPolicy :: default ( ) ) ;
1218
+
1219
+ let relay: Relay =
1220
+ new_relay_with_auth_middleware ( url, middleware. clone ( ) , RelayOptions :: default ( ) ) ;
1165
1221
1166
1222
relay. inner . state . automatic_authentication ( true ) ;
1167
1223
@@ -1185,7 +1241,7 @@ mod tests {
1185
1241
}
1186
1242
1187
1243
// Set a signer
1188
- relay . inner . state . set_signer ( keys. clone ( ) ) . await ;
1244
+ middleware . set_signer ( Some ( Arc :: new ( keys. clone ( ) ) ) ) . await ;
1189
1245
1190
1246
// Send as authenticated
1191
1247
let event = EventBuilder :: text_note ( "Test" )
@@ -1204,7 +1260,10 @@ mod tests {
1204
1260
let mock = LocalRelay :: run ( builder) . await . unwrap ( ) ;
1205
1261
let url = RelayUrl :: parse ( & mock. url ( ) ) . unwrap ( ) ;
1206
1262
1207
- let relay: Relay = new_relay ( url, RelayOptions :: default ( ) ) ;
1263
+ let middleware = Arc :: new ( AuthenticationPolicy :: default ( ) ) ;
1264
+
1265
+ let relay: Relay =
1266
+ new_relay_with_auth_middleware ( url, middleware. clone ( ) , RelayOptions :: default ( ) ) ;
1208
1267
1209
1268
relay. connect ( ) ;
1210
1269
@@ -1256,7 +1315,7 @@ mod tests {
1256
1315
assert ! ( matches!( err, Error :: AuthenticationFailed ) ) ;
1257
1316
1258
1317
// Set a signer
1259
- relay . inner . state . set_signer ( keys) . await ;
1318
+ middleware . set_signer ( Some ( Arc :: new ( keys) ) ) . await ;
1260
1319
1261
1320
// Authenticated fetch
1262
1321
let res = relay
0 commit comments