summaryrefslogtreecommitdiffstats
path: root/src/client/mod.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@blos.sm>2023-06-19 19:23:54 +0100
committerLibravatar cel 🌸 <cel@blos.sm>2023-06-19 19:23:54 +0100
commit6a5e39c60ad74c1cba84daa7c845c8f0237a5d28 (patch)
tree7115e5dc2679bc053acb9b28fed41d3175ed2817 /src/client/mod.rs
parentabc3ffa7363ebd30101e15db7e02a7d44f323df9 (diff)
downloadluz-6a5e39c60ad74c1cba84daa7c845c8f0237a5d28.tar.gz
luz-6a5e39c60ad74c1cba84daa7c845c8f0237a5d28.tar.bz2
luz-6a5e39c60ad74c1cba84daa7c845c8f0237a5d28.zip
implement starttls
Diffstat (limited to 'src/client/mod.rs')
-rw-r--r--src/client/mod.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/client/mod.rs b/src/client/mod.rs
new file mode 100644
index 0000000..fe3dd34
--- /dev/null
+++ b/src/client/mod.rs
@@ -0,0 +1,40 @@
+pub mod encrypted;
+pub mod unencrypted;
+
+// use async_trait::async_trait;
+
+use crate::stanza::stream::StreamFeature;
+use crate::JabberError;
+use crate::Result;
+
+pub enum JabberClientType<'j> {
+ Encrypted(encrypted::JabberClient<'j>),
+ Unencrypted(unencrypted::JabberClient<'j>),
+}
+
+impl<'j> JabberClientType<'j> {
+ pub async fn ensure_tls(self) -> Result<encrypted::JabberClient<'j>> {
+ match self {
+ Self::Encrypted(mut c) => {
+ c.start_stream();
+ Ok(c)
+ }
+ Self::Unencrypted(mut c) => {
+ c.start_stream().await?;
+ let features = c.get_features().await?;
+ if features.contains(&StreamFeature::StartTls) {
+ Ok(c.starttls().await?)
+ } else {
+ Err(JabberError::StartTlsUnavailable)
+ }
+ }
+ }
+ }
+}
+
+// TODO: jabber client trait over both client types
+// #[async_trait]
+// pub trait JabberTrait {
+// async fn start_stream(&mut self) -> Result<()>;
+// async fn get_features(&self) -> Result<Vec<StreamFeatures>>;
+// }