Compare commits

..

16 Commits

Author SHA1 Message Date
tobtoht
1216e07c47 Merge pull request #4582
de3fd18a merchant: add missing copyright info (jpk68)
2026-04-22 18:40:37 +00:00
tobtoht
f6c0b66c5a Merge pull request #4579
b31fae7 Transfer: disable offline tx creation with long payment id (selsta)
2026-04-22 18:39:58 +00:00
jpk68
de3fd18a17 merchant: add missing copyright info 2026-04-22 20:11:25 +02:00
selsta
b31fae765f Transfer: disable offline tx creation with long payment id 2026-04-21 19:35:54 +02:00
tobtoht
bb4bc4a77e Merge pull request #4577
23ec5eb qml: escape untrusted text in RichText views (selsta)
2026-04-18 08:09:49 +00:00
tobtoht
081848bab0 Merge pull request #4576
c7bc8b4 main: use WalletManager URI parser in handler (selsta)
2026-04-18 08:06:13 +00:00
selsta
23ec5eb6a1 qml: escape untrusted text in RichText views 2026-04-17 18:02:58 +02:00
selsta
c7bc8b4019 main: use WalletManager URI parser in handler 2026-04-04 20:48:59 +02:00
tobtoht
49c3e498c7 Merge pull request #4575
e2a8efc installer: move p2pool to LocalAppData (selsta)
2026-03-28 20:17:49 +00:00
selsta
e2a8efca86 installer: move p2pool to LocalAppData 2026-03-21 22:36:04 +01:00
luigi1111
541c895d71 Merge pull request #4572
e4bd8c4 build: prepare v0.18.4.7 (selsta)
2026-03-02 19:19:59 -05:00
luigi1111
4eb77491eb Merge pull request #4571
eb25d4c WizardController: set password before storing wallet (selsta)
2026-03-02 19:19:33 -05:00
luigi1111
57f6ae2761 Merge pull request #4570
edb42af p2pool v4.14 (SChernykh)
2026-03-02 19:18:52 -05:00
selsta
e4bd8c4708 build: prepare v0.18.4.7 2026-03-02 20:36:47 +01:00
selsta
eb25d4cafa WizardController: set password before storing wallet 2026-03-02 19:58:44 +01:00
SChernykh
edb42af463 p2pool v4.14 2026-03-01 10:32:34 +01:00
14 changed files with 157 additions and 67 deletions

View File

@@ -5,7 +5,7 @@ message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
set(VERSION_MAJOR "18")
set(VERSION_MINOR "4")
set(VERSION_REVISION "6")
set(VERSION_REVISION "7")
set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
option(STATIC "Link libraries statically, requires static Qt")

View File

@@ -105,7 +105,7 @@ Packaging for your favorite distribution would be a welcome contribution!
```
git clone --branch master --recursive https://github.com/monero-project/monero-gui.git
```
\* `master` - replace with the desired version tag (e.g. `v0.18.4.6`) to build the release binaries.
\* `master` - replace with the desired version tag (e.g. `v0.18.4.7`) to build the release binaries.
3. Prepare build environment
```
cd monero-gui
@@ -128,7 +128,7 @@ Packaging for your favorite distribution would be a welcome contribution!
```
git clone --branch master --recursive https://github.com/monero-project/monero-gui.git
```
\* `master` - replace with the desired version tag (e.g. `v0.18.4.6`) to build the release binaries.
\* `master` - replace with the desired version tag (e.g. `v0.18.4.7`) to build the release binaries.
3. Prepare build environment
```
cd monero-gui

View File

