Merge branch 'fix-component' into 'master'

lumi created

fix component connection when one byte was in 0..15

See merge request !5

Change summary

Cargo.toml       |  1 +
src/component.rs | 11 ++++++-----
src/error.rs     |  9 +++++++++
src/lib.rs       |  1 +
4 files changed, 17 insertions(+), 5 deletions(-)

Detailed changes

Cargo.toml 🔗

@@ -21,6 +21,7 @@ base64 = "0.4.0"
 minidom = "0.2.0"
 jid = "0.2.0"
 sasl = "0.3.0"
+sha-1 = "0.3.2"
 
 [features]
 insecure = []

src/component.rs 🔗

@@ -5,12 +5,13 @@ use ns;
 use plugin::{Plugin, PluginProxyBinding};
 use event::AbstractEvent;
 use connection::{Connection, Component2S};
-use openssl::hash::{hash, MessageDigest};
+use sha_1::{Sha1, Digest};
 
 use minidom::Element;
 
 use xml::reader::XmlEvent as ReaderEvent;
 
+use std::fmt::Write;
 use std::sync::mpsc::{Receiver, channel};
 
 /// A builder for `Component`s.
@@ -147,11 +148,11 @@ impl Component {
             }
         }
         let concatenated = format!("{}{}", sid, secret);
-        let hash = hash(MessageDigest::sha1(), concatenated.as_bytes())?;
+        let mut hasher = Sha1::default();
+        hasher.input(concatenated.as_bytes());
         let mut handshake = String::new();
-        for byte in hash {
-            // TODO: probably terrible perfs!
-            handshake = format!("{}{:x}", handshake, byte);
+        for byte in hasher.result() {
+            write!(handshake, "{:02x}", byte)?;
         }
         let mut elem = Element::builder("handshake")
                                .ns(ns::COMPONENT_ACCEPT)

src/error.rs 🔗

@@ -1,5 +1,7 @@
 //! Provides an `Error` for use in this crate.
 
+use std::fmt::Error as FormatError;
+
 use std::io;
 
 use std::net::TcpStream;
@@ -28,6 +30,7 @@ pub enum Error {
     Base64Error(Base64Error),
     SaslError(Option<String>),
     XmppSaslError(SaslError),
+    FormatError(FormatError),
     StreamError,
     EndOfDocument,
 }
@@ -73,3 +76,9 @@ impl From<Base64Error> for Error {
         Error::Base64Error(err)
     }
 }
+
+impl From<FormatError> for Error {
+    fn from(err: FormatError) -> Error {
+        Error::FormatError(err)
+    }
+}

src/lib.rs 🔗

@@ -2,6 +2,7 @@ extern crate xml;
 extern crate openssl;
 extern crate minidom;
 extern crate base64;
+extern crate sha_1;
 pub extern crate jid;
 pub extern crate sasl;