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 1/3] 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 = [ From 5fdf82a27fd37c178ae182efa07198d893baa0dd Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 27 Sep 2025 02:55:42 -0600 Subject: [PATCH 2/3] refactor(bitbucket): remove debug console logs from repository cloning process - Removed console logs for clone URL and repository information to clean up the output during the cloning process. --- packages/server/src/utils/providers/bitbucket.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/server/src/utils/providers/bitbucket.ts b/packages/server/src/utils/providers/bitbucket.ts index 803805d2f..19587a2e5 100644 --- a/packages/server/src/utils/providers/bitbucket.ts +++ b/packages/server/src/utils/providers/bitbucket.ts @@ -104,8 +104,6 @@ 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 = [ From 77705381cd94ba3e84ff4afdcc8da7378028ebf1 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 27 Sep 2025 08:56:28 +0000 Subject: [PATCH 3/3] [autofix.ci] apply automated fixes --- .../server/src/utils/providers/bitbucket.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/server/src/utils/providers/bitbucket.ts b/packages/server/src/utils/providers/bitbucket.ts index 19587a2e5..ed6cd8c31 100644 --- a/packages/server/src/utils/providers/bitbucket.ts +++ b/packages/server/src/utils/providers/bitbucket.ts @@ -39,14 +39,16 @@ export const getBitbucketCloneUrl = ( if (!bitbucketProvider) { throw new Error("Bitbucket provider is required"); } - + 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"); + throw new Error( + "Username and app password are required when not using API token", + ); } return `https://${bitbucketProvider.bitbucketUsername}:${bitbucketProvider.appPassword}@${repoClone}`; }; @@ -56,11 +58,13 @@ export const getBitbucketHeaders = (bitbucketProvider: Bitbucket) => { // 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"); + throw new Error( + "Atlassian account email is required when using API token for API calls", + ); } - + return { Authorization: `Basic ${Buffer.from(`${bitbucketProvider.bitbucketEmail}:${bitbucketProvider.apiToken}`).toString("base64")}`, }; @@ -68,7 +72,9 @@ export const getBitbucketHeaders = (bitbucketProvider: Bitbucket) => { // 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"); + 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")}`,