From 17c9008f951e2c3f52af6d9e5954586f7e00363a Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Thu, 13 Jun 2024 16:02:27 -0400 Subject: [PATCH] Improve 2FAS import (#124) --- .../manager/imports/model/TwoFasJsonExport.kt | 40 +++++++++---------- .../imports/parsers/TwoFasExportParser.kt | 9 +++-- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/app/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/imports/model/TwoFasJsonExport.kt b/app/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/imports/model/TwoFasJsonExport.kt index c8066993f1..c3b0311865 100644 --- a/app/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/imports/model/TwoFasJsonExport.kt +++ b/app/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/imports/model/TwoFasJsonExport.kt @@ -4,30 +4,30 @@ import kotlinx.serialization.Serializable @Serializable data class TwoFasJsonExport( - val schemaVersion: Int, - val appVersionCode: Int, - val appOrigin: String, + val schemaVersion: Int?, + val appVersionCode: Int?, + val appOrigin: String?, val services: List, val servicesEncrypted: String?, - val groups: List, + val groups: List?, ) { @Serializable data class Service( val otp: Otp, - val order: Order, - val updatedAt: Long, - val name: String, + val order: Order?, + val updatedAt: Long?, + val name: String?, val icon: Icon?, val secret: String, - val badge: Badge, + val badge: Badge?, val serviceTypeId: String?, ) { @Serializable data class Otp( - val counter: Int, - val period: Int, - val digits: Int, - val account: String, + val counter: Int?, + val period: Int?, + val digits: Int?, + val account: String?, val source: String?, val tokenType: String?, val algorithm: String?, @@ -37,24 +37,24 @@ data class TwoFasJsonExport( @Serializable data class Order( - val position: Int, + val position: Int?, ) @Serializable data class Icon( - val iconCollection: IconCollection, - val label: Label, - val selected: String, + val iconCollection: IconCollection?, + val label: Label?, + val selected: String?, ) { @Serializable data class IconCollection( - val id: String, + val id: String?, ) @Serializable data class Label( - val backgroundColor: String, - val text: String, + val backgroundColor: String?, + val text: String?, ) } @@ -68,6 +68,6 @@ data class TwoFasJsonExport( data class Group( val id: String, val name: String, - val isExpanded: Boolean, + val isExpanded: Boolean?, ) } diff --git a/app/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/imports/parsers/TwoFasExportParser.kt b/app/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/imports/parsers/TwoFasExportParser.kt index 8445664706..8f8a676980 100644 --- a/app/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/imports/parsers/TwoFasExportParser.kt +++ b/app/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/imports/parsers/TwoFasExportParser.kt @@ -32,6 +32,7 @@ class TwoFasExportParser : ExportParser { ignoreUnknownKeys = true isLenient = true explicitNulls = false + encodeDefaults = true } return try { @@ -59,7 +60,7 @@ class TwoFasExportParser : ExportParser { private fun List.toAuthenticatorItemEntities() = mapNotNull { it.toAuthenticatorItemEntityOrNull() } - private fun TwoFasJsonExport.Service.toAuthenticatorItemEntityOrNull(): AuthenticatorItemEntity? { + private fun TwoFasJsonExport.Service.toAuthenticatorItemEntityOrNull(): AuthenticatorItemEntity { val type = otp.tokenType ?.let { tokenType -> @@ -87,9 +88,9 @@ class TwoFasExportParser : ExportParser { key = secret, type = type, algorithm = algorithm, - period = otp.period, - digits = otp.digits, - issuer = otp.issuer ?: name, + period = otp.period ?: 30, + digits = otp.digits ?: 6, + issuer = otp.issuer.takeUnless { it.isNullOrEmpty() } ?: name.orEmpty(), userId = null, accountName = otp.account, favorite = false,