diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..dc90e5a --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/.github/workflows/publiccode-validation.yml b/.github/workflows/publiccode-validation.yml new file mode 100644 index 0000000..59bfd47 --- /dev/null +++ b/.github/workflows/publiccode-validation.yml @@ -0,0 +1,10 @@ +on: [push, pull_request] + +jobs: + publiccode_validation: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: italia/publiccode-parser-action@v0.0.2-alpha + with: + publiccode: 'publiccode.yml' diff --git a/build.gradle b/build.gradle index 17514c3..91c6600 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { - kotlin_version = '1.3.72' + kotlin_version = '1.6.10' } repositories { google() @@ -16,7 +16,6 @@ buildscript { classpath Deps.androidx_navigation classpath Deps.hilt_plugin classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.5.0" classpath "io.realm:realm-gradle-plugin:10.8.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/publiccode.yml b/publiccode.yml index 9124cb5..e74f680 100644 --- a/publiccode.yml +++ b/publiccode.yml @@ -5,8 +5,8 @@ publiccodeYmlVersion: '0.2' name: Digital Covid Certificate Android SDK url: 'https://github.com/ministero-salute/it-dgc-verificac19-sdk-android' -softwareVersion: 1.1.6 -releaseDate: '2022-03-07' +softwareVersion: 1.1.10 +releaseDate: '2022-06-13' developmentStatus: stable softwareType: library platforms: @@ -80,6 +80,8 @@ description: verifica della Certificazione verde COVID-19 o le informazioni rilevate dalla lettura dei QR code e le informazioni fornite in esito ai controlli, come indicato nel DPCM 12 ottobre 2021. + features: + - Verifica Digital Covid Certificate en: genericName: 'Android DCC SDK' apiDocumentation: |- @@ -111,4 +113,4 @@ description: verification of the COVID-19 Green Certification, as indicated in the Prime Ministerial Decree released on 12 October 2021. features: - - Verifica Digital Covid Certificate + - Verifies Digital Covid Certificate diff --git a/sdk/build.gradle b/sdk/build.gradle index 07e0fdc..5b0a812 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -6,7 +6,7 @@ plugins { id 'kotlin-kapt' id 'dagger.hilt.android.plugin' id 'jacoco' - id 'org.jetbrains.dokka' + id 'org.jetbrains.dokka' version '1.6.21' id 'realm-android' } @@ -102,16 +102,18 @@ android { buildConfigField "String", "SHOW_DEBUG_BUTTONS", "\"true\"" buildConfigField "String", "BASE_URL", "\"https://testaka4.sogei.it/v1/dgc/\"" buildConfigField "String", "SERVER_HOST", "\"testaka4.sogei.it\"" - buildConfigField "String", "CERTIFICATE_SHA", "\"sha256/R0d+cI8vTcJ3sCbpfQCH0OmdBbulPH3deYhngzOqJVA=\"" - buildConfigField "String", "SDK_VERSION", "\"1.1.6\"" + buildConfigField "String", "LEAF_CERTIFICATE", "\"sha256/sWTArAhfhED6GnBexDo3sf0srn/rvHl1gPmRoLSM5xY=\"" + buildConfigField "String", "BACKUP_CERTIFICATE", "\"sha256/KpZtVwF9rcXdbBMB/Poep8h3VSYXA/ZSFMkkWlQ0ZNk=\"" + buildConfigField "String", "SDK_VERSION", "\"1.1.12\"" } release { buildConfigField "String", "SHOW_DEBUG_BUTTONS", "\"true\"" buildConfigField "String", "BASE_URL", "\"https://get.dgc.gov.it/v1/dgc/\"" buildConfigField "String", "SERVER_HOST", "\"get.dgc.gov.it\"" - buildConfigField "String", "CERTIFICATE_SHA", "\"sha256/7cZJIDPacG8FS3pq6Mvxg+7yBDM/VYc2alOcbVe/e74=\"" - buildConfigField "String", "SDK_VERSION", "\"1.1.6\"" + buildConfigField "String", "LEAF_CERTIFICATE", "\"sha256/ep8PpqFVLsdiHg+J4qSZwV0HdoSB6AiO+sLAFZ53HUs=\"" + buildConfigField "String", "BACKUP_CERTIFICATE", "\"sha256/095kxU9rqrJ3f+YM1pG+Y2YCgAUvR1f5blSuZYXvEy8=\"" + buildConfigField "String", "SDK_VERSION", "\"1.1.12\"" minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/data/local/prefs/Preferences.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/data/local/prefs/Preferences.kt index 26e4b2d..e2ee36f 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/data/local/prefs/Preferences.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/data/local/prefs/Preferences.kt @@ -83,8 +83,6 @@ interface Preferences { var maxRetryNumber: Int - var isDoubleScanFlow: Boolean - var userName: String? /** @@ -195,11 +193,6 @@ class PreferencesImpl(context: Context) : Preferences { false ) - override var isDoubleScanFlow by BooleanPreference( - preferences, - PrefKeys.KEY_IS_DOUBLE_SCAN_FLOW, - false - ) override var userName by StringPreference(preferences, PrefKeys.KEY_USER_NAME, "") override fun clear() { diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/di/NetworkModule.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/di/NetworkModule.kt index 8864128..cf394f7 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/di/NetworkModule.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/di/NetworkModule.kt @@ -113,15 +113,13 @@ object NetworkModule { val trustAllCerts = arrayOf(object : X509TrustManager { @Throws(CertificateException::class) override fun checkClientTrusted( - chain: Array?, - authType: String? + chain: Array?, authType: String? ) { } @Throws(CertificateException::class) override fun checkServerTrusted( - chain: Array?, - authType: String? + chain: Array?, authType: String? ) { } @@ -138,14 +136,12 @@ object NetworkModule { val trustManagerFactory: TrustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) trustManagerFactory.init(null as KeyStore?) - val trustManagers: Array = - trustManagerFactory.trustManagers + val trustManagers: Array = trustManagerFactory.trustManagers check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) { "Unexpected default trust managers:" + trustManagers.contentToString() } - val trustManager = - trustManagers[0] as X509TrustManager + val trustManager = trustManagers[0] as X509TrustManager val builder = OkHttpClient.Builder() @@ -166,11 +162,8 @@ object NetworkModule { * */ private fun createRetrofit(okHttpClient: Lazy): Retrofit { - return Retrofit.Builder() - .addConverterFactory(GsonConverterFactory.create(Gson())) - .baseUrl(BuildConfig.BASE_URL) - .callFactory { okHttpClient.get().newCall(it) } - .build() + return Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(Gson())) + .baseUrl(BuildConfig.BASE_URL).callFactory { okHttpClient.get().newCall(it) }.build() } } diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/CertificateModel.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/CertificateModel.kt index f428893..d6ae085 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/CertificateModel.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/CertificateModel.kt @@ -114,8 +114,7 @@ data class TestModel( val countryOfVaccination: String, val certificateIssuer: String, val certificateIdentifier: String, - val resultType: TestResult, - var isPreviousScanModeBooster: Boolean = false + val resultType: TestResult ) : CertificateData enum class TestResult(val value: String) { diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/FirstViewModel.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/FirstViewModel.kt index cfc622d..322a1cb 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/FirstViewModel.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/FirstViewModel.kt @@ -75,7 +75,6 @@ class FirstViewModel @Inject constructor( init { preferences.shouldInitDownload = false - preferences.isDoubleScanFlow = false preferences.userName = "" fetchStatus.addSource(verifierRepository.getCertificateFetchStatus()) { diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/VerificationViewModel.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/VerificationViewModel.kt index 5193de2..8a04156 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/VerificationViewModel.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/VerificationViewModel.kt @@ -133,14 +133,6 @@ class VerificationViewModel @Inject constructor( fun getScanMode() = ScanMode.from(preferences.scanMode!!) - fun getDoubleScanFlag() = preferences.isDoubleScanFlow - - fun setDoubleScanFlag(flag: Boolean) = run { preferences.isDoubleScanFlow = flag } - - fun getUserName() = preferences.userName - - fun setUserName(firstName: String) = run{ preferences.userName = firstName} - fun getRuleSet() = RuleSet(preferences.validationRulesJson) fun nukeData() { @@ -244,10 +236,7 @@ class VerificationViewModel @Inject constructor( val certificateModel = greenCertificate.toCertificateModel(verificationResult).apply { isBlackListed = blackListCheckResult isRevoked = isCertificateRevoked(certificateIdentifier.sha256()) - tests?.let { - it.last().isPreviousScanModeBooster = scanMode == ScanMode.BOOSTER - } - this.scanMode = if (getDoubleScanFlag()) ScanMode.DOUBLE_SCAN else scanMode + this.scanMode = scanMode this.certificateIdentifier = certificateIdentifier this.certificate = certificate this.exemptions = exemptions?.toList() @@ -265,14 +254,14 @@ class VerificationViewModel @Inject constructor( private fun extractExemption( decodeData: GreenCertificateData? ): Array? { - val jsonObject = JSONObject(decodeData!!.hcertJson) - val exemptionJson = if (jsonObject.has("e")) jsonObject.getString("e") else null - - exemptionJson?.let { - Log.i("exemption found", it) - return Gson().fromJson(exemptionJson, Array::class.java) - } - return null + decodeData?.hcertJson?.let { json -> + val jsonObject = JSONObject(json) + val exemptionJson = if (jsonObject.has("e")) jsonObject.getString("e") else null + exemptionJson?.let { + Log.i("exemption found", it) + return Gson().fromJson(exemptionJson, Array::class.java) + } + } ?: return null } /** @@ -306,7 +295,7 @@ class VerificationViewModel @Inject constructor( */ fun getCertificateStatus(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { return Validator.validate(certificateModel, ruleSet) - } + } /** diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/ExemptionValidationStrategy.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/ExemptionValidationStrategy.kt index 1b92b84..291cb63 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/ExemptionValidationStrategy.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/ExemptionValidationStrategy.kt @@ -23,7 +23,6 @@ package it.ministerodellasalute.verificaC19sdk.model.validation import android.util.Log -import it.ministerodellasalute.verificaC19sdk.model.ScanMode import it.ministerodellasalute.verificaC19sdk.model.CertificateModel import it.ministerodellasalute.verificaC19sdk.model.CertificateStatus import it.ministerodellasalute.verificaC19sdk.model.Exemption @@ -36,9 +35,11 @@ class ExemptionValidationStrategy : ValidationStrategy { * This method checks the [Exemption] and returns a proper [CertificateStatus] * after checking the validity start and end dates. */ - override fun checkCertificate(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { + override fun checkCertificate( + certificateModel: CertificateModel, + ruleSet: RuleSet + ): CertificateStatus { val exemption: Exemption = certificateModel.exemptions!!.last() - val scanMode = certificateModel.scanMode try { val startDate: LocalDate = exemption.certificateValidFrom.toLocalDate() @@ -53,11 +54,8 @@ class ExemptionValidationStrategy : ValidationStrategy { return CertificateStatus.EXPIRED } } - return when (scanMode) { - ScanMode.ENTRY_ITALY -> return CertificateStatus.NOT_VALID - ScanMode.BOOSTER -> return CertificateStatus.TEST_NEEDED - else -> CertificateStatus.VALID - } + return CertificateStatus.VALID + } catch (e: Exception) { return CertificateStatus.NOT_EU_DCC } diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/RecoveryValidationStrategy.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/RecoveryValidationStrategy.kt index c7fe8a7..5a227c6 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/RecoveryValidationStrategy.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/RecoveryValidationStrategy.kt @@ -24,22 +24,25 @@ package it.ministerodellasalute.verificaC19sdk.model.validation import android.util.Log import it.ministerodellasalute.verificaC19sdk.model.* -import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.getAge import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.toLocalDate -import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.toValidDateOfBirth import java.time.LocalDate class RecoveryValidationStrategy : ValidationStrategy { - override fun checkCertificate(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { + override fun checkCertificate( + certificateModel: CertificateModel, + ruleSet: RuleSet + ): CertificateStatus { val recovery: RecoveryModel = certificateModel.recoveryStatements!!.first() - val scanMode = certificateModel.scanMode val certificate = certificateModel.certificate - val countryCode = if (scanMode == ScanMode.ENTRY_ITALY) recovery.country else Country.IT.value + val countryCode = Country.IT.value val recoveryBis = recovery.isRecoveryBis(certificate) - val startDaysToAdd = if (recoveryBis) ruleSet.getRecoveryCertPVStartDay() else ruleSet.getRecoveryCertStartDayUnified(countryCode) + val startDaysToAdd = + if (recoveryBis) ruleSet.getRecoveryCertPVStartDay() else ruleSet.getRecoveryCertStartDayUnified( + countryCode + ) val endDaysToAdd = when { recoveryBis -> ruleSet.getRecoveryCertPvEndDay() @@ -53,9 +56,10 @@ class RecoveryValidationStrategy : ValidationStrategy { Log.d("RecoveryDates", "Start: $startDate End: $endDate") return when { - LocalDate.now().isBefore(startDate.plusDays(startDaysToAdd)) -> CertificateStatus.NOT_VALID_YET + LocalDate.now() + .isBefore(startDate.plusDays(startDaysToAdd)) -> CertificateStatus.NOT_VALID_YET LocalDate.now().isAfter(endDate) -> CertificateStatus.EXPIRED - else -> return if (scanMode == ScanMode.BOOSTER && !recoveryBis) CertificateStatus.TEST_NEEDED else CertificateStatus.VALID + else -> return CertificateStatus.VALID } } catch (e: Exception) { return CertificateStatus.NOT_VALID diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/TestValidationStrategy.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/TestValidationStrategy.kt index 50825d6..f91110b 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/TestValidationStrategy.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/TestValidationStrategy.kt @@ -23,10 +23,7 @@ package it.ministerodellasalute.verificaC19sdk.model.validation import android.util.Log -import it.ministerodellasalute.verificaC19sdk.model.ScanMode import it.ministerodellasalute.verificaC19sdk.model.* -import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.getAge -import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.toValidDateOfBirth import java.time.LocalDateTime import java.time.OffsetDateTime @@ -39,11 +36,11 @@ class TestValidationStrategy : ValidationStrategy { * status as [CertificateStatus]. * */ - override fun checkCertificate(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { + override fun checkCertificate( + certificateModel: CertificateModel, + ruleSet: RuleSet + ): CertificateStatus { val test: TestModel = certificateModel.tests!!.first() - val scanMode = certificateModel.scanMode - val isADoubleScanBoosterTest = test.isPreviousScanModeBooster - val isTestNotAllowed = scanMode == ScanMode.BOOSTER || scanMode == ScanMode.STRENGTHENED if (test.resultType == TestResult.DETECTED) { return CertificateStatus.NOT_VALID @@ -59,12 +56,10 @@ class TestValidationStrategy : ValidationStrategy { when (testType) { TestType.MOLECULAR.value -> { - startDate = ldtDateTimeOfCollection.plusHours(ruleSet.getMolecularTestStartHour()) + startDate = + ldtDateTimeOfCollection.plusHours(ruleSet.getMolecularTestStartHour()) endDate = - if (scanMode == ScanMode.DOUBLE_SCAN && isADoubleScanBoosterTest) - ldtDateTimeOfCollection.plusHours(ruleSet.getRapidTestEndHour()) - else - ldtDateTimeOfCollection.plusHours(ruleSet.getMolecularTestEndHour()) + ldtDateTimeOfCollection.plusHours(ruleSet.getMolecularTestEndHour()) } TestType.RAPID.value -> { startDate = ldtDateTimeOfCollection.plusHours(ruleSet.getRapidTestStartHour()) @@ -78,7 +73,6 @@ class TestValidationStrategy : ValidationStrategy { return when { LocalDateTime.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET LocalDateTime.now().isAfter(endDate) -> CertificateStatus.EXPIRED - isTestNotAllowed -> CertificateStatus.NOT_VALID else -> CertificateStatus.VALID } } catch (e: Exception) { diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/VaccineValidationStrategy.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/VaccineValidationStrategy.kt index 2e2615f..fe550b8 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/VaccineValidationStrategy.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/VaccineValidationStrategy.kt @@ -23,16 +23,13 @@ package it.ministerodellasalute.verificaC19sdk.model.validation import it.ministerodellasalute.verificaC19sdk.model.* -import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.getAge import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.toLocalDate -import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.toValidDateOfBirth import java.time.LocalDate class VaccineValidationStrategy : ValidationStrategy { private lateinit var startDate: LocalDate private lateinit var endDate: LocalDate - private var extendedDate: LocalDate? = null /** * @@ -40,9 +37,16 @@ class VaccineValidationStrategy : ValidationStrategy { * the proper status as [CertificateStatus]. * */ - override fun checkCertificate(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { + override fun checkCertificate( + certificateModel: CertificateModel, + ruleSet: RuleSet + ): CertificateStatus { val vaccine = certificateModel.vaccinations?.last()!! - if (vaccine.isNotComplete() && !ruleSet.isEMA(vaccine.medicinalProduct, vaccine.countryOfVaccination)) return CertificateStatus.NOT_VALID + if (vaccine.isNotComplete() && !ruleSet.isEMA( + vaccine.medicinalProduct, + vaccine.countryOfVaccination + ) + ) return CertificateStatus.NOT_VALID return try { validateWithScanMode(certificateModel, ruleSet) } catch (e: Exception) { @@ -50,19 +54,22 @@ class VaccineValidationStrategy : ValidationStrategy { } } - private fun validateWithScanMode(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { + private fun validateWithScanMode( + certificateModel: CertificateModel, + ruleSet: RuleSet + ): CertificateStatus { return when (certificateModel.scanMode) { ScanMode.STANDARD -> vaccineStandardStrategy(certificateModel, ruleSet) - ScanMode.STRENGTHENED -> vaccineStrengthenedStrategy(certificateModel, ruleSet) - ScanMode.BOOSTER -> vaccineBoosterStrategy(certificateModel, ruleSet) - ScanMode.ENTRY_ITALY -> vaccineEntryItalyStrategy(certificateModel, ruleSet) else -> { CertificateStatus.NOT_EU_DCC } } } - private fun vaccineStandardStrategy(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { + private fun vaccineStandardStrategy( + certificateModel: CertificateModel, + ruleSet: RuleSet + ): CertificateStatus { val vaccination = certificateModel.vaccinations?.last()!! val dateOfVaccination = vaccination.dateOfVaccination.toLocalDate() @@ -70,11 +77,20 @@ class VaccineValidationStrategy : ValidationStrategy { when { vaccination.isComplete() -> { val startDaysToAdd = - if (vaccination.isBooster()) ruleSet.getVaccineStartDayBoosterUnified(Country.IT.value) - else ruleSet.getVaccineStartDayCompleteUnified(Country.IT.value, vaccination.medicinalProduct) + if (vaccination.isBooster()) ruleSet.getVaccineStartDayBoosterUnified( + Country.IT.value + ) + else ruleSet.getVaccineStartDayCompleteUnified( + Country.IT.value, + vaccination.medicinalProduct + ) dateOfVaccination.plusDays(startDaysToAdd) } - vaccination.isNotComplete() -> dateOfVaccination.plusDays(ruleSet.getVaccineStartDayNotComplete(vaccination.medicinalProduct)) + vaccination.isNotComplete() -> dateOfVaccination.plusDays( + ruleSet.getVaccineStartDayNotComplete( + vaccination.medicinalProduct + ) + ) else -> dateOfVaccination } endDate = @@ -82,165 +98,28 @@ class VaccineValidationStrategy : ValidationStrategy { vaccination.isComplete() -> { val endDaysToAdd = when { - vaccination.isBooster() -> ruleSet.getVaccineEndDayBoosterUnified(Country.IT.value) + vaccination.isBooster() -> ruleSet.getVaccineEndDayBoosterUnified( + Country.IT.value + ) else -> ruleSet.getVaccineEndDayCompleteUnified(Country.IT.value) } dateOfVaccination.plusDays(endDaysToAdd) } - vaccination.isNotComplete() -> dateOfVaccination.plusDays(ruleSet.getVaccineEndDayNotComplete(vaccination.medicinalProduct)) + vaccination.isNotComplete() -> dateOfVaccination.plusDays( + ruleSet.getVaccineEndDayNotComplete( + vaccination.medicinalProduct + ) + ) else -> dateOfVaccination } return when { LocalDate.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET LocalDate.now().isAfter(endDate) -> CertificateStatus.EXPIRED - !ruleSet.isEMA(vaccination.medicinalProduct, vaccination.countryOfVaccination) -> CertificateStatus.NOT_VALID - else -> CertificateStatus.VALID - } - } - - private fun vaccineStrengthenedStrategy(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { - val vaccination = certificateModel.vaccinations?.last()!! - val country = vaccination.countryOfVaccination - val dateOfVaccination = vaccination.dateOfVaccination.toLocalDate() - - when (country) { - Country.IT.value -> { - return vaccineStandardStrategy(certificateModel, ruleSet) - } - else -> { - when { - vaccination.isNotComplete() -> { - if (ruleSet.isEMA(vaccination.medicinalProduct, vaccination.countryOfVaccination)) { - startDate = dateOfVaccination.plusDays(ruleSet.getVaccineStartDayNotComplete(vaccination.medicinalProduct)) - endDate = dateOfVaccination.plusDays(ruleSet.getVaccineEndDayNotComplete(vaccination.medicinalProduct)) - } else { - return CertificateStatus.NOT_VALID - } - } - vaccination.isComplete() -> { - val startDaysToAdd = - if (vaccination.isBooster()) ruleSet.getVaccineStartDayBoosterUnified(Country.IT.value) - else ruleSet.getVaccineStartDayCompleteUnified(Country.IT.value, vaccination.medicinalProduct) - - val endDaysToAdd = - if (vaccination.isBooster()) ruleSet.getVaccineEndDayBoosterUnified(Country.IT.value) - else ruleSet.getVaccineEndDayCompleteUnified(Country.IT.value) - - val extendedDaysToAdd = ruleSet.getVaccineEndDayCompleteExtendedEMA() - - startDate = dateOfVaccination.plusDays(startDaysToAdd) - endDate = dateOfVaccination.plusDays(endDaysToAdd) - extendedDate = dateOfVaccination.plusDays(extendedDaysToAdd) - } - } - } - } - when { - vaccination.isNotComplete() -> { - return when { - !ruleSet.isEMA(vaccination.medicinalProduct, country) -> CertificateStatus.NOT_VALID - LocalDate.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET - LocalDate.now().isAfter(endDate) -> CertificateStatus.EXPIRED - else -> CertificateStatus.VALID - } - } - vaccination.isBooster() -> { - return when { - LocalDate.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET - LocalDate.now().isAfter(endDate) -> CertificateStatus.EXPIRED - else -> if (ruleSet.isEMA( - vaccination.medicinalProduct, - vaccination.countryOfVaccination - ) - ) CertificateStatus.VALID else CertificateStatus.TEST_NEEDED - } - } - else -> { - when { - ruleSet.isEMA(vaccination.medicinalProduct, vaccination.countryOfVaccination) -> { - return when { - LocalDate.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET - LocalDate.now().isBefore(endDate) || !LocalDate.now().isAfter(endDate) -> CertificateStatus.VALID - LocalDate.now().isBefore(extendedDate) || !LocalDate.now().isAfter(extendedDate) -> CertificateStatus.TEST_NEEDED - else -> CertificateStatus.EXPIRED - - } - } - else -> { - return when { - LocalDate.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET - LocalDate.now().isBefore(extendedDate) || !LocalDate.now().isAfter(extendedDate) -> CertificateStatus.TEST_NEEDED - else -> CertificateStatus.EXPIRED - } - } - } - } - } - } - - private fun vaccineBoosterStrategy(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { - val vaccination = certificateModel.vaccinations?.last()!! - val dateOfVaccination = vaccination.dateOfVaccination.toLocalDate() - - val startDaysToAdd = - when { - vaccination.isBooster() -> ruleSet.getVaccineStartDayBoosterUnified(Country.IT.value) - vaccination.isNotComplete() -> ruleSet.getVaccineStartDayNotComplete(vaccination.medicinalProduct) - else -> ruleSet.getVaccineStartDayCompleteUnified(Country.IT.value, vaccination.medicinalProduct) - } - val endDaysToAdd = - when { - vaccination.isBooster() -> ruleSet.getVaccineEndDayBoosterUnified(Country.IT.value) - vaccination.isNotComplete() -> ruleSet.getVaccineEndDayNotComplete(vaccination.medicinalProduct) - else -> ruleSet.getVaccineEndDayCompleteUnified(Country.IT.value) - } - startDate = dateOfVaccination.plusDays(startDaysToAdd) - endDate = dateOfVaccination.plusDays(endDaysToAdd) - - return when { - LocalDate.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET - LocalDate.now().isAfter(endDate) -> CertificateStatus.EXPIRED - vaccination.isComplete() -> { - if (vaccination.isBooster()) { - if (ruleSet.isEMA(vaccination.medicinalProduct, vaccination.countryOfVaccination)) { - CertificateStatus.VALID - } else CertificateStatus.TEST_NEEDED - } else CertificateStatus.TEST_NEEDED - } - else -> CertificateStatus.NOT_VALID - } - } - - private fun vaccineEntryItalyStrategy(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus { - val vaccination = certificateModel.vaccinations?.last()!! - val dateOfVaccination = vaccination.dateOfVaccination.toLocalDate() - val birthDate = (certificateModel.dateOfBirth?.toValidDateOfBirth())?.plusDays(ruleSet.getVaccineCompleteUnder18Offset()) - val isUserUnderage = birthDate?.getAge()!! < Const.VACCINE_UNDERAGE_AGE - - val startDaysToAdd = - when { - vaccination.isBooster() -> ruleSet.getVaccineStartDayBoosterUnified(Country.NOT_IT.value) - vaccination.isNotComplete() -> ruleSet.getVaccineStartDayNotComplete(vaccination.medicinalProduct) - else -> ruleSet.getVaccineStartDayCompleteUnified(Country.NOT_IT.value, vaccination.medicinalProduct) - } - - val endDaysToAdd = - when { - vaccination.isComplete() && isUserUnderage -> ruleSet.getVaccineEndDayCompleteUnder18() - vaccination.isBooster() -> ruleSet.getVaccineEndDayBoosterUnified(Country.NOT_IT.value) - vaccination.isNotComplete() -> ruleSet.getVaccineEndDayNotComplete(vaccination.medicinalProduct) - else -> ruleSet.getVaccineEndDayCompleteUnified(Country.NOT_IT.value) - } - - startDate = dateOfVaccination.plusDays(startDaysToAdd) - endDate = dateOfVaccination.plusDays(endDaysToAdd) - - return when { - LocalDate.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET - LocalDate.now().isAfter(endDate) -> CertificateStatus.EXPIRED - !ruleSet.isEMA(vaccination.medicinalProduct, vaccination.countryOfVaccination) -> CertificateStatus.NOT_VALID - vaccination.isNotComplete() -> CertificateStatus.NOT_VALID + !ruleSet.isEMA( + vaccination.medicinalProduct, + vaccination.countryOfVaccination + ) -> CertificateStatus.NOT_VALID else -> CertificateStatus.VALID } } diff --git a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/Validator.kt b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/Validator.kt index 0340838..a687164 100644 --- a/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/Validator.kt +++ b/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/validation/Validator.kt @@ -38,7 +38,6 @@ class Validator { } if (certificateModel.isBlackListed) return CertificateStatus.NOT_VALID if (certificateModel.isRevoked) return CertificateStatus.REVOKED - if (certificateModel.scanMode == ScanMode.DOUBLE_SCAN && !certificateModel.hasTests()) return CertificateStatus.NOT_VALID return null }