From 27f2feb260c1239530a403c2669a292f297a09ef Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:33:05 +0000 Subject: [PATCH 1/2] Initial plan From e357d56636c938742501caf6a23204b2e49d3d7b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:45:47 +0000 Subject: [PATCH 2/2] Fix all lint issues preventing release build Co-authored-by: halcycon <8266551+halcycon@users.noreply.github.com> --- rustalk-cli/src/console.rs | 2 +- rustalk-cloud/src/api/mod.rs | 1 + rustalk-cloud/src/handlers/call_logs.rs | 2 +- rustalk-cloud/src/handlers/mod.rs | 2 +- rustalk-cloud/src/handlers/voicemail.rs | 4 +-- rustalk-core/src/acme/client.rs | 2 +- rustalk-core/src/acme/mod.rs | 14 +------- rustalk-core/src/acme/storage.rs | 8 ++--- rustalk-core/src/acme/validation.rs | 2 ++ rustalk-core/src/auth/mod.rs | 1 + rustalk-core/src/b2bua/mod.rs | 2 +- rustalk-core/src/media/sdp.rs | 26 +++++++-------- rustalk-core/src/sip/message.rs | 1 - rustalk-core/src/sip/method.rs | 43 ++++++++++++++----------- rustalk-core/src/sip/parser.rs | 4 +-- rustalk-core/src/transport/mod.rs | 4 +-- rustalk-core/src/transport/tls.rs | 4 +-- rustalk-core/src/transport/udp.rs | 2 +- 18 files changed, 59 insertions(+), 65 deletions(-) diff --git a/rustalk-cli/src/console.rs b/rustalk-cli/src/console.rs index 39c8836..d86471f 100644 --- a/rustalk-cli/src/console.rs +++ b/rustalk-cli/src/console.rs @@ -67,7 +67,7 @@ pub enum ModuleActionType { /// Parse a console command from input string pub fn parse_command(input: &str) -> Result { - let parts: Vec<&str> = input.trim().split_whitespace().collect(); + let parts: Vec<&str> = input.split_whitespace().collect(); if parts.is_empty() { anyhow::bail!("Empty command"); diff --git a/rustalk-cloud/src/api/mod.rs b/rustalk-cloud/src/api/mod.rs index 1c1b3a2..ad5725a 100644 --- a/rustalk-cloud/src/api/mod.rs +++ b/rustalk-cloud/src/api/mod.rs @@ -64,6 +64,7 @@ impl CloudApi { } /// Build the API router + #[allow(clippy::too_many_arguments)] fn router( webui_path: Option, acme_state: AcmeState, diff --git a/rustalk-cloud/src/handlers/call_logs.rs b/rustalk-cloud/src/handlers/call_logs.rs index e5a2763..e5f8f00 100644 --- a/rustalk-cloud/src/handlers/call_logs.rs +++ b/rustalk-cloud/src/handlers/call_logs.rs @@ -172,7 +172,7 @@ pub async fn list_rates() -> (StatusCode, Json) { } /// Import rates from JSON or CSV -pub async fn import_rates(Json(request): Json) -> (StatusCode, Json) { +pub async fn import_rates(Json(_request): Json) -> (StatusCode, Json) { // Placeholder - would parse and save to database let response = RateImportResponse { success: true, diff --git a/rustalk-cloud/src/handlers/mod.rs b/rustalk-cloud/src/handlers/mod.rs index d1842f7..a41d1f4 100644 --- a/rustalk-cloud/src/handlers/mod.rs +++ b/rustalk-cloud/src/handlers/mod.rs @@ -64,7 +64,7 @@ pub async fn get_config() -> (StatusCode, Json) { } /// Update configuration -pub async fn update_config(Json(payload): Json) -> (StatusCode, Json) { +pub async fn update_config(Json(_payload): Json) -> (StatusCode, Json) { // Placeholder - would update database ( StatusCode::OK, diff --git a/rustalk-cloud/src/handlers/voicemail.rs b/rustalk-cloud/src/handlers/voicemail.rs index adb2014..3f18cb6 100644 --- a/rustalk-cloud/src/handlers/voicemail.rs +++ b/rustalk-cloud/src/handlers/voicemail.rs @@ -135,7 +135,7 @@ pub async fn get_mwi_status( /// Mark a message as read pub async fn mark_message_read( - Path((mailbox_id, message_id)): Path<(String, String)>, + Path((_mailbox_id, message_id)): Path<(String, String)>, State(state): State, ) -> (StatusCode, Json) { let mut manager = state.write().await; @@ -160,7 +160,7 @@ pub async fn mark_message_read( /// Delete a voicemail message pub async fn delete_message( - Path((mailbox_id, message_id)): Path<(String, String)>, + Path((_mailbox_id, message_id)): Path<(String, String)>, State(state): State, ) -> (StatusCode, Json) { let mut manager = state.write().await; diff --git a/rustalk-core/src/acme/client.rs b/rustalk-core/src/acme/client.rs index 94209ed..3edfbdf 100644 --- a/rustalk-core/src/acme/client.rs +++ b/rustalk-core/src/acme/client.rs @@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::time::Duration; use tokio::time::sleep; -use tracing::{debug, info, warn}; +use tracing::{debug, info}; use super::storage::CertificateStorage; use super::validation::{ChallengeType, ChallengeValidator}; diff --git a/rustalk-core/src/acme/mod.rs b/rustalk-core/src/acme/mod.rs index 3b4645f..0d06ff7 100644 --- a/rustalk-core/src/acme/mod.rs +++ b/rustalk-core/src/acme/mod.rs @@ -11,12 +11,11 @@ pub use client::{AcmeClient, AcmeConfig}; pub use storage::{CertificateInfo, CertificateStorage}; pub use validation::{ChallengeType, ValidationResult}; -use anyhow::Result; use serde::{Deserialize, Serialize}; -use std::path::PathBuf; /// Certificate status information #[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default)] pub struct CertificateStatus { /// Whether a valid certificate exists pub exists: bool, @@ -54,14 +53,3 @@ pub struct CertificateOperationResult { pub certificate: Option, } -impl Default for CertificateStatus { - fn default() -> Self { - Self { - exists: false, - domains: Vec::new(), - expires_at: None, - days_until_expiry: None, - needs_renewal: false, - } - } -} diff --git a/rustalk-core/src/acme/storage.rs b/rustalk-core/src/acme/storage.rs index 5226fa3..ced9558 100644 --- a/rustalk-core/src/acme/storage.rs +++ b/rustalk-core/src/acme/storage.rs @@ -1,12 +1,12 @@ //! Certificate storage and management -use anyhow::{Context, Result}; -use rustls_pemfile::{certs, pkcs8_private_keys}; +use anyhow::Result; +use rustls_pemfile::certs; use serde::{Deserialize, Serialize}; use std::io::BufReader; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use tokio::fs; -use tracing::{info, warn}; +use tracing::info; /// Information about a stored certificate #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/rustalk-core/src/acme/validation.rs b/rustalk-core/src/acme/validation.rs index 318d03b..ed3393d 100644 --- a/rustalk-core/src/acme/validation.rs +++ b/rustalk-core/src/acme/validation.rs @@ -25,6 +25,7 @@ pub struct ValidationResult { /// Challenge validator pub struct ChallengeValidator { challenge_type: ChallengeType, + #[allow(dead_code)] http_port: u16, tokens: Arc>>, } @@ -147,6 +148,7 @@ impl ChallengeValidator { } /// Get the key authorization for a token (for HTTP server) + #[allow(dead_code)] pub async fn get_key_authorization(&self, token: &str) -> Option { let tokens = self.tokens.read().await; tokens.get(token).cloned() diff --git a/rustalk-core/src/auth/mod.rs b/rustalk-core/src/auth/mod.rs index 2f89a46..51dba62 100644 --- a/rustalk-core/src/auth/mod.rs +++ b/rustalk-core/src/auth/mod.rs @@ -133,6 +133,7 @@ impl AuthManager { } /// Calculate the digest response value + #[allow(clippy::too_many_arguments)] fn calculate_response( &self, username: &str, diff --git a/rustalk-core/src/b2bua/mod.rs b/rustalk-core/src/b2bua/mod.rs index 34e6e7a..41967fa 100644 --- a/rustalk-core/src/b2bua/mod.rs +++ b/rustalk-core/src/b2bua/mod.rs @@ -66,7 +66,7 @@ impl B2BUA { .ok_or_else(|| anyhow::anyhow!("No Call-ID in response"))?; let sessions = self.sessions.read().await; - if let Some(session) = sessions.values().find(|s| s.call_id() == call_id) { + if let Some(_session) = sessions.values().find(|s| s.call_id() == call_id) { // Forward response to the other leg debug!("Forwarding response to other leg"); // In a real implementation, we would modify headers and forward diff --git a/rustalk-core/src/media/sdp.rs b/rustalk-core/src/media/sdp.rs index 1eff49d..d06b512 100644 --- a/rustalk-core/src/media/sdp.rs +++ b/rustalk-core/src/media/sdp.rs @@ -65,35 +65,35 @@ impl SdpSession { Ok(session) } +} - /// Serialize to SDP string - pub fn to_string(&self) -> String { - let mut sdp = String::new(); - - sdp.push_str(&format!("v={}\r\n", self.version)); - sdp.push_str(&format!("o={}\r\n", self.origin)); - sdp.push_str(&format!("s={}\r\n", self.session_name)); +impl std::fmt::Display for SdpSession { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "v={}\r\n", self.version)?; + write!(f, "o={}\r\n", self.origin)?; + write!(f, "s={}\r\n", self.session_name)?; if let Some(conn) = &self.connection { - sdp.push_str(&format!("c={}\r\n", conn)); + write!(f, "c={}\r\n", conn)?; } - sdp.push_str("t=0 0\r\n"); + write!(f, "t=0 0\r\n")?; for media in &self.media { let formats = media .formats .iter() - .map(|f| f.to_string()) + .map(|fmt| fmt.to_string()) .collect::>() .join(" "); - sdp.push_str(&format!( + write!( + f, "m={} {} {} {}\r\n", media.media_type, media.port, media.protocol, formats - )); + )?; } - sdp + Ok(()) } } diff --git a/rustalk-core/src/sip/message.rs b/rustalk-core/src/sip/message.rs index 60b6ae3..13f3d39 100644 --- a/rustalk-core/src/sip/message.rs +++ b/rustalk-core/src/sip/message.rs @@ -2,7 +2,6 @@ use super::{Header, Method, StatusCode, Uri}; use bytes::Bytes; -use std::collections::HashMap; /// SIP Message - either a Request or Response #[derive(Debug, Clone)] diff --git a/rustalk-core/src/sip/method.rs b/rustalk-core/src/sip/method.rs index 4770291..a7f704d 100644 --- a/rustalk-core/src/sip/method.rs +++ b/rustalk-core/src/sip/method.rs @@ -1,6 +1,7 @@ //! SIP Methods use std::fmt; +use std::str::FromStr; /// SIP Method types #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -51,25 +52,6 @@ impl Method { Method::Message => "MESSAGE", } } - - pub fn from_str(s: &str) -> Option { - match s { - "INVITE" => Some(Method::Invite), - "ACK" => Some(Method::Ack), - "BYE" => Some(Method::Bye), - "CANCEL" => Some(Method::Cancel), - "REGISTER" => Some(Method::Register), - "OPTIONS" => Some(Method::Options), - "INFO" => Some(Method::Info), - "PRACK" => Some(Method::Prack), - "SUBSCRIBE" => Some(Method::Subscribe), - "NOTIFY" => Some(Method::Notify), - "UPDATE" => Some(Method::Update), - "REFER" => Some(Method::Refer), - "MESSAGE" => Some(Method::Message), - _ => None, - } - } } impl fmt::Display for Method { @@ -77,3 +59,26 @@ impl fmt::Display for Method { write!(f, "{}", self.as_str()) } } + +impl FromStr for Method { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "INVITE" => Ok(Method::Invite), + "ACK" => Ok(Method::Ack), + "BYE" => Ok(Method::Bye), + "CANCEL" => Ok(Method::Cancel), + "REGISTER" => Ok(Method::Register), + "OPTIONS" => Ok(Method::Options), + "INFO" => Ok(Method::Info), + "PRACK" => Ok(Method::Prack), + "SUBSCRIBE" => Ok(Method::Subscribe), + "NOTIFY" => Ok(Method::Notify), + "UPDATE" => Ok(Method::Update), + "REFER" => Ok(Method::Refer), + "MESSAGE" => Ok(Method::Message), + _ => Err(format!("Unknown SIP method: {}", s)), + } + } +} diff --git a/rustalk-core/src/sip/parser.rs b/rustalk-core/src/sip/parser.rs index 50cc0e8..9c94426 100644 --- a/rustalk-core/src/sip/parser.rs +++ b/rustalk-core/src/sip/parser.rs @@ -4,11 +4,11 @@ use super::{Header, Message, Method, Request, Response, StatusCode, Uri}; use bytes::Bytes; use nom::{ branch::alt, - bytes::complete::{tag, take_until, take_while, take_while1}, + bytes::complete::{tag, take_until, take_while1}, character::complete::{char, digit1, line_ending, space1}, combinator::{map, map_res, opt}, multi::many0, - sequence::{delimited, preceded, separated_pair, terminated, tuple}, + sequence::{preceded, separated_pair, terminated, tuple}, IResult, }; diff --git a/rustalk-core/src/transport/mod.rs b/rustalk-core/src/transport/mod.rs index b1ab7b5..b4e8c87 100644 --- a/rustalk-core/src/transport/mod.rs +++ b/rustalk-core/src/transport/mod.rs @@ -4,9 +4,6 @@ use crate::sip::Message; use anyhow::Result; use std::net::SocketAddr; use std::sync::Arc; -use tokio::net::UdpSocket; -use tokio::sync::mpsc; -use tracing::{debug, error, info}; pub mod tls; pub mod udp; @@ -49,6 +46,7 @@ pub trait Transport: Send + Sync { /// Transport layer manager pub struct TransportLayer { + #[allow(dead_code)] config: TransportConfig, transport: Arc, } diff --git a/rustalk-core/src/transport/tls.rs b/rustalk-core/src/transport/tls.rs index abf1c97..b0916e6 100644 --- a/rustalk-core/src/transport/tls.rs +++ b/rustalk-core/src/transport/tls.rs @@ -1,7 +1,7 @@ //! TLS/mTLS Transport implementation for secure SIP (SIPS) use super::{Transport, TransportConfig}; -use crate::sip::{parser::parse_message, Message}; +use crate::sip::Message; use anyhow::Result; use rustls::{ClientConfig, ServerConfig}; use rustls_pemfile::{certs, pkcs8_private_keys}; @@ -9,11 +9,11 @@ use std::fs::File; use std::io::BufReader; use std::net::SocketAddr; use std::sync::Arc; -use tokio::net::TcpListener; use tracing::{debug, info}; pub struct TlsTransport { local_addr: SocketAddr, + #[allow(dead_code)] server_config: Arc, } diff --git a/rustalk-core/src/transport/udp.rs b/rustalk-core/src/transport/udp.rs index 49273b2..08d575c 100644 --- a/rustalk-core/src/transport/udp.rs +++ b/rustalk-core/src/transport/udp.rs @@ -7,7 +7,7 @@ use std::net::SocketAddr; use std::sync::Arc; use tokio::net::UdpSocket; use tokio::sync::Mutex; -use tracing::{debug, error}; +use tracing::debug; pub struct UdpTransport { socket: Arc>,