Compare commits
	
		
			3 Commits
		
	
	
		
			61cc570289
			...
			ab8bfbbed3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ab8bfbbed3 | |||
| 94400ba7d5 | |||
| 616600687d | 
| @@ -1 +1 @@ | ||||
| DATABASE_URL=sqlite://creddy.db?mode=rwc | ||||
| DATABASE_URL=sqlite://C:/Users/Joe/AppData/Roaming/creddy/creddy.dev.db | ||||
|   | ||||
							
								
								
									
										13
									
								
								src-tauri/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										13
									
								
								src-tauri/Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -69,6 +69,7 @@ dependencies = [ | ||||
|  "aws-types", | ||||
|  "clap", | ||||
|  "dirs 5.0.1", | ||||
|  "is-terminal", | ||||
|  "netstat2", | ||||
|  "once_cell", | ||||
|  "serde", | ||||
| @@ -2015,6 +2016,18 @@ dependencies = [ | ||||
|  "windows-sys 0.48.0", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "is-terminal" | ||||
| version = "0.4.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" | ||||
| dependencies = [ | ||||
|  "hermit-abi 0.3.1", | ||||
|  "io-lifetimes", | ||||
|  "rustix", | ||||
|  "windows-sys 0.48.0", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "itertools" | ||||
| version = "0.10.5" | ||||
|   | ||||
| @@ -35,6 +35,7 @@ strum_macros = "0.24" | ||||
| auto-launch = "0.4.0" | ||||
| dirs = "5.0" | ||||
| clap = { version = "3.2.23", features = ["derive"] } | ||||
| is-terminal = "0.4.7" | ||||
|  | ||||
| [features] | ||||
| # by default Tauri runs in production mode | ||||
|   | ||||
| @@ -1,8 +1,3 @@ | ||||
| #![cfg_attr( | ||||
|     all(not(debug_assertions), target_os = "windows"), | ||||
|     windows_subsystem = "windows" | ||||
| )] | ||||
|  | ||||
| use std::error::Error; | ||||
|  | ||||
| use once_cell::sync::OnceCell; | ||||
| @@ -32,33 +27,6 @@ use crate::{ | ||||
| pub static APP: OnceCell<AppHandle> = OnceCell::new(); | ||||
|  | ||||
|  | ||||
| async fn setup(app: &mut App) -> Result<(), Box<dyn Error>> { | ||||
|     APP.set(app.handle()).unwrap(); | ||||
|  | ||||
|     let conn_opts = SqliteConnectOptions::new() | ||||
|         .filename(config::get_or_create_db_path()?) | ||||
|         .create_if_missing(true); | ||||
|     let pool_opts = SqlitePoolOptions::new(); | ||||
|     let pool: SqlitePool = pool_opts.connect_with(conn_opts).await?; | ||||
|     sqlx::migrate!().run(&pool).await?; | ||||
|  | ||||
|     let conf = AppConfig::load(&pool).await?; | ||||
|     let session = Session::load(&pool).await?; | ||||
|     let srv = Server::new(conf.listen_addr, conf.listen_port, app.handle()).await?; | ||||
|  | ||||
|     config::set_auto_launch(conf.start_on_login)?; | ||||
|     if !conf.start_minimized { | ||||
|         app.get_window("main") | ||||
|             .ok_or(HandlerError::NoMainWindow)? | ||||
|             .show()?; | ||||
|     } | ||||
|  | ||||
|     let state = AppState::new(conf, session, srv, pool); | ||||
|     app.manage(state); | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
|  | ||||
| pub fn run() -> tauri::Result<()> { | ||||
|     tauri::Builder::default() | ||||
|         .plugin(tauri_plugin_single_instance::init(|app, _argv, _cwd| { | ||||
| @@ -90,3 +58,35 @@ pub fn run() -> tauri::Result<()> { | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
|  | ||||
| pub async fn connect_db() -> Result<SqlitePool, SetupError> { | ||||
|     let conn_opts = SqliteConnectOptions::new() | ||||
|         .filename(config::get_or_create_db_path()?) | ||||
|         .create_if_missing(true); | ||||
|     let pool_opts = SqlitePoolOptions::new(); | ||||
|     let pool: SqlitePool = pool_opts.connect_with(conn_opts).await?; | ||||
|     sqlx::migrate!().run(&pool).await?; | ||||
|     Ok(pool) | ||||
| } | ||||
|  | ||||
|  | ||||
| async fn setup(app: &mut App) -> Result<(), Box<dyn Error>> { | ||||
|     APP.set(app.handle()).unwrap(); | ||||
|  | ||||
|     let pool = connect_db().await?; | ||||
|     let conf = AppConfig::load(&pool).await?; | ||||
|     let session = Session::load(&pool).await?; | ||||
|     let srv = Server::new(conf.listen_addr, conf.listen_port, app.handle()).await?; | ||||
|  | ||||
|     config::set_auto_launch(conf.start_on_login)?; | ||||
|     if !conf.start_minimized { | ||||
|         app.get_window("main") | ||||
|             .ok_or(HandlerError::NoMainWindow)? | ||||
|             .show()?; | ||||
|     } | ||||
|  | ||||
|     let state = AppState::new(conf, session, srv, pool); | ||||
|     app.manage(state); | ||||
|     Ok(()) | ||||
| } | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
| use std::io::{Read, Write}; | ||||
| use std::process::Command as ChildCommand; | ||||
| #[cfg(unix)] | ||||
| use std::os::unix::process::CommandExt; | ||||
| @@ -9,9 +8,14 @@ use clap::{ | ||||
|      ArgMatches, | ||||
|      ArgAction | ||||
|  }; | ||||
| use std::net::TcpStream; | ||||
| use tokio::{ | ||||
|     net::TcpStream, | ||||
|     io::{AsyncReadExt, AsyncWriteExt}, | ||||
| }; | ||||
|  | ||||
|  | ||||
| use crate::app; | ||||
| use crate::config::AppConfig; | ||||
| use crate::credentials::{BaseCredentials, SessionCredentials}; | ||||
| use crate::errors::*; | ||||
|  | ||||
| @@ -98,16 +102,19 @@ pub fn exec(args: &ArgMatches) -> Result<(), CliError> { | ||||
| } | ||||
|  | ||||
|  | ||||
| fn get_credentials(base: bool) -> Result<String, RequestError> { | ||||
| #[tokio::main] | ||||
| async fn get_credentials(base: bool) -> Result<String, RequestError> { | ||||
|     let pool = app::connect_db().await?; | ||||
|     let config = AppConfig::load(&pool).await?; | ||||
|     let path = if base {"/creddy/base-credentials"} else {"/"}; | ||||
|  | ||||
|     let mut stream = TcpStream::connect("127.0.0.1:12345")?; | ||||
|     let mut stream = TcpStream::connect((config.listen_addr, config.listen_port)).await?; | ||||
|     let req = format!("GET {path} HTTP/1.0\r\n\r\n"); | ||||
|     stream.write_all(req.as_bytes())?; | ||||
|     stream.write_all(req.as_bytes()).await?; | ||||
|  | ||||
|     // some day we'll have a proper HTTP parser | ||||
|     let mut buf = vec![0; 8192]; | ||||
|     stream.read_to_end(&mut buf)?; | ||||
|     stream.read_to_end(&mut buf).await?; | ||||
|  | ||||
|     let status = buf.split(|&c| &[c] == b" ") | ||||
|         .skip(1) | ||||
|   | ||||
| @@ -2,6 +2,7 @@ use std::net::Ipv4Addr; | ||||
| use std::path::PathBuf; | ||||
|  | ||||
| use auto_launch::AutoLaunchBuilder; | ||||
| use is_terminal::IsTerminal; | ||||
| use serde::{Serialize, Deserialize}; | ||||
| use sqlx::SqlitePool; | ||||
|  | ||||
| @@ -90,16 +91,17 @@ pub fn set_auto_launch(is_configured: bool) -> Result<(), SetupError> { | ||||
|  | ||||
|  | ||||
| pub fn get_or_create_db_path() -> Result<PathBuf, DataDirError> { | ||||
|     // debug_assertions doesn't always mean we are running in dev | ||||
|     if cfg!(debug_assertions) && std::env::var("HOME").is_ok() { | ||||
|         return Ok(PathBuf::from("./creddy.db")); | ||||
|     } | ||||
|  | ||||
|     let mut path = dirs::data_dir() | ||||
|         .ok_or(DataDirError::NotFound)?; | ||||
|     path.push("creddy"); | ||||
|  | ||||
|     std::fs::create_dir_all(&path)?; | ||||
|     if cfg!(debug_assertions) && std::io::stdout().is_terminal() { | ||||
|         path.push("creddy.dev.db"); | ||||
|     } | ||||
|     else { | ||||
|         path.push("creddy.db"); | ||||
|     } | ||||
|  | ||||
|     Ok(path) | ||||
| } | ||||
|   | ||||
| @@ -198,6 +198,8 @@ pub enum RequestError { | ||||
|     InvalidJson, | ||||
|     #[error("Error reading/writing stream: {0}")] | ||||
|     StreamIOError(#[from] std::io::Error), | ||||
|     #[error("Error loading configuration data: {0}")] | ||||
|     Setup(#[from] SetupError), | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,9 @@ | ||||
| #![cfg_attr( | ||||
|     all(not(debug_assertions), target_os = "windows"), | ||||
|     windows_subsystem = "windows" | ||||
| )] | ||||
|  | ||||
|  | ||||
| mod app; | ||||
| mod cli; | ||||
| mod config; | ||||
|   | ||||
| @@ -59,15 +59,6 @@ impl Handler { | ||||
|             return Ok(()) | ||||
|         } | ||||
|         let base = req_path == b"/creddy/base-credentials"; | ||||
|         if base { | ||||
|             if clients.len() != 1  | ||||
|                 || clients[0].is_none() | ||||
|                 || clients[0].as_ref().unwrap().exe != std::env::current_exe()? | ||||
|             { | ||||
|                 self.stream.write(b"HTTP/1.0 403 Access Denied\r\n\r\n").await?; | ||||
|                 return Ok(()) | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         let req = Request {id: self.request_id, clients, base}; | ||||
|         self.app.emit_all("credentials-request", &req)?; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user