From 6bd5b1f71fc22e64d5a5d24228360e71d7b91c18 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 27 Sep 2025 02:55:06 -0600 Subject: [PATCH] fix(bitbucket): enhance Bitbucket authentication handling - Added support for Bitbucket email and workspace name in the authentication process. - Updated the clone URL generation to use the correct format for API tokens. - Improved error handling to ensure required fields are provided for both API tokens and app passwords. - Added console logs for debugging clone URL and repository information during cloning. --- .../server/src/utils/providers/bitbucket.ts | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/server/src/utils/providers/bitbucket.ts b/packages/server/src/utils/providers/bitbucket.ts index ca76a67fa..803805d2f 100644 --- a/packages/server/src/utils/providers/bitbucket.ts +++ b/packages/server/src/utils/providers/bitbucket.ts @@ -31,29 +31,45 @@ export const getBitbucketCloneUrl = ( apiToken?: string | null; bitbucketUsername?: string | null; appPassword?: string | null; + bitbucketEmail?: string | null; + bitbucketWorkspaceName?: string | null; } | null, repoClone: string, ) => { if (!bitbucketProvider) { throw new Error("Bitbucket provider is required"); } - return bitbucketProvider.apiToken - ? `https://x-token-auth:${bitbucketProvider.apiToken}@${repoClone}` - : `https://${bitbucketProvider.bitbucketUsername}:${bitbucketProvider.appPassword}@${repoClone}`; + + if (bitbucketProvider.apiToken) { + return `https://x-bitbucket-api-token-auth:${bitbucketProvider.apiToken}@${repoClone}`; + } + + // For app passwords, use username:app_password format + if (!bitbucketProvider.bitbucketUsername || !bitbucketProvider.appPassword) { + throw new Error("Username and app password are required when not using API token"); + } + return `https://${bitbucketProvider.bitbucketUsername}:${bitbucketProvider.appPassword}@${repoClone}`; }; export const getBitbucketHeaders = (bitbucketProvider: Bitbucket) => { if (bitbucketProvider.apiToken) { - // For API tokens, use HTTP Basic auth with email and token - // According to Bitbucket docs: email:token for API calls - const email = - bitbucketProvider.bitbucketEmail || bitbucketProvider.bitbucketUsername; + // According to Bitbucket official docs, for API calls with API tokens: + // "You will need both your Atlassian account email and an API token" + // Use: {atlassian_account_email}:{api_token} + + if (!bitbucketProvider.bitbucketEmail) { + throw new Error("Atlassian account email is required when using API token for API calls"); + } + return { - Authorization: `Basic ${Buffer.from(`${email}:${bitbucketProvider.apiToken}`).toString("base64")}`, + Authorization: `Basic ${Buffer.from(`${bitbucketProvider.bitbucketEmail}:${bitbucketProvider.apiToken}`).toString("base64")}`, }; } // For app passwords, use HTTP Basic auth with username and app password + if (!bitbucketProvider.bitbucketUsername || !bitbucketProvider.appPassword) { + throw new Error("Username and app password are required when not using API token"); + } return { Authorization: `Basic ${Buffer.from(`${bitbucketProvider.bitbucketUsername}:${bitbucketProvider.appPassword}`).toString("base64")}`, }; @@ -88,6 +104,8 @@ export const cloneBitbucketRepository = async ( await recreateDirectory(outputPath); const repoclone = `bitbucket.org/${bitbucketOwner}/${bitbucketRepository}.git`; const cloneUrl = getBitbucketCloneUrl(bitbucket, repoclone); + console.log("cloneUrl", cloneUrl); + console.log("repoclone", repoclone); try { writeStream.write(`\nCloning Repo ${repoclone} to ${outputPath}: ✅\n`); const cloneArgs = [