Skip to content

Commit 1220410

Browse files
committed
User activation logic and UI. r=fabrice
1 parent c9100ee commit 1220410

17 files changed

+261
-68
lines changed

Cargo.lock

Lines changed: 28 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ foxbox_taxonomy = { path = "components/taxonomy/" }
2828
openzwave-adapter = { path = "components/openzwave-adapter/" }
2929
tls = { path = "components/tls/" }
3030

31-
foxbox_users = { git = "https://github.com/fxbox/users.git", rev = "ec53c3a" }
31+
foxbox_users = { git = "https://github.com/ferjm/users.git", branch = "user.activation" }
3232
iron-cors = { git = "https://github.com/fxbox/iron-cors.git", rev = "f397cd2" }
3333
multicast_dns = { git = "https://github.com/fxbox/multicast-dns.git", rev = "a6e4bcc" }
3434

components/core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ features = ["ssl"]
1717

1818
[dependencies]
1919
clippy = "0.0.71"
20-
foxbox_users = { git = "https://github.com/fxbox/users.git", rev = "ec53c3a" }
20+
foxbox_users = { git = "https://github.com/ferjm/users.git", branch = "user.activation" }
2121
hyper = "0.8.1"
2222
libc = "0.2.7"
2323
log = "0.3"

components/core/src/traits.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use serde_json;
1010
use std::io;
1111
use std::net::SocketAddr;
1212
use std::sync::atomic::AtomicBool;
13-
use std::sync::Arc;
13+
use std::sync::{ Arc, RwLock };
1414
use std::vec::IntoIter;
1515
use tls::{ CertificateRecord, CertificateManager };
1616
use upnp::UpnpManager;
@@ -34,6 +34,6 @@ pub trait Controller : Send + Sync + Clone + Reflect + 'static {
3434

3535
fn get_config(&self) -> Arc<ConfigService>;
3636
fn get_upnp_manager(&self) -> Arc<UpnpManager>;
37-
fn get_users_manager(&self) -> Arc<UsersManager>;
37+
fn get_users_manager(&self) -> Arc<RwLock<UsersManager>>;
3838
fn get_profile(&self) -> &ProfileService;
3939
}

src/controller.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use std::io;
1818
use std::net::SocketAddr;
1919
use std::net::ToSocketAddrs;
2020
use std::path::PathBuf;
21-
use std::sync::{ Arc, Mutex };
21+
use std::sync::{ Arc, Mutex, RwLock };
2222
use std::sync::atomic::{ AtomicBool, Ordering };
2323
use std::vec::IntoIter;
2424
use tls::{ CertificateManager, CertificateRecord, SniSslContextProvider, TlsOption };
@@ -36,7 +36,7 @@ pub struct FoxBox {
3636
websockets: Arc<Mutex<HashMap<ws::util::Token, ws::Sender>>>,
3737
pub config: Arc<ConfigService>,
3838
upnp: Arc<UpnpManager>,
39-
users_manager: Arc<UsersManager>,
39+
users_manager: Arc<RwLock<UsersManager>>,
4040
profile_service: Arc<ProfileService>,
4141
}
4242

@@ -64,7 +64,7 @@ impl FoxBox {
6464
ws_port: ws_port,
6565
config: config,
6666
upnp: Arc::new(UpnpManager::new()),
67-
users_manager: Arc::new(UsersManager::new(&profile_service.path_for("users_db.sqlite"))),
67+
users_manager: Arc::new(RwLock::new(UsersManager::new(&profile_service.path_for("users_db.sqlite")))),
6868
profile_service: Arc::new(profile_service)
6969
}
7070
}
@@ -150,7 +150,7 @@ impl Controller for FoxBox {
150150
self.upnp.clone()
151151
}
152152

