diff --git a/libretroshare/src/rsiface/rsinit.h b/libretroshare/src/rsiface/rsinit.h index 99344f2f3..6f3c0cbe2 100644 --- a/libretroshare/src/rsiface/rsinit.h +++ b/libretroshare/src/rsiface/rsinit.h @@ -71,7 +71,7 @@ class RsInit /* Login SSL */ static bool LoadPassword(std::string id, std::string passwd) ; - /* Final Certificate load. This can be called if: + /** Final Certificate load. This can be called if: * a) InitRetroshare() returns true -> autoLoad/password Set. * b) SelectGPGAccount() && LoadPassword() */ @@ -83,6 +83,11 @@ class RsInit static std::string RsProfileConfigDirectory(); static bool setStartMinimised() ; + static int getSslPwdLen(); + static bool getAutoLogin(); + static void setAutoLogin(bool autoLogin); + static bool RsClearAutoLogin() ; + private: /* PreLogin */ @@ -98,9 +103,10 @@ class RsInit /* Auto Login */ static bool RsStoreAutoLogin() ; static bool RsTryAutoLogin() ; - static bool RsClearAutoLogin() ; + }; + #endif diff --git a/libretroshare/src/rsserver/p3face-config.cc b/libretroshare/src/rsserver/p3face-config.cc index c82bd99f0..bdab147f0 100644 --- a/libretroshare/src/rsserver/p3face-config.cc +++ b/libretroshare/src/rsserver/p3face-config.cc @@ -31,7 +31,7 @@ #include #include "pqi/authssl.h" #include "pqi/authgpg.h" - +#include "rsiface/rsinit.h" #include "util/rsdebug.h" const int p3facemsgzone = 11453; @@ -157,6 +157,8 @@ void RsServer::ConfigFinalSave() { /* force saving of transfers TODO */ //ftserver->saveFileTransferStatus(); + if(!RsInit::getAutoLogin()) + RsInit::RsClearAutoLogin(); //AuthSSL::getAuthSSL()->FinalSaveCertificates(); mConfigMgr->completeConfiguration(); @@ -164,6 +166,8 @@ void RsServer::ConfigFinalSave() void RsServer::rsGlobalShutDown() { + + ConfigFinalSave(); // save configuration before exit mConnMgr->shutdown(); /* Handles UPnP */ } diff --git a/libretroshare/src/rsserver/rsinit.cc b/libretroshare/src/rsserver/rsinit.cc index ec519d829..56538823c 100644 --- a/libretroshare/src/rsserver/rsinit.cc +++ b/libretroshare/src/rsserver/rsinit.cc @@ -125,6 +125,7 @@ static const std::string configKeyDir = "keys"; static const std::string configCaFile = "cacerts.pem"; static const std::string configLogFileName = "retro.log"; static const std::string configHelpName = "retro.htm"; +static const int SSLPWD_LEN = 6; std::list RsInitConfig::accountIds; std::string RsInitConfig::preferedId; @@ -193,7 +194,7 @@ void RsInit::InitRsConfig() strcpy(RsInitConfig::inet, "127.0.0.1"); strcpy(RsInitConfig::logfname, ""); - RsInitConfig::autoLogin = true; // Always on now. + RsInitConfig::autoLogin = false; // . RsInitConfig::startMinimised = false; RsInitConfig::passwd = ""; RsInitConfig::havePasswd = false; @@ -503,12 +504,17 @@ int RsInit::InitRetroShare(int argcIgnored, char **argvIgnored) /* if existing user, and havePasswd .... we can skip the login prompt */ if (existingUser) { + if (RsInitConfig::havePasswd) { return 1; } + + RsInit::LoadPassword(RsInitConfig::preferedId, ""); + if (RsTryAutoLogin()) { + RsInit::setAutoLogin(true); return 1; } } @@ -1047,6 +1053,7 @@ bool RsInit::LoadPassword(std::string id, std::string inPwd) RsInitConfig::preferedId = id; RsInitConfig::configDir = RsInitConfig::basedir + RsInitConfig::dirSeperator + id; RsInitConfig::passwd = inPwd; + RsInitConfig::havePasswd = true; // Create the filename. @@ -1071,6 +1078,7 @@ bool RsInit::LoadPassword(std::string id, std::string inPwd) int RsInit::LoadCertificates(bool autoLoginNT) { + if (RsInitConfig::load_cert == "") { std::cerr << "RetroShare needs a certificate" << std::endl; @@ -1083,15 +1091,29 @@ int RsInit::LoadCertificates(bool autoLoginNT) return 0; } + RsInitConfig::autoLogin = autoLoginNT; bool ok = false; + bool have_help = false; + + // Check if help file exists + std::string help_file_name = RsInitConfig::configDir + RsInitConfig::dirSeperator + + configKeyDir + RsInitConfig::dirSeperator + "help.dta"; + FILE* helpFile = fopen(help_file_name.c_str(), "r"); + + if(helpFile != NULL){ + have_help = true; + fclose(helpFile); + } /* The SSL / SSL + PGP version requires, SSL init + PGP init. */ const char* sslPassword; sslPassword = RsInitConfig::passwd.c_str(); + + //check if password is already in memory - if ((RsInitConfig::havePasswd) && (RsInitConfig::passwd != "")) + if (((RsInitConfig::havePasswd) && (RsInitConfig::passwd != "")) && !have_help) { - std::cerr << "RetroShare have a ssl Password" << std::endl; + std::cerr << "RetroShare has a ssl Password" << std::endl; sslPassword = RsInitConfig::passwd.c_str(); std::cerr << "let's store the ssl Password into a pgp ecrypted file" << std::endl; @@ -1110,7 +1132,10 @@ int RsInit::LoadCertificates(bool autoLoginNT) gpgme_data_release (plain); fclose(sslPassphraseFile); - } else { + } else + if(!have_help) { + + //let's read the password from an encrypted file //let's check if there's a ssl_passpharese_file that we can decrypt with PGP FILE *sslPassphraseFile = fopen(RsInitConfig::ssl_passphrase_file.c_str(), "r"); @@ -1133,6 +1158,7 @@ int RsInit::LoadCertificates(bool autoLoginNT) std::cerr << "Decrypting went ok !" << std::endl; gpgme_data_write (plain, "", 1); sslPassword = gpgme_data_release_and_get_mem(plain, NULL); + std::cerr << "sslpassword: " << sslPassword << std::endl; } else { gpgme_data_release (plain); std::cerr << "Error : decrypting went wrong !" << std::endl; @@ -1143,7 +1169,19 @@ int RsInit::LoadCertificates(bool autoLoginNT) } } + + + if(have_help){ + sslPassword = RsInitConfig::passwd.c_str(); + } + else{ + RsInitConfig::passwd.insert(0, sslPassword, RsInit::getSslPwdLen()); + } + + + std::cerr << "RsInitConfig::load_key.c_str() : " << RsInitConfig::load_key.c_str() << std::endl; + if (0 < AuthSSL::getAuthSSL() -> InitAuth(RsInitConfig::load_cert.c_str(), RsInitConfig::load_key.c_str(), sslPassword)) { ok = true; @@ -1156,7 +1194,7 @@ int RsInit::LoadCertificates(bool autoLoginNT) if (ok) { - if (autoLoginNT) + if (autoLoginNT && (!have_help)) { std::cerr << "RetroShare will AutoLogin next time"; std::cerr << std::endl; @@ -1289,6 +1327,9 @@ std::string make_path_unix(std::string path) /* WINDOWS STRUCTURES FOR DPAPI */ #ifndef WINDOWS_SYS /* UNIX */ + +#include + #else /******************************** WINDOWS/UNIX SPECIFIC PART ******************/ @@ -1358,11 +1399,44 @@ extern BOOL WINAPI CryptUnprotectData( bool RsInit::RsStoreAutoLogin() { std::cerr << "RsStoreAutoLogin()" << std::endl; - /* Windows only */ + /******************************** WINDOWS/UNIX SPECIFIC PART ******************/ #ifndef WINDOWS_SYS /* UNIX */ - return false; + + /* WARNING: Autologin is inherently unsafe */ + std::string helpFileName = RsInitConfig::configDir + RsInitConfig::dirSeperator + + configKeyDir + RsInitConfig::dirSeperator + "help.dta"; + FILE* helpFile = fopen(helpFileName.c_str(), "w"); + + if(helpFile == NULL){ + std::cerr << "\nRsStoreAutoLogin(): Failed to open help file\n" << std::endl; + return false; + } + + /* encrypt help */ + + const int DAT_LEN = RsInitConfig::passwd.length(); + const int KEY_DAT_LEN = RsInitConfig::load_cert.length(); + unsigned char* key_data = (unsigned char*)RsInitConfig::load_cert.c_str(); + unsigned char* indata = (unsigned char*)RsInitConfig::passwd.c_str(); + unsigned char* outdata = new unsigned char[DAT_LEN]; + + RC4_KEY* key = new RC4_KEY; + RC4_set_key(key, KEY_DAT_LEN, key_data); + + RC4(key, DAT_LEN, indata, outdata); + + + fprintf(helpFile, "%s", outdata); + fclose(helpFile); + + delete key; + delete[] outdata; + + + return true; #else + /* store password encrypted in a file */ std::string entropy = RsInitConfig::load_cert; @@ -1415,7 +1489,7 @@ bool RsInit::RsStoreAutoLogin() /* save the data to the file */ std::string passwdfile = RsInitConfig::configDir; - passwdfile += RsInitConfig::dirSeperator; + passwdfile += RsInitConfig::dirSeperator + configKeyDir + RsInitConfig::dirSeperator; passwdfile += "help.dta"; //std::cerr << "Save to: " << passwdfile; @@ -1440,7 +1514,6 @@ bool RsInit::RsStoreAutoLogin() free(pbDataInput); free(pbDataEnt); LocalFree(DataOut.pbData); - #endif /******************************** WINDOWS/UNIX SPECIFIC PART ******************/ @@ -1451,25 +1524,55 @@ bool RsInit::RsStoreAutoLogin() bool RsInit::RsTryAutoLogin() { + std::cerr << "RsTryAutoLogin()" << std::endl; - /* Windows only */ + /******************************** WINDOWS/UNIX SPECIFIC PART ******************/ #ifndef WINDOWS_SYS /* UNIX */ - return false; -#else - /* Require a AutoLogin flag in the config to do this */ - if (!RsInitConfig::autoLogin) - { + std::string helpFileName = RsInitConfig::basedir + RsInitConfig::dirSeperator + RsInitConfig::preferedId + RsInitConfig::dirSeperator + + configKeyDir + RsInitConfig::dirSeperator + "help.dta"; + + FILE* helpFile = fopen(helpFileName.c_str(), "r"); + + if(helpFile == NULL){ + std::cerr << "\nFailed to open help file\n" << std::endl; return false; } + /* decrypt help */ + + const int DAT_LEN = RsInit::getSslPwdLen(); + const int KEY_DAT_LEN = RsInitConfig::load_cert.length(); + unsigned char* key_data = (unsigned char*)RsInitConfig::load_cert.c_str(); + unsigned char* indata = new unsigned char[DAT_LEN]; + unsigned char* outdata = new unsigned char[DAT_LEN]; + + fscanf(helpFile, "%s", indata); + + RC4_KEY* key = new RC4_KEY; + RC4_set_key(key, KEY_DAT_LEN, key_data); + + RC4(key, DAT_LEN, indata, outdata); + + RsInitConfig::passwd.clear(); + RsInitConfig::passwd.insert(0, (char*)outdata, DAT_LEN); + + + fclose(helpFile); + + delete[] indata; + delete[] outdata; + delete key; + return true; +#else + /* try to load from file */ std::string entropy = RsInitConfig::load_cert; /* get the data out */ /* open the data to the file */ std::string passwdfile = RsInitConfig::configDir; - passwdfile += RsInitConfig::dirSeperator; + passwdfile += RsInitConfig::dirSeperator + configKeyDir + RsInitConfig::dirSeperator; passwdfile += "help.dta"; DATA_BLOB DataIn; @@ -1575,12 +1678,8 @@ bool RsInit::RsTryAutoLogin() bool RsInit::RsClearAutoLogin() { -/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ -#ifndef WINDOWS_SYS /* UNIX */ - return false; -#else std::string passwdfile = RsInitConfig::configDir; - passwdfile += RsInitConfig::dirSeperator; + passwdfile += RsInitConfig::dirSeperator + configKeyDir + RsInitConfig::dirSeperator; passwdfile += "help.dta"; FILE *fp = fopen(passwdfile.c_str(), "wb"); @@ -1588,15 +1687,18 @@ bool RsInit::RsClearAutoLogin() { fwrite(" ", 1, 1, fp); fclose(fp); + bool removed = remove(passwdfile.c_str()); - std::cerr << "AutoLogin Data cleared! "; + if(removed != 0) + std::cerr << "RsClearAutoLogin(): Failed to Removed help file" << std::endl; + + std::cerr << "AutoLogin Data cleared "; std::cerr << std::endl; return true; } + return false; -#endif -/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ - return false; + } @@ -1631,6 +1733,17 @@ bool RsInit::setStartMinimised() return RsInitConfig::startMinimised; } +int RsInit::getSslPwdLen(){ + return SSLPWD_LEN; +} + +bool RsInit::getAutoLogin(){ + return RsInitConfig::autoLogin; +} + +void RsInit::setAutoLogin(bool autoLogin){ + RsInitConfig::autoLogin = autoLogin; +} /* * diff --git a/retroshare-gui/src/gui/GenCertDialog.cpp b/retroshare-gui/src/gui/GenCertDialog.cpp index 67a98fa26..fc0e187b2 100644 --- a/retroshare-gui/src/gui/GenCertDialog.cpp +++ b/retroshare-gui/src/gui/GenCertDialog.cpp @@ -210,7 +210,9 @@ void GenCertDialog::genPerson() std::cerr << " generating sslPasswd." << std::endl; qsrand(time(NULL)); std::string sslPasswd = ""; - for( int i = 0 ; i < 6 ; ++i ) + const int PWD_LEN = RsInit::getSslPwdLen(); + + for( int i = 0 ; i < PWD_LEN ; ++i ) { int iNumber; iNumber = qrand()%25 + 65; diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 2f32c6290..1e414b440 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -401,7 +401,7 @@ QAction* MainWindow::createPageAction(QIcon img, QString text, QActionGroup *gro { QAction *action = new QAction(img, text, group); action->setCheckable(true); - action->setFont(FONT); +// action->setFont(FONT); return action; } @@ -409,7 +409,7 @@ QAction* MainWindow::createPageAction(QIcon img, QString text, QActionGroup *gro * the specified slot (if given). */ void MainWindow::addAction(QAction *action, const char *slot) { - action->setFont(FONT); +// action->setFont(FONT); ui.toolBar->addAction(action); connect(action, SIGNAL(triggered()), this, slot); } diff --git a/retroshare-gui/src/gui/SharedFilesDialog.ui b/retroshare-gui/src/gui/SharedFilesDialog.ui index fa04dc45f..c04ed77d4 100644 --- a/retroshare-gui/src/gui/SharedFilesDialog.ui +++ b/retroshare-gui/src/gui/SharedFilesDialog.ui @@ -553,7 +553,7 @@ border: 1px solid #CCCCCC;} 16 - + diff --git a/retroshare-gui/src/gui/StartDialog.cpp b/retroshare-gui/src/gui/StartDialog.cpp index ba2956184..2872a3ce2 100644 --- a/retroshare-gui/src/gui/StartDialog.cpp +++ b/retroshare-gui/src/gui/StartDialog.cpp @@ -55,7 +55,9 @@ StartDialog::StartDialog(QWidget *parent, Qt::WFlags flags) ui.loadButton->setFocus(); + connect(ui.loadButton, SIGNAL(clicked()), this, SLOT(loadPerson())); + connect(ui.autologin_checkbox, SIGNAL(clicked()), this, SLOT(notSecureWarning())); /* load the Certificate File name */ std::string userName; @@ -154,7 +156,8 @@ void StartDialog::loadPerson() void StartDialog::loadCertificates() { /* Final stage of loading */ - if (RsInit::LoadCertificates(false)) + + if (RsInit::LoadCertificates(ui.autologin_checkbox->isChecked())) { close(); } @@ -168,13 +171,15 @@ void StartDialog::loadCertificates() } } + + void StartDialog::on_labelProfile_linkActivated(QString link) { //static GenCertDialog *gencertdialog = new GenCertDialog(); //gencertdialog->show(); QMessageBox::StandardButton sb = QMessageBox::question ( NULL, - tr("Create a New Profil"), + tr("Create a New Profile"), tr("This will generate a new Profile\n Are you sure you want to continue"), (QMessageBox::Ok | QMessageBox::No)); @@ -200,3 +205,15 @@ LogoBar & StartDialog::getLogoBar() const { return *_rsLogoBar; } +void StartDialog::notSecureWarning() { + + /* some error msg */ + if(ui.autologin_checkbox->isChecked()){ + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + tr("Insecure"), + tr("Auto Login is not Secure: Password stored on disk"), + QMessageBox::Ok); + } + + return; +} diff --git a/retroshare-gui/src/gui/StartDialog.h b/retroshare-gui/src/gui/StartDialog.h index d7e7c8458..b61ba49bb 100644 --- a/retroshare-gui/src/gui/StartDialog.h +++ b/retroshare-gui/src/gui/StartDialog.h @@ -60,6 +60,11 @@ private slots: void closeinfodlg(); void loadPerson(); + + /** + * Warns the user that autologin is not secure + */ + void notSecureWarning(); void on_labelProfile_linkActivated(QString link); void on_labelInfo_linkActivated(QString link); diff --git a/retroshare-gui/src/gui/StartDialog.ui b/retroshare-gui/src/gui/StartDialog.ui index ebcebf0f9..bf7b3b96a 100644 --- a/retroshare-gui/src/gui/StartDialog.ui +++ b/retroshare-gui/src/gui/StartDialog.ui @@ -7,7 +7,7 @@ 0 0 291 - 403 + 433 @@ -435,7 +435,7 @@ RetroShare - + :/images/rstray3.png:/images/rstray3.png @@ -498,7 +498,7 @@ border-image: url(:/images/avatar_background.png); - + :/images/user/personal64.png:/images/user/personal64.png @@ -581,6 +581,44 @@ p, li { white-space: pre-wrap; } + + + + + 16 + 65 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="Info"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">Info...</span></a></p></body></html> + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="Create new Profile..."><span style=" text-decoration: underline; color:#0000ff;">Create new Profile...</span></a></p></body></html> + + + @@ -630,86 +668,47 @@ p, li { white-space: pre-wrap; } - - - - - 16 - 65 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="Create new Profile..."><span style=" text-decoration: underline; color:#0000ff;">Create new Profile...</span></a></p></body></html> - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="Info"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">Info...</span></a></p></body></html> - - - - + + + true + - - - - - + + Name (GPG Id) - location: + + + + + + + Remember Password + + + false + + + - - - - Qt::Vertical - - - - 20 - 40 - - - - - loadName loadButton toolButton - + diff --git a/retroshare-gui/src/gui/settings/GeneralPage.cpp b/retroshare-gui/src/gui/settings/GeneralPage.cpp index 92e816d72..b65063a05 100755 --- a/retroshare-gui/src/gui/settings/GeneralPage.cpp +++ b/retroshare-gui/src/gui/settings/GeneralPage.cpp @@ -19,7 +19,9 @@ * Boston, MA 02110-1301, USA. ****************************************************************/ -#include "rshare.h" +#include +#include +#include #include "GeneralPage.h" #include #include @@ -34,12 +36,16 @@ GeneralPage::GeneralPage(QWidget * parent, Qt::WFlags flags) /* Create RshareSettings object */ _settings = new RshareSettings(); + connect(ui.autoLogin, SIGNAL(clicked()), this, SLOT(setAutoLogin())); /* Hide platform specific features */ #ifndef Q_WS_WIN ui.chkRunRetroshareAtSystemStartup->setVisible(false); #endif + + ui.autoLogin->setChecked(RsInit::getAutoLogin()); + } /** Destructor */ @@ -103,3 +109,7 @@ GeneralPage::toggleShowOnStartup(bool checked) //RshareSettings _settings; _settings->setShowMainWindowAtStart(checked); } + +void GeneralPage::setAutoLogin(){ + RsInit::setAutoLogin(ui.autoLogin->isChecked()); +} diff --git a/retroshare-gui/src/gui/settings/GeneralPage.h b/retroshare-gui/src/gui/settings/GeneralPage.h index 7cc6868a1..a95ef8e4a 100755 --- a/retroshare-gui/src/gui/settings/GeneralPage.h +++ b/retroshare-gui/src/gui/settings/GeneralPage.h @@ -28,6 +28,7 @@ #include #include "rsharesettings.h" +#include "rsiface/rsiface.h" #include "configpage.h" #include "ui_GeneralPage.h" @@ -57,6 +58,11 @@ private slots: /** Called when the "show on startup" checkbox is toggled. */ void toggleShowOnStartup(bool checked); + /** + * + */ + void setAutoLogin(); + private: /** A RetroShare Settings object used for saving/loading settings */ RshareSettings *_settings; diff --git a/retroshare-gui/src/gui/settings/GeneralPage.ui b/retroshare-gui/src/gui/settings/GeneralPage.ui index c056c6838..2c1c9054e 100755 --- a/retroshare-gui/src/gui/settings/GeneralPage.ui +++ b/retroshare-gui/src/gui/settings/GeneralPage.ui @@ -555,6 +555,13 @@ + + + + Auto Login + + + diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp index 6e52ea129..22ec4f791 100644 --- a/retroshare-gui/src/main.cpp +++ b/retroshare-gui/src/main.cpp @@ -116,8 +116,18 @@ int main(int argc, char *argv[]) } else { - /* don't save auto login details */ - RsInit::LoadCertificates(false); + + std::string preferredId, gpgId, gpgName, gpgEmail, sslName; + RsInit::getPreferedAccountId(preferredId); + + if (RsInit::getAccountDetails(preferredId, + gpgId, gpgName, gpgEmail, sslName)) + { + RsInit::SelectGPGAccount(gpgId); + } + + // true: note auto-login is active + RsInit::LoadCertificates(true); } rsicontrol->StartupRetroShare();