Skip to content

Commit

Permalink
KSM-553 Added new and updated PAM field types (#650)
Browse files Browse the repository at this point in the history
  • Loading branch information
idimov-keeper authored Sep 9, 2024
1 parent 39ae05f commit ff98be3
Show file tree
Hide file tree
Showing 7 changed files with 273 additions and 136 deletions.
7 changes: 4 additions & 3 deletions sdk/java/core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ For more information see our official documentation page https://docs.keeper.io/
# Change Log

## 16.6.5
- Upgraded package dependencies to latest versions and switched to gradle-8.10
- Make sure autogenerated UIDs don't start with '-'
- KSM-548 - Make sure autogenerated UIDs don't start with '-'
- KSM-553 - Added new field types and updated PAM field types
- Upgraded package dependencies to latest versions and switched to gradle-8.10.1

## 16.6.4
- KSM-501 - Switched to non-strict JSON parser
Expand All @@ -32,7 +33,7 @@ For more information see our official documentation page https://docs.keeper.io/
- KSM-421 - Improved Logging

## 16.5.3
- KSM-401 - Update PAM Record types and Field types to have latest updates
- KSM-401 - Update PAM Record types and Field types to have the latest updates
- KSM-406 - New field type: Passkey
- KSM-382 - Support for record Transactions

Expand Down
16 changes: 8 additions & 8 deletions sdk/java/core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ version = "16.6.5"

plugins {
`java-library`
kotlin("jvm") version "2.0.10"
kotlin("plugin.serialization") version "2.0.10"
kotlin("jvm") version "2.0.20"
kotlin("plugin.serialization") version "2.0.20"
`maven-publish`
signing
id("io.github.gradle-nexus.publish-plugin") version "2.0.0"
Expand Down Expand Up @@ -43,18 +43,18 @@ repositories {

dependencies {
// Align versions of all Kotlin components
implementation(platform("org.jetbrains.kotlin:kotlin-bom:2.0.10"))
implementation(platform("org.jetbrains.kotlin:kotlin-bom:2.0.20"))

// Use the Kotlin JDK 8 standard library.
api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.10")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1")
implementation("org.jetbrains.kotlin:kotlin-reflect:2.0.10")
api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.20")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.2")
implementation("org.jetbrains.kotlin:kotlin-reflect:2.0.20")

// Use the Kotlin test library.
testImplementation("org.jetbrains.kotlin:kotlin-test:2.0.10")
testImplementation("org.jetbrains.kotlin:kotlin-test:2.0.20")

// Use the Kotlin JUnit integration.
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:2.0.10")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:2.0.20")

testImplementation("org.bouncycastle:bc-fips:2.0.0")
// testImplementation("org.bouncycastle:bcprov-jdk15on:1.70")
Expand Down
2 changes: 1 addition & 1 deletion sdk/java/core/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip

zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
package com.keepersecurity.secretsManager.core

import java.math.BigInteger
import java.net.URL
import java.net.URI
import java.net.URLDecoder
import java.nio.ByteBuffer
import java.security.*
Expand Down Expand Up @@ -250,7 +250,7 @@ data class TotpCode(val code: String, val timeLeft: Int, val period: Int) {
if (protocol != "otpauth")
return null

val totpUrl = URL("http://" + url.substring(10))
val totpUrl = URI.create("http://" + url.substring(10)).toURL()
val queryPairs = mutableMapOf<String, String>()
val pairs: List<String> = totpUrl.query.split("&")
for (pair in pairs) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,21 +135,25 @@ internal fun fieldType(field: KeeperRecordField): String {
@ExperimentalSerializationApi
internal fun getFieldValuesCount(field: KeeperRecordField): Int {
return when (field) {
is AppFillers -> field.value.size
is AccountNumber -> field.value.size
is AddressRef -> field.value.size
is Addresses -> field.value.size
is BankAccounts -> field.value.size
is BirthDate -> field.value.size
is CardRef -> field.value.size
is Checkbox -> field.value.size
is Controller -> field.value.size
is DatabaseType -> field.value.size
is Date -> field.value.size
is DirectoryType -> field.value.size
is Dropdown -> field.value.size
is Email -> field.value.size
is ExpirationDate -> field.value.size
is FileRef -> field.value.size
is HiddenField -> field.value.size
is Hosts -> field.value.size
is IsSsidHidden -> field.value.size
is KeyPairs -> field.value.size
is LicenseNumber -> field.value.size
is Login -> field.value.size
Expand All @@ -158,19 +162,26 @@ internal fun getFieldValuesCount(field: KeeperRecordField): Int {
is OneTimeCode -> field.value.size
is OneTimePassword -> field.value.size
is PamHostnames -> field.value.size
is PamProvider -> field.value.size
is PamRemoteBrowserSettings -> field.value.size
is PamResources -> field.value.size
is PamSettings -> field.value.size
is Passkeys -> field.value.size
is Password -> field.value.size
is PaymentCards -> field.value.size
is Phones -> field.value.size
is PinCode -> field.value.size
is RbiUrl -> field.value.size
is RecordRef -> field.value.size
is Schedules -> field.value.size
is Scripts -> field.value.size
is SecureNote -> field.value.size
is SecurityQuestions -> field.value.size
is Text -> field.value.size
is TrafficEncryptionKey -> field.value.size
is TrafficEncryptionSeed -> field.value.size
is Url -> field.value.size
is WifiEncryption -> field.value.size
}
}

Expand All @@ -181,6 +192,14 @@ internal fun getFieldValuesCount(field: KeeperRecordField): Int {
internal fun getFieldStringValues(field: KeeperRecordField, index: Int = -1, property: String? = null): List<String> {
val emptyRes = listOf<String>()
return when (field) {
is AppFillers -> if (index >= field.value.size) emptyRes
else if (index < 0) {
if (property == null) field.value.map { Json.encodeToString(it) }.toList()
else field.value.map { getObjectProperty(it, property) }.toList()
} else {
if (property == null) listOf(Json.encodeToString(field.value[index]))
else listOf(getObjectProperty(field.value[index], property))
}
is AccountNumber -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is AddressRef -> if (index >= field.value.size || property != null) emptyRes
Expand All @@ -207,12 +226,16 @@ internal fun getFieldStringValues(field: KeeperRecordField, index: Int = -1, pro
else if (index < 0) field.value else listOf(field.value[index])
is Checkbox -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value.map { it.toString() }.toList() else listOf(field.value[index].toString())
is Controller -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is DatabaseType -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is Date -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value.map { it.toString() }.toList() else listOf(field.value[index].toString())
is DirectoryType -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is Dropdown -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is Email -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is ExpirationDate -> if (index >= field.value.size || property != null) emptyRes
Expand All @@ -229,6 +252,8 @@ internal fun getFieldStringValues(field: KeeperRecordField, index: Int = -1, pro
if (property == null) listOf(Json.encodeToString(field.value[index]))
else listOf(getObjectProperty(field.value[index], property))
}
is IsSsidHidden -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value.map { it.toString() }.toList() else listOf(field.value[index].toString())
is KeyPairs -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value.map { it.toString() }.toList() else listOf(field.value[index].toString())
is LicenseNumber -> if (index >= field.value.size || property != null) emptyRes
Expand Down Expand Up @@ -257,6 +282,16 @@ internal fun getFieldStringValues(field: KeeperRecordField, index: Int = -1, pro
if (property == null) listOf(Json.encodeToString(field.value[index]))
else listOf(getObjectProperty(field.value[index], property))
}
is PamProvider -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is PamRemoteBrowserSettings -> if (index >= field.value.size) emptyRes
else if (index < 0) {
if (property == null) field.value.map { Json.encodeToString(it) }.toList()
else field.value.map { getObjectProperty(it, property) }.toList()
} else {
if (property == null) listOf(Json.encodeToString(field.value[index]))
else listOf(getObjectProperty(field.value[index], property))
}
is PamResources -> if (index >= field.value.size) emptyRes
else if (index < 0) {
if (property == null) field.value.map { Json.encodeToString(it) }.toList()
Expand All @@ -265,6 +300,14 @@ internal fun getFieldStringValues(field: KeeperRecordField, index: Int = -1, pro
if (property == null) listOf(Json.encodeToString(field.value[index]))
else listOf(getObjectProperty(field.value[index], property))
}
is PamSettings -> if (index >= field.value.size) emptyRes
else if (index < 0) {
if (property == null) field.value.map { Json.encodeToString(it) }.toList()
else field.value.map { getObjectProperty(it, property) }.toList()
} else {
if (property == null) listOf(Json.encodeToString(field.value[index]))
else listOf(getObjectProperty(field.value[index], property))
}
is Passkeys -> if (index >= field.value.size) emptyRes
else if (index < 0) {
if (property == null) field.value.map { Json.encodeToString(it) }.toList()
Expand Down Expand Up @@ -293,6 +336,8 @@ internal fun getFieldStringValues(field: KeeperRecordField, index: Int = -1, pro
}
is PinCode -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is RbiUrl -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is RecordRef -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is Schedules -> if (index >= field.value.size) emptyRes
Expand Down Expand Up @@ -323,29 +368,39 @@ internal fun getFieldStringValues(field: KeeperRecordField, index: Int = -1, pro
}
is Text -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is TrafficEncryptionKey -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is TrafficEncryptionSeed -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is Url -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
is WifiEncryption -> if (index >= field.value.size || property != null) emptyRes
else if (index < 0) field.value else listOf(field.value[index])
}
}

@ExperimentalSerializationApi
private fun getFieldStringValue(field: KeeperRecordField, valueIdx: Int): String {
return when (field) {
is AppFillers -> Json.encodeToString(field.value[valueIdx])
is AccountNumber -> field.value[valueIdx]
is AddressRef -> field.value[valueIdx]
is Addresses -> Json.encodeToString(field.value[valueIdx])
is BankAccounts -> Json.encodeToString(field.value[valueIdx])
is BirthDate -> field.value[valueIdx].toString()
is CardRef -> field.value[valueIdx]
is Checkbox -> field.value[valueIdx].toString()
is Controller -> field.value[valueIdx]
is DatabaseType -> field.value[valueIdx]
is Date -> field.value[valueIdx].toString()
is DirectoryType -> field.value[valueIdx]
is Dropdown -> field.value[valueIdx]
is Email -> field.value[valueIdx]
is ExpirationDate -> field.value[valueIdx].toString()
is FileRef -> field.value[valueIdx]
is HiddenField -> field.value[valueIdx]
is Hosts -> Json.encodeToString(field.value[valueIdx])
is IsSsidHidden -> field.value[valueIdx].toString()
is KeyPairs -> field.value[valueIdx].toString()
is LicenseNumber -> field.value[valueIdx]
is Login -> field.value[valueIdx]
Expand All @@ -354,30 +409,40 @@ private fun getFieldStringValue(field: KeeperRecordField, valueIdx: Int): String
is OneTimeCode -> field.value[valueIdx]
is OneTimePassword -> field.value[valueIdx]
is PamHostnames -> Json.encodeToString(field.value[valueIdx])
is PamProvider -> field.value[valueIdx]
is PamRemoteBrowserSettings -> Json.encodeToString(field.value[valueIdx])
is PamResources -> Json.encodeToString(field.value[valueIdx])
is PamSettings -> Json.encodeToString(field.value[valueIdx])
is Passkeys -> Json.encodeToString(field.value[valueIdx])
is Password -> field.value[valueIdx]
is PaymentCards -> Json.encodeToString(field.value[valueIdx])
is Phones -> Json.encodeToString(field.value[valueIdx])
is PinCode -> field.value[valueIdx]
is RbiUrl -> field.value[valueIdx]
is RecordRef -> field.value[valueIdx]
is Schedules -> Json.encodeToString(field.value[valueIdx])
is Scripts -> Json.encodeToString(field.value[valueIdx])
is SecureNote -> field.value[valueIdx]
is SecurityQuestions -> Json.encodeToString(field.value[valueIdx])
is Text -> field.value[valueIdx]
is TrafficEncryptionKey -> field.value[valueIdx]
is TrafficEncryptionSeed -> field.value[valueIdx]
is Url -> field.value[valueIdx]
is WifiEncryption -> field.value[valueIdx]
}
}

private fun getFieldValueProperty(field: KeeperRecordField, valueIdx: Int, propertyName: String): String {
return when (field) {
is AppFillers -> getObjectProperty(field.value[valueIdx], propertyName)
is Addresses -> getObjectProperty(field.value[valueIdx], propertyName)
is BankAccounts -> getObjectProperty(field.value[valueIdx], propertyName)
is Hosts -> getObjectProperty(field.value[valueIdx], propertyName)
is Names -> getObjectProperty(field.value[valueIdx], propertyName)
is PamHostnames -> getObjectProperty(field.value[valueIdx], propertyName)
is PamRemoteBrowserSettings -> getObjectProperty(field.value[valueIdx], propertyName)
is PamResources -> getObjectProperty(field.value[valueIdx], propertyName)
is PamSettings -> getObjectProperty(field.value[valueIdx], propertyName)
is Passkeys -> getObjectProperty(field.value[valueIdx], propertyName)
is PaymentCards -> getObjectProperty(field.value[valueIdx], propertyName)
is Phones -> getObjectProperty(field.value[valueIdx], propertyName)
Expand All @@ -395,21 +460,25 @@ private fun getObjectProperty(obj: Any, propertyName: String): String {
@ExperimentalSerializationApi
private fun getFieldJsonValue(field: KeeperRecordField): String {
return when (field) {
is AppFillers -> Json.encodeToString(field.value)
is AccountNumber -> Json.encodeToString(field.value)
is AddressRef -> Json.encodeToString(field.value)
is Addresses -> Json.encodeToString(field.value)
is BankAccounts -> Json.encodeToString(field.value)
is BirthDate -> Json.encodeToString(field.value)
is CardRef -> Json.encodeToString(field.value)
is Checkbox -> Json.encodeToString(field.value)
is Controller -> Json.encodeToString(field.value)
is DatabaseType -> Json.encodeToString(field.value)
is Date -> Json.encodeToString(field.value)
is DirectoryType -> Json.encodeToString(field.value)
is Dropdown -> Json.encodeToString(field.value)
is Email -> Json.encodeToString(field.value)
is ExpirationDate -> Json.encodeToString(field.value)
is FileRef -> Json.encodeToString(field.value)
is HiddenField -> Json.encodeToString(field.value)
is Hosts -> Json.encodeToString(field.value)
is IsSsidHidden -> Json.encodeToString(field.value)
is KeyPairs -> Json.encodeToString(field.value)
is LicenseNumber -> Json.encodeToString(field.value)
is Login -> Json.encodeToString(field.value)
Expand All @@ -418,19 +487,26 @@ private fun getFieldJsonValue(field: KeeperRecordField): String {
is OneTimeCode -> Json.encodeToString(field.value)
is OneTimePassword -> Json.encodeToString(field.value)
is PamHostnames -> Json.encodeToString(field.value)
is PamProvider -> Json.encodeToString(field.value)
is PamRemoteBrowserSettings -> Json.encodeToString(field.value)
is PamResources -> Json.encodeToString(field.value)
is PamSettings -> Json.encodeToString(field.value)
is Passkeys -> Json.encodeToString(field.value)
is Password -> Json.encodeToString(field.value)
is PaymentCards -> Json.encodeToString(field.value)
is Phones -> Json.encodeToString(field.value)
is PinCode -> Json.encodeToString(field.value)
is RbiUrl -> Json.encodeToString(field.value)
is RecordRef -> Json.encodeToString(field.value)
is Schedules -> Json.encodeToString(field.value)
is Scripts -> Json.encodeToString(field.value)
is SecureNote -> Json.encodeToString(field.value)
is SecurityQuestions -> Json.encodeToString(field.value)
is Text -> Json.encodeToString(field.value)
is TrafficEncryptionKey -> Json.encodeToString(field.value)
is TrafficEncryptionSeed -> Json.encodeToString(field.value)
is Url -> Json.encodeToString(field.value)
is WifiEncryption -> Json.encodeToString(field.value)
}
}

Expand Down
Loading

0 comments on commit ff98be3

Please sign in to comment.