@ -1,4 +1,4 @@
// Copyright 2019-2021 The Hush developers
// Copyright 2019-2022 The Hush developers
// Released under the GPLv3
# include "firsttimewizard.h"
# include "ui_newseed.h"
@ -7,7 +7,6 @@
# include "ui_newwallet.h"
# include "mainwindow.h"
# include "DataStore/DataStore.h"
# include "../lib/silentdragonlitelib.h"
# ifdef Q_OS_WIN
@ -52,6 +51,7 @@ void FirstTimeWizard::slot_change_theme(const QString& theme_name) {
FirstTimeWizard : : FirstTimeWizard ( bool dangerous , QString server )
{
qDebug ( ) < < __func__ < < " : dangerous= " < < dangerous < < " server= " < < server ;
// Include css
QString theme_name ;
try
@ -64,21 +64,19 @@ FirstTimeWizard::FirstTimeWizard(bool dangerous, QString server)
}
this - > slot_change_theme ( theme_name ) ;
setWindowTitle ( " New wallet wizard " ) ;
setWindowTitle ( tr ( " New wallet wizard " ) ) ;
this - > dangerous = dangerous ;
this - > server = server ;
////backup addresslabels.dat if there is one, to restore it later
//backup addresslabels.dat if there is one, to restore it later
auto dir = QDir ( QStandardPaths : : writableLocation ( QStandardPaths : : AppDataLocation ) ) ;
QString addressbook = dir . filePath ( " addresslabels.dat.enc " ) ;
QFile file ( addressbook ) ;
if ( file . exists ( ) )
{
if ( file . exists ( ) ) {
file . rename ( dir . filePath ( " addresslabels.dat.enc-backup " ) ) ;
qDebug ( ) < < __func__ < < " : backed up old addresslabels " ;
}
// Create the pages
@ -104,81 +102,83 @@ int FirstTimeWizard::nextId() const {
QString FirstTimeWizard : : getSeed ( )
{
return _seed ;
}
void FirstTimeWizard : : setSeed ( QString seed )
{
_seed = seed ;
}
QString FirstTimeWizard : : getBirthday ( )
{
return _birthday ;
}
void FirstTimeWizard : : setBirthday ( QString birthday )
{
_birthday = birthday ;
}
void FirstTimeWizard : : initializePage ( ) {
qDebug ( ) < < " FirstTimeWizard: " < < __func__ ;
}
void NewOrRestorePage : : initializePage ( ) {
qDebug ( ) < < " NewOrRestorePage: " < < __func__ ;
}
NewOrRestorePage : : NewOrRestorePage ( FirstTimeWizard * parent ) : QWizardPage ( parent ) {
setTitle ( " Create or Restore wallet. " ) ;
qDebug ( ) < < __func__ ;
setTitle ( tr ( " Create or Restore wallet. " ) ) ;
QWidget * pageWidget = new QWidget ( ) ;
Ui_CreateWalletForm form ;
form . setupUi ( pageWidget ) ;
QGraphicsScene * scene = new QGraphicsScene ( ) ;
QGraphicsView * view = new QGraphicsView ( scene ) ;
form . Logo - > setScene ( scene ) ;
QPixmap pixmap ( " :/icons/res/dark-01.png " ) ;
scene - > addPixmap ( pixmap ) ;
form . Logo - > show ( ) ;
setButtonText ( QWizard : : CommitButton , tr ( " Next " ) ) ;
parent - > setOption ( QWizard : : NoBackButtonOnStartPage ) ;
parent - > button ( QWizard : : CommitButton ) - > setEnabled ( false ) ;
setButtonText ( QWizard : : CommitButton , " Next " ) ;
form . txtPassword - > setEnabled ( false ) ;
form . txtConfirmPassword - > setEnabled ( false ) ;
QObject : : connect ( form . TOS , & QRadioButton : : clicked , [ = ] ( bool checked ) {
qDebug ( ) < < __func__ < < " : TOS radio button clicked " ;
if ( checked ) {
form . txtPassword - > setEnabled ( true ) ;
form . txtConfirmPassword - > setEnabled ( true ) ;
} else {
qDebug ( ) < < __func__ < < " : disabling next/commit buttons " ;
parent - > button ( QWizard : : CommitButton ) - > setEnabled ( false ) ;
parent - > button ( QWizard : : NextButton ) - > setEnabled ( false ) ;
}
} ) ;
auto fnPasswordEdited = [ = ] ( const QString & ) {
// Enable the Finish button if the passwords match.
QString passphraseBlank = form . txtPassword - > text ( ) ;
QString passphrase = QString ( " HUSH3 " ) + passphraseBlank + QString ( " SDL " ) ;
if ( ! form . txtPassword - > text ( ) . isEmpty ( ) & &
form . txtPassword - > text ( ) = = form . txtConfirmPassword - > text ( ) & & passphraseBlank . size ( ) > = 16 ) {
form . lblPasswordMatch - > setText ( " " ) ;
form . radioRestoreWallet - > setEnabled ( true ) ;
form . radioNewWallet - > setEnabled ( true ) ;
form . radioNewWallet - > setChecked ( true ) ;
parent - > button ( QWizard : : NextButton ) - > setEnabled ( false ) ;
int length = passphrase . length ( ) ;
qDebug ( ) < < __func__ < < " : passphrase length= " < < length ;
char * sequence = NULL ;
sequence = new char [ length + 1 ] ;
@ -186,7 +186,6 @@ NewOrRestorePage::NewOrRestorePage(FirstTimeWizard *parent) : QWizardPage(parent
QString passphraseHash = blake3_PW ( sequence ) ;
char * sequence1 = NULL ;
sequence1 = new char [ length + 1 ] ;
strncpy ( sequence1 , passphraseHash . toUtf8 ( ) , length + 1 ) ;
@ -200,11 +199,12 @@ NewOrRestorePage::NewOrRestorePage(FirstTimeWizard *parent) : QWizardPage(parent
unsigned char key [ KEY_LEN ] ;
if ( crypto_pwhash
( key , sizeof key , PASSWORD , strlen ( PASSWORD ) , hash ,
if ( crypto_pwhash ( key , sizeof key , PASSWORD , strlen ( PASSWORD ) , hash ,
crypto_pwhash_OPSLIMIT_SENSITIVE , crypto_pwhash_MEMLIMIT_SENSITIVE ,
crypto_pwhash_ALG_DEFAULT ) ! = 0 ) {
/* out of memory */
qDebug ( ) < < __func__ < < " : crypto_pwhash failed! Possibly out of memory " ;
exit ( 1 ) ;
}
QString passphraseHash1 = QByteArray ( reinterpret_cast < const char * > ( key ) , KEY_LEN ) . toHex ( ) ;
DataStore : : getChatDataStore ( ) - > setPassword ( passphraseHash1 ) ;
@ -212,6 +212,7 @@ NewOrRestorePage::NewOrRestorePage(FirstTimeWizard *parent) : QWizardPage(parent
// Exclusive buttons
QObject : : connect ( form . radioNewWallet , & QRadioButton : : clicked , [ = ] ( bool checked ) {
if ( checked ) {
qDebug ( ) < < __func__ < < " : new wallet radio button clicked " ;
form . radioRestoreWallet - > setChecked ( false ) ;
parent - > button ( QWizard : : CommitButton ) - > setEnabled ( true ) ;
@ -220,17 +221,15 @@ NewOrRestorePage::NewOrRestorePage(FirstTimeWizard *parent) : QWizardPage(parent
QObject : : connect ( form . radioRestoreWallet , & QRadioButton : : clicked , [ = ] ( bool checked ) {
if ( checked ) {
qDebug ( ) < < __func__ < < " : restore wallet radio button clicked " ;
form . radioNewWallet - > setChecked ( false ) ;
parent - > button ( QWizard : : CommitButton ) - > setEnabled ( true ) ;
}
} ) ;
} else {
qDebug ( ) < < __func__ < < " : passphrases do not match " ;
form . lblPasswordMatch - > setText ( tr ( " Passphrase don't match or You have entered too few letters (16 minimum) " ) ) ;
parent - > button ( QWizard : : CommitButton ) - > setEnabled ( false ) ;
@ -244,23 +243,33 @@ NewOrRestorePage::NewOrRestorePage(FirstTimeWizard *parent) : QWizardPage(parent
layout - > addWidget ( pageWidget ) ;
setLayout ( layout ) ;
QObject : : connect ( form . txtConfirmPassword , & QLineEdit : : textChanged , fnPasswordEdited ) ;
QObject : : connect ( form . txtPassword , & QLineEdit : : textChanged , fnPasswordEdited ) ;
registerField ( " intro.new " , form . radioNewWallet ) ;
form . radioRestoreWallet - > setEnabled ( false ) ;
form . radioNewWallet - > setEnabled ( false ) ;
setCommitPage ( true ) ;
registerField ( " intro.restore " , form . radioRestoreWallet ) ;
// A trailing * means these are REQUIRED fields and "Next" button will be disabled
// until they are filled
registerField ( " TOS* " , form . TOS ) ;
registerField ( " txtPassword* " , form . txtPassword ) ;
registerField ( " txtConfirmPassword* " , form . txtPassword ) ;
form . radioRestoreWallet - > setEnabled ( false ) ;
form . radioNewWallet - > setEnabled ( false ) ;
qDebug ( ) < < __func__ < < " : disabling next/commit buttons " ;
setCommitPage ( true ) ;
parent - > button ( QWizard : : CommitButton ) - > setEnabled ( false ) ;
parent - > button ( QWizard : : NextButton ) - > setEnabled ( false ) ;
}
NewSeedPage : : NewSeedPage ( FirstTimeWizard * parent ) : QWizardPage ( parent ) {
qDebug ( ) < < __func__ ;
this - > parent = parent ;
setTitle ( " Your new wallet " ) ;
setTitle ( tr ( " Your new wallet " ) ) ;
QWidget * pageWidget = new QWidget ( ) ;
form . setupUi ( pageWidget ) ;
@ -273,9 +282,11 @@ NewSeedPage::NewSeedPage(FirstTimeWizard *parent) : QWizardPage(parent) {
void NewSeedPage : : initializePage ( ) {
// Call the library to create a new wallet.
qDebug ( ) < < __func__ ;
char * resp = litelib_initialize_new ( parent - > dangerous , parent - > server . toStdString ( ) . c_str ( ) ) ;
QString reply = litelib_process_response ( resp ) ;
qDebug ( ) < < __func__ < < " : reply= " < < reply ;
auto parsed = json : : parse ( reply . toStdString ( ) . c_str ( ) , nullptr , false ) ;
if ( parsed . is_discarded ( ) | | parsed . is_null ( ) | | parsed . find ( " seed " ) = = parsed . end ( ) ) {
@ -290,15 +301,15 @@ void NewSeedPage::initializePage() {
parent - > button ( QWizard : : CancelButton ) - > setEnabled ( false ) ;
disconnect ( parent - > button ( QWizard : : CancelButton ) , SIGNAL ( clicked ( ) ) , parent , SLOT ( reject ( ) ) ) ;
connect ( parent - > button ( QWizard : : CancelButton ) , SIGNAL ( clicked ( ) ) , parent , SLOT ( cancelEvent ( ) ) ) ;
qDebug ( ) < < __func__ < < " : page initialized with birthday= " < < birthday ;
}
}
void FirstTimeWizard : : cancelEvent ( )
{
void FirstTimeWizard : : cancelEvent ( ) {
qDebug ( ) < < __func__ ;
if ( QMessageBox : : question ( this , ( " Quit Setup " ) , ( " Setup is not complete yet. Are you sure you want to quit setup? " ) , QMessageBox : : Yes , QMessageBox : : No ) = = QMessageBox : : Yes ) {
qDebug ( ) < < __func__ < < " : wizard canceled " ;
// allow cancel
reject ( ) ;
}
@ -307,6 +318,7 @@ void FirstTimeWizard::cancelEvent()
// Will be called just before closing. Make sure we can save the seed in the wallet
// before we allow the page to be closed
bool NewSeedPage : : validatePage ( ) {
qDebug ( ) < < __func__ ;
Ui_verifyseed verifyseed ;
QDialog dialog ( this ) ;
@ -316,7 +328,6 @@ bool NewSeedPage::validatePage() {
form . birthday - > setVisible ( false ) ;
form . txtSeed - > setVisible ( false ) ;
QString seed = parent - > getSeed ( ) ;
QString birthday = parent - > getBirthday ( ) ;
QString word1 = seed . split ( " " ) . at ( 13 ) ;
@ -603,8 +614,7 @@ bool NewSeedPage::validatePage() {
return true ;
}
} else {
qDebug ( ) < < " Falscher Seed " ;
qDebug ( ) < < " Wrong Seed " ;
QFile file ( dirwalletencfirst ) ;
QFile file1 ( dirwalletfirst ) ;
@ -618,13 +628,15 @@ bool NewSeedPage::validatePage() {
return false ;
this - > validatePage ( ) ;
}
return false ;
}
RestoreSeedPage : : RestoreSeedPage ( FirstTimeWizard * parent ) : QWizardPage ( parent ) {
this - > parent = parent ;
setTitle ( " Restore wallet from seed " ) ;
setTitle ( tr ( " Restore wallet from seed " ) ) ;
QWidget * pageWidget = new QWidget ( ) ;
form . setupUi ( pageWidget ) ;
@ -638,7 +650,9 @@ RestoreSeedPage::RestoreSeedPage(FirstTimeWizard *parent) : QWizardPage(parent)
bool RestoreSeedPage : : validatePage ( ) {
// 1. Validate that we do have 24 words
QString seed = form . txtSeed - > toPlainText ( ) . replace ( QRegExp ( " [ \n \r \t ]+ " ) , " " ) ;
if ( seed . trimmed ( ) . split ( " " ) . length ( ) ! = 24 ) {
auto seedLength = seed . trimmed ( ) . split ( " " ) . length ( ) ;
qDebug ( ) < < __func__ < < " : seed length= " < < seedLength ;
if ( seedLength ! = 24 ) {
QMessageBox : : warning ( this , tr ( " Failed to restore wallet " ) ,
tr ( " SilentDragonLite needs 24 words to restore wallet " ) ,
QMessageBox : : Ok ) ;
@ -650,6 +664,7 @@ bool RestoreSeedPage::validatePage() {
bool ok ;
qint64 birthday = birthday_str . toUInt ( & ok ) ;
if ( ! ok ) {
qDebug ( ) < < __func__ < < " : Failed to parse wallet birthday= " < < birthday_str ;
QMessageBox : : warning ( this , tr ( " Failed to parse wallet birthday " ) ,
tr ( " Couldn't understand wallet birthday. This should be a block height from where to rescan the wallet. You can leave it as '0' if you don't know what it should be. " ) ,
QMessageBox : : Ok ) ;
@ -657,7 +672,6 @@ bool RestoreSeedPage::validatePage() {
}
///Number
QString number_str = form . number - > text ( ) ;
qint64 number = number_str . toUInt ( ) ;
// 3. Attempt to restore wallet with the seed phrase
@ -681,6 +695,7 @@ qint64 number = number_str.toUInt();
auto parsed = json : : parse ( reply . toStdString ( ) . c_str ( ) , nullptr , false ) ;
if ( parsed . is_discarded ( ) | | parsed . is_null ( ) | | parsed . find ( " result " ) = = parsed . end ( ) ) {
qDebug ( ) < < __func__ < < " : Failed to save wallet, reply= " < < reply ;
QMessageBox : : warning ( this , tr ( " Failed to save wallet " ) ,
tr ( " Couldn't save the wallet " ) + " \n " + reply ,
QMessageBox : : Ok ) ;