@@ -407,22 +407,29 @@ impl Relay {
407407
408408 // If auth required, wait for authentication adn resend it
409409 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+ )
415421 . await ?;
416422
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 ?;
419425
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+ }
426433 }
427434 }
428435
@@ -746,9 +753,10 @@ mod tests {
746753
747754 use async_utility:: time;
748755 use nostr_relay_builder:: prelude:: * ;
756+ use tokio:: sync:: RwLock ;
749757
750758 use super :: { Error , * } ;
751- use crate :: policy:: { AdmitPolicy , PolicyError } ;
759+ use crate :: policy:: { AdmitPolicy , AuthenticationMiddleware , PolicyError } ;
752760
753761 #[ derive( Debug ) ]
754762 struct CustomTestPolicy {
@@ -770,10 +778,55 @@ mod tests {
770778 }
771779 }
772780
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+
773816 fn new_relay ( url : RelayUrl , opts : RelayOptions ) -> Relay {
774817 Relay :: new ( url, SharedState :: default ( ) , opts)
775818 }
776819
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+
777830 /// Setup public (without NIP42 auth) relay with N events to test event fetching
778831 ///
779832 /// **Adds ONLY text notes**
@@ -1161,7 +1214,10 @@ mod tests {
11611214 let mock = LocalRelay :: run ( builder) . await . unwrap ( ) ;
11621215 let url = RelayUrl :: parse ( & mock. url ( ) ) . unwrap ( ) ;
11631216
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 ( ) ) ;
11651221
11661222 relay. inner . state . automatic_authentication ( true ) ;
11671223
@@ -1185,7 +1241,7 @@ mod tests {
11851241 }
11861242
11871243 // Set a signer
1188- relay . inner . state . set_signer ( keys. clone ( ) ) . await ;
1244+ middleware . set_signer ( Some ( Arc :: new ( keys. clone ( ) ) ) ) . await ;
11891245
11901246 // Send as authenticated
11911247 let event = EventBuilder :: text_note ( "Test" )
@@ -1204,7 +1260,10 @@ mod tests {
12041260 let mock = LocalRelay :: run ( builder) . await . unwrap ( ) ;
12051261 let url = RelayUrl :: parse ( & mock. url ( ) ) . unwrap ( ) ;
12061262
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 ( ) ) ;
12081267
12091268 relay. connect ( ) ;
12101269
@@ -1256,7 +1315,7 @@ mod tests {
12561315 assert ! ( matches!( err, Error :: AuthenticationFailed ) ) ;
12571316
12581317 // Set a signer
1259- relay . inner . state . set_signer ( keys) . await ;
1318+ middleware . set_signer ( Some ( Arc :: new ( keys) ) ) . await ;
12601319
12611320 // Authenticated fetch
12621321 let res = relay
0 commit comments