From ea734d7809f460ef29d0aade19aef989a6563f61 Mon Sep 17 00:00:00 2001 From: h Date: Sat, 28 Oct 2023 17:42:34 -0400 Subject: [PATCH] cba to fix the reqwest get title issue in docker production --- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + Dockerfile | 10 ++++++---- src/main.rs | 34 +++++++++++++++++++++++++++++----- src/writer.rs | 5 +++-- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 09b9415..89a0db6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -572,6 +572,7 @@ dependencies = [ "axum", "axum-extra", "minijinja", + "quick-xml", "regex", "reqwest", "serde", @@ -823,6 +824,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.33" diff --git a/Cargo.toml b/Cargo.toml index baa6d4f..b69b835 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,3 +15,4 @@ regex = "1.10.0" tl = "0.7.7" axum-extra = { version = "0.8.0", features = ["cookie-signed", "cookie"] } serde = { version = "1.0.189", features = ["derive"] } +quick-xml = "0.31.0" diff --git a/Dockerfile b/Dockerfile index 76e191f..89d5fa2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.73.0 as builder +FROM rust:1.73-buster as builder WORKDIR /build @@ -8,16 +8,18 @@ COPY ./Cargo.toml /build/Cargo.toml RUN rustup update nightly && rustup default nightly && \ cargo clean && cargo build --release -FROM debian:buster-slim +FROM debian:buster WORKDIR /app COPY --from=builder /build/target/release/linky /app/linky -RUN mkdir /app/service +RUN apt-get update && apt-get install libssl-dev -y RUN mkdir /store +RUN touch /store/store.xmlfrag + COPY ./templates/ /app/templates -CMD [ "/app/linky /store/store.xmlfrag" ] +CMD [ "/app/linky", "/store/store.xmlfrag" ] diff --git a/src/main.rs b/src/main.rs index 0846693..850a7a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,11 +2,11 @@ mod writer; use axum::{ - extract::State, + extract::{Query, State}, http::{HeaderMap, Request, StatusCode}, middleware, middleware::Next, - response::{Html, Redirect, Response, Result}, + response::{Html, IntoResponse, Redirect, Response, Result}, routing::{get, post}, Form, Router, }; @@ -71,7 +71,7 @@ async fn get_login(State(_state): State>>) -> Result>>) -> Result { +async fn get_rss(State(state): State>>) -> Result { let template = fs::read_to_string("templates/rss.xml").unwrap(); let linkfile = state.lock().await; let xmlfrag = fs::read_to_string(linkfile.get_path()).unwrap(); @@ -85,12 +85,19 @@ async fn get_rss(State(state): State>>) -> Result { env.add_template("rss_xml", &template).unwrap(); let template = env.get_template("rss_xml").unwrap(); - Ok(template + let mut resp = template .render(context! { xmlfrag => xmlfrag, link => link, }) - .unwrap()) + .unwrap() + .into_response(); + + resp.headers_mut() + .insert("Content-Type", "text/xml".parse().unwrap()) + .unwrap(); + + Ok(resp) } #[derive(Deserialize)] @@ -149,8 +156,14 @@ async fn post_login( Ok((jar, Redirect::to("/"))) } +#[derive(Deserialize)] +struct Token { + rss_token: Option, +} + async fn authenticate( headers: HeaderMap, + Query(token): Query, request: Request, next: Next, ) -> Result { @@ -161,5 +174,16 @@ async fn authenticate( } } + let rss_token = match env::var("LINKY_TOKEN") { + Ok(v) => v, + Err(_) => "linkytoken".to_string(), + }; + + if let Some(t) = token.rss_token { + if t == rss_token { + return Ok(next.run(request).await); + } + } + Err(Redirect::to("/login")) } diff --git a/src/writer.rs b/src/writer.rs index 4565622..bb1ff00 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -1,5 +1,6 @@ use anyhow::{Context, Result}; use minijinja::{context, Environment}; +use quick_xml::escape::escape; use reqwest::Client; use std::fs::{File, OpenOptions}; use std::io::Write; @@ -53,7 +54,7 @@ impl LinkFile { pub async fn add_link(&mut self, link: &str) -> Result<()> { let title = match get_link_title(&self.client, link).await { Ok(s) => s, - Err(_) => link.to_string(), + Err(_) => escape(link).to_string(), }; let mut env = Environment::new(); @@ -64,7 +65,7 @@ impl LinkFile { template .render(context! { title => title, - link => link, + link => escape(link).to_string(), })? .as_bytes(), )?;