Merge pull request #2211 from csoler/v0.6-BugFixing_5

Various bug fixes
This commit is contained in:
csoler 2021-01-11 20:12:01 +01:00 committed by GitHub
commit d92132d025
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 201 additions and 126 deletions

View file

@ -636,9 +636,6 @@ void GenCertDialog::genPerson()
setCursor(Qt::ArrowCursor) ;
}
// now cache the PGP password so that it's not asked again for immediately signing the key
rsNotify->cachePgpPassphrase(ui.password_input->text().toUtf8().constData()) ;
//generate a random ssl password
std::string sslPasswd = RSRandom::random_alphaNumericString(RsInit::getSslPwdLen()) ;
@ -650,7 +647,11 @@ void GenCertDialog::genPerson()
std::string err;
this->hide();//To show dialog asking password PGP Key.
std::cout << "RsAccounts::GenerateSSLCertificate" << std::endl;
bool okGen = RsAccounts::createNewAccount(PGPId, "", genLoc, "", isHiddenLoc, isAutoTor, sslPasswd, sslId, err);
// now cache the PGP password so that it's not asked again for immediately signing the key
rsNotify->cachePgpPassphrase(ui.password_input->text().toUtf8().constData()) ;
bool okGen = RsAccounts::createNewAccount(PGPId, "", genLoc, "", isHiddenLoc, isAutoTor, sslPasswd, sslId, err);
if (okGen)
{
@ -658,16 +659,23 @@ void GenCertDialog::genPerson()
RsInit::LoadPassword(sslPasswd);
if (Rshare::loadCertificate(sslId, false)) {
accept();
// Now clear the cached passphrase
rsNotify->clearPgpPassphrase();
accept();
}
}
else
{
/* Message Dialog */
QMessageBox::warning(this,
tr("Profile generation failure"),
tr("Failed to generate your new certificate, maybe PGP password is wrong!"),
QMessageBox::Ok);
reject();
}
{
// Now clear the cached passphrase
rsNotify->clearPgpPassphrase();
/* Message Dialog */
QMessageBox::warning(this,
tr("Profile generation failure"),
tr("Failed to generate your new certificate, maybe PGP password is wrong!"),
QMessageBox::Ok);
reject();
}
}

View file