153-
fn get_users_manager(&self) -> Arc<UsersManager> {
153+
fn get_users_manager(&self) -> Arc<RwLock<UsersManager>> {
154154
self.users_manager.clone()
155155
}
156156

src/http_server.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,12 @@ impl<T: Controller> HttpServer<T> {
6969
adapter_api);
7070

7171
let users_manager = self.controller.get_users_manager();
72+
let guard = users_manager.read().unwrap();
7273
let mut mount = Mount::new();
7374
mount.mount("/", static_router::create(users_manager.clone()))
7475
.mount("/ping", Ping)
7576
.mount("/api/v1", taxonomy_chain)
76-
.mount("/users", users_manager.get_router_chain());
77+
.mount("/users", guard.get_router_chain());
7778

7879
let mut chain = Chain::new(mount);
7980
chain.link_after(Custom404);

src/main.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ Options:
123123
--dns-domain <domain> Set the top level domain for public DNS [default: box.knilxof.org]
124124
--dns-api <url> Set the DNS API endpoint [default: https://knilxof.org:5300]
125125
-c, --config <namespace;key;value> Set configuration override
126-
-h, --help Print this help menu.
126+
-e, --email-server <url> User email server URL. [default: https://knilxof.org:4000]
127+
-h, --help Print this help menu.
127128
",
128129
flag_local_name: String,
129130
flag_port: u16,
@@ -136,7 +137,8 @@ Options:
136137
flag_disable_tls: bool,
137138
flag_dns_domain: String,
138139
flag_dns_api: String,
139-
flag_config: Option<Vec<String>>);
140+
flag_config: Option<Vec<String>>,
141+
flag_email_server: String);
140142

141143
/// Updates local host name with the provided host name string. If requested host name
142144
/// is not available (used by anyone else on the same network) then collision
@@ -290,12 +292,27 @@ fn main() {
290292
args.flag_tunnel_secret,
291293
args.flag_port,
292294
args.flag_wsport,
293-
registrar.get_remote_dns_name())));
295+
registrar.clone().get_remote_dns_name())));
294296
tunnel.as_mut().unwrap().start().unwrap();
295297
}
296298

297-
registrar.start(args.flag_iface, &tunnel,
298-
args.flag_port, &controller);
299+
registrar.clone().start(args.flag_iface, &tunnel,
300+
args.flag_port, &controller);
301+
302+
let mut invitation_prepath = if controller.get_tls_enabled() {
303+
String::from("https://")
304+
} else {
305+
String::from("http://")
306+
};
307+
308+
invitation_prepath = format!("{}{}/users", invitation_prepath,
309+
registrar.get_remote_dns_name());
310+
311+
let manager = controller.get_users_manager().clone();
312+
manager.write().unwrap().setup_invitation_middleware(
313+
args.flag_email_server,
314+
invitation_prepath
315+
);
299316

300317
controller.run(&SHUTDOWN_FLAG);
301318

@@ -322,6 +339,7 @@ describe! main {
322339
assert_eq!(args.flag_iface, None);
323340
assert_eq!(args.flag_tunnel, None);
324341
assert_eq!(args.flag_config, None);
342+
assert_eq!(args.flag_email_server, "https://knilxof.org:4000");
325343
assert_eq!(args.flag_help, false);
326344
}
327345

src/registration.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
/// after trying more aggressively at first run.
88
99
extern crate get_if_addrs;
10-
extern crate hyper;
1110

12-
use self::hyper::Client;
13-
use self::hyper::header::Connection;
14-
use self::hyper::status::StatusCode;
11+
use hyper::Client;
12+
use hyper::header::Connection;
13+
use hyper::status::StatusCode;
1514
use self::get_if_addrs::{ IfAddr, Interface };
1615
use foxbox_core::traits::Controller;
1716
use serde_json;
@@ -23,6 +22,7 @@ use tunnel_controller:: { Tunnel };
2322

2423
const REGISTRATION_INTERVAL_IN_MINUTES: u32 = 1;
2524

25+
#[derive(Clone)]
2626
pub struct Registrar {
2727
certificate_manager: CertificateManager,
2828
top_level_domain: String,

src/static_router.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use iron::status;
99
use router::Router;
1010
use staticfile::Static;
1111
use std::path::Path;
12-
use std::sync::Arc;
12+
use std::sync::{ Arc, RwLock };
1313

1414
fn handler(req: &mut Request, db: &UsersDb) -> IronResult<Response> {
1515
let handler = match db.read(ReadFilter::IsAdmin(true)) {
@@ -27,15 +27,15 @@ fn handler(req: &mut Request, db: &UsersDb) -> IronResult<Response> {
2727
Handler::handle(&handler, req)
2828
}
2929

30-
pub fn create(manager: Arc<UsersManager>) -> Router {
30+
pub fn create(manager: Arc<RwLock<UsersManager>>) -> Router {
3131
let mut router = Router::new();
32-
let usersmanager = manager.clone();
32+
let cloned = manager.clone();
3333
router.any("", move |req: &mut Request| -> IronResult<Response> {
34-
handler(req, &usersmanager.get_db())
34+
handler(req, &cloned.read().unwrap().get_db())
3535
});
36-
let usersmanager = manager.clone();
36+
let manager = manager.clone();
3737
router.any("*", move |req: &mut Request| -> IronResult<Response> {
38-
handler(req, &usersmanager.get_db())
38+
handler(req, &manager.read().unwrap().get_db())
3939
});
4040
router
4141
}

0 commit comments

Comments
 (0)