From e4e557c5ab81e37d08434477899c7549f1abcf0f Mon Sep 17 00:00:00 2001 From: rulasg Date: Sat, 29 Mar 2025 10:39:34 +0100 Subject: [PATCH] refactor(auth): improve base64 handling and connection logic --- Test/public/sfAuth.test.ps1 | 2 +- Test/public/sfEnvironment.test.ps1 | 15 +++++++++ public/sfAuth.ps1 | 17 ++++++---- public/sfEnvironment.ps1 | 51 +++++++++++++++++++++--------- 4 files changed, 62 insertions(+), 23 deletions(-) create mode 100644 Test/public/sfEnvironment.test.ps1 diff --git a/Test/public/sfAuth.test.ps1 b/Test/public/sfAuth.test.ps1 index 94bf032..f767187 100644 --- a/Test/public/sfAuth.test.ps1 +++ b/Test/public/sfAuth.test.ps1 @@ -20,7 +20,7 @@ function Test_SaveSfAuthInfoToSecret{ Reset-InvokeCommandMock $filename = "sforgdisplayVerbose.json" - $base64 = Get-MockFileContent -filename $filename | ConvertTo-Base64 + $base64 = Get-MockFileContent -filename $filename | out-string | ConvertTo-Base64 MockCallToString -Command "gh api user --jq '.email'" -OutString "me@contoso.com" MockCall -Command "sf org display --target-org me@contoso.com --verbose --json" -filename $filename MockCallToNull -Command "gh secret set SFDX_AUTH_URL --body '$base64' -u -r 'ownername/reponame'" diff --git a/Test/public/sfEnvironment.test.ps1 b/Test/public/sfEnvironment.test.ps1 new file mode 100644 index 0000000..4005608 --- /dev/null +++ b/Test/public/sfEnvironment.test.ps1 @@ -0,0 +1,15 @@ +function Test_InitializeSfEnvironment{ + + Assert-SkipTest + + Reset-InvokeCommandMock + Enable-InvokeCommandAliasModule + + $email = Resolve-Email + + $result = Initialize-SfEnvironment + + Assert-IsNotNull -Object $result + + Assert-AreEqual -Presented $result -Expected $email +} \ No newline at end of file diff --git a/public/sfAuth.ps1 b/public/sfAuth.ps1 index 53ef9c2..d441e42 100644 --- a/public/sfAuth.ps1 +++ b/public/sfAuth.ps1 @@ -85,7 +85,7 @@ function Get-SfAuthInfoUser { # Create the authentication file content $json = Invoke-MyCommand -Command sforgdisplayuser -Parameter @{ email = $Email} -ErrorAction SilentlyContinue - $ret = $json + $ret = $json | Out-String return $ret } Export-ModuleMember -Function Get-SfAuthInfoUser @@ -99,6 +99,8 @@ function Get-SfAuthInfoBase64{ $base64 = $text | ConvertTo-Base64 #-ErrorAction SilentlyContinue + "Generated base 64 with length $($base64.Length)" | Write-MyVerbose + return $base64 } Export-ModuleMember -Function Get-SfAuthInfoBase64 @@ -137,14 +139,16 @@ function Connect-SfAuthBase64 { # sf org login sfdx-url --sfdx-url-file authFile.json if([string]::IsNullOrWhiteSpace($Base64)){ - throw "Base64 string is null or empty." + "Base64 string is null or empty." | Write-MyVerbose + return $null } $result = $Base64 | ConvertFrom-Base64 | ConvertFrom-Json $sfdxAuthUrl = $result.result.sfdxAuthUrl if([string]::IsNullOrWhiteSpace($sfdxAuthUrl)){ - throw "sfdxAuthUrl is null or empty." + "sfdxAuthUrl is null or empty." | Write-MyVerbose + return $null } $json = Invoke-MyCommand -Command sfLoginWithSFDX -Parameter @{sfdxAuthUrl = $sfdxAuthUrl } -ErrorAction SilentlyContinue @@ -154,7 +158,8 @@ function Connect-SfAuthBase64 { $result = $json | ConvertFrom-Json -Depth 10 -AsHashtable if($result.status -ne 0){ - throw "Status $($result.status)" + "Status call to sfLoginWithSFDX is not 0 [$($result.status)]" | Write-MyVerbose + return $null } return $result.result.username @@ -167,8 +172,6 @@ function Connect-SfAuthWeb{ [Parameter()][string]$InstanceUrl = "https://github.my.salesforce.com" ) - $email = Resolve-Email - $json = Invoke-MyCommand -Command sforgloginweb -Parameters @{ instanceUrl = $InstanceUrl } -ErrorAction SilentlyContinue $json | Write-MyVerbose @@ -176,7 +179,7 @@ function Connect-SfAuthWeb{ $result = $json | ConvertFrom-Json -Depth 10 -AsHashtable if($result.status -ne 0){ - "Login failed. Login invocation result: $json" | Write-MyError + "Login failed. Login invocation result: $json" | Write-MyVerbose return $null } diff --git a/public/sfEnvironment.ps1 b/public/sfEnvironment.ps1 index eff96f5..a40a857 100644 --- a/public/sfEnvironment.ps1 +++ b/public/sfEnvironment.ps1 @@ -7,9 +7,7 @@ Set-MyInvokeCommandAlias -Alias SfCliSetConfig -Command "sf config set --global function Initialize-SfEnvironment{ [CmdletBinding(SupportsShouldProcess)] - param( - [Parameter()][string]$Email - ) + param() # 0. NPM setup check if(-not (Test-NpmSetup)){return} @@ -18,10 +16,13 @@ function Initialize-SfEnvironment{ if(-not (Install-SfClient)){return} # 2. Test Sf Login - if(-not (Set-SfConnection)){return} + $email = Initialize-SfConnection + if(-not $email){return} # 3. Sf Config - if(-not(Set-SfConfig -Email:$Email)){return} + if(-not(Set-SfConfig -Email:$email)){return} + + return $email } Export-ModuleMember -Function Initialize-SfEnvironment @@ -61,24 +62,44 @@ function Install-SfClient{ } } Export-ModuleMember -Function Install-SfClient -function Set-SfConnection{ +function Initialize-SfConnection{ [CmdletBinding()] param() - $result = Connect-sfauthbase64 + # Check already connected + $userName = Get-SfAuthUser + if($userName){ + "2. Salesforce CLI already connected with user $($userName)" | Write-ToConsole -Color "Green" + return $userName + } - if($result){ - "2. Salesforce CLI connected with user $($result)" | Write-ToConsole -Color "Green" - return $result - } else { - "2. Salesforce CLI not connected. Set environment variable SFDX_AUTH_URL. Use Get-SfAuthInfoBase64 on an Sf connected environment to get the value. Use ""sf org login device"" to connect to Sf." | Write-ToConsole -Color "Magenta" - return $null + # Connect using base64 + $userName = Connect-SfAuthBase64 -ErrorAction SilentlyContinue + if($userName){ + "2. Salesforce Cli connected usin base64 with user $($userName)" | Write-ToConsole -Color "Green" + return $userName + } + # Connect using web + $userName = Connect-SfAuthWeb -ErrorAction SilentlyContinue + if($userName){ + "2. Salesforce CLI connected using web with user $($userName)" | Write-ToConsole -Color "Green" + return $userName } -} Export-ModuleMember -Function Set-SfConnection + # Not Connected + $message = @" +2. Salesforce CLI not connected. Please connect or set environment to allow connection. + 1. Set environment variable SFDX_AUTH_URL. Use Get-SfAuthInfoBase64 on an already Sf connected environment to get the value. + 2. Login manually through the web. Use Connect-SfAuthWeb or Sf command 'sf org login web' + 3. Login manually through the device. Use Sf command 'sf org login device' +"@ + + $message | Write-ToConsole -Color "Magenta" + +} Export-ModuleMember -Function Initialize-SfConnection function Test-SfConnect{ - [CmdletBinding(SupportsShouldProcess)] + [CmdletBinding()] param( [Parameter()][string]$Email )