forked from lavina/lavina
				
			Compare commits
	
		
			No commits in common. "e68d699462630d5cbd055b6cdc5856b3deccc6d0" and "2cf3edd27b2471617fd05e610d2749042c8b81d7" have entirely different histories.
		
	
	
		
			e68d699462
			...
			2cf3edd27b
		
	
		|  | @ -19,3 +19,10 @@ repos: | ||||||
|           - --all |           - --all | ||||||
|         types: [ rust ] |         types: [ rust ] | ||||||
|         pass_filenames: false |         pass_filenames: false | ||||||
|  |       - id: check | ||||||
|  |         name: check | ||||||
|  |         description: Check | ||||||
|  |         entry: cargo check | ||||||
|  |         language: system | ||||||
|  |         types: [ rust ] | ||||||
|  |         pass_filenames: false | ||||||
|  |  | ||||||
|  | @ -108,6 +108,7 @@ impl<'a> TestScopeTls<'a> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct IgnoreCertVerification; | struct IgnoreCertVerification; | ||||||
|  | 
 | ||||||
| impl ServerCertVerifier for IgnoreCertVerification { | impl ServerCertVerifier for IgnoreCertVerification { | ||||||
|     fn verify_server_cert( |     fn verify_server_cert( | ||||||
|         &self, |         &self, | ||||||
|  | @ -122,6 +123,79 @@ impl ServerCertVerifier for IgnoreCertVerification { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /// Some clients prefer to close their tags, i.e. Gajim.
 | ||||||
|  | #[tokio::test] | ||||||
|  | async fn scenario_basic_closed_tag() -> Result<()> { | ||||||
|  |     tracing_subscriber::fmt::try_init(); | ||||||
|  |     let config = ServerConfig { | ||||||
|  |         listen_on: "127.0.0.1:0".parse().unwrap(), | ||||||
|  |         cert: "tests/certs/xmpp.pem".parse().unwrap(), | ||||||
|  |         key: "tests/certs/xmpp.key".parse().unwrap(), | ||||||
|  |     }; | ||||||
|  |     let mut metrics = MetricsRegistry::new(); | ||||||
|  |     let mut storage = Storage::open(StorageConfig { | ||||||
|  |         db_path: ":memory:".into(), | ||||||
|  |     }) | ||||||
|  |     .await?; | ||||||
|  |     let rooms = RoomRegistry::new(&mut metrics, storage.clone()).unwrap(); | ||||||
|  |     let players = PlayerRegistry::empty(rooms.clone(), &mut metrics).unwrap(); | ||||||
|  |     let server = launch(config, players, rooms, metrics, storage.clone()).await.unwrap(); | ||||||
|  | 
 | ||||||
|  |     // test scenario
 | ||||||
|  | 
 | ||||||
|  |     storage.create_user("tester").await?; | ||||||
|  |     storage.set_password("tester", "password").await?; | ||||||
|  | 
 | ||||||
|  |     let mut stream = TcpStream::connect(server.addr).await?; | ||||||
|  |     let mut s = TestScope::new(&mut stream); | ||||||
|  |     tracing::info!("TCP connection established"); | ||||||
|  | 
 | ||||||
|  |     s.send(r#"<?xml version='1.0'?>"#).await?; | ||||||
|  |     s.send(r#" | ||||||
|  |     <stream:stream xmlns="jabber:client" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" to="sauer" xml:lang="en"> | ||||||
|  |     "#).await?;
 | ||||||
|  | 
 | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::Decl(_) => {}); | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::Start(b) => assert_eq!(b.local_name().into_inner(), b"stream")); | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::Start(b) => assert_eq!(b.local_name().into_inner(), b"features")); | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::Start(b) => assert_eq!(b.local_name().into_inner(), b"starttls")); | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::Empty(b) => assert_eq!(b.local_name().into_inner(), b"required")); | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::End(b) => assert_eq!(b.local_name().into_inner(), b"starttls")); | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::End(b) => assert_eq!(b.local_name().into_inner(), b"features")); | ||||||
|  |     s.send(r#"<starttls/>"#).await?; | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::Empty(b) => assert_eq!(b.local_name().into_inner(), b"proceed")); | ||||||
|  |     let buffer = s.buffer; | ||||||
|  |     tracing::info!("TLS feature negotiation complete"); | ||||||
|  | 
 | ||||||
|  |     let connector = TlsConnector::from(Arc::new( | ||||||
|  |         ClientConfig::builder() | ||||||
|  |             .with_safe_defaults() | ||||||
|  |             .with_custom_certificate_verifier(Arc::new(IgnoreCertVerification)) | ||||||
|  |             .with_no_client_auth(), | ||||||
|  |     )); | ||||||
|  |     tracing::info!("Initiating TLS connection..."); | ||||||
|  |     let mut stream = connector.connect(ServerName::IpAddress(server.addr.ip()), stream).await?; | ||||||
|  |     tracing::info!("TLS connection established"); | ||||||
|  | 
 | ||||||
|  |     let mut s = TestScopeTls::new(&mut stream, buffer); | ||||||
|  | 
 | ||||||
|  |     s.send(r#"<?xml version="1.0"?>"#).await?; | ||||||
|  |     s.send(r#" | ||||||
|  |     <!-- Outgoing Tue 02 Apr 2024 06:39:24 PM CEST (Account Wizard) --> | ||||||
|  |     </stream:stream> | ||||||
|  |     <stream:stream xmlns:stream="http://etherx.jabber.org/streams" to="127.0.0.1" xml:lang="en" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns="jabber:client" version="1.0"> | ||||||
|  |     "#).await?;
 | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::Decl(_) => {}); | ||||||
|  |     assert_matches!(s.next_xml_event().await?, Event::Start(b) => assert_eq!(b.local_name().into_inner(), b"stream")); | ||||||
|  | 
 | ||||||
|  |     stream.shutdown().await?; | ||||||
|  | 
 | ||||||
|  |     // wrap up
 | ||||||
|  | 
 | ||||||
|  |     server.terminate().await?; | ||||||
|  |     Ok(()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[tokio::test] | #[tokio::test] | ||||||
| async fn scenario_basic() -> Result<()> { | async fn scenario_basic() -> Result<()> { | ||||||
|     tracing_subscriber::fmt::try_init(); |     tracing_subscriber::fmt::try_init(); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue