Skip to content

Commit 5ffebcf

Browse files
committed
User activation logic and UI. r=fabrice
1 parent 4c08832 commit 5ffebcf

17 files changed

+256
-63
lines changed

Cargo.lock

Lines changed: 23 additions & 22 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
@@ -125,7 +125,8 @@ Options:
125125
--dns-domain <domain> Set the top level domain for public DNS [default: box.knilxof.org]
126126
--dns-api <url> Set the DNS API endpoint [default: https://knilxof.org:5300]
127127
-c, --config <namespace;key;value> Set configuration override
128-
-h, --help Print this help menu.
128+
-e, --email-server <url> User email server URL. [default: https://knilxof.org:4000]
129+
-h, --help Print this help menu.
129130
",
130131
flag_local_name: String,
131132
flag_port: u16,
@@ -138,7 +139,8 @@ Options:
138139
flag_disable_tls: bool,
139140
flag_dns_domain: String,
140141
flag_dns_api: String,
141-
flag_config: Option<Vec<String>>);
142+
flag_config: Option<Vec<String>>,
143+
flag_email_server: String);
142144

143145
/// Updates local host name with the provided host name string. If requested host name
144146
/// is not available (used by anyone else on the same network) then collision
@@ -292,12 +294,27 @@ fn main() {
292294
args.flag_tunnel_secret,
293295
args.flag_port,
294296
args.flag_wsport,
295-
registrar.get_remote_dns_name())));
297+
registrar.clone().get_remote_dns_name())));
296298
tunnel.as_mut().unwrap().start().unwrap();
297299
}
298300

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

302319
controller.run(&SHUTDOWN_FLAG);
303320

@@ -324,6 +341,7 @@ describe! main {
324341
assert_eq!(args.flag_iface, None);
325342
assert_eq!(args.flag_tunnel, None);
326343
assert_eq!(args.flag_config, None);
344+
assert_eq!(args.flag_email_server, "https://knilxof.org:4000");
327345
assert_eq!(args.flag_help, false);
328346
}
329347

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
}

src/taxonomy_router.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ pub fn create<T>(controller: T, adapter_api: &Arc<AdapterManager>) -> Chain
281281
};
282282

283283
let mut chain = Chain::new(router);
284-
chain.around(controller.get_users_manager().get_middleware(auth_endpoints));
284+
let manager = controller.get_users_manager().clone();
285+
chain.around(manager.read().unwrap().get_middleware(auth_endpoints));
285286

286287
chain
287288
}

0 commit comments

Comments
 (0)