Compare commits

...

3 Commits

Author SHA1 Message Date
ac62171467 upgrade to tauri 2.2.0 2025-01-04 10:50:04 -05:00
2080fb897b fix autolaunch name in dev/prod 2025-01-03 16:43:45 -05:00
bf62054c2b make windows work again 2025-01-03 07:52:10 -05:00
23 changed files with 3698 additions and 2150 deletions

92
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "creddy", "name": "creddy",
"version": "0.4.9", "version": "0.6.4",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "creddy", "name": "creddy",
"version": "0.4.9", "version": "0.6.4",
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2.0.0-beta.13", "@tauri-apps/api": "^2.0.0-beta.13",
"@tauri-apps/plugin-dialog": "^2.0.0-beta.5", "@tauri-apps/plugin-dialog": "^2.0.0-beta.5",
@ -15,7 +15,7 @@
}, },
"devDependencies": { "devDependencies": {
"@sveltejs/vite-plugin-svelte": "^1.0.1", "@sveltejs/vite-plugin-svelte": "^1.0.1",
"@tauri-apps/cli": "^2.0.0-beta.20", "@tauri-apps/cli": "^2.2.1",
"autoprefixer": "^10.4.8", "autoprefixer": "^10.4.8",
"postcss": "^8.4.16", "postcss": "^8.4.16",
"svelte": "^3.49.0", "svelte": "^3.49.0",
@ -213,9 +213,9 @@
} }
}, },
"node_modules/@tauri-apps/cli": { "node_modules/@tauri-apps/cli": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.2.1.tgz",
"integrity": "sha512-707q9uIc2oNrYHd2dtMvxTrpZXVpart5EIktnRymNOpphkLlB6WUBjHD+ga45WqTU6cNGKbYvkKqTNfshNul9Q==", "integrity": "sha512-oLWX/2tW0v8cBaShI9/bt5RsquCLK7ZCwhPXXnf55oil8/GrNtLzW9/67iyydcnxiYYU5jYMpo3uXptknOSdpA==",
"dev": true, "dev": true,
"bin": { "bin": {
"tauri": "tauri.js" "tauri": "tauri.js"
@ -228,22 +228,22 @@
"url": "https://opencollective.com/tauri" "url": "https://opencollective.com/tauri"
}, },
"optionalDependencies": { "optionalDependencies": {
"@tauri-apps/cli-darwin-arm64": "2.0.0-beta.20", "@tauri-apps/cli-darwin-arm64": "2.2.1",
"@tauri-apps/cli-darwin-x64": "2.0.0-beta.20", "@tauri-apps/cli-darwin-x64": "2.2.1",
"@tauri-apps/cli-linux-arm-gnueabihf": "2.0.0-beta.20", "@tauri-apps/cli-linux-arm-gnueabihf": "2.2.1",
"@tauri-apps/cli-linux-arm64-gnu": "2.0.0-beta.20", "@tauri-apps/cli-linux-arm64-gnu": "2.2.1",
"@tauri-apps/cli-linux-arm64-musl": "2.0.0-beta.20", "@tauri-apps/cli-linux-arm64-musl": "2.2.1",
"@tauri-apps/cli-linux-x64-gnu": "2.0.0-beta.20", "@tauri-apps/cli-linux-x64-gnu": "2.2.1",
"@tauri-apps/cli-linux-x64-musl": "2.0.0-beta.20", "@tauri-apps/cli-linux-x64-musl": "2.2.1",
"@tauri-apps/cli-win32-arm64-msvc": "2.0.0-beta.20", "@tauri-apps/cli-win32-arm64-msvc": "2.2.1",
"@tauri-apps/cli-win32-ia32-msvc": "2.0.0-beta.20", "@tauri-apps/cli-win32-ia32-msvc": "2.2.1",
"@tauri-apps/cli-win32-x64-msvc": "2.0.0-beta.20" "@tauri-apps/cli-win32-x64-msvc": "2.2.1"
} }
}, },
"node_modules/@tauri-apps/cli-darwin-arm64": { "node_modules/@tauri-apps/cli-darwin-arm64": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.2.1.tgz",
"integrity": "sha512-oCJOCib7GuYkwkBXx+ekamR8NZZU+2i3MLP+DHpDxK5gS2uhCE+CBkamJkNt6y1x6xdVnwyqZOm5RvN4SRtyIA==", "integrity": "sha512-658OPWObcEA7x/Pe/fAXfyJtC5SdcpD2Q9ZSVKoLBovPzfU6Ug2mCaQmH1L5iA7Zb7a26ctzkaz3Sh3dMeGcJw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -257,9 +257,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-darwin-x64": { "node_modules/@tauri-apps/cli-darwin-x64": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.2.1.tgz",
"integrity": "sha512-lC5QSnRExedYN4Ds6ZlSvC2PxP8qfIYBJQ5ktf+PJI5gQALdNeVtd6YnTG1ODCEklfLq9WKkGwp7JdALTU5wDA==", "integrity": "sha512-3g11km4caJa6StvETI5GIynniNC/e9AWpUy+lWQRfQBdelRrEGoEDw949SihxqKHAoP2E9cm7z5DUsiRiT/Yaw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -273,9 +273,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.2.1.tgz",
"integrity": "sha512-nZCeBMHHye5DLOJV5k2w658hnCS+LYaOZ8y/G9l3ei+g0L/HBjlSy6r4simsAT5TG8+l3oCZzLBngfTMdDS/YA==", "integrity": "sha512-Ldbw3Y56TAfpsGRuWJnkdl0TV0NHhtP3bGyjh2lJACofkHMCOtsLHOx4/HP2hFnn7DcSLWHUayyPlj2rAikKkA==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -289,9 +289,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-linux-arm64-gnu": { "node_modules/@tauri-apps/cli-linux-arm64-gnu": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.2.1.tgz",
"integrity": "sha512-B79ISVLPVBgwnCchVqwTKU+vxnFYqxKomcR4rmsvxfs0NVtT5QuNzE1k4NUQnw3966yjwhYR3mnHsSJQSB4Eyw==", "integrity": "sha512-ay3NwilDR95RyvK/AIdivuULcbpGgrUISNLDOfTKEvKMMnRWkMV4gzY3hifQ8H7CDonGhqMl2PjP+WvDQpXUig==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -305,9 +305,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-linux-arm64-musl": { "node_modules/@tauri-apps/cli-linux-arm64-musl": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.1.tgz",
"integrity": "sha512-ojIkv/1uZHhcrgfIN8xgn4BBeo/Xg+bnV0wer6lD78zyxkUMWeEZ+u3mae1ejCJNhhaZOxNaUQ67MvDOiGyr5Q==", "integrity": "sha512-d2zK4Qb9DZlNjNB8Fda0yxOlg6sk6GZGhO5dVnie5VYJMt4lDct2LZljg4boUb5t1pk6sfAPB9356G7R8l4qCQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -321,9 +321,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-linux-x64-gnu": { "node_modules/@tauri-apps/cli-linux-x64-gnu": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.2.1.tgz",
"integrity": "sha512-xBy1FNbHKlc7T6pOmFQQPECxJaI5A9QWX7Kb9N64cNVusoOGlvc3xHYkXMS4PTr7xXOT0yiE1Ww2OwDRJ3lYsg==", "integrity": "sha512-P0Zm3nmRbBS/KIxSrzul2ieZEwtTdU4bjsB9pOIk+oPF15HXnrLLbVBeMofNjXOWsIxTJw2tIt/XPD8Jt9jSEg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -337,9 +337,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-linux-x64-musl": { "node_modules/@tauri-apps/cli-linux-x64-musl": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.1.tgz",
"integrity": "sha512-+O6zq5jmtUxA1FUAAwF2ywPysy4NRo2Y6G+ESZDkY9XosRwdt5OUjqAsYktZA3AxDMZVei8r9buwTqUwi9ny/g==", "integrity": "sha512-AwYuKTpPGdR0BJMDdJsjGm8vfVDBpXYRDJ+1B/FlIMTikAx4A/wSODxphjf6Ls9uOC5F3To0XlfqskBkTq0WKw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -353,9 +353,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-win32-arm64-msvc": { "node_modules/@tauri-apps/cli-win32-arm64-msvc": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.2.1.tgz",
"integrity": "sha512-RswgMbWyOQcv53CHvIuiuhAh4kKDqaGyZfWD4VlxqX/XhkoF5gsNgr0MxzrY7pmoL+89oVI+fiGVJz4nOQE5vA==", "integrity": "sha512-t1Pv+Og5O+Cp0uYHFzSWEl+hssr1bKJjgWg05ElTpwYMb4xKA5bh1BTGN5orGqKs0e2+D+EPsOqVfM8KuUWR4Q==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -369,9 +369,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-win32-ia32-msvc": { "node_modules/@tauri-apps/cli-win32-ia32-msvc": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.2.1.tgz",
"integrity": "sha512-5lgWmDVXhX3SBGbiv5SduM1yajiRnUEJClWhSdRrEEJeXdsxpCsBEhxYnUnDCEzPKxLLn5fdBv3VrVctJ03csQ==", "integrity": "sha512-erY+Spho6hBJgNzHKbA3JFxMztlHAikCiF/OYhk9fy6MbU5KpYHPrAC+Jhj2tcDy/xevWw/6KVNvLmk9PhLcXQ==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -385,9 +385,9 @@
} }
}, },
"node_modules/@tauri-apps/cli-win32-x64-msvc": { "node_modules/@tauri-apps/cli-win32-x64-msvc": {
"version": "2.0.0-beta.20", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.0.0-beta.20.tgz", "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.2.1.tgz",
"integrity": "sha512-SuSiiVQTQPSzWlsxQp/NMzWbzDS9TdVDOw7CCfgiG5wnT2GsxzrcIAVN6i7ILsVFLxrjr0bIgPldSJcdcH84Yw==", "integrity": "sha512-GIdUtdje1CvCn0/Sh3VwPWaFKmD1C0edJUMueGwkRFHmF6HfatXPVhW5FySP+EEO2+rVym1qJkODstJrunraWA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],

View File

@ -1,6 +1,6 @@
{ {
"name": "creddy", "name": "creddy",
"version": "0.6.3", "version": "0.6.5",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
@ -9,7 +9,7 @@
}, },
"devDependencies": { "devDependencies": {
"@sveltejs/vite-plugin-svelte": "^1.0.1", "@sveltejs/vite-plugin-svelte": "^1.0.1",
"@tauri-apps/cli": "^2.0.0-beta.20", "@tauri-apps/cli": "^2.2.1",
"autoprefixer": "^10.4.8", "autoprefixer": "^10.4.8",
"postcss": "^8.4.16", "postcss": "^8.4.16",
"svelte": "^3.49.0", "svelte": "^3.49.0",

1487
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
[package] [package]
name = "creddy" name = "creddy"
version = "0.6.3" version = "0.6.5"
description = "A friendly AWS credentials manager" description = "A friendly AWS credentials manager"
authors = ["Joseph Montanaro"] authors = ["Joseph Montanaro"]
license = "" license = ""
@ -22,15 +22,16 @@ dirs = "5.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
tokio = { version = ">=1.19", features = ["full"] } tokio = { version = ">=1.19", features = ["full"] }
windows = { version = "0.51.1", features = ["Win32_Foundation", "Win32_System_Pipes"] }
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies] [build-dependencies]
tauri-build = { version = "2.0.0-beta", features = [] } tauri-build = { version = "2.0.4", features = [] }
[dependencies] [dependencies]
creddy_cli = { path = "./creddy_cli" } creddy_cli = { path = "./creddy_cli" }
tauri = { version = "2.0.0-beta", features = ["tray-icon", "test"] } tauri = { version = "2.2.0", features = ["tray-icon", "test"] }
sodiumoxide = "0.2.7" sodiumoxide = "0.2.7"
sysinfo = "0.26.8" sysinfo = "0.26.8"
aws-config = "1.5.3" aws-config = "1.5.3"
@ -47,11 +48,10 @@ is-terminal = "0.4.7"
argon2 = { version = "0.5.0", features = ["std"] } argon2 = { version = "0.5.0", features = ["std"] }
chacha20poly1305 = { version = "0.10.1", features = ["std"] } chacha20poly1305 = { version = "0.10.1", features = ["std"] }
which = "4.4.0" which = "4.4.0"
windows = { version = "0.51.1", features = ["Win32_Foundation", "Win32_System_Pipes"] }
time = "0.3.31" time = "0.3.31"
tauri-plugin-global-shortcut = "2.0.0-beta.6" tauri-plugin-global-shortcut = "2.2.0"
tauri-plugin-os = "2.0.0-beta.6" tauri-plugin-os = "2.2.0"
tauri-plugin-dialog = "2.0.0-beta.9" tauri-plugin-dialog = "2.2.0"
rfd = "0.13.0" rfd = "0.13.0"
ssh-agent-lib = "0.4.0" ssh-agent-lib = "0.4.0"
ssh-key = { version = "0.6.6", features = ["rsa", "ed25519", "encryption"] } ssh-key = { version = "0.6.6", features = ["rsa", "ed25519", "encryption"] }
@ -63,11 +63,14 @@ sqlx = { version = "0.7.4", features = ["sqlite", "runtime-tokio", "uuid"] }
tokio = { workspace = true } tokio = { workspace = true }
tokio-util = { version = "0.7.11", features = ["codec"] } tokio-util = { version = "0.7.11", features = ["codec"] }
futures = "0.3.30" futures = "0.3.30"
openssl = "0.10.64" # openssl = { version = "0.10.64", features = ["vendored"] }
rsa = "0.9.6" rsa = "0.9.6"
sha2 = "0.10.8" sha2 = "0.10.8"
ssh-encoding = "0.2.0" ssh-encoding = "0.2.0"
[target.'cfg(windows)'.dependencies]
windows = { workspace = true }
[features] [features]
# by default Tauri runs in production mode # by default Tauri runs in production mode
# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL

View File

@ -6,13 +6,13 @@
"main" "main"
], ],
"permissions": [ "permissions": [
"path:default", "core:path:default",
"event:default", "core:event:default",
"window:default", "core:window:default",
"app:default", "core:app:default",
"resources:default", "core:resources:default",
"menu:default", "core:menu:default",
"tray:default", "core:tray:default",
"os:allow-os-type", "os:allow-os-type",
"dialog:allow-open" "dialog:allow-open"
] ]

View File

@ -1,6 +1,6 @@
[package] [package]
name = "creddy_cli" name = "creddy_cli"
version = "0.6.0" version = "0.6.5"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
@ -10,3 +10,6 @@ dirs = { workspace = true }
serde = { workspace = true } serde = { workspace = true }
serde_json = { workspace = true } serde_json = { workspace = true }
tokio = { workspace = true } tokio = { workspace = true }
[target.'cfg(windows)'.dependencies]
windows = { workspace = true }

View File

@ -2,8 +2,6 @@ use std::path::PathBuf;
use std::process::Command as ChildCommand; use std::process::Command as ChildCommand;
#[cfg(unix)] #[cfg(unix)]
use std::os::unix::process::CommandExt; use std::os::unix::process::CommandExt;
#[cfg(windows)]
use std::time::Duration;
use anyhow::{bail, Context}; use anyhow::{bail, Context};
use clap::{ use clap::{
@ -184,17 +182,10 @@ pub fn exec(args: ExecArgs, global: GlobalArgs) -> anyhow::Result<()> {
#[cfg(windows)] #[cfg(windows)]
{ {
let mut child = match cmd.spawn() { let mut child = cmd.spawn()
Ok(c) => c, .with_context(|| format!("Failed to execute command: {}", args.command.join(" ")))?;
Err(e) if e.kind() == std::io::ErrorKind::NotFound => {
let name: OsString = cmd_name.into();
return Err(ExecError::NotFound(name).into());
}
Err(e) => return Err(ExecError::ExecutionFailed(e).into()),
};
let status = child.wait() let status = child.wait()
.map_err(|e| ExecError::ExecutionFailed(e))?; .with_context(|| format!("Failed to execute command: {}", args.command.join(" ")))?;
std::process::exit(status.code().unwrap_or(1)); std::process::exit(status.code().unwrap_or(1));
}; };
} }

View File

@ -47,12 +47,31 @@ mod platform {
#[cfg(windows)] #[cfg(windows)]
mod platform { mod platform {
pub fn server_addr(sock_name: &str) -> String { use std::path::PathBuf;
use std::time::Duration;
use tokio::net::windows::named_pipe::{NamedPipeClient, ClientOptions};
use windows::Win32::Foundation::ERROR_PIPE_BUSY;
pub async fn connect(addr: Option<PathBuf>) -> std::io::Result<NamedPipeClient> {
let opts = ClientOptions::new();
let pipe_name = addr.unwrap_or_else(|| server_addr("creddy-server"));
loop {
match opts.open(&pipe_name) {
Ok(client) => return Ok(client),
Err(e) if e.raw_os_error() == Some(ERROR_PIPE_BUSY.0 as i32) => {
tokio::time::sleep(Duration::from_millis(50)).await;
},
Err(e) => return Err(e),
}
}
}
pub fn server_addr(sock_name: &str) -> PathBuf {
if cfg!(debug_assertions) { if cfg!(debug_assertions) {
format!(r"\\.\pipe\{sock_name}.dev") format!(r"\\.\pipe\{sock_name}.dev").into()
} }
else { else {
format!(r"\\.\pipe\{sock_name}") format!(r"\\.\pipe\{sock_name}").into()
} }
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["path:default","event:default","window:default","app:default","resources:default","menu:default","tray:default","os:allow-os-type","dialog:allow-open"]}} {"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:path:default","core:event:default","core:window:default","core:app:default","core:resources:default","core:menu:default","core:tray:default","os:allow-os-type","dialog:allow-open"]}}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -122,7 +122,7 @@ impl AppConfig {
let path_buf = std::env::current_exe() let path_buf = std::env::current_exe()
.map_err(|e| auto_launch::Error::Io(e))?; .map_err(|e| auto_launch::Error::Io(e))?;
let name = if cfg!(debug_assertions) { "Creddy" } else { "Creddy (dev)" }; let name = if cfg!(debug_assertions) { "Creddy (dev)" } else { "Creddy" };
let mut builder = AutoLaunchBuilder::new(); let mut builder = AutoLaunchBuilder::new();
builder.set_app_name(name); builder.set_app_name(name);
builder.set_app_path(&path_buf.to_string_lossy()); builder.set_app_path(&path_buf.to_string_lossy());

View File

@ -201,6 +201,10 @@ pub enum HandlerError {
Signature(#[from] signature::Error), Signature(#[from] signature::Error),
#[error(transparent)] #[error(transparent)]
Encoding(#[from] ssh_encoding::Error), Encoding(#[from] ssh_encoding::Error),
#[cfg(windows)]
#[error(transparent)]
Windows(#[from] windows::core::Error),
} }

View File

@ -44,10 +44,7 @@ fn launch_terminal() {
pub fn register_hotkeys(hotkeys: &HotkeysConfig) -> Result<(), ShortcutError> { pub fn register_hotkeys(hotkeys: &HotkeysConfig) -> Result<(), ShortcutError> {
let app = APP.get().unwrap(); let app = APP.get().unwrap();
let shortcuts = app.global_shortcut(); let shortcuts = app.global_shortcut();
shortcuts.unregister_all([ shortcuts.unregister_all()?;
hotkeys.show_window.keys.as_str(),
hotkeys.launch_terminal.keys.as_str(),
])?;
if hotkeys.show_window.enabled { if hotkeys.show_window.enabled {
shortcuts.on_shortcut( shortcuts.on_shortcut(

View File

@ -3,6 +3,7 @@ use std::future::Future;
use tauri::{ use tauri::{
AppHandle, AppHandle,
async_runtime as rt, async_runtime as rt,
Emitter,
Manager, Manager,
Runtime, Runtime,
}; };
@ -188,6 +189,7 @@ mod platform {
#[cfg(windows)] #[cfg(windows)]
mod platform { mod platform {
use std::os::windows::io::AsRawHandle; use std::os::windows::io::AsRawHandle;
use std::path::PathBuf;
use tokio::net::windows::named_pipe::{ use tokio::net::windows::named_pipe::{
NamedPipeServer, NamedPipeServer,
ServerOptions, ServerOptions,
@ -201,7 +203,7 @@ mod platform {
pub type Stream = NamedPipeServer; pub type Stream = NamedPipeServer;
pub fn bind(sock_name: &str) -> std::io::Result<(String, NamedPipeServer)> { pub fn bind(sock_name: &str) -> std::io::Result<(NamedPipeServer, PathBuf)> {
let addr = creddy_cli::server_addr(sock_name); let addr = creddy_cli::server_addr(sock_name);
let listener = ServerOptions::new() let listener = ServerOptions::new()
.first_pipe_instance(true) .first_pipe_instance(true)
@ -209,7 +211,7 @@ mod platform {
Ok((listener, addr)) Ok((listener, addr))
} }
pub async fn accept(listener: &mut NamedPipeServer, addr: &String) -> Result<(NamedPipeServer, u32), HandlerError> { pub async fn accept(listener: &mut NamedPipeServer, addr: &PathBuf) -> Result<(NamedPipeServer, u32), HandlerError> {
// connect() just waits for a client to connect, it doesn't return anything // connect() just waits for a client to connect, it doesn't return anything
listener.connect().await?; listener.connect().await?;

View File

@ -11,6 +11,7 @@ use ssh_agent_lib::proto::message::Identity;
use sqlx::SqlitePool; use sqlx::SqlitePool;
use sqlx::types::Uuid; use sqlx::types::Uuid;
use tauri::{ use tauri::{
Emitter,
Manager, Manager,
async_runtime as rt, async_runtime as rt,
}; };

View File

@ -1,7 +1,11 @@
use std::process::Command; use std::process::Command;
use std::time::Duration; use std::time::Duration;
use tauri::{AppHandle, Manager}; use tauri::{
AppHandle,
Listener,
Manager,
};
use tokio::time::sleep; use tokio::time::sleep;
use crate::app::APP; use crate::app::APP;

View File

@ -11,6 +11,7 @@ use tauri::menu::{
MenuItemBuilder, MenuItemBuilder,
PredefinedMenuItem, PredefinedMenuItem,
}; };
use tauri::tray::TrayIconBuilder;
use crate::app; use crate::app;
use crate::state::AppState; use crate::state::AppState;
@ -67,11 +68,14 @@ pub fn setup(app: &App) -> tauri::Result<()> {
let exit = MenuItemBuilder::with_id("exit", "Exit").build(app)?; let exit = MenuItemBuilder::with_id("exit", "Exit").build(app)?;
let menu = MenuBuilder::new(app) let menu = MenuBuilder::new(app)
.items(&[&status, &sep, &show_hide, &exit]); .items(&[&status, &sep, &show_hide, &exit])
.build()?;
let tray = app.tray_by_id("main").unwrap(); TrayIconBuilder::new()
tray.set_menu(Some(menu.build()?))?; .icon(app.default_window_icon().unwrap().clone())
tray.on_menu_event(handle_event); .menu(&menu)
.on_menu_event(handle_event)
.build(app)?;
// stash these so we can find them later to change the text // stash these so we can find them later to change the text
app.manage(MenuItems { status, show_hide }); app.manage(MenuItems { status, show_hide });

View File

@ -50,7 +50,7 @@
} }
}, },
"productName": "creddy", "productName": "creddy",
"version": "0.6.3", "version": "0.6.5",
"identifier": "creddy", "identifier": "creddy",
"plugins": {}, "plugins": {},
"app": { "app": {
@ -65,11 +65,6 @@
"visible": false "visible": false
} }
], ],
"trayIcon": {
"id": "main",
"iconPath": "icons/icon.png",
"iconAsTemplate": true
},
"security": { "security": {
"csp": { "csp": {
"style-src": [ "style-src": [

View File

@ -1,7 +1,7 @@
<script> <script>
// import { listen } from '@tauri-apps/api/event'; // import { listen } from '@tauri-apps/api/event';
import { open } from '@tauri-apps/plugin-dialog'; import { open } from '@tauri-apps/plugin-dialog';
import { sep } from '@tauri-apps/api/path'; import { basename } from '@tauri-apps/api/path';
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import Icon from './Icon.svelte'; import Icon from './Icon.svelte';
@ -14,17 +14,16 @@
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
async function chooseFile() { async function chooseFile() {
let file = await open(params); let path = await open(params);
if (file) { if (path) {
value = file; displayValue = await basename(path);
displayValue = file.name; value = {name: displayValue, path};
dispatch('update', value); dispatch('update', value);
} }
} }
function handleInput(evt) { async function handleInput(evt) {
const segments = evt.target.value.split(sep()); const name = await basename(evt.target.value);
const name = segments[segments.length - 1];
value = {name, path: evt.target.value}; value = {name, path: evt.target.value};
} }

View File

@ -91,7 +91,7 @@
{#if launchTerminalError} {#if launchTerminalError}
<div class="toast"> <div class="toast">
<div class="alert alert-error shadow-lg"> <div class="alert alert-error text-wrap shadow-lg">
<span>{launchTerminalError.msg || launchTerminalError}</span> <span>{launchTerminalError.msg || launchTerminalError}</span>
<div> <div>
<button class="btn btn-alert-error" on:click={() => launchTerminalError = null}> <button class="btn btn-alert-error" on:click={() => launchTerminalError = null}>

View File

@ -115,7 +115,7 @@
{#if error} {#if error}
<div transition:fly={{y: 100, easing: backInOut, duration: 400}} class="toast"> <div transition:fly={{y: 100, easing: backInOut, duration: 400}} class="toast">
<div class="alert alert-error no-animation"> <div class="alert alert-error no-animation text-wrap">
<div> <div>
<span>{error}</span> <span>{error}</span>
</div> </div>
@ -127,7 +127,7 @@
</div> </div>
{:else if configModified} {:else if configModified}
<div transition:fly={{y: 100, easing: backInOut, duration: 400}} class="toast"> <div transition:fly={{y: 100, easing: backInOut, duration: 400}} class="toast">
<div class="alert shadow-lg no-animation"> <div class="alert shadow-lg no-animation text-wrap">
<span>You have unsaved changes.</span> <span>You have unsaved changes.</span>
<div> <div>