@@ -32,6 +32,7 @@ import QtQuick.Controls 2.2
import QtQuick.Layouts 1.1
import "../components" as MoneroComponents
import "../js/Utils.js" as Utils
import FontAwesome 1.0
Rectangle {
@@ -306,7 +307,7 @@ Rectangle {
}
var title;
if (addressBookName) {
title = FontAwesome.addressBook + " " + addressBookName;
title = FontAwesome.addressBook + " " + Utils.htmlEscape(addressBookName);
} else {
title = qsTr("Monero address") + translationManager.emptyString;
}

View File

@@ -56,7 +56,6 @@ Name: "en"; MessagesFile: "compiler:Default.isl"
[Dirs]
Name: "{app}";
Name: "{app}\p2pool"; Permissions: users-full
[Files]
; The use of the flag "ignoreversion" for the following entries leads to the following behaviour:
@@ -138,6 +137,7 @@ Type: filesandordirs; Name: "{app}\QtQuick.2"
Type: filesandordirs; Name: "{app}\Material"
Type: filesandordirs; Name: "{app}\Universal"
Type: filesandordirs; Name: "{app}\scenegraph"
Type: filesandordirs; Name: "{localappdata}\monero-core\p2pool"
Type: filesandordirs; Name: "{app}\p2pool"
Type: files; Name: "{app}\D3Dcompiler_47.dll"
Type: files; Name: "{app}\libbz2-1.dll"
@@ -173,6 +173,8 @@ Type: files; Name: "{app}\ssleay32.dll"
Type: files; Name: "{app}\start-high-dpi.bat"
Type: files; Name: "{group}\Utilities\x (Check Blockchain Folder).lnk"
[UninstallDelete]
Type: filesandordirs; Name: "{localappdata}\monero-core\p2pool"
[Tasks]
Name: desktopicon; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:";

View File

@@ -130,3 +130,13 @@ function parseDateStringOrRestoreHeightAsInteger(value) {
}
return restoreHeight;
}
function htmlEscape(s) {
if (s === null || s === undefined)
return "";
return String(s)
.replace(/&/g, "&")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;");
}

View File

