From af3c009396539c1daa1ed0a3ace6fb0c89da38de Mon Sep 17 00:00:00 2001 From: ashitsalesforce <71143047+ashitsalesforce@users.noreply.github.com> Date: Sat, 7 Jun 2025 23:35:00 -0700 Subject: [PATCH] PKCE port in Settings dialog Ability to configure PKCE port in Settings dialog. Also, set the default port as 7171. --- .../dataloader/config/AppConfig.java | 2 +- .../dataloader/ui/AdvancedSettingsDialog.java | 18 ++++++++++++++++++ .../dataloader/util/OAuthBrowserFlow.java | 1 - src/main/resources/labels.properties | 2 ++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/salesforce/dataloader/config/AppConfig.java b/src/main/java/com/salesforce/dataloader/config/AppConfig.java index 7c86749b..6a1794a7 100644 --- a/src/main/java/com/salesforce/dataloader/config/AppConfig.java +++ b/src/main/java/com/salesforce/dataloader/config/AppConfig.java @@ -1802,7 +1802,7 @@ private synchronized static String getDefaultCharsetForCsvReadWrite() { private final List listeners = new ArrayList(); public static final int DEFAULT_MAX_SOQL_CHAR_LENGTH = 100000; - public static final int DEFAULT_OAUTH_PKCE_PORT = 1717; + public static final int DEFAULT_OAUTH_PKCE_PORT = 7171; public synchronized void addListener(ConfigListener l) { listeners.add(l); diff --git a/src/main/java/com/salesforce/dataloader/ui/AdvancedSettingsDialog.java b/src/main/java/com/salesforce/dataloader/ui/AdvancedSettingsDialog.java index d8de447e..cfa5bc28 100644 --- a/src/main/java/com/salesforce/dataloader/ui/AdvancedSettingsDialog.java +++ b/src/main/java/com/salesforce/dataloader/ui/AdvancedSettingsDialog.java @@ -92,6 +92,7 @@ public class AdvancedSettingsDialog extends BaseDialog { private Text textSandboxBulkClientID; private Text textWizardWidth; private Text textWizardHeight; + private Text textOAuthPKCEPort; private Button buttonShowWelcomeScreen; private Button buttonShowLoaderUpgradeScreen; @@ -795,6 +796,22 @@ public void verifyText(VerifyEvent event) { buttonLoginFromBrowser = new Button(restComp, SWT.CHECK); buttonLoginFromBrowser.setSelection(doLoginFromBrowser); + // OAuth PKCE Port + createLabel(restComp, null, null, AppConfig.PROP_OAUTH_PKCE_PORT); + textOAuthPKCEPort = new Text(restComp, SWT.BORDER); + textOAuthPKCEPort.setText(appConfig.getString(AppConfig.PROP_OAUTH_PKCE_PORT)); + textOAuthPKCEPort.addVerifyListener(new VerifyListener() { + @Override + public void verifyText(VerifyEvent event) { + event.doit = Character.isISOControl(event.character) || Character.isDigit(event.character); + } + }); + data = new GridData(); + textOAuthPKCEPort.setTextLimit(5); + data.widthHint = 5 * textSize.x; + textOAuthPKCEPort.setLayoutData(data); + textOAuthPKCEPort.setToolTipText(Labels.getString("AdvancedSettingsDialog.uiTooltip." + AppConfig.PROP_OAUTH_PKCE_PORT)); + createLabel(restComp, null, null, appConfig.getOAuthEnvironmentPropertyName(AppConfig.SERVER_PROD_ENVIRONMENT_VAL, AppConfig.PARTNER_CLIENTID_LITERAL)); this.textProductionPartnerClientID = new Text(restComp, SWT.NONE); @@ -1066,6 +1083,7 @@ public void widgetSelected(SelectionEvent event) { appConfig.setValue(AppConfig.PROP_BULK_API_ZIP_CONTENT, buttonBulkApiZipContent.getSelection()); appConfig.setValue(AppConfig.PROP_BULKV2_API_ENABLED, buttonUseBulkV2Api.getSelection()); appConfig.setValue(AppConfig.PROP_OAUTH_LOGIN_FROM_BROWSER, buttonLoginFromBrowser.getSelection()); + appConfig.setValue(AppConfig.PROP_OAUTH_PKCE_PORT, textOAuthPKCEPort.getText()); appConfig.setValue(AppConfig.PROP_WIZARD_CLOSE_ON_FINISH, buttonCloseWizardOnFinish.getSelection()); appConfig.setValue(AppConfig.PROP_WIZARD_WIDTH, textWizardWidth.getText()); appConfig.setValue(AppConfig.PROP_WIZARD_HEIGHT, textWizardHeight.getText()); diff --git a/src/main/java/com/salesforce/dataloader/util/OAuthBrowserFlow.java b/src/main/java/com/salesforce/dataloader/util/OAuthBrowserFlow.java index 54771706..99986954 100644 --- a/src/main/java/com/salesforce/dataloader/util/OAuthBrowserFlow.java +++ b/src/main/java/com/salesforce/dataloader/util/OAuthBrowserFlow.java @@ -494,7 +494,6 @@ private void logErrorResponse(InputStream inputStream) { * Finds an available port for the callback server. */ private int findAvailablePort() { - // First try the configured port (defaults to 1717, same as Salesforce CLI) int preferredPort; try { preferredPort = appConfig.getInt(AppConfig.PROP_OAUTH_PKCE_PORT); diff --git a/src/main/resources/labels.properties b/src/main/resources/labels.properties index e70732dd..0e1b71f9 100644 --- a/src/main/resources/labels.properties +++ b/src/main/resources/labels.properties @@ -137,6 +137,8 @@ AdvancedSettingsDialog.uiLabel.loader.query.delimiter=Delimiter for query result AdvancedSettingsDialog.uiLabel.loader.query.includeBinaryData=Include image content in query results of Rich Text Fields: AdvancedSettingsDialog.uiLabel.escapeFormulaInFieldValue=Escape formula values in exported results with a single-quote character: AdvancedSettingsDialog.uiLabel.sfdc.oauth.loginfrombrowser=Enable OAuth login from browser: +AdvancedSettingsDialog.uiLabel.sfdc.oauth.pkce.port=OAuth PKCE callback port: +AdvancedSettingsDialog.uiTooltip.sfdc.oauth.pkce.port=Port number for local HTTP server used during OAuth PKCE authentication (defaults to 7171) AdvancedSettingsDialog.uiLabel.sfdc.oauth.Production.partner.clientid=Client ID for SOAP API in Production: AdvancedSettingsDialog.uiLabel.sfdc.oauth.Production.bulk.clientid=Client ID for Bulk API and Bulk API 2.0 in Production: AdvancedSettingsDialog.uiLabel.sfdc.oauth.Sandbox.partner.clientid=Client ID for SOAP API in Sandbox: