From fc5b8d03e5423010a7b005677cf6b3d1db18fb74 Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Thu, 13 Aug 2026 14:41:10 -0600 Subject: [PATCH] fix(gitlab): handle missing expires_in in OAuth token response Some self-hosted GitLab instances (e.g. older versions without expires_in configured in doorkeeper) omit expires_in from the OAuth token response. Computing Date.now()/1000 + undefined produced NaN, which Postgres rejected on the expires_at integer column, crashing both the initial OAuth callback and the token refresh flow with a 500. Falls back to null when expires_in is absent, matching the existing Gitea callback behavior. Closes #4362 --- apps/dokploy/pages/api/providers/gitlab/callback.ts | 4 +++- packages/server/src/utils/providers/gitlab.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/dokploy/pages/api/providers/gitlab/callback.ts b/apps/dokploy/pages/api/providers/gitlab/callback.ts index 42d81df12..a43e88890 100644 --- a/apps/dokploy/pages/api/providers/gitlab/callback.ts +++ b/apps/dokploy/pages/api/providers/gitlab/callback.ts @@ -53,7 +53,9 @@ export default async function handler( return res.status(400).json({ error: "Missing or invalid code" }); } - const expiresAt = Math.floor(Date.now() / 1000) + result.expires_in; + const expiresAt = result.expires_in + ? Math.floor(Date.now() / 1000) + result.expires_in + : null; await updateGitlab(gitlab.gitlabId, { accessToken: result.access_token, refreshToken: result.refresh_token, diff --git a/packages/server/src/utils/providers/gitlab.ts b/packages/server/src/utils/providers/gitlab.ts index 3907130ee..6cb777b75 100644 --- a/packages/server/src/utils/providers/gitlab.ts +++ b/packages/server/src/utils/providers/gitlab.ts @@ -44,7 +44,9 @@ export const refreshGitlabToken = async (gitlabProviderId: string) => { const data = await response.json(); - const expiresAt = Math.floor(Date.now() / 1000) + data.expires_in; + const expiresAt = data.expires_in + ? Math.floor(Date.now() / 1000) + data.expires_in + : null; await updateGitlab(gitlabProviderId, { accessToken: data.access_token,