@@ -445,43 +445,25 @@ ApplicationWindow {
}
function onUriHandler(uri){
if(uri.startsWith("monero://")){
var address = uri.substring("monero://".length);
if (uri && (uri.startsWith("monero://") || uri.startsWith("monero:"))) {
const normalizedUri = uri.replace("monero://", "monero:");
const parsed = walletManager.parse_uri_to_object(normalizedUri);
var params = {}
if(address.length === 0) return;
var spl = address.split("?");
if (parsed.error) {
console.log("Invalid Monero URI: " + parsed.error);
} else {
middlePanel.transferView.sendTo(
parsed.address || "",
parsed.payment_id || "",
parsed.tx_description || "",
parsed.amount || ""
);
if(spl.length > 2) return;
if(spl.length >= 1) {
// parse additional params
address = spl[0];
if(spl.length === 2){
spl.shift();
var item = spl[0];
var _spl = item.split("&");
for (var param in _spl){
var _item = _spl[param];
if(!_item.indexOf("=") > 0) continue;
var __spl = _item.split("=");
if(__spl.length !== 2) continue;
params[__spl[0]] = __spl[1];
}
}
}
// Fill fields
middlePanel.transferView.sendTo(address, params["tx_payment_id"], params["tx_description"], params["tx_amount"]);
// Raise window
appWindow.raise();
appWindow.show();
}
}
}
function onWalletConnectionStatusChanged(status){
console.log("Wallet connection status changed " + status)

View File

@@ -81,6 +81,19 @@ Rectangle {
}
property string startLinkText: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style><a href='#'>(%1)</a>".arg(qsTr("Start daemon")) + translationManager.emptyString
property bool warningLongPidDescription: descriptionLine.text.match(/^[0-9a-f]{64}$/i)
property bool paymentIdBlocked: paymentIdCheckbox.checked || warningLongPidDescription
property bool hasTransferWarnings: warningContent !== "" || paymentIdBlocked
property bool hasValidTransferInfo: !recipientModel.hasEmptyAddress()
&& !recipientModel.hasEmptyAmount()
&& !recipientModel.hasInvalidAddress()
&& recipientModel.getAmountTotal() <= appWindow.getUnlockedBalance()
property bool canSendTransaction: !sendButtonWarningBox.visible
&& !hasTransferWarnings
&& hasValidTransferInfo
property bool canCreateOfflineTx: appWindow.viewOnly
&& appWindow.daemonSynced
&& !hasTransferWarnings
&& hasValidTransferInfo
Clipboard { id: clipboard }
@@ -819,7 +832,7 @@ Rectangle {
text: qsTr("Long payment IDs are obsolete. \
Long payment IDs were not encrypted on the blockchain and would harm your privacy. \
If the party you're sending to still requires a long payment ID, please notify them.") + translationManager.emptyString;
visible: paymentIdCheckbox.checked || warningLongPidDescription
visible: root.paymentIdBlocked
}
MoneroComponents.WarningBox {
@@ -834,7 +847,7 @@ Rectangle {
rightIcon: "qrc:///images/rightArrow.png"
Layout.topMargin: 4
text: qsTr("Send") + translationManager.emptyString
enabled: !sendButtonWarningBox.visible && !warningContent && !recipientModel.hasEmptyAddress() && !paymentIdWarningBox.visible
enabled: root.canSendTransaction
onClicked: {
console.log("Transfer: paymentClicked")
var priority = priorityModelV5.get(priorityDropdown.currentIndex).priority
@@ -844,13 +857,6 @@ Rectangle {
}
}
}
function checkInformation() {
return !recipientModel.hasEmptyAmount() &&
recipientModel.getAmountTotal() <= appWindow.getUnlockedBalance() &&
!recipientModel.hasInvalidAddress();
}
} // pageRoot
ColumnLayout {
@@ -934,7 +940,7 @@ Rectangle {
visible: persistentSettings.transferShowAdvanced && appWindow.walletMode >= 2
title: qsTr("Offline transaction signing") + translationManager.emptyString
button1.text: qsTr("Create") + translationManager.emptyString
button1.enabled: appWindow.viewOnly && pageRoot.checkInformation() && appWindow.daemonSynced
button1.enabled: root.canCreateOfflineTx
button1.onClicked: {
console.log("Transfer: saveTx Clicked")
var priority = priorityModelV5.get(priorityDropdown.currentIndex).priority
@@ -956,7 +962,7 @@ Rectangle {
}
tooltip: {
var errorMessage = "";
if (appWindow.viewOnly && !pageRoot.checkInformation()) {
if (appWindow.viewOnly && !root.hasValidTransferInfo) {
errorMessage = "<p class='orange'>" + qsTr("* To create a transaction file, please enter address and amount above") + "</p>";
}
var header = qsTr("Spend XMR from a cold (offline) wallet") + translationManager.emptyString;

View File

@@ -1,3 +1,31 @@
// Copyright (c) 2014-2026, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.9
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.0

View File

@@ -1,3 +1,31 @@
// Copyright (c) 2014-2026, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.9
import QtQuick.Layouts 1.1
import QtGraphicalEffects 1.0

View File

@@ -1,3 +1,31 @@
// Copyright (c) 2014-2026, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.9
import QtQuick.Controls 2.0
import QtQuick.Controls.Styles 1.4

View File

@@ -180,7 +180,7 @@ Rectangle {
consoleArea.append(msg);
}
function logMessage(msg){
msg = msg.trim();
msg = Utils.htmlEscape(msg.trim());
var color = MoneroComponents.Style.defaultFontColor;
if(msg.toLowerCase().indexOf('error') >= 0){
color = MoneroComponents.Style.errorColor;

View File

@@ -56,10 +56,10 @@ public:
Q_INVOKABLE bool isCapsLock() const;
Q_INVOKABLE quint8 getNetworkTypeFromFile(const QString &keysPath) const;
Q_INVOKABLE void openSeedTemplate() const;
bool installed() const;
static std::pair<quint8, QString> getNetworkTypeAndAddressFromFile(const QString &wallet);
private:
bool installed() const;
signals:

View File

@@ -29,6 +29,7 @@
#include "P2PoolManager.h"
#include "net/http_client.h"
#include "common/util.h"
#include "main/oshelper.h"
#include "qt/utils.h"
#include <QElapsedTimer>
#include <QFile>
@@ -41,6 +42,7 @@
#include <QApplication>
#include <QProcess>
#include <QMap>
#include <QStandardPaths>
#include <QCryptographicHash>
#if defined(Q_OS_MACOS) && defined(__aarch64__) && !defined(Q_OS_MACOS_AARCH64)
@@ -53,21 +55,21 @@ void P2PoolManager::download() {
QString fileName;
QString validHash;
#ifdef Q_OS_WIN
url = "https://github.com/SChernykh/p2pool/releases/download/v4.13/p2pool-v4.13-windows-x64.zip";
fileName = m_p2poolPath + "/p2pool-v4.13-windows-x64.zip";
validHash = "267006cd1259253052e64e9ac5ae27532cf238e71588444c14624b9432325e9f";
url = "https://github.com/SChernykh/p2pool/releases/download/v4.14/p2pool-v4.14-windows-x64.zip";
fileName = m_p2poolPath + "/p2pool-v4.14-windows-x64.zip";
validHash = "9c7f0476c441fc0c021fae7d01264b4ec61dc3301ed73b65931555550becf396";
#elif defined(Q_OS_LINUX)
url = "https://github.com/SChernykh/p2pool/releases/download/v4.13/p2pool-v4.13-linux-x64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.13-linux-x64.tar.gz";
validHash = "d02361ee5f18e3e53af79436af6dc1772b71aa5ad8582ad88b0764ae2c9289c3";
url = "https://github.com/SChernykh/p2pool/releases/download/v4.14/p2pool-v4.14-linux-x64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.14-linux-x64.tar.gz";
validHash = "e64f6f774dc35352b8ae4397ccdb92ce0cc935cdfb100eac58d44e49f8796a01";
#elif defined(Q_OS_MACOS_AARCH64)
url = "https://github.com/SChernykh/p2pool/releases/download/v4.13/p2pool-v4.13-macos-aarch64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.13-macos-aarch64.tar.gz";
validHash = "fddd309566395a8297738f3fd5cd0fe9d792c3005bb664a1a61befa029e802ad";
url = "https://github.com/SChernykh/p2pool/releases/download/v4.14/p2pool-v4.14-macos-aarch64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.14-macos-aarch64.tar.gz";
validHash = "7cc780af6115ef8d9d6b7f3c1336f57dab25745b6208b6e97dca8729782e155b";
#elif defined(Q_OS_MACOS)
url = "https://github.com/SChernykh/p2pool/releases/download/v4.13/p2pool-v4.13-macos-x64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.13-macos-x64.tar.gz";
validHash = "374c42bbb409ed2ef3e5e0b4359441929cc574b2fa9bc8b3bdf7695471f8f94d";
url = "https://github.com/SChernykh/p2pool/releases/download/v4.14/p2pool-v4.14-macos-x64.tar.gz";
fileName = m_p2poolPath + "/p2pool-v4.14-macos-x64.tar.gz";
validHash = "7df3be2ae15eda4260d2665e4a2c3c7dc2f1dba26a2a643e46a2b1283097a60a";
#endif
QFile file(fileName);
epee::net_utils::http::http_simple_client http_client;
@@ -241,9 +243,14 @@ P2PoolManager::P2PoolManager(QObject *parent)
started = false;
// Platform dependent path to p2pool
#ifdef Q_OS_WIN
if (OSHelper().installed()) {
m_p2poolPath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/p2pool";
} else {
m_p2poolPath = QApplication::applicationDirPath() + "/p2pool";
}
if (!QDir(m_p2poolPath).exists()) {
QDir().mkdir(m_p2poolPath);
QDir().mkpath(m_p2poolPath);
}
m_p2pool = m_p2poolPath + "/p2pool.exe";
#elif defined(Q_OS_UNIX)

View File

@@ -378,9 +378,6 @@ Rectangle {
console.log("Removing temporary wallet: " + wizardController.tmpWalletFilename)
oshelper.removeTemporaryWallet(wizardController.tmpWalletFilename)
// protecting wallet with password
wizardController.m_wallet.setPassword(wizardController.walletOptionsPassword);
// save to persistent settings
persistentSettings.account_name = wizardController.walletOptionsName
persistentSettings.wallet_path = wizardController.m_wallet.path;
@@ -399,6 +396,7 @@ Rectangle {
new_wallet_filename = appWindow.accountsDir + new_wallet_filename;
}
console.log("saving new wallet to", new_wallet_filename);
wizardController.m_wallet.setPassword(wizardController.walletOptionsPassword);
wizardController.m_wallet.storeAsync(handler, new_wallet_filename);
}