aboutsummaryrefslogtreecommitdiffstats
path: root/src/command/login.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/login.rs')
-rw-r--r--src/command/login.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/command/login.rs b/src/command/login.rs
new file mode 100644
index 00000000..4f58b77f
--- /dev/null
+++ b/src/command/login.rs
@@ -0,0 +1,48 @@
+use std::collections::HashMap;
+use std::fs::File;
+use std::io::prelude::*;
+
+use eyre::Result;
+use structopt::StructOpt;
+
+use crate::settings::Settings;
+
+#[derive(StructOpt)]
+#[structopt(setting(structopt::clap::AppSettings::DeriveDisplayOrder))]
+pub struct Cmd {
+ #[structopt(long, short)]
+ pub username: String,
+
+ #[structopt(long, short)]
+ pub password: String,
+
+ #[structopt(long, short, about = "the encryption key for your account")]
+ pub key: String,
+}
+
+impl Cmd {
+ pub fn run(&self, settings: &Settings) -> Result<()> {
+ let mut map = HashMap::new();
+ map.insert("username", self.username.clone());
+ map.insert("password", self.password.clone());
+
+ let url = format!("{}/login", settings.local.sync_address);
+ let client = reqwest::blocking::Client::new();
+ let resp = client.post(url).json(&map).send()?;
+
+ let session = resp.json::<HashMap<String, String>>()?;
+ let session = session["session"].clone();
+
+ let session_path = settings.local.session_path.as_str();
+ let mut file = File::create(session_path)?;
+ file.write_all(session.as_bytes())?;
+
+ let key_path = settings.local.key_path.as_str();
+ let mut file = File::create(key_path)?;
+ file.write_all(&base64::decode(self.key.clone())?)?;
+
+ println!("Logged in!");
+
+ Ok(())
+ }
+}