Line data Source code
1 : // Copyright (c) 2011-2014 The Bitcoin Core developers
2 : // Distributed under the MIT software license, see the accompanying
3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 :
5 : #include "bitcoinaddressvalidator.h"
6 :
7 : #include "base58.h"
8 :
9 : /* Base58 characters are:
10 : "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
11 :
12 : This is:
13 : - All numbers except for '0'
14 : - All upper-case letters except for 'I' and 'O'
15 : - All lower-case letters except for 'l'
16 : */
17 :
18 0 : BitcoinAddressEntryValidator::BitcoinAddressEntryValidator(QObject *parent) :
19 0 : QValidator(parent)
20 : {
21 0 : }
22 :
23 0 : QValidator::State BitcoinAddressEntryValidator::validate(QString &input, int &pos) const
24 : {
25 : Q_UNUSED(pos);
26 :
27 : // Empty address is "intermediate" input
28 0 : if (input.isEmpty())
29 : return QValidator::Intermediate;
30 :
31 : // Correction
32 0 : for (int idx = 0; idx < input.size();)
33 : {
34 0 : bool removeChar = false;
35 0 : QChar ch = input.at(idx);
36 : // Corrections made are very conservative on purpose, to avoid
37 : // users unexpectedly getting away with typos that would normally
38 : // be detected, and thus sending to the wrong address.
39 0 : switch(ch.unicode())
40 : {
41 : // Qt categorizes these as "Other_Format" not "Separator_Space"
42 : case 0x200B: // ZERO WIDTH SPACE
43 : case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE
44 0 : removeChar = true;
45 0 : break;
46 : default:
47 : break;
48 : }
49 :
50 : // Remove whitespace
51 0 : if (ch.isSpace())
52 0 : removeChar = true;
53 :
54 : // To next character
55 0 : if (removeChar)
56 0 : input.remove(idx, 1);
57 : else
58 0 : ++idx;
59 : }
60 :
61 : // Validation
62 : QValidator::State state = QValidator::Acceptable;
63 0 : for (int idx = 0; idx < input.size(); ++idx)
64 : {
65 0 : int ch = input.at(idx).unicode();
66 :
67 0 : if (((ch >= '0' && ch<='9') ||
68 0 : (ch >= 'a' && ch<='z') ||
69 0 : (ch >= 'A' && ch<='Z')) &&
70 0 : ch != 'l' && ch != 'I' && ch != '0' && ch != 'O')
71 : {
72 : // Alphanumeric and not a 'forbidden' character
73 : }
74 : else
75 : {
76 0 : state = QValidator::Invalid;
77 : }
78 : }
79 :
80 0 : return state;
81 : }
82 :
83 0 : BitcoinAddressCheckValidator::BitcoinAddressCheckValidator(QObject *parent) :
84 0 : QValidator(parent)
85 : {
86 0 : }
87 :
88 0 : QValidator::State BitcoinAddressCheckValidator::validate(QString &input, int &pos) const
89 : {
90 : Q_UNUSED(pos);
91 : // Validate the passed Bitcoin address
92 0 : CBitcoinAddress addr(input.toStdString());
93 0 : if (addr.IsValid())
94 : return QValidator::Acceptable;
95 :
96 0 : return QValidator::Invalid;
97 3 : }
|