From 028026bfdc274afb675479ec82e125b161b9513b Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Tue, 31 Jan 2023 22:57:39 -0500 Subject: [PATCH] remove b64 imgs --- Cargo.lock | 11 -------- Cargo.toml | 1 - public/css/home.css | 2 +- public/css/main.css | 4 +-- public/css/profile.css | 2 +- public/image/arrow.png | Bin 0 -> 153 bytes public/image/change.png | Bin 0 -> 6144 bytes public/image/close.png | Bin 0 -> 170 bytes public/image/icons.png | Bin 0 -> 6181 bytes public/js/main.js | 4 +-- src/main.rs | 7 ++--- src/types/extract.rs | 60 ++++++++++++++++++++++++++++++++++++---- 12 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 public/image/arrow.png create mode 100644 public/image/change.png create mode 100644 public/image/close.png create mode 100644 public/image/icons.png diff --git a/Cargo.lock b/Cargo.lock index 7b16e84..c5e1ac7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,16 +70,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "axum-client-ip" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfb5a3ddd6367075d50629546fb46710584016ae7704cd03b6d41cb5be82e5a" -dependencies = [ - "axum", - "forwarded-header-value", -] - [[package]] name = "axum-core" version = "0.3.2" @@ -1724,7 +1714,6 @@ name = "xssbook" version = "0.0.1" dependencies = [ "axum", - "axum-client-ip", "bytes", "image", "lazy_static", diff --git a/Cargo.toml b/Cargo.toml index 272112f..55be8cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" [dependencies] tokio = { version = "1.23.0", features = ["full"] } axum = { version = "0.6.4", features = ["headers", "query"] } -axum-client-ip = "0.3.1" tower-http = { version = "0.3.5", features = ["fs"] } tower_governor = "0.0.4" tower-cookies = "0.8.0" diff --git a/public/css/home.css b/public/css/home.css index b68314d..60dc3a5 100644 --- a/public/css/home.css +++ b/public/css/home.css @@ -80,7 +80,7 @@ body { } .icons { - background-image: url('data:image/png;base64,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'); + background-image: url('/images/icons.png'); display: inline-block; width: 18px; height: 18px; diff --git a/public/css/main.css b/public/css/main.css index 1926ed9..0314b3f 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -188,7 +188,7 @@ select { border: 1px solid var(--light); color: var(--extreme); font-size: 15px; - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAgMAAACdGdVrAAAADFBMVEVMaXEFBQUFBQUFBQXG+MOgAAAAA3RSTlMAn3BcqiM3AAAAOUlEQVQIW53BsQ2AMAwAMJelV6C80qPYw4k9JmskbqA2px5uNIlcoxF7FmbFxuhckA2iwNzgev3wAR4FDUQbc/qhAAAAAElFTkSuQmCC"); + background-image: url("/image/arrow.png"); background-position: right 10px center; background-repeat: no-repeat; background-size: 15px; @@ -291,7 +291,7 @@ footer { cursor: pointer; background-size: 20px; background-position: right; - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAgMAAACdGdVrAAAADFBMVEVgZ3FHcExgZ3FgZ3Fd28LEAAAAA3RSTlOfAHBcPEovAAAASklEQVQIW2MIBQMG7FRmaGgmUG5PaKgdkNovGvIPSPkfDf4IpII/+h8FUiF/7EVB2u3/gE3x/4hMQQShSqAaoNqhhkGNhlqE2y0A1E85Y0JErBoAAAAASUVORK5CYII='); + background-image: url('/image/close.png'); } .hidden { diff --git a/public/css/profile.css b/public/css/profile.css index 1077919..4aff91b 100644 --- a/public/css/profile.css +++ b/public/css/profile.css @@ -67,7 +67,7 @@ body { background-color: var(--secondary); z-index: 10000 !important; text-align: center; - background-image: url('data:image/png;base64,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/TwzbKRT88RhYqHQxnIbs6KhEk8TRxRVo3x/xmWF8xZntVxlzXvyF4Zy2soy12kNIYFFLEGEABlVlFCGhSjtGikmUnQe9/APOn6RXDK5SmDkWEAFKiTHD/4Hv2dr5qcm3aRQHOh8se2PESC4CzRqtv19bNuNEyDwDFxpLX+lDsx+kl5raZEjoHcbuLhuafIecLkDDDzpkiE5UoCWP58H3s/om7JA3y3QvebOrXmO0wcgTbNK3gAHh8BogbLXPd7d1T63f3ua8/sBAv9y4GhT1LwAAA14aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjNlYWM4M2MyLTUzMjctNDE5ZS1iMjJlLWU2YjE5M2M2ZTc2NiIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0MTNkODIxZC1jMDE1LTQ1ZGQtYTAwNS04MTA2OGY3ZTg1YjEiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4ZGRkOGY2My1iODAwLTQ1MDQtYWE3Yi1iNzAwOTRiOTg5YTgiCiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09IkxpbnV4IgogICBHSU1QOlRpbWVTdGFtcD0iMTY3NTIwNTQzNTkyMzY1NCIKICAgR0lNUDpWZXJzaW9uPSIyLjEwLjMyIgogICBkYzpGb3JtYXQ9ImltYWdlL3BuZyIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjM6MDE6MzFUMTc6NTA6MzUtMDU6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIzOjAxOjMxVDE3OjUwOjM1LTA1OjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZGJjMjRlYWMtODdmMC00YjJjLWI2MzAtYTBhOTIxY2I1MmJmIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKExpbnV4KSIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMy0wMS0zMVQxNzo1MDozNS0wNTowMCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz7KJrUFAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wEfFjIjpTMVIgAAAlFJREFUaN7t2E2ITXEYx/HPHTNehmlMGSXyMiILJBsbid2QHZZsZj8bL2WtMKLYiJWXkhVJsZLUkJeUl0JCTZJB42UwZphmxsIzdZtmxr3m3OPeOt86nc69z/n/n985z/P8n/MnIyMjIyMjI6OimYcL+IWhEh+fcAwzCnUuV6DdTDzAQjxFV4kf2mLMxV2sR19SA++LJ9WW0tufjHMx554kB76FAdSmGMr1GER7IcZVBQ46JXLjR0JOVmMp6sax6cZPTEtSSJJswzs8x0ccKiJXJ8x99CYwzkr04xvO4GXkQesY9r0xd9kJORCOb4nrxhB2Z6JC0g6tmjh/z3N0IHJmQqQt5GKcT2E/rkchuVRpOSLyoS9vFT8f60ZF5cgws7AWi/5iV7CQ6hK/yfpYD0bShZtJTlSqHJmKI+iIkls2FBNaq/Ak4n8AnWgax34JmsspR6qwN9qKbuzApmhtXmHOKPdswOcQvKschDRFYzmEG1iQ99/2aP4eRc4M0xIiO3Ev7j0bYflfhLREy9GH3WP0Ta3haDum43BcP8b8cP50/HY77+2lIqQRl/McWl7gN82HOF8dpfvdGWH2GqvTELIZ72PStnEWtJGcCBFHMWkMm2Z8QU+MXxIhtTgZznRg3T+U++YC7JbhRcyTuJB+PMtLyroSl/yGKAaJr+zVmI2tsZtSaobLsqSF9GMF3pbjXlUxLcpguYooRsib+G7YmKJvDbG+fE0ytA5GtbmCh1EeS0nOn81AMWeirMG1yJWhFI4eHM/lcjUyMjIyMjIyMiqT3wkE0qfVNfiiAAAAAElFTkSuQmCC'); + background-image: url('/image/change.png'); cursor: pointer; } diff --git a/public/image/arrow.png b/public/image/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8220278a3196ee288b6036e48768484fb3f580cb GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlJOMr-u0ENCtT1rw$KeG)apsaB zzhH*>1u?6X&4FA?PZ!4!j_A1uH}WZFk3E{XVMw7 sSg=|w?dY)=F%x(f9k}zL>hA|eIaXd5>Ed4tfrc=6y85}Sb4q9e08;5LlK=n! literal 0 HcmV?d00001 diff --git a/public/image/change.png b/public/image/change.png new file mode 100644 index 0000000000000000000000000000000000000000..1fcbfea524c684c44a49905c31ed4dbf8976fab1 GIT binary patch literal 6144 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 P-e9gy?v5q){yY8!pTU+9 literal 0 HcmV?d00001 diff --git a/public/image/close.png b/public/image/close.png new file mode 100644 index 0000000000000000000000000000000000000000..516bf05f1b522c66b98344ee28e145182196ba03 GIT binary patch literal 170 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 + return `` } function banner(id) { - return `` + return `` } const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', diff --git a/src/main.rs b/src/main.rs index 74f0a0b..e8f17b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,14 +5,13 @@ use axum::{ response::Response, RequestExt, Router, extract::DefaultBodyLimit, }; -use axum_client_ip::ClientIp; use std::{net::SocketAddr, process::exit, fs}; use tower_cookies::CookieManagerLayer; use tracing::{error, info, metadata::LevelFilter}; use tracing_subscriber::{ filter::filter_fn, prelude::__tracing_subscriber_SubscriberExt, util::SubscriberInitExt, Layer, }; -use types::http::ResponseCode; +use types::{http::ResponseCode, extract::RequestIp}; use crate::api::{pages, image}; @@ -38,7 +37,7 @@ async fn log(mut req: Request, next: Next) -> Response where B: Send + Sync + 'static + HttpBody, { - let Ok(ClientIp(ip)) = req.extract_parts::().await else { + let Ok(RequestIp(ip)) = req.extract_parts::().await else { return next.run(req).await }; @@ -79,7 +78,7 @@ async fn main() { .layer(middleware::from_fn(serve)) .nest("/", pages::router()) .nest("/api", api::router()) - .nest("/image", image::router()) + .nest("/cdn", image::router()) .layer(CookieManagerLayer::new()) .layer(DefaultBodyLimit::max(512_000)); diff --git a/src/types/extract.rs b/src/types/extract.rs index 54f250a..4d7ac51 100644 --- a/src/types/extract.rs +++ b/src/types/extract.rs @@ -1,14 +1,13 @@ -use std::io::{Read, Cursor}; +use std::{io::{Read, Cursor}, net::{IpAddr, SocketAddr}}; use axum::{ async_trait, body::HttpBody, - extract::{FromRequest, FromRequestParts}, + extract::{FromRequest, FromRequestParts, ConnectInfo}, http::{request::Parts, Request}, response::Response, BoxError, RequestExt, }; -use axum_client_ip::ClientIp; use bytes::Bytes; use image::{io::Reader, ImageFormat, DynamicImage}; use serde::de::DeserializeOwned; @@ -23,6 +22,57 @@ use crate::{ }, }; +pub struct RequestIp(pub IpAddr); + +#[async_trait] +impl FromRequestParts for RequestIp +where + S: Send + Sync, +{ + type Rejection = Response; + + async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result { + + let headers = &parts.headers; + + let forwardedfor = headers.get("x-forwarded-for") + .and_then(|h| h.to_str().ok()) + .and_then(|h| + h.split(',') + .rev() + .find_map(|s| s.trim().parse::().ok()) + ); + + if let Some(forwardedfor) = forwardedfor { + return Ok(RequestIp(forwardedfor)) + } + + let realip = headers.get("x-real-ip") + .and_then(|hv| hv.to_str().ok()) + .and_then(|s| s.parse::().ok()); + + if let Some(realip) = realip { + return Ok(RequestIp(realip)) + } + + let realip = headers.get("x-real-ip") + .and_then(|hv| hv.to_str().ok()) + .and_then(|s| s.parse::().ok()); + + if let Some(realip) = realip { + return Ok(RequestIp(realip)) + } + + let info = parts.extensions.get::>(); + + if let Some(info) = info { + return Ok(RequestIp(info.0.ip())) + } + + Err(ResponseCode::Forbidden.text("You have no ip")) + } +} + pub struct AuthorizedUser(pub User); #[async_trait] @@ -189,7 +239,7 @@ where S: Send + Sync, { - let Ok(ClientIp(ip)) = req.extract_parts::().await else { + let Ok(RequestIp(ip)) = req.extract_parts::().await else { tracing::error!("Failed to read client ip"); return Err(ResponseCode::InternalServerError.text("Failed to read client ip")); }; @@ -224,7 +274,7 @@ where B::Error: Into, S: Send + Sync, { - let Ok(ClientIp(ip)) = req.extract_parts::().await else { + let Ok(RequestIp(ip)) = req.extract_parts::().await else { tracing::error!("Failed to read client ip"); return Err(ResponseCode::InternalServerError.text("Failed to read client ip")); };