diff --git a/Cargo.lock b/Cargo.lock index 5147d36..ff23845 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2041,9 +2041,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", @@ -2053,9 +2053,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -2064,9 +2064,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -2860,12 +2860,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "stfu8" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51f1e89f093f99e7432c491c382b88a6860a5adbe6bf02574bf0a08efff1978" - [[package]] name = "stringprep" version = "0.1.5" @@ -3517,12 +3511,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - [[package]] name = "unicode_categories" version = "0.1.1" @@ -3602,17 +3590,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "voca_rs" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e44efbf25e32768d5ecd22244feacc3d3b3eca72d318f5ef0a4764c2c158e18" -dependencies = [ - "regex", - "stfu8", - "unicode-segmentation", -] - [[package]] name = "vzdv" version = "1.0.0" @@ -3635,7 +3612,6 @@ dependencies = [ "tower-sessions", "tower-sessions-sqlx-store", "vatsim_utils", - "voca_rs", ] [[package]] @@ -3676,6 +3652,7 @@ dependencies = [ "log", "mini-moka", "minijinja", + "regex", "reqwest 0.12.5", "rev_buf_reader", "serde", @@ -3691,7 +3668,6 @@ dependencies = [ "tower-sessions-sqlx-store", "uuid", "vatsim_utils", - "voca_rs", "vzdv", ] diff --git a/vzdv-site/Cargo.toml b/vzdv-site/Cargo.toml index 11f87e3..b2a48e2 100644 --- a/vzdv-site/Cargo.toml +++ b/vzdv-site/Cargo.toml @@ -40,5 +40,5 @@ tower-sessions = "0.12.0" tower-sessions-sqlx-store = { version = "0.13.0", features = ["sqlite"] } uuid = { version = "1.10.0", features = ["v4", "fast-rng"] } vatsim_utils = "0.5.0" -voca_rs = "1.15.2" geo = "0.28.0" +regex = "1.11.0" diff --git a/vzdv-site/src/endpoints/controller.rs b/vzdv-site/src/endpoints/controller.rs index e7a79e9..214dba1 100644 --- a/vzdv-site/src/endpoints/controller.rs +++ b/vzdv-site/src/endpoints/controller.rs @@ -3,8 +3,8 @@ use crate::{ flashed_messages::{self, MessageLevel}, shared::{ - is_user_member_of, js_timestamp_to_utc, post_audit, reject_if_not_in, AppError, AppState, - UserInfo, SESSION_USER_INFO_KEY, + is_user_member_of, js_timestamp_to_utc, post_audit, reject_if_not_in, strip_some_tags, + AppError, AppState, UserInfo, SESSION_USER_INFO_KEY, }, }; use axum::{ @@ -412,8 +412,6 @@ async fn snippet_get_training_records( session: Session, Path(cid): Path, ) -> Result { - use voca_rs::Voca; - let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; if let Some(redirect) = reject_if_not_in(&state, &user_info, PermissionsGroup::TrainingTeam).await @@ -429,7 +427,7 @@ async fn snippet_get_training_records( .map(|record| { let record = record.clone(); TrainingRecord { - notes: record.notes._strip_tags(), + notes: strip_some_tags(&record.notes).replace("\n", "
"), ..record } }) diff --git a/vzdv-site/src/endpoints/events.rs b/vzdv-site/src/endpoints/events.rs index 8cfead5..e7292ee 100644 --- a/vzdv-site/src/endpoints/events.rs +++ b/vzdv-site/src/endpoints/events.rs @@ -24,7 +24,6 @@ use serde::{Deserialize, Serialize}; use sqlx::{Pool, Sqlite}; use std::sync::Arc; use tower_sessions::Session; -use voca_rs::Voca; use vzdv::{ sql::{self, Controller, Event, EventPosition, EventRegistration}, vatusa::get_controller_info, @@ -494,7 +493,7 @@ async fn post_register_for_event( .bind(c_1) .bind(c_2) .bind(c_3) - .bind(register_data.notes._substring(0, 500)) + .bind(®ister_data.notes[0..500]) .execute(&state.db) .await?; info!( diff --git a/vzdv-site/src/endpoints/user.rs b/vzdv-site/src/endpoints/user.rs index 2f30786..2cff177 100644 --- a/vzdv-site/src/endpoints/user.rs +++ b/vzdv-site/src/endpoints/user.rs @@ -2,7 +2,7 @@ use crate::{ discord, flashed_messages, - shared::{AppError, AppState, UserInfo, SESSION_USER_INFO_KEY}, + shared::{strip_some_tags, AppError, AppState, UserInfo, SESSION_USER_INFO_KEY}, }; use axum::{ extract::{Query, State}, @@ -25,8 +25,6 @@ async fn page_training_notes( State(state): State>, session: Session, ) -> Result { - use voca_rs::Voca; - let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; let user_info = match user_info { Some(info) => info, @@ -42,7 +40,7 @@ async fn page_training_notes( .map(|record| { let record = record.clone(); TrainingRecord { - notes: record.notes._strip_tags(), + notes: strip_some_tags(&record.notes).replace("\n", "
"), ..record } }) diff --git a/vzdv-site/src/shared.rs b/vzdv-site/src/shared.rs index 7867437..0feb20a 100644 --- a/vzdv-site/src/shared.rs +++ b/vzdv-site/src/shared.rs @@ -9,9 +9,10 @@ use chrono::{NaiveDateTime, TimeZone}; use log::{error, info}; use mini_moka::sync::Cache; use minijinja::{context, Environment}; +use regex::Regex; use serde::{Deserialize, Serialize}; use serde_json::json; -use std::sync::OnceLock; +use std::sync::{LazyLock, OnceLock}; use std::{sync::Arc, time::Instant}; use tower_sessions_sqlx_store::sqlx::SqlitePool; use vzdv::GENERAL_HTTP_CLIENT; @@ -269,3 +270,55 @@ pub fn post_audit(config: &Config, message: String) { } }); } + +static TAG_REGEX_REPLACEMENTS: LazyLock> = LazyLock::new(|| { + vec![ + Regex::new(r"(?i) String { + let mut ret = s.to_string(); + for re in TAG_REGEX_REPLACEMENTS.iter() { + ret = re.replace_all(&ret, "").to_string(); + } + ret +} + +#[cfg(test)] +mod tests { + use super::strip_some_tags; + + #[test] + fn test_strip_some_tags() { + assert_eq!( + strip_some_tags(r#"foo bar"#), + r#"foo src="https://example.com"> bar"# + ); + assert_eq!( + strip_some_tags(r#"foo bar"#), + r#"foo src="https://example.com"> bar"# + ); + assert_eq!( + strip_some_tags( + r#"foo
bar"# + ), + r#"foo method="POST" action="https://example.com"> bar"# + ); + assert_eq!( + strip_some_tags(r#"something "#), + r#"something type="submit">"# + ); + assert_eq!( + strip_some_tags(r#"click here to win"#), + r#"click href="https://example.com">here to win"# + ); + } +} diff --git a/vzdv-site/templates/changelog.jinja b/vzdv-site/templates/changelog.jinja index db4d78b..d852bdf 100644 --- a/vzdv-site/templates/changelog.jinja +++ b/vzdv-site/templates/changelog.jinja @@ -20,6 +20,7 @@
  • Sr Staff can edit controller feedback before posting (mostly to remove PII).
  • +
  • Controller training notes are a bit more lively-looking.
diff --git a/vzdv/Cargo.toml b/vzdv/Cargo.toml index 524e178..aaed6ae 100644 --- a/vzdv/Cargo.toml +++ b/vzdv/Cargo.toml @@ -28,6 +28,5 @@ tower-http = { version = "0.5.2", features = ["fs", "timeout"] } tower-sessions = "0.12.0" tower-sessions-sqlx-store = { version = "0.13.0", features = ["sqlite"] } vatsim_utils = "0.5.0" -voca_rs = "1.15.2" fern = { version = "0.6.2", features = ["colored"] } humantime = "2.1.0"