2018-01-02 14:12:05 -03:00
|
|
|
// Copyright (c) 2011-2017 The Bitcoin Core developers
|
2014-12-13 01:09:33 -03:00
|
|
|
// Distributed under the MIT software license, see the accompanying
|
2013-11-04 12:20:43 -03:00
|
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
|
2017-11-09 21:57:53 -03:00
|
|
|
#include <qt/bitcoinaddressvalidator.h>
|
2011-05-13 16:00:27 -04:00
|
|
|
|
2017-09-19 22:12:25 -03:00
|
|
|
#include <key_io.h>
|
2013-11-20 11:56:51 -03:00
|
|
|
|
2011-06-02 09:57:23 -04:00
|
|
|
/* Base58 characters are:
|
|
|
|
"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
|
|
|
|
|
|
|
This is:
|
|
|
|
- All numbers except for '0'
|
2012-07-25 20:48:39 -04:00
|
|
|
- All upper-case letters except for 'I' and 'O'
|
|
|
|
- All lower-case letters except for 'l'
|
2011-06-02 09:57:23 -04:00
|
|
|
*/
|
|
|
|
|
2013-11-20 11:56:51 -03:00
|
|
|
BitcoinAddressEntryValidator::BitcoinAddressEntryValidator(QObject *parent) :
|
2011-06-03 04:52:49 -04:00
|
|
|
QValidator(parent)
|
2011-05-13 16:00:27 -04:00
|
|
|
{
|
|
|
|
}
|
2011-06-02 09:57:23 -04:00
|
|
|
|
2013-11-20 11:56:51 -03:00
|
|
|
QValidator::State BitcoinAddressEntryValidator::validate(QString &input, int &pos) const
|
2011-06-02 09:57:23 -04:00
|
|
|
{
|
2013-11-20 11:56:51 -03:00
|
|
|
Q_UNUSED(pos);
|
|
|
|
|
|
|
|
// Empty address is "intermediate" input
|
|
|
|
if (input.isEmpty())
|
|
|
|
return QValidator::Intermediate;
|
|
|
|
|
2011-06-18 05:53:25 -04:00
|
|
|
// Correction
|
2013-11-20 11:56:51 -03:00
|
|
|
for (int idx = 0; idx < input.size();)
|
2011-06-02 09:57:23 -04:00
|
|
|
{
|
2012-05-17 06:10:15 -04:00
|
|
|
bool removeChar = false;
|
|
|
|
QChar ch = input.at(idx);
|
2012-05-18 02:53:26 -04:00
|
|
|
// Corrections made are very conservative on purpose, to avoid
|
|
|
|
// users unexpectedly getting away with typos that would normally
|
|
|
|
// be detected, and thus sending to the wrong address.
|
2012-05-17 06:10:15 -04:00
|
|
|
switch(ch.unicode())
|
2011-06-02 09:57:23 -04:00
|
|
|
{
|
2012-05-17 06:10:15 -04:00
|
|
|
// Qt categorizes these as "Other_Format" not "Separator_Space"
|
|
|
|
case 0x200B: // ZERO WIDTH SPACE
|
|
|
|
case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE
|
|
|
|
removeChar = true;
|
|
|
|
break;
|
2011-06-02 09:57:23 -04:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2013-11-20 11:56:51 -03:00
|
|
|
|
2012-05-17 06:10:15 -04:00
|
|
|
// Remove whitespace
|
2013-11-20 11:56:51 -03:00
|
|
|
if (ch.isSpace())
|
2012-05-17 06:10:15 -04:00
|
|
|
removeChar = true;
|
2013-11-20 11:56:51 -03:00
|
|
|
|
2012-05-17 06:10:15 -04:00
|
|
|
// To next character
|
2013-11-20 11:56:51 -03:00
|
|
|
if (removeChar)
|
2012-05-17 06:10:15 -04:00
|
|
|
input.remove(idx, 1);
|
|
|
|
else
|
|
|
|
++idx;
|
2011-06-03 04:52:49 -04:00
|
|
|
}
|
|
|
|
|
2011-06-18 05:53:25 -04:00
|
|
|
// Validation
|
2011-06-03 04:52:49 -04:00
|
|
|
QValidator::State state = QValidator::Acceptable;
|
2013-11-20 11:56:51 -03:00
|
|
|
for (int idx = 0; idx < input.size(); ++idx)
|
2011-06-03 04:52:49 -04:00
|
|
|
{
|
|
|
|
int ch = input.at(idx).unicode();
|
2011-06-02 09:57:23 -04:00
|
|
|
|
2013-11-20 11:56:51 -03:00
|
|
|
if (((ch >= '0' && ch<='9') ||
|
|
|
|
(ch >= 'a' && ch<='z') ||
|
|
|
|
(ch >= 'A' && ch<='Z')) &&
|
2017-09-22 23:48:14 -03:00
|
|
|
ch != 'I' && ch != 'O') // Characters invalid in both Base58 and Bech32
|
2011-06-03 04:52:49 -04:00
|
|
|
{
|
2011-06-18 05:53:25 -04:00
|
|
|
// Alphanumeric and not a 'forbidden' character
|
2011-06-03 04:52:49 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
state = QValidator::Invalid;
|
|
|
|
}
|
2011-06-02 09:57:23 -04:00
|
|
|
}
|
2011-06-03 04:52:49 -04:00
|
|
|
|
|
|
|
return state;
|
2011-06-02 09:57:23 -04:00
|
|
|
}
|
2013-11-20 11:56:51 -03:00
|
|
|
|
|
|
|
BitcoinAddressCheckValidator::BitcoinAddressCheckValidator(QObject *parent) :
|
|
|
|
QValidator(parent)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
QValidator::State BitcoinAddressCheckValidator::validate(QString &input, int &pos) const
|
|
|
|
{
|
|
|
|
Q_UNUSED(pos);
|
|
|
|
// Validate the passed Bitcoin address
|
2017-08-22 22:02:33 -03:00
|
|
|
if (IsValidDestinationString(input.toStdString())) {
|
2013-11-20 11:56:51 -03:00
|
|
|
return QValidator::Acceptable;
|
2017-08-22 22:02:33 -03:00
|
|
|
}
|
2013-11-20 11:56:51 -03:00
|
|
|
|
|
|
|
return QValidator::Invalid;
|
|
|
|
}
|