mirror of
https://github.com/outbackdingo/firezone.git
synced 2026-01-27 10:18:54 +00:00
The current Rust workspace isn't as consistent as it could be. To make navigation a bit easier, we move a few crates around. Generally, we follow the idea that entry-points should be at the top-level. `rust/` now looks like this (directories only): ``` . ├── cli # Firezone CLI ├── client-ffi # Entry point for Apple & Android ├── gateway # Gateway ├── gui-client # GUI client ├── headless-client # Headless client ├── libs # Library crates ├── relay # Relay ├── target # Compile artifacts ├── tests # Crates for testing └── tools # Local tools ``` To further enforce this structure, we also drop the `firezone-` prefix from all crates that are not top-level binary crates.
43 lines
1.6 KiB
Rust
43 lines
1.6 KiB
Rust
//! A module for registering deep links that are sent over to the app's already-running instance
|
|
//! Based on reading some of the Windows code from <https://github.com/FabianLars/tauri-plugin-deep-link>, which is licensed "MIT OR Apache-2.0"
|
|
|
|
use super::FZ_SCHEME;
|
|
use anyhow::{Context, Result};
|
|
use bin_shared::BUNDLE_ID;
|
|
use std::{
|
|
io,
|
|
path::{Path, PathBuf},
|
|
};
|
|
|
|
/// Registers the current exe as the handler for our deep link scheme.
|
|
///
|
|
/// This is copied almost verbatim from tauri-plugin-deep-link's `register` fn, with an improvement
|
|
/// that we send the deep link to a subcommand so the URL won't confuse `clap`
|
|
pub fn register(exe: PathBuf) -> Result<()> {
|
|
let exe = exe.display().to_string().replace("\\\\?\\", "");
|
|
|
|
set_registry_values(BUNDLE_ID, &exe).context("Can't set Windows Registry values")?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Set up the Windows registry to call the given exe when our deep link scheme is used
|
|
///
|
|
/// All errors from this function are registry-related
|
|
fn set_registry_values(id: &str, exe: &str) -> Result<(), io::Error> {
|
|
let hkcu = winreg::RegKey::predef(winreg::enums::HKEY_CURRENT_USER);
|
|
let base = Path::new("Software").join("Classes").join(FZ_SCHEME);
|
|
|
|
let (key, _) = hkcu.create_subkey(&base)?;
|
|
key.set_value("", &format!("URL:{id}"))?;
|
|
key.set_value("URL Protocol", &"")?;
|
|
|
|
let (icon, _) = hkcu.create_subkey(base.join("DefaultIcon"))?;
|
|
icon.set_value("", &format!("{exe},0"))?;
|
|
|
|
let (cmd, _) = hkcu.create_subkey(base.join("shell").join("open").join("command"))?;
|
|
cmd.set_value("", &format!("{exe} open-deep-link \"%1\""))?;
|
|
|
|
Ok(())
|
|
}
|