@ -549,6 +549,8 @@ void IdEditDialog::createId()
std::string gpg_name = rsPeers->getGPGName(rsPeers->getGPGOwnId());
bool cancelled;
rsNotify->clearPgpPassphrase(); // just in case
if(!NotifyQt::getInstance()->askForPassword(tr("Profile password needed.").toStdString(),
gpg_name + " (" + rsPeers->getOwnId().toStdString() + ")",
false,

View file

@ -126,6 +126,7 @@ void StartDialog::loadPerson()
bool res = Rshare::loadCertificate(accountId, ui.autologin_checkbox->isChecked()) ;
rsNotify->setDisableAskPassword(false);
rsNotify->clearPgpPassphrase();
if(res)
accept();

View file

@ -740,6 +740,38 @@ void ConnectFriendWizard::accept()
{
std::cerr << "ConclusionPage::validatePage() accepting GPG key for connection." << std::endl;
if(sign)
{
std::cerr << "ConclusionPage::validatePage() signing GPG key." << std::endl;
bool prev_is_bad = false;
for(int i=0;i<3;++i)
{
std::string pgp_name = rsPeers->getGPGName(rsPeers->getGPGOwnId());
bool cancelled;
std::string pgp_password;
if(!NotifyQt::getInstance()->askForPassword(tr("Profile password needed.").toStdString(), pgp_name + " (" + rsPeers->getOwnId().toStdString() + ")", prev_is_bad, pgp_password,cancelled))
{
QMessageBox::critical(NULL,tr("Identity creation failed"),tr("Cannot create an identity linked to your profile without your profile password."));
return;
}
if(rsPeers->signGPGCertificate(peerDetails.gpg_id,pgp_password))
{
prev_is_bad = false;
break;
}
else
prev_is_bad = true;
}
if(prev_is_bad)
{
QMessageBox::warning(nullptr,tr("Signature failed"),tr("Signature failed. Uncheck the key signature box if you want to make friends without signing the friends' certificate"));
return;
}
}
if(peerDetails.skip_pgp_signature_validation)
rsPeers->addSslOnlyFriend(peerDetails.id, peerDetails.gpg_id,peerDetails);
else
@ -757,12 +789,7 @@ void ConnectFriendWizard::accept()
}
}
if(sign)
{
std::cerr << "ConclusionPage::validatePage() signing GPG key." << std::endl;
rsPeers->signGPGCertificate(peerDetails.gpg_id); //bye default sign set accept_connection to true;
rsPeers->setServicePermissionFlags(peerDetails.gpg_id,serviceFlags()) ;
}
if (!groupId.isEmpty())
rsPeers->assignPeerToGroup(RsNodeGroupId(groupId.toStdString()), peerDetails.gpg_id, true);

View file

@ -87,8 +87,6 @@ PGPKeyDialog::PGPKeyDialog(const RsPeerId& id, const RsPgpId &pgp_id, QWidget *p
connect(ui.make_friend_button, SIGNAL(clicked()), this, SLOT(makeFriend()));
connect(ui.denyFriendButton, SIGNAL(clicked()), this, SLOT(denyFriend()));
connect(ui.signKeyButton, SIGNAL(clicked()), this, SLOT(signGPGKey()));
//connect(ui.trusthelpButton, SIGNAL(clicked()), this, SLOT(showHelpDialog()));
//connect(ui._shouldAddSignatures_CB, SIGNAL(toggled(bool)), this, SLOT(loadInvitePage()));
connect(ui._shouldAddSignatures_CB_2, SIGNAL(toggled(bool)), this, SLOT(loadKeyPage()));
//ui.avatar->setFrameType(AvatarWidget::NORMAL_FRAME);
@ -182,7 +180,6 @@ void PGPKeyDialog::load()
if (detail.gpg_id == rsPeers->getGPGOwnId())
{
ui.make_friend_button->hide();
ui.signGPGKeyCheckBox->hide();
ui.signKeyButton->hide();
ui.denyFriendButton->hide();
@ -199,62 +196,49 @@ void PGPKeyDialog::load()
ui.trustlevel_CB->show();
ui.is_signing_me->show();
ui.signersLabel->setText(tr("This key is signed by :")+" ");
ui.signKeyButton->setEnabled(!detail.ownsign);
if (detail.accept_connection)
{
ui.make_friend_button->hide();
ui.denyFriendButton->show();
ui.signGPGKeyCheckBox->hide();
//connection already accepted, propose to sign gpg key
if (!detail.ownsign) {
ui.signKeyButton->show();
} else {
ui.signKeyButton->hide();
}
}
else
{
ui.make_friend_button->show();
ui.denyFriendButton->hide();
ui.signKeyButton->hide();
if (!detail.ownsign) {
ui.signGPGKeyCheckBox->show();
ui.signGPGKeyCheckBox->setChecked(false);
} else {
ui.signGPGKeyCheckBox->hide();
}
}
//web of trust
ui.trustlevel_CB->setCurrentIndex(detail.trustLvl) ;
ui.trustlevel_CB->setCurrentIndex(detail.trustLvl) ;
QString truststring = "<p>" ;
truststring += tr("The trust level is a way to express your own trust in this key. It is not used by the software nor shared, but can be useful to you in order to remember good/bad keys.") ;
truststring += "</p>" ;
truststring += "<p>" ;
QString truststring = "<p>" ;
truststring += tr("The trust level is a way to express your own trust in this key. It is not used by the software nor shared, but can be useful to you in order to remember good/bad keys.") ;
truststring += "</p>" ;
truststring += "<p>" ;
switch(detail.trustLvl)
{
case RS_TRUST_LVL_ULTIMATE:
//trust is ultimate, it means it's one of our own keys
truststring += tr("Your trust in this peer is ultimate");
break ;
case RS_TRUST_LVL_FULL:
truststring += tr("Your trust in this peer is full.");
break ;
case RS_TRUST_LVL_MARGINAL:
truststring += tr("Your trust in this peer is marginal.");
break ;
case RS_TRUST_LVL_NEVER:
truststring += tr("Your trust in this peer is none.");
break ;
{
case RS_TRUST_LVL_ULTIMATE:
//trust is ultimate, it means it's one of our own keys
truststring += tr("Your trust in this peer is ultimate");
break ;
case RS_TRUST_LVL_FULL:
truststring += tr("Your trust in this peer is full.");
break ;
case RS_TRUST_LVL_MARGINAL:
truststring += tr("Your trust in this peer is marginal.");
break ;
case RS_TRUST_LVL_NEVER:
truststring += tr("Your trust in this peer is none.");
break ;
default:
truststring += tr("You haven't set a trust level for this key.");
break ;
}
truststring += "</p>" ;
default:
truststring += tr("You haven't set a trust level for this key.");
break ;
}
truststring += "</p>" ;
ui.trustlevel_CB->setToolTip(truststring) ;
if (detail.hasSignedMe) {
@ -358,12 +342,7 @@ void PGPKeyDialog::applyDialog()
void PGPKeyDialog::makeFriend()
{
if (ui.signGPGKeyCheckBox->isChecked()) {
rsPeers->signGPGCertificate(pgpId);
}
rsPeers->addFriend(peerId, pgpId);
// setServiceFlags() ;
loadAll();
emit configChanged();
@ -379,12 +358,21 @@ void PGPKeyDialog::denyFriend()
void PGPKeyDialog::signGPGKey()
{
if (!rsPeers->signGPGCertificate(pgpId)) {
QMessageBox::warning ( NULL,
tr("Signature Failure"),
tr("Maybe password is wrong"),
QMessageBox::Ok);
std::string gpg_name = rsPeers->getGPGName(rsPeers->getGPGOwnId());
bool cancelled;
std::string gpg_password;
if(!NotifyQt::getInstance()->askForPassword(tr("Profile password needed.").toStdString(), gpg_name + " (" + rsPeers->getOwnId().toStdString() + ")", false, gpg_password,cancelled))
{
QMessageBox::critical(NULL,tr("Identity creation failed"),tr("Cannot create an identity linked to your profile without your profile password."));
return;
}
rsNotify->clearPgpPassphrase(); // just in case
if(!rsPeers->signGPGCertificate(pgpId,gpg_password))
QMessageBox::warning ( NULL, tr("Signature Failure"), tr("Check the password!"), QMessageBox::Ok);
loadAll();
emit configChanged();

View file

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>600</width>
<height>401</height>
<height>452</height>
</rect>
</property>
<property name="windowTitle">
@ -205,16 +205,6 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="signGPGKeyCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Signing a friend's key is a way to express your trust into this friend, to your other friends. It helps them to decide whether to allow connections from that key based on your own trust. Signing a key is absolutely optional and cannot be undone, so do it wisely.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Sign PGP key</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">

View file

@ -98,6 +98,7 @@ public:
// Helper functions
void clear() ;
bool getFileData(const QModelIndex& i, ChannelPostFileInfo &fmpe) const;
// AbstractItemModel functions.
@ -156,7 +157,6 @@ private:
quintptr getParentRow(quintptr ref,int& row) const;
quintptr getChildRef(quintptr ref, int index) const;
int getChildrenCount(quintptr ref) const;
bool getFileData(const QModelIndex& i, ChannelPostFileInfo &fmpe) const;
static bool convertTabEntryToRefPointer(uint32_t entry, quintptr& ref);
static bool convertRefPointerToTabEntry(quintptr ref,uint32_t& entry);

View file

@ -406,6 +406,9 @@ GxsChannelPostsWidgetWithModel::GxsChannelPostsWidgetWithModel(const RsGxsGroupI
connect(ui->channelPostFiles_TV->header(),SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(sortColumnPostFiles(int,Qt::SortOrder)));
connect(ui->channelFiles_TV->header(),SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(sortColumnFiles(int,Qt::SortOrder)));
connect(ui->channelPostFiles_TV,SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showChannelFilesContextMenu(QPoint)));
connect(ui->channelFiles_TV,SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showChannelFilesContextMenu(QPoint)));
ui->channelFiles_TV->setModel(mChannelFilesModel = new RsGxsChannelPostFilesModel());
ui->channelFiles_TV->setItemDelegate(mFilesDelegate = new ChannelPostFilesDelegate(this));
ui->channelFiles_TV->setPlaceholderText(tr("No files in the channel, or no channel selected"));
@ -1243,6 +1246,35 @@ void GxsChannelPostsWidgetWithModel::insertChannelDetails(const RsGxsChannelGrou
showPostDetails();
}
void GxsChannelPostsWidgetWithModel::showChannelFilesContextMenu(QPoint p)
{
QMenu contextMnu(this) ;
QAction *action = contextMnu.addAction(QIcon(), tr("Copy Retroshare link"), this, SLOT(copyChannelFilesLink()));
action->setData(QVariant::fromValue(sender()));
contextMnu.exec(QCursor::pos());
}
void GxsChannelPostsWidgetWithModel::copyChannelFilesLink()
{
// Block the popup if no results available
QAction *action = dynamic_cast<QAction*>(sender());
RSTreeView *tree = dynamic_cast<RSTreeView*>(action->data().value<QWidget*>());
QModelIndexList sel = tree->selectionModel()->selection().indexes();
if(sel.empty())
return;
ChannelPostFileInfo file;
if(!static_cast<RsGxsChannelPostFilesModel*>(tree->model())->getFileData(sel.front(),file))
return;
RetroShareLink link = RetroShareLink::createFile(QString::fromUtf8(file.mName.c_str()), file.mSize, QString::fromStdString(file.mHash.toStdString()));
RSLinkClipboard::copyLinks(QList<RetroShareLink>{ link });
}
void GxsChannelPostsWidgetWithModel::setSubscribeButtonText(const RsGxsGroupId& group_id,uint32_t flags, uint32_t mPop)
{
if(IS_GROUP_SUBSCRIBED(flags))

View file

@ -163,6 +163,8 @@ public slots:
void sortColumnFiles(int col,Qt::SortOrder so);
void sortColumnPostFiles(int col,Qt::SortOrder so);
void updateCommentsCount(int n);
void showChannelFilesContextMenu(QPoint p);
void copyChannelFilesLink();
private:
void processSettings(bool load);

View file

@ -181,7 +181,7 @@
<item>
<widget class="QTabWidget" name="channel_TW">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="tab_3">
<attribute name="title">
@ -552,6 +552,9 @@ p, li { white-space: pre-wrap; }
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="RSTreeView" name="channelPostFiles_TV">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::CurrentChanged|QAbstractItemView::SelectedClicked</set>
</property>
@ -602,6 +605,9 @@ p, li { white-space: pre-wrap; }
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="RSTreeView" name="channelFiles_TV">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::CurrentChanged|QAbstractItemView::SelectedClicked</set>
</property>