Skip to content

Commit 1ee6d0b

Browse files
ryanofskyjarolrod
andcommitted
gui: Prompt to reset settings when settings.json cannot be read
Fixes bitcoin/bitcoin#21340 Co-authored-by: Jarol Rodriguez <[email protected]>
1 parent df2b5da commit 1ee6d0b

File tree

1 file changed

+54
-3
lines changed

1 file changed

+54
-3
lines changed

src/qt/bitcoin.cpp

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,58 @@ static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTrans
144144
QApplication::installTranslator(&translator);
145145
}
146146

147+
static std::string JoinErrors(const std::vector<std::string>& errors)
148+
{
149+
return Join(errors, "\n", [](const std::string& error) { return "- " + error; });
150+
}
151+
152+
static bool InitSettings()
153+
{
154+
if (!gArgs.GetSettingsPath()) {
155+
return true; // Do nothing if settings file disabled.
156+
}
157+
158+
std::vector<std::string> errors;
159+
if (!gArgs.ReadSettingsFile(&errors)) {
160+
bilingual_str error = _("Settings file could not be read");
161+
InitError(Untranslated(strprintf("%s:\n%s\n", error.original, JoinErrors(errors))));
162+
163+
QMessageBox messagebox(QMessageBox::Critical, PACKAGE_NAME, QString::fromStdString(strprintf("%s.", error.translated)), QMessageBox::Reset | QMessageBox::Abort);
164+
/*: Explanatory text shown on startup when the settings file cannot be read.
165+
Prompts user to make a choice between resetting or aborting. */
166+
messagebox.setInformativeText(QObject::tr("Do you want to reset settings to default values, or to abort without making changes?"));
167+
messagebox.setDetailedText(QString::fromStdString(JoinErrors(errors)));
168+
messagebox.setTextFormat(Qt::PlainText);
169+
messagebox.setDefaultButton(QMessageBox::Reset);
170+
switch (messagebox.exec()) {
171+
case QMessageBox::Reset:
172+
break;
173+
case QMessageBox::Abort:
174+
return false;
175+
default:
176+
assert(false);
177+
}
178+
}
179+
180+
errors.clear();
181+
if (!gArgs.WriteSettingsFile(&errors)) {
182+
bilingual_str error = _("Settings file could not be written");
183+
InitError(Untranslated(strprintf("%s:\n%s\n", error.original, JoinErrors(errors))));
184+
185+
QMessageBox messagebox(QMessageBox::Critical, PACKAGE_NAME, QString::fromStdString(strprintf("%s.", error.translated)), QMessageBox::Ok);
186+
/*: Explanatory text shown on startup when the settings file could not be written.
187+
Prompts user to check that we have the ability to write to the file.
188+
Explains that the user has the option of running without a settings file.*/
189+
messagebox.setInformativeText(QObject::tr("A fatal error occured. Check that settings file is writable, or try running with -nosettings."));
190+
messagebox.setDetailedText(QString::fromStdString(JoinErrors(errors)));
191+
messagebox.setTextFormat(Qt::PlainText);
192+
messagebox.setDefaultButton(QMessageBox::Ok);
193+
messagebox.exec();
194+
return false;
195+
}
196+
return true;
197+
}
198+
147199
/* qDebug() message handler --> debug.log */
148200
void DebugMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &msg)
149201
{
@@ -569,9 +621,8 @@ int GuiMain(int argc, char* argv[])
569621
// Parse URIs on command line -- this can affect Params()
570622
PaymentServer::ipcParseCommandLine(argc, argv);
571623
#endif
572-
if (!gArgs.InitSettings(error)) {
573-
InitError(Untranslated(error));
574-
QMessageBox::critical(nullptr, PACKAGE_NAME, QObject::tr("Error initializing settings: %1").arg(QString::fromStdString(error)));
624+
625+
if (!InitSettings()) {
575626
return EXIT_FAILURE;
576627
}
577628

0 commit comments

Comments
 (0)