Fix Lumière theming + upload timeout via global middleware
Build and Deploy Verso / deploy (push) Successful in 14m26s

Theming: replace per-controller isLumiere lookups with a single
ExpressLocals middleware that sets res.locals.isLumiere for every
web request. Uses getOverallTheme() (now exported from
UserSettingsHelper) so the date-based default is handled correctly.
This covers 404, settings, setPassword, activate, and all future
server-rendered pages automatically.

Upload timeout: add client_body_timeout 15m to nginx.conf.template
at the http level (was defaulting to 60s globally). This is more
reliable than the location-specific override from build 229.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
claude
2026-06-13 19:33:53 +00:00
parent 2ec6ca827e
commit 211ca9c46d
7 changed files with 28 additions and 28 deletions
+1
View File
@@ -47,6 +47,7 @@ http {
gzip_proxied any; # allow upstream server to compress.
client_max_body_size 500m;
client_body_timeout 15m;
# gzip_vary on;
# gzip_proxied any;
@@ -5,26 +5,14 @@ import {
} from '@overleaf/validation-tools'
import Errors, { NotFoundError } from './Errors.js'
import SessionManager from '../Authentication/SessionManager.mjs'
import UserGetter from '../User/UserGetter.mjs'
import SamlLogHandler from '../SamlLog/SamlLogHandler.mjs'
import HttpErrorHandler from './HttpErrorHandler.mjs'
import { plainTextResponse } from '../../infrastructure/Response.mjs'
import { expressifyErrorHandler } from '@overleaf/promise-utils'
async function notFound(req, res) {
function notFound(req, res) {
res.status(404)
const sessionUser = SessionManager.getSessionUser(req.session)
let isLumiere = false
if (sessionUser?._id) {
try {
const user = await UserGetter.promises.getUser(sessionUser._id, {
'ace.overallTheme': 1,
signUpDate: 1,
})
isLumiere = (user?.ace?.overallTheme ?? '') === 'lumiere-'
} catch {}
}
res.render('general/404', { title: 'page_not_found', isLumiere })
res.render('general/404', { title: 'page_not_found' })
}
function forbidden(req, res) {
@@ -215,23 +215,12 @@ async function renderSetPasswordForm(req, res, next) {
const passwordResetToken = req.session.resetToken
delete req.session.resetToken
let isLumiere = false
if (email) {
try {
const emailUser = await UserGetter.promises.getUserByMainEmail(email, {
'ace.overallTheme': 1,
})
isLumiere = (emailUser?.ace?.overallTheme ?? '') === 'lumiere-'
} catch {}
}
res.render(
Features.hasFeature('saas') ? 'user/setPasswordCiam' : 'user/setPassword',
{
title: 'set_password',
email,
passwordResetToken,
isLumiere,
}
)
}
@@ -46,4 +46,5 @@ async function buildUserSettings(_req, _res, user) {
export default {
buildUserSettings,
getOverallTheme,
}
@@ -177,7 +177,6 @@ async function settingsPage(req, res) {
isSaas: Features.hasFeature('saas'),
memberOfSSOEnabledGroups,
capabilities: [...req.capabilitySet],
isLumiere: (user?.ace?.overallTheme ?? '') === 'lumiere-',
})
}
@@ -8,6 +8,8 @@ import { fetchJson } from '@overleaf/fetch-utils'
import contentDisposition from 'content-disposition'
import Features from './Features.mjs'
import SessionManager from '../Features/Authentication/SessionManager.mjs'
import UserGetter from '../Features/User/UserGetter.mjs'
import UserSettingsHelper from '../Features/Project/UserSettingsHelper.mjs'
import PackageVersions from './PackageVersions.js'
import Modules from './Modules.mjs'
import Errors from '../Features/Errors/Errors.js'
@@ -269,6 +271,28 @@ export default async function (webRouter, privateApiRouter, publicApiRouter) {
next()
})
webRouter.use(
expressify(async function (req, res, next) {
res.locals.isLumiere = false
const sessionUser = SessionManager.getSessionUser(req.session)
if (sessionUser?._id) {
try {
const user = await UserGetter.promises.getUser(sessionUser._id, {
'ace.overallTheme': 1,
signUpDate: 1,
})
if (user) {
res.locals.isLumiere =
UserSettingsHelper.getOverallTheme(user) === 'lumiere-'
}
} catch (err) {
logger.warn({ err }, 'failed to fetch theme for isLumiere')
}
}
next()
})
)
webRouter.use(function (req, res, next) {
res.locals.getLoggedInUserId = () =>
SessionManager.getLoggedInUserId(req.session)
@@ -40,7 +40,6 @@ async function activateAccountPage(req, res, next) {
const user = await UserGetter.promises.getUser(req.query.user_id, {
email: 1,
loginCount: 1,
'ace.overallTheme': 1,
})
if (!user) {
@@ -60,7 +59,6 @@ async function activateAccountPage(req, res, next) {
title: 'activate_account',
email: user.email,
token: req.query.token,
isLumiere: (user?.ace?.overallTheme ?? '') === 'lumiere-',
})
}