Преглед изворни кода

Use a pure rust mDNS responder instead of relying on Avahi / dns-sd.

Fixes #33, #70
Paul Lietar пре 9 година
родитељ
комит
b25585a41b
7 измењених фајлова са 147 додато и 42 уклоњено
  1. 134 6
      Cargo.lock
  2. 3 3
      Cargo.toml
  3. 1 10
      README.md
  4. 7 8
      src/authentication/discovery.rs
  5. 0 6
      src/authentication/mod.rs
  6. 1 3
      src/lib.rs
  7. 1 6
      src/main_helper.rs

+ 134 - 6
Cargo.lock

@@ -5,7 +5,6 @@ dependencies = [
  "bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "clippy 0.0.78 (registry+https://github.com/rust-lang/crates.io-index)",
- "dns-sd 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "eventual 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -17,6 +16,7 @@ dependencies = [
  "linear-map 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lmdb-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mdns 0.1.0 (git+http://github.com/plietar/rust-mdns)",
  "num 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
  "openssl 0.7.14 (registry+https://github.com/rust-lang/crates.io-index)",
  "portaudio 0.2.0 (git+https://github.com/mvdnes/portaudio-rs)",
@@ -73,6 +73,11 @@ name = "bitflags"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "bitflags"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "bitflags"
 version = "0.5.0"
@@ -88,6 +93,16 @@ name = "byteorder"
 version = "0.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "bytes"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "clippy"
 version = "0.0.78"
@@ -122,12 +137,13 @@ dependencies = [
 ]
 
 [[package]]
-name = "dns-sd"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
+name = "dns-parser"
+version = "0.3.2"
+source = "git+http://github.com/plietar/dns-parser#1dfc065504f8e18390fff988dd45d3072157e3b7"
 dependencies = [
- "libc 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quick-error 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -313,6 +329,24 @@ name = "matches"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "mdns"
+version = "0.1.0"
+source = "git+http://github.com/plietar/rust-mdns#a1bc7a031766c4e321152be4d0acd069a42f887d"
+dependencies = [
+ "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dns-parser 0.3.2 (git+http://github.com/plietar/dns-parser)",
+ "eventual 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "multimap 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "net2 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rotor 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "memchr"
 version = "0.1.11"
@@ -329,6 +363,59 @@ dependencies = [
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "mio"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miow 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "net2 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "miow"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "net2 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "multimap"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "net2"
+version = "0.2.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "nix"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "nom"
 version = "1.2.3"
@@ -547,6 +634,16 @@ dependencies = [
  "quasi_codegen 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "quick-error"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "quick-error"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "quine-mc_cluskey"
 version = "0.2.2"
@@ -577,6 +674,18 @@ name = "regex-syntax"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "rotor"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quick-error 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "rpassword"
 version = "0.2.2"
@@ -691,6 +800,11 @@ dependencies = [
  "libc 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "slab"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "solicit"
 version = "0.4.4"
@@ -933,6 +1047,11 @@ dependencies = [
  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "vorbis"
 version = "0.0.14"
@@ -977,3 +1096,12 @@ name = "winapi-build"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+

+ 3 - 3
Cargo.toml

@@ -44,8 +44,6 @@ shannon         = { git = "https://github.com/plietar/rust-shannon" }
 vorbis          = "~0.0.14"
 tremor          = { git = "https://github.com/plietar/rust-tremor", optional = true }
 
-dns-sd          = { version  = "~0.1.1", optional = true }
-
 portaudio       = { git = "https://github.com/mvdnes/portaudio-rs", optional = true }
 libpulse-sys    = { git = "https://github.com/astro/libpulse-sys", optional = true }
 
@@ -56,6 +54,8 @@ clippy          = { version = "*", optional = true }
 
 openssl         = { version = "0.7", optional = true }
 
+mdns            = { git = "http://github.com/plietar/rust-mdns" }
+
 [build-dependencies]
 vergen          = "~0.1.0"
 protobuf_macros = { git = "https://github.com/plietar/rust-protobuf-macros" }
@@ -63,9 +63,9 @@ json_macros     = { git = "https://github.com/plietar/json_macros" }
 serde_codegen   = { version = "0.7", optional = true }
 
 [features]
-discovery         = ["dns-sd"]
 with-syntex       = ["serde_codegen", "protobuf_macros/with-syntex", "json_macros/with-syntex"]
 nightly           = ["serde_macros"]
+
 with-tremor       = ["tremor"]
 facebook          = ["hyper/ssl", "openssl"]
 portaudio-backend = ["portaudio"]

+ 1 - 10
README.md

@@ -42,16 +42,7 @@ target/release/librespot --appkey APPKEY --username USERNAME --cache CACHEDIR --
 
 ## Discovery mode
 *librespot* can be run in discovery mode, in which case no password is required at startup.
-dns-sd or avahi's compatibility layer is required for this. On debian/ubuntu this is the
-`libavahi-compat-libdnssd-dev` package. On Fedora, this is the
-`avahi-compat-libdns_sd-devel` package. It come preinstalled on OS X.
-
-It must be enabled at build time :
-```shell
-cargo build --release --features discovery
-```
-
-When running *librespot* simply omit the `--username` argument.
+For that, simply omit the `--username` argument.
 
 ## Facebook Accounts
 *librespot* can be built with Facebook authentication support. OpenSSL is required for this.

+ 7 - 8
src/authentication/discovery.rs

@@ -1,7 +1,6 @@
 use crypto;
 use crypto::mac::Mac;
 use crypto::digest::Digest;
-use dns_sd::DNSService;
 use hyper;
 use hyper::net::NetworkListener;
 use num::BigUint;
@@ -11,6 +10,7 @@ use rustc_serialize::base64::{self, ToBase64, FromBase64};
 use std::collections::BTreeMap;
 use std::io::{Read, Write};
 use std::sync::{mpsc, Mutex};
+use mdns;
 
 use authentication::Credentials;
 use diffie_hellman::{DH_GENERATOR, DH_PRIME};
@@ -176,13 +176,12 @@ pub fn discovery_login(device_name: &str, device_id: &str) -> Result<Credentials
 
     let mut server = hyper::Server::new(listener).handle(handler).unwrap();
 
-    let _svc = DNSService::register(Some(device_name),
-                                    "_spotify-connect._tcp",
-                                    None,
-                                    None,
-                                    port,
-                                    &["VERSION=1.0", "CPath=/"]
-                                    ).unwrap();
+    let responder = mdns::Responder::new().unwrap();
+    let _svc = responder.register(
+        "_spotify-connect._tcp".to_owned(),
+        device_name.to_owned(),
+        port,
+        &["VERSION=1.0", "CPath=/"]);
 
     let cred = rx.recv().unwrap();
     server.close().unwrap();

+ 0 - 6
src/authentication/mod.rs

@@ -168,14 +168,8 @@ fn deserialize_base64<D>(de: &mut D) -> Result<Vec<u8>, D::Error>
     v.from_base64().map_err(|e| serde::Error::custom(e.to_string()))
 }
 
-#[cfg(feature = "discovery")]
 mod discovery;
-#[cfg(feature = "discovery")]
 pub use self::discovery::discovery_login;
-#[cfg(not(feature = "discovery"))]
-pub fn discovery_login(_device_name: &str, _device_id: &str) -> Result<Credentials, ()> {
-    Err(())
-}
 
 #[cfg(feature = "facebook")]
 mod facebook;

+ 1 - 3
src/lib.rs

@@ -19,6 +19,7 @@ extern crate getopts;
 extern crate hyper;
 extern crate linear_map;
 extern crate lmdb_rs;
+extern crate mdns;
 extern crate num;
 extern crate protobuf;
 extern crate shannon;
@@ -39,9 +40,6 @@ extern crate vorbis;
 #[cfg(feature = "with-tremor")]
 extern crate tremor as vorbis;
 
-#[cfg(feature = "dns-sd")]
-extern crate dns_sd;
-
 #[cfg(feature = "openssl")]
 extern crate openssl;
 

+ 1 - 6
src/main_helper.rs

@@ -133,15 +133,10 @@ pub fn get_credentials(session: &Session, matches: &getopts::Matches) -> Credent
         (None, _, Some(credentials))
             => credentials,
 
-        (None, _, None) if cfg!(feature = "discovery") => {
+        (None, _, None) => {
             info!("No username provided and no stored credentials, starting discovery ...");
             discovery_login(&session.config().device_name, session.device_id()).unwrap()
         }
-
-        (None, _, None) => {
-            error!("No credentials provided");
-            exit(1)
-        }
     }
 }