@smbcloud / cli / commits / f94cda9

Login with github

Seto Elkahfi committed Sep 10, 2023 at 23:20 UTC f94cda9cb19692cc374023a15c88f51da5cc68d4
7 files changed +74 -58
Cargo.lock
+18 -4
@@ -305,10 +305,22 @@ dependencies = [
305 ]
306
307 [[package]]
308 -name = "dotenv"
309 -version = "0.15.0"
308 +name = "dotenvy"
309 +version = "0.15.7"
310 source = "registry+https://github.com/rust-lang/crates.io-index"
311 -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
311 +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
312 +
313 +[[package]]
314 +name = "dotenvy_macro"
315 +version = "0.15.7"
316 +source = "registry+https://github.com/rust-lang/crates.io-index"
317 +checksum = "cb0235d912a8c749f4e0c9f18ca253b4c28cfefc1d2518096016d6e3230b6424"
318 +dependencies = [
319 + "dotenvy",
320 + "proc-macro2",
321 + "quote",
322 + "syn 1.0.107",
323 +]
324
325 [[package]]
326 name = "encode_unicode"
@@ -1280,7 +1292,7 @@ dependencies = [
1292 "console",
1293 "dialoguer",
1294 "dirs",
1283 - "dotenv",
1295 + "dotenvy",
1296 "home",
1297 "log",
1298 "open",
@@ -1319,6 +1331,8 @@ dependencies = [
1331 "anyhow",
1332 "async-trait",
1333 "dirs",
1334 + "dotenvy",
1335 + "dotenvy_macro",
1336 "home",
1337 "log",
1338 "maybe-async",
smbpndk-cli/Cargo.toml
+1 -1
@@ -26,7 +26,7 @@ clap_mangen = "0.2.10"
26 console = "0.15.0"
27 dialoguer = "0.10.4"
28 dirs = "4.0.0"
29 -dotenv = "0.15.0"
29 +dotenvy = "0.15"
30 home = "0.5.4"
31 log = "0.4.14"
32 open = "4.0.1"
smbpndk-cli/src/account/lib.rs
+43 -2
@@ -2,16 +2,17 @@ use anyhow::{anyhow, Result};
2 use console::style;
3 use log::debug;
4 use regex::Regex;
5 -use reqwest::{Client, StatusCode};
5 +use reqwest::{Client, StatusCode, Response};
6 use serde::{Deserialize, Serialize};
7
8 use serde_repr::Deserialize_repr;
9 +use smbpndk_model::CommandResult;
10 use smbpndk_networking::smb_base_url_builder;
11 use spinners::Spinner;
12 use std::{
13 env,
14 fmt::{Display, Formatter},
14 - fs,
15 + fs::{self, create_dir_all, OpenOptions},
16 io::{BufRead, BufReader, Write},
17 net::{TcpListener, TcpStream},
18 sync::mpsc::{self, Receiver, Sender},
@@ -177,6 +178,7 @@ pub async fn process_connect_github(code: String) -> Result<SmbAuthorization> {
178 StatusCode::OK => {
179 // Account authorized and token received
180 spinner.stop_and_persist("✅", "You're logged in with your GitHub account!".into());
181 + save_token(&response).await?;
182 let result = response.json().await?;
183 println!("Result: {:#?}", &result);
184 Ok(result)
@@ -234,3 +236,42 @@ fn github_base_url_builder() -> URLBuilder {
236 .add_param("redirect_uri", &redirect_url);
237 url_builder
238 }
239 +
240 +
241 +pub async fn save_token(response: &Response) -> Result<CommandResult> {
242 + let headers = response.headers();
243 + println!("Headers: {:#?}", &headers);
244 + match headers.get("Authorization") {
245 + Some(token) => {
246 + debug!("{}", token.to_str()?);
247 + match home::home_dir() {
248 + Some(path) => {
249 + debug!("{}", path.to_str().unwrap());
250 + create_dir_all(path.join(".smb"))?;
251 + let mut file = OpenOptions::new()
252 + .create(true)
253 + .write(true)
254 + .open([path.to_str().unwrap(), "/.smb/token"].join(""))?;
255 + file.write_all(token.to_str()?.as_bytes())?;
256 +
257 + Ok(CommandResult {
258 + spinner: Spinner::new(
259 + spinners::Spinners::SimpleDotsScrolling,
260 + style("Logging you in...").green().bold().to_string(),
261 + ),
262 + symbol: "✅".to_owned(),
263 + msg: "You are logged in!".to_owned(),
264 + })
265 + }
266 + None => {
267 + let error = anyhow!("Failed to get home directory.");
268 + return Err(error);
269 + }
270 + }
271 + }
272 + None => {
273 + let error = anyhow!("Failed to get token. Probably a backend issue.");
274 + return Err(error);
275 + }
276 + }
277 +}
\ No newline at end of file
smbpndk-cli/src/account/login/process.rs
+4 -44
@@ -1,6 +1,6 @@
1 use crate::account::{
2 forgot::{Param, UserUpdatePassword},
3 - lib::{authorize_github, ErrorCode, GithubInfo, SmbAuthorization},
3 + lib::{authorize_github, ErrorCode, GithubInfo, SmbAuthorization, save_token},
4 model::{Data, Status, User},
5 signup::{
6 do_signup, GithubEmail, Provider, SignupGithubParams, SignupMethod, SignupUserGithub,
@@ -10,17 +10,14 @@ use anyhow::{anyhow, Result};
10 use console::{style, Term};
11 use dialoguer::{theme::ColorfulTheme, Confirm, Input, Password, Select};
12 use log::debug;
13 -use reqwest::{Client, Response, StatusCode};
13 +use reqwest::{Client, StatusCode};
14 use serde::{Deserialize, Serialize};
15
16 use smbpndk_model::CommandResult;
17 use smbpndk_networking::smb_base_url_builder;
18 use smbpndk_utils::email_validation;
19 use spinners::Spinner;
20 -use std::{
21 - fs::{self, create_dir_all, OpenOptions},
22 - io::Write,
23 -};
20 +use std::fs::{self};
21
22 pub struct LoginArgs {
23 pub username: String,
@@ -233,7 +230,7 @@ async fn do_process_login(args: LoginArgs) -> Result<CommandResult> {
230 match response.status() {
231 StatusCode::OK => {
232 // Login successful
236 - save_token(response).await
233 + save_token(&response).await
234 }
235 StatusCode::NOT_FOUND => {
236 // Account not found and we show signup option
@@ -259,43 +256,6 @@ async fn do_process_login(args: LoginArgs) -> Result<CommandResult> {
256 }
257 }
258
262 -async fn save_token(response: Response) -> Result<CommandResult> {
263 - let headers = response.headers();
264 - match headers.get("Authorization") {
265 - Some(token) => {
266 - debug!("{}", token.to_str()?);
267 - match home::home_dir() {
268 - Some(path) => {
269 - debug!("{}", path.to_str().unwrap());
270 - create_dir_all(path.join(".smb"))?;
271 - let mut file = OpenOptions::new()
272 - .create(true)
273 - .write(true)
274 - .open([path.to_str().unwrap(), "/.smb/token"].join(""))?;
275 - file.write_all(token.to_str()?.as_bytes())?;
276 -
277 - Ok(CommandResult {
278 - spinner: Spinner::new(
279 - spinners::Spinners::SimpleDotsScrolling,
280 - style("Logging you in...").green().bold().to_string(),
281 - ),
282 - symbol: "✅".to_owned(),
283 - msg: "You are logged in!".to_owned(),
284 - })
285 - }
286 - None => {
287 - let error = anyhow!("Failed to get home directory.");
288 - return Err(error);
289 - }
290 - }
291 - }
292 - None => {
293 - let error = anyhow!("Failed to get token. Probably a backend issue.");
294 - return Err(error);
295 - }
296 - }
297 -}
298 -
259 async fn verify_or_set_password(result: SmbAuthorization) -> Result<CommandResult> {
260 match result.error_code {
261 Some(error_code) => {
smbpndk-cli/src/main.rs
+1 -1
@@ -2,7 +2,7 @@ use anyhow::{anyhow, Result};
2 use app_oten::{self, handler::process_auth_app};
3 use clap::Parser;
4 use console::style;
5 -use dotenv::dotenv;
5 +use dotenvy::dotenv;
6 use smbpndk_cli::{
7 account::process_account,
8 cli::{Cli, Commands},
smbpndk-networking/Cargo.toml
+2
@@ -17,6 +17,8 @@ async-trait = { version = "0.1.51", optional = true }
17 dirs = "4.0.0"
18 home = "0.5.4"
19 log = "0.4.14"
20 +dotenvy = "0.15"
21 +dotenvy_macro = "0.15"
22 maybe-async = { version = "0.2", features = ["is_sync"] }
23 reqwest = { version = "0.11", features = ["json"] }
24 serde = { version = "1", features = ["derive"] }
smbpndk-networking/src/lib.rs
+5 -6
@@ -1,10 +1,9 @@
1 pub mod constants;
2
3 -use std::env;
4 -
3 use anyhow::{anyhow, Result};
4 use log::debug;
5 use url_builder::URLBuilder;
6 +use dotenvy_macro::dotenv;
7
8 pub async fn get_token() -> Result<String> {
9 if let Some(mut path) = dirs::home_dir() {
@@ -19,10 +18,10 @@ pub async fn get_token() -> Result<String> {
18 }
19
20 pub fn smb_base_url_builder() -> URLBuilder {
22 - let client_id = env::var("SMB_CLIENT_ID").expect("Please set SMB_CLIENT_ID");
23 - let client_secret = env::var("SMB_CLIENT_SECRET").expect("Please set SMB_CLIENT_SECRET");
24 - let api_host = env::var("SMB_API_HOST").expect("Please set SMB_API_HOST");
25 - let api_protocol = env::var("SMB_API_PROTOCOL").expect("Please set SMB_API_PROTOCOL");
21 + let client_id = dotenv!("SMB_CLIENT_ID", "Please set SMB_CLIENT_ID");
22 + let client_secret = dotenv!("SMB_CLIENT_SECRET", "Please set SMB_CLIENT_SECRET");
23 + let api_host = dotenv!("SMB_API_HOST", "Please set SMB_API_HOST");
24 + let api_protocol = dotenv!("SMB_API_PROTOCOL", "Please set SMB_API_PROTOCOL");
25 let mut url_builder = URLBuilder::new();
26 url_builder
27 .set_protocol(&api_protocol)