From e649919e830748b49cf1742156979ebd99280263 Mon Sep 17 00:00:00 2001 From: Ryan Petschek Date: Tue, 29 Jan 2019 16:10:29 -0500 Subject: [PATCH] Add second binary configuration for client / server model Now requires Rust Nightly. See https://github.com/rust-lang/rls/issues/1011#issuecomment-456498046 for help with RLS using nightly while it's currently broken --- .vscode/settings.json | 4 ++++ Cargo.toml | 14 ++++++++++++++ Rocket.toml | 10 ++++++++++ src/{ => client}/api.rs | 17 ++++++++++------- src/{ => client}/badge.rs | 0 src/{ => client}/main.rs | 11 ++++++++--- src/{ => client}/ndef.rs | 0 src/server/main.rs | 21 +++++++++++++++++++++ src/server/ui/index.hbs | 10 ++++++++++ 9 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 Rocket.toml rename src/{ => client}/api.rs (86%) rename src/{ => client}/badge.rs (100%) rename src/{ => client}/main.rs (88%) rename src/{ => client}/ndef.rs (100%) create mode 100644 src/server/main.rs create mode 100644 src/server/ui/index.hbs diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e2b3555 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "rust.wait_to_build": 500, + "rust-client.disableRustup": true +} diff --git a/Cargo.toml b/Cargo.toml index cf588b4..e3394d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,14 @@ version = "0.1.0" authors = ["Ryan Petschek "] edition = "2018" +[[bin]] +name = "client" +path = "src/client/main.rs" + +[[bin]] +name = "server" +path = "src/server/main.rs" + [dependencies] pcsc = "2" url = "1.7.2" @@ -11,3 +19,9 @@ reqwest = "0.9.9" regex = "1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.37" +rocket = "0.4.0" + +[dependencies.rocket_contrib] +version = "0.4.0" +default-features = false +features = ["json", "serve", "handlebars_templates"] diff --git a/Rocket.toml b/Rocket.toml new file mode 100644 index 0000000..9db1d0f --- /dev/null +++ b/Rocket.toml @@ -0,0 +1,10 @@ +[global] +template_dir = "src/server/ui" + +[development] +address = "localhost" +port = 3000 + +[production] +address = "0.0.0.0" +port = 3000 # Check this @EhsanDB diff --git a/src/api.rs b/src/client/api.rs similarity index 86% rename from src/api.rs rename to src/client/api.rs index e226bf4..69dc038 100644 --- a/src/api.rs +++ b/src/client/api.rs @@ -27,7 +27,6 @@ impl From<&'static str> for Error { pub struct CheckinAPI { client: reqwest::Client, - username: String, auth_token: String, } @@ -72,7 +71,6 @@ impl CheckinAPI { token.insert_str(0, "auth="); Ok(Self { client, - username: username.to_owned(), auth_token: token, }) }, @@ -80,6 +78,11 @@ impl CheckinAPI { } } + pub fn from_token(auth_token: String) -> Self { + let client = reqwest::Client::new(); + Self { client, auth_token } + } + fn checkin_action(&self, check_in: bool, uuid: &str, tag: &str) -> Result { let action = if check_in { "check_in" } else { "check_out" }; let query = format!( @@ -121,15 +124,15 @@ impl CheckinAPI { } #[cfg(test)] -mod tests { +mod checkin_api_tests { use super::CheckinAPI; #[test] fn login() { - let username = env!("USERNAME"); - let password = env!("PASSWORD"); + let username = std::env::var("USERNAME").unwrap(); + let password = std::env::var("PASSWORD").unwrap(); - let instance = CheckinAPI::login(username, password).unwrap(); - assert_eq!(instance.username, username); + let instance = CheckinAPI::login(&username, &password).unwrap(); + assert!(instance.auth_token.len() == 64); } } diff --git a/src/badge.rs b/src/client/badge.rs similarity index 100% rename from src/badge.rs rename to src/client/badge.rs diff --git a/src/main.rs b/src/client/main.rs similarity index 88% rename from src/main.rs rename to src/client/main.rs index 3677c76..9046464 100644 --- a/src/main.rs +++ b/src/client/main.rs @@ -10,6 +10,8 @@ mod api; use api::CheckinAPI; fn main() { + let api = CheckinAPI::login("ryan", "test").unwrap(); + let ctx = Context::establish(Scope::User).expect("Failed to establish context"); let mut readers_buf = [0; 2048]; @@ -50,7 +52,7 @@ fn main() { // Debounce repeated events if rs.event_state().intersects(State::PRESENT) { if !readers.get(&name).unwrap_or(&false) { - card_tapped(&ctx, rs.name()); + card_tapped(&ctx, rs.name(), &api); } readers.insert(name, true); } @@ -61,7 +63,7 @@ fn main() { } } -fn card_tapped(ctx: &Context, reader: &std::ffi::CStr) { +fn card_tapped(ctx: &Context, reader: &std::ffi::CStr, api: &CheckinAPI) { // Connect to the card. let card = match ctx.connect(reader, ShareMode::Shared, Protocols::ANY) { Ok(card) => card, @@ -77,7 +79,10 @@ fn card_tapped(ctx: &Context, reader: &std::ffi::CStr) { let badge = badge::NFCBadge::new(&card); match badge.get_user_id() { - Ok(id) => println!("ID is {}", id), + Ok(id) => { + let name = api.check_in(&id, "123").unwrap(); + println!("Checked in {}", name); + }, Err(err) => println!("Error getting user ID: {:?}", err), } } diff --git a/src/ndef.rs b/src/client/ndef.rs similarity index 100% rename from src/ndef.rs rename to src/client/ndef.rs diff --git a/src/server/main.rs b/src/server/main.rs new file mode 100644 index 0000000..fe62eac --- /dev/null +++ b/src/server/main.rs @@ -0,0 +1,21 @@ +#![feature(proc_macro_hygiene, decl_macro)] +#[macro_use] extern crate rocket; + +use std::collections::HashMap; + +use rocket_contrib::serve::StaticFiles; +use rocket_contrib::templates::Template; + +#[get("/")] +fn index() -> Template { + let context: HashMap<&str, &str> = HashMap::new(); + Template::render("index", &context) +} + +fn main() { + rocket::ignite() + .attach(Template::fairing()) + .mount("/", routes![index]) + .mount("/css", StaticFiles::from("/ui/css")) + .launch(); +} diff --git a/src/server/ui/index.hbs b/src/server/ui/index.hbs new file mode 100644 index 0000000..6a5f6c2 --- /dev/null +++ b/src/server/ui/index.hbs @@ -0,0 +1,10 @@ + + + + HackGT Check In Administration + + + +

Hello, world!!

+ +