remove b64 imgs

This commit is contained in:
Tyler Murphy 2023-01-31 22:57:39 -05:00
parent b12f02a5e3
commit 028026bfdc
12 changed files with 64 additions and 27 deletions

11
Cargo.lock generated
View file

@ -70,16 +70,6 @@ dependencies = [
"tower-service", "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]] [[package]]
name = "axum-core" name = "axum-core"
version = "0.3.2" version = "0.3.2"
@ -1724,7 +1714,6 @@ name = "xssbook"
version = "0.0.1" version = "0.0.1"
dependencies = [ dependencies = [
"axum", "axum",
"axum-client-ip",
"bytes", "bytes",
"image", "image",
"lazy_static", "lazy_static",

View file

@ -6,7 +6,6 @@ edition = "2021"
[dependencies] [dependencies]
tokio = { version = "1.23.0", features = ["full"] } tokio = { version = "1.23.0", features = ["full"] }
axum = { version = "0.6.4", features = ["headers", "query"] } axum = { version = "0.6.4", features = ["headers", "query"] }
axum-client-ip = "0.3.1"
tower-http = { version = "0.3.5", features = ["fs"] } tower-http = { version = "0.3.5", features = ["fs"] }
tower_governor = "0.0.4" tower_governor = "0.0.4"
tower-cookies = "0.8.0" tower-cookies = "0.8.0"

File diff suppressed because one or more lines are too long

View file

@ -188,7 +188,7 @@ select {
border: 1px solid var(--light); border: 1px solid var(--light);
color: var(--extreme); color: var(--extreme);
font-size: 15px; 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-position: right 10px center;
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: 15px; background-size: 15px;
@ -291,7 +291,7 @@ footer {
cursor: pointer; cursor: pointer;
background-size: 20px; background-size: 20px;
background-position: right; background-position: right;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAgMAAACdGdVrAAAADFBMVEVgZ3FHcExgZ3FgZ3Fd28LEAAAAA3RSTlOfAHBcPEovAAAASklEQVQIW2MIBQMG7FRmaGgmUG5PaKgdkNovGvIPSPkfDf4IpII/+h8FUiF/7EVB2u3/gE3x/4hMQQShSqAaoNqhhkGNhlqE2y0A1E85Y0JErBoAAAAASUVORK5CYII='); background-image: url('/image/close.png');
} }
.hidden { .hidden {

File diff suppressed because one or more lines are too long

BIN
public/image/arrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

BIN
public/image/change.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

BIN
public/image/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

BIN
public/image/icons.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

View file

@ -33,11 +33,11 @@ function remove(id) {
} }
function pfp(id) { function pfp(id) {
return `<img src="/image/avatar?user_id=${id}">` return `<img src="/cdn/avatar?user_id=${id}">`
} }
function banner(id) { function banner(id) {
return `<img src="/image/banner?user_id=${id}" onerror="this.remove()" >` return `<img src="/cdn/banner?user_id=${id}" onerror="this.remove()" >`
} }
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',

View file

@ -5,14 +5,13 @@ use axum::{
response::Response, response::Response,
RequestExt, Router, extract::DefaultBodyLimit, RequestExt, Router, extract::DefaultBodyLimit,
}; };
use axum_client_ip::ClientIp;
use std::{net::SocketAddr, process::exit, fs}; use std::{net::SocketAddr, process::exit, fs};
use tower_cookies::CookieManagerLayer; use tower_cookies::CookieManagerLayer;
use tracing::{error, info, metadata::LevelFilter}; use tracing::{error, info, metadata::LevelFilter};
use tracing_subscriber::{ use tracing_subscriber::{
filter::filter_fn, prelude::__tracing_subscriber_SubscriberExt, util::SubscriberInitExt, Layer, 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}; use crate::api::{pages, image};
@ -38,7 +37,7 @@ async fn log<B>(mut req: Request<B>, next: Next<B>) -> Response
where where
B: Send + Sync + 'static + HttpBody, B: Send + Sync + 'static + HttpBody,
{ {
let Ok(ClientIp(ip)) = req.extract_parts::<ClientIp>().await else { let Ok(RequestIp(ip)) = req.extract_parts::<RequestIp>().await else {
return next.run(req).await return next.run(req).await
}; };
@ -79,7 +78,7 @@ async fn main() {
.layer(middleware::from_fn(serve)) .layer(middleware::from_fn(serve))
.nest("/", pages::router()) .nest("/", pages::router())
.nest("/api", api::router()) .nest("/api", api::router())
.nest("/image", image::router()) .nest("/cdn", image::router())
.layer(CookieManagerLayer::new()) .layer(CookieManagerLayer::new())
.layer(DefaultBodyLimit::max(512_000)); .layer(DefaultBodyLimit::max(512_000));

View file

@ -1,14 +1,13 @@
use std::io::{Read, Cursor}; use std::{io::{Read, Cursor}, net::{IpAddr, SocketAddr}};
use axum::{ use axum::{
async_trait, async_trait,
body::HttpBody, body::HttpBody,
extract::{FromRequest, FromRequestParts}, extract::{FromRequest, FromRequestParts, ConnectInfo},
http::{request::Parts, Request}, http::{request::Parts, Request},
response::Response, response::Response,
BoxError, RequestExt, BoxError, RequestExt,
}; };
use axum_client_ip::ClientIp;
use bytes::Bytes; use bytes::Bytes;
use image::{io::Reader, ImageFormat, DynamicImage}; use image::{io::Reader, ImageFormat, DynamicImage};
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
@ -23,6 +22,57 @@ use crate::{
}, },
}; };
pub struct RequestIp(pub IpAddr);
#[async_trait]
impl<S> FromRequestParts<S> for RequestIp
where
S: Send + Sync,
{
type Rejection = Response;
async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result<Self> {
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::<IpAddr>().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::<IpAddr>().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::<IpAddr>().ok());
if let Some(realip) = realip {
return Ok(RequestIp(realip))
}
let info = parts.extensions.get::<ConnectInfo<SocketAddr>>();
if let Some(info) = info {
return Ok(RequestIp(info.0.ip()))
}
Err(ResponseCode::Forbidden.text("You have no ip"))
}
}
pub struct AuthorizedUser(pub User); pub struct AuthorizedUser(pub User);
#[async_trait] #[async_trait]
@ -189,7 +239,7 @@ where
S: Send + Sync, S: Send + Sync,
{ {
let Ok(ClientIp(ip)) = req.extract_parts::<ClientIp>().await else { let Ok(RequestIp(ip)) = req.extract_parts::<RequestIp>().await else {
tracing::error!("Failed to read client ip"); tracing::error!("Failed to read client ip");
return Err(ResponseCode::InternalServerError.text("Failed to read client ip")); return Err(ResponseCode::InternalServerError.text("Failed to read client ip"));
}; };
@ -224,7 +274,7 @@ where
B::Error: Into<BoxError>, B::Error: Into<BoxError>,
S: Send + Sync, S: Send + Sync,
{ {
let Ok(ClientIp(ip)) = req.extract_parts::<ClientIp>().await else { let Ok(RequestIp(ip)) = req.extract_parts::<RequestIp>().await else {
tracing::error!("Failed to read client ip"); tracing::error!("Failed to read client ip");
return Err(ResponseCode::InternalServerError.text("Failed to read client ip")); return Err(ResponseCode::InternalServerError.text("Failed to read client ip"));
}; };