mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-07-29 16:51:44 +08:00
update: 升级 rust 依赖
This commit is contained in:
30
Cargo.toml
30
Cargo.toml
@@ -73,7 +73,7 @@ desktop = [
|
|||||||
]
|
]
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Async runtime
|
# Async runtime
|
||||||
tokio = { version = "1", features = ["full"], optional = true }
|
tokio = { version = "1", features = ["fs", "io-util", "macros", "net", "process", "rt-multi-thread", "signal", "sync", "time"], optional = true }
|
||||||
tokio-util = { version = "0.7", features = ["rt"], optional = true }
|
tokio-util = { version = "0.7", features = ["rt"], optional = true }
|
||||||
|
|
||||||
# Web framework
|
# Web framework
|
||||||
@@ -82,7 +82,7 @@ axum-extra = { version = "0.12", features = ["cookie"], optional = true }
|
|||||||
tower-http = { version = "0.6", features = ["cors", "trace", "set-header"], optional = true }
|
tower-http = { version = "0.6", features = ["cors", "trace", "set-header"], optional = true }
|
||||||
|
|
||||||
# Database - Use bundled SQLite for static linking
|
# Database - Use bundled SQLite for static linking
|
||||||
sqlx = { version = "0.8", features = ["runtime-tokio", "sqlite"], optional = true }
|
sqlx = { version = "0.9", default-features = false, features = ["runtime-tokio", "sqlite-bundled"], optional = true }
|
||||||
|
|
||||||
# Serialization
|
# Serialization
|
||||||
serde = { version = "1", features = ["derive"], optional = true }
|
serde = { version = "1", features = ["derive"], optional = true }
|
||||||
@@ -91,7 +91,6 @@ toml_edit = { version = "0.25", optional = true }
|
|||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
tracing = { version = "0.1", optional = true }
|
tracing = { version = "0.1", optional = true }
|
||||||
tracing-log = { version = "0.2", optional = true }
|
|
||||||
tracing-subscriber = { version = "0.3", features = ["env-filter", "json", "tracing-log"], optional = true }
|
tracing-subscriber = { version = "0.3", features = ["env-filter", "json", "tracing-log"], optional = true }
|
||||||
|
|
||||||
# Error handling
|
# Error handling
|
||||||
@@ -100,7 +99,7 @@ anyhow = { version = "1", optional = true }
|
|||||||
|
|
||||||
# Authentication
|
# Authentication
|
||||||
argon2 = { version = "0.5", optional = true }
|
argon2 = { version = "0.5", optional = true }
|
||||||
rand = { version = "0.9", optional = true }
|
rand = { version = "0.10", optional = true }
|
||||||
|
|
||||||
# Utilities
|
# Utilities
|
||||||
uuid = { version = "1", features = ["v4", "serde"], optional = true }
|
uuid = { version = "1", features = ["v4", "serde"], optional = true }
|
||||||
@@ -109,7 +108,7 @@ tempfile = { version = "3", optional = true }
|
|||||||
|
|
||||||
# HTTP client (for URL downloads)
|
# HTTP client (for URL downloads)
|
||||||
# Use rustls by default, but allow native-tls for systems with older GLIBC
|
# Use rustls by default, but allow native-tls for systems with older GLIBC
|
||||||
reqwest = { version = "0.13", features = ["stream", "rustls", "json"], default-features = false, optional = true }
|
reqwest = { version = "0.13", features = ["stream", "rustls-no-provider", "json"], default-features = false, optional = true }
|
||||||
urlencoding = { version = "2", optional = true }
|
urlencoding = { version = "2", optional = true }
|
||||||
|
|
||||||
# Static file embedding
|
# Static file embedding
|
||||||
@@ -117,9 +116,9 @@ rust-embed = { version = "8", features = ["compression", "debug-embed"], optiona
|
|||||||
mime_guess = { version = "2", optional = true }
|
mime_guess = { version = "2", optional = true }
|
||||||
|
|
||||||
# TLS/HTTPS
|
# TLS/HTTPS
|
||||||
rustls = { version = "0.23", features = ["ring"], optional = true }
|
rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"], optional = true }
|
||||||
rcgen = { version = "0.14", optional = true }
|
rcgen = { version = "0.14", optional = true }
|
||||||
axum-server = { version = "0.8", features = ["tls-rustls"], optional = true }
|
axum-server = { version = "0.8", features = ["tls-rustls-no-provider"], optional = true }
|
||||||
|
|
||||||
# CLI argument parsing
|
# CLI argument parsing
|
||||||
clap = { version = "4", features = ["derive"], optional = true }
|
clap = { version = "4", features = ["derive"], optional = true }
|
||||||
@@ -139,15 +138,15 @@ async-stream = { version = "0.3", optional = true }
|
|||||||
futures = { version = "0.3", optional = true }
|
futures = { version = "0.3", optional = true }
|
||||||
|
|
||||||
# WebSocket client (for ttyd proxy)
|
# WebSocket client (for ttyd proxy)
|
||||||
tokio-tungstenite = { version = "0.28", optional = true }
|
tokio-tungstenite = { version = "0.29", optional = true }
|
||||||
|
|
||||||
# High-performance synchronization
|
# High-performance synchronization
|
||||||
parking_lot = { version = "0.12", optional = true }
|
parking_lot = { version = "0.12", optional = true }
|
||||||
arc-swap = { version = "1.8", optional = true }
|
arc-swap = { version = "1.8", optional = true }
|
||||||
|
|
||||||
# WebRTC
|
# WebRTC
|
||||||
webrtc = { version = "0.14", optional = true }
|
webrtc = { version = "0.17", optional = true }
|
||||||
rtp = { version = "0.14", optional = true }
|
rtp = { version = "0.17", optional = true }
|
||||||
rtsp-types = { version = "0.1", optional = true }
|
rtsp-types = { version = "0.1", optional = true }
|
||||||
sdp-types = { version = "0.1", optional = true }
|
sdp-types = { version = "0.1", optional = true }
|
||||||
|
|
||||||
@@ -162,8 +161,8 @@ ventoy-img = { path = "libs/ventoy-img-rs", optional = true }
|
|||||||
# RustDesk protocol support
|
# RustDesk protocol support
|
||||||
protobuf = { version = "3.7", features = ["with-bytes"], optional = true }
|
protobuf = { version = "3.7", features = ["with-bytes"], optional = true }
|
||||||
sodiumoxide = { version = "0.2", optional = true }
|
sodiumoxide = { version = "0.2", optional = true }
|
||||||
des = { version = "0.8", optional = true }
|
des = { version = "0.9", optional = true }
|
||||||
sha2 = { version = "0.10", optional = true }
|
sha2 = { version = "0.11", optional = true }
|
||||||
# TypeScript type generation
|
# TypeScript type generation
|
||||||
typeshare = { version = "1.0", optional = true }
|
typeshare = { version = "1.0", optional = true }
|
||||||
|
|
||||||
@@ -177,7 +176,7 @@ audiopus = { version = "0.2", optional = true }
|
|||||||
|
|
||||||
[target.'cfg(target_os = "linux")'.dependencies]
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
# Utilities
|
# Utilities
|
||||||
nix = { version = "0.30", default-features = false, features = ["fs", "socket", "net", "hostname", "poll"], optional = true }
|
nix = { version = "0.31", default-features = false, features = ["fs", "socket", "net", "hostname", "poll"], optional = true }
|
||||||
|
|
||||||
# Video capture (V4L2)
|
# Video capture (V4L2)
|
||||||
v4l2r = { path = "libs/v4l2r", optional = true }
|
v4l2r = { path = "libs/v4l2r", optional = true }
|
||||||
@@ -189,7 +188,7 @@ alsa = { version = "0.11", optional = true }
|
|||||||
gpio-cdev = { version = "0.6", optional = true }
|
gpio-cdev = { version = "0.6", optional = true }
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
cpal = { version = "0.17", default-features = false, optional = true }
|
cpal = { version = "0.18", default-features = false, optional = true }
|
||||||
windows-sys = { version = "0.61", features = [
|
windows-sys = { version = "0.61", features = [
|
||||||
"Win32_Foundation",
|
"Win32_Foundation",
|
||||||
"Win32_NetworkManagement_IpHelper",
|
"Win32_NetworkManagement_IpHelper",
|
||||||
@@ -199,9 +198,6 @@ windows-sys = { version = "0.61", features = [
|
|||||||
"Win32_System_Threading",
|
"Win32_System_Threading",
|
||||||
], optional = true }
|
], optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
tempfile = "3"
|
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
protobuf-codegen = "3.7"
|
protobuf-codegen = "3.7"
|
||||||
|
|
||||||
|
|||||||
@@ -21,4 +21,4 @@ serde_json = "1.0"
|
|||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cc = "1.0"
|
cc = "1.0"
|
||||||
bindgen = "0.70.1"
|
bindgen = "0.72"
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
|
#[cfg(feature = "bytes")]
|
||||||
|
use crate::ffmpeg_ram::{ffmpeg_ram_encode_packet, ffmpeg_ram_free_packet};
|
||||||
use crate::{
|
use crate::{
|
||||||
common::DataFormat::{self, *},
|
common::DataFormat::{self, *},
|
||||||
ffmpeg::{init_av_log, AVPixelFormat},
|
ffmpeg::{init_av_log, AVPixelFormat},
|
||||||
ffmpeg_ram::{
|
ffmpeg_ram::{
|
||||||
ffmpeg_linesize_offset_length, ffmpeg_ram_encode, ffmpeg_ram_encode_packet,
|
ffmpeg_linesize_offset_length, ffmpeg_ram_encode, ffmpeg_ram_encoder_last_error,
|
||||||
ffmpeg_ram_encoder_last_error, ffmpeg_ram_free_encoder, ffmpeg_ram_free_packet,
|
ffmpeg_ram_free_encoder, ffmpeg_ram_new_encoder, ffmpeg_ram_request_keyframe,
|
||||||
ffmpeg_ram_new_encoder, ffmpeg_ram_request_keyframe, ffmpeg_ram_set_bitrate, CodecInfo,
|
ffmpeg_ram_set_bitrate, CodecInfo, AV_NUM_DATA_POINTERS,
|
||||||
AV_NUM_DATA_POINTERS,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#[cfg(feature = "bytes")]
|
#[cfg(feature = "bytes")]
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ version = "0.1.6"
|
|||||||
version = "0.4.14"
|
version = "0.4.14"
|
||||||
|
|
||||||
[dependencies.nix]
|
[dependencies.nix]
|
||||||
version = "0.28"
|
version = "0.31"
|
||||||
features = [
|
features = [
|
||||||
"ioctl",
|
"ioctl",
|
||||||
"mman",
|
"mman",
|
||||||
@@ -59,7 +59,7 @@ features = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[dependencies.thiserror]
|
[dependencies.thiserror]
|
||||||
version = "1.0"
|
version = "2"
|
||||||
|
|
||||||
[build-dependencies.bindgen]
|
[build-dependencies.bindgen]
|
||||||
version = "0.70.1"
|
version = "0.72"
|
||||||
|
|||||||
6
libs/v4l2r/Cargo.toml.orig
generated
6
libs/v4l2r/Cargo.toml.orig
generated
@@ -18,11 +18,11 @@ arch64 = []
|
|||||||
arch32 = []
|
arch32 = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nix = { version = "0.28", features = ["ioctl", "mman", "poll", "fs", "event"] }
|
nix = { version = "0.31", features = ["ioctl", "mman", "poll", "fs", "event"] }
|
||||||
bitflags = "2.4"
|
bitflags = "2.4"
|
||||||
thiserror = "1.0"
|
thiserror = "2"
|
||||||
log = "0.4.14"
|
log = "0.4.14"
|
||||||
enumn = "0.1.6"
|
enumn = "0.1.6"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
bindgen = "0.70.1"
|
bindgen = "0.72"
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
pub struct Fix753;
|
pub struct Fix753;
|
||||||
|
|
||||||
impl bindgen::callbacks::ParseCallbacks for Fix753 {
|
impl bindgen::callbacks::ParseCallbacks for Fix753 {
|
||||||
fn item_name(&self, original_item_name: &str) -> Option<String> {
|
fn item_name(&self, item_info: bindgen::callbacks::ItemInfo<'_>) -> Option<String> {
|
||||||
Some(original_item_name.trim_start_matches("Fix753_").to_owned())
|
Some(item_info.name.trim_start_matches("Fix753_").to_owned())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ license = "GPL-2.0"
|
|||||||
clap = { version = "4", features = ["derive"] }
|
clap = { version = "4", features = ["derive"] }
|
||||||
|
|
||||||
# Error handling
|
# Error handling
|
||||||
thiserror = "1"
|
thiserror = "2"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempfile = "3"
|
tempfile = "3"
|
||||||
|
|||||||
@@ -8,4 +8,4 @@ license = "BSD-3-Clause"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
bindgen = "0.70.1"
|
bindgen = "0.72"
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ fn run_capture(
|
|||||||
let stream = match sample_format {
|
let stream = match sample_format {
|
||||||
SampleFormat::F32 => build_stream::<f32>(
|
SampleFormat::F32 => build_stream::<f32>(
|
||||||
&device,
|
&device,
|
||||||
&stream_config,
|
stream_config,
|
||||||
input_channels,
|
input_channels,
|
||||||
input_rate,
|
input_rate,
|
||||||
tx.clone(),
|
tx.clone(),
|
||||||
@@ -229,7 +229,7 @@ fn run_capture(
|
|||||||
),
|
),
|
||||||
SampleFormat::I16 => build_stream::<i16>(
|
SampleFormat::I16 => build_stream::<i16>(
|
||||||
&device,
|
&device,
|
||||||
&stream_config,
|
stream_config,
|
||||||
input_channels,
|
input_channels,
|
||||||
input_rate,
|
input_rate,
|
||||||
tx.clone(),
|
tx.clone(),
|
||||||
@@ -238,7 +238,7 @@ fn run_capture(
|
|||||||
),
|
),
|
||||||
SampleFormat::U16 => build_stream::<u16>(
|
SampleFormat::U16 => build_stream::<u16>(
|
||||||
&device,
|
&device,
|
||||||
&stream_config,
|
stream_config,
|
||||||
input_channels,
|
input_channels,
|
||||||
input_rate,
|
input_rate,
|
||||||
tx.clone(),
|
tx.clone(),
|
||||||
@@ -361,7 +361,7 @@ fn select_input_config(
|
|||||||
|
|
||||||
fn build_stream<T>(
|
fn build_stream<T>(
|
||||||
device: &cpal::Device,
|
device: &cpal::Device,
|
||||||
config: &StreamConfig,
|
config: StreamConfig,
|
||||||
input_channels: u32,
|
input_channels: u32,
|
||||||
input_rate: u32,
|
input_rate: u32,
|
||||||
tx: mpsc::SyncSender<Vec<i16>>,
|
tx: mpsc::SyncSender<Vec<i16>>,
|
||||||
|
|||||||
@@ -130,11 +130,11 @@ fn device_labels(device: &cpal::Device) -> DeviceLabels {
|
|||||||
let formatted = desc.to_string();
|
let formatted = desc.to_string();
|
||||||
let display = desc
|
let display = desc
|
||||||
.extended()
|
.extended()
|
||||||
.first()
|
.next()
|
||||||
.cloned()
|
.map(str::to_owned)
|
||||||
.unwrap_or_else(|| formatted.clone());
|
.unwrap_or_else(|| formatted.clone());
|
||||||
let mut parts = vec![formatted, desc.name().to_string(), display.clone()];
|
let mut parts = vec![formatted, desc.name().to_string(), display.clone()];
|
||||||
parts.extend(desc.extended().iter().cloned());
|
parts.extend(desc.extended().map(str::to_owned));
|
||||||
|
|
||||||
DeviceLabels {
|
DeviceLabels {
|
||||||
display,
|
display,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use rand::Rng;
|
use rand::RngExt;
|
||||||
use rtp::packet::Packet;
|
use rtp::packet::Packet;
|
||||||
use rtp::packetizer::Payloader;
|
use rtp::packetizer::Payloader;
|
||||||
use rtsp_types as rtsp;
|
use rtsp_types as rtsp;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use rand::Rng;
|
use rand::RngExt;
|
||||||
use rtsp_types as rtsp;
|
use rtsp_types as rtsp;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|||||||
@@ -130,14 +130,14 @@ impl RustDeskConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_device_id() -> String {
|
pub fn generate_device_id() -> String {
|
||||||
use rand::Rng;
|
use rand::RngExt;
|
||||||
let mut rng = rand::rng();
|
let mut rng = rand::rng();
|
||||||
let id: u32 = rng.random_range(100_000_000..999_999_999);
|
let id: u32 = rng.random_range(100_000_000..999_999_999);
|
||||||
id.to_string()
|
id.to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_random_password() -> String {
|
pub fn generate_random_password() -> String {
|
||||||
use rand::Rng;
|
use rand::RngExt;
|
||||||
const CHARSET: &[u8] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
const CHARSET: &[u8] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
let mut rng = rand::rng();
|
let mut rng = rand::rng();
|
||||||
(0..8)
|
(0..8)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::fmt::Write as _;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@@ -552,7 +553,12 @@ async fn compute_file_sha256(path: &Path) -> Result<String> {
|
|||||||
hasher.update(&buffer[..bytes_read]);
|
hasher.update(&buffer[..bytes_read]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(format!("{:x}", hasher.finalize()))
|
let digest = hasher.finalize();
|
||||||
|
let mut checksum = String::with_capacity(digest.len() * 2);
|
||||||
|
for byte in digest {
|
||||||
|
write!(&mut checksum, "{byte:02x}").expect("writing to a String cannot fail");
|
||||||
|
}
|
||||||
|
Ok(checksum)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn normalize_sha256(input: &str) -> Option<String> {
|
fn normalize_sha256(input: &str) -> Option<String> {
|
||||||
@@ -578,3 +584,20 @@ fn current_target_triple() -> Result<String> {
|
|||||||
};
|
};
|
||||||
Ok(triple.to_string())
|
Ok(triple.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::compute_file_sha256;
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn file_sha256_is_lowercase_hex() {
|
||||||
|
let dir = tempfile::tempdir().unwrap();
|
||||||
|
let path = dir.path().join("payload");
|
||||||
|
tokio::fs::write(&path, b"one-kvm").await.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
compute_file_sha256(&path).await.unwrap(),
|
||||||
|
"f62202e0a47f1ebb56427006019524c680f15d769d70479b9dbc35f550e86e5e"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
|
|
||||||
use bytes::{Bytes, BytesMut};
|
use bytes::{Bytes, BytesMut};
|
||||||
use des::cipher::{BlockEncrypt, KeyInit};
|
use des::cipher::{Block, BlockCipherEncrypt, KeyInit};
|
||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio::sync::broadcast;
|
use tokio::sync::broadcast;
|
||||||
@@ -703,7 +703,10 @@ fn encrypt_vnc_challenge(challenge: &[u8; 16], password: &str) -> Result<[u8; 16
|
|||||||
.map_err(|_| AppError::BadRequest("Invalid VNC DES key".to_string()))?;
|
.map_err(|_| AppError::BadRequest("Invalid VNC DES key".to_string()))?;
|
||||||
let mut out = *challenge;
|
let mut out = *challenge;
|
||||||
for chunk in out.chunks_exact_mut(8) {
|
for chunk in out.chunks_exact_mut(8) {
|
||||||
cipher.encrypt_block(chunk.into());
|
let block: &mut Block<des::Des> = chunk
|
||||||
|
.try_into()
|
||||||
|
.expect("VNC challenge chunks are exactly one DES block");
|
||||||
|
cipher.encrypt_block(block);
|
||||||
}
|
}
|
||||||
Ok(out)
|
Ok(out)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user