connect(m_ctx.get(), &AppContext::initiateTransaction, this, &SendWidget::onInitiateTransaction);
connect(m_ctx.get(), &AppContext::endTransaction, this, &SendWidget::onEndTransaction);
- connect(m_ctx.get(), &AppContext::openAliasResolved, this, &SendWidget::onOpenAliasResolved);
- connect(m_ctx.get(), &AppContext::openAliasResolveError, this, &SendWidget::onOpenAliasResolveError);
+
+ connect(WalletManager::instance(), &WalletManager::openAliasResolved, this, &SendWidget::onOpenAliasResolved);
connect(ui->btnScan, &QPushButton::clicked, this, &SendWidget::scanClicked);
connect(ui->btnSend, &QPushButton::clicked, this, &SendWidget::sendClicked);
QString currency = ui->comboCurrencySelection->currentText();
QString recipient = ui->lineAddress->text().simplified().remove(' ');
QString description = ui->lineDescription->text();
- if(recipient.isEmpty()) {
- QMessageBox::warning(this, "Malformed recipient", "The recipient address was not correct");
+ if (recipient.isEmpty()) {
+ QMessageBox::warning(this, "Malformed recipient", "No destination address was entered.");
return;
}
amount = this->amount();
bool sendAll = (ui->lineAmount->text() == "all");
if (amount == 0 && !sendAll) {
- QMessageBox::warning(this, "Amount error", "Invalid amount specified.");
+ QMessageBox::warning(this, "Amount error", "No amount was entered.");
return;
}
m_ctx->onCreateTransaction(recipient, amount, description, sendAll);
}
void SendWidget::aliasClicked() {
- auto address = ui->lineAddress->text();
- m_ctx->onOpenAliasResolve(address);
+ auto alias = ui->lineAddress->text();
+ WalletManager::instance()->resolveOpenAliasAsync(alias);
}
void SendWidget::clearClicked() {
return amount / constants::cdiv;
}
-void SendWidget::onOpenAliasResolved(const QString &address, const QString &openAlias) {
+void SendWidget::onOpenAliasResolved(const QString &openAlias, const QString &address, bool dnssecValid) {
+ if (address.isEmpty()) {
+ this->onOpenAliasResolveError("Could not resolve OpenAlias.");
+ return;
+ }
+
+ if (!dnssecValid) {
+ this->onOpenAliasResolveError("Address found, but the DNSSEC signatures could not be verified, so this address may be spoofed.");
+ return;
+ }
+
+ bool valid = WalletManager::addressValid(address, constants::networkType);
+ if (!valid) {
+ this->onOpenAliasResolveError(QString("Address validation error. Perhaps it is of the wrong network type.\n\n"
+ "OpenAlias: %1\nAddress: %2").arg(openAlias, address));
+ return;
+ }
+
this->fill(address, openAlias);
ui->btn_openAlias->hide();
}
void fillAddress(const QString &address);
void updateConversionLabel();
void onOpenAliasResolveError(const QString &err);
- void onOpenAliasResolved(const QString &address, const QString &openAlias);
+ void onOpenAliasResolved(const QString &openAlias, const QString &address, bool dnssecValid);
void onPreferredFiatCurrencyChanged();
void onInitiateTransaction();
emit customRestoreHeightSet(height);
}
-void AppContext::onOpenAliasResolve(const QString &openAlias) {
- // @TODO: calling this freezes for about 1-2 seconds :/
- const auto result = WalletManager::instance()->resolveOpenAlias(openAlias);; // TODO: async call
- const auto spl = result.split("|");
- auto msg = QString("");
- if(spl.count() != 2) {
- msg = "Internal error";
- emit openAliasResolveError(msg);
- return;
- }
-
- const auto &status = spl.at(0);
- const auto &address = spl.at(1);
- const auto valid = WalletManager::addressValid(address, constants::networkType);
- if(status == "false"){
- if(valid){
- msg = "Address found, but the DNSSEC signatures could not be verified, so this address may be spoofed";
- emit openAliasResolveError(msg);
- return;
- } else {
- msg = "No valid address found at this OpenAlias address, but the DNSSEC signatures could not be verified, so this may be spoofed";
- emit openAliasResolveError(msg);
- return;
- }
- } else if(status != "true") {
- msg = "Internal error";
- emit openAliasResolveError(msg);
- return;
- }
-
- if(valid){
- emit openAliasResolved(address, openAlias);
- return;
- }
-
- msg = QString("Address validation error.");
- if(!address.isEmpty())
- msg += QString(" Perhaps it is of the wrong network type."
- "\n\nOpenAlias: %1\nAddress: %2").arg(openAlias).arg(address);
- emit openAliasResolveError(msg);
-}
-
void AppContext::stopTimers() {
m_storeTimer.stop();
}
void onCancelTransaction(PendingTransaction *tx, const QVector<QString> &address);
void onSweepOutputs(const QVector<QString> &keyImages, QString address, bool churn, int outputs);
void onCreateTransactionError(const QString &msg);
- void onOpenAliasResolve(const QString &openAlias);
void onSetRestoreHeight(quint64 height);
void onMultiBroadcast(PendingTransaction *tx);
void onDeviceButtonRequest(quint64 code);
void createTransactionError(QString message);
void createTransactionCancelled(const QVector<QString> &address, quint64 amount);
void createTransactionSuccess(PendingTransaction *tx, const QVector<QString> &address);
- void openAliasResolveError(const QString &msg);
- void openAliasResolved(const QString &address, const QString &openAlias);
void setRestoreHeightError(const QString &msg);
void customRestoreHeightSet(int height);
void initiateTransaction();
return daemon_address.isEmpty() ? false : Monero::Utils::isAddressLocal(daemon_address.toStdString());
}
-QString WalletManager::resolveOpenAlias(const QString &address) const
+QString WalletManager::resolveOpenAlias(const QString &address, bool &dnssecValid) const
{
- bool dnssec_valid = false;
- std::string res = m_pimpl->resolveOpenAlias(address.toStdString(), dnssec_valid);
- res = std::string(dnssec_valid ? "true" : "false") + "|" + res;
+ std::string res = m_pimpl->resolveOpenAlias(address.toStdString(), dnssecValid);
return QString::fromStdString(res);
}
+void WalletManager::resolveOpenAliasAsync(const QString &alias) {
+ m_scheduler.run([this, alias] {
+ bool dnssecValid;
+ QString address = this->resolveOpenAlias(alias, dnssecValid);
+ emit openAliasResolved(alias, address, dnssecValid);
+ });
+}
+
void WalletManager::setLogLevel(int logLevel)
{
Monero::WalletManagerFactory::setLogLevel(logLevel);
Q_INVOKABLE qint64 addi(qint64 x, qint64 y) const { return x + y; }
Q_INVOKABLE qint64 subi(qint64 x, qint64 y) const { return x - y; }
- Q_INVOKABLE QString resolveOpenAlias(const QString &address) const;
+ QString resolveOpenAlias(const QString &address, bool &dnssecValid) const;
+ void resolveOpenAliasAsync(const QString &address);
// clear/rename wallet cache
Q_INVOKABLE static bool clearWalletCache(const QString &fileName);
void deviceError(const QString &message);
void miningStatus(bool isMining) const;
void proxyAddressChanged() const;
+ void openAliasResolved(const QString &alias, const QString &address, bool dnssecValid);
public slots:
private: