Skip to content

Commit c53a539

Browse files
fix: not correctly process exclude_upper param
- when generating user and password credential types - fixes the typo
1 parent 39bc7bb commit c53a539

File tree

2 files changed

+96
-4
lines changed

2 files changed

+96
-4
lines changed

backends/credhub/src/main/kotlin/org/cloudfoundry/credhub/credentials/RemoteCredentialsHandler.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -515,8 +515,8 @@ class RemoteCredentialsHandler(
515515
if (jsonNode.hasNonNull("exclude_lower")) {
516516
generationParameters.excludeLower = jsonNode["exclude_lower"].booleanValue()
517517
}
518-
if (jsonNode.hasNonNull("exlude_upper")) {
519-
generationParameters.excludeUpper = jsonNode["exlude_upper"].booleanValue()
518+
if (jsonNode.hasNonNull("exclude_upper")) {
519+
generationParameters.excludeUpper = jsonNode["exclude_upper"].booleanValue()
520520
}
521521
if (jsonNode.hasNonNull("exclude_number")) {
522522
generationParameters.excludeNumber = jsonNode["exclude_number"].booleanValue()
@@ -543,8 +543,8 @@ class RemoteCredentialsHandler(
543543
if (jsonNode.hasNonNull("exclude_lower")) {
544544
generationParameters.excludeLower = jsonNode["exclude_lower"].booleanValue()
545545
}
546-
if (jsonNode.hasNonNull("exlude_upper")) {
547-
generationParameters.excludeUpper = jsonNode["exlude_upper"].booleanValue()
546+
if (jsonNode.hasNonNull("exclude_upper")) {
547+
generationParameters.excludeUpper = jsonNode["exclude_upper"].booleanValue()
548548
}
549549
if (jsonNode.hasNonNull("exclude_number")) {
550550
generationParameters.excludeNumber = jsonNode["exclude_number"].booleanValue()

backends/credhub/src/test/kotlin/org/cloudfoundry/credhub/handlers/RemoteCredentialsHandlerTest.kt

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,6 +1355,52 @@ class RemoteCredentialsHandlerTest {
13551355
assertThat(actualValue).isEqualTo(shouldBeReturned.username)
13561356
}
13571357

1358+
@Test
1359+
fun generateUser_whenParsingGenerationParameters_preservesAllFields() {
1360+
val type = "user"
1361+
val uuid = UUID.randomUUID().toString()
1362+
val userCredential = UserCredentialValue("test-user", "test-password", "salt")
1363+
1364+
// Create generation parameters with ALL fields set
1365+
val originalGenerationParameters = StringGenerationParameters()
1366+
originalGenerationParameters.length = 15
1367+
originalGenerationParameters.username = "test-username"
1368+
originalGenerationParameters.excludeLower = false
1369+
originalGenerationParameters.excludeUpper = true
1370+
originalGenerationParameters.excludeNumber = true
1371+
originalGenerationParameters.includeSpecial = false
1372+
1373+
// Serialize to ByteString (as remote backend would)
1374+
val generationParamsByteString = subject.createByteStringFromGenerationParameters(type, originalGenerationParameters)
1375+
1376+
// Create a GetResponse with these generation parameters (simulating remote backend response)
1377+
val getResponse =
1378+
GetResponse
1379+
.newBuilder()
1380+
.setName(CREDENTIAL_NAME)
1381+
.setType(type)
1382+
.setData(subject.createByteStringFromData(type, userCredential))
1383+
.setId(uuid)
1384+
.setVersionCreatedAt(versionCreatedAt)
1385+
.setGenerationParameters(generationParamsByteString)
1386+
.build()
1387+
1388+
`when`(client.getByNameRequest(CREDENTIAL_NAME, USER)).thenReturn(getResponse)
1389+
1390+
// Create a new request with matching parameters
1391+
val userGenerateRequest = UserGenerateRequest()
1392+
userGenerateRequest.setGenerationParameters(originalGenerationParameters)
1393+
userGenerateRequest.name = CREDENTIAL_NAME
1394+
userGenerateRequest.type = type
1395+
1396+
// This should NOT regenerate because parameters match
1397+
val generateResponse = subject.generateCredential(userGenerateRequest)
1398+
1399+
// Verify the credential was not regenerated (existing one returned)
1400+
assertThat(generateResponse.getUuid()).isEqualTo(uuid)
1401+
assertThat((generateResponse.value as UserCredentialValue).username).isEqualTo("test-user")
1402+
}
1403+
13581404
@Test
13591405
fun generatePassword_whenExistingPasswordGenerationParametersDontMatch_generateNewCredential() {
13601406
val type = "password"
@@ -1530,6 +1576,52 @@ class RemoteCredentialsHandlerTest {
15301576
assertThat(actualValue).isEqualTo(originalPassword.stringCredential.toString())
15311577
}
15321578

1579+
@Test
1580+
fun generatePassword_whenParsingGenerationParameters_preservesAllFields() {
1581+
val type = "password"
1582+
val uuid = UUID.randomUUID().toString()
1583+
val password = StringCredentialValue("test-password")
1584+
1585+
// Create generation parameters with ALL fields set
1586+
val originalGenerationParameters = StringGenerationParameters()
1587+
originalGenerationParameters.length = 20
1588+
originalGenerationParameters.username = "test-user"
1589+
originalGenerationParameters.excludeLower = false
1590+
originalGenerationParameters.excludeUpper = true
1591+
originalGenerationParameters.excludeNumber = true
1592+
originalGenerationParameters.includeSpecial = true
1593+
1594+
// Serialize to ByteString (as remote backend would)
1595+
val generationParamsByteString = subject.createByteStringFromGenerationParameters(type, originalGenerationParameters)
1596+
1597+
// Create a GetResponse with these generation parameters (simulating remote backend response)
1598+
val getResponse =
1599+
GetResponse
1600+
.newBuilder()
1601+
.setName(CREDENTIAL_NAME)
1602+
.setType(type)
1603+
.setData(subject.createByteStringFromData(type, password))
1604+
.setId(uuid)
1605+
.setVersionCreatedAt(versionCreatedAt)
1606+
.setGenerationParameters(generationParamsByteString)
1607+
.build()
1608+
1609+
`when`(client.getByNameRequest(CREDENTIAL_NAME, USER)).thenReturn(getResponse)
1610+
1611+
// Create a new request with matching parameters
1612+
val passwordGenerateRequest = PasswordGenerateRequest()
1613+
passwordGenerateRequest.generationParameters = originalGenerationParameters
1614+
passwordGenerateRequest.name = CREDENTIAL_NAME
1615+
passwordGenerateRequest.type = type
1616+
1617+
// This should NOT regenerate because parameters match
1618+
val generateResponse = subject.generateCredential(passwordGenerateRequest)
1619+
1620+
// Verify the credential was not regenerated (existing one returned)
1621+
assertThat(generateResponse.getUuid()).isEqualTo(uuid)
1622+
assertThat((generateResponse.value as StringCredentialValue).stringCredential).isEqualTo("test-password")
1623+
}
1624+
15331625
@Test
15341626
fun getCredentialByName_whenCredentialDoesNotExist_throwsCorrectError() {
15351627
val exception = StatusRuntimeException(Status.NOT_FOUND)

0 commit comments

Comments
 (0)