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| {
|
||||
@ -89,4 +57,36 @@ 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)?;
|
||||
path.push("creddy.db");
|
||||
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,16 +59,7 @@ 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)?;
|
||||
let starting_visibility = self.show_window()?;
|
||||
|
Loading…
x
Reference in New Issue
Block a user