Skip to content
This repository has been archived by the owner on Dec 30, 2022. It is now read-only.

Commit

Permalink
Merge pull request #382 from immuni-app/feature/exemption_cuev
Browse files Browse the repository at this point in the history
Added cuev code to generate exemptions dgc
  • Loading branch information
astagi authored Feb 3, 2022
2 parents 57defff + c03eb42 commit 798217d
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class GCDRepository(
fun authorizationCun(cun: String): String = "Bearer ${("CUN-$cun").sha256()}"
fun authorizationNrfe(nrfe: String): String = "Bearer ${nrfe.sha256()}"
fun authorizationNucg(nucg: String): String = "Bearer ${("NUCG-$nucg").sha256()}"
fun authorizationCUEV(cuev: String): String = "Bearer ${("CUEV-$cuev").sha256()}"
}

suspend fun getGreenCard(
Expand All @@ -32,6 +33,7 @@ class GCDRepository(
"NRFE" -> authorizationNrfe(token)
"NUCG" -> authorizationNucg(token)
"OTP" -> authorization(token)
"CUEV" -> authorizationCUEV(token)
else -> authorization(token)
}
val response = immuniApiCall {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.observe
import androidx.navigation.fragment.findNavController
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.datepicker.CalendarConstraints
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import it.ministerodellasalute.immuni.GreenCertificateDirections
Expand All @@ -44,7 +43,6 @@ import it.ministerodellasalute.immuni.util.ProgressDialogFragment
import java.text.SimpleDateFormat
import java.util.*
import kotlin.math.abs
import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.generate_green_certificate.*
import org.koin.android.ext.android.get
import org.koin.androidx.viewmodel.ext.android.getViewModel
Expand Down Expand Up @@ -172,6 +170,11 @@ class GenerateGreenCertificate : Fragment(R.layout.generate_green_certificate),
codeInput.setHint(R.string.code_placeholder)
getString(R.string.const_nucg)
}
4 -> {
codeLabel.text = getString(R.string.cuev_title)
codeInput.setHint(R.string.code_placeholder)
getString(R.string.const_cuev)
}
else -> ""
}

Expand All @@ -180,6 +183,7 @@ class GenerateGreenCertificate : Fragment(R.layout.generate_green_certificate),
1 -> LengthFilter(17)
2 -> LengthFilter(10)
3 -> LengthFilter(10)
4 -> LengthFilter(10)
else -> LengthFilter(0)
}
codeInput.filters = arrayOf(InputFilter.AllCaps(), lengthFilter)
Expand Down Expand Up @@ -295,20 +299,6 @@ class GenerateGreenCertificate : Fragment(R.layout.generate_green_certificate),

@SuppressLint("SimpleDateFormat")
private fun openDatePicker() {
// val endYear = Calendar.getInstance()
// endYear.set(endYear.get(Calendar.YEAR), 11, 31)
// val minDate = Date().byAdding(days = -1).time
// val maxDate = Date(endYear.timeInMillis).byAdding(year = 11).time
// val constraintsBuilder = CalendarConstraints.Builder()
// constraintsBuilder.setEnd(maxDate)
// constraintsBuilder.setStart(minDate)
// constraintsBuilder.setValidator(
// RangeValidator(
// minDate,
// maxDate
// )
// )
// builder.setCalendarConstraints(constraintsBuilder.build())
builder.setTheme(R.style.Widget_AppTheme_MaterialDatePicker)
materialDatePicker = builder.build()
materialDatePicker.show(requireActivity().supportFragmentManager, "DATE PICKER")
Expand Down Expand Up @@ -346,14 +336,3 @@ class GenerateGreenCertificate : Fragment(R.layout.generate_green_certificate),
}
}
}

