# # # patch "NEWS" # from [e76164cbaacbd34a6151737d5ea8975d823ff2ad] # to [d5bcaa4189ebe0c0b7350b4f4d0a2d4567918e2a] # # patch "res/forms/dialogs/open_prompt.ui" # from [0392f308c05e7c42374533914ca2f232e160d51a] # to [6dba9becb751fb708786c734ff1976a89192123a] # # patch "src/util/Settings.cpp" # from [df71f25d2ca2cc8393d6ffbacd28f44364b4af91] # to [15a1518411aa6d3687bc228e873f5e30db095421] # # patch "src/view/dialogs/DatabaseDialogManager.cpp" # from [960696a7449c832c363205b52f1f92098242abe4] # to [d95121a1fba2fbb66bbf052438276df6697c55ab] # # patch "src/view/dialogs/DatabaseDialogManager.h" # from [b2f547e5843fc3f29c905105d4085ee50a0c3ff5] # to [2b8707058b88264e418d76c9b7b6a738508f1bee] # # patch "src/view/dialogs/DialogManager.cpp" # from [d7365a29a00859e3bd859b7c0772cd1951ee8780] # to [3345940607ca79962be8b369d7da80da5a09c063] # # patch "src/view/dialogs/DialogManager.h" # from [343b2372939ed1dbe4fc6de062a1041204b756de] # to [7c69e02ec24c2381e6daaf60317167c1130e8838] # # patch "src/view/dialogs/OpenPrompt.cpp" # from [683e45c734ff1c2bc6c0bc10537bc545a2c0e0da] # to [ed5bf1ad8f23e68fc35ec4d67bbb188b2a95613b] # # patch "src/view/dialogs/OpenPrompt.h" # from [99d4ca96d8642c7f5e6c7eea897b1c6f12eaa064] # to [9a921d8e398b7bc588d6c181be230cab0ead553a] # # patch "src/view/dialogs/ServerDialogManager.cpp" # from [15db0849be6feaa2f91d82093a70a2d8399d060c] # to [2e6ba55e01475839f23dd7c73218ade7c5bbb27e] # # patch "src/view/dialogs/ServerDialogManager.h" # from [1e7e60248dd468ad6d2030412de33e32335a1fc9] # to [d13c5ecabc71d45ef641465f2160cabdc1bd083b] # # patch "src/view/dialogs/WorkspaceDialogManager.cpp" # from [55b57c63cd0f05cbca8aa31840405f4491c4c591] # to [1cf37e8716296b4b0588e2fc4a9243aaaaf22747] # # patch "src/view/dialogs/WorkspaceDialogManager.h" # from [e703ce7af0b396cdca23e36e848bb348bdabfd42] # to [5fa1b3ab7ff31d3c0371082cda16f70c2105c841] # ============================================================ --- src/util/Settings.cpp df71f25d2ca2cc8393d6ffbacd28f44364b4af91 +++ src/util/Settings.cpp 15a1518411aa6d3687bc228e873f5e30db095421 @@ -70,6 +70,7 @@ Settings::Settings() : inner(0) defaults.insert("ReadWorkspaceIncrementally", false); defaults.insert("ReadUserRcFiles", false); defaults.insert("ChangesetBrowserTree", false); + defaults.insert("PromptWhenPrivateKeyIsMissing", true); } Settings::~Settings() ============================================================ --- NEWS e76164cbaacbd34a6151737d5ea8975d823ff2ad +++ NEWS d5bcaa4189ebe0c0b7350b4f4d0a2d4567918e2a @@ -1,6 +1,12 @@ xxxx-xx-xx (1.0rc5) xxxx-xx-xx (1.0rc5) - new: connect to remote monotone server instances and browse their history and files + - improved: guitone recognizes if a user has no private key + yet and presents a message box to ask him if he just wants + to create one + - improved: the key management dialog can now be reached through + the initial open prompt by clicking the new button + "Key management" - improved: use custom file open dialogs for workspaces and databases and report possible problems early - internal: separate build target for win32 installer creation ============================================================ --- src/view/dialogs/DialogManager.cpp d7365a29a00859e3bd859b7c0772cd1951ee8780 +++ src/view/dialogs/DialogManager.cpp 3345940607ca79962be8b369d7da80da5a09c063 @@ -23,14 +23,20 @@ DialogManager::DialogManager(QWidget * p DialogManager::DialogManager(QWidget * parentWidget) : QObject(parentWidget), about(0), preferences(0), - createDatabase(0), changeKeyPassword(0), sourcePicker(0) -{} + createDatabase(0), keyManagement(0), generateKeypair(0), + changeKeyPassword(0), sourcePicker(0) +{ + // use an empty handle by default + monotoneHandle = MonotoneHandle::create(); +} DialogManager::~DialogManager() { if (about) delete about; if (preferences) delete preferences; if (createDatabase) delete createDatabase; + if (keyManagement) delete keyManagement; + if (generateKeypair) delete generateKeypair; if (changeKeyPassword) delete changeKeyPassword; if (sourcePicker) delete sourcePicker; } @@ -40,12 +46,19 @@ QWidget * DialogManager::parentWidget() return reinterpret_cast(parent()); } +void DialogManager::init(const MonotoneHandlePtr & handle) +{ + monotoneHandle = handle; +} + void DialogManager::closeAllDialogs() { - if (about) about->close(); - if (preferences) preferences->close(); - if (createDatabase) createDatabase->close(); - if (sourcePicker) sourcePicker->close(); + if (about) about->close(); + if (preferences) preferences->close(); + if (createDatabase) createDatabase->close(); + if (keyManagement) keyManagement->close(); + if (generateKeypair) generateKeypair->close(); + if (sourcePicker) sourcePicker->close(); emit allDialogsClosed(); } @@ -81,6 +94,52 @@ void DialogManager::showCreateDatabase() showDialog(createDatabase); } +void DialogManager::showKeyManagement() +{ + if (!keyManagement) + { + keyManagement = new KeyManagement(parentWidget(), monotoneHandle); + + connect( + keyManagement, SIGNAL(generateKeypair()), + this, SLOT(showGenerateKeypair()) + ); + + connect( + keyManagement, SIGNAL(changeKeyPassword(const QString &)), + this, SLOT(showChangeKeyPassword(const QString &)) + ); + + connect( + this, SIGNAL(keyPasswordChanged(const QString &)), + keyManagement, SLOT(readKeys()) + ); + + connect( + this, SIGNAL(keypairGenerated(const QString &)), + keyManagement, SLOT(readKeys()) + ); + } + + keyManagement->readKeys(); + showDialog(keyManagement); +} + +void DialogManager::showGenerateKeypair() +{ + if (!generateKeypair) + { + generateKeypair = new GenerateKeypair(parentWidget(), monotoneHandle); + + connect( + generateKeypair, SIGNAL(keypairGenerated(const QString &)), + this, SIGNAL(keypairGenerated(const QString &)) + ); + } + + showDialog(generateKeypair); +} + void DialogManager::showChangeKeyPassword(const QString & keyHash) { if (!changeKeyPassword) ============================================================ --- src/view/dialogs/DialogManager.h 343b2372939ed1dbe4fc6de062a1041204b756de +++ src/view/dialogs/DialogManager.h 7c69e02ec24c2381e6daaf60317167c1130e8838 @@ -22,6 +22,8 @@ #include "About.h" #include "Preferences.h" #include "CreateDatabase.h" +#include "KeyManagement.h" +#include "GenerateKeypair.h" #include "ChangeKeyPassword.h" #include "vocab.h" @@ -35,17 +37,21 @@ public: DialogManager(QWidget *); ~DialogManager(); + void init(const MonotoneHandlePtr &); virtual void closeAllDialogs(); public slots: void showAbout(); void showPreferences(); void showCreateDatabase(); + void showKeyManagement(); + void showGenerateKeypair(); void showChangeKeyPassword(const QString &); void showSourcePicker(const MonotoneHandle::Type &); signals: void sourceSelected(const MonotoneHandlePtr &); + void keypairGenerated(const QString &); void keyPasswordChanged(const QString &); void allDialogsClosed(); @@ -56,9 +62,13 @@ protected: About * about; Preferences * preferences; CreateDatabase * createDatabase; + KeyManagement * keyManagement; + GenerateKeypair * generateKeypair; ChangeKeyPassword * changeKeyPassword; QDialog * sourcePicker; + MonotoneHandlePtr monotoneHandle; + private: void cleanup(); ============================================================ --- src/view/dialogs/DatabaseDialogManager.cpp 960696a7449c832c363205b52f1f92098242abe4 +++ src/view/dialogs/DatabaseDialogManager.cpp d95121a1fba2fbb66bbf052438276df6697c55ab @@ -21,34 +21,26 @@ DatabaseDialogManager::DatabaseDialogMan DatabaseDialogManager::DatabaseDialogManager(QWidget * parent) : DialogManager(parent), changesetBrowser(0), - checkoutRevision(0), fileDiff(0), fileHistory(0), generateKeypair(0), - netsync(0), keyManagement(0), revisionDiff(0), - revisionManifest(0), selectRevision(0), newProjectSetup(0), - annotateFile(0), createCert(0) + checkoutRevision(0), fileDiff(0), fileHistory(0), netsync(0), + revisionDiff(0), revisionManifest(0), selectRevision(0), + newProjectSetup(0), annotateFile(0), createCert(0) {} DatabaseDialogManager::~DatabaseDialogManager() { - cleanup(); + if (changesetBrowser) delete changesetBrowser; + if (checkoutRevision) delete checkoutRevision; + if (fileDiff) delete fileDiff; + if (fileHistory) delete fileHistory; + if (netsync) delete netsync; + if (revisionDiff) delete revisionDiff; + if (revisionManifest) delete revisionManifest; + if (selectRevision) delete selectRevision; + if (newProjectSetup) delete newProjectSetup; + if (annotateFile) delete annotateFile; + if (createCert) delete createCert; } -void DatabaseDialogManager::cleanup() -{ - if (changesetBrowser) { delete changesetBrowser; changesetBrowser = 0; } - if (checkoutRevision) { delete checkoutRevision; checkoutRevision = 0; } - if (fileDiff) { delete fileDiff; fileDiff = 0; } - if (fileHistory) { delete fileHistory; fileHistory = 0; } - if (generateKeypair) { delete generateKeypair; generateKeypair = 0; } - if (netsync) { delete netsync; netsync = 0; } - if (keyManagement) { delete keyManagement; keyManagement = 0; } - if (revisionDiff) { delete revisionDiff; revisionDiff = 0; } - if (revisionManifest) { delete revisionManifest; revisionManifest = 0; } - if (selectRevision) { delete selectRevision; selectRevision = 0; } - if (newProjectSetup) { delete newProjectSetup; newProjectSetup = 0; } - if (annotateFile) { delete annotateFile; annotateFile = 0; } - if (createCert) { delete createCert; createCert = 0; } -} - void DatabaseDialogManager::closeAllDialogs() { if (changesetBrowser) changesetBrowser->close(); @@ -68,12 +60,6 @@ void DatabaseDialogManager::closeAllDial DialogManager::closeAllDialogs(); } -void DatabaseDialogManager::init(const MonotoneHandlePtr & handle) -{ - monotoneHandle = handle; - cleanup(); -} - void DatabaseDialogManager::showChangesetBrowser() { if (!changesetBrowser) @@ -181,21 +167,6 @@ void DatabaseDialogManager::showFileHist showDialog(fileHistory); } -void DatabaseDialogManager::showGenerateKeypair() -{ - if (!generateKeypair) - { - generateKeypair = new GenerateKeypair(parentWidget(), monotoneHandle); - - connect( - generateKeypair, SIGNAL(keypairGenerated(const QString &)), - this, SIGNAL(keypairGenerated(const QString &)) - ); - } - - showDialog(generateKeypair); -} - void DatabaseDialogManager::showNetsync() { if (!netsync) @@ -207,37 +178,6 @@ void DatabaseDialogManager::showNetsync( showDialog(netsync); } -void DatabaseDialogManager::showKeyManagement() -{ - if (!keyManagement) - { - keyManagement = new KeyManagement(parentWidget(), monotoneHandle); - - connect( - keyManagement, SIGNAL(generateKeypair()), - this, SLOT(showGenerateKeypair()) - ); - - connect( - keyManagement, SIGNAL(changeKeyPassword(const QString &)), - this, SLOT(showChangeKeyPassword(const QString &)) - ); - - connect( - this, SIGNAL(keyPasswordChanged(const QString &)), - keyManagement, SLOT(readKeys()) - ); - - connect( - this, SIGNAL(keypairGenerated(const QString &)), - keyManagement, SLOT(readKeys()) - ); - } - - keyManagement->readKeys(); - showDialog(keyManagement); -} - void DatabaseDialogManager::showRevisionDiff(const QString & path, const QString & base, const QString & target) ============================================================ --- src/view/dialogs/DatabaseDialogManager.h b2f547e5843fc3f29c905105d4085ee50a0c3ff5 +++ src/view/dialogs/DatabaseDialogManager.h 2b8707058b88264e418d76c9b7b6a738508f1bee @@ -24,9 +24,7 @@ #include "CheckoutRevision.h" #include "FileDiff.h" #include "FileHistory.h" -#include "GenerateKeypair.h" #include "Netsync.h" -#include "KeyManagement.h" #include "RevisionDiff.h" #include "RevisionManifest.h" #include "SelectRevision.h" @@ -41,7 +39,6 @@ public: DatabaseDialogManager(QWidget *); ~DatabaseDialogManager(); - void init(const MonotoneHandlePtr &); virtual void closeAllDialogs(); //! delegated signals @@ -49,7 +46,6 @@ signals: void revisionSelected(const QString &); void revisionCheckedOut(const MonotoneHandlePtr &); void newProjectCreated(const MonotoneHandlePtr &); - void keypairGenerated(const QString &); void certCreated(const QString &, const QString &, const QString &, const QString &); @@ -58,10 +54,8 @@ public slots: void showCheckoutRevision(); void showFileDiff(const QString & file, const QString & base, const QString & target); void showFileHistory(const QString & file, const QString & startRevision); - void showGenerateKeypair(); void showNetsync(); void showNewProjectSetup(); - void showKeyManagement(); void showRevisionDiff(const QString & path, const QString & base, const QString & target); void showRevisionManifest(const QString & revision); void showSelectRevision(); @@ -74,20 +68,13 @@ protected: CheckoutRevision * checkoutRevision; FileDiff * fileDiff; FileHistory * fileHistory; - GenerateKeypair * generateKeypair; Netsync * netsync; - KeyManagement * keyManagement; RevisionDiff * revisionDiff; RevisionManifest * revisionManifest; SelectRevision * selectRevision; NewProjectSetup * newProjectSetup; AnnotateFile * annotateFile; CreateCert * createCert; - - MonotoneHandlePtr monotoneHandle; - -private: - void cleanup(); }; #endif ============================================================ --- src/view/dialogs/WorkspaceDialogManager.cpp 55b57c63cd0f05cbca8aa31840405f4491c4c591 +++ src/view/dialogs/WorkspaceDialogManager.cpp 1cf37e8716296b4b0588e2fc4a9243aaaaf22747 @@ -26,16 +26,11 @@ WorkspaceDialogManager::~WorkspaceDialog WorkspaceDialogManager::~WorkspaceDialogManager() { - cleanup(); + if (commitRevision) delete commitRevision; + if (unaccountedRenames) delete unaccountedRenames; + if (updateWorkspace) delete updateWorkspace; } -void WorkspaceDialogManager::cleanup() -{ - if (commitRevision) { delete commitRevision; commitRevision = 0; } - if (unaccountedRenames) { delete unaccountedRenames; unaccountedRenames = 0; } - if (updateWorkspace) { delete updateWorkspace; updateWorkspace = 0; } -} - void WorkspaceDialogManager::closeAllDialogs() { if (commitRevision) commitRevision->close(); ============================================================ --- src/view/dialogs/WorkspaceDialogManager.h e703ce7af0b396cdca23e36e848bb348bdabfd42 +++ src/view/dialogs/WorkspaceDialogManager.h 5fa1b3ab7ff31d3c0371082cda16f70c2105c841 @@ -56,9 +56,6 @@ protected: CommitRevision * commitRevision; UnaccountedRenames * unaccountedRenames; UpdateWorkspace * updateWorkspace; - -private: - void cleanup(); }; #endif ============================================================ --- res/forms/dialogs/open_prompt.ui 0392f308c05e7c42374533914ca2f232e160d51a +++ res/forms/dialogs/open_prompt.ui 6dba9becb751fb708786c734ff1976a89192123a @@ -12,7 +12,7 @@ 0 0 - 560 + 563 605 @@ -338,6 +338,26 @@ If you previously checked out a workspac + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Key management + + + + Preferences ============================================================ --- src/view/dialogs/OpenPrompt.cpp 683e45c734ff1c2bc6c0bc10537bc545a2c0e0da +++ src/view/dialogs/OpenPrompt.cpp ed5bf1ad8f23e68fc35ec4d67bbb188b2a95613b @@ -18,7 +18,9 @@ #include "OpenPrompt.h" #include "Settings.h" +#include "MonotoneUtil.h" +#include #include class GuitoneStandalone; @@ -91,11 +93,18 @@ OpenPrompt::OpenPrompt(QWidget * parent) ); connect( + btnKeys, SIGNAL(clicked()), + dialogManager, SLOT(showKeyManagement()) + ); + + connect( qApp, SIGNAL(updateRecentLists()), this, SLOT(updateRecentLists()) ); updateRecentLists(); + + QTimer::singleShot(0, this, SLOT(checkForPrivateKeys())); } OpenPrompt::~OpenPrompt() @@ -238,3 +247,49 @@ void OpenPrompt::updateRecentLists() ); } +void OpenPrompt::checkForPrivateKeys() +{ + if (!Settings::getBool("PromptWhenPrivateKeyIsMissing")) + { + return; + } + + QMap privateKeys = + MonotoneUtil::getPrivateKeyMap(MonotoneHandle::create()); + + if (privateKeys.size() == 0) + { + QMessageBox msgBox(this); + msgBox.setWindowFlags(Qt::Sheet); + msgBox.setIcon(QMessageBox::Question); + msgBox.setText("No private key found"); + msgBox.setInformativeText( + "You do not have a monotone private key yet. A private key " + "is needed to make commits and authenticate yourself towards " + "other nodes.\nDo you want to create a private key now?"); + QPushButton * yesBtn = msgBox.addButton(tr("Yes"), + QMessageBox::ActionRole); + QPushButton * laterBtn = msgBox.addButton(tr("No, later"), + QMessageBox::ActionRole); + QPushButton * neverBtn = msgBox.addButton(tr("No, never"), + QMessageBox::ActionRole); + + msgBox.exec(); + + if (msgBox.clickedButton() == yesBtn) + { + dialogManager->showGenerateKeypair(); + } + else + if (msgBox.clickedButton() == neverBtn) + { + Settings::setBool("PromptWhenPrivateKeyIsMissing", false); + } + else + if (msgBox.clickedButton() == laterBtn) + { + return; + } + } +} + ============================================================ --- src/view/dialogs/OpenPrompt.h 99d4ca96d8642c7f5e6c7eea897b1c6f12eaa064 +++ src/view/dialogs/OpenPrompt.h 9a921d8e398b7bc588d6c181be230cab0ead553a @@ -46,6 +46,7 @@ private slots: void recentDatabasesChanged(int); void recentWorkspacesChanged(int); void recentServersChanged(int); + void checkForPrivateKeys(); private: DialogManager * dialogManager; ============================================================ --- src/view/dialogs/ServerDialogManager.cpp 15db0849be6feaa2f91d82093a70a2d8399d060c +++ src/view/dialogs/ServerDialogManager.cpp 2e6ba55e01475839f23dd7c73218ade7c5bbb27e @@ -32,14 +32,14 @@ void ServerDialogManager::cleanup() void ServerDialogManager::cleanup() { - if (changesetBrowser) { delete changesetBrowser; changesetBrowser = 0; } - if (fileDiff) { delete fileDiff; fileDiff = 0; } - if (fileHistory) { delete fileHistory; fileHistory = 0; } - if (netsync) { delete netsync; netsync = 0; } - if (revisionDiff) { delete revisionDiff; revisionDiff = 0; } - if (revisionManifest) { delete revisionManifest; revisionManifest = 0; } - if (selectRevision) { delete selectRevision; selectRevision = 0; } - if (createCert) { delete createCert; createCert = 0; } + if (changesetBrowser) delete changesetBrowser; + if (fileDiff) delete fileDiff; + if (fileHistory) delete fileHistory; + if (netsync) delete netsync; + if (revisionDiff) delete revisionDiff; + if (revisionManifest) delete revisionManifest; + if (selectRevision) delete selectRevision; + if (createCert) delete createCert; } void ServerDialogManager::closeAllDialogs() @@ -56,12 +56,6 @@ void ServerDialogManager::closeAllDialog DialogManager::closeAllDialogs(); } -void ServerDialogManager::init(const MonotoneHandlePtr & handle) -{ - monotoneHandle = handle; - cleanup(); -} - void ServerDialogManager::showChangesetBrowser() { if (!changesetBrowser) ============================================================ --- src/view/dialogs/ServerDialogManager.h 1e7e60248dd468ad6d2030412de33e32335a1fc9 +++ src/view/dialogs/ServerDialogManager.h d13c5ecabc71d45ef641465f2160cabdc1bd083b @@ -36,7 +36,6 @@ public: ServerDialogManager(QWidget *); ~ServerDialogManager(); - void init(const MonotoneHandlePtr &); virtual void closeAllDialogs(); //! delegated signals