From 591e68d416fd7f23429591a1975874c5c677c495 Mon Sep 17 00:00:00 2001 From: NovaFox161 Date: Sun, 1 Oct 2023 21:58:51 -0500 Subject: [PATCH] I think this should work to fix the new bug I made --- .../discal/core/business/CredentialService.kt | 14 +++++++--- .../discal/core/crypto/AESEncryption.kt | 25 ----------------- .../discal/core/object/new/Credential.kt | 27 +++++++------------ 3 files changed, 20 insertions(+), 46 deletions(-) diff --git a/core/src/main/kotlin/org/dreamexposure/discal/core/business/CredentialService.kt b/core/src/main/kotlin/org/dreamexposure/discal/core/business/CredentialService.kt index a345c715c..7471d858e 100644 --- a/core/src/main/kotlin/org/dreamexposure/discal/core/business/CredentialService.kt +++ b/core/src/main/kotlin/org/dreamexposure/discal/core/business/CredentialService.kt @@ -16,10 +16,13 @@ class DefaultCredentialService( ) : CredentialService { override suspend fun createCredential(credential: Credential): Credential { + val encryptedRefreshToken = Credential.aes.encrypt(credential.refreshToken).awaitSingle() + val encryptedAccessToken = Credential.aes.encrypt(credential.accessToken).awaitSingle() + val saved = credentialsRepository.save(CredentialData( credentialNumber = credential.credentialNumber, - accessToken = credential.encryptedAccessToken, - refreshToken = credential.encryptedRefreshToken, + accessToken = encryptedAccessToken, + refreshToken = encryptedRefreshToken, expiresAt = credential.expiresAt.toEpochMilli(), )).map(::Credential).awaitSingle() @@ -40,10 +43,13 @@ class DefaultCredentialService( } override suspend fun updateCredential(credential: Credential) { + val encryptedRefreshToken = Credential.aes.encrypt(credential.refreshToken).awaitSingle() + val encryptedAccessToken = Credential.aes.encrypt(credential.accessToken).awaitSingle() + credentialsRepository.updateByCredentialNumber( credentialNumber = credential.credentialNumber, - refreshToken = credential.encryptedRefreshToken, - accessToken = credential.encryptedAccessToken, + refreshToken = encryptedRefreshToken, + accessToken = encryptedAccessToken, expiresAt = credential.expiresAt.toEpochMilli(), ).awaitSingleOrNull() diff --git a/core/src/main/kotlin/org/dreamexposure/discal/core/crypto/AESEncryption.kt b/core/src/main/kotlin/org/dreamexposure/discal/core/crypto/AESEncryption.kt index 2ffccaccd..c4354d078 100644 --- a/core/src/main/kotlin/org/dreamexposure/discal/core/crypto/AESEncryption.kt +++ b/core/src/main/kotlin/org/dreamexposure/discal/core/crypto/AESEncryption.kt @@ -24,7 +24,6 @@ class AESEncryption(privateKey: String) { this.decryptCipher.init(Cipher.DECRYPT_MODE, this.secretKeySpec, this.ivParameterSpec) } - @Deprecated("Use #decryptFixed(string) instead") fun encrypt(data: String): Mono { return Mono.fromCallable { val encrypted = this.encryptCipher.doFinal(data.toByteArray(StandardCharsets.UTF_8)) @@ -38,18 +37,6 @@ class AESEncryption(privateKey: String) { } - fun encryptFixed(data: String): String { - return try { - val encrypted = this.encryptCipher.doFinal(data.toByteArray(StandardCharsets.UTF_8)) - - Base64.encodeBase64String(encrypted) - } catch (ex: Exception) { - LOGGER.error("Encrypt failure", ex) - throw IllegalStateException("Encrypt Failure", ex) - } - } - - @Deprecated("Use #decryptFixed(string) instead") fun decrypt(data: String): Mono { return Mono.fromCallable { val decrypted = this.decryptCipher.doFinal(Base64.decodeBase64(data)) @@ -61,16 +48,4 @@ class AESEncryption(privateKey: String) { Mono.error(IllegalStateException("Decrypt Failure", it)) }.subscribeOn(Schedulers.single()).switchIfEmpty(Mono.error(EmptyNotAllowedException())) } - - fun decryptFixed(data: String): String { - return try { - val decrypted = this.decryptCipher.doFinal(Base64.decodeBase64(data)) - - String(decrypted!!, StandardCharsets.UTF_8) - } catch (ex: Exception) { - LOGGER.error("Decrypt failure", ex) - throw IllegalStateException("Decrypt Failure", ex) - } finally { - } - } } diff --git a/core/src/main/kotlin/org/dreamexposure/discal/core/object/new/Credential.kt b/core/src/main/kotlin/org/dreamexposure/discal/core/object/new/Credential.kt index cd54c3cfa..134072cb5 100644 --- a/core/src/main/kotlin/org/dreamexposure/discal/core/object/new/Credential.kt +++ b/core/src/main/kotlin/org/dreamexposure/discal/core/object/new/Credential.kt @@ -1,5 +1,6 @@ package org.dreamexposure.discal.core.`object`.new +import kotlinx.coroutines.reactor.awaitSingle import org.dreamexposure.discal.core.config.Config import org.dreamexposure.discal.core.crypto.AESEncryption import org.dreamexposure.discal.core.database.CredentialData @@ -9,29 +10,21 @@ import java.time.Instant data class Credential( val credentialNumber: Int, var expiresAt: Instant, - var refreshToken: String, - var accessToken: String, ) { - /** - * Returns the encrypted refresh token, note that this will run the encryption on every access. - */ - val encryptedRefreshToken: String - get() = aes.encryptFixed(refreshToken) - - /** - * Returns the encrypted access token, note that this will run the encryption on every access. - */ - val encryptedAccessToken: String - get() = aes.encryptFixed(accessToken) + lateinit var refreshToken: String + lateinit var accessToken: String constructor(data: CredentialData) : this( credentialNumber = data.credentialNumber, expiresAt = data.expiresAt.asInstantMilli(), - refreshToken = aes.decryptFixed(data.refreshToken), - accessToken = aes.decryptFixed(data.accessToken), - ) + ) { + suspend { + refreshToken = aes.decrypt(data.refreshToken).awaitSingle() + accessToken = aes.decrypt(data.accessToken).awaitSingle() + } + } companion object { - private val aes = AESEncryption(Config.SECRET_GOOGLE_CREDENTIAL_KEY.getString()) + val aes = AESEncryption(Config.SECRET_GOOGLE_CREDENTIAL_KEY.getString()) } }