From 48b7f0bfef756ba3dd4649bf83e5a90778148bd4 Mon Sep 17 00:00:00 2001 From: septs Date: Fri, 7 Mar 2025 05:11:25 +0800 Subject: [PATCH] feat: stricted imei checking --- .../wizard/DownloadWizardDetailsFragment.kt | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt index 5fa8002..88567c2 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt @@ -48,9 +48,8 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF matchingId = view.requireViewById(R.id.profile_download_code) confirmationCode = view.requireViewById(R.id.profile_download_confirmation_code) imei = view.requireViewById(R.id.profile_download_imei) - smdp.editText!!.addTextChangedListener { - updateInputCompleteness() - } + smdp.editText!!.addTextChangedListener { updateInputCompleteness() } + imei.editText!!.addTextChangedListener { updateInputCompleteness() } return view } @@ -69,7 +68,28 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF } private fun updateInputCompleteness() { - inputComplete = Patterns.DOMAIN_NAME.matcher(smdp.editText!!.text).matches() + inputComplete = runCatching(::validate).isSuccess refreshButtons() } -} \ No newline at end of file + + private fun validate() { + check(Patterns.DOMAIN_NAME.matcher(smdp.editText!!.text).matches()) { + "Invalid SM-DP+ address" + } + check(imei.editText!!.text.let { it.isEmpty() || isValidIMEI(it) }) { + "Invalid IMEI" + } + } +} + +private fun isValidIMEI(input: CharSequence): Boolean { + if (input.length != 15 || !input.all(Char::isDigit)) return false + + fun sumOfDigits(input: Int): Int { + if (input % 2 == 0) return input + return (input * 2).toString().map(Char::digitToInt).sum() + } + + val sum = input.dropLast(1).map(Char::digitToInt).sumOf(::sumOfDigits) + return (sum * 9) % 10 == input.last().digitToInt() +}