Filter out whitespace and zero-width non-breaking spaces in validator
[novacoin.git] / src / qt / bitcoinaddressvalidator.cpp
index 761a266..c804ad0 100644 (file)
@@ -1,7 +1,5 @@
 #include "bitcoinaddressvalidator.h"
 
-#include <QDebug>
-
 /* Base58 characters are:
      "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
 
@@ -22,10 +20,13 @@ BitcoinAddressValidator::BitcoinAddressValidator(QObject *parent) :
 
 QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) const
 {
-    /* Correction */
-    for(int idx=0; idx<input.size(); ++idx)
+    // Correction
+    for(int idx=0; idx<input.size();)
     {
-        switch(input.at(idx).unicode())
+        bool removeChar = false;
+        QChar ch = input.at(idx);
+        // Transform characters that are visually close
+        switch(ch.unicode())
         {
         case 'l':
         case 'I':
@@ -35,12 +36,25 @@ QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) co
         case 'O':
             input[idx] = QChar('o');
             break;
+        // Qt categorizes these as "Other_Format" not "Separator_Space"
+        case 0x200B: // ZERO WIDTH SPACE
+        case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE
+            removeChar = true;
+            break;
         default:
             break;
         }
+        // Remove whitespace
+        if(ch.isSpace())
+            removeChar = true;
+        // To next character
+        if(removeChar)
+            input.remove(idx, 1);
+        else
+            ++idx;
     }
 
-    /* Validation */
+    // Validation
     QValidator::State state = QValidator::Acceptable;
     for(int idx=0; idx<input.size(); ++idx)
     {
@@ -51,7 +65,7 @@ QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) co
            (ch >= 'A' && ch<='Z')) &&
            ch != 'l' && ch != 'I' && ch != '0' && ch != 'O')
         {
-            /* Alphanumeric and not a 'forbidden' character */
+            // Alphanumeric and not a 'forbidden' character
         }
         else
         {
@@ -59,5 +73,11 @@ QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) co
         }
     }
 
+    // Empty address is "intermediate" input
+    if(input.isEmpty())
+    {
+        state = QValidator::Intermediate;
+    }
+
     return state;
 }