aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui/src/main/java/com/wireguard/android/widget/KeyInputFilter.kt
diff options
context:
space:
mode:
Diffstat (limited to 'ui/src/main/java/com/wireguard/android/widget/KeyInputFilter.kt')
-rw-r--r--ui/src/main/java/com/wireguard/android/widget/KeyInputFilter.kt49
1 files changed, 49 insertions, 0 deletions
diff --git a/ui/src/main/java/com/wireguard/android/widget/KeyInputFilter.kt b/ui/src/main/java/com/wireguard/android/widget/KeyInputFilter.kt
new file mode 100644
index 00000000..8c822dcb
--- /dev/null
+++ b/ui/src/main/java/com/wireguard/android/widget/KeyInputFilter.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2017-2023 WireGuard LLC. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.wireguard.android.widget
+
+import android.text.InputFilter
+import android.text.SpannableStringBuilder
+import android.text.Spanned
+import com.wireguard.crypto.Key
+
+/**
+ * InputFilter for entering WireGuard private/public keys encoded with base64.
+ */
+class KeyInputFilter : InputFilter {
+ override fun filter(
+ source: CharSequence,
+ sStart: Int, sEnd: Int,
+ dest: Spanned,
+ dStart: Int, dEnd: Int
+ ): CharSequence? {
+ var replacement: SpannableStringBuilder? = null
+ var rIndex = 0
+ val dLength = dest.length
+ for (sIndex in sStart until sEnd) {
+ val c = source[sIndex]
+ val dIndex = dStart + (sIndex - sStart)
+ // Restrict characters to the base64 character set.
+ // Ensure adding this character does not push the length over the limit.
+ if ((dIndex + 1 < Key.Format.BASE64.length && isAllowed(c) ||
+ dIndex + 1 == Key.Format.BASE64.length && c == '=') &&
+ dLength + (sIndex - sStart) < Key.Format.BASE64.length
+ ) {
+ ++rIndex
+ } else {
+ if (replacement == null) replacement = SpannableStringBuilder(source, sStart, sEnd)
+ replacement.delete(rIndex, rIndex + 1)
+ }
+ }
+ return replacement
+ }
+
+ companion object {
+ private fun isAllowed(c: Char) = Character.isLetterOrDigit(c) || c == '+' || c == '/'
+
+ @JvmStatic
+ fun newInstance() = KeyInputFilter()
+ }
+}