Skip to content

Commit 5301f4e

Browse files
committed
Reworked the NuGetApiKey handling routines (decomposed Get-NuGetApiKey into several functions).
1 parent 7a0f7bd commit 5301f4e

File tree

1 file changed

+104
-42
lines changed

1 file changed

+104
-42
lines changed

examples/Build.ps1

Lines changed: 104 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,19 @@ Task default -depends Build
117117
Task Publish -depends Test, PrePublish, PublishImpl, PostPublish {
118118
}
119119

120-
Task PublishImpl -depends Test -requiredVariables PublishDir, EncryptedApiKeyPath {
121-
$NuGetApiKey = Get-NuGetApiKey $NuGetApiKey $EncryptedApiKeyPath
120+
Task PublishImpl -depends Test -requiredVariables EncryptedApiKeyPath, PublishDir {
121+
if ($NuGetApiKey) {
122+
"Using script embedded NuGetApiKey"
123+
}
124+
elseif (Test-Path -LiteralPath $EncryptedApiKeyPath) {
125+
$NuGetApiKey = LoadAndUnencryptNuGetApiKey $EncryptedApiKeyPath
126+
"Using stored NuGetApiKey"
127+
}
128+
else {
129+
$cred = PromptUserForNuGetApiKeyCredential -DestinationPath $EncryptedApiKeyPath
130+
$NuGetApiKey = $cred.GetNetworkCredential().Password
131+
"The NuGetApiKey has been stored in $EncryptedApiKeyPath"
132+
}
122133

123134
$publishParams = @{
124135
Path = $PublishDir
@@ -144,7 +155,7 @@ Task Test -depends Build {
144155
}
145156

146157
Task Build -depends Clean -requiredVariables PublishDir, Exclude, ModuleName {
147-
Copy-Item $PSScriptRoot\* -Destination $PublishDir -Recurse -Exclude $Exclude
158+
Copy-Item -Path $PSScriptRoot\* -Destination $PublishDir -Recurse -Exclude $Exclude
148159

149160
# Get contents of the ReleaseNotes file and update the copied module manifest file
150161
# with the release notes.
@@ -170,58 +181,109 @@ Task Init -requiredVariables PublishDir {
170181
}
171182
}
172183

173-
Task StoreKey -requiredVariables EncryptedApiKeyPath {
174-
if (Test-Path $EncryptedApiKeyPath) {
175-
Remove-Item $EncryptedApiKeyPath
184+
Task RemoveKey -requiredVariables EncryptedApiKeyPath {
185+
if (Test-Path -LiteralPath $EncryptedApiKeyPath) {
186+
Remove-Item -LiteralPath $EncryptedApiKeyPath
176187
}
188+
}
177189

178-
$null = Get-NuGetApiKey $NuGetApiKey $EncryptedApiKeyPath
190+
Task StoreKey -requiredVariables EncryptedApiKeyPath {
191+
$nuGetApiKeyCred = PromptUserForNuGetApiKeyCredential -DestinationPath $EncryptedApiKeyPath
179192
"The NuGetApiKey has been stored in $EncryptedApiKeyPath"
180193
}
181194

182195
Task ShowKey -requiredVariables EncryptedApiKeyPath {
183-
$NuGetApiKey = Get-NuGetApiKey $NuGetApiKey $EncryptedApiKeyPath
184-
"The stored NuGetApiKey is: $NuGetApiKey"
196+
$OFS = ''
197+
198+
if ($NuGetApiKey) {
199+
"The embedded (partial) NuGetApiKey is: $($NuGetApiKey[0..7])"
200+
}
201+
else {
202+
$NuGetApiKey = LoadAndUnencryptNuGetApiKey -Path $EncryptedApiKeyPath
203+
"The stored (partial) NuGetApiKey is: $($NuGetApiKey[0..7])"
204+
}
205+
206+
"To see the full key, use the task 'ShowFullKey'"
207+
}
208+
209+
Task ShowFullKey -requiredVariables EncryptedApiKeyPath {
210+
if ($NuGetApiKey) {
211+
"The embedded NuGetApiKey is: $NuGetApiKey"
212+
}
213+
else {
214+
$NuGetApiKey = LoadAndUnencryptNuGetApiKey -Path $EncryptedApiKeyPath
215+
"The stored NuGetApiKey is: $NuGetApiKey"
216+
}
185217
}
186218

187219
Task ? -description 'Lists the available tasks' {
188220
"Available tasks:"
189-
$psake.context.Peek().tasks.Keys | Sort
221+
$PSake.Context.Peek().Tasks.Keys | Sort-Object
190222
}
191223

192224
###############################################################################
193225
# Helper functions
194226
###############################################################################
195-
function Get-NuGetApiKey($NuGetApiKey, $EncryptedApiKeyPath) {
196-
$storedKey = $null
197-
if (!$NuGetApiKey) {
198-
if (Test-Path $EncryptedApiKeyPath) {
199-
$storedKey = Import-Clixml $EncryptedApiKeyPath | ConvertTo-SecureString
200-
$cred = New-Object -TypeName PSCredential -ArgumentList 'kh',$storedKey
201-
$NuGetApiKey = $cred.GetNetworkCredential().Password
202-
Write-Verbose "Retrieved encrypted NuGetApiKey from $EncryptedApiKeyPath"
203-
}
204-
else {
205-
$cred = Get-Credential -Message "Enter your NuGet API Key in the password field (or nothing, this isn't used yet in the preview)" -UserName "user"
206-
$apiKeySS = $cred.Password
207-
$NuGetApiKey = $cred.GetNetworkCredential().Password
208-
}
209-
}
210-
211-
if (!$storedKey) {
212-
# Store encrypted NuGet API key to use for future invocations
213-
if (!$apiKeySS) {
214-
$apiKeySS = ConvertTo-SecureString -String $NuGetApiKey -AsPlainText -Force
215-
}
216-
217-
$parentDir = Split-Path $EncryptedApiKeyPath -Parent
218-
if (!(Test-Path -Path $parentDir)) {
219-
$null = New-Item -Path $parentDir -ItemType Directory
220-
}
221-
222-
$apiKeySS | ConvertFrom-SecureString | Export-Clixml $EncryptedApiKeyPath
223-
Write-Verbose "Stored encrypted NuGetApiKey to $EncryptedApiKeyPath"
224-
}
225-
226-
$NuGetApiKey
227+
function PromptUserForNuGetApiKeyCredential {
228+
param(
229+
[Parameter()]
230+
[ValidateNotNullOrEmpty()]
231+
[string]
232+
$DestinationPath
233+
)
234+
235+
$message = "Enter your NuGet API Key in the password field (or nothing, this isn't used yet in the preview)"
236+
$nuGetApiKeyCred = Get-Credential -Message $message -UserName "ignored"
237+
238+
if ($DestinationPath) {
239+
EncryptAndSaveNuGetApiKey -NuGetApiKeySecureString $nuGetApiKeyCred.Password -Path $DestinationPath
240+
}
241+
242+
$nuGetApiKeyCred
243+
}
244+
245+
function EncryptAndSaveNuGetApiKey {
246+
param(
247+
[Parameter(Mandatory, ParameterSetName='SecureString')]
248+
[ValidateNotNull()]
249+
[SecureString]
250+
$NuGetApiKeySecureString,
251+
252+
[Parameter(Mandatory, ParameterSetName='PlainText')]
253+
[ValidateNotNullOrEmpty()]
254+
[string]
255+
$NuGetApiKey,
256+
257+
[Parameter(Mandatory)]
258+
$Path
259+
)
260+
261+
if ($PSCmdlet.ParameterSetName -eq 'PlainText') {
262+
$NuGetApiKeySecureString = ConvertTo-SecureString -String $NuGetApiKey -AsPlainText -Force
263+
}
264+
265+
$parentDir = Split-Path $Path -Parent
266+
if (!(Test-Path -LiteralPath $parentDir)) {
267+
$null = New-Item -Path $parentDir -ItemType Directory
268+
}
269+
elseif (Test-Path -LiteralPath $Path) {
270+
Remove-Item -LiteralPath $Path
271+
}
272+
273+
$NuGetApiKeySecureString | ConvertFrom-SecureString | Export-Clixml $Path
274+
Write-Verbose "The NuGetApiKey has been encrypted and saved to $Path"
275+
}
276+
277+
function LoadAndUnencryptNuGetApiKey {
278+
param(
279+
[Parameter(Mandatory)]
280+
[ValidateNotNullOrEmpty()]
281+
[string]
282+
$Path
283+
)
284+
285+
$storedKey = Import-Clixml $Path | ConvertTo-SecureString
286+
$cred = New-Object -TypeName PSCredential -ArgumentList 'jpgr',$storedKey
287+
$cred.GetNetworkCredential().Password
288+
Write-Verbose "The NuGetApiKey has been loaded and unencrypted from $Path"
227289
}

0 commit comments

Comments
 (0)