@Parcelize
internal class RangeValidator(
private var minDate: Long = 0,
private var maxDate: Long = 0
) : CalendarConstraints.DateValidator {

override fun isValid(date: Long): Boolean {
return !(minDate > date || maxDate < date)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ class GreenCertificateViewModel(
"NRFE" -> digitValidator.validaCheckDigitNRFE(token)
"NUCG" -> digitValidator.validaCheckDigitNUCG(token)
"AUTHCODE" -> digitValidator.validaCheckDigitAuthcode(token)
"CUEV" -> digitValidator.validaCheckDigitCUEV(token)
else -> digitValidator.validaCheckDigitAuthcode(token)
}
} else if (typeToken.isBlank()) {
Expand All @@ -174,6 +175,7 @@ class GreenCertificateViewModel(
"NRFE" -> context.getString(R.string.form_code_nrfe_empty)
"NUCG" -> context.getString(R.string.form_code_nucg_empty)
"AUTHCODE" -> context.getString(R.string.form_code_otp_empty)
"CUEV" -> context.getString(R.string.form_code_cuev_empty)
else -> ""
}
}
Expand All @@ -184,6 +186,7 @@ class GreenCertificateViewModel(
"NRFE" -> context.getString(R.string.form_code_nrfe_wrong)
"NUCG" -> context.getString(R.string.form_code_nucg_wrong)
"AUTHCODE" -> context.getString(R.string.form_code_otp_wrong)
"CUEV" -> context.getString(R.string.form_code_cuev_wrong)
else -> ""
}
} else if (resultValidateToken == GreenPassValidationResult.TokenLengthWrong) {
Expand All @@ -192,6 +195,7 @@ class GreenCertificateViewModel(
"NRFE" -> context.getString(R.string.form_code_nrfe_empty)
"NUCG" -> context.getString(R.string.form_code_nucg_empty)
"AUTHCODE" -> context.getString(R.string.form_code_otp_empty)
"CUEV" -> context.getString(R.string.form_code_cuev_empty)
else -> ""
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class DigitValidator {
checkSum += (if (it.isEven) ODD_MAP else EVEN_MAP).getValue(char)
}

val checkDigit = CHECK_DIGIT_MAP[checkSum % ALPHABET_CUN.size]
val checkDigit = CHECK_DIGIT_MAP_CUN[checkSum % ALPHABET_CUN.size]

return if (checkDigit == token[CUN_CODE_LENGTH - 1]) {
GreenPassValidationResult.Valid(true)
Expand All @@ -48,7 +48,7 @@ class DigitValidator {
checkSum += (if (it.isEven) ODD_MAP else EVEN_MAP).getValue(char)
}

val checkDigit = CHECK_DIGIT_MAP_NUCG_OTP[checkSum % ALPHABET_NUCG_OTP.size]
val checkDigit = CHECK_DIGIT_MAP[checkSum % ALPHABET.size]

return if (checkDigit == token[OTP_CODE_LENGTH - 1]) {
GreenPassValidationResult.Valid(true)
Expand Down Expand Up @@ -77,21 +77,41 @@ class DigitValidator {
checkSum += (if (it.isEven) ODD_MAP else EVEN_MAP).getValue(char)
}

val checkDigit = CHECK_DIGIT_MAP_NUCG_OTP[checkSum % ALPHABET_NUCG_OTP.size]
val checkDigit = CHECK_DIGIT_MAP[checkSum % ALPHABET.size]

return if (checkDigit == token[NUCG_CODE_LENGTH - 1]) {
GreenPassValidationResult.Valid(true)
} else {
GreenPassValidationResult.TokenWrong
}
}

fun validaCheckDigitCUEV(token: String): GreenPassValidationResult {
if (token.length != CUEV_CODE_LENGTH) {
return GreenPassValidationResult.TokenLengthWrong
}
var checkSum = 0
repeat(CUEV_CODE_LENGTH - 1) {
val char = token[it]
checkSum += (if (it.isEven) ODD_MAP else EVEN_MAP).getValue(char)
}

val checkDigit = CHECK_DIGIT_MAP[checkSum % ALPHABET.size]

return if (checkDigit == token[CUEV_CODE_LENGTH - 1]) {
GreenPassValidationResult.Valid(true)
} else {
GreenPassValidationResult.TokenWrong
}
}
}

private inline val Int.isEven get() = (this and 1) == 0

const val CUN_CODE_LENGTH = 10
const val NRFE_CODE_LENGTH = 17
const val NUCG_CODE_LENGTH = 10
const val CUEV_CODE_LENGTH = 10
const val OTP_CODE_LENGTH = 12
const val NRFE_START_WITH = "99"

Expand Down Expand Up @@ -198,7 +218,7 @@ val ALPHABET_CUN = arrayOf(
'8',
'9'
)
val ALPHABET_NUCG_OTP = arrayOf(
val ALPHABET = arrayOf(
'A',
'B',
'C',
Expand Down Expand Up @@ -234,6 +254,6 @@ val ALPHABET_NUCG_OTP = arrayOf(
'9'
)

val CHECK_DIGIT_MAP = ALPHABET_CUN.asSequence().mapIndexed { index, c -> index to c }.toMap()
val CHECK_DIGIT_MAP_NUCG_OTP =
ALPHABET_NUCG_OTP.asSequence().mapIndexed { index, c -> index to c }.toMap()
val CHECK_DIGIT_MAP_CUN = ALPHABET_CUN.asSequence().mapIndexed { index, c -> index to c }.toMap()
val CHECK_DIGIT_MAP =
ALPHABET.asSequence().mapIndexed { index, c -> index to c }.toMap()
4 changes: 3 additions & 1 deletion app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -431,18 +431,20 @@ Betriebssystem: iOS 13.5.1; Modell: iPhone XS; Expositionsmeldungen: Aktiv; [wei
<string name="green_pass_how_to_generate_title">So erwerben Sie das EU Digital Covid Certificate</string>
<string name="green_pass_how_to_generate_first">Das \"EU Digital Covid Certificate\", in Italien \"COVID-19 Green Certification\", wird vom Gesundheitsministerium in digitaler Form an diejenigen ausgestellt, die geimpft wurden oder ein negatives Ergebnis beim Molekular- / Antigentest erhalten haben oder von denen geheilt wurde COVID-19.</string>
<string name="green_pass_how_to_generate_second">Das Zertifikat ist mit einem zweidimensionalen Barcode (QR-Code) versehen, der die wesentlichen Angaben des Zertifikatsinhabers und des mit dem Zertifikat verbundenen Gesundheitsereignisses (Impfung, Negativtest, COVID-19-Kur) enthält und zur Garantie der Echtheit digital signiert ist .</string>
<string name="green_pass_how_to_generate_third">Wenn Sie den Code zum Abrufen der Zertifizierung per E-Mail oder SMS erhalten haben, können Sie diese App verwenden, indem Sie einen der eindeutigen Codes CUN, NRFE, NUCG eingeben (erhalten Sie jeweils während der Durchführung des Molekularabstrichs oder beim Antigenabstrich oder bei der Vorbereitung das Heilzertifikat. ) oder den per E-Mail oder SMS erhaltenen Autorisierungscode AUTHCODE zusammen mit den letzten 8 Ziffern der Identifikationsnummer und dem Ablaufdatum der Gesundheitskarte.</string>
<string name="green_pass_how_to_generate_third">Wenn Sie den Code zum Abrufen der Zertifizierung per E-Mail oder SMS erhalten haben, können Sie diese App verwenden, indem Sie einen der eindeutigen Codes CUN, NRFE, NUCG, CUEV eingeben (erhalten Sie jeweils während der Durchführung des Molekularabstrichs oder beim Antigenabstrich oder bei der Vorbereitung das Heilzertifikat. ) oder den per E-Mail oder SMS erhaltenen Autorisierungscode AUTHCODE zusammen mit den letzten 8 Ziffern der Identifikationsnummer und dem Ablaufdatum der Gesundheitskarte.</string>
<string name="green_pass_how_to_generate_fourth">Alle diese Codes sind eindeutig mit dem grünen COVID-19-Zertifikat verbunden, das sich auf das Gesundheitsereignis bezieht, das es generiert hat.</string>
<string name="green_pass_how_to_generate_sixth">Weitere Informationen finden Sie auf der Website www.dgc.gov.it</string>
<string name="green_pass_generation_successfully">EU Digital Covid Certificate erfolgreich wiederhergestellt</string>
<string name="green_pass_select_type_token">Art auswählen</string>
<string name="form_code_cun_empty">- Geben Sie die letzten 10 Zeichen des CUN-Codes ein, der Ihnen mitgeteilt wurde\n</string>
<string name="form_code_nrfe_empty">- Geben Sie die letzten 17 Zeichen des NRFE-Codes ein, der Ihnen mitgeteilt wurde\n</string>
<string name="form_code_nucg_empty">- Geben Sie die letzten 10 Zeichen des NUCG-Codes ein, der Ihnen mitgeteilt wurde\n</string>
<string name="form_code_cuev_empty">- Geben Sie die letzten 10 Zeichen des CUEV-Codes ein, der Ihnen mitgeteilt wurde\n</string>
<string name="form_code_otp_empty">- Geben Sie die letzten 12 Zeichen des AUTHCODE ein, der Ihnen mitgeteilt wurde\n</string>
<string name="form_code_cun_wrong">- Die eingegebene CUN ist formell nicht gültig. Stellen Sie sicher, dass Sie die letzten 10 Ziffern der CUN, die Sie per SMS oder im Bericht zu einem positiven Abstrich erhalten haben, eingegeben haben\n</string>
<string name="form_code_nrfe_wrong">- Der eingegebene NRFE-Code ist formal nicht gültig. Stellen Sie sicher, dass Sie die letzten 17 Ziffern des erhaltenen NRFE-Codes eingegeben haben\n</string>
<string name="form_code_nucg_wrong">- Der eingegebene NUCG-Code ist formal nicht gültig. Stellen Sie sicher, dass Sie die letzten 10 Ziffern des erhaltenen NUCG-Codes eingegeben haben\n</string>
<string name="form_code_cuev_wrong">- Der eingegebene CUEV-Code ist formal nicht gültig. Stellen Sie sicher, dass Sie die letzten 10 Ziffern des erhaltenen CUEV-Codes eingegeben haben\n</string>
<string name="form_code_otp_wrong">- Der eingegebene AUTHCODE ist formal nicht gültig. Stellen Sie sicher, dass Sie die letzten 12 Ziffern des erhaltenen AUTHCODE eingegeben haben\n</string>
<string name="form_type_code_empty">- Wählen Sie die Art des Codes\n</string>
<string name="form_expired_health_date">- Geben Sie das Ablaufdatum der Gesundheitskarte ein\n</string>
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -429,10 +429,12 @@ Sistema operativo: iOS 13.5.1; modelo: iPhone XS; notificaciones de exposición:
<string name="form_code_cun_empty">- Ingrese los últimos 10 caracteres del código CUN que se le comunicaron\n</string>
<string name="form_code_nrfe_empty">- Ingrese los últimos 17 caracteres del código NRFE que se le comunicaron\n</string>
<string name="form_code_nucg_empty">- Ingrese los últimos 10 caracteres del código NUCG que se le comunicaron\n</string>
<string name="form_code_cuev_empty">- Ingrese los últimos 10 caracteres del código CUEV que se le comunicaron\n</string>
<string name="form_code_otp_empty">- Inserisci gli ultimi 12 caratteri del codice AUTHCODE che ti è stato comunicato\n</string>
<string name="form_code_cun_wrong">- El CUN ingresado no es formalmente válido. Asegúrese de haber ingresado los últimos 10 códigos CUN recibidos a través de SMS o en el informe asociado con el búfer positivo\n</string>
<string name="form_code_nrfe_wrong">- El código NRFE introducido no es formalmente válido. Asegúrese de haber ingresado los últimos 17 dígitos del código NRFE que recibiste\n</string>
<string name="form_code_nucg_wrong">- El código NUCG ingresado no es formalmente válido. Asegúrese de haber ingresado los últimos 10 dígitos del código NUCG que recibiste\n</string>
<string name="form_code_cuev_wrong">- El código CUEV ingresado no es formalmente válido. Asegúrese de haber ingresado los últimos 10 dígitos del código CUEV que recibiste\n</string>
<string name="form_code_otp_wrong">- El AUTHCODE ingresado no es formalmente válido. Asegúrese de haber ingresado los últimos 12 dígitos del AUTHCODE que recibiste\n</string>
<string name="form_type_code_empty">- Seleccione el tipo de código\n</string>
<string name="form_expired_health_date">- Ingrese la fecha de vencimiento de la tarjeta sanitaria\n</string>
Expand Down Expand Up @@ -481,7 +483,7 @@ Sistema operativo: iOS 13.5.1; modelo: iPhone XS; notificaciones de exposición:
<string name="green_certificate_more_details_doses_number_text">%s de %s</string>
<string name="green_pass_how_to_generate_first">El \"EU Digital Covid Certificate\", en Italia \"Certificación verde COVID-19\", es emitido por el Ministerio de Salud en formato digital para aquellos que han sido vacunados o han obtenido un resultado negativo en la prueba molecular / de antígenos o están curados de COVID- 19.</string>
<string name="green_pass_how_to_generate_second">El certificado tiene un código de barras bidimensional (código QR) que contiene la información esencial del titular del certificado y el evento de salud al que se asocia el certificado (vacunación, prueba negativa, cura COVID-19) y firmado digitalmente para garantizar la autenticidad.</string>
<string name="green_pass_how_to_generate_third">Si has recibido el código para recuperar la certificación por correo electrónico o SMS, puedes utilizar esta aplicación ingresando uno de los códigos únicos CUN, NRFE, NUCG (recibidos respectivamente durante la ejecución del hisopo molecular o del hisopo antigénico o al preparar el certificado de curación.), o el código de autorización AUTHCODE recibido vía e-mail o SMS junto con los últimos 8 dígitos del número de identificación y la fecha de vencimiento de la Tarjeta Sanitaria.</string>
<string name="green_pass_how_to_generate_third">Si has recibido el código para recuperar la certificación por correo electrónico o SMS, puedes utilizar esta aplicación ingresando uno de los códigos únicos CUN, NRFE, NUCG, CUEV (recibidos respectivamente durante la ejecución del hisopo molecular o del hisopo antigénico o al preparar el certificado de curación.), o el código de autorización AUTHCODE recibido vía e-mail o SMS junto con los últimos 8 dígitos del número de identificación y la fecha de vencimiento de la Tarjeta Sanitaria.</string>
<string name="green_pass_how_to_generate_fourth">Todos estos códigos están asociados de forma única con el certificado verde COVID-19 relacionado con el evento de salud que lo generó.</string>
<string name="green_pass_how_to_generate_sixth">Para obtener más información, visita el sitio web www.dgc.gov.it</string>
<string name="green_pass_generation_successfully">EU Digital Covid Certificate recuperado con éxito</string>
Expand Down
Loading

0 comments on commit 798217d

Please sign in to comment.