From b86dce69e9fbc3a153769b577e7ba1d8684979f6 Mon Sep 17 00:00:00 2001 From: Alec Armbruster <35377827+alectrocute@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:09:37 -0400 Subject: [PATCH 1/7] possible fix for #1705 --- src/server/handlers/security-handler.ts | 10 +++------- src/server/middleware.ts | 6 ++++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/server/handlers/security-handler.ts b/src/server/handlers/security-handler.ts index 0aed0cd..c0f90fb 100644 --- a/src/server/handlers/security-handler.ts +++ b/src/server/handlers/security-handler.ts @@ -5,13 +5,9 @@ export default async ({ res }: { res: Response }) => { res.send( `Contact: mailto:security@lemmy.ml - Contact: mailto:admin@` + - process.env.LEMMY_UI_LEMMY_EXTERNAL_HOST + - ` - Contact: mailto:security@` + - process.env.LEMMY_UI_LEMMY_EXTERNAL_HOST + - ` - Expires: 2024-01-01T04:59:00.000Z + Contact: mailto:admin@${process.env.LEMMY_UI_LEMMY_EXTERNAL_HOST} + Contact: mailto:security@${process.env.LEMMY_UI_LEMMY_EXTERNAL_HOST} + Expires: 2024-01-01T04:59:00.000Z ` ); }; diff --git a/src/server/middleware.ts b/src/server/middleware.ts index 9815e71..b0ccbb9 100644 --- a/src/server/middleware.ts +++ b/src/server/middleware.ts @@ -18,7 +18,7 @@ export function setDefaultCsp({ // Set cache-control headers. If user is logged in, set `private` to prevent storing data in // shared caches (eg nginx) and leaking of private data. If user is not logged in, allow caching -// all responses for 60 seconds to reduce load on backend and database. The specific cache +// all responses for 5 seconds to reduce load on backend and database. The specific cache // interval is rather arbitrary and could be set higher (less server load) or lower (fresher data). // // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control @@ -31,11 +31,13 @@ export function setCacheControl({ }) { const user = UserService.Instance; let caching: string; + if (user.auth()) { caching = "private"; } else { - caching = "public, max-age=60"; + caching = "public, max-age=5"; } + res.setHeader("Cache-Control", caching); next(); From 339cefa2b0ee206f5ca36cf2896c3473a130dc79 Mon Sep 17 00:00:00 2001 From: SleeplessOne1917 Date: Thu, 29 Jun 2023 13:14:48 -0400 Subject: [PATCH 2/7] Cache static data for a day --- src/server/index.tsx | 8 +++++++- src/server/middleware.ts | 28 +++++++++++++++++----------- src/server/utils/create-ssr-html.tsx | 2 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/server/index.tsx b/src/server/index.tsx index e1b36e2..458d7f0 100644 --- a/src/server/index.tsx +++ b/src/server/index.tsx @@ -20,7 +20,13 @@ const [hostname, port] = process.env["LEMMY_UI_HOST"] server.use(express.json()); server.use(express.urlencoded({ extended: false })); -server.use(getStaticDir(), express.static(path.resolve("./dist"))); +server.use( + getStaticDir(), + express.static(path.resolve("./dist"), { + maxAge: 24 * 60 * 60 * 1000, // 1 day + immutable: true, + }) +); server.use(setCacheControl); if (!process.env["LEMMY_UI_DISABLE_CSP"] && !process.env["LEMMY_UI_DEBUG"]) { diff --git a/src/server/middleware.ts b/src/server/middleware.ts index 9815e71..753fce9 100644 --- a/src/server/middleware.ts +++ b/src/server/middleware.ts @@ -1,4 +1,4 @@ -import type { NextFunction, Response } from "express"; +import type { NextFunction, Request, Response } from "express"; import { UserService } from "../shared/services"; export function setDefaultCsp({ @@ -22,19 +22,25 @@ export function setDefaultCsp({ // interval is rather arbitrary and could be set higher (less server load) or lower (fresher data). // // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control -export function setCacheControl({ - res, - next, -}: { - res: Response; - next: NextFunction; -}) { +export function setCacheControl( + req: Request, + res: Response, + next: NextFunction +) { const user = UserService.Instance; let caching: string; - if (user.auth()) { - caching = "private"; + if ( + req.path.match(/\.(js|css|txt|manifest\.webmanifest)\/?$/) || + req.path.includes("/css/themelist") + ) { + // Static content gets cached publicly for a day + caching = "public, max-age=86400"; } else { - caching = "public, max-age=60"; + if (user.auth()) { + caching = "private"; + } else { + caching = "public, max-age=60"; + } } res.setHeader("Cache-Control", caching); diff --git a/src/server/utils/create-ssr-html.tsx b/src/server/utils/create-ssr-html.tsx index f6d46b0..ba85228 100644 --- a/src/server/utils/create-ssr-html.tsx +++ b/src/server/utils/create-ssr-html.tsx @@ -24,7 +24,7 @@ export async function createSsrHtml( if (!appleTouchIcon) { appleTouchIcon = site?.site_view.site.icon - ? `data:image/png;base64,${sharp( + ? `data:image/png;base64,${await sharp( await fetchIconPng(site.site_view.site.icon) ) .resize(180, 180) From fead020bdcd2e63cb9291b60ad8d5ff1e701fee9 Mon Sep 17 00:00:00 2001 From: Alec Armbruster <35377827+alectrocute@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:28:55 -0400 Subject: [PATCH 3/7] Fix `PostListing` mobile margin layout issue (#1706) --- src/shared/components/post/post-listing.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/shared/components/post/post-listing.tsx b/src/shared/components/post/post-listing.tsx index 586403b..5c562a4 100644 --- a/src/shared/components/post/post-listing.tsx +++ b/src/shared/components/post/post-listing.tsx @@ -403,8 +403,9 @@ export class PostListing extends Component { createdLine() { const post_view = this.postView; + return ( -
+
From d8ee0ec78aed4c40b921d2b863db6afb7630587f Mon Sep 17 00:00:00 2001 From: Alec Armbruster <35377827+alectrocute@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:33:30 -0400 Subject: [PATCH 4/7] change max-age to 5 for non-authed responses --- src/server/middleware.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/server/middleware.ts b/src/server/middleware.ts index 753fce9..84c568d 100644 --- a/src/server/middleware.ts +++ b/src/server/middleware.ts @@ -18,7 +18,7 @@ export function setDefaultCsp({ // Set cache-control headers. If user is logged in, set `private` to prevent storing data in // shared caches (eg nginx) and leaking of private data. If user is not logged in, allow caching -// all responses for 60 seconds to reduce load on backend and database. The specific cache +// all responses for 5 seconds to reduce load on backend and database. The specific cache // interval is rather arbitrary and could be set higher (less server load) or lower (fresher data). // // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control @@ -29,6 +29,7 @@ export function setCacheControl( ) { const user = UserService.Instance; let caching: string; + if ( req.path.match(/\.(js|css|txt|manifest\.webmanifest)\/?$/) || req.path.includes("/css/themelist") @@ -39,9 +40,10 @@ export function setCacheControl( if (user.auth()) { caching = "private"; } else { - caching = "public, max-age=60"; + caching = "public, max-age=5"; } } + res.setHeader("Cache-Control", caching); next(); From 9e7fec772d873e7bc46a51403d9569f70619c9b8 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 29 Jun 2023 16:20:38 -0400 Subject: [PATCH 5/7] v0.18.1-rc.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cf2d78f..9acaba4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lemmy-ui", - "version": "0.18.1-rc.4", + "version": "0.18.1-rc.5", "description": "An isomorphic UI for lemmy", "repository": "https://github.com/LemmyNet/lemmy-ui", "license": "AGPL-3.0", From 2d88e42cabac606d2b7f201fcce6985f9da538f4 Mon Sep 17 00:00:00 2001 From: SleeplessOne1917 Date: Thu, 29 Jun 2023 16:33:08 -0400 Subject: [PATCH 6/7] Fix dev caching issue --- src/server/middleware.ts | 7 +++++-- webpack.config.js | 7 ++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/server/middleware.ts b/src/server/middleware.ts index 84c568d..f64b781 100644 --- a/src/server/middleware.ts +++ b/src/server/middleware.ts @@ -29,10 +29,13 @@ export function setCacheControl( ) { const user = UserService.Instance; let caching: string; + console.log("In middleware"); + console.log(process.env.NODE_ENV); if ( - req.path.match(/\.(js|css|txt|manifest\.webmanifest)\/?$/) || - req.path.includes("/css/themelist") + process.env.NODE_ENV === "production" && + (req.path.match(/\.(js|css|txt|manifest\.webmanifest)\/?$/) || + req.path.includes("/css/themelist")) ) { // Static content gets cached publicly for a day caching = "public, max-age=86400"; diff --git a/webpack.config.js b/webpack.config.js index 9afdb52..0c9806d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,7 +14,7 @@ const banner = ` @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL v3.0 `; -function getBase(env) { +function getBase(env, mode) { return { output: { filename: "js/server.js", @@ -54,6 +54,7 @@ function getBase(env) { plugins: [ new webpack.DefinePlugin({ "process.env.COMMIT_HASH": `"${env.COMMIT_HASH}"`, + "process.env.NODE_ENV": `"${mode}"`, }), new MiniCssExtractPlugin({ filename: "styles/styles.css", @@ -69,7 +70,7 @@ function getBase(env) { } const createServerConfig = (env, mode) => { - const base = getBase(env); + const base = getBase(env, mode); const config = merge({}, base, { mode, entry: "./src/server/index.tsx", @@ -97,7 +98,7 @@ const createServerConfig = (env, mode) => { }; const createClientConfig = (env, mode) => { - const base = getBase(env); + const base = getBase(env, mode); const config = merge({}, base, { mode, entry: "./src/client/index.tsx", From cc184a86c82943ba78588736cc19c9f4a04e22b4 Mon Sep 17 00:00:00 2001 From: SleeplessOne1917 Date: Thu, 29 Jun 2023 18:12:22 -0400 Subject: [PATCH 7/7] Fix authorized route false flag --- src/server/middleware.ts | 2 -- src/shared/utils/app/is-auth-path.ts | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/server/middleware.ts b/src/server/middleware.ts index f64b781..235f072 100644 --- a/src/server/middleware.ts +++ b/src/server/middleware.ts @@ -29,8 +29,6 @@ export function setCacheControl( ) { const user = UserService.Instance; let caching: string; - console.log("In middleware"); - console.log(process.env.NODE_ENV); if ( process.env.NODE_ENV === "production" && diff --git a/src/shared/utils/app/is-auth-path.ts b/src/shared/utils/app/is-auth-path.ts index 0ec963a..5a201ac 100644 --- a/src/shared/utils/app/is-auth-path.ts +++ b/src/shared/utils/app/is-auth-path.ts @@ -1,5 +1,5 @@ export default function isAuthPath(pathname: string) { - return /create_.*|inbox|settings|admin|reports|registration_applications/g.test( + return /^\/create_.*|inbox|settings|admin|reports|registration_applications/g.test( pathname ); }