check for valid openalias address

pull/262/head
larteyoh 2 weeks ago
parent 8a296f056c
commit 1be4041755

@ -265,15 +265,15 @@ Page {
border.width: parent.activeFocus ? 2 : 1
radius: balanceTxColumn.radius
}
rightPadding: 15 + resolveButton.width
rightPadding: resolveButton.visible ? (15 + resolveButton.width) : leftPadding
Button {
id: resolveButton
text: qsTr("resolve")
text: qsTr("Resolve")
anchors.right: parent.right
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
hoverEnabled: true
visible: false // TODO: show only when addressField.text is valid OpenAlias address
visible: Wallet.isValidOpenAliasAddress(addressField.text)
////onClicked: // TODO: handle OpenAlias resolution
background: Rectangle {
color: NeroshopComponents.Style.moneroGrayColor

@ -54,6 +54,27 @@ static bool is_product_code(const std::string& code) {
std::regex_match(code, issn) || std::regex_match(code, gtin) || std::regex_match(code, sku) ||
std::regex_match(code, mpn) || std::regex_match(code, ndc);
}
// does not work for email-styled addresses
static bool is_valid_openalias_domain(const std::string& domain) {
std::regex regex("^[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"); // Basic domain structure
if (!std::regex_match(domain, regex)) {
return false;
}
std::string lastPart = domain.substr(domain.find_last_of('.') + 1);
try {
int lastPartInt = std::stoi(lastPart);
if (std::to_string(lastPartInt) != lastPart) {
return true;
}
} catch (const std::invalid_argument& e) {
return true;
}
return false;
}
}
namespace string {
static std::string lower(const std::string& str)

@ -1312,6 +1312,10 @@ bool neroshop::Wallet::is_valid_monero_address(const std::string& address) {
return ;
}*/
//-------------------------------------------------------
bool neroshop::Wallet::is_valid_openalias_address(const std::string& address) {
return (string_tools::is_valid_openalias_domain(address) || string_tools::is_email(address));
}
//-------------------------------------------------------
bool neroshop::Wallet::is_cryptonote_based() const {
return (wallet_type == WalletType::Monero || wallet_type == WalletType::Wownero);
}

@ -187,6 +187,7 @@ public:
virtual bool is_valid_address(const std::string& address) const;
static bool is_valid_monero_address(const std::string& address);
//static bool is_valid_wownero_address(const std::string& address);
static bool is_valid_openalias_address(const std::string& address);
bool is_cryptonote_based() const;
// friends
friend class Seller; // seller can access wallet private members

@ -368,6 +368,16 @@ bool neroshop::WalletController::fileExists(const QString& filename) const {
return _wallet->file_exists(filename.toStdString());
}
bool neroshop::WalletController::isValidAddress(const QString& address) const {
if (!_wallet) throw std::runtime_error("neroshop::Wallet is not initialized");
return _wallet->is_valid_address(address.toStdString());
}
bool neroshop::WalletController::isValidOpenAliasAddress(const QString& address) const {
if (!_wallet) throw std::runtime_error("neroshop::Wallet is not initialized");
return _wallet->is_valid_openalias_address(address.toStdString());
}
// Callbacks
void neroshop::WalletController::on_sync_progress(uint64_t height, uint64_t start_height, uint64_t end_height, double percent_done, const std::string& message) {
std::lock_guard<std::mutex> lock(_wallet->wallet_data_mutex);

@ -78,6 +78,8 @@ public:
Q_INVOKABLE bool isSynced() const;
Q_INVOKABLE bool isDaemonSynced() const;
Q_INVOKABLE bool fileExists(const QString& filename) const;
Q_INVOKABLE bool isValidAddress(const QString& address) const;
Q_INVOKABLE bool isValidOpenAliasAddress(const QString& address) const;
// Callbacks
void on_sync_progress(uint64_t height, uint64_t start_height, uint64_t end_height, double percent_done, const std::string& message);
void on_new_block (uint64_t height);

Loading…
Cancel
Save