Browse Source

fix: stricted sm-dp+ address checking (#190)

Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/190
Co-authored-by: septs <github@septs.pw>
Co-committed-by: septs <github@septs.pw>
septs 9 months ago
parent
commit
756c621d5e

+ 25 - 3
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt

@@ -1,11 +1,9 @@
 package im.angry.openeuicc.ui.wizard
 package im.angry.openeuicc.ui.wizard
 
 
 import android.os.Bundle
 import android.os.Bundle
-import android.util.Patterns
 import android.view.LayoutInflater
 import android.view.LayoutInflater
 import android.view.View
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewGroup
-import android.widget.Toast
 import androidx.core.widget.addTextChangedListener
 import androidx.core.widget.addTextChangedListener
 import com.google.android.material.textfield.TextInputLayout
 import com.google.android.material.textfield.TextInputLayout
 import im.angry.openeuicc.common.R
 import im.angry.openeuicc.common.R
@@ -86,10 +84,34 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF
     }
     }
 
 
     private fun updateInputCompleteness() {
     private fun updateInputCompleteness() {
-        inputComplete = Patterns.DOMAIN_NAME.matcher(smdp.editText!!.text).matches()
+        inputComplete = isValidAddress(smdp.editText!!.text)
         if (state.confirmationCodeRequired) {
         if (state.confirmationCodeRequired) {
             inputComplete = inputComplete && confirmationCode.editText!!.text.isNotEmpty()
             inputComplete = inputComplete && confirmationCode.editText!!.text.isNotEmpty()
         }
         }
         refreshButtons()
         refreshButtons()
     }
     }
+}
+
+private fun isValidAddress(input: CharSequence): Boolean {
+    if (!input.contains('.')) return false
+    var fqdn = input
+    var port = 443
+    if (input.contains(':')) {
+        val portIndex = input.lastIndexOf(':')
+        fqdn = input.substring(0, portIndex)
+        port = input.substring(portIndex + 1, input.length).toIntOrNull(10) ?: 0
+    }
+    // see https://en.wikipedia.org/wiki/Port_(computer_networking)
+    if (port < 1 || port > 0xffff) return false
+    // see https://en.wikipedia.org/wiki/Fully_qualified_domain_name
+    if (fqdn.isEmpty() || fqdn.length > 255) return false
+    for (part in fqdn.split('.')) {
+        if (part.isEmpty() || part.length > 64) return false
+        if (part.first() == '-' || part.last() == '-') return false
+        for (c in part) {
+            if (c.isLetterOrDigit() || c == '-') continue
+            return false
+        }
+    }
+    return true
 }
 }