Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,239 changes: 850 additions & 389 deletions Cargo.lock

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions linkup-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,36 +17,36 @@ cloudflare = { path = "../cloudflare", default-features = false, features = [
] }
colored = "3.0.0"
ctrlc = { version = "3.4.5", features = ["termination"] }
hickory-resolver = { version = "0.24.2", features = ["tokio-runtime"] }
hickory-resolver = { version = "0.25.2", features = ["tokio"] }
linkup = { path = "../linkup" }
linkup-local-server = { path = "../local-server" }
log = "0.4.25"
rand = "0.8.5"
rand = "0.10.0"
regex = "1.11.1"
reqwest = { version = "0.12.12", default-features = false, features = [
reqwest = { version = "0.13.2", default-features = false, features = [
"json",
"multipart",
"blocking",
"rustls-tls",
"json",
"rustls",
"query",
] }
serde = "1.0.217"
serde_json = "1.0.137"
serde_yaml = "0.9.34"
serde_yaml = "0.9.34-deprecated"
tokio = { version = "1.43.0", features = ["macros"] }
thiserror = "2.0.11"
url = { version = "2.5.4", features = ["serde"] }
base64 = "0.22.1"
env_logger = "0.11.6"
crossterm = "0.28.1"
sysinfo = "0.33.1"
crossterm = "0.29.0"
sysinfo = "0.38.2"
sha2 = "0.10.8"
hex = "0.4.3"
tar = "0.4.43"
flate2 = "1.0.35"

[dev-dependencies]
mockall = "0.13.1"
mockall = "0.14.0"
mockito = "1.6.1"

[features]
Expand Down
5 changes: 2 additions & 3 deletions linkup-cli/src/commands/deploy/resources.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::fmt;

use rand::Rng;
use rand::RngExt;
use reqwest::StatusCode;
use serde::{Deserialize, Serialize};
use sha2::{Digest, Sha256};
Expand Down Expand Up @@ -1176,8 +1176,7 @@ pub fn cf_resources(
}

pub fn generate_secret() -> String {
let mut rng = rand::thread_rng();
let bytes: [u8; 32] = rng.gen();
let bytes: [u8; 32] = rand::rng().random();

base64::Engine::encode(&base64::prelude::BASE64_STANDARD, bytes)
}
10 changes: 3 additions & 7 deletions linkup-cli/src/env_files.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,12 @@ pub fn clear_env_file(service: &str, env_path: &PathBuf) -> Result<()> {

#[cfg(test)]
mod test {
use rand::distributions::Alphanumeric;
use rand::Rng;
use std::fs::{self, OpenOptions};
use std::io::Write;
use std::path::PathBuf;

use rand::distr::{Alphanumeric, SampleString};

use crate::env_files::write_to_env_file;

use super::clear_env_file;
Expand Down Expand Up @@ -264,11 +264,7 @@ mod test {

impl TestFile {
fn create(content: &str) -> Self {
let file_name: String = rand::thread_rng()
.sample_iter(&Alphanumeric)
.take(12)
.map(char::from)
.collect();
let file_name = Alphanumeric.sample_string(&mut rand::rng(), 12);

let mut test_file = std::env::temp_dir();
test_file.push(file_name);
Expand Down
8 changes: 2 additions & 6 deletions linkup-cli/src/local_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use std::{
};

use anyhow::Context;
use rand::{distributions::Alphanumeric, Rng};
use rand::distr::{Alphanumeric, SampleString};
use serde::{Deserialize, Serialize};
use url::Url;

Expand Down Expand Up @@ -197,11 +197,7 @@ pub fn config_to_state(
config_path: String,
no_tunnel: bool,
) -> LocalState {
let random_token: String = rand::thread_rng()
.sample_iter(&Alphanumeric)
.take(16)
.map(char::from)
.collect();
let random_token = Alphanumeric.sample_string(&mut rand::rng(), 16);

let tunnel = match no_tunnel {
true => None,
Expand Down
11 changes: 5 additions & 6 deletions linkup-cli/src/services/cloudflare_tunnel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,7 @@ use std::{
time::Duration,
};

use hickory_resolver::{
config::{ResolverConfig, ResolverOpts},
proto::rr::RecordType,
TokioAsyncResolver,
};
use hickory_resolver::{config::ResolverOpts, proto::rr::RecordType, TokioResolver};
use log::debug;
use serde::{Deserialize, Serialize};
use tokio::time::sleep;
Expand Down Expand Up @@ -109,7 +105,10 @@ impl CloudflareTunnel {
let mut opts = ResolverOpts::default();
opts.cache_size = 0; // Disable caching

let resolver = TokioAsyncResolver::tokio(ResolverConfig::default(), opts);
let resolver = TokioResolver::builder_tokio()
.expect("TokioResolver to be buildable from resolver config")
.with_options(opts)
.build();

let domain = tunnel_url.host_str().unwrap();

Expand Down
2 changes: 1 addition & 1 deletion linkup/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ edition = "2021"

[dependencies]
hex = "0.4.3"
rand = "0.8.5"
rand = "0.10.0"
regex = "1.11.1"
serde = "1.0.217"
serde_json = "1.0.137"
Expand Down
8 changes: 4 additions & 4 deletions linkup/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ mod versioning;
use std::future::Future;

use http::{HeaderMap as HttpHeaderMap, HeaderValue as HttpHeaderValue};
use rand::Rng;
use rand::RngExt;
use thiserror::Error;

pub use headers::normalize_cookie_header;
Expand Down Expand Up @@ -57,9 +57,9 @@ pub fn get_additional_headers(
let mut additional_headers = HeaderMap::new();

if !headers.contains_key(HeaderName::TraceParent) {
let mut rng = rand::thread_rng();
let trace: [u8; 16] = rng.gen();
let parent: [u8; 8] = rng.gen();
let mut rng = rand::rng();
let trace: [u8; 16] = rng.random();
let parent: [u8; 8] = rng.random();
let version: [u8; 1] = [0];
let flags: [u8; 1] = [0];

Expand Down
31 changes: 16 additions & 15 deletions linkup/src/name_gen.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
use rand::distributions::Alphanumeric;
use rand::Rng;
use rand::{
distr::{Alphanumeric, SampleString},
seq::IndexedRandom,
};
use sha2::{Digest, Sha256};

pub fn random_animal() -> String {
let adjective_index = rand::thread_rng().gen_range(0..SHORT_ADJECTIVES.len());
let animal_index = rand::thread_rng().gen_range(0..ANIMALS.len());
let mut rand = rand::rng();

format!(
"{}-{}",
SHORT_ADJECTIVES[adjective_index], ANIMALS[animal_index]
)
let adjective = SHORT_ADJECTIVES
.choose(&mut rand)
.expect("Adjectives slice should not be empty");
let animal = ANIMALS
.choose(&mut rand)
.expect("Animals slice should not be empty");

format!("{adjective}-{animal}")
}

pub fn deterministic_six_char_hash(input: &str) -> String {
Expand All @@ -25,13 +30,9 @@ pub fn deterministic_six_char_hash(input: &str) -> String {
}

pub fn random_six_char() -> String {
let string: String = rand::thread_rng()
.sample_iter(&Alphanumeric)
.take(6)
.map(char::from)
.collect();

string.to_lowercase()
Alphanumeric
.sample_string(&mut rand::rng(), 6)
.to_lowercase()
}

const ANIMALS: [&str; 37] = [
Expand Down
12 changes: 6 additions & 6 deletions local-server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ path = "src/lib.rs"

[dependencies]
axum = { version = "0.8.1", features = ["http2", "json", "ws"] }
axum-server = { version = "0.7", features = ["tls-rustls"] }
axum-server = { version = "0.8.0", features = ["tls-rustls"] }
http = "1.2.0"
hickory-server = { version = "0.25.1", features = ["resolver"] }
hyper = { version = "1.5.2", features = ["server"] }
Expand All @@ -20,18 +20,18 @@ hyper-rustls = { version = "0.27.5", default-features = false, features = [
hyper-util = { version = "0.1.10", features = ["client-legacy"] }
futures = "0.3.31"
linkup = { path = "../linkup" }
rustls = { version = "0.23.21", default-features = false, features = ["ring"] }
rustls = { version = "0.23.37", default-features = false, features = ["ring"] }
rustls-native-certs = "0.8.1"
thiserror = "2.0.11"
tokio = { version = "1.43.0", features = [
tokio = { version = "1.49.0", features = [
"macros",
"signal",
"rt-multi-thread",
] }
tokio-tungstenite = { version = "0.26.1", features = [
"rustls-tls-native-roots"
tokio-tungstenite = { version = "0.28.0", features = [
"rustls-tls-native-roots",
] }
tower-http = { version = "0.6.2", features = ["trace"] }
tower = "0.5.2"
rcgen = { version = "0.13", features = ["x509-parser"] }
rcgen = { version = "0.14.7", features = ["x509-parser"] }
rustls-pemfile = "2.2.0"
7 changes: 3 additions & 4 deletions local-server/src/certificates/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
mod wildcard_sni_resolver;

use rcgen::{Certificate, CertificateParams, DistinguishedName, DnType, KeyPair};
use rcgen::{Certificate, CertificateParams, DistinguishedName, DnType, Issuer, KeyPair};
use rustls::crypto::ring::sign;
use rustls::pki_types::CertificateDer;
use rustls::sign::CertifiedKey;
Expand Down Expand Up @@ -141,17 +141,16 @@ pub fn create_domain_cert(certs_dir: &Path, domain: &str) -> (Certificate, KeyPa
let cert_pem_str = fs::read_to_string(ca_cert_pem_path(certs_dir)).unwrap();
let key_pem_str = fs::read_to_string(ca_key_pem_path(certs_dir)).unwrap();

let params = CertificateParams::from_ca_cert_pem(&cert_pem_str).unwrap();
let ca_key = KeyPair::from_pem(&key_pem_str).unwrap();
let ca_cert = params.self_signed(&ca_key).unwrap();
let issuer = Issuer::from_ca_cert_pem(&cert_pem_str, &ca_key).unwrap();

let mut params = CertificateParams::new(vec![domain.to_string()]).unwrap();
params.distinguished_name = DistinguishedName::new();
params.distinguished_name.push(DnType::CommonName, domain);
params.is_ca = rcgen::IsCa::NoCa;

let key_pair = KeyPair::generate().unwrap();
let cert = params.signed_by(&key_pair, &ca_cert, &ca_key).unwrap();
let cert = params.signed_by(&key_pair, &issuer).unwrap();

let escaped_domain = domain.replace("*", "wildcard_");
let cert_path = certs_dir.join(format!("{}.cert.pem", &escaped_domain));
Expand Down
2 changes: 1 addition & 1 deletion worker/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ base64 = "0.22.1"
console_error_panic_hook = { version = "0.1.7" }
cloudflare = { path = "../cloudflare" }
futures = "0.3.31"
getrandom = { version = "0.2.15", features = ["js"] }
getrandom = { version = "0.4.1", features = ["wasm_js"] }
http = "1.2.0"
linkup = { path = "../linkup" }
regex = "1.11.1"
Expand Down
2 changes: 1 addition & 1 deletion worker/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ fn cloudflare_client(api_token: &str) -> cloudflare::framework::async_api::Clien

pub fn generate_secret() -> String {
let mut random_bytes = [0u8; 32];
getrandom::getrandom(&mut random_bytes).unwrap();
getrandom::fill(&mut random_bytes).unwrap();

base64::Engine::encode(&base64::prelude::BASE64_STANDARD, random_bytes)
}
Expand Down