From 7ff45bfb6d1c8314a152f2be264da26c83a5bf5d Mon Sep 17 00:00:00 2001 From: Artemis Date: Fri, 7 Feb 2025 23:03:41 +0100 Subject: [PATCH] wip: qrcode images generated as png --- Cargo.lock | 99 ++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 2 + src/routes/account.rs | 26 +++++++++- src/routes/error_handlers.rs | 8 +++ 5 files changed, 134 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 94c1b9b..8f9bfb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -305,6 +305,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.10.0" @@ -472,6 +478,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-channel" version = "0.5.14" @@ -631,6 +646,7 @@ dependencies = [ "chrono", "clap", "orion", + "qrcode-generator", "rand", "regex", "rocket", @@ -704,6 +720,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "fiat-crypto" version = "0.2.9" @@ -736,6 +761,16 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "flume" version = "0.11.1" @@ -1054,6 +1089,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + [[package]] name = "http" version = "0.2.12" @@ -1310,6 +1354,18 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "image" +version = "0.25.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", +] + [[package]] name = "indexmap" version = "2.7.1" @@ -1539,6 +1595,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -1932,6 +1989,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "polyval" version = "0.6.2" @@ -1981,6 +2051,23 @@ dependencies = [ "yansi", ] +[[package]] +name = "qrcode-generator" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0051849b5465059b75f59d388c7318aad6554701b74ecf02afc2573b0306c" +dependencies = [ + "html-escape", + "image", + "qrcodegen", +] + +[[package]] +name = "qrcodegen" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4339fc7a1021c9c1621d87f5e3505f2805c8c105420ba2f2a4df86814590c142" + [[package]] name = "quote" version = "1.0.38" @@ -2434,6 +2521,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "siphasher" version = "1.0.1" @@ -3256,6 +3349,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + [[package]] name = "utf8_iter" version = "1.0.4" diff --git a/Cargo.toml b/Cargo.toml index 2d659d5..687f91b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,3 +22,4 @@ anyhow = "1.0" orion = "0.17" uuid = { version = "1.11", features = ["serde"] } clap = { version = "4.5", features = ["derive"] } +qrcode-generator = "5" diff --git a/src/main.rs b/src/main.rs index c790731..3b9b992 100644 --- a/src/main.rs +++ b/src/main.rs @@ -69,6 +69,8 @@ fn rocket() -> _ { "/account", routes![ account::index, + account::show_qr_for_profile, + account::qr_profile, account::show_settings, account::change_settings, account::change_password, diff --git a/src/routes/account.rs b/src/routes/account.rs index 0f5644a..37ce21d 100644 --- a/src/routes/account.rs +++ b/src/routes/account.rs @@ -1,17 +1,20 @@ use std::net::IpAddr; +use qrcode_generator::QrCodeEcc; use rocket::{ form::{self, Contextual, Error, Form}, - http::CookieJar, + http::{uri::Absolute, CookieJar}, response::Redirect, serde::{json::Json, Serialize}, tokio::task, + State, }; use rocket_dyn_templates::{context, Template}; use sqlx::Acquire; use crate::{ auth::{pw, session}, + config::Config, db::{ doll, schema::{DollProfile, DollTagsDb, User}, @@ -20,7 +23,7 @@ use crate::{ pages::CommonTemplateState, }; -use super::error_handlers::{PageResult, RawResult}; +use super::error_handlers::{PageResponse, PageResult, RawResult}; #[get("/")] pub async fn index(mut db: DollTagsDb, user: User, meta: CommonTemplateState) -> PageResult { @@ -39,6 +42,25 @@ pub async fn index(mut db: DollTagsDb, user: User, meta: CommonTemplateState) -> .into()) } +#[get("/qr/")] +pub fn show_qr_for_profile( + mut db: DollTagsDb, + id: &str, + _user: User, + meta: CommonTemplateState, +) -> PageResult { + todo!("woof"); +} + +#[get("/qr-png/")] +pub fn qr_profile(id: &str, _user: User, config: &State) -> PageResult { + let public_uri = Absolute::parse(&config.public_url)?; + let built_uri = uri!(public_uri, crate::routes::public::short_url(id)); + let image = qrcode_generator::to_png_to_vec(built_uri.to_string(), QrCodeEcc::Low, 400)?; + + Ok(image.into()) +} + #[get("/settings")] pub fn show_settings(user: User, meta: CommonTemplateState) -> Template { Template::render( diff --git a/src/routes/error_handlers.rs b/src/routes/error_handlers.rs index ed5b993..1ae3229 100644 --- a/src/routes/error_handlers.rs +++ b/src/routes/error_handlers.rs @@ -10,6 +10,8 @@ pub async fn not_found() -> Template { pub enum PageResponse { Page(Template), Redirect(Redirect), + #[response(content_type = "image/png")] + Image(Vec), } impl From