From 777a73e52812cede31ca69da756f1848fe9e9f6e Mon Sep 17 00:00:00 2001 From: csoler Date: Fri, 3 Feb 2017 12:48:51 +0100 Subject: [PATCH 01/88] added GUI for editing forum messages --- .../src/gui/gxsforums/CreateGxsForumMsg.cpp | 15 +-- .../src/gui/gxsforums/CreateGxsForumMsg.h | 12 +- .../gui/gxsforums/GxsForumThreadWidget.cpp | 115 ++++++++++++++++-- .../src/gui/gxsforums/GxsForumThreadWidget.h | 9 +- 4 files changed, 127 insertions(+), 24 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index f73aeef91..6e8954272 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -49,8 +49,8 @@ //#define ENABLE_GENERATE /** Constructor */ -CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId) -: QDialog(NULL, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint), mForumId(fId), mParentId(pId) +CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId,const RsGxsMessageId& mOId) +: QDialog(NULL, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint), mForumId(fId), mParentId(pId), mOrigMsgId(mOId) { /* Invoke the Qt Designer generated object setup routine */ ui.setupUi(this); @@ -75,7 +75,7 @@ CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessage mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_PARENTMSG, ui.forumSubject); mStateHelper->addClear(CREATEGXSFORUMMSG_PARENTMSG, ui.forumName); - QString text = pId.isNull() ? tr("Start New Thread") : tr("Post Forum Message"); + QString text = mOId.isNull()?(pId.isNull() ? tr("Start New Thread") : tr("Post Forum Message")):tr("Edit Message"); setWindowTitle(text); ui.headerFrame->setHeaderImage(QPixmap(":/images/konversation64.png")); @@ -103,7 +103,7 @@ CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessage mParentMsgLoaded = false; mForumMetaLoaded = false; - mForumCircleLoaded = false; + mForumCircleLoaded = false; newMsg(); @@ -285,6 +285,7 @@ void CreateGxsForumMsg::createMsg() RsGxsForumMsg msg; msg.mMeta.mGroupId = mForumId; msg.mMeta.mParentId = mParentId; + msg.mMeta.mOrigMsgId = mOrigMsgId; msg.mMeta.mMsgId.clear() ; if (mParentMsgLoaded) { msg.mMeta.mThreadId = mParentMsg.mMeta.mThreadId; @@ -376,9 +377,9 @@ void CreateGxsForumMsg::reject() { if (ui.forumMessage->document()->isModified()) { QMessageBox::StandardButton ret; - ret = QMessageBox::warning(this, tr("Forum Message"), - tr("Forum Message has not been Sent.\n" - "Do you want to reject this message?"), + ret = QMessageBox::warning(this, tr("Cancel Forum Message"), + tr("Forum Message has not been sent yet!\n" + "Please confirm that you want to discard this message?"), QMessageBox::Yes | QMessageBox::No); switch (ret) { case QMessageBox::Yes: diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h index ae06b0b0c..f3be33275 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h @@ -36,7 +36,7 @@ class CreateGxsForumMsg : public QDialog, public TokenResponse Q_OBJECT public: - CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId); + CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId, const RsGxsMessageId &moId); ~CreateGxsForumMsg(); void newMsg(); /* cleanup */ @@ -64,15 +64,17 @@ private: void loadForumCircleInfo(const uint32_t &token); RsGxsGroupId mForumId; - RsGxsCircleId mCircleId ; - RsGxsMessageId mParentId; + RsGxsCircleId mCircleId ; + RsGxsMessageId mParentId; + RsGxsMessageId mOrigMsgId; bool mParentMsgLoaded; bool mForumMetaLoaded; - bool mForumCircleLoaded ; + bool mForumCircleLoaded ; + RsGxsForumMsg mParentMsg; RsGroupMetaData mForumMeta; - RsGxsCircleGroup mForumCircleData ; + RsGxsCircleGroup mForumCircleData ; TokenQueue *mForumQueue; TokenQueue *mCirclesQueue; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index dff2f5546..73453ba7b 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -160,6 +160,7 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget mTokenTypeNegativeAuthor = nextTokenType(); mTokenTypeNeutralAuthor = nextTokenType(); mTokenTypePositiveAuthor = nextTokenType(); + mTokenTypeEditForumMessage = nextTokenType(); setUpdateWhenInvisible(true); @@ -478,11 +479,14 @@ void GxsForumThreadWidget::threadListCustomPopupMenu(QPoint /*point*/) QMenu contextMnu(this); + QAction *editAct = new QAction(QIcon(IMAGE_MESSAGEREPLY), tr("Edit"), &contextMnu); + connect(editAct, SIGNAL(triggered()), this, SLOT(editforummessage())); + QAction *replyAct = new QAction(QIcon(IMAGE_MESSAGEREPLY), tr("Reply"), &contextMnu); connect(replyAct, SIGNAL(triggered()), this, SLOT(replytoforummessage())); QAction *replyauthorAct = new QAction(QIcon(IMAGE_MESSAGEREPLY), tr("Reply to author with private message"), &contextMnu); - connect(replyauthorAct, SIGNAL(triggered()), this, SLOT(replytomessage())); + connect(replyauthorAct, SIGNAL(triggered()), this, SLOT(reply_with_private_message())); QAction *flagaspositiveAct = new QAction(QIcon(IMAGE_POSITIVE_OPINION), tr("Give positive opinion"), &contextMnu); flagaspositiveAct->setToolTip(tr("This will block/hide messages from this person, and notify friend nodes.")) ; @@ -567,6 +571,18 @@ void GxsForumThreadWidget::threadListCustomPopupMenu(QPoint /*point*/) replyauthorAct->setDisabled (true); } + QList selectedItems = ui->threadTreeWidget->selectedItems(); + + if(selectedItems.size() == 1) + { + QTreeWidgetItem *item = *selectedItems.begin(); + GxsIdRSTreeWidgetItem *gxsIdItem = dynamic_cast(item); + + RsGxsId author_id; + if(gxsIdItem && gxsIdItem->getId(author_id) && rsIdentity->isOwnId(author_id)) + contextMnu.addAction(editAct); + } + contextMnu.addAction(replyAct); contextMnu.addAction(newthreadAct); QAction* action = contextMnu.addAction(QIcon(IMAGE_COPYLINK), tr("Copy RetroShare Link"), this, SLOT(copyMessageLink())); @@ -580,8 +596,6 @@ void GxsForumThreadWidget::threadListCustomPopupMenu(QPoint /*point*/) contextMnu.addAction(expandAll); contextMnu.addAction(collapseAll); - QList selectedItems = ui->threadTreeWidget->selectedItems(); - if(selectedItems.size() == 1) { QTreeWidgetItem *item = *selectedItems.begin(); @@ -1952,7 +1966,7 @@ void GxsForumThreadWidget::createmessage() return; } - CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), mThreadId); + CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), mThreadId,RsGxsMessageId()); cfm->show(); /* window will destroy itself! */ @@ -1965,7 +1979,7 @@ void GxsForumThreadWidget::createthread() return; } - CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), RsGxsMessageId()); + CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), RsGxsMessageId(),RsGxsMessageId()); cfm->show(); /* window will destroy itself! */ @@ -2019,7 +2033,7 @@ void GxsForumThreadWidget::flagperson() mTokenQueue->requestMsgInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, msgIds, token_type); } -void GxsForumThreadWidget::replytomessage() +void GxsForumThreadWidget::reply_with_private_message() { if (groupId().isNull() || mThreadId.isNull()) { QMessageBox::information(this, tr("RetroShare"),tr("You cant reply to a non-existant Message")); @@ -2028,9 +2042,19 @@ void GxsForumThreadWidget::replytomessage() // Get Message ... then complete replyMessageData(). RsGxsGrpMsgIdPair postId = std::make_pair(groupId(), mThreadId); - requestMsgData_ReplyMessage(postId); + requestMsgData_ReplyWithPrivateMessage(postId); } +void GxsForumThreadWidget::editforummessage() +{ + if (groupId().isNull() || mThreadId.isNull()) { + QMessageBox::information(this, tr("RetroShare"),tr("You cant reply to a non-existant Message")); + return; + } + // Get Message ... then complete replyMessageData(). + RsGxsGrpMsgIdPair postId = std::make_pair(groupId(), mThreadId); + requestMsgData_EditForumMessage(postId); +} void GxsForumThreadWidget::replytoforummessage() { if (groupId().isNull() || mThreadId.isNull()) { @@ -2083,6 +2107,29 @@ void GxsForumThreadWidget::showAuthorInPeople(const RsGxsForumMsg& msg) requestMsgData_ShowAuthorInPeople(postId); } +void GxsForumThreadWidget::editForumMessageData(const RsGxsForumMsg& msg) +{ + if ((msg.mMeta.mGroupId != groupId()) || (msg.mMeta.mMsgId != mThreadId)) + { + std::cerr << "GxsForumThreadWidget::replyMessageData() ERROR Message Ids have changed!"; + std::cerr << std::endl; + return; + } + + if (!msg.mMeta.mAuthorId.isNull()) + { + CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), mThreadId, msg.mMeta.mMsgId); + + cfm->insertPastedText(QString::fromUtf8(msg.mMsg.c_str())) ; + cfm->show(); + + /* window will destroy itself! */ + } + else + { + QMessageBox::information(this, tr("RetroShare"),tr("You cant reply to an Anonymous Author")); + } +} void GxsForumThreadWidget::replyForumMessageData(const RsGxsForumMsg &msg) { if ((msg.mMeta.mGroupId != groupId()) || (msg.mMeta.mMsgId != mThreadId)) @@ -2094,10 +2141,12 @@ void GxsForumThreadWidget::replyForumMessageData(const RsGxsForumMsg &msg) if (!msg.mMeta.mAuthorId.isNull()) { - CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), mThreadId); - QTextDocument doc ; + CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), mThreadId,RsGxsMessageId()); + +// QTextDocument doc ; // doc.setHtml(QString::fromUtf8(msg.mMsg.c_str()) ); // std::string cited_text(doc.toPlainText().toStdString()) ; + RsHtml::makeQuotedText(ui->postText); cfm->insertPastedText(RsHtml::makeQuotedText(ui->postText)) ; @@ -2318,7 +2367,8 @@ void GxsForumThreadWidget::loadMessageData(const uint32_t &token) /*********************** **** **** **** ***********************/ /*********************** **** **** **** ***********************/ -void GxsForumThreadWidget::requestMsgData_ReplyMessage(const RsGxsGrpMsgIdPair &msgId) + +void GxsForumThreadWidget::requestMsgData_ReplyWithPrivateMessage(const RsGxsGrpMsgIdPair &msgId) { RsTokReqOptions opts; opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA; @@ -2353,7 +2403,23 @@ void GxsForumThreadWidget::requestMsgData_ShowAuthorInPeople(const RsGxsGrpMsgId uint32_t token; mTokenQueue->requestMsgInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, msgIds, mTokenTypeShowAuthorInPeople); } +void GxsForumThreadWidget::requestMsgData_EditForumMessage(const RsGxsGrpMsgIdPair &msgId) +{ + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA; +#ifdef DEBUG_FORUMS + std::cerr << "GxsForumThreadWidget::requestMsgData_ReplyMessage(" << msgId.first << "," << msgId.second << ")"; + std::cerr << std::endl; +#endif + + GxsMsgReq msgIds; + std::vector &vect = msgIds[msgId.first]; + vect.push_back(msgId.second); + + uint32_t token; + mTokenQueue->requestMsgInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, msgIds, mTokenTypeEditForumMessage); +} void GxsForumThreadWidget::requestMsgData_ReplyForumMessage(const RsGxsGrpMsgIdPair &msgId) { RsTokReqOptions opts; @@ -2397,6 +2463,31 @@ void GxsForumThreadWidget::loadMsgData_ReplyMessage(const uint32_t &token) } } +void GxsForumThreadWidget::loadMsgData_EditForumMessage(const uint32_t &token) +{ +#ifdef DEBUG_FORUMS + std::cerr << "GxsForumThreadWidget::loadMsgData_EditMessage()"; + std::cerr << std::endl; +#endif + + std::vector msgs; + if (rsGxsForums->getMsgData(token, msgs)) + { + if (msgs.size() != 1) + { + std::cerr << "GxsForumThreadWidget::loadMsgData_EditMessage() ERROR Wrong number of answers"; + std::cerr << std::endl; + return; + } + + editForumMessageData(msgs[0]); + } + else + { + std::cerr << "GxsForumThreadWidget::loadMsgData_ReplyMessage() ERROR Missing Message Data..."; + std::cerr << std::endl; + } +} void GxsForumThreadWidget::loadMsgData_ReplyForumMessage(const uint32_t &token) { #ifdef DEBUG_FORUMS @@ -2524,6 +2615,10 @@ void GxsForumThreadWidget::loadRequest(const TokenQueue *queue, const TokenReque return; } + if (req.mUserType == mTokenTypeEditForumMessage) { + loadMsgData_EditForumMessage(req.mToken); + return; + } if (req.mUserType == mTokenTypeShowAuthorInPeople) { loadMsgData_ShowAuthorInPeople(req.mToken); return; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h index a2a6eecee..d06ccae45 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h @@ -75,10 +75,12 @@ private slots: void changedThread(); void clickedThread (QTreeWidgetItem *item, int column); - void replytomessage(); + void reply_with_private_message(); void replytoforummessage(); + void editforummessage(); void replyMessageData(const RsGxsForumMsg &msg); + void editForumMessageData(const RsGxsForumMsg &msg); void replyForumMessageData(const RsGxsForumMsg &msg); void showAuthorInPeople(const RsGxsForumMsg& msg); @@ -147,13 +149,15 @@ private: static void loadAuthorIdCallback(GxsIdDetailsType type, const RsIdentityDetails &details, QObject *object, const QVariant &/*data*/); void requestMessageData(const RsGxsGrpMsgIdPair &msgId); - void requestMsgData_ReplyMessage(const RsGxsGrpMsgIdPair &msgId); + void requestMsgData_ReplyWithPrivateMessage(const RsGxsGrpMsgIdPair &msgId); void requestMsgData_ShowAuthorInPeople(const RsGxsGrpMsgIdPair &msgId); void requestMsgData_ReplyForumMessage(const RsGxsGrpMsgIdPair &msgId); + void requestMsgData_EditForumMessage(const RsGxsGrpMsgIdPair &msgId); void loadMessageData(const uint32_t &token); void loadMsgData_ReplyMessage(const uint32_t &token); void loadMsgData_ReplyForumMessage(const uint32_t &token); + void loadMsgData_EditForumMessage(const uint32_t &token); void loadMsgData_ShowAuthorInPeople(const uint32_t &token); void loadMsgData_SetAuthorOpinion(const uint32_t &token, RsReputations::Opinion opinion); @@ -177,6 +181,7 @@ private: uint32_t mTokenTypeMessageData; uint32_t mTokenTypeReplyMessage; uint32_t mTokenTypeReplyForumMessage; + uint32_t mTokenTypeEditForumMessage; uint32_t mTokenTypeShowAuthorInPeople; uint32_t mTokenTypeNegativeAuthor; uint32_t mTokenTypePositiveAuthor; From dfcb66db8cf6e2087a25cba94aa5fee207c903af Mon Sep 17 00:00:00 2001 From: csoler Date: Fri, 3 Feb 2017 13:02:53 +0100 Subject: [PATCH 02/88] added spinbox to show older versions --- .../src/gui/gxsforums/CreateGxsForumMsg.cpp | 15 ++++++++------- .../src/gui/gxsforums/GxsForumThreadWidget.ui | 13 ++++++++----- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index 6e8954272..c3098b0ae 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -212,14 +212,19 @@ void CreateGxsForumMsg::loadFormInformation() //std::cerr << "CreateGxsForumMsg::loadMsgInformation() using signFlags=" << std::hex << mForumMeta.mSignFlags << std::dec << std::endl; - if( (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) || (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN)) + if( (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) || (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN)) ui.idChooser->setFlags(IDCHOOSER_ID_REQUIRED | IDCHOOSER_NON_ANONYMOUS) ; - else + else ui.idChooser->setFlags(IDCHOOSER_ID_REQUIRED) ; QString name = QString::fromUtf8(mForumMeta.mGroupName.c_str()); QString subj; - if (!mParentId.isNull()) + + if(!mOrigMsgId.isNull()) + { + subj = QString::fromUtf8(mParentMsg.mMeta.mMsgName.c_str()); + } + else if (!mParentId.isNull()) { QString title = QString::fromUtf8(mParentMsg.mMeta.mMsgName.c_str()); name += " " + tr("In Reply to") + ": "; @@ -228,13 +233,9 @@ void CreateGxsForumMsg::loadFormInformation() QString text = title; if (text.startsWith("Re:", Qt::CaseInsensitive)) - { subj = title; - } else - { subj = "Re: " + title; - } } ui.forumName->setText(misc::removeNewLine(name)); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui index 3a93e9973..8304dd0a9 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui @@ -296,7 +296,7 @@ - + @@ -332,7 +332,7 @@ - + @@ -372,7 +372,7 @@ - + Qt::Horizontal @@ -464,20 +464,23 @@ - + - + By + + + From f8056e5751ad4946f2778dc78d8fb2c8c4c23814 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 9 Feb 2017 14:49:43 +0100 Subject: [PATCH 03/88] added collection of older posts versions. --- .../gui/gxsforums/GxsForumThreadWidget.cpp | 25 ++++++ .../src/gui/gxsforums/GxsForumThreadWidget.h | 4 + .../src/gui/gxsforums/GxsForumThreadWidget.ui | 4 +- .../src/gui/gxsforums/GxsForumsFillThread.cpp | 80 ++++++++++++++++++- .../src/gui/gxsforums/GxsForumsFillThread.h | 3 + 5 files changed, 112 insertions(+), 4 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index d2d6c2cc6..d143a70ba 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -200,6 +200,7 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget ui->threadTreeWidget->setItemDelegateForColumn(COLUMN_THREAD_DISTRIBUTION,new DistributionItemDelegate()) ; + connect(ui->versions_CB, SIGNAL(currentItemChanged(int)), this, SLOT(updateCurrentPostVersion(int))); connect(ui->threadTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(threadListCustomPopupMenu(QPoint))); connect(ui->postText, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuTextBrowser(QPoint))); @@ -1029,6 +1030,8 @@ void GxsForumThreadWidget::fillThreadFinished() } else { fillThreads(thread->mItems, thread->mExpandNewMessages, thread->mItemToExpand); + mPostVersions = thread->mPostVersions; + // cleanup list cleanupItems(thread->mItems); } @@ -1516,6 +1519,8 @@ void GxsForumThreadWidget::insertMessage() mStateHelper->setActive(mTokenTypeMessageData, false); mStateHelper->clear(mTokenTypeMessageData); + ui->versions_CB->hide(); + ui->postText->clear(); //ui->threadTitle->clear(); return; @@ -1526,6 +1531,8 @@ void GxsForumThreadWidget::insertMessage() mStateHelper->setActive(mTokenTypeMessageData, false); mStateHelper->clear(mTokenTypeMessageData); + ui->versions_CB->hide(); + //ui->threadTitle->setText(tr("Forum Description")); ui->postText->setText(mForumDescription); return; @@ -1544,6 +1551,7 @@ void GxsForumThreadWidget::insertMessage() // there is something wrong mStateHelper->setWidgetEnabled(ui->previousButton, false); mStateHelper->setWidgetEnabled(ui->nextButton, false); + ui->versions_CB->hide(); return; } @@ -1558,6 +1566,23 @@ void GxsForumThreadWidget::insertMessage() ui->by_text_label->hide(); ui->by_label->hide(); + // add/show combobox for versions, if applicable, and enable it. If no older versions of the post available, hide the combobox. + + QMap > >::const_iterator it = mPostVersions.find(mThreadId) ; + ui->versions_CB->clear(); + + if(it != mPostVersions.end()) + { + ui->versions_CB->setVisible(true) ; + + for(uint32_t i=0;i<(*it).size();++i) + ui->versions_CB->insertItem(i,QDateTime::fromTime_t( (*it)[i].first).toString()) ; + } + else + { + ui->versions_CB->hide(); + } + /* request Post */ RsGxsGrpMsgIdPair msgId = std::make_pair(groupId(), mThreadId); requestMessageData(msgId); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h index d320324db..f6eaeb208 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h @@ -1,6 +1,8 @@ #ifndef GXSFORUMTHREADWIDGET_H #define GXSFORUMTHREADWIDGET_H +#include + #include "gui/gxs/GxsMessageFrameWidget.h" #include #include "gui/gxs/GxsIdDetails.h" @@ -197,6 +199,8 @@ private: RsGxsMessageId mNavigatePendingMsgId; QList mIgnoredMsgId; + QMap > > mPostVersions ; // holds older versions of posts + Ui::GxsForumThreadWidget *ui; }; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui index 8304dd0a9..bd0d92e9e 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui @@ -479,7 +479,7 @@ - + @@ -565,8 +565,8 @@ - + diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp index 4c381ce42..9b8e0d6b0 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp @@ -31,7 +31,7 @@ #include #include -//#define DEBUG_FORUMS +#define DEBUG_FORUMS #define PROGRESSBAR_MAX 100 @@ -171,7 +171,7 @@ void GxsForumsFillThread::run() int pos = 0; int steps = count / PROGRESSBAR_MAX; int step = 0; - + // ThreadList contains the list of parent threads. The algorithm below iterates through all messages // and tries to establish parenthood relationships between them, given that we only know the // immediate parent of a message and now its children. Some messages have a missing parent and for them @@ -185,6 +185,77 @@ void GxsForumsFillThread::run() std::map > kids_array ; std::set missing_parents; + // First of all, remove all older versions of posts. This is done by first adding all posts into a hierarchy structure + // and then removing all posts which have a new versions available. The older versions are kept appart. + +#ifdef DEBUG_FORUMS + std::cerr << "GxsForumsFillThread::run() Collecting post versions" << std::endl; +#endif + mPostVersions.clear(); + std::list msg_stack ; + + for ( std::map::iterator msgIt = msgs.begin(); msgIt != msgs.end();++msgIt) + if(!msgIt->second.mMeta.mOrigMsgId.isNull() && msgIt->second.mMeta.mOrigMsgId != msgIt->second.mMeta.mMsgId) + { +#ifdef DEBUG_FORUMS + std::cerr << " Post " << msgIt->second.mMeta.mMsgId << " is a new version of " << msgIt->second.mMeta.mOrigMsgId << std::endl; +#endif + mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt->second.mMeta.mPublishTs,msgIt->second.mMeta.mMsgId)) ; + } + + for(QMap > >::iterator it(mPostVersions.begin());it!=mPostVersions.end();++it) + { + QVector >& v(*it) ; + + for(int32_t i=0;i tmp(v[0]) ; + v[0] = v[i] ; + v[i] = tmp ; + } + + QMap > >::iterator it2 = mPostVersions.find(sub_msg_id); + + if(it2 != mPostVersions.end()) + { + for(uint32_t j=0;j<(*it2).size();++j) + v.append((*it2)[j]) ; + + mPostVersions.erase(it2) ; // it2 is never equal to it + } + } + } + + // Now remove from msg ids, all posts except the most recent one. + +#ifdef DEBUG_FORUMS + std::cerr << "Final post versions: " << std::endl; +#endif + for(QMap > >::iterator it(mPostVersions.begin());it!=mPostVersions.end();++it) + { +#ifdef DEBUG_FORUMS + std::cerr << "Original post: " << it.key() << std::endl; +#endif + if(!(*it).empty()) + msgs.erase(it.key()) ; + + for(uint32_t i=0;i<(*it).size();++i) + { + if(i > 0) + msgs.erase((*it)[i].second) ; + +#ifdef DEBUG_FORUMS + std::cerr << " new version " << (*it)[i].first << " " << (*it)[i].second << std::endl; +#endif + } + } + // The first step is to find the top level thread messages. These are defined as the messages without // any parent message ID. @@ -194,6 +265,8 @@ void GxsForumsFillThread::run() std::map kept_msgs; for ( std::map::iterator msgIt = msgs.begin(); msgIt != msgs.end();++msgIt) + { + if(mFlatView || msgIt->second.mMeta.mParentId.isNull()) { @@ -234,9 +307,12 @@ void GxsForumsFillThread::run() kids_array[msgIt->second.mMeta.mParentId].push_back(msgIt->first) ; kept_msgs.insert(*msgIt) ; } + } msgs = kept_msgs; + // Also create a list of posts by time, when they are new versions of existing posts. Only the last one will have an item created. + // Add a fake toplevel item for the parent IDs that we dont actually have. for(std::set::const_iterator it(missing_parents.begin());it!=missing_parents.end();++it) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.h b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.h index 58a461607..2b5974855 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.h @@ -2,6 +2,8 @@ #define GXSFORUMSFILLTHREAD_H #include +#include +#include #include "retroshare/rsgxsifacetypes.h" class GxsForumThreadWidget; @@ -39,6 +41,7 @@ public: QList mItems; QList mItemToExpand; + QMap > > mPostVersions ; private: void calculateExpand(const RsGxsForumMsg &msg, QTreeWidgetItem *item); From b93130ac77415ae292a445e3e8f5b8f3c7980cad Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 9 Feb 2017 16:15:35 +0100 Subject: [PATCH 04/88] fixed a few bugs in post version collecting --- .../gui/gxsforums/GxsForumThreadWidget.cpp | 35 +++++++-- .../src/gui/gxsforums/GxsForumsFillThread.cpp | 72 +++++++++++-------- 2 files changed, 73 insertions(+), 34 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index d143a70ba..9e731a0c7 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -200,7 +200,7 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget ui->threadTreeWidget->setItemDelegateForColumn(COLUMN_THREAD_DISTRIBUTION,new DistributionItemDelegate()) ; - connect(ui->versions_CB, SIGNAL(currentItemChanged(int)), this, SLOT(updateCurrentPostVersion(int))); + connect(ui->versions_CB, SIGNAL(currentIndexChanged(int)), this, SLOT(changedThread())); connect(ui->threadTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(threadListCustomPopupMenu(QPoint))); connect(ui->postText, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuTextBrowser(QPoint))); @@ -698,7 +698,13 @@ void GxsForumThreadWidget::changedThread() if (!item || !item->isSelected()) { mThreadId.clear(); } else { - mThreadId = RsGxsMessageId(item->data(COLUMN_THREAD_MSGID, Qt::DisplayRole).toString().toStdString()); + mThreadId.clear(); + + if(ui->versions_CB->count() > 0) + mThreadId = RsGxsMessageId(ui->versions_CB->itemData(ui->versions_CB->currentIndex()).toString().toStdString()) ; + + if(mThreadId.isNull()) + mThreadId = RsGxsMessageId(item->data(COLUMN_THREAD_MSGID, Qt::DisplayRole).toString().toStdString()); } if (mFillThread) { @@ -1024,13 +1030,13 @@ void GxsForumThreadWidget::fillThreadFinished() mLastViewType = thread->mViewType; mLastForumID = groupId(); ui->threadTreeWidget->insertTopLevelItems(0, thread->mItems); + mPostVersions = thread->mPostVersions; // clear list thread->mItems.clear(); } else { - fillThreads(thread->mItems, thread->mExpandNewMessages, thread->mItemToExpand); - mPostVersions = thread->mPostVersions; + fillThreads(thread->mItems, thread->mExpandNewMessages, thread->mItemToExpand); // cleanup list cleanupItems(thread->mItems); @@ -1520,6 +1526,7 @@ void GxsForumThreadWidget::insertMessage() mStateHelper->clear(mTokenTypeMessageData); ui->versions_CB->hide(); + ui->time_label->show(); ui->postText->clear(); //ui->threadTitle->clear(); @@ -1532,6 +1539,7 @@ void GxsForumThreadWidget::insertMessage() mStateHelper->clear(mTokenTypeMessageData); ui->versions_CB->hide(); + ui->time_label->show(); //ui->threadTitle->setText(tr("Forum Description")); ui->postText->setText(mForumDescription); @@ -1552,6 +1560,7 @@ void GxsForumThreadWidget::insertMessage() mStateHelper->setWidgetEnabled(ui->previousButton, false); mStateHelper->setWidgetEnabled(ui->nextButton, false); ui->versions_CB->hide(); + ui->time_label->show(); return; } @@ -1568,19 +1577,33 @@ void GxsForumThreadWidget::insertMessage() // add/show combobox for versions, if applicable, and enable it. If no older versions of the post available, hide the combobox. + std::cerr << "Looking into existing versions for post " << mThreadId << ", thread history: " << mPostVersions.size() << std::endl; + QMap > >::const_iterator it = mPostVersions.find(mThreadId) ; ui->versions_CB->clear(); if(it != mPostVersions.end()) { + std::cerr << (*it).size() << " versions found " << std::endl; + ui->versions_CB->setVisible(true) ; + ui->time_label->hide(); + + ui->versions_CB->blockSignals(true) ; for(uint32_t i=0;i<(*it).size();++i) - ui->versions_CB->insertItem(i,QDateTime::fromTime_t( (*it)[i].first).toString()) ; + { + ui->versions_CB->insertItem(i,DateTime::formatLongDateTime( (*it)[i].first)); + ui->versions_CB->setItemData(i,QString::fromStdString((*it)[i].second.toStdString())); + + std::cerr << " added new post version " << (*it)[i].first << " " << (*it)[i].second << std::endl; + } + ui->versions_CB->blockSignals(false) ; } else { ui->versions_CB->hide(); + ui->time_label->show(); } /* request Post */ @@ -2137,7 +2160,7 @@ void GxsForumThreadWidget::editForumMessageData(const RsGxsForumMsg& msg) if (!msg.mMeta.mAuthorId.isNull()) { - CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), mThreadId, msg.mMeta.mMsgId); + CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), msg.mMeta.mParentId, msg.mMeta.mMsgId); cfm->insertPastedText(QString::fromUtf8(msg.mMsg.c_str())) ; cfm->show(); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp index 9b8e0d6b0..fee9ff5f5 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp @@ -89,6 +89,8 @@ void GxsForumsFillThread::calculateExpand(const RsGxsForumMsg &msg, QTreeWidgetI } } +static bool decreasing_time_comp(const QPair& e1,const QPair& e2) { return e2.first < e1.first ; } + void GxsForumsFillThread::run() { RsTokenService *service = rsGxsForums->getTokenService(); @@ -200,61 +202,75 @@ void GxsForumsFillThread::run() #ifdef DEBUG_FORUMS std::cerr << " Post " << msgIt->second.mMeta.mMsgId << " is a new version of " << msgIt->second.mMeta.mOrigMsgId << std::endl; #endif - mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt->second.mMeta.mPublishTs,msgIt->second.mMeta.mMsgId)) ; + std::map::iterator msgIt2 = msgs.find(msgIt->second.mMeta.mOrigMsgId); + + // always add the post a a self version + + if(msgIt2 != msgs.end()) + { + // Ensuring that the post exists allows to only collect the existing data. + + mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt2->second.mMeta.mPublishTs,msgIt2->second.mMeta.mMsgId)) ; + mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt->second.mMeta.mPublishTs,msgIt->second.mMeta.mMsgId)) ; + } } + // The following code assembles all new versions of a given post into the same array, indexed by the oldest version of the post. + for(QMap > >::iterator it(mPostVersions.begin());it!=mPostVersions.end();++it) { QVector >& v(*it) ; for(int32_t i=0;i > >::iterator it2 = mPostVersions.find(sub_msg_id); - if(v[0].first < v[i].first) // works if i==0 - { - QPair tmp(v[0]) ; - v[0] = v[i] ; - v[i] = tmp ; - } + if(it2 != mPostVersions.end()) + { + for(uint32_t j=0;j<(*it2).size();++j) + if((*it2)[j].second != sub_msg_id) // dont copy it, since it is already present at slot i + v.append((*it2)[j]) ; - QMap > >::iterator it2 = mPostVersions.find(sub_msg_id); - - if(it2 != mPostVersions.end()) - { - for(uint32_t j=0;j<(*it2).size();++j) - v.append((*it2)[j]) ; - - mPostVersions.erase(it2) ; // it2 is never equal to it - } - } + mPostVersions.erase(it2) ; // it2 is never equal to it + } + } } - // Now remove from msg ids, all posts except the most recent one. + // Now remove from msg ids, all posts except the most recent one. And make the mPostVersion be indexed by the most recent version of the post, + // which corresponds to the item in the tree widget. #ifdef DEBUG_FORUMS std::cerr << "Final post versions: " << std::endl; #endif + QMap > > mTmp; + for(QMap > >::iterator it(mPostVersions.begin());it!=mPostVersions.end();++it) { #ifdef DEBUG_FORUMS std::cerr << "Original post: " << it.key() << std::endl; #endif - if(!(*it).empty()) - msgs.erase(it.key()) ; + // Finally, sort the posts from newer to older - for(uint32_t i=0;i<(*it).size();++i) - { - if(i > 0) - msgs.erase((*it)[i].second) ; + qSort((*it).begin(),(*it).end(),decreasing_time_comp) ; #ifdef DEBUG_FORUMS - std::cerr << " new version " << (*it)[i].first << " " << (*it)[i].second << std::endl; + std::cerr << " most recent version " << (*it)[0].first << " " << (*it)[0].second << std::endl; +#endif + for(uint32_t i=1;i<(*it).size();++i) + { + msgs.erase((*it)[i].second) ; + +#ifdef DEBUG_FORUMS + std::cerr << " older version " << (*it)[i].first << " " << (*it)[i].second << std::endl; #endif } + + mTmp[(*it)[0].second] = *it ; // index the versions map by the ID of the most recent post. } + mPostVersions = mTmp ; // The first step is to find the top level thread messages. These are defined as the messages without // any parent message ID. From 8deeec61c51fc648eccd95f9ce3b39e60ab693b3 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 9 Feb 2017 18:45:55 +0100 Subject: [PATCH 05/88] fixed UI for post versions --- .../gui/gxsforums/GxsForumThreadWidget.cpp | 24 +++++++++++++++---- .../src/gui/gxsforums/GxsForumThreadWidget.h | 1 + .../src/gui/gxsforums/GxsForumThreadWidget.ui | 14 +++++------ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index 9e731a0c7..b99af03f4 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -701,10 +701,16 @@ void GxsForumThreadWidget::changedThread() mThreadId.clear(); if(ui->versions_CB->count() > 0) + { mThreadId = RsGxsMessageId(ui->versions_CB->itemData(ui->versions_CB->currentIndex()).toString().toStdString()) ; + mOrigThreadId = RsGxsMessageId(ui->versions_CB->itemData(0).toString().toStdString()) ; + } if(mThreadId.isNull()) + { mThreadId = RsGxsMessageId(item->data(COLUMN_THREAD_MSGID, Qt::DisplayRole).toString().toStdString()); + mOrigThreadId = mThreadId ; + } } if (mFillThread) { @@ -1579,8 +1585,12 @@ void GxsForumThreadWidget::insertMessage() std::cerr << "Looking into existing versions for post " << mThreadId << ", thread history: " << mPostVersions.size() << std::endl; - QMap > >::const_iterator it = mPostVersions.find(mThreadId) ; - ui->versions_CB->clear(); + QMap > >::const_iterator it = mPostVersions.find(mOrigThreadId) ; + + ui->versions_CB->blockSignals(true) ; + + while(ui->versions_CB->count() > 0) + ui->versions_CB->removeItem(0); if(it != mPostVersions.end()) { @@ -1589,7 +1599,7 @@ void GxsForumThreadWidget::insertMessage() ui->versions_CB->setVisible(true) ; ui->time_label->hide(); - ui->versions_CB->blockSignals(true) ; + int current_index = 0 ; for(uint32_t i=0;i<(*it).size();++i) { @@ -1597,8 +1607,12 @@ void GxsForumThreadWidget::insertMessage() ui->versions_CB->setItemData(i,QString::fromStdString((*it)[i].second.toStdString())); std::cerr << " added new post version " << (*it)[i].first << " " << (*it)[i].second << std::endl; + + if(mThreadId == (*it)[i].second) + current_index = i ; } - ui->versions_CB->blockSignals(false) ; + + ui->versions_CB->setCurrentIndex(current_index) ; } else { @@ -1606,6 +1620,8 @@ void GxsForumThreadWidget::insertMessage() ui->time_label->show(); } + ui->versions_CB->blockSignals(false) ; + /* request Post */ RsGxsGrpMsgIdPair msgId = std::make_pair(groupId(), mThreadId); requestMessageData(msgId); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h index f6eaeb208..456408fae 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h @@ -166,6 +166,7 @@ private: private: RsGxsGroupId mLastForumID; RsGxsMessageId mThreadId; + RsGxsMessageId mOrigThreadId; RsGxsForumGroup mForumGroup; QString mForumDescription; int mSubscribeFlags; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui index bd0d92e9e..789616228 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui @@ -289,13 +289,6 @@ - - - - - - - @@ -481,6 +474,13 @@ + + + + + + + From 5bf8376dd18735c349a71db9c4d94344d8336a01 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 9 Feb 2017 21:49:24 +0100 Subject: [PATCH 06/88] fixed a few more bugs in post version UI --- .../src/gui/gxsforums/CreateGxsForumMsg.cpp | 123 ++++++++++++++++-- .../src/gui/gxsforums/CreateGxsForumMsg.h | 6 +- .../gui/gxsforums/GxsForumThreadWidget.cpp | 31 ++--- .../src/gui/gxsforums/GxsForumThreadWidget.h | 1 + .../src/gui/gxsforums/GxsForumsFillThread.cpp | 4 +- 5 files changed, 137 insertions(+), 28 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index e8923d400..bf8423532 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -45,12 +45,13 @@ #define CREATEGXSFORUMMSG_FORUMINFO 1 #define CREATEGXSFORUMMSG_PARENTMSG 2 #define CREATEGXSFORUMMSG_CIRCLENFO 3 +#define CREATEGXSFORUMMSG_ORIGMSG 4 //#define ENABLE_GENERATE /** Constructor */ -CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId,const RsGxsMessageId& mOId) -: QDialog(NULL, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint), mForumId(fId), mParentId(pId), mOrigMsgId(mOId) +CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId,const RsGxsMessageId& mOId,const RsGxsId& posterId) +: QDialog(NULL, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint), mForumId(fId), mParentId(pId), mOrigMsgId(mOId),mPosterId(posterId) { /* Invoke the Qt Designer generated object setup routine */ ui.setupUi(this); @@ -75,6 +76,13 @@ CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessage mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_PARENTMSG, ui.forumSubject); mStateHelper->addClear(CREATEGXSFORUMMSG_PARENTMSG, ui.forumName); + mStateHelper->addWidget(CREATEGXSFORUMMSG_ORIGMSG, ui.buttonBox->button(QDialogButtonBox::Ok)); + mStateHelper->addWidget(CREATEGXSFORUMMSG_ORIGMSG, ui.innerFrame); + mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_ORIGMSG, ui.forumName); + mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_ORIGMSG, ui.forumSubject); + mStateHelper->addClear(CREATEGXSFORUMMSG_ORIGMSG, ui.forumName); + + QString text = mOId.isNull()?(pId.isNull() ? tr("Start New Thread") : tr("Post Forum Message")):tr("Edit Message"); setWindowTitle(text); @@ -129,13 +137,24 @@ void CreateGxsForumMsg::newMsg() //std::cerr << "Initing ID chooser. Sign flags = " << std::hex << mForumMeta.mSignFlags << std::dec << std::endl; - ui.idChooser->loadIds(IDCHOOSER_ID_REQUIRED, RsGxsId()); + if(!mPosterId.isNull()) + { + std::set id_set ; + id_set.insert(mPosterId) ; + + ui.idChooser->loadIds(IDCHOOSER_ID_REQUIRED | IDCHOOSER_NO_CREATE, mPosterId); + ui.idChooser->setIdConstraintSet(id_set); + } + else + ui.idChooser->loadIds(IDCHOOSER_ID_REQUIRED, mPosterId); if (mForumId.isNull()) { mStateHelper->setActive(CREATEGXSFORUMMSG_FORUMINFO, false); mStateHelper->setActive(CREATEGXSFORUMMSG_PARENTMSG, false); + mStateHelper->setActive(CREATEGXSFORUMMSG_ORIGMSG, false); mStateHelper->clear(CREATEGXSFORUMMSG_FORUMINFO); mStateHelper->clear(CREATEGXSFORUMMSG_PARENTMSG); + mStateHelper->clear(CREATEGXSFORUMMSG_ORIGMSG); ui.forumName->setText(tr("No Forum")); return; }//if ( mForumId.isNull()) @@ -174,11 +193,53 @@ void CreateGxsForumMsg::newMsg() uint32_t token; mForumQueue->requestMsgInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, msgIds, CREATEGXSFORUMMSG_PARENTMSG); }//if (mParentId.isNull()) + + if (mOrigMsgId.isNull()) { + mStateHelper->setActive(CREATEGXSFORUMMSG_ORIGMSG, true); + mOrigMsgLoaded = true; + } else { + mStateHelper->setLoading(CREATEGXSFORUMMSG_ORIGMSG, true); + + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA; + + GxsMsgReq msgIds; + std::vector &vect = msgIds[mForumId]; + vect.push_back(mOrigMsgId); + + //std::cerr << "ForumsV2Dialog::newMsg() Requesting Parent Summary(" << mParentId << ")"; + //std::cerr << std::endl; + + uint32_t token; + mForumQueue->requestMsgInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, msgIds, CREATEGXSFORUMMSG_ORIGMSG); + }//if (mParentId.isNull()) } void CreateGxsForumMsg::loadFormInformation() { - if (!mParentId.isNull()) { + if (!mOrigMsgId.isNull()) + { + if (mOrigMsgLoaded) { + mStateHelper->setActive(CREATEGXSFORUMMSG_ORIGMSG, true); + mStateHelper->setLoading(CREATEGXSFORUMMSG_ORIGMSG, false); + } else { + //std::cerr << "CreateGxsForumMsg::loadMsgInformation() ParentMsg not Loaded Yet"; + //std::cerr << std::endl; + + mStateHelper->setActive(CREATEGXSFORUMMSG_ORIGMSG, false); + + return; + } + } + else + { + mStateHelper->setActive(CREATEGXSFORUMMSG_ORIGMSG, true); + mStateHelper->setLoading(CREATEGXSFORUMMSG_ORIGMSG, false); + } + + + if (!mParentId.isNull()) + { if (mParentMsgLoaded) { mStateHelper->setActive(CREATEGXSFORUMMSG_PARENTMSG, true); mStateHelper->setLoading(CREATEGXSFORUMMSG_PARENTMSG, false); @@ -190,7 +251,9 @@ void CreateGxsForumMsg::loadFormInformation() return; } - } else { + } + else + { mStateHelper->setActive(CREATEGXSFORUMMSG_PARENTMSG, true); mStateHelper->setLoading(CREATEGXSFORUMMSG_PARENTMSG, false); } @@ -212,17 +275,22 @@ void CreateGxsForumMsg::loadFormInformation() //std::cerr << "CreateGxsForumMsg::loadMsgInformation() using signFlags=" << std::hex << mForumMeta.mSignFlags << std::dec << std::endl; + uint32_t fl = IDCHOOSER_ID_REQUIRED ; + if( (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) || (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN)) - ui.idChooser->setFlags(IDCHOOSER_ID_REQUIRED | IDCHOOSER_NON_ANONYMOUS) ; - else - ui.idChooser->setFlags(IDCHOOSER_ID_REQUIRED) ; - + fl |= IDCHOOSER_NON_ANONYMOUS ; + + if(!mPosterId.isNull()) + fl |= IDCHOOSER_NO_CREATE; + + ui.idChooser->setFlags(fl) ; + QString name = QString::fromUtf8(mForumMeta.mGroupName.c_str()); QString subj; if(!mOrigMsgId.isNull()) { - subj = QString::fromUtf8(mParentMsg.mMeta.mMsgName.c_str()); + subj = QString::fromUtf8(mOrigMsg.mMeta.mMsgName.c_str()); } else if (!mParentId.isNull()) { @@ -240,6 +308,7 @@ void CreateGxsForumMsg::loadFormInformation() ui.forumName->setText(misc::removeNewLine(name)); ui.forumSubject->setText(misc::removeNewLine(subj)); + ui.forumSubject->setReadOnly(!mOrigMsgId.isNull()); if (ui.forumSubject->text().isEmpty()) { @@ -380,7 +449,7 @@ void CreateGxsForumMsg::reject() QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("Cancel Forum Message"), tr("Forum Message has not been sent yet!\n" - "Please confirm that you want to discard this message?"), + "Do you want to discard this message?"), QMessageBox::Yes | QMessageBox::No); switch (ret) { case QMessageBox::Yes: @@ -522,6 +591,35 @@ void CreateGxsForumMsg::loadForumCircleInfo(const uint32_t& token) } } +void CreateGxsForumMsg::loadOrigMsg(const uint32_t &token) +{ + //std::cerr << "CreateGxsForumMsg::loadParentMsg()"; + //std::cerr << std::endl; + + // Only grab one.... ignore more (shouldn't be any). + std::vector msgs; + if (rsGxsForums->getMsgData(token, msgs)) + { + if (msgs.size() != 1) + { + /* error */ + std::cerr << "CreateGxsForumMsg::loadOrigMsg() ERROR wrong number of msgs"; + std::cerr << std::endl; + + mStateHelper->setActive(CREATEGXSFORUMMSG_ORIGMSG, false); + mStateHelper->setLoading(CREATEGXSFORUMMSG_ORIGMSG, false); + + return; + } + + mOrigMsg = msgs[0]; + mOrigMsgLoaded = true; + + loadFormInformation(); + } +} + + void CreateGxsForumMsg::loadParentMsg(const uint32_t &token) { //std::cerr << "CreateGxsForumMsg::loadParentMsg()"; @@ -563,6 +661,9 @@ void CreateGxsForumMsg::loadRequest(const TokenQueue *queue, const TokenRequest case CREATEGXSFORUMMSG_FORUMINFO: loadForumInfo(req.mToken); break; + case CREATEGXSFORUMMSG_ORIGMSG: + loadOrigMsg(req.mToken); + break; case CREATEGXSFORUMMSG_PARENTMSG: loadParentMsg(req.mToken); break; diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h index f3be33275..7f84a434b 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h @@ -36,7 +36,7 @@ class CreateGxsForumMsg : public QDialog, public TokenResponse Q_OBJECT public: - CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId, const RsGxsMessageId &moId); + CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId, const RsGxsMessageId &moId, const RsGxsId &posterId = RsGxsId()); ~CreateGxsForumMsg(); void newMsg(); /* cleanup */ @@ -61,18 +61,22 @@ private: void loadForumInfo(const uint32_t &token); void loadParentMsg(const uint32_t &token); + void loadOrigMsg(const uint32_t &token); void loadForumCircleInfo(const uint32_t &token); RsGxsGroupId mForumId; RsGxsCircleId mCircleId ; RsGxsMessageId mParentId; RsGxsMessageId mOrigMsgId; + RsGxsId mPosterId; bool mParentMsgLoaded; + bool mOrigMsgLoaded; bool mForumMetaLoaded; bool mForumCircleLoaded ; RsGxsForumMsg mParentMsg; + RsGxsForumMsg mOrigMsg; RsGroupMetaData mForumMeta; RsGxsCircleGroup mForumCircleData ; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index b99af03f4..ed25b4512 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -200,7 +200,7 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget ui->threadTreeWidget->setItemDelegateForColumn(COLUMN_THREAD_DISTRIBUTION,new DistributionItemDelegate()) ; - connect(ui->versions_CB, SIGNAL(currentIndexChanged(int)), this, SLOT(changedThread())); + connect(ui->versions_CB, SIGNAL(currentIndexChanged(int)), this, SLOT(changedVersion())); connect(ui->threadTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(threadListCustomPopupMenu(QPoint))); connect(ui->postText, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuTextBrowser(QPoint))); @@ -690,6 +690,17 @@ void GxsForumThreadWidget::togglethreadview_internal() } } +void GxsForumThreadWidget::changedVersion() +{ + mThreadId = RsGxsMessageId(ui->versions_CB->itemData(ui->versions_CB->currentIndex()).toString().toStdString()) ; + + if (mFillThread) { + return; + } + ui->postText->resetImagesStatus(Settings->getForumLoadEmbeddedImages()) ; + insertMessage(); +} + void GxsForumThreadWidget::changedThread() { /* just grab the ids of the current item */ @@ -697,20 +708,10 @@ void GxsForumThreadWidget::changedThread() if (!item || !item->isSelected()) { mThreadId.clear(); + mOrigThreadId.clear(); } else { - mThreadId.clear(); - if(ui->versions_CB->count() > 0) - { - mThreadId = RsGxsMessageId(ui->versions_CB->itemData(ui->versions_CB->currentIndex()).toString().toStdString()) ; - mOrigThreadId = RsGxsMessageId(ui->versions_CB->itemData(0).toString().toStdString()) ; - } - - if(mThreadId.isNull()) - { - mThreadId = RsGxsMessageId(item->data(COLUMN_THREAD_MSGID, Qt::DisplayRole).toString().toStdString()); - mOrigThreadId = mThreadId ; - } + mThreadId = mOrigThreadId = RsGxsMessageId(item->data(COLUMN_THREAD_MSGID, Qt::DisplayRole).toString().toStdString()); } if (mFillThread) { @@ -1603,7 +1604,7 @@ void GxsForumThreadWidget::insertMessage() for(uint32_t i=0;i<(*it).size();++i) { - ui->versions_CB->insertItem(i,DateTime::formatLongDateTime( (*it)[i].first)); + ui->versions_CB->insertItem(i, ((i==0)?tr("(Latest) "):tr("(Old) "))+" "+DateTime::formatLongDateTime( (*it)[i].first)); ui->versions_CB->setItemData(i,QString::fromStdString((*it)[i].second.toStdString())); std::cerr << " added new post version " << (*it)[i].first << " " << (*it)[i].second << std::endl; @@ -2176,7 +2177,7 @@ void GxsForumThreadWidget::editForumMessageData(const RsGxsForumMsg& msg) if (!msg.mMeta.mAuthorId.isNull()) { - CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), msg.mMeta.mParentId, msg.mMeta.mMsgId); + CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), msg.mMeta.mParentId, msg.mMeta.mMsgId, msg.mMeta.mAuthorId); cfm->insertPastedText(QString::fromUtf8(msg.mMsg.c_str())) ; cfm->show(); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h index 456408fae..71103507e 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h @@ -75,6 +75,7 @@ private slots: void contextMenuTextBrowser(QPoint point); void changedThread(); + void changedVersion(); void clickedThread (QTreeWidgetItem *item, int column); void reply_with_private_message(); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp index fee9ff5f5..c974986d0 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp @@ -210,7 +210,9 @@ void GxsForumsFillThread::run() { // Ensuring that the post exists allows to only collect the existing data. - mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt2->second.mMeta.mPublishTs,msgIt2->second.mMeta.mMsgId)) ; + if(mPostVersions[msgIt->second.mMeta.mOrigMsgId].empty()) + mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt2->second.mMeta.mPublishTs,msgIt2->second.mMeta.mMsgId)) ; + mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt->second.mMeta.mPublishTs,msgIt->second.mMeta.mMsgId)) ; } } From ea82d26b756f9c3f959c214b3c350740c9b0fdc6 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 9 Feb 2017 23:35:59 +0100 Subject: [PATCH 07/88] fixed signature verification bug for versionned messages --- libretroshare/src/gxs/gxssecurity.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libretroshare/src/gxs/gxssecurity.cc b/libretroshare/src/gxs/gxssecurity.cc index 20ddc1462..8a5bb5851 100644 --- a/libretroshare/src/gxs/gxssecurity.cc +++ b/libretroshare/src/gxs/gxssecurity.cc @@ -436,8 +436,12 @@ bool GxsSecurity::validateNxsMsg(const RsNxsMsg& msg, const RsTlvKeySignature& s msgMeta.signSet.TlvClear(); RsGxsMessageId msgId = msgMeta.mMsgId, origMsgId = msgMeta.mOrigMsgId; - msgMeta.mOrigMsgId.clear(); + + if(msgMeta.mOrigMsgId == msgMeta.mMsgId) // message is not versionned, then the signature was made with mOrigMsgId==NULL + msgMeta.mOrigMsgId.clear(); + msgMeta.mMsgId.clear(); + int signOk = 0 ; { From 22f2edb5ad374516e21dcee2a1bb03545c2679a9 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 11 Feb 2017 10:45:30 +0100 Subject: [PATCH 08/88] removed debug info and added comment --- libretroshare/src/gxs/rsgenexchange.cc | 4 +++- retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc index aa098a1dc..d2e7bac83 100644 --- a/libretroshare/src/gxs/rsgenexchange.cc +++ b/libretroshare/src/gxs/rsgenexchange.cc @@ -2138,7 +2138,9 @@ void RsGenExchange::publishMsgs() if(createOk && validSize) { // empty orig msg id means this is the original - // msg + // msg. + // (csoler) Why are we doing this??? + if(msg->metaData->mOrigMsgId.isNull()) { msg->metaData->mOrigMsgId = msg->metaData->mMsgId; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp index c974986d0..0b7991027 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp @@ -31,7 +31,7 @@ #include #include -#define DEBUG_FORUMS +//#define DEBUG_FORUMS #define PROGRESSBAR_MAX 100 @@ -232,7 +232,7 @@ void GxsForumsFillThread::run() if(it2 != mPostVersions.end()) { - for(uint32_t j=0;j<(*it2).size();++j) + for(int32_t j=0;j<(*it2).size();++j) if((*it2)[j].second != sub_msg_id) // dont copy it, since it is already present at slot i v.append((*it2)[j]) ; @@ -261,7 +261,7 @@ void GxsForumsFillThread::run() #ifdef DEBUG_FORUMS std::cerr << " most recent version " << (*it)[0].first << " " << (*it)[0].second << std::endl; #endif - for(uint32_t i=1;i<(*it).size();++i) + for(int32_t i=1;i<(*it).size();++i) { msgs.erase((*it)[i].second) ; From bd8189ccdf93b6707417f5e3768a0c7799ff79ec Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 28 Feb 2017 18:05:44 +0100 Subject: [PATCH 09/88] added test to prevent msgs with a different name to be used as different version --- .../src/gui/gxsforums/GxsForumsFillThread.cpp | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp index 0b7991027..199748346 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp @@ -198,24 +198,30 @@ void GxsForumsFillThread::run() for ( std::map::iterator msgIt = msgs.begin(); msgIt != msgs.end();++msgIt) if(!msgIt->second.mMeta.mOrigMsgId.isNull() && msgIt->second.mMeta.mOrigMsgId != msgIt->second.mMeta.mMsgId) - { + { #ifdef DEBUG_FORUMS std::cerr << " Post " << msgIt->second.mMeta.mMsgId << " is a new version of " << msgIt->second.mMeta.mOrigMsgId << std::endl; #endif std::map::iterator msgIt2 = msgs.find(msgIt->second.mMeta.mOrigMsgId); - // always add the post a a self version + // Ensuring that the post exists allows to only collect the existing data. - if(msgIt2 != msgs.end()) - { - // Ensuring that the post exists allows to only collect the existing data. + if(msgIt2 == msgs.end()) + continue ; - if(mPostVersions[msgIt->second.mMeta.mOrigMsgId].empty()) - mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt2->second.mMeta.mPublishTs,msgIt2->second.mMeta.mMsgId)) ; + // Make sure that the author is the same than the original message. This should always happen, but nothing can prevent someone to + // craft a new version of a message with his own signature. - mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt->second.mMeta.mPublishTs,msgIt->second.mMeta.mMsgId)) ; - } - } + if(msgIt2->second.mMeta.mAuthorId != msgIt->second.mMeta.mAuthorId) + continue ; + + // always add the post a self version + + if(mPostVersions[msgIt->second.mMeta.mOrigMsgId].empty()) + mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt2->second.mMeta.mPublishTs,msgIt2->second.mMeta.mMsgId)) ; + + mPostVersions[msgIt->second.mMeta.mOrigMsgId].push_back(QPair(msgIt->second.mMeta.mPublishTs,msgIt->second.mMeta.mMsgId)) ; + } // The following code assembles all new versions of a given post into the same array, indexed by the oldest version of the post. From fdab4808d40eac3334cc4b36821360b5f3d45022 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 11 Mar 2017 18:10:14 +0100 Subject: [PATCH 10/88] added minimum version number for debian stretch --- build_scripts/Debian+Ubuntu/control.stretch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_scripts/Debian+Ubuntu/control.stretch b/build_scripts/Debian+Ubuntu/control.stretch index 9b557e3b8..6968c9964 100644 --- a/build_scripts/Debian+Ubuntu/control.stretch +++ b/build_scripts/Debian+Ubuntu/control.stretch @@ -2,7 +2,7 @@ Source: retroshare06 Section: devel Priority: standard Maintainer: Cyril Soler -Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libopencv-dev, tcl8.6, libsqlcipher-dev, libmicrohttpd-dev, libavcodec-dev, qtmultimedia5-dev, qttools5-dev, libqt5x11extras5-dev, qt5-default +Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libopencv-dev, tcl8.6, libsqlcipher-dev (>= 3.4.0), libmicrohttpd-dev, libavcodec-dev, qtmultimedia5-dev, qttools5-dev, libqt5x11extras5-dev, qt5-default Standards-Version: 3.9.6 Homepage: http://retroshare.sourceforge.net From a0d1089559c5cfb6219e0bddd814c96bd48f83ae Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 11 Mar 2017 18:15:35 +0100 Subject: [PATCH 11/88] added branch parameter to makeSourcePackage script --- build_scripts/Debian+Ubuntu/makeSourcePackage.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build_scripts/Debian+Ubuntu/makeSourcePackage.sh b/build_scripts/Debian+Ubuntu/makeSourcePackage.sh index 45c4ffc33..5cbb59f24 100755 --- a/build_scripts/Debian+Ubuntu/makeSourcePackage.sh +++ b/build_scripts/Debian+Ubuntu/makeSourcePackage.sh @@ -4,6 +4,7 @@ version="0.6.2" gitpath="https://github.com/RetroShare/RetroShare.git" workdir=retroshare06-${version} +branch="v0.6.2-official_release" #bubba3="Y" # comment out to compile for bubba3 ###################################################### @@ -66,6 +67,7 @@ echo " "Commit count : ${ccount} echo " "Date : ${date} echo " "Time : ${time} echo " "Hash : ${hhsh} +echo " "Using branch : ${branch} echo " "Using revision : ${rev} echo Done. @@ -80,7 +82,7 @@ echo Extracting base archive... mkdir -p ${workdir}/src echo Checking out latest snapshot... cd ${workdir}/src -git clone --depth 1 https://github.com/RetroShare/RetroShare.git . +git clone --depth 1 https://github.com/RetroShare/RetroShare.git --single-branch --branch $branch . cd - if ! test -d ${workdir}/src/libretroshare/; then From 21143742fd7acdc04dd6b51739f12a7cad3300b6 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 15 Mar 2017 19:26:07 +0100 Subject: [PATCH 12/88] fixed update of Tor proxy address in hidden nodes server page --- libretroshare/src/rsserver/p3peers.cc | 3 +++ retroshare-gui/src/gui/settings/ServerPage.cpp | 8 +++++++- retroshare-gui/src/gui/settings/ServerPage.h | 1 + retroshare-gui/src/gui/settings/ServerPage.ui | 4 ++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/libretroshare/src/rsserver/p3peers.cc b/libretroshare/src/rsserver/p3peers.cc index 73a5801fd..f43dfb485 100644 --- a/libretroshare/src/rsserver/p3peers.cc +++ b/libretroshare/src/rsserver/p3peers.cc @@ -1037,6 +1037,9 @@ bool p3Peers::setProxyServer(const uint32_t type, const std::string &addr_str, c std::cerr << "(EE) attempt to set proxy server address to something not allowed: " << addr_str << ":" << port << std::endl; return false ; } + + std::cerr << "Settign proxy server address to " << addr_str << ":" << port << std::endl; + struct sockaddr_storage addr; struct sockaddr_in *addrv4p = (struct sockaddr_in *) &addr; addrv4p->sin_family = AF_INET; diff --git a/retroshare-gui/src/gui/settings/ServerPage.cpp b/retroshare-gui/src/gui/settings/ServerPage.cpp index 4357f0d2c..d9dd900fb 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.cpp +++ b/retroshare-gui/src/gui/settings/ServerPage.cpp @@ -109,7 +109,7 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) connect( ui.netModeComboBox, SIGNAL( activated ( int ) ), this, SLOT( toggleUPnP( ) ) ); connect( ui.allowIpDeterminationCB, SIGNAL( toggled( bool ) ), this, SLOT( toggleIpDetermination(bool) ) ); connect( ui.cleanKnownIPs_PB, SIGNAL( clicked( ) ), this, SLOT( clearKnownAddressList() ) ); - connect( ui.testIncoming_PB, SIGNAL( clicked( ) ), this, SLOT( updateInProxyIndicator() ) ); + connect( ui.testIncoming_PB, SIGNAL( clicked( ) ), this, SLOT( saveAndTestInProxy() ) ); connect( ui.showDiscStatusBar,SIGNAL(toggled(bool)),this,SLOT(updateShowDiscStatusBar())) ; #ifdef SERVER_DEBUG @@ -132,6 +132,12 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) connect(ui.totalUploadRate, SIGNAL(valueChanged(int)),this,SLOT(saveRates())); } +void ServerPage::saveAndTestInProxy() +{ + saveAddresses(); + updateInProxyIndicator() ; +} + void ServerPage::checkIpRange(const QString& ipstr) { QColor color; diff --git a/retroshare-gui/src/gui/settings/ServerPage.h b/retroshare-gui/src/gui/settings/ServerPage.h index 02685bfc0..5b300e084 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.h +++ b/retroshare-gui/src/gui/settings/ServerPage.h @@ -61,6 +61,7 @@ private slots: // ban list void updateSelectedBlackListIP(int row, int, int, int); void updateSelectedWhiteListIP(int row,int,int,int); + void saveAndTestInProxy(); void addIpRangeToBlackList(); void addIpRangeToWhiteList(); void moveToWhiteList0(); diff --git a/retroshare-gui/src/gui/settings/ServerPage.ui b/retroshare-gui/src/gui/settings/ServerPage.ui index 3755b0536..a0f16a62b 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.ui +++ b/retroshare-gui/src/gui/settings/ServerPage.ui @@ -26,7 +26,7 @@ - 0 + 2 @@ -985,7 +985,7 @@ You can connect to Hidden Nodes, even if you are running a standard Node, so why <html><head/><body><p>This button simulates a SSL connection to your hidden address using the corresponding proxy. If your hidden node is reachable, it should cause a SSL handshake error, which RS will interpret as a valid connection state. This operation might also cause several &quot;security warning&quot; about connections from your local host IP (127.0.0.1) in the News Feed if you enabled it, which you should interpret as a sign of good communication.</p></body></html> - Test + Apply From e4fad4530d7101937e80cc8540ec78bdda0bb2ec Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 15 Mar 2017 20:51:40 +0100 Subject: [PATCH 13/88] fixed layout in ConfCertDialog, removed overnumerous tabs --- .../src/gui/connect/ConfCertDialog.cpp | 4 +- .../src/gui/connect/ConfCertDialog.ui | 280 +++++++----------- 2 files changed, 114 insertions(+), 170 deletions(-) diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.cpp b/retroshare-gui/src/gui/connect/ConfCertDialog.cpp index 958b2be54..bf66ce5ce 100644 --- a/retroshare-gui/src/gui/connect/ConfCertDialog.cpp +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.cpp @@ -239,9 +239,9 @@ void ConfCertDialog::load() ui.version->show(); ui.label_version->show(); - ui.groupBox->show(); + //ui.groupBox->show(); ui.groupBox_4->show(); - ui.tabWidget->show(); + //ui.tabWidget->show(); //ui.rsid->hide(); //ui.label_rsid->hide(); ui.pgpfingerprint->show(); diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.ui b/retroshare-gui/src/gui/connect/ConfCertDialog.ui index 469bae218..fec736831 100644 --- a/retroshare-gui/src/gui/connect/ConfCertDialog.ui +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.ui @@ -6,8 +6,8 @@ 0 0 - 722 - 651 + 1104 + 1086 @@ -69,7 +69,7 @@ - 1 + 0 @@ -85,7 +85,7 @@ - Friend info + Node info: @@ -249,6 +249,114 @@ + + + + Current address: + + + + + + + + 0 + + + 65535 + + + 7812 + + + + + + + + + + 0 + + + 65535 + + + 7812 + + + + + + + Dynamic DNS + + + + + + + + + + External Address + + + + + + + + + + Port + + + + + + + Port + + + + + + + Qt::LeftToRight + + + Local Address + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + + + + List of known addresses: + + + + + + Qt::DefaultContextMenu + + + QAbstractItemView::MultiSelection + + + + + + @@ -264,170 +372,6 @@ - - - - :/images/kcmsystem24.png:/images/kcmsystem24.png - - - Connectivity - - - - - - 1 - - - - Peer Addresses - - - - - - Peer Address - - - - - - Qt::Vertical - - - - 20 - 47 - - - - - - - - Qt::Vertical - - - - 20 - 47 - - - - - - - - - - Qt::LeftToRight - - - Local Address - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - - - External Address - - - - - - - - - - Dynamic DNS - - - - - - - - - - Port - - - - - - - Port - - - - - - - 0 - - - 65535 - - - 7812 - - - - - - - 0 - - - 65535 - - - 7812 - - - - - - - - - - - - - Addresses list - - - - - - Addresses list - - - - - - - Qt::DefaultContextMenu - - - QAbstractItemView::MultiSelection - - - - - - - - - Retroshare Certificate From 107d48f1b8152bde58c0ecfaa2c632c6c4259f7d Mon Sep 17 00:00:00 2001 From: Phenom Date: Wed, 15 Mar 2017 22:50:51 +0100 Subject: [PATCH 14/88] Fix windows height at first start. --- retroshare-gui/src/gui/common/rwindow.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/retroshare-gui/src/gui/common/rwindow.cpp b/retroshare-gui/src/gui/common/rwindow.cpp index 32cfba943..e86be7fa2 100644 --- a/retroshare-gui/src/gui/common/rwindow.cpp +++ b/retroshare-gui/src/gui/common/rwindow.cpp @@ -76,11 +76,20 @@ RWindow::restoreWindowState() m_bSaveStateOnClose = true; // now we save the window state on close #if QT_VERSION >= 0x040200 - QByteArray geometry = getSetting("Geometry", QByteArray()).toByteArray(); - if (geometry.isEmpty()) + QByteArray geo = getSetting("Geometry", QByteArray()).toByteArray(); + if (geo.isEmpty()) + { adjustSize(); + QRect rect = geometry(); + int h = fontMetrics().height()*40; + if (rect.height() Date: Thu, 16 Mar 2017 21:01:27 +0100 Subject: [PATCH 15/88] allowed to edit subject hen editing forum posts. Only the latest subject is visible --- retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index 788490e40..aaab89231 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -308,7 +308,7 @@ void CreateGxsForumMsg::loadFormInformation() ui.forumName->setText(misc::removeNewLine(name)); ui.forumSubject->setText(misc::removeNewLine(subj)); - ui.forumSubject->setReadOnly(!mOrigMsgId.isNull()); + //ui.forumSubject->setReadOnly(!mOrigMsgId.isNull()); if (ui.forumSubject->text().isEmpty()) { From 5efa8e3f3f9f4c177150e254e28dc5c430ac2fdf Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 17 Mar 2017 22:14:14 +0100 Subject: [PATCH 16/88] Fix Windows Compilation with CONFIG+=no_sqlcipher --- libretroshare/src/libretroshare.pro | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libretroshare/src/libretroshare.pro b/libretroshare/src/libretroshare.pro index 551fbf335..03c50d954 100644 --- a/libretroshare/src/libretroshare.pro +++ b/libretroshare/src/libretroshare.pro @@ -279,7 +279,12 @@ win32 { CONFIG += upnp_miniupnpc - LIBS += -lsqlcipher + no_sqlcipher { + PKGCONFIG *= sqlite3 + LIBS += -lsqlite3 + } else { + LIBS += -lsqlcipher + } DEPENDPATH += . $$INC_DIR INCLUDEPATH += . $$INC_DIR From 19bd51dfae0f9dca910b5ea7d1552b81dd9f8fc4 Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Tue, 21 Mar 2017 14:57:06 +0300 Subject: [PATCH 17/88] searchdialog - mark current downloads green --- .../src/gui/FileTransfer/SearchDialog.cpp | 18 ++++++++++++++++++ .../src/gui/FileTransfer/SearchDialog.h | 4 ++++ .../src/gui/qss/stylesheet/qss.default | 1 + 3 files changed, 23 insertions(+) diff --git a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp index 851679931..4728dde14 100644 --- a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp @@ -407,6 +407,13 @@ void SearchDialog::download() for(std::list::const_iterator it(srcIds.begin()); it!=srcIds.end(); ++it) { std::cout << *it << "-" << std::endl; }//for(std::list::const_iterator + //QColor foreground = QColor(0, 128, 0); // green + QColor foreground = textColorDownloading(); + QBrush brush(foreground); + for (int i = 0; i < item->columnCount(); ++i) + { + item->setForeground(i, brush); + } }//if(!rsFiles -> FileRequest( }//if (item->text(SR_HASH_COL).isEmpty()) }//for (int i = 0 @@ -1189,6 +1196,11 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s found = true ; if (!item->data(SR_DATA_COL, SR_ROLE_LOCAL).toBool()) { + + FileInfo fi; + if (rsFiles->FileDetails(file.hash, RS_FILE_HINTS_DOWNLOAD, fi)) + break; + QColor foreground; int sources = friendSource + anonymousSource ; @@ -1281,6 +1293,12 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s setForeground = true; } } + if (rsFiles->FileDetails(file.hash, RS_FILE_HINTS_DOWNLOAD, fi)) + { + //foreground = QColor(0, 128, 0); // green + foreground = textColorDownloading(); + setForeground = true; + } if (setForeground) { QBrush brush(foreground); diff --git a/retroshare-gui/src/gui/FileTransfer/SearchDialog.h b/retroshare-gui/src/gui/FileTransfer/SearchDialog.h index bfc5892cc..57846692c 100644 --- a/retroshare-gui/src/gui/FileTransfer/SearchDialog.h +++ b/retroshare-gui/src/gui/FileTransfer/SearchDialog.h @@ -38,6 +38,7 @@ class SearchDialog : public MainPage Q_OBJECT Q_PROPERTY(QColor textColorLocal READ textColorLocal WRITE setTextColorLocal) + Q_PROPERTY(QColor textColorDownloading READ textColorDownloading WRITE setTextColorDownloading) Q_PROPERTY(QColor textColorNoSources READ textColorNoSources WRITE setTextColorNoSources) Q_PROPERTY(QColor textColorLowSources READ textColorLowSources WRITE setTextColorLowSources) Q_PROPERTY(QColor textColorHighSources READ textColorHighSources WRITE setTextColorHighSources) @@ -51,11 +52,13 @@ public: void searchKeywords(const QString& keywords); QColor textColorLocal() const { return mTextColorLocal; } + QColor textColorDownloading() const { return mTextColorDownloading; } QColor textColorNoSources() const { return mTextColorNoSources; } QColor textColorLowSources() const { return mTextColorLowSources; } QColor textColorHighSources() const { return mTextColorHighSources; } void setTextColorLocal(QColor color) { mTextColorLocal = color; } + void setTextColorDownloading(QColor color) { mTextColorDownloading = color; } void setTextColorNoSources(QColor color) { mTextColorNoSources = color; } void setTextColorLowSources(QColor color) { mTextColorLowSources = color; } void setTextColorHighSources(QColor color) { mTextColorHighSources = color; } @@ -154,6 +157,7 @@ private: /* Color definitions (for standard see qss.default) */ QColor mTextColorLocal; + QColor mTextColorDownloading; QColor mTextColorNoSources; QColor mTextColorLowSources; QColor mTextColorHighSources; diff --git a/retroshare-gui/src/gui/qss/stylesheet/qss.default b/retroshare-gui/src/gui/qss/stylesheet/qss.default index b762d626a..db24fd45e 100644 --- a/retroshare-gui/src/gui/qss/stylesheet/qss.default +++ b/retroshare-gui/src/gui/qss/stylesheet/qss.default @@ -174,6 +174,7 @@ FriendList SearchDialog { qproperty-textColorLocal: red; + qproperty-textColorDownloading: green; qproperty-textColorNoSources: rgb(0, 0, 19); qproperty-textColorLowSources: rgb(0, 0, 38); qproperty-textColorHighSources: rgb(0, 0, 228); From 000dabfaedf733347147aa9de55ac457c4c3f6dc Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Tue, 21 Mar 2017 15:02:46 +0300 Subject: [PATCH 18/88] chat lobby list - add tree item counters --- retroshare-gui/src/gui/ChatLobbyWidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.cpp b/retroshare-gui/src/gui/ChatLobbyWidget.cpp index 07d5112be..ac197991b 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.cpp +++ b/retroshare-gui/src/gui/ChatLobbyWidget.cpp @@ -653,7 +653,9 @@ void ChatLobbyWidget::updateDisplay() updateItem(ui.lobbyTreeWidget, item, lobby.lobby_id, lobby.lobby_name,lobby.lobby_topic, lobby.gxs_ids.size(), true, autoSubscribe,lobby_flags); } publicSubLobbyItem->setHidden(publicSubLobbyItem->childCount()==0); + publicSubLobbyItem->setText(COLUMN_NAME, tr("Public Subscribed chat rooms")+ QString(" (") + QString::number(publicSubLobbyItem->childCount())+QString(")")); privateSubLobbyItem->setHidden(privateSubLobbyItem->childCount()==0); + publicLobbyItem->setText(COLUMN_NAME, tr("Public chat rooms")+ " (" + QString::number(publicLobbyItem->childCount())+QString(")")); } void ChatLobbyWidget::createChatLobby() From 50c81d7142aa3502065025b914b180571d08522b Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Tue, 21 Mar 2017 16:41:39 +0300 Subject: [PATCH 19/88] chat lobby list - mark signed lobbies with color --- retroshare-gui/src/gui/ChatLobbyWidget.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.cpp b/retroshare-gui/src/gui/ChatLobbyWidget.cpp index ac197991b..dadf04939 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.cpp +++ b/retroshare-gui/src/gui/ChatLobbyWidget.cpp @@ -378,8 +378,12 @@ static void updateItem(QTreeWidget *treeWidget, QTreeWidgetItem *item, ChatLobby +QObject::tr("Id:")+" "+QString::number(id,16) ; if(lobby_flags & RS_CHAT_LOBBY_FLAGS_PGP_SIGNED) + { tooltipstr += QObject::tr("\nSecurity: no anonymous IDs") ; - + QColor foreground = QColor(0, 128, 0); // green + for (int column = 0; column < COLUMN_COUNT; ++column) + item->setTextColor(column, foreground); + } item->setToolTip(0,tooltipstr) ; } From 85cfda196313bd12d0b92c3ac7d155faa640bd84 Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Tue, 21 Mar 2017 16:52:40 +0300 Subject: [PATCH 20/88] add tree item counters for channels,forums,posted --- retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp index 2bfdb6c0d..6ab4ca165 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp +++ b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp @@ -841,8 +841,11 @@ void GxsGroupFrameDialog::insertGroupsData(const std::list &gro /* now we can add them in as a tree! */ ui->groupTreeWidget->fillGroupItems(mYourGroups, adminList); ui->groupTreeWidget->fillGroupItems(mSubscribedGroups, subList); + mSubscribedGroups->setText(2, QString::number(mSubscribedGroups->childCount())); // 1 COLUMN_UNREAD 2 COLUMN_POPULARITY ui->groupTreeWidget->fillGroupItems(mPopularGroups, popList); + mPopularGroups->setText(2, QString::number(mPopularGroups->childCount())); ui->groupTreeWidget->fillGroupItems(mOtherGroups, otherList); + mOtherGroups->setText(2, QString::number(mOtherGroups->childCount())); mInFill = false; From f5e7217bb4e81c4bfe8b6233f047449ef7f3cd8e Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Tue, 21 Mar 2017 17:24:59 +0300 Subject: [PATCH 21/88] statistics - router - fix bold marking for tunnel speeds over 1mbs --- retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp b/retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp index 6d8a46e32..a76b5b5c3 100644 --- a/retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp +++ b/retroshare-gui/src/gui/statistics/TurtleRouterDialog.cpp @@ -153,7 +153,7 @@ void TurtleRouterDialog::updateTunnelRequests( const std::vectorsetFont(0,font); } - if(strtol(tunnels_info[i][5].c_str(), NULL, 0)>1000) // fast + if(strtof(tunnels_info[i][5].c_str(), NULL)>1000) // fast { font.setBold(true); item->setFont(0,font); From b0d2249ebcec3f7794b3204f217eced4bf957ade Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 25 Mar 2017 18:12:39 +0100 Subject: [PATCH 22/88] Added Windows support to retroshare-android-service --- .../src/retroshare-android-service.pro | 31 ++++++++++++++++++- retroshare-android-service/src/service.cpp | 10 +++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/retroshare-android-service/src/retroshare-android-service.pro b/retroshare-android-service/src/retroshare-android-service.pro index c2caa12a0..e45067f81 100644 --- a/retroshare-android-service/src/retroshare-android-service.pro +++ b/retroshare-android-service/src/retroshare-android-service.pro @@ -6,11 +6,40 @@ QT += core network QT -= gui CONFIG += c++11 -CONFIG += dll +android-g++:CONFIG += dll android-g++:TEMPLATE = lib !android-g++:TEMPLATE = app +win32 { + OBJECTS_DIR = temp/obj + + LIBS_DIR = $$PWD/../../libs/lib + LIBS += $$OUT_PWD/../../libretroshare/src/lib/libretroshare.a + LIBS += $$OUT_PWD/../../openpgpsdk/src/lib/libops.a + + for(lib, LIB_DIR):LIBS += -L"$$lib" + for(bin, BIN_DIR):LIBS += -L"$$bin" + + + LIBS += -lssl -lcrypto -lpthread -lminiupnpc -lz -lws2_32 + LIBS += -luuid -lole32 -liphlpapi -lcrypt32 -lgdi32 + LIBS += -lwinmm + + DEFINES *= WINDOWS_SYS WIN32_LEAN_AND_MEAN _USE_32BIT_TIME_T + + DEPENDPATH += . $$INC_DIR + INCLUDEPATH += . $$INC_DIR + + greaterThan(QT_MAJOR_VERSION, 4) { + # Qt 5 + RC_INCLUDEPATH += $$_PRO_FILE_PWD_/../../libretroshare/src + } else { + # Qt 4 + QMAKE_RC += --include-dir=$$_PRO_FILE_PWD_/../../libretroshare/src + } +} + SOURCES += service.cpp DEPENDPATH *= ../../libresapi/src diff --git a/retroshare-android-service/src/service.cpp b/retroshare-android-service/src/service.cpp index d3759dc61..afe73bfc3 100644 --- a/retroshare-android-service/src/service.cpp +++ b/retroshare-android-service/src/service.cpp @@ -39,11 +39,19 @@ int main(int argc, char *argv[]) #endif QCoreApplication a(argc, argv); + + RsInit::InitRsConfig(); + ApiServer api; RsControlModule ctrl_mod(argc, argv, api.getStateTokenServer(), &api, true); api.addResourceHandler("control", dynamic_cast(&ctrl_mod), &resource_api::RsControlModule::handleRequest); - QString sockPath = QString::fromStdString(RsAccounts::ConfigDirectory()); +#ifdef QT_DEBUG + QString sockPath = "RS/"; +#else + QString sockPath = QCoreApplication::applicationDirPath(); +#endif + sockPath.append("/libresapi.sock"); qDebug() << "Listening on:" << sockPath; ApiServerLocal apiServerLocal(&api, sockPath); (void) apiServerLocal; From cb041341143edaf6d5b9321d2f9208cfb857a7eb Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 25 Mar 2017 18:15:47 +0100 Subject: [PATCH 23/88] Added Windows support to libresapi when working with retroshare_android_service --- libresapi/src/libresapi.pro | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/libresapi/src/libresapi.pro b/libresapi/src/libresapi.pro index f310198fb..f1a3aa8d5 100644 --- a/libresapi/src/libresapi.pro +++ b/libresapi/src/libresapi.pro @@ -10,6 +10,40 @@ DESTDIR = lib INCLUDEPATH += ../../libretroshare/src +retroshare_android_service { + win32 { + OBJECTS_DIR = temp/obj + + LIBS_DIR = $$PWD/../../libs/lib + LIBS += $$OUT_PWD/../../libretroshare/src/lib/libretroshare.a + LIBS += $$OUT_PWD/../../openpgpsdk/src/lib/libops.a + + for(lib, LIB_DIR):LIBS += -L"$$lib" + for(bin, BIN_DIR):LIBS += -L"$$bin" + + + LIBS += -lssl -lcrypto -lpthread -lminiupnpc -lz -lws2_32 + LIBS += -luuid -lole32 -liphlpapi -lcrypt32 -lgdi32 + LIBS += -lwinmm + + DEFINES *= WINDOWS_SYS WIN32_LEAN_AND_MEAN _USE_32BIT_TIME_T + + DEPENDPATH += . $$INC_DIR + INCLUDEPATH += . $$INC_DIR + + greaterThan(QT_MAJOR_VERSION, 4) { + # Qt 5 + RC_INCLUDEPATH += $$_PRO_FILE_PWD_/../../libretroshare/src + } else { + # Qt 4 + QMAKE_RC += --include-dir=$$_PRO_FILE_PWD_/../../libretroshare/src + } + } + + DEPENDPATH += . ../../libretroshare/src/ + INCLUDEPATH += ../../libretroshare/src/ +} + libresapihttpserver { CONFIG += libmicrohttpd From ae95b49f8a1a235f8fe64632915c48b99f5d6849 Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 25 Mar 2017 18:20:53 +0100 Subject: [PATCH 24/88] Added SettingsHandler to handle response to settings requests --- libresapi/src/api/ApiServer.cpp | 10 +- libresapi/src/api/SettingsHandler.cpp | 182 ++++++++++++++++++++++++++ libresapi/src/api/SettingsHandler.h | 59 +++++++++ libresapi/src/libresapi.pro | 6 +- 4 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 libresapi/src/api/SettingsHandler.cpp create mode 100644 libresapi/src/api/SettingsHandler.h diff --git a/libresapi/src/api/ApiServer.cpp b/libresapi/src/api/ApiServer.cpp index b9606a003..593e9386a 100644 --- a/libresapi/src/api/ApiServer.cpp +++ b/libresapi/src/api/ApiServer.cpp @@ -17,6 +17,8 @@ #include "ChannelsHandler.h" #include "StatsHandler.h" +#include "SettingsHandler.h" + /* data types in json http://json.org/ string (utf-8 unicode) @@ -236,7 +238,8 @@ public: mChatHandler(sts, ifaces.mNotify, ifaces.mMsgs, ifaces.mPeers, ifaces.mIdentity, &mPeersHandler), mApiPluginHandler(sts, ifaces), mChannelsHandler(ifaces.mGxsChannels), - mStatsHandler() + mStatsHandler(), + mSettingsHandler(sts) { // the dynamic cast is to not confuse the addResourceHandler template like this: // addResourceHandler(derived class, parent class) @@ -262,7 +265,9 @@ public: &ChannelsHandler::handleRequest); router.addResourceHandler("stats", dynamic_cast(&mStatsHandler), &StatsHandler::handleRequest); - } + router.addResourceHandler("settings", dynamic_cast(&mSettingsHandler), + &SettingsHandler::handleRequest); + } PeersHandler mPeersHandler; IdentityHandler mIdentityHandler; @@ -274,6 +279,7 @@ public: ApiPluginHandler mApiPluginHandler; ChannelsHandler mChannelsHandler; StatsHandler mStatsHandler; + SettingsHandler mSettingsHandler; }; ApiServer::ApiServer(): diff --git a/libresapi/src/api/SettingsHandler.cpp b/libresapi/src/api/SettingsHandler.cpp new file mode 100644 index 000000000..6e1aa75da --- /dev/null +++ b/libresapi/src/api/SettingsHandler.cpp @@ -0,0 +1,182 @@ +#include "SettingsHandler.h" + +#include + +#include + +namespace resource_api +{ + #define SETTINGS_FILE (QString::fromUtf8(RsAccounts::AccountDirectory().c_str()) + "/Sonet.conf") + + SettingsHandler::SettingsHandler(StateTokenServer *sts, const QString settingsGroup) : + QSettings(SETTINGS_FILE, QSettings::IniFormat), + mStateTokenServer(sts), + mMtx("SettingsHandler Mutex"), + mStateToken(sts->getNewToken()) + { + RsPeerId sPreferedId; + m_bValid = RsAccounts::GetPreferredAccountId(sPreferedId); + + if (!settingsGroup.isEmpty()) + beginGroup(settingsGroup); + + addResourceHandler("*", this, &SettingsHandler::handleSettingsRequest); + addResourceHandler("get_advanced_mode", this, &SettingsHandler::handleGetAdvancedMode); + addResourceHandler("set_advanced_mode", this, &SettingsHandler::handleSetAdvancedMode); + addResourceHandler("get_flickable_grid_mode", this, &SettingsHandler::handleGetFlickableGridMode); + addResourceHandler("set_flickable_grid_mode", this, &SettingsHandler::handleSetFlickableGridMode); + addResourceHandler("get_auto_login", this, &SettingsHandler::handleGetAutoLogin); + addResourceHandler("set_auto_login", this, &SettingsHandler::handleSetAutoLogin); + } + + SettingsHandler::~SettingsHandler() + { + sync(); + } + + void SettingsHandler::handleSettingsRequest(Request &/*req*/, Response &resp) + { + + } + + void SettingsHandler::handleGetAdvancedMode(Request &/*req*/, Response &resp) + { + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + bool advanced_mode = valueFromGroup("General", "Advanced", false).toBool(); + resp.mDataStream << makeKeyValueReference("advanced_mode", advanced_mode); + resp.setOk(); + sync(); + } + + void SettingsHandler::handleSetAdvancedMode(Request &req, Response &resp) + { + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + bool advanced_mode; + req.mStream << makeKeyValueReference("advanced_mode", advanced_mode); + setValueToGroup("General", "Advanced", advanced_mode); + resp.setOk(); + sync(); + } + + void SettingsHandler::handleGetFlickableGridMode(Request &/*req*/, Response &resp) + { + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + bool flickable_grid_mode = valueFromGroup("General", "FlickableGrid", false).toBool(); + resp.mDataStream << makeKeyValueReference("flickable_grid_mode", flickable_grid_mode); + resp.setOk(); + sync(); + } + + void SettingsHandler::handleSetFlickableGridMode(Request &req, Response &resp) + { + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + bool flickable_grid_mode; + req.mStream << makeKeyValueReference("flickable_grid_mode", flickable_grid_mode); + setValueToGroup("General", "FlickableGrid", flickable_grid_mode); + + resp.setOk(); + sync(); + } + + void SettingsHandler::handleGetAutoLogin(Request &/*req*/, Response &resp) + { + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + bool autoLogin = RsInit::getAutoLogin();; + resp.mDataStream << makeKeyValueReference("auto_login", autoLogin); + resp.setOk(); + sync(); + } + + void SettingsHandler::handleSetAutoLogin(Request &req, Response &resp) + { + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + bool autoLogin; + req.mStream << makeKeyValueReference("auto_login", autoLogin); + RsInit::setAutoLogin(autoLogin); + + resp.setOk(); + sync(); + } + + QVariant SettingsHandler::value(const QString &key, const QVariant &defaultVal) const + { + if (m_bValid == false) + { + return defaultVal.isNull() ? defaultValue(key) : defaultVal; + } + return QSettings::value(key, defaultVal.isNull() ? defaultValue(key) : defaultVal); + } + + void SettingsHandler::setValue(const QString &key, const QVariant &val) + { + if (m_bValid == false) + { + std::cerr << "RSettings::setValue() Calling on invalid object, key = " << key.toStdString() << std::endl; + return; + } + if (val == defaultValue(key)) + QSettings::remove(key); + else if (val != value(key)) + QSettings::setValue(key, val); + } + + QVariant SettingsHandler::valueFromGroup(const QString &group, const QString &key, const QVariant &defaultVal) + { + beginGroup(group); + QVariant val = value(key, defaultVal); + endGroup(); + + return val; + } + + void SettingsHandler::setValueToGroup(const QString &group, const QString &key, const QVariant &val) + { + beginGroup(group); + setValue(key, val); + endGroup(); + } + + void SettingsHandler::setDefault(const QString &key, const QVariant &val) + { + _defaults.insert(key, val); + } + + QVariant SettingsHandler::defaultValue(const QString &key) const + { + if (_defaults.contains(key)) + return _defaults.value(key); + return QVariant(); + } + + void SettingsHandler::reset() + { + /* Static method, so we have to create a QSettings object. */ + QSettings settings(SETTINGS_FILE, QSettings::IniFormat); + settings.clear(); + } +} // namespace resource_api + diff --git a/libresapi/src/api/SettingsHandler.h b/libresapi/src/api/SettingsHandler.h new file mode 100644 index 000000000..b4c21fae2 --- /dev/null +++ b/libresapi/src/api/SettingsHandler.h @@ -0,0 +1,59 @@ +#ifndef SETTINGSHANDLER_H +#define SETTINGSHANDLER_H + +#include + +#include + +#include "ResourceRouter.h" +#include "StateTokenServer.h" + +/* Reimplemented class RSettings*/ +namespace resource_api +{ + class SettingsHandler : public ResourceRouter, public QSettings + { + public: + SettingsHandler(StateTokenServer* sts, const QString group = QString()); + ~SettingsHandler(); + + static void reset(); + + QVariant value(const QString &key, + const QVariant &defaultVal = QVariant()) const; + + void setValue(const QString &key, const QVariant &val); + + QVariant valueFromGroup(const QString &group, const QString &key, + const QVariant &defaultVal = QVariant()); + void setValueToGroup(const QString &group, const QString &key, + const QVariant &val); + + protected: + void setDefault(const QString &key, const QVariant &val); + QVariant defaultValue(const QString &key) const; + + bool m_bValid; + + private: + void handleSettingsRequest(Request& req, Response& resp); + + void handleGetAdvancedMode(Request& req, Response& resp); + void handleSetAdvancedMode(Request& req, Response& resp); + + void handleGetFlickableGridMode(Request& req, Response& resp); + void handleSetFlickableGridMode(Request& req, Response& resp); + + void handleGetAutoLogin(Request& req, Response& resp); + void handleSetAutoLogin(Request& req, Response& resp); + + QHash _defaults; + + StateTokenServer* mStateTokenServer; + + RsMutex mMtx; + StateToken mStateToken; // mutex protected + }; +} // namespace resource_api + +#endif // SETTINGSHANDLER_H diff --git a/libresapi/src/libresapi.pro b/libresapi/src/libresapi.pro index f1a3aa8d5..31de982b3 100644 --- a/libresapi/src/libresapi.pro +++ b/libresapi/src/libresapi.pro @@ -182,7 +182,8 @@ SOURCES += \ util/ContentTypes.cpp \ api/ApiPluginHandler.cpp \ api/ChannelsHandler.cpp \ - api/StatsHandler.cpp + api/StatsHandler.cpp \ + api/SettingsHandler.cpp HEADERS += \ api/ApiServer.h \ @@ -209,7 +210,8 @@ HEADERS += \ util/ContentTypes.h \ api/ApiPluginHandler.h \ api/ChannelsHandler.h \ - api/StatsHandler.h + api/StatsHandler.h \ + api/SettingsHandler.h libresapilocalserver { CONFIG *= qt From 39967b7ce7e62b0acaf17b96d5a32d3b91506df4 Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 25 Mar 2017 18:23:28 +0100 Subject: [PATCH 25/88] Added name of requests to be used by GUI --- libresapi/src/api/ApiServer.cpp | 3 +++ libresapi/src/api/ApiTypes.h | 3 +++ libresapi/src/api/ResourceRouter.cpp | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/libresapi/src/api/ApiServer.cpp b/libresapi/src/api/ApiServer.cpp index 593e9386a..6efadeaf6 100644 --- a/libresapi/src/api/ApiServer.cpp +++ b/libresapi/src/api/ApiServer.cpp @@ -368,6 +368,9 @@ std::string ApiServer::handleRequest(Request &request) if(data.isRawData()) return data.getRawData(); + if(!resp.mCallbackName.empty()) + outstream << resource_api::makeKeyValueReference("callback_name", resp.mCallbackName); + outstream << resource_api::makeKeyValue("debug_msg", debugString.str()); outstream << resource_api::makeKeyValueReference("returncode", returncode); if(!resp.mStateToken.isNull()) diff --git a/libresapi/src/api/ApiTypes.h b/libresapi/src/api/ApiTypes.h index c443eb170..6d6d5c746 100644 --- a/libresapi/src/api/ApiTypes.h +++ b/libresapi/src/api/ApiTypes.h @@ -252,6 +252,9 @@ public: StateToken mStateToken; + //Just for GUI benefit + std::string mCallbackName; + // the result StreamBase& mDataStream; diff --git a/libresapi/src/api/ResourceRouter.cpp b/libresapi/src/api/ResourceRouter.cpp index a13201a27..48050cdb6 100644 --- a/libresapi/src/api/ResourceRouter.cpp +++ b/libresapi/src/api/ResourceRouter.cpp @@ -37,6 +37,13 @@ ResponseTask* ResourceRouter::handleRequest(Request& req, Response& resp) if(vit->first == req.mPath.top()) { req.mPath.pop(); + + //Just for GUI benefit + std::string callbackName; + req.mStream << makeKeyValueReference("callback_name", callbackName); + resp.mCallbackName = callbackName; + // + return vit->second->handleRequest(req, resp); } } From 28d37c2968b305a2163a11d3efd1690a3ad495d0 Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 25 Mar 2017 18:25:26 +0100 Subject: [PATCH 26/88] Added password storing to RsControlModule for GUI benefits --- libresapi/src/api/RsControlModule.cpp | 135 ++++++++++++++++++++++++-- libresapi/src/api/RsControlModule.h | 10 +- 2 files changed, 135 insertions(+), 10 deletions(-) diff --git a/libresapi/src/api/RsControlModule.cpp b/libresapi/src/api/RsControlModule.cpp index 9430df170..228bb691a 100644 --- a/libresapi/src/api/RsControlModule.cpp +++ b/libresapi/src/api/RsControlModule.cpp @@ -6,6 +6,7 @@ #include #include +#include #include "api/ApiServer.h" #include "api/Operators.h" @@ -301,6 +302,7 @@ void RsControlModule::handlePassword(Request &req, Response &resp) mPassword = passwd; mWantPassword = false; mStateTokenServer->replaceToken(mStateToken); + mFixedPassword = passwd; } resp.mDataStream @@ -425,17 +427,17 @@ void RsControlModule::handleCreateLocation(Request &req, Response &resp) RsPeerId ssl_id; std::string err_string; // give the password to the password callback - { - RsStackMutex stack(mDataMtx); // ********** LOCKED ********** - mFixedPassword = pgp_password; - } + { + RsStackMutex stack(mDataMtx); // ********** LOCKED ********** + mFixedPassword = pgp_password; + } bool ssl_ok = RsAccounts::GenerateSSLCertificate(pgp_id, "", ssl_name, "", hidden_port!=0, ssl_password, ssl_id, err_string); // clear fixed password to restore normal password operation - { - RsStackMutex stack(mDataMtx); // ********** LOCKED ********** - mFixedPassword = ""; - } +// { +// RsStackMutex stack(mDataMtx); // ********** LOCKED ********** +// mFixedPassword = ""; +// } if (ssl_ok) { @@ -456,6 +458,123 @@ void RsControlModule::handleCreateLocation(Request &req, Response &resp) resp.setFail("could not create a new location. Error: "+err_string); } +class SignatureEventData +{ + public: + SignatureEventData(const void *_data,int32_t _len,unsigned int _signlen, std::string _reason) + { + // We need a new memory chnk because there's no guarranty _sign nor _signlen are not in the stack + + sign = (unsigned char *)rs_malloc(_signlen); + + if(!sign) + { + signlen = NULL; + signature_result = SELF_SIGNATURE_RESULT_FAILED; + return; + } + + signlen = new unsigned int; + *signlen = _signlen; + signature_result = SELF_SIGNATURE_RESULT_PENDING; + data = rs_malloc(_len); + + if(!data) + { + len = 0; + return; + } + len = _len; + memcpy(data,_data,len); + reason = _reason; + } + + ~SignatureEventData() + { + free(sign); + delete signlen; + free(data); + } + + void performSignature() + { + if(rsPeers->gpgSignData(data,len,sign,signlen,reason)) + signature_result = SELF_SIGNATURE_RESULT_SUCCESS; + else + signature_result = SELF_SIGNATURE_RESULT_FAILED; + } + + void *data; + uint32_t len; + unsigned char *sign; + unsigned int *signlen; + int signature_result; // 0=pending, 1=done, 2=failed/cancelled. + std::string reason; +}; + +bool RsControlModule::askForDeferredSelfSignature(const void *data, const uint32_t len, unsigned char *sign, unsigned int *signlen,int& signature_result, std::string reason /*=""*/) +{ + + { + RsStackMutex stack(mDataMtx); + std::cerr << "NotifyTxt:: deferred signature event requeted. " << std::endl; + + // Look into the queue + + Sha1CheckSum chksum = RsDirUtil::sha1sum((uint8_t*)data,len); + + std::map::iterator it = _deferred_signature_queue.find(chksum.toStdString()); + signature_result = SELF_SIGNATURE_RESULT_PENDING; + + if(it != _deferred_signature_queue.end()) + { + signature_result = it->second->signature_result; + + if(it->second->signature_result != SELF_SIGNATURE_RESULT_PENDING) // found it. Copy the result, and remove from the queue. + { + // We should check for the exact data match, for the sake of being totally secure. + // + std::cerr << "Found into queue: returning it" << std::endl; + + memcpy(sign,it->second->sign,*it->second->signlen); + *signlen = *(it->second->signlen); + + delete it->second; + _deferred_signature_queue.erase(it); + } + + return true; // already registered, but not done yet. + } + + // Not found. Store in the queue and emit a signal. + // + std::cerr << "NotifyTxt:: deferred signature event requeted. Pushing into queue" << std::endl; + + SignatureEventData *edta = new SignatureEventData(data,len,*signlen, reason); + + _deferred_signature_queue[chksum.toStdString()] = edta; + } + handleSignatureEvent(); + return true; +} + +void RsControlModule::handleSignatureEvent() +{ + std::cerr << "NotifyTxt:: performing a deferred signature in the main GUI thread." << std::endl; + + static bool working = false ; + + if(!working) + { + working = true ; + + for(std::map::const_iterator it(_deferred_signature_queue.begin());it!=_deferred_signature_queue.end();++it) + it->second->performSignature() ; + + working = false ; + } +} + void RsControlModule::setRunState(RunState s, std::string errstr) { RsStackMutex stack(mDataMtx); // ********** LOCKED ********** diff --git a/libresapi/src/api/RsControlModule.h b/libresapi/src/api/RsControlModule.h index d3c8ad18b..338027e15 100644 --- a/libresapi/src/api/RsControlModule.h +++ b/libresapi/src/api/RsControlModule.h @@ -9,6 +9,8 @@ namespace resource_api{ class StateTokenServer; class ApiServer; +class SignatureEventData; + // resource api module to control accounts, startup and shutdown of retroshare // - this module handles everything, no things are required from outside // - exception: users of this module have to create an api server and register this module @@ -31,8 +33,9 @@ public: // returns true if the process should terminate bool processShouldExit(); - // from NotifyClient - virtual bool askForPassword(const std::string &title, const std::string& key_details, bool prev_is_bad , std::string& password,bool& canceled); + // from NotifyClient + virtual bool askForPassword(const std::string &title, const std::string& key_details, bool prev_is_bad , std::string& password,bool& canceled) override; + virtual bool askForDeferredSelfSignature(const void *data, const uint32_t len, unsigned char *sign, unsigned int *signlen,int& signature_result, std::string reason = "") override; protected: // from RsThread @@ -84,6 +87,9 @@ private: // we store the password in this variable, it has higher priority than the normal password variable // it is also to avoid a lock, when we make a synchronous call into librs, like in ssl cert generation std::string mFixedPassword; + + void handleSignatureEvent(); + std::map _deferred_signature_queue ; }; } // namespace resource_api From cb32f304a98e9ca953b4ec5c478730fb905d042a Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 25 Mar 2017 18:28:31 +0100 Subject: [PATCH 27/88] Added states handling to PeersHandler --- libresapi/src/api/PeersHandler.cpp | 226 ++++++++++++++++++++++++++++- libresapi/src/api/PeersHandler.h | 6 + 2 files changed, 228 insertions(+), 4 deletions(-) diff --git a/libresapi/src/api/PeersHandler.cpp b/libresapi/src/api/PeersHandler.cpp index 0f35e59e9..d77a39651 100644 --- a/libresapi/src/api/PeersHandler.cpp +++ b/libresapi/src/api/PeersHandler.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -12,6 +13,12 @@ namespace resource_api { +#define PEER_STATE_ONLINE 1 +#define PEER_STATE_BUSY 2 +#define PEER_STATE_AWAY 3 +#define PEER_STATE_AVAILABLE 4 +#define PEER_STATE_INACTIVE 5 +#define PEER_STATE_OFFLINE 6 // todo: groups, add friend, remove friend, permissions void peerDetailsToStream(StreamBase& stream, RsPeerDetails& details) @@ -21,7 +28,50 @@ void peerDetailsToStream(StreamBase& stream, RsPeerDetails& details) << makeKeyValueReference("name", details.name) << makeKeyValueReference("location", details.location) << makeKeyValueReference("pgp_id", details.gpg_id) - ; + << makeKeyValueReference("pgp_id", details.gpg_id); + + if(details.state & RS_PEER_STATE_CONNECTED) + { + std::list statusInfo; + rsStatus->getStatusList(statusInfo); + + std::string state_string; + std::list::iterator it; + for (it = statusInfo.begin(); it != statusInfo.end(); ++it) + { + if (it->id == details.id) + { + switch (it->status) + { + case RS_STATUS_INACTIVE: + state_string = "inactive"; + break; + + case RS_STATUS_ONLINE: + state_string = "online"; + break; + + case RS_STATUS_AWAY: + state_string = "away"; + break; + + case RS_STATUS_BUSY: + state_string = "busy"; + break; + default: + state_string = "undefined"; + break; + } + break; + } + } + stream << makeKeyValueReference("state_string", state_string); + } + else + { + std::string state_string = "undefined"; + stream << makeKeyValueReference("state_string", state_string); + } } bool peerInfoToStream(StreamBase& stream, RsPeerDetails& details, RsPeers* peers, std::list& grpInfo, bool have_avatar) @@ -29,7 +79,9 @@ bool peerInfoToStream(StreamBase& stream, RsPeerDetails& details, RsPeers* peers bool ok = true; peerDetailsToStream(stream, details); stream << makeKeyValue("is_online", peers->isOnline(details.id)) - << makeKeyValue("chat_id", ChatId(details.id).toStdString()); + << makeKeyValue("chat_id", ChatId(details.id).toStdString()) + << makeKeyValue("custom_state_string", rsMsgs->getCustomStateString(details.id)); + std::string avatar_address = "/"+details.id.toStdString()+"/avatar_image"; @@ -63,7 +115,11 @@ PeersHandler::PeersHandler(StateTokenServer* sts, RsNotify* notify, RsPeers *pee mNotify->registerNotifyClient(this); mStateTokenServer->registerTickClient(this); addResourceHandler("*", this, &PeersHandler::handleWildcard); - addResourceHandler("examine_cert", this, &PeersHandler::handleExamineCert); + addResourceHandler("get_state_string", this, &PeersHandler::handleGetStateString); + addResourceHandler("set_state_string", this, &PeersHandler::handleSetStateString); + addResourceHandler("get_custom_state_string", this, &PeersHandler::handleGetCustomStateString); + addResourceHandler("set_custom_state_string", this, &PeersHandler::handleSetCustomStateString); + addResourceHandler("examine_cert", this, &PeersHandler::handleExamineCert); } PeersHandler::~PeersHandler() @@ -121,6 +177,83 @@ static bool have_avatar(RsMsgs* msgs, const RsPeerId& id) return size != 0; } +void PeersHandler::handleGetStateString(Request& req, Response& resp) +{ + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + std::string state_string; + StatusInfo statusInfo; + if (rsStatus->getOwnStatus(statusInfo)) + { + if(statusInfo.status == RS_STATUS_ONLINE) + state_string = "online"; + else if(statusInfo.status == RS_STATUS_BUSY) + state_string = "busy"; + else if(statusInfo.status == RS_STATUS_AWAY) + state_string = "away"; + else if(statusInfo.status == RS_STATUS_INACTIVE) + state_string = "inactive"; + else + state_string = "undefined"; + } + else + state_string = "undefined"; + + resp.mDataStream << makeKeyValueReference("state_string", state_string); + resp.setOk(); +} + +void PeersHandler::handleSetStateString(Request& req, Response& resp) +{ + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + std::string state_string; + req.mStream << makeKeyValueReference("state_string", state_string); + + uint32_t status; + if(state_string == "online") + status = RS_STATUS_ONLINE; + else if(state_string == "busy") + status = RS_STATUS_BUSY; + else if(state_string == "away") + status = RS_STATUS_AWAY; + + rsStatus->sendStatus(RsPeerId(), status); + resp.setOk(); +} + +void PeersHandler::handleGetCustomStateString(Request& req, Response& resp) +{ + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + std::string custom_state_string = rsMsgs->getCustomStateString(); + resp.mDataStream << makeKeyValueReference("custom_state_string", custom_state_string); + resp.setOk(); +} + +void PeersHandler::handleSetCustomStateString(Request& req, Response& resp) +{ + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + + std::string custom_state_string; + req.mStream << makeKeyValueReference("custom_state_string", custom_state_string); + + rsMsgs->setCustomStateString(custom_state_string); + resp.setOk(); +} + void PeersHandler::handleWildcard(Request &req, Response &resp) { bool ok = false; @@ -176,6 +309,9 @@ void PeersHandler::handleWildcard(Request &req, Response &resp) RsStackMutex stack(mMtx); /********** STACK LOCKED MTX ******/ unread_msgs = mUnreadMsgsCounts; } + std::list statusInfo; + rsStatus->getStatusList(statusInfo); + // list all peers ok = true; std::list identities; @@ -216,6 +352,11 @@ void PeersHandler::handleWildcard(Request &req, Response &resp) StreamBase& locationStream = itemStream.getStreamToMember("locations"); // mark as list (in case list is empty) locationStream.getStreamToMember(); + + int bestPeerState = 0; + unsigned int bestRSState = 0; + std::string bestCustomStateString; + for(std::vector::iterator vit = detailsVec.begin(); vit != detailsVec.end(); ++vit) { if(vit->gpg_id == *lit) @@ -226,8 +367,85 @@ void PeersHandler::handleWildcard(Request &req, Response &resp) unread = unread_msgs.find(vit->id)->second; stream << makeKeyValueReference("unread_msgs", unread); peerInfoToStream(stream,*vit, mRsPeers, grpInfo, have_avatar(mRsMsgs, vit->id)); - } + + + /* Custom state string */ + std::string customStateString; + if (vit->state & RS_PEER_STATE_CONNECTED) + { + customStateString = rsMsgs->getCustomStateString(vit->id); + } + + int peerState = 0; + + if (vit->state & RS_PEER_STATE_CONNECTED) + { + // get the status info for this ssl id + int rsState = 0; + std::list::iterator it; + for (it = statusInfo.begin(); it != statusInfo.end(); ++it) + { + if (it->id == vit->id) + { + rsState = it->status; + switch (rsState) + { + case RS_STATUS_INACTIVE: + peerState = PEER_STATE_INACTIVE; + break; + + case RS_STATUS_ONLINE: + peerState = PEER_STATE_ONLINE; + break; + + case RS_STATUS_AWAY: + peerState = PEER_STATE_AWAY; + break; + + case RS_STATUS_BUSY: + peerState = PEER_STATE_BUSY; + break; + } + + /* find the best ssl contact for the gpg item */ + if (bestPeerState == 0 || peerState < bestPeerState) + { + bestPeerState = peerState; + bestRSState = rsState; + bestCustomStateString = customStateString; + } + else if (peerState == bestPeerState) + { + /* equal state */ + if (bestCustomStateString.empty() && !customStateString.empty()) + { + bestPeerState = peerState; + bestRSState = rsState; + bestCustomStateString = customStateString; + } + } + break; + } + } + } + } } + itemStream << makeKeyValue("custom_state_string", bestCustomStateString); + + std::string state_string; + + if(bestRSState == RS_STATUS_ONLINE) + state_string = "online"; + else if(bestRSState == RS_STATUS_BUSY) + state_string = "busy"; + else if(bestRSState == RS_STATUS_AWAY) + state_string = "away"; + else if(bestRSState == RS_STATUS_INACTIVE) + state_string = "inactive"; + else + state_string = "undefined"; + + itemStream << makeKeyValue("state_string", state_string); } resp.mStateToken = getCurrentStateToken(); } diff --git a/libresapi/src/api/PeersHandler.h b/libresapi/src/api/PeersHandler.h index dfcc9e10c..a2eab706b 100644 --- a/libresapi/src/api/PeersHandler.h +++ b/libresapi/src/api/PeersHandler.h @@ -35,6 +35,12 @@ private: void handleWildcard(Request& req, Response& resp); void handleExamineCert(Request& req, Response& resp); + void handleGetStateString(Request& req, Response& resp); + void handleSetStateString(Request& req, Response& resp); + + void handleGetCustomStateString(Request& req, Response& resp); + void handleSetCustomStateString(Request& req, Response& resp); + // a helper which ensures proper mutex locking StateToken getCurrentStateToken(); From 194878a3585bda4c53862269e7862c39bd901945 Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 25 Mar 2017 18:31:13 +0100 Subject: [PATCH 28/88] Added functions for handling own and not own identities to IdentityHandler --- libresapi/src/api/IdentityHandler.cpp | 115 +++++++++++++++++++++++++- libresapi/src/api/IdentityHandler.h | 3 + 2 files changed, 115 insertions(+), 3 deletions(-) diff --git a/libresapi/src/api/IdentityHandler.cpp b/libresapi/src/api/IdentityHandler.cpp index 4d3f0ff80..9f01442df 100644 --- a/libresapi/src/api/IdentityHandler.cpp +++ b/libresapi/src/api/IdentityHandler.cpp @@ -101,9 +101,12 @@ IdentityHandler::IdentityHandler(StateTokenServer *sts, RsNotify *notify, RsIden { mNotify->registerNotifyClient(this); - addResourceHandler("*", this, &IdentityHandler::handleWildcard); - addResourceHandler("own", this, &IdentityHandler::handleOwn); - addResourceHandler("create_identity", this, &IdentityHandler::handleCreateIdentity); + addResourceHandler("*", this, &IdentityHandler::handleWildcard); + //addResourceHandler("own", this, &IdentityHandler::handleOwn); + addResourceHandler("own", this, &IdentityHandler::handleOwnIdsRequest); + addResourceHandler("notown", this, &IdentityHandler::handleNotOwnIdsRequest); + + addResourceHandler("create_identity", this, &IdentityHandler::handleCreateIdentity); } IdentityHandler::~IdentityHandler() @@ -172,6 +175,112 @@ void IdentityHandler::handleWildcard(Request & /*req*/, Response &resp) else resp.setFail(); } + +void IdentityHandler::handleNotOwnIdsRequest(Request & /*req*/, Response &resp) +{ + bool ok = true; + + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA; + uint32_t token; + mRsIdentity->getTokenService()->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts); + + time_t start = time(NULL); + while((mRsIdentity->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE) + &&(mRsIdentity->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_FAILED) + &&((time(NULL) < (start+10))) + ) + { +#ifdef WINDOWS_SYS + Sleep(500); +#else + usleep(500*1000); +#endif + } + + if(mRsIdentity->getTokenService()->requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE) + { + std::vector grps; + ok &= mRsIdentity->getGroupData(token, grps); + for(std::vector::iterator vit = grps.begin(); vit != grps.end(); vit++) + { + RsGxsIdGroup& grp = *vit; + //electron: not very happy about this, i think the flags should stay hidden in rsidentities + if(!(grp.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) && grp.mIsAContact) + { + bool pgp_linked = (grp.mMeta.mGroupFlags & RSGXSID_GROUPFLAG_REALID_kept_for_compatibility ) ; + resp.mDataStream.getStreamToMember() + << makeKeyValueReference("id", grp.mMeta.mGroupId) /// @deprecated using "id" as key can cause problems in some JS based languages like Qml @see gxs_id instead + << makeKeyValueReference("gxs_id", grp.mMeta.mGroupId) + << makeKeyValueReference("pgp_id",grp.mPgpId ) + << makeKeyValueReference("name", grp.mMeta.mGroupName) + << makeKeyValueReference("pgp_linked", pgp_linked); + } + } + } + else ok = false; + + if(ok) resp.setOk(); + else resp.setFail(); +} + +void IdentityHandler::handleOwnIdsRequest(Request & /*req*/, Response &resp) +{ + bool ok = true; + + { + RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStateToken; + } + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA; + uint32_t token; + mRsIdentity->getTokenService()->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts); + + time_t start = time(NULL); + while((mRsIdentity->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE) + &&(mRsIdentity->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_FAILED) + &&((time(NULL) < (start+10))) + ) + { +#ifdef WINDOWS_SYS + Sleep(500); +#else + usleep(500*1000); +#endif + } + + if(mRsIdentity->getTokenService()->requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE) + { + std::vector grps; + ok &= mRsIdentity->getGroupData(token, grps); + for(std::vector::iterator vit = grps.begin(); vit != grps.end(); vit++) + { + RsGxsIdGroup& grp = *vit; + //electron: not very happy about this, i think the flags should stay hidden in rsidentities + if(vit->mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) + { + bool pgp_linked = (grp.mMeta.mGroupFlags & RSGXSID_GROUPFLAG_REALID_kept_for_compatibility ) ; + resp.mDataStream.getStreamToMember() + << makeKeyValueReference("own_gxs_id", grp.mMeta.mGroupId) + << makeKeyValueReference("pgp_id",grp.mPgpId ) + << makeKeyValueReference("name", grp.mMeta.mGroupName) + << makeKeyValueReference("pgp_linked", pgp_linked); + } + } + + } + else + ok = false; + + if(ok) resp.setOk(); + else resp.setFail(); +} + ResponseTask* IdentityHandler::handleOwn(Request & /* req */, Response &resp) { StateToken state; diff --git a/libresapi/src/api/IdentityHandler.h b/libresapi/src/api/IdentityHandler.h index 5e5d67f13..1b54f5438 100644 --- a/libresapi/src/api/IdentityHandler.h +++ b/libresapi/src/api/IdentityHandler.h @@ -23,6 +23,9 @@ public: private: void handleWildcard(Request& req, Response& resp); + void handleNotOwnIdsRequest(Request& req, Response& resp); + void handleOwnIdsRequest(Request& req, Response& resp); + ResponseTask *handleOwn(Request& req, Response& resp); ResponseTask *handleCreateIdentity(Request& req, Response& resp); From 8624c9374de788394df09b5acb8913019302adf0 Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 25 Mar 2017 18:33:35 +0100 Subject: [PATCH 29/88] Added functions for hadling particular lobbies types to ChatHandler --- libresapi/src/api/ChatHandler.cpp | 107 ++++++++++++++++++++++++++++-- libresapi/src/api/ChatHandler.h | 4 ++ 2 files changed, 106 insertions(+), 5 deletions(-) diff --git a/libresapi/src/api/ChatHandler.cpp b/libresapi/src/api/ChatHandler.cpp index 4335389df..f50eaae9e 100644 --- a/libresapi/src/api/ChatHandler.cpp +++ b/libresapi/src/api/ChatHandler.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -158,6 +159,10 @@ ChatHandler::ChatHandler(StateTokenServer *sts, RsNotify *notify, RsMsgs *msgs, addResourceHandler("initiate_distant_chat", this, &ChatHandler::handleInitiateDistantChatConnexion); addResourceHandler("distant_chat_status", this, &ChatHandler::handleDistantChatStatus); addResourceHandler("close_distant_chat", this, &ChatHandler::handleCloseDistantChatConnexion); + + addResourceHandler("private_lobbies", this, &ChatHandler::handlePrivateLobbies); + addResourceHandler("subscribed_public_lobbies", this, &ChatHandler::handleSubscribedPublicLobbies); + addResourceHandler("unsubscribed_public_lobbies", this, &ChatHandler::handleUnsubscribedPublicLobbies); } ChatHandler::~ChatHandler() @@ -928,15 +933,19 @@ void ChatHandler::handleMessages(Request &req, Response &resp) * doing it? */ tick(); + std::string chat_id; + req.mStream << makeKeyValueReference("chat_id", chat_id); + ChatId id(chat_id); + { RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ - ChatId id(req.mPath.top()); + // make response a list resp.mDataStream.getStreamToMember(); if(id.isNotSet()) { - resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id"); - return; + resp.setFail("\""+chat_id+"\" is not a valid chat id"); + return; } std::map >::iterator mit = mMsgs.find(id); if(mit == mMsgs.end()) @@ -973,10 +982,14 @@ void ChatHandler::handleSendMessage(Request &req, Response &resp) void ChatHandler::handleMarkChatAsRead(Request &req, Response &resp) { RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ - ChatId id(req.mPath.top()); + + std::string chat_id; + req.mStream << makeKeyValueReference("chat_id", chat_id); + ChatId id(chat_id); + if(id.isNotSet()) { - resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id"); + resp.setFail("\""+chat_id+"\" is not a valid chat id"); return; } std::map >::iterator mit = mMsgs.find(id); @@ -1197,4 +1210,88 @@ void ChatHandler::handleCloseDistantChatConnexion(Request& req, Response& resp) else resp.setFail("Failed to close distant chat"); } +void ChatHandler::handlePrivateLobbies(Request &req, Response &resp) +{ + tick(); + + { + RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ + resp.mDataStream.getStreamToMember(); + for(std::vector::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit) + { + if(!vit->is_private) + continue; + uint32_t unread_msgs = 0; + ChatId chat_id(vit->id); + std::map >::iterator mit = mMsgs.find(chat_id); + if(mit != mMsgs.end()) + { + std::list& msgs = mit->second; + for(std::list::iterator lit = msgs.begin(); lit != msgs.end(); ++lit) + if(!lit->read) + unread_msgs++; + } + resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs); + } + resp.mStateToken = mLobbiesStateToken; + } + resp.setOk(); +} + +void ChatHandler::handleSubscribedPublicLobbies(Request &req, Response &resp) +{ + tick(); + + { + RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ + resp.mDataStream.getStreamToMember(); + for(std::vector::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit) + { + if(!vit->subscribed || vit->is_private || vit->is_broadcast) + continue; + uint32_t unread_msgs = 0; + ChatId chat_id(vit->id); + std::map >::iterator mit = mMsgs.find(chat_id); + if(mit != mMsgs.end()) + { + std::list& msgs = mit->second; + for(std::list::iterator lit = msgs.begin(); lit != msgs.end(); ++lit) + if(!lit->read) + unread_msgs++; + } + resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs); + } + resp.mStateToken = mLobbiesStateToken; + } + resp.setOk(); +} + +void ChatHandler::handleUnsubscribedPublicLobbies(Request &req, Response &resp) +{ + tick(); + + { + RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ + resp.mDataStream.getStreamToMember(); + for(std::vector::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit) + { + if(vit->subscribed || vit->is_private) + continue; + uint32_t unread_msgs = 0; + ChatId chat_id(vit->id); + std::map >::iterator mit = mMsgs.find(chat_id); + if(mit != mMsgs.end()) + { + std::list& msgs = mit->second; + for(std::list::iterator lit = msgs.begin(); lit != msgs.end(); ++lit) + if(!lit->read) + unread_msgs++; + } + resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs); + } + resp.mStateToken = mLobbiesStateToken; + } + resp.setOk(); +} + } // namespace resource_api diff --git a/libresapi/src/api/ChatHandler.h b/libresapi/src/api/ChatHandler.h index dc075c77f..056629c06 100644 --- a/libresapi/src/api/ChatHandler.h +++ b/libresapi/src/api/ChatHandler.h @@ -133,6 +133,10 @@ private: void handleDistantChatStatus(Request& req, Response& resp); void handleCloseDistantChatConnexion(Request& req, Response& resp); + void handlePrivateLobbies(Request &req, Response &resp); + void handleSubscribedPublicLobbies(Request &req, Response &resp); + void handleUnsubscribedPublicLobbies(Request &req, Response &resp); + void getPlainText(const std::string& in, std::string &out, std::vector &links); // last parameter is only used for lobbies! void locked_storeTypingInfo(const ChatId& chat_id, std::string status, RsGxsId lobby_gxs_id = RsGxsId()); From bef75408da0d4c58e996f02b6ac34daca0672110 Mon Sep 17 00:00:00 2001 From: Konrad Date: Sun, 26 Mar 2017 15:11:07 +0200 Subject: [PATCH 30/88] Fixed building on Travis CI --- libresapi/src/libresapi.pro | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libresapi/src/libresapi.pro b/libresapi/src/libresapi.pro index 31de982b3..33c4f726c 100644 --- a/libresapi/src/libresapi.pro +++ b/libresapi/src/libresapi.pro @@ -3,7 +3,8 @@ TEMPLATE = lib CONFIG += staticlib CONFIG += create_prl -CONFIG -= qt +CONFIG += qt +QT += core TARGET = resapi TARGET_PRL = libresapi DESTDIR = lib From c33107c1cc4bc17cf154c33039690e6047eff72a Mon Sep 17 00:00:00 2001 From: Konrad Date: Sun, 26 Mar 2017 19:12:04 +0200 Subject: [PATCH 31/88] Fixed: backward comptiblity --- libresapi/src/api/ChatHandler.cpp | 14 ++++---------- libresapi/src/api/IdentityHandler.cpp | 7 ++++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/libresapi/src/api/ChatHandler.cpp b/libresapi/src/api/ChatHandler.cpp index f50eaae9e..68f0bd356 100644 --- a/libresapi/src/api/ChatHandler.cpp +++ b/libresapi/src/api/ChatHandler.cpp @@ -933,18 +933,15 @@ void ChatHandler::handleMessages(Request &req, Response &resp) * doing it? */ tick(); - std::string chat_id; - req.mStream << makeKeyValueReference("chat_id", chat_id); - ChatId id(chat_id); - { RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ + ChatId id(req.mPath.top()); // make response a list resp.mDataStream.getStreamToMember(); if(id.isNotSet()) { - resp.setFail("\""+chat_id+"\" is not a valid chat id"); + resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id"); return; } std::map >::iterator mit = mMsgs.find(id); @@ -982,14 +979,11 @@ void ChatHandler::handleSendMessage(Request &req, Response &resp) void ChatHandler::handleMarkChatAsRead(Request &req, Response &resp) { RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ - - std::string chat_id; - req.mStream << makeKeyValueReference("chat_id", chat_id); - ChatId id(chat_id); + ChatId id(req.mPath.top()); if(id.isNotSet()) { - resp.setFail("\""+chat_id+"\" is not a valid chat id"); + resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id"); return; } std::map >::iterator mit = mMsgs.find(id); diff --git a/libresapi/src/api/IdentityHandler.cpp b/libresapi/src/api/IdentityHandler.cpp index 9f01442df..1a43211ea 100644 --- a/libresapi/src/api/IdentityHandler.cpp +++ b/libresapi/src/api/IdentityHandler.cpp @@ -102,9 +102,10 @@ IdentityHandler::IdentityHandler(StateTokenServer *sts, RsNotify *notify, RsIden mNotify->registerNotifyClient(this); addResourceHandler("*", this, &IdentityHandler::handleWildcard); - //addResourceHandler("own", this, &IdentityHandler::handleOwn); - addResourceHandler("own", this, &IdentityHandler::handleOwnIdsRequest); - addResourceHandler("notown", this, &IdentityHandler::handleNotOwnIdsRequest); + addResourceHandler("own", this, &IdentityHandler::handleOwn); + + addResourceHandler("own_ids", this, &IdentityHandler::handleOwnIdsRequest); + addResourceHandler("notown_ids", this, &IdentityHandler::handleNotOwnIdsRequest); addResourceHandler("create_identity", this, &IdentityHandler::handleCreateIdentity); } From 4031e493fba5c275e3b9d7c89630e5bdc3da56bd Mon Sep 17 00:00:00 2001 From: Konrad Date: Mon, 27 Mar 2017 16:11:04 +0200 Subject: [PATCH 32/88] Deleted: unused stateTokens --- libresapi/src/api/PeersHandler.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libresapi/src/api/PeersHandler.cpp b/libresapi/src/api/PeersHandler.cpp index d77a39651..b8fdc913d 100644 --- a/libresapi/src/api/PeersHandler.cpp +++ b/libresapi/src/api/PeersHandler.cpp @@ -181,7 +181,6 @@ void PeersHandler::handleGetStateString(Request& req, Response& resp) { { RS_STACK_MUTEX(mMtx); - resp.mStateToken = mStateToken; } std::string state_string; @@ -210,7 +209,6 @@ void PeersHandler::handleSetStateString(Request& req, Response& resp) { { RS_STACK_MUTEX(mMtx); - resp.mStateToken = mStateToken; } std::string state_string; @@ -232,7 +230,6 @@ void PeersHandler::handleGetCustomStateString(Request& req, Response& resp) { { RS_STACK_MUTEX(mMtx); - resp.mStateToken = mStateToken; } std::string custom_state_string = rsMsgs->getCustomStateString(); @@ -244,7 +241,6 @@ void PeersHandler::handleSetCustomStateString(Request& req, Response& resp) { { RS_STACK_MUTEX(mMtx); - resp.mStateToken = mStateToken; } std::string custom_state_string; From 569458a1c1847f42dca8556e92a9275af1a13a4b Mon Sep 17 00:00:00 2001 From: Konrad Date: Tue, 28 Mar 2017 11:18:27 +0200 Subject: [PATCH 33/88] Changed: Qt dependecies are optional --- libresapi/src/api/ApiServer.cpp | 15 +++++++-- libresapi/src/libresapi.pro | 55 ++++++++++++++++++--------------- retroshare.pri | 6 ++++ 3 files changed, 48 insertions(+), 28 deletions(-) diff --git a/libresapi/src/api/ApiServer.cpp b/libresapi/src/api/ApiServer.cpp index 6efadeaf6..327dd6260 100644 --- a/libresapi/src/api/ApiServer.cpp +++ b/libresapi/src/api/ApiServer.cpp @@ -17,7 +17,9 @@ #include "ChannelsHandler.h" #include "StatsHandler.h" -#include "SettingsHandler.h" +#ifdef LIBRESAPI_QT + #include "SettingsHandler.h" +#endif /* data types in json http://json.org/ @@ -238,8 +240,10 @@ public: mChatHandler(sts, ifaces.mNotify, ifaces.mMsgs, ifaces.mPeers, ifaces.mIdentity, &mPeersHandler), mApiPluginHandler(sts, ifaces), mChannelsHandler(ifaces.mGxsChannels), - mStatsHandler(), - mSettingsHandler(sts) + mStatsHandler() +#ifdef LIBRESAPI_QT + ,mSettingsHandler(sts) +#endif { // the dynamic cast is to not confuse the addResourceHandler template like this: // addResourceHandler(derived class, parent class) @@ -265,8 +269,10 @@ public: &ChannelsHandler::handleRequest); router.addResourceHandler("stats", dynamic_cast(&mStatsHandler), &StatsHandler::handleRequest); +#ifdef LIBRESAPI_QT router.addResourceHandler("settings", dynamic_cast(&mSettingsHandler), &SettingsHandler::handleRequest); +#endif } PeersHandler mPeersHandler; @@ -279,7 +285,10 @@ public: ApiPluginHandler mApiPluginHandler; ChannelsHandler mChannelsHandler; StatsHandler mStatsHandler; + +#ifdef LIBRESAPI_QT SettingsHandler mSettingsHandler; +#endif }; ApiServer::ApiServer(): diff --git a/libresapi/src/libresapi.pro b/libresapi/src/libresapi.pro index 33c4f726c..e548ea9d0 100644 --- a/libresapi/src/libresapi.pro +++ b/libresapi/src/libresapi.pro @@ -3,8 +3,7 @@ TEMPLATE = lib CONFIG += staticlib CONFIG += create_prl -CONFIG += qt -QT += core +CONFIG -= qt TARGET = resapi TARGET_PRL = libresapi DESTDIR = lib @@ -13,32 +12,32 @@ INCLUDEPATH += ../../libretroshare/src retroshare_android_service { win32 { - OBJECTS_DIR = temp/obj + OBJECTS_DIR = temp/obj - LIBS_DIR = $$PWD/../../libs/lib - LIBS += $$OUT_PWD/../../libretroshare/src/lib/libretroshare.a - LIBS += $$OUT_PWD/../../openpgpsdk/src/lib/libops.a + LIBS_DIR = $$PWD/../../libs/lib + LIBS += $$OUT_PWD/../../libretroshare/src/lib/libretroshare.a + LIBS += $$OUT_PWD/../../openpgpsdk/src/lib/libops.a - for(lib, LIB_DIR):LIBS += -L"$$lib" - for(bin, BIN_DIR):LIBS += -L"$$bin" + for(lib, LIB_DIR):LIBS += -L"$$lib" + for(bin, BIN_DIR):LIBS += -L"$$bin" - LIBS += -lssl -lcrypto -lpthread -lminiupnpc -lz -lws2_32 - LIBS += -luuid -lole32 -liphlpapi -lcrypt32 -lgdi32 - LIBS += -lwinmm + LIBS += -lssl -lcrypto -lpthread -lminiupnpc -lz -lws2_32 + LIBS += -luuid -lole32 -liphlpapi -lcrypt32 -lgdi32 + LIBS += -lwinmm - DEFINES *= WINDOWS_SYS WIN32_LEAN_AND_MEAN _USE_32BIT_TIME_T + DEFINES *= WINDOWS_SYS WIN32_LEAN_AND_MEAN _USE_32BIT_TIME_T - DEPENDPATH += . $$INC_DIR - INCLUDEPATH += . $$INC_DIR + DEPENDPATH += . $$INC_DIR + INCLUDEPATH += . $$INC_DIR - greaterThan(QT_MAJOR_VERSION, 4) { - # Qt 5 - RC_INCLUDEPATH += $$_PRO_FILE_PWD_/../../libretroshare/src - } else { - # Qt 4 - QMAKE_RC += --include-dir=$$_PRO_FILE_PWD_/../../libretroshare/src - } + greaterThan(QT_MAJOR_VERSION, 4) { + # Qt 5 + RC_INCLUDEPATH += $$_PRO_FILE_PWD_/../../libretroshare/src + } else { + # Qt 4 + QMAKE_RC += --include-dir=$$_PRO_FILE_PWD_/../../libretroshare/src + } } DEPENDPATH += . ../../libretroshare/src/ @@ -183,8 +182,7 @@ SOURCES += \ util/ContentTypes.cpp \ api/ApiPluginHandler.cpp \ api/ChannelsHandler.cpp \ - api/StatsHandler.cpp \ - api/SettingsHandler.cpp + api/StatsHandler.cpp HEADERS += \ api/ApiServer.h \ @@ -211,8 +209,7 @@ HEADERS += \ util/ContentTypes.h \ api/ApiPluginHandler.h \ api/ChannelsHandler.h \ - api/StatsHandler.h \ - api/SettingsHandler.h + api/StatsHandler.h libresapilocalserver { CONFIG *= qt @@ -220,3 +217,11 @@ libresapilocalserver { SOURCES *= api/ApiServerLocal.cpp HEADERS *= api/ApiServerLocal.h } + +qt_dependencies { + CONFIG *= qt + QT *= core + + SOURCES += api/SettingsHandler.cpp + HEADERS += api/SettingsHandler.h +} diff --git a/retroshare.pri b/retroshare.pri index 498131aea..e27348311 100644 --- a/retroshare.pri +++ b/retroshare.pri @@ -29,6 +29,11 @@ retroshare_qml_app:CONFIG -= no_retroshare_qml_app CONFIG *= no_libresapilocalserver libresapilocalserver:CONFIG -= no_libresapilocalserver +# To enable Qt dependencies in libresapi append the following +# assignation to qmake command line "CONFIG+=qt_dependencies" +CONFIG *= no_qt_dependencies +qt_dependencies:CONFIG -= no_qt_dependencies + # To disable libresapi via HTTP (based on libmicrohttpd) append the following # assignation to qmake command line "CONFIG+=no_libresapihttpserver" CONFIG *= libresapihttpserver @@ -155,6 +160,7 @@ unfinished { wikipoos:DEFINES *= RS_USE_WIKI rs_gxs:DEFINES *= RS_ENABLE_GXS libresapilocalserver:DEFINES *= LIBRESAPI_LOCAL_SERVER +qt_dependencies:DEFINES *= LIBRESAPI_QT libresapihttpserver:DEFINES *= ENABLE_WEBUI sqlcipher:DEFINES -= NO_SQLCIPHER no_sqlcipher:DEFINES *= NO_SQLCIPHER From efd6ce3ed518af7462689ed467fda66cdf6c0831 Mon Sep 17 00:00:00 2001 From: Konrad Date: Tue, 28 Mar 2017 11:19:50 +0200 Subject: [PATCH 34/88] Changed: Simplified asking for deferred self signature --- libresapi/src/api/RsControlModule.cpp | 115 ++------------------------ libresapi/src/api/RsControlModule.h | 5 -- 2 files changed, 6 insertions(+), 114 deletions(-) diff --git a/libresapi/src/api/RsControlModule.cpp b/libresapi/src/api/RsControlModule.cpp index 228bb691a..595509f09 100644 --- a/libresapi/src/api/RsControlModule.cpp +++ b/libresapi/src/api/RsControlModule.cpp @@ -458,120 +458,17 @@ void RsControlModule::handleCreateLocation(Request &req, Response &resp) resp.setFail("could not create a new location. Error: "+err_string); } -class SignatureEventData -{ - public: - SignatureEventData(const void *_data,int32_t _len,unsigned int _signlen, std::string _reason) - { - // We need a new memory chnk because there's no guarranty _sign nor _signlen are not in the stack - - sign = (unsigned char *)rs_malloc(_signlen); - - if(!sign) - { - signlen = NULL; - signature_result = SELF_SIGNATURE_RESULT_FAILED; - return; - } - - signlen = new unsigned int; - *signlen = _signlen; - signature_result = SELF_SIGNATURE_RESULT_PENDING; - data = rs_malloc(_len); - - if(!data) - { - len = 0; - return; - } - len = _len; - memcpy(data,_data,len); - reason = _reason; - } - - ~SignatureEventData() - { - free(sign); - delete signlen; - free(data); - } - - void performSignature() - { - if(rsPeers->gpgSignData(data,len,sign,signlen,reason)) - signature_result = SELF_SIGNATURE_RESULT_SUCCESS; - else - signature_result = SELF_SIGNATURE_RESULT_FAILED; - } - - void *data; - uint32_t len; - unsigned char *sign; - unsigned int *signlen; - int signature_result; // 0=pending, 1=done, 2=failed/cancelled. - std::string reason; -}; - bool RsControlModule::askForDeferredSelfSignature(const void *data, const uint32_t len, unsigned char *sign, unsigned int *signlen,int& signature_result, std::string reason /*=""*/) { - + if(rsPeers->gpgSignData(data,len,sign,signlen,reason)) { - RsStackMutex stack(mDataMtx); - std::cerr << "NotifyTxt:: deferred signature event requeted. " << std::endl; - - // Look into the queue - - Sha1CheckSum chksum = RsDirUtil::sha1sum((uint8_t*)data,len); - - std::map::iterator it = _deferred_signature_queue.find(chksum.toStdString()); - signature_result = SELF_SIGNATURE_RESULT_PENDING; - - if(it != _deferred_signature_queue.end()) - { - signature_result = it->second->signature_result; - - if(it->second->signature_result != SELF_SIGNATURE_RESULT_PENDING) // found it. Copy the result, and remove from the queue. - { - // We should check for the exact data match, for the sake of being totally secure. - // - std::cerr << "Found into queue: returning it" << std::endl; - - memcpy(sign,it->second->sign,*it->second->signlen); - *signlen = *(it->second->signlen); - - delete it->second; - _deferred_signature_queue.erase(it); - } - - return true; // already registered, but not done yet. - } - - // Not found. Store in the queue and emit a signal. - // - std::cerr << "NotifyTxt:: deferred signature event requeted. Pushing into queue" << std::endl; - - SignatureEventData *edta = new SignatureEventData(data,len,*signlen, reason); - - _deferred_signature_queue[chksum.toStdString()] = edta; + signature_result = SELF_SIGNATURE_RESULT_SUCCESS; + return true; } - handleSignatureEvent(); - return true; -} - -void RsControlModule::handleSignatureEvent() -{ - std::cerr << "NotifyTxt:: performing a deferred signature in the main GUI thread." << std::endl; - - static bool working = false ; - - if(!working) + else { - working = true ; - - for(std::map::const_iterator it(_deferred_signature_queue.begin());it!=_deferred_signature_queue.end();++it) - it->second->performSignature() ; - - working = false ; + signature_result = SELF_SIGNATURE_RESULT_FAILED; + return false; } } diff --git a/libresapi/src/api/RsControlModule.h b/libresapi/src/api/RsControlModule.h index 338027e15..1323651fc 100644 --- a/libresapi/src/api/RsControlModule.h +++ b/libresapi/src/api/RsControlModule.h @@ -9,8 +9,6 @@ namespace resource_api{ class StateTokenServer; class ApiServer; -class SignatureEventData; - // resource api module to control accounts, startup and shutdown of retroshare // - this module handles everything, no things are required from outside // - exception: users of this module have to create an api server and register this module @@ -87,9 +85,6 @@ private: // we store the password in this variable, it has higher priority than the normal password variable // it is also to avoid a lock, when we make a synchronous call into librs, like in ssl cert generation std::string mFixedPassword; - - void handleSignatureEvent(); - std::map _deferred_signature_queue ; }; } // namespace resource_api From 6e530027f8fec09479446316a1bbce92ac749e9d Mon Sep 17 00:00:00 2001 From: Konrad Date: Tue, 28 Mar 2017 11:20:51 +0200 Subject: [PATCH 35/88] Added: tokens in PeersHandler --- libresapi/src/api/PeersHandler.cpp | 37 +++++++++++++++++++++--------- libresapi/src/api/PeersHandler.h | 5 ++++ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/libresapi/src/api/PeersHandler.cpp b/libresapi/src/api/PeersHandler.cpp index b8fdc913d..f48beb2f6 100644 --- a/libresapi/src/api/PeersHandler.cpp +++ b/libresapi/src/api/PeersHandler.cpp @@ -116,9 +116,9 @@ PeersHandler::PeersHandler(StateTokenServer* sts, RsNotify* notify, RsPeers *pee mStateTokenServer->registerTickClient(this); addResourceHandler("*", this, &PeersHandler::handleWildcard); addResourceHandler("get_state_string", this, &PeersHandler::handleGetStateString); - addResourceHandler("set_state_string", this, &PeersHandler::handleSetStateString); - addResourceHandler("get_custom_state_string", this, &PeersHandler::handleGetCustomStateString); - addResourceHandler("set_custom_state_string", this, &PeersHandler::handleSetCustomStateString); + addResourceHandler("set_state_string", this, &PeersHandler::handleSetStateString); + addResourceHandler("get_custom_state_string", this, &PeersHandler::handleGetCustomStateString); + addResourceHandler("set_custom_state_string", this, &PeersHandler::handleSetCustomStateString); addResourceHandler("examine_cert", this, &PeersHandler::handleExamineCert); } @@ -156,6 +156,27 @@ void PeersHandler::tick() mStateTokenServer->discardToken(mStateToken); mStateToken = mStateTokenServer->getNewToken(); } + + StatusInfo statusInfo; + rsStatus->getOwnStatus(statusInfo); + if(statusInfo.status != status) + { + status = statusInfo.status; + + RsStackMutex stack(mMtx); /********** STACK LOCKED MTX ******/ + mStateTokenServer->discardToken(mStringStateToken); + mStringStateToken = mStateTokenServer->getNewToken(); + } + + std::string custom_state = rsMsgs->getCustomStateString(); + if(custom_state != custom_state_string) + { + custom_state_string = custom_state; + + RsStackMutex stack(mMtx); /********** STACK LOCKED MTX ******/ + mStateTokenServer->discardToken(mCustomStateToken); + mCustomStateToken = mStateTokenServer->getNewToken(); + } } void PeersHandler::notifyUnreadMsgCountChanged(const RsPeerId &peer, uint32_t count) @@ -181,6 +202,7 @@ void PeersHandler::handleGetStateString(Request& req, Response& resp) { { RS_STACK_MUTEX(mMtx); + resp.mStateToken = mStringStateToken; } std::string state_string; @@ -207,10 +229,6 @@ void PeersHandler::handleGetStateString(Request& req, Response& resp) void PeersHandler::handleSetStateString(Request& req, Response& resp) { - { - RS_STACK_MUTEX(mMtx); - } - std::string state_string; req.mStream << makeKeyValueReference("state_string", state_string); @@ -230,6 +248,7 @@ void PeersHandler::handleGetCustomStateString(Request& req, Response& resp) { { RS_STACK_MUTEX(mMtx); + resp.mStateToken = mCustomStateToken; } std::string custom_state_string = rsMsgs->getCustomStateString(); @@ -239,10 +258,6 @@ void PeersHandler::handleGetCustomStateString(Request& req, Response& resp) void PeersHandler::handleSetCustomStateString(Request& req, Response& resp) { - { - RS_STACK_MUTEX(mMtx); - } - std::string custom_state_string; req.mStream << makeKeyValueReference("custom_state_string", custom_state_string); diff --git a/libresapi/src/api/PeersHandler.h b/libresapi/src/api/PeersHandler.h index a2eab706b..15d231c10 100644 --- a/libresapi/src/api/PeersHandler.h +++ b/libresapi/src/api/PeersHandler.h @@ -50,9 +50,14 @@ private: RsMsgs* mRsMsgs; // required for avatar data std::list mOnlinePeers; + uint32_t status; + std::string custom_state_string; RsMutex mMtx; StateToken mStateToken; // mutex protected + StateToken mStringStateToken; // mutex protected + StateToken mCustomStateToken; // mutex protected + std::map mUnreadMsgsCounts; }; } // namespace resource_api From 22956be00f1fd9a79dd6b95295eeda762847df51 Mon Sep 17 00:00:00 2001 From: Konrad Date: Tue, 28 Mar 2017 11:24:16 +0200 Subject: [PATCH 36/88] Deleted: functions for hadling particular lobbies types in ChatHandler --- libresapi/src/api/ChatHandler.cpp | 88 ------------------------------- libresapi/src/api/ChatHandler.h | 4 -- 2 files changed, 92 deletions(-) diff --git a/libresapi/src/api/ChatHandler.cpp b/libresapi/src/api/ChatHandler.cpp index 68f0bd356..511993a29 100644 --- a/libresapi/src/api/ChatHandler.cpp +++ b/libresapi/src/api/ChatHandler.cpp @@ -159,10 +159,6 @@ ChatHandler::ChatHandler(StateTokenServer *sts, RsNotify *notify, RsMsgs *msgs, addResourceHandler("initiate_distant_chat", this, &ChatHandler::handleInitiateDistantChatConnexion); addResourceHandler("distant_chat_status", this, &ChatHandler::handleDistantChatStatus); addResourceHandler("close_distant_chat", this, &ChatHandler::handleCloseDistantChatConnexion); - - addResourceHandler("private_lobbies", this, &ChatHandler::handlePrivateLobbies); - addResourceHandler("subscribed_public_lobbies", this, &ChatHandler::handleSubscribedPublicLobbies); - addResourceHandler("unsubscribed_public_lobbies", this, &ChatHandler::handleUnsubscribedPublicLobbies); } ChatHandler::~ChatHandler() @@ -1204,88 +1200,4 @@ void ChatHandler::handleCloseDistantChatConnexion(Request& req, Response& resp) else resp.setFail("Failed to close distant chat"); } -void ChatHandler::handlePrivateLobbies(Request &req, Response &resp) -{ - tick(); - - { - RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ - resp.mDataStream.getStreamToMember(); - for(std::vector::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit) - { - if(!vit->is_private) - continue; - uint32_t unread_msgs = 0; - ChatId chat_id(vit->id); - std::map >::iterator mit = mMsgs.find(chat_id); - if(mit != mMsgs.end()) - { - std::list& msgs = mit->second; - for(std::list::iterator lit = msgs.begin(); lit != msgs.end(); ++lit) - if(!lit->read) - unread_msgs++; - } - resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs); - } - resp.mStateToken = mLobbiesStateToken; - } - resp.setOk(); -} - -void ChatHandler::handleSubscribedPublicLobbies(Request &req, Response &resp) -{ - tick(); - - { - RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ - resp.mDataStream.getStreamToMember(); - for(std::vector::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit) - { - if(!vit->subscribed || vit->is_private || vit->is_broadcast) - continue; - uint32_t unread_msgs = 0; - ChatId chat_id(vit->id); - std::map >::iterator mit = mMsgs.find(chat_id); - if(mit != mMsgs.end()) - { - std::list& msgs = mit->second; - for(std::list::iterator lit = msgs.begin(); lit != msgs.end(); ++lit) - if(!lit->read) - unread_msgs++; - } - resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs); - } - resp.mStateToken = mLobbiesStateToken; - } - resp.setOk(); -} - -void ChatHandler::handleUnsubscribedPublicLobbies(Request &req, Response &resp) -{ - tick(); - - { - RS_STACK_MUTEX(mMtx); /********** LOCKED **********/ - resp.mDataStream.getStreamToMember(); - for(std::vector::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit) - { - if(vit->subscribed || vit->is_private) - continue; - uint32_t unread_msgs = 0; - ChatId chat_id(vit->id); - std::map >::iterator mit = mMsgs.find(chat_id); - if(mit != mMsgs.end()) - { - std::list& msgs = mit->second; - for(std::list::iterator lit = msgs.begin(); lit != msgs.end(); ++lit) - if(!lit->read) - unread_msgs++; - } - resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs); - } - resp.mStateToken = mLobbiesStateToken; - } - resp.setOk(); -} - } // namespace resource_api diff --git a/libresapi/src/api/ChatHandler.h b/libresapi/src/api/ChatHandler.h index 056629c06..dc075c77f 100644 --- a/libresapi/src/api/ChatHandler.h +++ b/libresapi/src/api/ChatHandler.h @@ -133,10 +133,6 @@ private: void handleDistantChatStatus(Request& req, Response& resp); void handleCloseDistantChatConnexion(Request& req, Response& resp); - void handlePrivateLobbies(Request &req, Response &resp); - void handleSubscribedPublicLobbies(Request &req, Response &resp); - void handleUnsubscribedPublicLobbies(Request &req, Response &resp); - void getPlainText(const std::string& in, std::string &out, std::vector &links); // last parameter is only used for lobbies! void locked_storeTypingInfo(const ChatId& chat_id, std::string status, RsGxsId lobby_gxs_id = RsGxsId()); From fbc1bb4e823209ad534f75552f06264fd4b69a9d Mon Sep 17 00:00:00 2001 From: Konrad Date: Wed, 29 Mar 2017 16:06:39 +0200 Subject: [PATCH 37/88] Added: function for handling autosubscribing lobbies --- libresapi/src/api/ChatHandler.cpp | 10 ++++++++++ libresapi/src/api/ChatHandler.h | 1 + 2 files changed, 11 insertions(+) diff --git a/libresapi/src/api/ChatHandler.cpp b/libresapi/src/api/ChatHandler.cpp index 511993a29..f576f8601 100644 --- a/libresapi/src/api/ChatHandler.cpp +++ b/libresapi/src/api/ChatHandler.cpp @@ -147,6 +147,7 @@ ChatHandler::ChatHandler(StateTokenServer *sts, RsNotify *notify, RsMsgs *msgs, addResourceHandler("lobbies", this, &ChatHandler::handleLobbies); addResourceHandler("subscribe_lobby", this, &ChatHandler::handleSubscribeLobby); addResourceHandler("unsubscribe_lobby", this, &ChatHandler::handleUnsubscribeLobby); + addResourceHandler("autosubscribe_lobby", this, &ChatHandler::handleAutoSubsribeLobby); addResourceHandler("clear_lobby", this, &ChatHandler::handleClearLobby); addResourceHandler("lobby_participants", this, &ChatHandler::handleLobbyParticipants); addResourceHandler("messages", this, &ChatHandler::handleMessages); @@ -890,6 +891,15 @@ void ChatHandler::handleUnsubscribeLobby(Request &req, Response &resp) resp.setOk(); } +void ChatHandler::handleAutoSubsribeLobby(Request& req, Response& resp) +{ + ChatLobbyId chatId = 0; + bool autosubsribe; + req.mStream << makeKeyValueReference("chatid", chatId) << makeKeyValueReference("autosubsribe", autosubsribe); + mRsMsgs->setLobbyAutoSubscribe(chatId, autosubsribe); + resp.setOk(); +} + void ChatHandler::handleClearLobby(Request &req, Response &resp) { ChatLobbyId id = 0; diff --git a/libresapi/src/api/ChatHandler.h b/libresapi/src/api/ChatHandler.h index dc075c77f..3463cee57 100644 --- a/libresapi/src/api/ChatHandler.h +++ b/libresapi/src/api/ChatHandler.h @@ -120,6 +120,7 @@ private: void handleLobbies(Request& req, Response& resp); void handleSubscribeLobby(Request& req, Response& resp); void handleUnsubscribeLobby(Request& req, Response& resp); + void handleAutoSubsribeLobby(Request& req, Response& resp); void handleClearLobby(Request& req, Response& resp); ResponseTask* handleLobbyParticipants(Request& req, Response& resp); void handleMessages(Request& req, Response& resp); From 8543525c77f6c54f44ef58221c0f07b3c6cee69c Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 1 Apr 2017 14:28:55 +0200 Subject: [PATCH 38/88] Fixed: Linker problem --- .../src/retroshare-android-service.pro | 20 +++++++++---------- retroshare-android-service/src/service.cpp | 2 -- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/retroshare-android-service/src/retroshare-android-service.pro b/retroshare-android-service/src/retroshare-android-service.pro index e45067f81..54843d34f 100644 --- a/retroshare-android-service/src/retroshare-android-service.pro +++ b/retroshare-android-service/src/retroshare-android-service.pro @@ -11,6 +11,16 @@ android-g++:CONFIG += dll android-g++:TEMPLATE = lib !android-g++:TEMPLATE = app +DEPENDPATH *= ../../libresapi/src +INCLUDEPATH *= ../../libresapi/src +PRE_TARGETDEPS *= ../../libresapi/src/lib/libresapi.a +LIBS *= ../../libresapi/src/lib/libresapi.a + +DEPENDPATH *= ../../libretroshare/src +INCLUDEPATH *= ../../libretroshare/src +PRE_TARGETDEPS *= ../../libretroshare/src/lib/libretroshare.a +LIBS *= ../../libretroshare/src/lib/libretroshare.a + win32 { OBJECTS_DIR = temp/obj @@ -41,13 +51,3 @@ win32 { } SOURCES += service.cpp - -DEPENDPATH *= ../../libresapi/src -INCLUDEPATH *= ../../libresapi/src -PRE_TARGETDEPS *= ../../libresapi/src/lib/libresapi.a -LIBS *= ../../libresapi/src/lib/libresapi.a - -DEPENDPATH *= ../../libretroshare/src -INCLUDEPATH *= ../../libretroshare/src -PRE_TARGETDEPS *= ../../libretroshare/src/lib/libretroshare.a -LIBS *= ../../libretroshare/src/lib/libretroshare.a diff --git a/retroshare-android-service/src/service.cpp b/retroshare-android-service/src/service.cpp index afe73bfc3..c822e8718 100644 --- a/retroshare-android-service/src/service.cpp +++ b/retroshare-android-service/src/service.cpp @@ -40,8 +40,6 @@ int main(int argc, char *argv[]) QCoreApplication a(argc, argv); - RsInit::InitRsConfig(); - ApiServer api; RsControlModule ctrl_mod(argc, argv, api.getStateTokenServer(), &api, true); api.addResourceHandler("control", dynamic_cast(&ctrl_mod), &resource_api::RsControlModule::handleRequest); From 6e65fcd6acf95e32a2ecde450abe67248888a660 Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 1 Apr 2017 14:32:49 +0200 Subject: [PATCH 39/88] Removed: Unused #include statement --- retroshare-android-service/src/service.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/retroshare-android-service/src/service.cpp b/retroshare-android-service/src/service.cpp index c822e8718..84ec62301 100644 --- a/retroshare-android-service/src/service.cpp +++ b/retroshare-android-service/src/service.cpp @@ -24,12 +24,10 @@ # include "util/androiddebug.h" #endif -#include "retroshare/rsinit.h" #include "api/ApiServer.h" #include "api/ApiServerLocal.h" #include "api/RsControlModule.h" - using namespace resource_api; int main(int argc, char *argv[]) From f175533d8df9f7952fc7284718c7aa63cc6e6689 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 8 Apr 2017 14:06:47 +0200 Subject: [PATCH 40/88] Fix comment view when they have line return. Before, they grow row height but only show 2 lines. Now, height stay at one line, but tooltip show the correct message. --- retroshare-gui/src/gui/gxs/GxsCommentTreeWidget.cpp | 5 +++++ retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/gxs/GxsCommentTreeWidget.cpp b/retroshare-gui/src/gui/gxs/GxsCommentTreeWidget.cpp index 2fa1f3b1e..a99e815c7 100644 --- a/retroshare-gui/src/gui/gxs/GxsCommentTreeWidget.cpp +++ b/retroshare-gui/src/gui/gxs/GxsCommentTreeWidget.cpp @@ -25,6 +25,7 @@ #include #include +#include "gui/common/RSElidedItemDelegate.h" #include "gui/gxs/GxsCommentTreeWidget.h" #include "gui/gxs/GxsCreateCommentDialog.h" #include "gui/gxs/GxsIdTreeWidgetItem.h" @@ -57,6 +58,10 @@ GxsCommentTreeWidget::GxsCommentTreeWidget(QWidget *parent) // QTreeWidget* widget = this; setContextMenuPolicy(Qt::CustomContextMenu); + RSElidedItemDelegate *itemDelegate = new RSElidedItemDelegate(this); + itemDelegate->setSpacing(QSize(0, 2)); + setItemDelegate(itemDelegate); + setWordWrap(true); // QFont font = QFont("ARIAL", 10); // font.setBold(true); diff --git a/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp b/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp index a1e20e37c..500693df0 100644 --- a/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp +++ b/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp @@ -25,6 +25,8 @@ #include "GxsCreateCommentDialog.h" #include "ui_GxsCreateCommentDialog.h" +#include "util/HandleRichText.h" + #include #include @@ -45,7 +47,11 @@ void GxsCreateCommentDialog::createComment() { RsGxsComment comment; - comment.mComment = std::string(ui->commentTextEdit->document()->toPlainText().toUtf8()); + QString text = ui->commentTextEdit->toHtml(); + RsHtml::optimizeHtml(text); + std::string msg = text.toUtf8().constData(); + + comment.mComment = msg; comment.mMeta.mParentId = mParentId.second; comment.mMeta.mGroupId = mParentId.first; comment.mMeta.mThreadId = mThreadId; From 4f5da86acaa8f1602c8f95cc25a176653322db5b Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 8 Apr 2017 19:07:33 +0200 Subject: [PATCH 41/88] added method to serialise/deserialise groups to/from memory and export of GxsIdentities to memory chunk in radix format --- libretroshare/src/gxs/rsgenexchange.cc | 52 ++++++++++++ libretroshare/src/gxs/rsgenexchange.h | 14 ++++ libretroshare/src/retroshare/rsidentity.h | 3 + libretroshare/src/services/p3idservice.cc | 96 +++++++++++++++++++++-- libretroshare/src/services/p3idservice.h | 17 ++++ 5 files changed, 175 insertions(+), 7 deletions(-) diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc index a334f7e3d..4d70ee409 100644 --- a/libretroshare/src/gxs/rsgenexchange.cc +++ b/libretroshare/src/gxs/rsgenexchange.cc @@ -1273,6 +1273,58 @@ bool RsGenExchange::getMsgRelatedMeta(const uint32_t &token, GxsMsgRelatedMetaMa return ok; } +bool RsGenExchange::getSerializedGroupData(const uint32_t &token, RsGxsGroupId& id,unsigned char *& data,uint32_t& size) +{ + RS_STACK_MUTEX(mGenMtx) ; + + std::list nxsGrps; + + if(!mDataAccess->getGroupData(token, nxsGrps)) + return false ; + + if(nxsGrps.size() != 1) + { + std::cerr << "(EE) getSerializedGroupData() got multiple groups in single request. This is unexpected." << std::endl; + + for(std::list::const_iterator it(nxsGrps.begin());it!=nxsGrps.end();++it) + delete *it ; + + return false ; + } + RsNxsGrp *nxs_grp = *(nxsGrps.begin()); + + size = nxs_grp->serial_size() ; + id = nxs_grp->metaData->mGroupId ; + + if(size > 1024*1024 || NULL==(data = (unsigned char *)rs_malloc(size))) + { + std::cerr << "(EE) getSerializedGroupData() cannot allocate mem chunk of size " << size << ". Too big, or no room." << std::endl; + delete nxs_grp ; + return false ; + } + + return nxs_grp->serialise(data,size) ; +} + +bool RsGenExchange::deserializeGroupData(unsigned char *data,uint32_t size) +{ + RS_STACK_MUTEX(mGenMtx) ; + + RsItem *item = mSerialiser->deserialise(data, &size); + + RsNxsGrp *nxs_grp = dynamic_cast(item) ; + + if(item == NULL) + { + std::cerr << "(EE) RsGenExchange::deserializeGroupData(): cannot deserialise this data. Something's wrong." << std::endl; + delete item ; + return false ; + } + + mReceivedGrps.push_back( GxsPendingItem(nxs_grp, nxs_grp->metaData->mGroupId,time(NULL)) ); + + return true ; +} bool RsGenExchange::getGroupData(const uint32_t &token, std::vector& grpItem) { diff --git a/libretroshare/src/gxs/rsgenexchange.h b/libretroshare/src/gxs/rsgenexchange.h index 21ea4365c..ec9c0d3f0 100644 --- a/libretroshare/src/gxs/rsgenexchange.h +++ b/libretroshare/src/gxs/rsgenexchange.h @@ -288,6 +288,20 @@ protected: */ bool getGroupData(const uint32_t &token, std::vector& grpItem); + /*! + * \brief getSerializedGroupData + * Retrieves the complete group data serialized into a chunk of memory. This can be useful to + * transfer a full group from one machine to another. + * + * \param token token previously obtained from cache request + * \param data memory chunk allocated (using malloc) + * \param size size of the memory chunk. + * \return + */ + + bool getSerializedGroupData(const uint32_t &token, RsGxsGroupId &id, unsigned char *& data, uint32_t& size); + bool deserializeGroupData(unsigned char *data, uint32_t size); + template bool getGroupDataT(const uint32_t &token, std::vector& grpItem) { diff --git a/libretroshare/src/retroshare/rsidentity.h b/libretroshare/src/retroshare/rsidentity.h index 82f4932a3..53704961d 100644 --- a/libretroshare/src/retroshare/rsidentity.h +++ b/libretroshare/src/retroshare/rsidentity.h @@ -305,6 +305,9 @@ public: virtual bool setAsRegularContact(const RsGxsId& id,bool is_a_contact) = 0 ; virtual bool isARegularContact(const RsGxsId& id) = 0 ; + virtual bool serialiseIdentityToMemory(const RsGxsId& id,std::string& radix_string)=0; + virtual bool deserialiseIdentityFromMemory(const std::string& radix_string)=0; + /*! * \brief overallReputationLevel * Returns the overall reputation level of the supplied identity. See rsreputations.h diff --git a/libretroshare/src/services/p3idservice.cc b/libretroshare/src/services/p3idservice.cc index 53b922327..9aeec2aea 100644 --- a/libretroshare/src/services/p3idservice.cc +++ b/libretroshare/src/services/p3idservice.cc @@ -70,6 +70,8 @@ static const time_t MAX_KEEP_KEYS_SIGNED_KNOWN = 30 * 86400 ; // signed ident static const uint32_t MAX_DELAY_BEFORE_CLEANING= 1800 ; // clean old keys every 30 mins +static const uint32_t MAX_SERIALISED_IDENTITY_AGE = 600 ; // after 10 mins, a serialised identity record must be renewed. + RsIdentity *rsIdentity = NULL; /****** @@ -97,13 +99,12 @@ RsIdentity *rsIdentity = NULL; #define BG_REPUTATION 3 -#define GXSIDREQ_CACHELOAD 0x0001 -#define GXSIDREQ_CACHEOWNIDS 0x0002 - -#define GXSIDREQ_PGPHASH 0x0010 -#define GXSIDREQ_RECOGN 0x0020 - -#define GXSIDREQ_OPINION 0x0030 +#define GXSIDREQ_CACHELOAD 0x0001 +#define GXSIDREQ_CACHEOWNIDS 0x0002 +#define GXSIDREQ_PGPHASH 0x0010 +#define GXSIDREQ_RECOGN 0x0020 +#define GXSIDREQ_OPINION 0x0030 +#define GXSIDREQ_SERIALIZE_TO_MEMORY 0x0040 #define GXSIDREQ_CACHETEST 0x1000 @@ -697,6 +698,84 @@ bool p3IdService::getOwnIds(std::list &ownIds) return true ; } +bool p3IdService::serialiseIdentityToMemory(const RsGxsId& id,std::string& radix_string) +{ + RsStackMutex stack(mIdMtx); /********** STACK LOCKED MTX ******/ + + // look into cache. If available, return the data. If not, request it. + + std::map::const_iterator it = mSerialisedIdentities.find(id); + + if(it != mSerialisedIdentities.end()) + { + Radix64::encode(it->second.mMem,it->second.mSize,radix_string) ; + + if(it->second.mLastUsageTS + MAX_SERIALISED_IDENTITY_AGE > time(NULL)) + return true ; + + std::cerr << "Identity " << id << " will be re-serialised, because the last record is too old." << std::endl; + } + + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA; + uint32_t token = 0; + std::list groupIds; + + groupIds.push_back(RsGxsGroupId(id)) ; + + RsGenExchange::getTokenService()->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, groupIds); + GxsTokenQueue::queueRequest(token, GXSIDREQ_SERIALIZE_TO_MEMORY); + + return false; +} + +void p3IdService::handle_get_serialized_grp(uint32_t token) +{ + // store the serialized data in cache. + + unsigned char *mem = NULL; + uint32_t size; + RsGxsGroupId id ; + + if(!RsGenExchange::getSerializedGroupData(token,id, mem,size)) + { + std::cerr << "(EE) call to RsGenExchage::getSerializedGroupData() failed." << std::endl; + return ; + } + + std::cerr << "Received serialised group from RsGenExchange." << std::endl; + + std::map::const_iterator it = mSerialisedIdentities.find(RsGxsId(id)); + + if(it != mSerialisedIdentities.end()) + free(it->second.mMem) ; + + SerialisedIdentityStruct s ; + s.mMem = mem ; + s.mSize = size ; + s.mLastUsageTS = time(NULL) ; + + mSerialisedIdentities[RsGxsId(id)] = s ; +} + +bool p3IdService::deserialiseIdentityFromMemory(const std::string& radix_string) +{ + std::vector mem = Radix64::decode(radix_string) ; + + if(mem.empty()) + { + std::cerr << "Cannot decode radix string \"" << radix_string << "\"" << std::endl; + return false ; + } + + if(!RsGenExchange::deserializeGroupData(mem.data(),mem.size())) + { + std::cerr << "Cannot load identity from radix string \"" << radix_string << "\"" << std::endl; + return false ; + } + + return true ; +} bool p3IdService::createIdentity(uint32_t& token, RsIdentityParameters ¶ms) { @@ -4117,6 +4196,9 @@ void p3IdService::handleResponse(uint32_t token, uint32_t req_type) case GXSIDREQ_OPINION: opinion_handlerequest(token); break; + case GXSIDREQ_SERIALIZE_TO_MEMORY: + handle_get_serialized_grp(token) ; + default: /* error */ std::cerr << "p3IdService::handleResponse() Unknown Request Type: " << req_type; diff --git a/libretroshare/src/services/p3idservice.h b/libretroshare/src/services/p3idservice.h index addff0d1b..6e4585eb6 100644 --- a/libretroshare/src/services/p3idservice.h +++ b/libretroshare/src/services/p3idservice.h @@ -212,6 +212,13 @@ private: void init(const RsGxsIdGroupItem *item, const RsTlvPublicRSAKey& in_pub_key, const RsTlvPrivateRSAKey& in_priv_key,const std::list &tagList); }; +struct SerialisedIdentityStruct +{ + unsigned char *mMem ; + uint32_t mSize ; + time_t mLastUsageTS; +}; + // Not sure exactly what should be inherited here? // Chris - please correct as necessary. @@ -302,6 +309,8 @@ public: virtual bool requestKey(const RsGxsId &id, const std::list &peers, const RsIdentityUsage &use_info); virtual bool requestPrivateKey(const RsGxsId &id); + virtual bool serialiseIdentityToMemory(const RsGxsId& id,std::string& radix_string); + virtual bool deserialiseIdentityFromMemory(const std::string& radix_string); /**************** RsGixsReputation Implementation ****************/ @@ -394,6 +403,12 @@ private: bool mBgSchedule_Active; uint32_t mBgSchedule_Mode; + /***********************************8 + * Fonction to receive and handle group serialisation to memory + */ + + virtual void handle_get_serialized_grp(uint32_t token); + /************************************************************************ * pgphash processing. * @@ -524,6 +539,8 @@ private: std::map > mIdsNotPresent; std::map mKeysTS ; + std::map mSerialisedIdentities ; + // keep a list of regular contacts. This is useful to sort IDs, and allow some services to priviledged ids only. std::set mContacts; RsNetworkExchangeService* mNes; From 6d290389f029e89e96fbfd46b3971f075457e484 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 8 Apr 2017 21:12:48 +0200 Subject: [PATCH 42/88] added RSLink for GXS identities --- retroshare-gui/src/gui/Identity/IdDialog.cpp | 335 ++++++++++--------- retroshare-gui/src/gui/Identity/IdDialog.h | 1 + retroshare-gui/src/gui/RetroShareLink.cpp | 59 +++- retroshare-gui/src/gui/RetroShareLink.h | 28 +- 4 files changed, 259 insertions(+), 164 deletions(-) diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 25db8896d..4b28a1b09 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -2240,165 +2240,202 @@ void IdDialog::loadRequest(const TokenQueue * queue, const TokenRequest &req) void IdDialog::IdListCustomPopupMenu( QPoint ) { - QMenu *contextMenu = new QMenu(this); + QMenu *contextMenu = new QMenu(this); - std::list own_identities ; - rsIdentity->getOwnIds(own_identities) ; + std::list own_identities ; + rsIdentity->getOwnIds(own_identities) ; - // make some stats about what's selected. If the same value is used for all selected items, it can be switched. + // make some stats about what's selected. If the same value is used for all selected items, it can be switched. - QList selected_items = ui->idTreeWidget->selectedItems(); + QList selected_items = ui->idTreeWidget->selectedItems(); - bool root_node_present = false ; - bool one_item_owned_by_you = false ; - uint32_t n_positive_reputations = 0 ; - uint32_t n_negative_reputations = 0 ; - uint32_t n_neutral_reputations = 0 ; - uint32_t n_is_a_contact = 0 ; - uint32_t n_is_not_a_contact = 0 ; - uint32_t n_selected_items =0 ; + bool root_node_present = false ; + bool one_item_owned_by_you = false ; + uint32_t n_positive_reputations = 0 ; + uint32_t n_negative_reputations = 0 ; + uint32_t n_neutral_reputations = 0 ; + uint32_t n_is_a_contact = 0 ; + uint32_t n_is_not_a_contact = 0 ; + uint32_t n_selected_items =0 ; - for(QList::const_iterator it(selected_items.begin());it!=selected_items.end();++it) - { - if(*it == allItem || *it == contactsItem || *it == ownItem) - { - root_node_present = true ; - continue ; - } - - uint32_t item_flags = (*it)->data(RSID_COL_KEYID,Qt::UserRole).toUInt() ; - - if(item_flags & RSID_FILTER_OWNED_BY_YOU) - one_item_owned_by_you = true ; - -#ifdef ID_DEBUG - std::cerr << " item flags = " << item_flags << std::endl; -#endif - RsGxsId keyId((*it)->text(RSID_COL_KEYID).toStdString()); - - RsIdentityDetails det ; - rsIdentity->getIdDetails(keyId,det) ; - - switch(det.mReputation.mOwnOpinion) - { - case RsReputations::OPINION_NEGATIVE: ++n_negative_reputations ; - break ; - - case RsReputations::OPINION_POSITIVE: ++n_positive_reputations ; - break ; - - case RsReputations::OPINION_NEUTRAL: ++n_neutral_reputations ; - break ; - } - - ++n_selected_items ; - - if(rsIdentity->isARegularContact(keyId)) - ++n_is_a_contact ; - else - ++n_is_not_a_contact ; - } - - if(!root_node_present) // don't show menu if some of the root nodes are present + for(QList::const_iterator it(selected_items.begin());it!=selected_items.end();++it) + { + if(*it == allItem || *it == contactsItem || *it == ownItem) { - - if(!one_item_owned_by_you) - { - QWidget *widget = new QWidget(contextMenu); - widget->setStyleSheet( ".QWidget{background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 #FEFEFE, stop:1 #E8E8E8); border: 1px solid #CCCCCC;}"); - - // create menu header - QHBoxLayout *hbox = new QHBoxLayout(widget); - hbox->setMargin(0); - hbox->setSpacing(6); - - QLabel *iconLabel = new QLabel(widget); - QPixmap pix = QPixmap(":/images/user/friends24.png").scaledToHeight(QFontMetricsF(iconLabel->font()).height()*1.5); - iconLabel->setPixmap(pix); - iconLabel->setMaximumSize(iconLabel->frameSize().height() + pix.height(), pix.width()); - hbox->addWidget(iconLabel); - - QLabel *textLabel = new QLabel("" + ui->titleBarLabel->text() + "", widget); - hbox->addWidget(textLabel); - - QSpacerItem *spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - hbox->addItem(spacerItem); - - widget->setLayout(hbox); - - QWidgetAction *widgetAction = new QWidgetAction(this); - widgetAction->setDefaultWidget(widget); - contextMenu->addAction(widgetAction); - - if(n_selected_items == 1) // if only one item is selected, allow to chat with this item - { - if(own_identities.size() <= 1) - { - QAction *action = contextMenu->addAction(QIcon(":/images/chat_24.png"), tr("Chat with this person"), this, SLOT(chatIdentity())); - - if(own_identities.empty()) - action->setEnabled(false) ; - else - action->setData(QString::fromStdString((own_identities.front()).toStdString())) ; - } - else - { - QMenu *mnu = contextMenu->addMenu(QIcon(":/images/chat_24.png"),tr("Chat with this person as...")) ; - - for(std::list::const_iterator it=own_identities.begin();it!=own_identities.end();++it) - { - RsIdentityDetails idd ; - rsIdentity->getIdDetails(*it,idd) ; - - QPixmap pixmap ; - - if(idd.mAvatar.mSize == 0 || !pixmap.loadFromData(idd.mAvatar.mData, idd.mAvatar.mSize, "PNG")) - pixmap = QPixmap::fromImage(GxsIdDetails::makeDefaultIcon(*it)) ; - - QAction *action = mnu->addAction(QIcon(pixmap), QString("%1 (%2)").arg(QString::fromUtf8(idd.mNickname.c_str()), QString::fromStdString((*it).toStdString())), this, SLOT(chatIdentity())); - action->setData(QString::fromStdString((*it).toStdString())) ; - } - } - } - - // always allow to send messages - contextMenu->addAction(QIcon(":/images/mail_new.png"), tr("Send message"), this, SLOT(sendMsg())); - - contextMenu->addSeparator(); - - if(n_is_a_contact == 0) - contextMenu->addAction(QIcon(), tr("Add to Contacts"), this, SLOT(addtoContacts())); - - if(n_is_not_a_contact == 0) - contextMenu->addAction(QIcon(":/images/cancel.png"), tr("Remove from Contacts"), this, SLOT(removefromContacts())); - - contextMenu->addSeparator(); - - if(n_positive_reputations == 0) // only unban when all items are banned - contextMenu->addAction(QIcon(":/icons/png/thumbs-up.png"), tr("Set positive opinion"), this, SLOT(positivePerson())); - - if(n_neutral_reputations == 0) // only unban when all items are banned - contextMenu->addAction(QIcon(":/icons/png/thumbs-neutral.png"), tr("Set neutral opinion"), this, SLOT(neutralPerson())); - - if(n_negative_reputations == 0) - contextMenu->addAction(QIcon(":/icons/png/thumbs-down.png"), tr("Set negative opinion"), this, SLOT(negativePerson())); - } - - if(one_item_owned_by_you && n_selected_items==1) - { - contextMenu->addSeparator(); - - contextMenu->addAction(ui->editIdentity); - contextMenu->addAction(ui->removeIdentity); - } - + root_node_present = true ; + continue ; } - contextMenu = ui->idTreeWidget->createStandardContextMenu(contextMenu); + uint32_t item_flags = (*it)->data(RSID_COL_KEYID,Qt::UserRole).toUInt() ; - contextMenu->exec(QCursor::pos()); - delete contextMenu; + if(item_flags & RSID_FILTER_OWNED_BY_YOU) + one_item_owned_by_you = true ; + +#ifdef ID_DEBUG + std::cerr << " item flags = " << item_flags << std::endl; +#endif + RsGxsId keyId((*it)->text(RSID_COL_KEYID).toStdString()); + + RsIdentityDetails det ; + rsIdentity->getIdDetails(keyId,det) ; + + switch(det.mReputation.mOwnOpinion) + { + case RsReputations::OPINION_NEGATIVE: ++n_negative_reputations ; + break ; + + case RsReputations::OPINION_POSITIVE: ++n_positive_reputations ; + break ; + + case RsReputations::OPINION_NEUTRAL: ++n_neutral_reputations ; + break ; + } + + ++n_selected_items ; + + if(rsIdentity->isARegularContact(keyId)) + ++n_is_a_contact ; + else + ++n_is_not_a_contact ; + } + + if(!root_node_present) // don't show menu if some of the root nodes are present + { + + if(!one_item_owned_by_you) + { + QWidget *widget = new QWidget(contextMenu); + widget->setStyleSheet( ".QWidget{background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 #FEFEFE, stop:1 #E8E8E8); border: 1px solid #CCCCCC;}"); + + // create menu header + QHBoxLayout *hbox = new QHBoxLayout(widget); + hbox->setMargin(0); + hbox->setSpacing(6); + + QLabel *iconLabel = new QLabel(widget); + QPixmap pix = QPixmap(":/images/user/friends24.png").scaledToHeight(QFontMetricsF(iconLabel->font()).height()*1.5); + iconLabel->setPixmap(pix); + iconLabel->setMaximumSize(iconLabel->frameSize().height() + pix.height(), pix.width()); + hbox->addWidget(iconLabel); + + QLabel *textLabel = new QLabel("" + ui->titleBarLabel->text() + "", widget); + hbox->addWidget(textLabel); + + QSpacerItem *spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + hbox->addItem(spacerItem); + + widget->setLayout(hbox); + + QWidgetAction *widgetAction = new QWidgetAction(this); + widgetAction->setDefaultWidget(widget); + contextMenu->addAction(widgetAction); + + if(n_selected_items == 1) // if only one item is selected, allow to chat with this item + { + if(own_identities.size() <= 1) + { + QAction *action = contextMenu->addAction(QIcon(":/images/chat_24.png"), tr("Chat with this person"), this, SLOT(chatIdentity())); + + if(own_identities.empty()) + action->setEnabled(false) ; + else + action->setData(QString::fromStdString((own_identities.front()).toStdString())) ; + } + else + { + QMenu *mnu = contextMenu->addMenu(QIcon(":/images/chat_24.png"),tr("Chat with this person as...")) ; + + for(std::list::const_iterator it=own_identities.begin();it!=own_identities.end();++it) + { + RsIdentityDetails idd ; + rsIdentity->getIdDetails(*it,idd) ; + + QPixmap pixmap ; + + if(idd.mAvatar.mSize == 0 || !pixmap.loadFromData(idd.mAvatar.mData, idd.mAvatar.mSize, "PNG")) + pixmap = QPixmap::fromImage(GxsIdDetails::makeDefaultIcon(*it)) ; + + QAction *action = mnu->addAction(QIcon(pixmap), QString("%1 (%2)").arg(QString::fromUtf8(idd.mNickname.c_str()), QString::fromStdString((*it).toStdString())), this, SLOT(chatIdentity())); + action->setData(QString::fromStdString((*it).toStdString())) ; + } + } + } + + if(n_selected_items==1) + QAction *action = contextMenu->addAction(QIcon(":/images/chat_24.png"),tr("Copy retroshare link"),this,SLOT(copyRetroshareLink())) ; + + // always allow to send messages + contextMenu->addAction(QIcon(":/images/mail_new.png"), tr("Send message"), this, SLOT(sendMsg())); + + contextMenu->addSeparator(); + + if(n_is_a_contact == 0) + contextMenu->addAction(QIcon(), tr("Add to Contacts"), this, SLOT(addtoContacts())); + + if(n_is_not_a_contact == 0) + contextMenu->addAction(QIcon(":/images/cancel.png"), tr("Remove from Contacts"), this, SLOT(removefromContacts())); + + contextMenu->addSeparator(); + + if(n_positive_reputations == 0) // only unban when all items are banned + contextMenu->addAction(QIcon(":/icons/png/thumbs-up.png"), tr("Set positive opinion"), this, SLOT(positivePerson())); + + if(n_neutral_reputations == 0) // only unban when all items are banned + contextMenu->addAction(QIcon(":/icons/png/thumbs-neutral.png"), tr("Set neutral opinion"), this, SLOT(neutralPerson())); + + if(n_negative_reputations == 0) + contextMenu->addAction(QIcon(":/icons/png/thumbs-down.png"), tr("Set negative opinion"), this, SLOT(negativePerson())); + } + + if(one_item_owned_by_you && n_selected_items==1) + { + contextMenu->addSeparator(); + + contextMenu->addAction(ui->editIdentity); + contextMenu->addAction(ui->removeIdentity); + } + + } + + contextMenu = ui->idTreeWidget->createStandardContextMenu(contextMenu); + + contextMenu->exec(QCursor::pos()); + delete contextMenu; +} + +void IdDialog::copyRetroshareLink() +{ + QTreeWidgetItem *item = ui->idTreeWidget->currentItem(); + + if (!item) + { + std::cerr << "IdDialog::editIdentity() Invalid item"; + std::cerr << std::endl; + return; + } + + std::string keyId = item->text(RSID_COL_KEYID).toStdString(); + + RsIdentityDetails details ; + + if(! rsIdentity->getIdDetails(RsGxsId(keyId),details)) + return ; + + std::string radix ; + if(!rsIdentity->serialiseIdentityToMemory(details.mId,radix)) + { + std::cerr << "(EE) Cannot get radix data for key " << keyId << std::endl; + return; + } + QList urls ; + + RetroShareLink link ; + link.createIdentity(RsGxsId(keyId),QString::fromUtf8(details.mNickname.c_str()),QString::fromStdString(radix)) ; + + RSLinkClipboard::copyLinks(urls) ; + + QMessageBox::information(NULL,tr("information"),tr("This identity link was copied to your clipboard. Paste it in a mail, or a message to transmit the identity to someone.")) ; } void IdDialog::chatIdentity() diff --git a/retroshare-gui/src/gui/Identity/IdDialog.h b/retroshare-gui/src/gui/Identity/IdDialog.h index a44d83677..64ab756af 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.h +++ b/retroshare-gui/src/gui/Identity/IdDialog.h @@ -93,6 +93,7 @@ private slots: void editIdentity(); void chatIdentity(); void sendMsg(); + void copyRetroshareLink(); void on_closeInfoFrameButton_clicked(); void updateSelection(); diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index 957b61f7f..a2075aa24 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -67,7 +67,8 @@ #define HOST_SEARCH "search" #define HOST_CERTIFICATE "certificate" #define HOST_PUBLIC_MSG "public_msg" -#define HOST_REGEXP "file|extra|person|forum|channel|posted|search|message|certificate|private_chat|public_msg" +#define HOST_IDENTITY "identity" +#define HOST_REGEXP "file|extra|person|forum|channel|posted|search|message|certificate|private_chat|public_msg|identity" #define FILE_NAME "name" #define FILE_SIZE "size" @@ -89,6 +90,9 @@ #define POSTED_ID "id" #define POSTED_MSGID "msgid" +#define IDENTITY_NAME "name" +#define IDENTITY_ID "gxsid" +#define IDENTITY_GROUP "groupdata" #define MESSAGE_ID "id" #define MESSAGE_SUBJECT "subject" @@ -333,6 +337,21 @@ RetroShareLink::RetroShareLink() clear(); } +bool RetroShareLink::createIdentity(const RsGxsId& id, const QString& name, const QString& radix_data) +{ + clear(); + + _name = name; + _hash = QString::fromStdString(id.toStdString()); + _radix_group_data = radix_data ; + + _type = TYPE_IDENTITY; + + check(); + + return valid(); +} + bool RetroShareLink::createExtraFile(const QString& name, uint64_t size, const QString& hash,const QString& ssl_id) { clear(); @@ -534,6 +553,7 @@ void RetroShareLink::clear() _GPGid = "" ; _time_stamp = 0 ; _encrypted_chat_info = "" ; + _radix_group_data = "" ; } void RetroShareLink::check() @@ -565,6 +585,17 @@ void RetroShareLink::check() if(!checkPGPId(_GPGid)) _valid = false ; break ; + case TYPE_IDENTITY: + if(_name.isNull()) + _valid = false ; + + if(_radix_group_data.isNull()) + _valid = false ; + + if(_hash.isNull()) + _valid = false ; + break ; + case TYPE_PERSON: if(_size != 0) _valid = false; @@ -651,6 +682,9 @@ QString RetroShareLink::title() const return QObject::tr("%1 (%2, Extra - Source included)").arg(hash()).arg(misc::friendlyUnit(size())); case TYPE_FILE: return QString("%1 (%2)").arg(hash()).arg(misc::friendlyUnit(size())); + case TYPE_IDENTITY: + return _name ; + case TYPE_PERSON: return PeerDefs::rsidFromId(RsPgpId(hash().toStdString())); case TYPE_FORUM: @@ -711,6 +745,14 @@ QString RetroShareLink::toString() const break; + case TYPE_IDENTITY: + url.setScheme(RSLINK_SCHEME) ; + url.setHost(HOST_IDENTITY) ; + urlQuery.addQueryItem(IDENTITY_ID,_hash) ; + urlQuery.addQueryItem(IDENTITY_NAME,encodeItem(_name)) ; + urlQuery.addQueryItem(IDENTITY_GROUP,_radix_group_data) ; + break ; + case TYPE_EXTRAFILE: url.setScheme(RSLINK_SCHEME); url.setHost(HOST_EXTRAFILE); @@ -798,9 +840,11 @@ QString RetroShareLink::toString() const QString RetroShareLink::niceName() const { - if (type() == TYPE_PERSON) { + if (type() == TYPE_PERSON) return PeerDefs::rsid(name().toUtf8().constData(), RsPgpId(hash().toStdString())); - } + + if(type() == TYPE_IDENTITY) + return QObject::tr("Click this link to add this person (name=%1, ID=%2) to your People tab.").arg(_name).arg(_hash) ; if(type() == TYPE_PUBLIC_MSG) { RsPeerDetails detail; @@ -1156,6 +1200,15 @@ static void processList(const QStringList &list, const QString &textSingular, co } break ; + case TYPE_IDENTITY: + { + if(rsIdentity->deserialiseIdentityFromMemory(link.radixGroupData().toStdString())) + QMessageBox::information(NULL,QObject::tr("Identity added to People"),QObject::tr("The identity was added to people. You can now chat with it, send messages to it, etc.")) ; + else + QMessageBox::warning(NULL,QObject::tr("Identity cannot be added to People"),QObject::tr("The identity was not added to people. Some error occured. The link is probably corrupted.")) ; + } + break; + case TYPE_FILE: case TYPE_EXTRAFILE: { diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index d1390d18d..b272f3416 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -68,7 +68,8 @@ class RetroShareLink TYPE_EXTRAFILE = 0x08, TYPE_PRIVATE_CHAT = 0x09, TYPE_PUBLIC_MSG = 0x0a, - TYPE_POSTED = 0x0b + TYPE_POSTED = 0x0b, + TYPE_IDENTITY = 0x0c }; public: @@ -85,6 +86,7 @@ class RetroShareLink bool createSearch(const QString& keywords); bool createMessage(const RsPeerId &peerId, const QString& subject); bool createMessage(const RsGxsId &peerId, const QString& subject); + bool createIdentity(const RsGxsId& gxs_id,const QString& name,const QString& radix_data) ; bool createCertificate(const RsPeerId &ssl_id) ; bool createPublicMsgInvite(time_t time_stamp,const QString& pgp_id,const QString& hash) ; bool createUnknwonSslCertificate(const RsPeerId &sslId, const RsPgpId &gpgId = RsPgpId()) ; @@ -101,12 +103,13 @@ class RetroShareLink const QString& SSLId() const { return _SSLid ; } const QString& GPGId() const { return _GPGid ; } const QString& localIPAndPort() const { return _loc_ip_port ; } - const QString& externalIPAndPort() const { return _ext_ip_port ; } - const QString& dyndns() const { return _dyndns_name ; } - const QString& location() const { return _location ; } - const QString& radix() const { return _radix ; } - time_t timeStamp() const { return _time_stamp ; } - QString title() const; + const QString& externalIPAndPort() const { return _ext_ip_port ; } + const QString& dyndns() const { return _dyndns_name ; } + const QString& location() const { return _location ; } + const QString& radix() const { return _radix ; } + time_t timeStamp() const { return _time_stamp ; } + QString title() const; + QString radixGroupData() const { return _radix_group_data ;} unsigned int subType() const { return _subType; } void setSubType(unsigned int subType) { _subType = subType; } @@ -158,12 +161,13 @@ class RetroShareLink QString _GPGBase64String ; // GPG Cert QString _GPGBase64CheckSum ; // GPG Cert QString _location ; // location - QString _ext_ip_port ; - QString _loc_ip_port ; - QString _dyndns_name ; + QString _ext_ip_port ; + QString _loc_ip_port ; + QString _dyndns_name ; QString _radix ; - QString _encrypted_chat_info ; // encrypted data string for the recipient of a chat invite - time_t _time_stamp ; // time stamp at which the link will expire. + QString _encrypted_chat_info ; // encrypted data string for the recipient of a chat invite + time_t _time_stamp ; // time stamp at which the link will expire. + QString _radix_group_data; unsigned int _subType; // for general use as sub type for _type (RSLINK_SUBTYPE_...) }; From 54cd402f1c8c6175501782178507cf2168b3371d Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 8 Apr 2017 21:43:07 +0200 Subject: [PATCH 43/88] fixed a few bugs in latest identity link code --- retroshare-gui/src/gui/Identity/IdDialog.cpp | 1 + retroshare-gui/src/gui/RetroShareLink.cpp | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 4b28a1b09..050785db1 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -2432,6 +2432,7 @@ void IdDialog::copyRetroshareLink() RetroShareLink link ; link.createIdentity(RsGxsId(keyId),QString::fromUtf8(details.mNickname.c_str()),QString::fromStdString(radix)) ; + urls.push_back(link); RSLinkClipboard::copyLinks(urls) ; diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index a2075aa24..4d32930aa 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -307,6 +307,21 @@ void RetroShareLink::fromUrl(const QUrl& url) return; } + if(url.host() == HOST_IDENTITY) { + _type = TYPE_IDENTITY ; + QString name = urlQuery.queryItemValue(IDENTITY_NAME) ; + QString radix= urlQuery.queryItemValue(IDENTITY_GROUP) ; + QString gxsid= urlQuery.queryItemValue(IDENTITY_ID) ; + + RsGxsId id(gxsid.toStdString()) ; + + if(!id.isNull()) + createIdentity(id,name,radix) ; + else + std::cerr << "(EE) identity link is not valid." << std::endl; + return ; + } + if (url.host() == HOST_MESSAGE) { _type = TYPE_MESSAGE; std::string id = urlQuery.queryItemValue(MESSAGE_ID).toStdString(); @@ -844,7 +859,7 @@ QString RetroShareLink::niceName() const return PeerDefs::rsid(name().toUtf8().constData(), RsPgpId(hash().toStdString())); if(type() == TYPE_IDENTITY) - return QObject::tr("Click this link to add this person (name=%1, ID=%2) to your People tab.").arg(_name).arg(_hash) ; + return QObject::tr("Identity link (name=%1, ID=%2)").arg(_name).arg(_hash) ; if(type() == TYPE_PUBLIC_MSG) { RsPeerDetails detail; @@ -1055,6 +1070,7 @@ static void processList(const QStringList &list, const QString &textSingular, co case TYPE_POSTED: case TYPE_SEARCH: case TYPE_MESSAGE: + case TYPE_IDENTITY: case TYPE_CERTIFICATE: case TYPE_PUBLIC_MSG: case TYPE_PRIVATE_CHAT: From d66e653204423622bd9adb2bfa22c8bf1d2a24f1 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 8 Apr 2017 23:39:05 +0200 Subject: [PATCH 44/88] fixed bug in deserialisation of group informaiton --- libretroshare/src/gxs/rsgenexchange.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc index 4d70ee409..571489212 100644 --- a/libretroshare/src/gxs/rsgenexchange.cc +++ b/libretroshare/src/gxs/rsgenexchange.cc @@ -1310,7 +1310,7 @@ bool RsGenExchange::deserializeGroupData(unsigned char *data,uint32_t size) { RS_STACK_MUTEX(mGenMtx) ; - RsItem *item = mSerialiser->deserialise(data, &size); + RsItem *item = RsNxsSerialiser(mServType).deserialise(data, &size); RsNxsGrp *nxs_grp = dynamic_cast(item) ; @@ -1321,7 +1321,7 @@ bool RsGenExchange::deserializeGroupData(unsigned char *data,uint32_t size) return false ; } - mReceivedGrps.push_back( GxsPendingItem(nxs_grp, nxs_grp->metaData->mGroupId,time(NULL)) ); + mReceivedGrps.push_back( GxsPendingItem(nxs_grp, nxs_grp->grpId,time(NULL)) ); return true ; } From 7f12ca266bd5e3ff217f16bd087ad393b27a3536 Mon Sep 17 00:00:00 2001 From: electron128 Date: Sun, 9 Apr 2017 09:57:48 +0200 Subject: [PATCH 45/88] fixed name of local socket where RS waits for rslinks etc. --- retroshare-gui/src/retroshare-gui.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index 9e2951f87..6c4fdeb67 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -5,7 +5,7 @@ QT += network xml CONFIG += qt gui uic qrc resources idle bitdht CONFIG += link_prl TARGET = RetroShare06 -DEFINES += TARGET=\\\"$TARGET\\\" +DEFINES += TARGET=\\\"$${TARGET}\\\" # Plz never commit the .pro with these flags enabled. # Use this flag when developping new features only. From 4c9b62070f3d58799293bf0a5bfdb4947351f2ff Mon Sep 17 00:00:00 2001 From: electron128 Date: Sun, 9 Apr 2017 10:26:18 +0200 Subject: [PATCH 46/88] fixed --base-dir command line argument in rs-gui when running multiple instances. Only forward "link" and "rsfile" arguments to a running instance. Start a new instance if other arguments are present. --- retroshare-gui/src/rshare.cpp | 86 +++++++++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/retroshare-gui/src/rshare.cpp b/retroshare-gui/src/rshare.cpp index a2de0840a..040992afe 100644 --- a/retroshare-gui/src/rshare.cpp +++ b/retroshare-gui/src/rshare.cpp @@ -68,6 +68,17 @@ #define ARG_RSFILE_L "rsfile" /**< Open RsFile with or without arg */ //Other defined for server in /libretroshare/src/rsserver/rsinit.cc:351 +// The arguments here can be send to a running instance. +// If the command line contains arguments not listed here, we have to start a new instance. +// For exmample, the user wants to start a second instance using --base-dir arg of libretroshare. +static const char* const forwardableArgs[] = { + ARG_RSLINK_S, + ARG_RSLINK_L, + ARG_RSFILE_S, + ARG_RSFILE_L, + NULL, +}; + /* Static member variables */ QMap Rshare::_args; /**< List of command-line arguments. */ QString Rshare::_style; /**< The current GUI style. */ @@ -115,6 +126,27 @@ void qt_msg_handler(QtMsgType type, const char *msg) } } +static bool notifyRunningInstance() +{ + // Connect to the Local Server of the main process to notify it + // that a new process had been started + QLocalSocket localSocket; + localSocket.connectToServer(QString(TARGET)); + + std::cerr << "Rshare::Rshare waitForConnected to other instance." << std::endl; + if( localSocket.waitForConnected(100) ) + { + std::cerr << "Rshare::Rshare Connection etablished. Waiting for disconnection." << std::endl; + localSocket.waitForDisconnected(1000); + return true; + } + else + { + std::cerr << "Rshare::Rshare failed to connect to other instance." << std::endl; + return false; + } +} + /** Constructor. Parses the command-line arguments, resets Rshare's * configuration (if requested), and sets up the GUI style and language * translation. */ @@ -128,7 +160,32 @@ Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir) { QString serverName = QString(TARGET); - if (!args.isEmpty()) { + // check if another instance is running + bool haveRunningInstance = notifyRunningInstance(); + + bool sendArgsToRunningInstance = haveRunningInstance; + if(args.empty()) + sendArgsToRunningInstance = false; + // if we find non-forwardable args, start a new instance + for(int i = 0; i < args.size(); ++i) + { + const char* const* argit = forwardableArgs; + bool found = false; + while(*argit && i < args.size()) + { + if(args.value(i) == "-"+QString(*argit) || args.value(i) == "--"+QString(*argit)) + { + found = true; + if(argNeedsValue(*argit)) + i++; + } + argit++; + } + if(!found) + sendArgsToRunningInstance = false; + } + + if (sendArgsToRunningInstance) { // load into shared memory QBuffer buffer; buffer.open(QBuffer::ReadWrite); @@ -156,30 +213,29 @@ Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir) memcpy(to, from, qMin(newArgs.size(), size)); newArgs.unlock(); - // Connect to the Local Server of the main process to notify it - // that a new process had been started - QLocalSocket localSocket; - localSocket.connectToServer(QString(TARGET)); - std::cerr << "Rshare::Rshare waitForConnected to other instance." << std::endl; - if( localSocket.waitForConnected(100) ) + if(notifyRunningInstance()) { - std::cerr << "Rshare::Rshare Connection etablished. Waiting for disconnection." << std::endl; - localSocket.waitForDisconnected(1000); newArgs.detach(); std::cerr << "Rshare::Rshare Arguments was sended." << std::endl << " To disable it, in Options - General - Misc," << std::endl << " uncheck \"Use Local Server to get new Arguments\"." << std::endl; ::exit(EXIT_SUCCESS); // Terminate the program using STDLib's exit function } + else + std::cerr << "Rshare::Rshare failed to connect to other instance." << std::endl; newArgs.detach(); } - // No main process exists - // Or started without arguments - // So we start a Local Server to listen for connections from new process - localServer= new QLocalServer(); - QObject::connect(localServer, SIGNAL(newConnection()), this, SLOT(slotConnectionEstablished())); - updateLocalServer(); + + if(!haveRunningInstance) + { + // No main process exists + // Or started without arguments + // So we start a Local Server to listen for connections from new process + localServer= new QLocalServer(); + QObject::connect(localServer, SIGNAL(newConnection()), this, SLOT(slotConnectionEstablished())); + updateLocalServer(); + } } #if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0) From 3130ec90412b29ce7df65528389b1237a9865b47 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 10 Apr 2017 20:02:14 +0200 Subject: [PATCH 47/88] added GUI async call to ID serialised data. Allows to copy+paste identities. --- libretroshare/src/gxs/rsgxsdataaccess.cc | 77 +++++++++++----- libretroshare/src/gxs/rsgxsdataaccess.h | 7 ++ libretroshare/src/gxs/rsgxsrequesttypes.h | 6 ++ libretroshare/src/retroshare/rsidentity.h | 1 + libretroshare/src/retroshare/rstokenservice.h | 1 + libretroshare/src/services/p3idservice.cc | 22 +++++ libretroshare/src/services/p3idservice.h | 2 + retroshare-gui/src/gui/Identity/IdDialog.cpp | 91 +++++++++++++++---- retroshare-gui/src/gui/Identity/IdDialog.h | 1 + 9 files changed, 168 insertions(+), 40 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsdataaccess.cc b/libretroshare/src/gxs/rsgxsdataaccess.cc index 8fcbbde5d..56899d4ce 100644 --- a/libretroshare/src/gxs/rsgxsdataaccess.cc +++ b/libretroshare/src/gxs/rsgxsdataaccess.cc @@ -75,6 +75,12 @@ bool RsGxsDataAccess::requestGroupInfo(uint32_t &token, uint32_t ansType, const gir->mGroupIds = groupIds; req = gir; } + else if(reqType & GXS_REQUEST_TYPE_GROUP_SERIALIZED_DATA) + { + GroupSerializedDataReq* gir = new GroupSerializedDataReq(); + gir->mGroupIds = groupIds; + req = gir; + } if(req == NULL) { @@ -103,34 +109,25 @@ bool RsGxsDataAccess::requestGroupInfo(uint32_t &token, uint32_t ansType, const uint32_t reqType = opts.mReqType; if(reqType & GXS_REQUEST_TYPE_GROUP_META) - { - GroupMetaReq* gmr = new GroupMetaReq(); - req = gmr; - } + req = new GroupMetaReq(); else if(reqType & GXS_REQUEST_TYPE_GROUP_DATA) - { - GroupDataReq* gdr = new GroupDataReq(); - req = gdr; - } + req = new GroupDataReq(); else if(reqType & GXS_REQUEST_TYPE_GROUP_IDS) - { - GroupIdReq* gir = new GroupIdReq(); - req = gir; - } - - if(req == NULL) + req = new GroupIdReq(); + else if(reqType & GXS_REQUEST_TYPE_GROUP_SERIALIZED_DATA) + req = new GroupSerializedDataReq(); + else { std::cerr << "RsGxsDataAccess::requestGroupInfo() request type not recognised, type " << reqType << std::endl; return false; - }else - { - generateToken(token); -#ifdef DATA_DEBUG - std::cerr << "RsGxsDataAccess::requestGroupInfo() gets Token: " << token << std::endl; -#endif } + generateToken(token); +#ifdef DATA_DEBUG + std::cerr << "RsGxsDataAccess::requestGroupInfo() gets Token: " << token << std::endl; +#endif + setReq(req, token, ansType, opts); storeRequest(req); @@ -430,7 +427,16 @@ bool RsGxsDataAccess::getGroupData(const uint32_t& token, std::list& else if(req->status == GXS_REQUEST_V2_STATUS_COMPLETE) { GroupDataReq* gmreq = dynamic_cast(req); - if(gmreq) + GroupSerializedDataReq* gsreq = dynamic_cast(req); + + if(gsreq) + { + grpData.swap(gsreq->mGroupData); + gsreq->mGroupData.clear(); + + locked_updateRequestStatus(token, GXS_REQUEST_V2_STATUS_DONE); + } + else if(gmreq) { grpData.swap(gmreq->mGroupData); gmreq->mGroupData.clear(); @@ -804,6 +810,7 @@ void RsGxsDataAccess::processRequests() MsgIdReq* mir; MsgRelatedInfoReq* mri; GroupStatisticRequest* gsr; + GroupSerializedDataReq* grr; ServiceStatisticRequest* ssr; #ifdef DATA_DEBUG @@ -851,6 +858,11 @@ void RsGxsDataAccess::processRequests() { ok = getServiceStatistic(ssr); } + else if((grr = dynamic_cast(req)) != NULL) + { + ok = getGroupSerializedData(grr); + } + else { std::cerr << "RsGxsDataAccess::processRequests() Failed to process request, token: " @@ -929,7 +941,30 @@ bool RsGxsDataAccess::getServiceStatistic(const uint32_t &token, GxsServiceStati return true; } +bool RsGxsDataAccess::getGroupSerializedData(GroupSerializedDataReq* req) +{ + std::map grpData; + std::list grpIdsOut; + getGroupList(req->mGroupIds, req->Options, grpIdsOut); + + if(grpIdsOut.empty()) + return true; + + + for(std::list::iterator lit = grpIdsOut.begin();lit != grpIdsOut.end();++lit) + grpData[*lit] = NULL; + + bool ok = mDataStore->retrieveNxsGrps(grpData, true, true); + req->mGroupData.clear(); + + std::map::iterator mit = grpData.begin(); + + for(; mit != grpData.end(); ++mit) + req->mGroupData.push_back(mit->second) ; + + return ok; +} bool RsGxsDataAccess::getGroupData(GroupDataReq* req) { std::map grpData; diff --git a/libretroshare/src/gxs/rsgxsdataaccess.h b/libretroshare/src/gxs/rsgxsdataaccess.h index ac21f4c41..d39823f81 100644 --- a/libretroshare/src/gxs/rsgxsdataaccess.h +++ b/libretroshare/src/gxs/rsgxsdataaccess.h @@ -418,6 +418,13 @@ private: */ bool getGroupStatistic(GroupStatisticRequest* req); + /*! + * + * Attempts to retrieve group data in serialized format + * @param req Request object to satisfy + */ + bool getGroupSerializedData(GroupSerializedDataReq* req); + /*! * * Attempts to service statistic diff --git a/libretroshare/src/gxs/rsgxsrequesttypes.h b/libretroshare/src/gxs/rsgxsrequesttypes.h index a344a55e7..8009f294b 100644 --- a/libretroshare/src/gxs/rsgxsrequesttypes.h +++ b/libretroshare/src/gxs/rsgxsrequesttypes.h @@ -61,6 +61,12 @@ public: std::list mGroupIds; std::list mGroupIdResult; }; +class GroupSerializedDataReq : public GxsRequest +{ +public: + std::list mGroupIds; + std::list mGroupData; +}; class GroupDataReq : public GxsRequest { diff --git a/libretroshare/src/retroshare/rsidentity.h b/libretroshare/src/retroshare/rsidentity.h index 53704961d..6be124e93 100644 --- a/libretroshare/src/retroshare/rsidentity.h +++ b/libretroshare/src/retroshare/rsidentity.h @@ -322,6 +322,7 @@ public: */ virtual bool getGroupData(const uint32_t &token, std::vector &groups) = 0; + virtual bool getGroupSerializedData(const uint32_t &token, std::map& serialized_groups)=0; //virtual bool getMsgData(const uint32_t &token, std::vector &opinions) = 0; }; diff --git a/libretroshare/src/retroshare/rstokenservice.h b/libretroshare/src/retroshare/rstokenservice.h index c55213965..5e74a527f 100644 --- a/libretroshare/src/retroshare/rstokenservice.h +++ b/libretroshare/src/retroshare/rstokenservice.h @@ -47,6 +47,7 @@ #define GXS_REQUEST_TYPE_GROUP_STATS 0x01600000 #define GXS_REQUEST_TYPE_SERVICE_STATS 0x03200000 +#define GXS_REQUEST_TYPE_GROUP_SERIALIZED_DATA 0x04000000 // TODO CLEANUP: RS_TOKREQOPT_MSG_* should be an inner enum of RsTokReqOptions diff --git a/libretroshare/src/services/p3idservice.cc b/libretroshare/src/services/p3idservice.cc index 9aeec2aea..dcc45af65 100644 --- a/libretroshare/src/services/p3idservice.cc +++ b/libretroshare/src/services/p3idservice.cc @@ -1474,6 +1474,28 @@ bool p3IdService::getGroupData(const uint32_t &token, std::vector return ok; } +bool p3IdService::getGroupSerializedData(const uint32_t &token, std::map& serialized_groups) +{ + unsigned char *mem = NULL; + uint32_t size; + RsGxsGroupId id ; + + serialized_groups.clear() ; + + if(!RsGenExchange::getSerializedGroupData(token,id, mem,size)) + { + std::cerr << "(EE) call to RsGenExchage::getSerializedGroupData() failed." << std::endl; + return false; + } + + std::string radix ; + + Radix64::encode(mem,size,radix) ; + + serialized_groups[RsGxsId(id)] = radix ; + + return true; +} /********************************************************************************/ /********************************************************************************/ diff --git a/libretroshare/src/services/p3idservice.h b/libretroshare/src/services/p3idservice.h index 6e4585eb6..91e55fe6d 100644 --- a/libretroshare/src/services/p3idservice.h +++ b/libretroshare/src/services/p3idservice.h @@ -245,6 +245,8 @@ public: // These are exposed via RsIdentity. virtual bool getGroupData(const uint32_t &token, std::vector &groups); + virtual bool getGroupSerializedData(const uint32_t &token, std::map& serialized_groups); + //virtual bool getMsgData(const uint32_t &token, std::vector &opinions); // These are local - and not exposed via RsIdentity. diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 050785db1..b7923dc49 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -55,10 +55,11 @@ *****/ // Data Requests. -#define IDDIALOG_IDLIST 1 -#define IDDIALOG_IDDETAILS 2 -#define IDDIALOG_REPLIST 3 -#define IDDIALOG_REFRESH 4 +#define IDDIALOG_IDLIST 1 +#define IDDIALOG_IDDETAILS 2 +#define IDDIALOG_REPLIST 3 +#define IDDIALOG_REFRESH 4 +#define IDDIALOG_SERIALIZED_GROUP 5 #define CIRCLEGROUP_CIRCLE_COL_GROUPNAME 0 #define CIRCLEGROUP_CIRCLE_COL_GROUPID 1 @@ -814,7 +815,7 @@ void IdDialog::loadCircleGroupData(const uint32_t& token) #ifdef ID_DEBUG std::cerr << "Loading circle info" << std::endl; #endif - + std::vector circle_grp_v ; rsGxsCircles->getGroupData(token, circle_grp_v); @@ -1385,6 +1386,8 @@ void IdDialog::updateSelection() } } + + void IdDialog::requestIdList() { //Disable by default, will be enable by insertIdDetails() @@ -2174,6 +2177,45 @@ void IdDialog::insertRepList(uint32_t token) mStateHelper->setActive(IDDIALOG_REPLIST, true); } +void IdDialog::handleSerializedGroupData(uint32_t token) +{ + std::map serialized_group_map ; + + rsIdentity->getGroupSerializedData(token, serialized_group_map); + + if(serialized_group_map.size() < 1) + { + std::cerr << "(EE) Cannot get radix data " << std::endl; + return; + } + if(serialized_group_map.size() > 1) + { + std::cerr << "(EE) Too many results for serialized data" << std::endl; + return; + } + + RsGxsId gxs_id = serialized_group_map.begin()->first ; + std::string radix = serialized_group_map.begin()->second ; + + RsIdentityDetails details ; + + if(!rsIdentity->getIdDetails(gxs_id,details)) + { + std::cerr << "(EE) Cannot get id details for key " << gxs_id << std::endl; + return; + } + + QList urls ; + + RetroShareLink link ; + link.createIdentity(gxs_id,QString::fromUtf8(details.mNickname.c_str()),QString::fromStdString(radix)) ; + urls.push_back(link); + + RSLinkClipboard::copyLinks(urls) ; + + QMessageBox::information(NULL,tr("information"),tr("This identity link was copied to your clipboard. Paste it in a mail, or a message to transmit the identity to someone.")) ; +} + void IdDialog::loadRequest(const TokenQueue * queue, const TokenRequest &req) { #ifdef ID_DEBUG @@ -2197,6 +2239,10 @@ void IdDialog::loadRequest(const TokenQueue * queue, const TokenRequest &req) insertRepList(req.mToken); break; + case IDDIALOG_SERIALIZED_GROUP: + handleSerializedGroupData(req.mToken); + break; + case IDDIALOG_REFRESH: // replaced by RsGxsUpdateBroadcastPage // updateDisplay(true); @@ -2415,28 +2461,35 @@ void IdDialog::copyRetroshareLink() return; } - std::string keyId = item->text(RSID_COL_KEYID).toStdString(); + RsGxsId gxs_id(item->text(RSID_COL_KEYID).toStdString()); + + if(gxs_id.isNull()) + { + std::cerr << "Null GXS id. Something went wrong." << std::endl; + return ; + } RsIdentityDetails details ; - if(! rsIdentity->getIdDetails(RsGxsId(keyId),details)) + if(! rsIdentity->getIdDetails(gxs_id,details)) return ; - std::string radix ; - if(!rsIdentity->serialiseIdentityToMemory(details.mId,radix)) - { - std::cerr << "(EE) Cannot get radix data for key " << keyId << std::endl; - return; - } - QList urls ; + if (!mIdQueue) + return; - RetroShareLink link ; - link.createIdentity(RsGxsId(keyId),QString::fromUtf8(details.mNickname.c_str()),QString::fromStdString(radix)) ; - urls.push_back(link); + mStateHelper->setLoading(IDDIALOG_SERIALIZED_GROUP, true); - RSLinkClipboard::copyLinks(urls) ; + mIdQueue->cancelActiveRequestTokens(IDDIALOG_SERIALIZED_GROUP); - QMessageBox::information(NULL,tr("information"),tr("This identity link was copied to your clipboard. Paste it in a mail, or a message to transmit the identity to someone.")) ; + std::list ids ; + ids.push_back(RsGxsGroupId(gxs_id)) ; + + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_GROUP_SERIALIZED_DATA; + + uint32_t token; + + mIdQueue->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, ids, IDDIALOG_SERIALIZED_GROUP); } void IdDialog::chatIdentity() diff --git a/retroshare-gui/src/gui/Identity/IdDialog.h b/retroshare-gui/src/gui/Identity/IdDialog.h index 64ab756af..1eaae935d 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.h +++ b/retroshare-gui/src/gui/Identity/IdDialog.h @@ -133,6 +133,7 @@ private: void requestRepList(); void insertRepList(uint32_t token); + void handleSerializedGroupData(uint32_t token); void requestIdEdit(std::string &id); void showIdEdit(uint32_t token); From e1350a0b34be63b63d566c639c55b5ead635d7f0 Mon Sep 17 00:00:00 2001 From: Konrad Date: Mon, 10 Apr 2017 22:58:23 +0200 Subject: [PATCH 48/88] Fixed: Re-selecting accounts via RsControlModule; Added: Sending feedback about incorrect password --- libresapi/src/api/RsControlModule.cpp | 38 ++++++++++++++++++++------- libresapi/src/api/RsControlModule.h | 1 + 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/libresapi/src/api/RsControlModule.cpp b/libresapi/src/api/RsControlModule.cpp index 595509f09..f65c6058c 100644 --- a/libresapi/src/api/RsControlModule.cpp +++ b/libresapi/src/api/RsControlModule.cpp @@ -24,7 +24,9 @@ RsControlModule::RsControlModule(int argc, char **argv, StateTokenServer* sts, A mDataMtx("RsControlModule::mDataMtx"), mRunState(WAITING_INIT), mAutoLoginNextTime(false), - mWantPassword(false) + mWantPassword(false), + mPassword(""), + mPrevIsBad(false) { mStateToken = sts->getNewToken(); this->argc = argc; @@ -56,11 +58,14 @@ bool RsControlModule::processShouldExit() return mProcessShouldExit; } -bool RsControlModule::askForPassword(const std::string &title, const std::string &key_details, bool /* prev_is_bad */, std::string &password, bool& cancelled) +bool RsControlModule::askForPassword(const std::string &title, const std::string &key_details, bool prev_is_bad, std::string &password, bool& cancelled) { cancelled = false ; { RS_STACK_MUTEX(mDataMtx); // ********** LOCKED ********** + + mPrevIsBad = prev_is_bad; + if(mFixedPassword != "") { password = mFixedPassword; @@ -70,18 +75,25 @@ bool RsControlModule::askForPassword(const std::string &title, const std::string mWantPassword = true; mTitle = title; mKeyName = key_details; - mPassword = ""; + + if(mPassword != "") + { + password = mPassword; + mWantPassword = false; + mPassword = ""; + return true; + } + mStateTokenServer->replaceToken(mStateToken); } - bool wait = true; - while(wait) + int i = 0; + while(i<100) { usleep(5*1000); - RS_STACK_MUTEX(mDataMtx); // ********** LOCKED ********** - wait = mWantPassword; - if(!wait && mPassword != "") + + if(mPassword != "") { password = mPassword; mPassword = ""; @@ -89,6 +101,7 @@ bool RsControlModule::askForPassword(const std::string &title, const std::string mStateTokenServer->replaceToken(mStateToken); return true; } + i++; } return false; } @@ -175,8 +188,13 @@ void RsControlModule::run() std::cerr << "RsControlModule::run() LockAndLoadCertificates failed. Unexpected switch value: " << retVal << std::endl; break; } + + mLoadPeerId.clear(); + mPassword = ""; } + mFixedPassword = mPassword; + setRunState(WAITING_STARTUP); std::cerr << "RsControlModule: login ok, starting Retroshare worker threads..." << std::endl; @@ -302,12 +320,12 @@ void RsControlModule::handlePassword(Request &req, Response &resp) mPassword = passwd; mWantPassword = false; mStateTokenServer->replaceToken(mStateToken); - mFixedPassword = passwd; } resp.mDataStream << makeKeyValueReference("want_password", mWantPassword) - << makeKeyValueReference("key_name", mKeyName); + << makeKeyValueReference("key_name", mKeyName) + << makeKeyValueReference("prev_is_bad", mPrevIsBad); resp.mStateToken = mStateToken; resp.setOk(); } diff --git a/libresapi/src/api/RsControlModule.h b/libresapi/src/api/RsControlModule.h index 1323651fc..7e306405c 100644 --- a/libresapi/src/api/RsControlModule.h +++ b/libresapi/src/api/RsControlModule.h @@ -77,6 +77,7 @@ private: // to notify that a password callback is waiting // to answer the request, clear the flag and set the password bool mWantPassword; + bool mPrevIsBad; std::string mTitle; std::string mKeyName; std::string mPassword; From 9402b8e239a77b11c39a3df6aa9ed3be9433bd09 Mon Sep 17 00:00:00 2001 From: Konrad Date: Mon, 10 Apr 2017 23:42:22 +0200 Subject: [PATCH 49/88] Fixed: mFixedPassword remained empty after logging --- libresapi/src/api/RsControlModule.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libresapi/src/api/RsControlModule.cpp b/libresapi/src/api/RsControlModule.cpp index f65c6058c..f8e2d7e1e 100644 --- a/libresapi/src/api/RsControlModule.cpp +++ b/libresapi/src/api/RsControlModule.cpp @@ -67,7 +67,7 @@ bool RsControlModule::askForPassword(const std::string &title, const std::string mPrevIsBad = prev_is_bad; if(mFixedPassword != "") - { + { password = mFixedPassword; return true; } @@ -80,7 +80,6 @@ bool RsControlModule::askForPassword(const std::string &title, const std::string { password = mPassword; mWantPassword = false; - mPassword = ""; return true; } @@ -95,8 +94,7 @@ bool RsControlModule::askForPassword(const std::string &title, const std::string if(mPassword != "") { - password = mPassword; - mPassword = ""; + password = mPassword; mWantPassword = false; mStateTokenServer->replaceToken(mStateToken); return true; @@ -138,6 +136,7 @@ void RsControlModule::run() bool login_ok = false; while(!login_ok) { + mPassword = ""; // skip account selection if autologin is available if(initResult != RS_INIT_HAVE_ACCOUNT) setRunState(WAITING_ACCOUNT_SELECT); @@ -190,10 +189,10 @@ void RsControlModule::run() } mLoadPeerId.clear(); - mPassword = ""; } mFixedPassword = mPassword; + mPassword = ""; setRunState(WAITING_STARTUP); From aa81cc16d0ba49d7aa151fa766ae179cd1076f2a Mon Sep 17 00:00:00 2001 From: Konrad Date: Wed, 12 Apr 2017 20:24:18 +0200 Subject: [PATCH 50/88] Added: Functions for handling PGP account details requests --- libresapi/src/api/PeersHandler.cpp | 116 +++++++++++++++++++++++++++++ libresapi/src/api/PeersHandler.h | 3 + 2 files changed, 119 insertions(+) diff --git a/libresapi/src/api/PeersHandler.cpp b/libresapi/src/api/PeersHandler.cpp index f48beb2f6..14cd1b7c6 100644 --- a/libresapi/src/api/PeersHandler.cpp +++ b/libresapi/src/api/PeersHandler.cpp @@ -119,6 +119,8 @@ PeersHandler::PeersHandler(StateTokenServer* sts, RsNotify* notify, RsPeers *pee addResourceHandler("set_state_string", this, &PeersHandler::handleSetStateString); addResourceHandler("get_custom_state_string", this, &PeersHandler::handleGetCustomStateString); addResourceHandler("set_custom_state_string", this, &PeersHandler::handleSetCustomStateString); + addResourceHandler("get_pgp_options", this, &PeersHandler::handleGetPGPOptions); + addResourceHandler("set_pgp_options", this, &PeersHandler::handleSetPGPOptions); addResourceHandler("examine_cert", this, &PeersHandler::handleExamineCert); } @@ -529,6 +531,120 @@ void PeersHandler::handleExamineCert(Request &req, Response &resp) } } +void PeersHandler::handleGetPGPOptions(Request& req, Response& resp) +{ + std::string pgp_id; + req.mStream << makeKeyValueReference("pgp_id", pgp_id); + + RsPgpId pgp(pgp_id); + RsPeerDetails detail; + + if(!rsPeers->getGPGDetails(pgp, detail)) + { + resp.setFail(); + return; + } + + std::string pgp_key = rsPeers->getPGPKey(detail.gpg_id, false); + + resp.mDataStream << makeKeyValue("pgp_fingerprint", detail.fpr.toStdString()); + resp.mDataStream << makeKeyValueReference("pgp_key", pgp_key); + + resp.mDataStream << makeKeyValue("direct_transfer", detail.service_perm_flags & RS_NODE_PERM_DIRECT_DL); + resp.mDataStream << makeKeyValue("allow_push", detail.service_perm_flags & RS_NODE_PERM_ALLOW_PUSH); + resp.mDataStream << makeKeyValue("require_WL", detail.service_perm_flags & RS_NODE_PERM_REQUIRE_WL); + + resp.mDataStream << makeKeyValue("own_sign", detail.ownsign); + resp.mDataStream << makeKeyValue("trustLvl", detail.trustLvl); + + uint32_t max_upload_speed = 0; + uint32_t max_download_speed = 0; + + rsPeers->getPeerMaximumRates(pgp, max_upload_speed, max_download_speed); + + resp.mDataStream << makeKeyValueReference("maxUploadSpeed", max_upload_speed); + resp.mDataStream << makeKeyValueReference("maxDownloadSpeed", max_download_speed); + + StreamBase& signersStream = resp.mDataStream.getStreamToMember("gpg_signers"); + + // mark as list (in case list is empty) + signersStream.getStreamToMember(); + + for(std::list::const_iterator it(detail.gpgSigners.begin()); it != detail.gpgSigners.end(); ++it) + { + RsPeerDetails detail; + if(!rsPeers->getGPGDetails(*it, detail)) + continue; + + std::string pgp_id = (*it).toStdString(); + std::string name = detail.name; + + signersStream.getStreamToMember() + << makeKeyValueReference("pgp_id", pgp_id) + << makeKeyValueReference("name", name); + } + + resp.setOk(); +} + +void PeersHandler::handleSetPGPOptions(Request& req, Response& resp) +{ + std::string pgp_id; + req.mStream << makeKeyValueReference("pgp_id", pgp_id); + + RsPgpId pgp(pgp_id); + RsPeerDetails detail; + + if(!rsPeers->getGPGDetails(pgp, detail)) + { + resp.setFail(); + return; + } + + int trustLvl; + req.mStream << makeKeyValueReference("trustLvl", trustLvl); + + if(trustLvl != (int)detail.trustLvl) + rsPeers->trustGPGCertificate(pgp, trustLvl); + + int max_upload_speed; + int max_download_speed; + + req.mStream << makeKeyValueReference("max_upload_speed", max_upload_speed); + req.mStream << makeKeyValueReference("max_download_speed", max_download_speed); + + rsPeers->setPeerMaximumRates(pgp, (uint32_t)max_upload_speed, (uint32_t)max_download_speed); + + bool direct_transfer; + bool allow_push; + bool require_WL; + + req.mStream << makeKeyValueReference("direct_transfer", direct_transfer); + req.mStream << makeKeyValueReference("allow_push", allow_push); + req.mStream << makeKeyValueReference("require_WL", require_WL); + + ServicePermissionFlags flags(0); + + if(direct_transfer) + flags = flags | RS_NODE_PERM_DIRECT_DL; + if(allow_push) + flags = flags | RS_NODE_PERM_ALLOW_PUSH; + if(require_WL) + flags = flags | RS_NODE_PERM_REQUIRE_WL; + + rsPeers->setServicePermissionFlags(pgp, flags); + + bool own_sign; + req.mStream << makeKeyValueReference("own_sign", own_sign); + + if(own_sign) + rsPeers->signGPGCertificate(pgp); + + resp.mStateToken = getCurrentStateToken(); + + resp.setOk(); +} + StateToken PeersHandler::getCurrentStateToken() { RsStackMutex stack(mMtx); /********** STACK LOCKED MTX ******/ diff --git a/libresapi/src/api/PeersHandler.h b/libresapi/src/api/PeersHandler.h index 15d231c10..5ae393b2f 100644 --- a/libresapi/src/api/PeersHandler.h +++ b/libresapi/src/api/PeersHandler.h @@ -41,6 +41,9 @@ private: void handleGetCustomStateString(Request& req, Response& resp); void handleSetCustomStateString(Request& req, Response& resp); + void handleGetPGPOptions(Request& req, Response& resp); + void handleSetPGPOptions(Request& req, Response& resp); + // a helper which ensures proper mutex locking StateToken getCurrentStateToken(); From dcc8c6e4c35a35c5f8a775781ecc92a9b3e35cb9 Mon Sep 17 00:00:00 2001 From: Konrad Date: Thu, 13 Apr 2017 13:31:32 +0200 Subject: [PATCH 51/88] Changed: Using PeersHandler::mRsPeers instead of rsPeers --- libresapi/src/api/PeersHandler.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libresapi/src/api/PeersHandler.cpp b/libresapi/src/api/PeersHandler.cpp index 14cd1b7c6..8473bce04 100644 --- a/libresapi/src/api/PeersHandler.cpp +++ b/libresapi/src/api/PeersHandler.cpp @@ -539,13 +539,13 @@ void PeersHandler::handleGetPGPOptions(Request& req, Response& resp) RsPgpId pgp(pgp_id); RsPeerDetails detail; - if(!rsPeers->getGPGDetails(pgp, detail)) + if(!mRsPeers->getGPGDetails(pgp, detail)) { resp.setFail(); return; } - std::string pgp_key = rsPeers->getPGPKey(detail.gpg_id, false); + std::string pgp_key = mRsPeers->getPGPKey(detail.gpg_id, false); resp.mDataStream << makeKeyValue("pgp_fingerprint", detail.fpr.toStdString()); resp.mDataStream << makeKeyValueReference("pgp_key", pgp_key); @@ -560,7 +560,7 @@ void PeersHandler::handleGetPGPOptions(Request& req, Response& resp) uint32_t max_upload_speed = 0; uint32_t max_download_speed = 0; - rsPeers->getPeerMaximumRates(pgp, max_upload_speed, max_download_speed); + mRsPeers->getPeerMaximumRates(pgp, max_upload_speed, max_download_speed); resp.mDataStream << makeKeyValueReference("maxUploadSpeed", max_upload_speed); resp.mDataStream << makeKeyValueReference("maxDownloadSpeed", max_download_speed); @@ -573,7 +573,7 @@ void PeersHandler::handleGetPGPOptions(Request& req, Response& resp) for(std::list::const_iterator it(detail.gpgSigners.begin()); it != detail.gpgSigners.end(); ++it) { RsPeerDetails detail; - if(!rsPeers->getGPGDetails(*it, detail)) + if(!mRsPeers->getGPGDetails(*it, detail)) continue; std::string pgp_id = (*it).toStdString(); @@ -595,7 +595,7 @@ void PeersHandler::handleSetPGPOptions(Request& req, Response& resp) RsPgpId pgp(pgp_id); RsPeerDetails detail; - if(!rsPeers->getGPGDetails(pgp, detail)) + if(!mRsPeers->getGPGDetails(pgp, detail)) { resp.setFail(); return; @@ -605,7 +605,7 @@ void PeersHandler::handleSetPGPOptions(Request& req, Response& resp) req.mStream << makeKeyValueReference("trustLvl", trustLvl); if(trustLvl != (int)detail.trustLvl) - rsPeers->trustGPGCertificate(pgp, trustLvl); + mRsPeers->trustGPGCertificate(pgp, trustLvl); int max_upload_speed; int max_download_speed; @@ -613,7 +613,7 @@ void PeersHandler::handleSetPGPOptions(Request& req, Response& resp) req.mStream << makeKeyValueReference("max_upload_speed", max_upload_speed); req.mStream << makeKeyValueReference("max_download_speed", max_download_speed); - rsPeers->setPeerMaximumRates(pgp, (uint32_t)max_upload_speed, (uint32_t)max_download_speed); + mRsPeers->setPeerMaximumRates(pgp, (uint32_t)max_upload_speed, (uint32_t)max_download_speed); bool direct_transfer; bool allow_push; @@ -632,13 +632,13 @@ void PeersHandler::handleSetPGPOptions(Request& req, Response& resp) if(require_WL) flags = flags | RS_NODE_PERM_REQUIRE_WL; - rsPeers->setServicePermissionFlags(pgp, flags); + mRsPeers->setServicePermissionFlags(pgp, flags); bool own_sign; req.mStream << makeKeyValueReference("own_sign", own_sign); if(own_sign) - rsPeers->signGPGCertificate(pgp); + mRsPeers->signGPGCertificate(pgp); resp.mStateToken = getCurrentStateToken(); From 144d57047c1d084304142ab8785aedb2d03987e1 Mon Sep 17 00:00:00 2001 From: Konrad Date: Thu, 13 Apr 2017 13:40:30 +0200 Subject: [PATCH 52/88] Fixed: Thread safe access to RsControlModule member variables --- libresapi/src/api/RsControlModule.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/libresapi/src/api/RsControlModule.cpp b/libresapi/src/api/RsControlModule.cpp index f8e2d7e1e..2910bc443 100644 --- a/libresapi/src/api/RsControlModule.cpp +++ b/libresapi/src/api/RsControlModule.cpp @@ -136,7 +136,11 @@ void RsControlModule::run() bool login_ok = false; while(!login_ok) { - mPassword = ""; + { + RsStackMutex stack(mDataMtx); // ********** LOCKED ********** + mPassword = ""; + } + // skip account selection if autologin is available if(initResult != RS_INIT_HAVE_ACCOUNT) setRunState(WAITING_ACCOUNT_SELECT); @@ -188,11 +192,17 @@ void RsControlModule::run() break; } - mLoadPeerId.clear(); + { + RsStackMutex stack(mDataMtx); // ********** LOCKED ********** + mLoadPeerId.clear(); + } } - mFixedPassword = mPassword; - mPassword = ""; + { + RsStackMutex stack(mDataMtx); // ********** LOCKED ********** + mFixedPassword = mPassword; + mPassword = ""; + } setRunState(WAITING_STARTUP); From 273aae7cc1aad7ae0f9e41d3343b66ab2f1bbd62 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 15 Apr 2017 19:01:13 +0200 Subject: [PATCH 53/88] fixed sharing of own identity --- retroshare-gui/src/gui/Identity/IdDialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index b7923dc49..96b943d15 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -2409,7 +2409,7 @@ void IdDialog::IdListCustomPopupMenu( QPoint ) } if(n_selected_items==1) - QAction *action = contextMenu->addAction(QIcon(":/images/chat_24.png"),tr("Copy retroshare link"),this,SLOT(copyRetroshareLink())) ; + QAction *action = contextMenu->addAction(QIcon(":/images/chat_24.png"),tr("Copy identity to clipboard"),this,SLOT(copyRetroshareLink())) ; // always allow to send messages contextMenu->addAction(QIcon(":/images/mail_new.png"), tr("Send message"), this, SLOT(sendMsg())); @@ -2438,6 +2438,7 @@ void IdDialog::IdListCustomPopupMenu( QPoint ) { contextMenu->addSeparator(); + contextMenu->addAction(QIcon(":/images/chat_24.png"),tr("Copy identity to clipboard"),this,SLOT(copyRetroshareLink())) ; contextMenu->addAction(ui->editIdentity); contextMenu->addAction(ui->removeIdentity); } From cbc264f5a3f9f90afdd83831691e63291244a69f Mon Sep 17 00:00:00 2001 From: Phenom Date: Wed, 15 Mar 2017 18:53:30 +0100 Subject: [PATCH 54/88] Fix clang warning:Implicit conversion from enumeration warning: implicit conversion from enumeration type 'ops_s2k_usage_t' to different enumeration type 'ops_symmetric_algorithm_t' [-Wenum- conversion] C.secret_key.algorithm=C.secret_key.s2k_usage; ~~~~~~~~~~~~~~^~~~~~~~~ --- openpgpsdk/src/openpgpsdk/packet-parse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpgpsdk/src/openpgpsdk/packet-parse.c b/openpgpsdk/src/openpgpsdk/packet-parse.c index b80cf4ef8..a4596a55c 100644 --- a/openpgpsdk/src/openpgpsdk/packet-parse.c +++ b/openpgpsdk/src/openpgpsdk/packet-parse.c @@ -2394,7 +2394,7 @@ static int parse_secret_key(ops_region_t *region,ops_parse_info_t *pinfo) else if(C.secret_key.s2k_usage != OPS_S2KU_NONE) { // this is V3 style, looks just like a V4 simple hash - C.secret_key.algorithm=C.secret_key.s2k_usage; + C.secret_key.algorithm=(ops_symmetric_algorithm_t)C.secret_key.s2k_usage; C.secret_key.s2k_usage=OPS_S2KU_ENCRYPTED; C.secret_key.s2k_specifier=OPS_S2KS_SIMPLE; C.secret_key.hash_algorithm=OPS_HASH_MD5; From da4b168a04ddeb797e2db9f47cf9707da01aa63c Mon Sep 17 00:00:00 2001 From: Phenom Date: Wed, 15 Mar 2017 18:55:24 +0100 Subject: [PATCH 55/88] Fix Clang warnings: mFns is not used warning: private field 'mFns' is not used [-Wunused-private-field] bdDhtFunctions *mFns; ^ --- libbitdht/src/udp/udpbitdht.cc | 2 +- libbitdht/src/udp/udpbitdht.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libbitdht/src/udp/udpbitdht.cc b/libbitdht/src/udp/udpbitdht.cc index 5410d50e0..39c13e182 100644 --- a/libbitdht/src/udp/udpbitdht.cc +++ b/libbitdht/src/udp/udpbitdht.cc @@ -58,7 +58,7 @@ /*************************************/ UdpBitDht::UdpBitDht(UdpPublisher *pub, bdNodeId *id, std::string appVersion, std::string bootstrapfile, const std::string& filteredipfile, bdDhtFunctions *fns) - :UdpSubReceiver(pub), dhtMtx(true), mFns(fns) + :UdpSubReceiver(pub), dhtMtx(true)//, mFns(fns) { std::string usedVersion; diff --git a/libbitdht/src/udp/udpbitdht.h b/libbitdht/src/udp/udpbitdht.h index 36946877e..f1e167abf 100644 --- a/libbitdht/src/udp/udpbitdht.h +++ b/libbitdht/src/udp/udpbitdht.h @@ -119,7 +119,7 @@ void clearDataTransferred(); bdMutex dhtMtx; /* for all class data (below) */ bdNodeManager *mBitDhtManager; - bdDhtFunctions *mFns; + //bdDhtFunctions *mFns; uint32_t mReadBytes; From 105840ab982cb8442f111c49fcba0776abcfd249 Mon Sep 17 00:00:00 2001 From: Phenom Date: Wed, 15 Mar 2017 19:03:39 +0100 Subject: [PATCH 56/88] Fix Clang Warning: Overloaded vf hide warning: 'pqiConnectCbDummy::peerConnectRequest' hides overloaded virtual function [-Woverloaded-virtual] virtual void peerConnectRequest(const RsPeerId& id, ^ --- libretroshare/src/pqi/pqimonitor.cc | 12 +++++++++--- libretroshare/src/pqi/pqimonitor.h | 5 +++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libretroshare/src/pqi/pqimonitor.cc b/libretroshare/src/pqi/pqimonitor.cc index 03894a66d..fac7a50f9 100644 --- a/libretroshare/src/pqi/pqimonitor.cc +++ b/libretroshare/src/pqi/pqimonitor.cc @@ -61,14 +61,20 @@ void pqiConnectCbDummy::peerStatus(const RsPeerId& id, const pqiIpAddrSet &ad std::cerr << out << std::endl; } -void pqiConnectCbDummy::peerConnectRequest(const RsPeerId& id, - const struct sockaddr_storage &raddr, uint32_t source) +void pqiConnectCbDummy::peerConnectRequest(const RsPeerId &id, const sockaddr_storage &raddr + , const sockaddr_storage &proxyaddr, const sockaddr_storage &srcaddr + , uint32_t source, uint32_t flags, uint32_t delay, uint32_t bandwidth) { std::cerr << "pqiConnectCbDummy::peerConnectRequest()"; std::cerr << " id: " << id; std::cerr << " raddr: " << sockaddr_storage_tostring(raddr); + std::cerr << " proxyaddr: " << sockaddr_storage_tostring(proxyaddr); + std::cerr << " srcaddr: " << sockaddr_storage_tostring(srcaddr); std::cerr << " source: " << source; - std::cerr << std::endl; + std::cerr << " flags: " << flags; + std::cerr << " delay: " << delay; + std::cerr << " bandwidth: " << bandwidth; + std::cerr << std::endl; } void pqiMonitor::disconnectPeer(const RsPeerId &/*peer*/) diff --git a/libretroshare/src/pqi/pqimonitor.h b/libretroshare/src/pqi/pqimonitor.h index 34d998e75..94e9bdf05 100644 --- a/libretroshare/src/pqi/pqimonitor.h +++ b/libretroshare/src/pqi/pqimonitor.h @@ -179,8 +179,9 @@ virtual ~pqiConnectCbDummy(); virtual void peerStatus(const RsPeerId& id, const pqiIpAddrSet &addrs, uint32_t type, uint32_t mode, uint32_t source); -virtual void peerConnectRequest(const RsPeerId& id, - const struct sockaddr_storage &raddr, uint32_t source); + virtual void peerConnectRequest(const RsPeerId& id, const struct sockaddr_storage &raddr, + const struct sockaddr_storage &proxyaddr, const struct sockaddr_storage &srcaddr, + uint32_t source, uint32_t flags, uint32_t delay, uint32_t bandwidth); //virtual void stunStatus(std::string id, const struct sockaddr_storage &raddr, uint32_t type, uint32_t flags); }; From cf963c0c7359697c9874df64e4b86ff3671ed54f Mon Sep 17 00:00:00 2001 From: Phenom Date: Wed, 15 Mar 2017 20:41:39 +0100 Subject: [PATCH 57/88] Fix Clang warnings: struct declared as class warning: 'RsMsgMetaData' defined as a struct here but previously declared as a class [-Wmismatched-tags] struct RsMsgMetaData ^ --- libretroshare/src/gxs/rsgxsdata.h | 24 +++++++++---------- .../src/retroshare/rsgxsifacetypes.h | 2 +- libretroshare/src/retroshare/rsgxsservice.h | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsdata.h b/libretroshare/src/gxs/rsgxsdata.h index 21fbe1445..2b2e9f14d 100644 --- a/libretroshare/src/gxs/rsgxsdata.h +++ b/libretroshare/src/gxs/rsgxsdata.h @@ -34,8 +34,8 @@ #include "serialiser/rstlvkeys.h" #include "serialiser/rsgxsitems.h" -class RsGroupMetaData; -class RsMsgMetaData; +struct RsGroupMetaData; +struct RsMsgMetaData; static const uint32_t RS_GXS_GRP_META_DATA_VERSION_ID_0001 = 0x0000 ; // change this, and keep old values if the content changes static const uint32_t RS_GXS_GRP_META_DATA_VERSION_ID_0002 = 0xaf01 ; // current API @@ -56,22 +56,22 @@ public: void clear(); void operator =(const RsGroupMetaData& rMeta); - //Sort data in same order than serialiser and deserializer + //Sort data in same order than serialiser and deserializer RsGxsGroupId mGroupId; RsGxsGroupId mOrigGrpId; - RsGxsGroupId mParentGrpId; + RsGxsGroupId mParentGrpId; std::string mGroupName; uint32_t mGroupFlags; // GXS_SERV::FLAG_PRIVACY_RESTRICTED | GXS_SERV::FLAG_PRIVACY_PRIVATE | GXS_SERV::FLAG_PRIVACY_PUBLIC uint32_t mPublishTs; - uint32_t mCircleType; - uint32_t mAuthenFlags; + uint32_t mCircleType; + uint32_t mAuthenFlags; RsGxsId mAuthorId; - std::string mServiceString; + std::string mServiceString; RsGxsCircleId mCircleId; RsTlvKeySignatureSet signSet; RsTlvSecurityKeySet keys; - uint32_t mSignFlags; + uint32_t mSignFlags; // BELOW HERE IS LOCAL DATA, THAT IS NOT FROM MSG. @@ -103,9 +103,9 @@ public: void clear(); void operator =(const RsMsgMetaData& rMeta); - static int refcount; - - //Sort data in same order than serialiser and deserializer + static int refcount; + + //Sort data in same order than serialiser and deserializer RsGxsGroupId mGroupId; RsGxsMessageId mMsgId; RsGxsMessageId mThreadId; @@ -121,7 +121,7 @@ public: // BELOW HERE IS LOCAL DATA, THAT IS NOT FROM MSG. // normally READ / UNREAD flags. LOCAL Data. - std::string mServiceString; + std::string mServiceString; uint32_t mMsgStatus; uint32_t mMsgSize; time_t mChildTs; diff --git a/libretroshare/src/retroshare/rsgxsifacetypes.h b/libretroshare/src/retroshare/rsgxsifacetypes.h index 6fd907898..1bc17b5e0 100644 --- a/libretroshare/src/retroshare/rsgxsifacetypes.h +++ b/libretroshare/src/retroshare/rsgxsifacetypes.h @@ -25,7 +25,7 @@ typedef std::pair RsGxsGrpMsgIdPair; typedef std::map > MsgRelatedIdResult; typedef std::map > GxsMsgReq; -class RsMsgMetaData; +struct RsMsgMetaData; typedef std::map > MsgMetaResult; diff --git a/libretroshare/src/retroshare/rsgxsservice.h b/libretroshare/src/retroshare/rsgxsservice.h index 8f26e5262..6afed31c6 100644 --- a/libretroshare/src/retroshare/rsgxsservice.h +++ b/libretroshare/src/retroshare/rsgxsservice.h @@ -5,7 +5,7 @@ #include "retroshare/rsgxsifacetypes.h" #include "retroshare/rstokenservice.h" -class RsMsgMetaData ; +struct RsMsgMetaData ; typedef std::map > GxsMsgMetaMap; typedef std::map > GxsMsgRelatedMetaMap; From 6fecac5f7beee4c66cd45f3c0f77c7e7fe8bca63 Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 16 Mar 2017 17:50:25 +0100 Subject: [PATCH 58/88] Fix Clang warnings: Overloaded vf hide warning: 'pqiconnect::connect_parameter' hides overloaded virtual function [-Woverloaded-virtual] virtual bool connect_parameter(uint32_t type, std::string value) { return ni->connect_parameter(type, value);} ^ --- libretroshare/src/pqi/pqiperson.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libretroshare/src/pqi/pqiperson.h b/libretroshare/src/pqi/pqiperson.h index f3ff940e1..afd2213d5 100644 --- a/libretroshare/src/pqi/pqiperson.h +++ b/libretroshare/src/pqi/pqiperson.h @@ -29,6 +29,7 @@ #define MRK_PQI_PERSON_HEADER +#include #include "pqi/pqi.h" #include "util/rsnet.h" @@ -66,7 +67,7 @@ public: virtual int reset() { pqistreamer::reset(); return ni->reset(); } virtual int disconnect() { return reset() ; } virtual bool connect_parameter(uint32_t type, uint32_t value) { return ni->connect_parameter(type, value);} - virtual bool connect_parameter(uint32_t type, std::string value) { return ni->connect_parameter(type, value);} + virtual bool connect_parameter(uint32_t type, const std::string &value) { return ni->connect_parameter(type, value);} virtual bool connect_additional_address(uint32_t type, const struct sockaddr_storage &addr) { return ni->connect_additional_address(type, addr); } virtual int getConnectAddress(struct sockaddr_storage &raddr){ return ni->getConnectAddress(raddr); } From 5bc6558567fba0f9f5f30d64d0e72ace1187dd07 Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 16 Mar 2017 18:28:48 +0100 Subject: [PATCH 59/88] Fix Clang warnings: explicitly assigning value to itself /home/phenom/GIT/RetroShare/trunk/libretroshare/src/util/radix64.h:96: warning: explicitly assigning value of variable of type 'int' to itself [-Wself-assign] idx = idx; ~~~ ^ ~~~ --- libretroshare/src/util/radix64.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/util/radix64.h b/libretroshare/src/util/radix64.h index dc7f8528c..9ee80f2dd 100644 --- a/libretroshare/src/util/radix64.h +++ b/libretroshare/src/util/radix64.h @@ -93,9 +93,9 @@ again: idx = (idx + 1) % 4; } - idx = idx; + //idx = idx; - return buf; + return buf ; } /**************** From 65321501e48787930da7cde70b92496f1f2d084b Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 16 Mar 2017 21:04:38 +0100 Subject: [PATCH 60/88] Fix Clang warnings: Overloaded vf hide in p3dhtmgr warning: 'p3DhtMgr::findPeer' hides overloaded virtual function [- Woverloaded-virtual] virtual bool findPeer(std::string id); warning: 'p3DhtMgr::dropPeer' hides overloaded virtual function [- Woverloaded-virtual] virtual bool dropPeer(std::string id); warning: 'p3DhtMgr::getPeerStatus' hides overloaded virtual function [- Woverloaded-virtual] virtual bool getPeerStatus(std::string id, --- libretroshare/src/pqi/p3dhtmgr.cc | 46 +++++++++++++++---------------- libretroshare/src/pqi/p3dhtmgr.h | 24 ++++++++-------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/libretroshare/src/pqi/p3dhtmgr.cc b/libretroshare/src/pqi/p3dhtmgr.cc index a93577581..c1d929c94 100644 --- a/libretroshare/src/pqi/p3dhtmgr.cc +++ b/libretroshare/src/pqi/p3dhtmgr.cc @@ -92,7 +92,7 @@ dhtPeerEntry::dhtPeerEntry() return; } -p3DhtMgr::p3DhtMgr(std::string id, pqiConnectCb *cb) +p3DhtMgr::p3DhtMgr(RsPeerId id, pqiConnectCb *cb) :pqiNetAssistConnect(id, cb), dhtMtx("p3DhtMgr"), mStunRequired(true) { /* setup own entry */ @@ -237,13 +237,13 @@ bool p3DhtMgr::setExternalInterface( /* add / remove peers */ -bool p3DhtMgr::findPeer(std::string id) +bool p3DhtMgr::findPeer(const RsPeerId& id) { RsStackMutex stack(dhtMtx); /***** LOCK MUTEX *****/ mDhtModifications = true; - std::map::iterator it; + std::map::iterator it; it = peers.find(id); if (it != peers.end()) { @@ -281,14 +281,14 @@ bool p3DhtMgr::findPeer(std::string id) return true; } -bool p3DhtMgr::dropPeer(std::string id) +bool p3DhtMgr::dropPeer(const RsPeerId& id) { RsStackMutex stack(dhtMtx); /***** LOCK MUTEX *****/ mDhtModifications = true; /* once we are connected ... don't worry about them anymore */ - std::map::iterator it; + std::map::iterator it; it = peers.find(id); if (it == peers.end()) { @@ -302,14 +302,14 @@ bool p3DhtMgr::dropPeer(std::string id) } /* post DHT key saying we should connect */ -bool p3DhtMgr::notifyPeer(std::string id) +bool p3DhtMgr::notifyPeer(const RsPeerId& id) { RsStackMutex stack(dhtMtx); /***** LOCK MUTEX *****/ #ifdef DHT_DEBUG - std::cerr << "p3DhtMgr::notifyPeer() " << id << std::endl; + std::cerr << "p3DhtMgr::notifyPeer() " << id.toStdString() << std::endl; #endif - std::map::iterator it; + std::map::iterator it; it = peers.find(id); if (it == peers.end()) { @@ -333,7 +333,7 @@ bool p3DhtMgr::notifyPeer(std::string id) #ifdef DHT_LOGS { /* Log */ - rslog(RSL_WARNING, p3dhtzone, "p3DhtMgr::notifyPeer() Id: " + id + " TO SOON - DROPPING"); + rslog(RSL_WARNING, p3dhtzone, "p3DhtMgr::notifyPeer() Id: " + id.toStdString() + " TO SOON - DROPPING"); } #endif @@ -352,7 +352,7 @@ bool p3DhtMgr::notifyPeer(std::string id) #ifdef DHT_LOGS { /* Log */ - rslog(RSL_WARNING, p3dhtzone, "p3DhtMgr::notifyPeer() Id: " + id + " PEER NOT FOUND - Trigger Search"); + rslog(RSL_WARNING, p3dhtzone, "p3DhtMgr::notifyPeer() Id: " + id.toStdString() + " PEER NOT FOUND - Trigger Search"); } #endif it->second.lastTS = 0; @@ -364,14 +364,14 @@ bool p3DhtMgr::notifyPeer(std::string id) } /* extract current peer status */ -bool p3DhtMgr::getPeerStatus(std::string id, - struct sockaddr_in &laddr, - struct sockaddr_in &raddr, +bool p3DhtMgr::getPeerStatus(const RsPeerId &id, + struct sockaddr_in &laddr, + struct sockaddr_in &raddr, uint32_t &type, uint32_t &state) { RsStackMutex stack(dhtMtx); /* LOCK MUTEX */ - std::map::iterator it; + std::map::iterator it; it = peers.find(id); /* ignore OFF peers */ @@ -776,7 +776,7 @@ int p3DhtMgr::checkPeerDHTKeys() dhtMtx.lock(); /* LOCK MUTEX */ /* iterate through and find min time and suitable candidate */ - std::map::iterator it,pit; + std::map::iterator it,pit; time_t now = time(NULL); uint32_t period = 0; uint32_t repeatPeriod = 6000; @@ -802,7 +802,7 @@ int p3DhtMgr::checkPeerDHTKeys() period = DHT_CHECK_PERIOD; } #ifdef DHT_DEBUG - std::cerr << "p3DhtMgr::checkPeerDHTKeys() Peer: " << it->second.id; + std::cerr << "p3DhtMgr::checkPeerDHTKeys() Peer: " << it->second.id.toStdString(); std::cerr << " Period: " << period; std::cerr << " Delta: " << delta; std::cerr << std::endl; @@ -865,7 +865,7 @@ int p3DhtMgr::checkNotifyDHT() RsStackMutex stack(dhtMtx); /***** LOCK MUTEX *****/ /* iterate through and find min time and suitable candidate */ - std::map::iterator it; + std::map::iterator it; time_t now = time(NULL); int repeatPeriod = DHT_DEFAULT_PERIOD; @@ -1015,7 +1015,7 @@ int p3DhtMgr::checkStunState() if (mDhtState == DHT_STATE_CHECK_PEERS) { /* check that they have all be searched for */ - std::map::iterator it; + std::map::iterator it; for(it = peers.begin(); it != peers.end(); it++) { if (it->second.state == DHT_PEER_INIT) @@ -1287,7 +1287,7 @@ int p3DhtMgr::status(std::ostream &out) out << "OWN DETAILS END----------------------------------------" << std::endl; /* now peers states */ - std::map::iterator it; + std::map::iterator it; out << "PEER DETAILS ------------------------------------------" << std::endl; for(it = peers.begin(); it != peers.end(); it++) { @@ -1622,15 +1622,13 @@ bool p3DhtMgr::dhtResultNotify(std::string idhash) std::cerr << "p3DhtMgr::dhtResultNotify() from idhash: "; std::cerr << RsUtil::BinToHex(idhash) << std::endl; #endif - std::map::iterator it; + std::map::iterator it; time_t now = time(NULL); /* if notify - we must match on the second hash */ for(it = peers.begin(); (it != peers.end()) && ((it->second).hash2 != idhash); it++) ; /* update data */ - std::string peerid; - /* ignore OFF peers */ if ((it != peers.end()) && (it->second.state != DHT_PEER_OFF)) { @@ -1677,7 +1675,7 @@ bool p3DhtMgr::dhtResultSearch(std::string idhash, std::cerr << "p3DhtMgr::dhtResultSearch() for idhash: "; std::cerr << RsUtil::BinToHex(idhash) << std::endl; #endif - std::map::iterator it; + std::map::iterator it; bool doCb = false; bool doStun = false; uint32_t stunFlags = 0; @@ -1780,7 +1778,7 @@ bool p3DhtMgr::dhtResultSearch(std::string idhash, void printDhtPeerEntry(dhtPeerEntry *ent, std::ostream &out) { - out << "DhtEntry: ID: " << ent->id; + out << "DhtEntry: ID: " << ent->id.toStdString(); out << " State: " << ent->state; out << " lastTS: " << ent->lastTS; out << " notifyPending: " << ent->notifyPending; diff --git a/libretroshare/src/pqi/p3dhtmgr.h b/libretroshare/src/pqi/p3dhtmgr.h index f08c2bc96..86d6b5424 100644 --- a/libretroshare/src/pqi/p3dhtmgr.h +++ b/libretroshare/src/pqi/p3dhtmgr.h @@ -78,7 +78,7 @@ class dhtPeerEntry public: dhtPeerEntry(); - std::string id; + RsPeerId id; uint32_t state; time_t lastTS; @@ -97,7 +97,7 @@ class p3DhtMgr: public pqiNetAssistConnect, public RsThread /* */ public: - p3DhtMgr(std::string id, pqiConnectCb *cb); + p3DhtMgr(RsPeerId id, pqiConnectCb *cb); /********** External DHT Interface ************************ * These Functions are the external interface @@ -121,15 +121,15 @@ virtual bool setExternalInterface(struct sockaddr_in laddr, struct sockaddr_in raddr, uint32_t type); /* add / remove peers */ -virtual bool findPeer(std::string id); -virtual bool dropPeer(std::string id); +virtual bool findPeer(const RsPeerId& id); +virtual bool dropPeer(const RsPeerId& id); /* post DHT key saying we should connect (callback when done) */ -virtual bool notifyPeer(std::string id); +virtual bool notifyPeer(const RsPeerId& id); /* extract current peer status */ -virtual bool getPeerStatus(std::string id, - struct sockaddr_in &laddr, struct sockaddr_in &raddr, +virtual bool getPeerStatus(const RsPeerId& id, + struct sockaddr_in &laddr, struct sockaddr_in &raddr, uint32_t &type, uint32_t &mode); /* stun */ @@ -154,17 +154,17 @@ virtual bool dhtResultBootstrap(std::string idhash); protected: /* can block briefly (called only from thread) */ -virtual bool dhtPublish(std::string id, +virtual bool dhtPublish(std::string idhash, struct sockaddr_in &laddr, struct sockaddr_in &raddr, uint32_t type, std::string sign); -virtual bool dhtNotify(std::string peerid, std::string ownId, +virtual bool dhtNotify(std::string idhash, std::string ownIdHash, std::string sign); -virtual bool dhtSearch(std::string id, uint32_t mode); +virtual bool dhtSearch(std::string idhash, uint32_t mode); -virtual bool dhtBootstrap(std::string storehash, std::string ownIdHash, +virtual bool dhtBootstrap(std::string idhash, std::string ownIdHash, std::string sign); /* to publish bootstrap */ @@ -232,7 +232,7 @@ std::string randomBootstrapId(); dhtPeerEntry ownEntry; time_t ownNotifyTS; - std::map peers; + std::map peers; std::list stunIds; bool mStunRequired; From dc533b1346ce1f7fa4f8137ee8133fc65cb285e9 Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 16 Mar 2017 22:01:22 +0100 Subject: [PATCH 61/88] Fix Clang warnings: private field not used warning: private field 'lastGroupId' is not used [-Wunused-private- field] uint32_t lastGroupId; warning: private field 'waittimes' is not used [-Wunused-private-field] int waittimes; warning: private field 'listen_checktime' is not used [-Wunused-private- field] long listen_checktime; --- libretroshare/src/pqi/p3peermgr.h | 2 +- libretroshare/src/pqi/pqiperson.cc | 2 +- libretroshare/src/pqi/pqiperson.h | 2 +- libretroshare/src/pqi/pqissludp.cc | 2 +- libretroshare/src/pqi/pqissludp.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libretroshare/src/pqi/p3peermgr.h b/libretroshare/src/pqi/p3peermgr.h index ee581b275..f0a9a44cb 100644 --- a/libretroshare/src/pqi/p3peermgr.h +++ b/libretroshare/src/pqi/p3peermgr.h @@ -397,7 +397,7 @@ private: std::map mReportedOwnAddresses ; std::map groupList; - uint32_t lastGroupId; + //uint32_t lastGroupId; std::list saveCleanupList; /* TEMPORARY LIST WHEN SAVING */ diff --git a/libretroshare/src/pqi/pqiperson.cc b/libretroshare/src/pqi/pqiperson.cc index cade0c39e..e7d1cf18b 100644 --- a/libretroshare/src/pqi/pqiperson.cc +++ b/libretroshare/src/pqi/pqiperson.cc @@ -40,7 +40,7 @@ static struct RsLog::logInfo pqipersonzoneInfo = {RsLog::Default, "pqiperson"}; pqiperson::pqiperson(const RsPeerId& id, pqipersongrp *pg) : PQInterface(id), mNotifyMtx("pqiperson-notify"), mPersonMtx("pqiperson"), - active(false), activepqi(NULL), inConnectAttempt(false), waittimes(0), + active(false), activepqi(NULL), inConnectAttempt(false),// waittimes(0), pqipg(pg) {} // TODO: must check id! pqiperson::~pqiperson() diff --git a/libretroshare/src/pqi/pqiperson.h b/libretroshare/src/pqi/pqiperson.h index afd2213d5..69faec48c 100644 --- a/libretroshare/src/pqi/pqiperson.h +++ b/libretroshare/src/pqi/pqiperson.h @@ -172,7 +172,7 @@ private: bool active; pqiconnect *activepqi; bool inConnectAttempt; - int waittimes; + //int waittimes; time_t lastHeartbeatReceived; // use to track connection failure pqipersongrp *pqipg; /* parent for callback */ }; diff --git a/libretroshare/src/pqi/pqissludp.cc b/libretroshare/src/pqi/pqissludp.cc index 9519e2af3..29bd228c9 100644 --- a/libretroshare/src/pqi/pqissludp.cc +++ b/libretroshare/src/pqi/pqissludp.cc @@ -53,7 +53,7 @@ static const uint32_t PQI_SSLUDP_DEF_CONN_PERIOD = 300; /* 5 minutes? */ /********** PQI SSL UDP STUFF **************************************/ pqissludp::pqissludp(PQInterface *parent, p3LinkMgr *lm) : - pqissl(NULL, parent, lm), tou_bio(NULL), listen_checktime(0), + pqissl(NULL, parent, lm), tou_bio(NULL),// listen_checktime(0), mConnectPeriod(PQI_SSLUDP_DEF_CONN_PERIOD), mConnectFlags(0), mConnectBandwidth(0) { diff --git a/libretroshare/src/pqi/pqissludp.h b/libretroshare/src/pqi/pqissludp.h index 848717bbd..195e9e604 100644 --- a/libretroshare/src/pqi/pqissludp.h +++ b/libretroshare/src/pqi/pqissludp.h @@ -95,7 +95,7 @@ private: BIO *tou_bio; // specific to ssludp. - long listen_checktime; + //long listen_checktime; uint32_t mConnectPeriod; uint32_t mConnectFlags; From 22043094b5d269a92db3816468b2312f98e7e374 Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 16 Mar 2017 22:11:33 +0100 Subject: [PATCH 62/88] Fix Clang warnings: extraneous parentheses warning: equality comparison with extraneous parentheses [-Wparentheses- equality] else if ((err == ECONNREFUSED)) ~~~~^~~~~~~~~~~~~~~ --- libretroshare/src/pqi/pqissl.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/pqi/pqissl.cc b/libretroshare/src/pqi/pqissl.cc index b7709bb82..bcc49cbbc 100644 --- a/libretroshare/src/pqi/pqissl.cc +++ b/libretroshare/src/pqi/pqissl.cc @@ -1009,7 +1009,7 @@ int pqissl::Basic_Connection_Complete() return -1; } - else if ((err == ECONNREFUSED)) + else if (err == ECONNREFUSED) { rslog(RSL_WARNING, pqisslzone, "pqissl::Basic_Connection_Complete() ECONNREFUSED: cert: " + PeerId().toStdString()); From 872f42bcefe4b6fc6c0b84d04b4484dff177b549 Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 16 Mar 2017 22:55:18 +0100 Subject: [PATCH 63/88] Fix Clang warnings: Overloaded vf hide in pluginmanager warning: 'RsPluginManager::loadConfiguration' hides overloaded virtual function [-Woverloaded-virtual] virtual void loadConfiguration() ; --- libretroshare/src/plugins/pluginmanager.cc | 7 ++++++- libretroshare/src/plugins/pluginmanager.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libretroshare/src/plugins/pluginmanager.cc b/libretroshare/src/plugins/pluginmanager.cc index 431b6c2f8..259004300 100644 --- a/libretroshare/src/plugins/pluginmanager.cc +++ b/libretroshare/src/plugins/pluginmanager.cc @@ -51,9 +51,14 @@ RsPluginManager::RsPluginManager(const RsFileHash &hash) _allow_all_plugins = false ; } +bool RsPluginManager::loadConfiguration(RsFileHash &loadHash) +{ + return p3Config::loadConfiguration(loadHash); +} + void RsPluginManager::loadConfiguration() { - RsFileHash dummyHash ; + RsFileHash dummyHash; p3Config::loadConfiguration(dummyHash); } diff --git a/libretroshare/src/plugins/pluginmanager.h b/libretroshare/src/plugins/pluginmanager.h index 5f2a8c3b7..27a74f870 100644 --- a/libretroshare/src/plugins/pluginmanager.h +++ b/libretroshare/src/plugins/pluginmanager.h @@ -74,6 +74,7 @@ class RsPluginManager: public RsPluginHandler, public p3Config // -------------------- Own members -------------------------// // virtual void addConfigurations(p3ConfigMgr *cfgMgr) ; + virtual bool loadConfiguration(RsFileHash &loadHash) ; virtual void loadConfiguration() ; /*! From 039908b2c634d1a8c9355b5bb2574de8812b83e2 Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 16 Mar 2017 22:58:06 +0100 Subject: [PATCH 64/88] Fix Clang warnings: private field not used warning: private field 'mNetMgr' is not used [-Wunused-private-field] p3NetMgr *mNetMgr; --- libretroshare/src/services/p3banlist.cc | 4 ++-- libretroshare/src/services/p3banlist.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libretroshare/src/services/p3banlist.cc b/libretroshare/src/services/p3banlist.cc index 157cc23f8..65d56987b 100644 --- a/libretroshare/src/services/p3banlist.cc +++ b/libretroshare/src/services/p3banlist.cc @@ -66,8 +66,8 @@ */ RsBanList *rsBanList = NULL ; -p3BanList::p3BanList(p3ServiceControl *sc, p3NetMgr *nm) - :p3Service(), mBanMtx("p3BanList"), mServiceCtrl(sc), mNetMgr(nm) +p3BanList::p3BanList(p3ServiceControl *sc, p3NetMgr */*nm*/) + :p3Service(), mBanMtx("p3BanList"), mServiceCtrl(sc)//, mNetMgr(nm) { addSerialType(new RsBanListSerialiser()); diff --git a/libretroshare/src/services/p3banlist.h b/libretroshare/src/services/p3banlist.h index 87bb7104a..86456d6ae 100644 --- a/libretroshare/src/services/p3banlist.h +++ b/libretroshare/src/services/p3banlist.h @@ -148,7 +148,7 @@ private: std::map mWhiteListedRanges; p3ServiceControl *mServiceCtrl; - p3NetMgr *mNetMgr; + //p3NetMgr *mNetMgr; time_t mLastDhtInfoRequest ; bool mIPFilteringEnabled ; From e83104ee0fc520cc9115be3fa1bd335130cb5630 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 18 Mar 2017 10:19:31 +0100 Subject: [PATCH 65/88] Fix Clang warnings: Add author and date to #warning --- libretroshare/src/gxs/rsgxsnetservice.cc | 4 ++-- libretroshare/src/gxs/rsgxsnetutils.cc | 2 +- libretroshare/src/pqi/sslfns.cc | 2 +- libretroshare/src/services/p3gxsreputation.cc | 2 +- libretroshare/src/services/p3idservice.cc | 2 +- retroshare-gui/src/gui/Identity/IdDialog.cpp | 2 +- retroshare-gui/src/gui/RetroShareLink.h | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsnetservice.cc b/libretroshare/src/gxs/rsgxsnetservice.cc index 259d01135..3811ddd0c 100644 --- a/libretroshare/src/gxs/rsgxsnetservice.cc +++ b/libretroshare/src/gxs/rsgxsnetservice.cc @@ -1972,7 +1972,7 @@ void RsGxsNetService::updateServerSyncTS() #endif // I keep the creation, but the data is not used yet. -#warning disabled this, but do we need it? +#warning csoler 2016-12-12: Disabled this, but do we need it? // RsGxsServerMsgUpdate& msui(mServerMsgUpdateMap[grpId]) ; // (cyril) I'm removing this, because the msgUpdateTS is updated when new messages are received by calling locked_stampMsgServerUpdateTS(). @@ -3000,7 +3000,7 @@ void RsGxsNetService::locked_genReqGrpTransaction(NxsTransaction* tr) } // FIXTESTS global variable rsReputations not available in unittests! -#warning Update the code below to correctly send/recv dependign on reputation +#warning csoler 2016-12-23: Update the code below to correctly send/recv dependign on reputation if(!grpSyncItem->authorId.isNull() && mReputations->overallReputationLevel(grpSyncItem->authorId) == RsReputations::REPUTATION_LOCALLY_NEGATIVE) { #ifdef NXS_NET_DEBUG_0 diff --git a/libretroshare/src/gxs/rsgxsnetutils.cc b/libretroshare/src/gxs/rsgxsnetutils.cc index 4d54ce117..7454ba58a 100644 --- a/libretroshare/src/gxs/rsgxsnetutils.cc +++ b/libretroshare/src/gxs/rsgxsnetutils.cc @@ -45,7 +45,7 @@ bool AuthorPending::getAuthorRep(GixsReputation& rep, const RsGxsId& authorId, c rep.id = authorId ; rep.reputation_level = mRep->overallReputationLevel(authorId); -#warning can it happen that reputations do not have the info yet? +#warning csoler 2017-01-10: Can it happen that reputations do not have the info yet? return true ; #ifdef TO_BE_REMOVED { diff --git a/libretroshare/src/pqi/sslfns.cc b/libretroshare/src/pqi/sslfns.cc index 7cf742956..ba5a9e6a3 100644 --- a/libretroshare/src/pqi/sslfns.cc +++ b/libretroshare/src/pqi/sslfns.cc @@ -627,7 +627,7 @@ bool getX509id(X509 *x509, RsPeerId& xid) * more randomness */ -#warning this is cryptographically horrible. We should do a hash of the public key here!!! +#warning csoler 2017-02-19: This is cryptographically horrible. We should do a hash of the public key here!!! xid = RsPeerId(&signdata[signlen - CERTSIGNLEN]) ; diff --git a/libretroshare/src/services/p3gxsreputation.cc b/libretroshare/src/services/p3gxsreputation.cc index 45fd95898..c60f54f0c 100644 --- a/libretroshare/src/services/p3gxsreputation.cc +++ b/libretroshare/src/services/p3gxsreputation.cc @@ -1035,7 +1035,7 @@ bool p3GxsReputation::setOwnOpinion(const RsGxsId& gxsid, const RsReputations::O if (rit == mReputations.end()) { -#warning we should set the owner node id here. +#warning csoler 2017-01-05: We should set the owner node id here. mReputations[gxsid] = Reputation(gxsid); rit = mReputations.find(gxsid); } diff --git a/libretroshare/src/services/p3idservice.cc b/libretroshare/src/services/p3idservice.cc index dcc45af65..78abe7d2b 100644 --- a/libretroshare/src/services/p3idservice.cc +++ b/libretroshare/src/services/p3idservice.cc @@ -788,7 +788,7 @@ bool p3IdService::createIdentity(uint32_t& token, RsIdentityParameters ¶ms) if (params.isPgpLinked) { -#warning Backward compatibility issue to fix here in v0.7.0 +#warning csoler 2017-02-07: Backward compatibility issue to fix here in v0.7.0 // This is a hack, because a bad decision led to having RSGXSID_GROUPFLAG_REALID be equal to GXS_SERV::FLAG_PRIVACY_PRIVATE. // In order to keep backward compatibility, we'll also add the new value diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 96b943d15..1cf93055b 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -1993,7 +1993,7 @@ QString IdDialog::createUsageString(const RsIdentityUsage& u) const return tr("Membership verification in circle %1.").arg(QString::fromStdString(u.mGrpId.toStdString())); } -#warning TODO! Add the different strings and translations here. +#warning TODO! csoler 2017-01-03: Add the different strings and translations here. default: return QString("Undone yet"); } diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index b272f3416..241d56740 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -77,7 +77,7 @@ class RetroShareLink RetroShareLink(const QUrl& url); RetroShareLink(const QString& url); -#warning these methods should be static and return a created link +#warning csoler 2017-01-04: These methods should be static and return a created link bool createFile(const QString& name, uint64_t size, const QString& hash); bool createExtraFile(const QString& name, uint64_t size, const QString& hash, const QString& ssl_id); bool createPerson(const RsPgpId &id); From 4ac3b3f5bfd2d156e3c16fbc1d29f3c8d013d8ea Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 18 Mar 2017 10:20:57 +0100 Subject: [PATCH 66/88] Fix Clang warnings: implicit conversion of NULL to bool warning: implicit conversion of NULL constant to 'bool' [-Wnull- conversion] return NULL ; ~~~~~~ ^~~~ false --- libretroshare/src/gxstunnel/p3gxstunnel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/gxstunnel/p3gxstunnel.cc b/libretroshare/src/gxstunnel/p3gxstunnel.cc index 3ad4198a9..871a5cd49 100644 --- a/libretroshare/src/gxstunnel/p3gxstunnel.cc +++ b/libretroshare/src/gxstunnel/p3gxstunnel.cc @@ -1193,7 +1193,7 @@ bool p3GxsTunnelService::locked_sendClearTunnelData(RsGxsTunnelDHPublicKeyItem * if(gitem->data_bytes == NULL) { delete gitem ; - return NULL ; + return false ; } // by convention, we use a IV of 0 for unencrypted data. memset(gitem->data_bytes,0,8) ; From 32eeb957b247f72603fcb98f5f52cf2e58e89fc7 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 18 Mar 2017 10:25:23 +0100 Subject: [PATCH 67/88] Fix Clang warnings: unused private field warning: private field 'mAutoBanIdentitiesLimit' is not used [-Wunused- private-field] float mAutoBanIdentitiesLimit ; warning: private field 'mFiles' is not used [-Wunused-private-field] RsFiles* mFiles; --- libresapi/src/api/FileSearchHandler.cpp | 4 ++-- libresapi/src/api/FileSearchHandler.h | 2 +- libretroshare/src/services/p3gxsreputation.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libresapi/src/api/FileSearchHandler.cpp b/libresapi/src/api/FileSearchHandler.cpp index 2b56317ad..c159ad913 100644 --- a/libresapi/src/api/FileSearchHandler.cpp +++ b/libresapi/src/api/FileSearchHandler.cpp @@ -10,8 +10,8 @@ namespace resource_api { -FileSearchHandler::FileSearchHandler(StateTokenServer *sts, RsNotify *notify, RsTurtle *turtle, RsFiles *files): - mStateTokenServer(sts), mNotify(notify), mTurtle(turtle), mFiles(files), +FileSearchHandler::FileSearchHandler(StateTokenServer *sts, RsNotify *notify, RsTurtle *turtle, RsFiles */*files*/): + mStateTokenServer(sts), mNotify(notify), mTurtle(turtle),// mFiles(files), mMtx("FileSearchHandler") { mNotify->registerNotifyClient(this); diff --git a/libresapi/src/api/FileSearchHandler.h b/libresapi/src/api/FileSearchHandler.h index 1cab730a4..a049c2207 100644 --- a/libresapi/src/api/FileSearchHandler.h +++ b/libresapi/src/api/FileSearchHandler.h @@ -24,7 +24,7 @@ private: StateTokenServer* mStateTokenServer; RsNotify* mNotify; RsTurtle* mTurtle; - RsFiles* mFiles; + //RsFiles* mFiles; class Search{ public: diff --git a/libretroshare/src/services/p3gxsreputation.h b/libretroshare/src/services/p3gxsreputation.h index baabdaa43..890092237 100644 --- a/libretroshare/src/services/p3gxsreputation.h +++ b/libretroshare/src/services/p3gxsreputation.h @@ -174,7 +174,7 @@ private: time_t mLastIdentityFlagsUpdate ; bool mReputationsUpdated; - float mAutoBanIdentitiesLimit ; + //float mAutoBanIdentitiesLimit ; bool mAutoSetPositiveOptionToContacts; p3LinkMgr *mLinkMgr; From de4f6c06dd951f5b6f18005cbb06cd3e892e1920 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 18 Mar 2017 10:42:38 +0100 Subject: [PATCH 68/88] Fix Clang warnings: Z-order assignment to spacer warning: Z-order assignment: 'verticalSpacer_2' is not a valid widget. --- retroshare-gui/src/gui/Identity/IdDialog.ui | 36 ++++++++++----------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/retroshare-gui/src/gui/Identity/IdDialog.ui b/retroshare-gui/src/gui/Identity/IdDialog.ui index 016ff28e1..1c52802ef 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.ui +++ b/retroshare-gui/src/gui/Identity/IdDialog.ui @@ -287,7 +287,7 @@ 692 - + @@ -296,12 +296,12 @@ QFrame::Raised - + 12 - + @@ -397,7 +397,7 @@ QFrame::Box - + 6 @@ -514,7 +514,7 @@ border-image: url(:/images/closepressed.png) Identity info - + @@ -526,7 +526,7 @@ border-image: url(:/images/closepressed.png) - + Your opinion: @@ -540,7 +540,7 @@ border-image: url(:/images/closepressed.png) - + Qt::Horizontal @@ -728,7 +728,7 @@ p, li { white-space: pre-wrap; } - + @@ -774,12 +774,12 @@ p, li { white-space: pre-wrap; } - + 6 - + 34 @@ -813,14 +813,14 @@ p, li { white-space: pre-wrap; } - + Qt::Vertical - + 34 @@ -856,7 +856,7 @@ p, li { white-space: pre-wrap; } - + Qt::Vertical @@ -874,11 +874,11 @@ p, li { white-space: pre-wrap; } - + Usage statistics - + @@ -886,7 +886,7 @@ p, li { white-space: pre-wrap; } - + Qt::Vertical @@ -900,10 +900,8 @@ p, li { white-space: pre-wrap; } detailsGroupBox - detailsGroupBox - groupBox + usageStatisticsGBox headerFramePerson - verticalSpacer_2 From e0225efef35068800241d02ff4cee25c1a9e8a9e Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 18 Mar 2017 11:19:42 +0100 Subject: [PATCH 69/88] Fix Clang warnings: 'ChatLobbyDialog::init' hides overloaded virtual function warning: 'ChatLobbyDialog::init' hides overloaded virtual function [- Woverloaded-virtual] virtual void init(); ^ /retroshare-gui/src/gui/chat/ChatDialog.h:87: hidden overloaded virtual function 'ChatDialog::init' declared here: different number of parameters (2 vs 0) virtual void init(ChatId id, const QString &title); ^ --- retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp | 5 +++++ retroshare-gui/src/gui/chat/ChatLobbyDialog.h | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp index 4056156bb..c5dec3a67 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp @@ -304,6 +304,11 @@ void ChatLobbyDialog::showInPeopleTab() idDialog->navigate(nickname); } +void ChatLobbyDialog::init(ChatId /*id*/, const QString &/*title*/) +{ + init(); +} + void ChatLobbyDialog::init() { ChatLobbyInfo linfo ; diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.h b/retroshare-gui/src/gui/chat/ChatLobbyDialog.h index 40fb44014..2dd66a554 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.h +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.h @@ -71,7 +71,8 @@ protected: virtual ~ChatLobbyDialog(); void processSettings(bool load); - virtual void init(); + virtual void init(ChatId id, const QString &title); + void init(); virtual bool canClose(); virtual void addChatMsg(const ChatMessage &msg); From 13c8f7d342418c2f52943238fc630ba89aa6f601 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 18 Mar 2017 11:28:29 +0100 Subject: [PATCH 70/88] Fix Clang warnings: Infinite recursion warning: all paths through this function will call itself [-Winfinite- recursion] { ^ --- retroshare-gui/src/gui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 4fecfa620..8e8534345 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -1207,7 +1207,7 @@ void MainWindow::showHelpDialog(const QString &topic) void MainWindow::retranslateUi() { - retranslateUi(); + //retranslateUi(); foreach (MainPage *page, ui->stackPages->pages()) { page->retranslateUi(); } From 9319caffc77dfcf4427baacc86349d71b520a26c Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 18 Mar 2017 11:32:56 +0100 Subject: [PATCH 71/88] Fix Clang warnings: 'Node::advance' hides overloaded virtual function warning: 'Node::advance' hides overloaded virtual function [- Woverloaded-virtual] bool advance(); ^ /usr/include/qt4/QtGui/qgraphicsitem.h:323: hidden overloaded virtual function 'QGraphicsItem::advance' declared here: different number of parameters (1 vs 0) virtual void advance(int phase); ^ --- retroshare-gui/src/gui/elastic/graphwidget.cpp | 2 +- retroshare-gui/src/gui/elastic/node.cpp | 2 +- retroshare-gui/src/gui/elastic/node.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/retroshare-gui/src/gui/elastic/graphwidget.cpp b/retroshare-gui/src/gui/elastic/graphwidget.cpp index bb1f9ffb8..a2c69c80d 100644 --- a/retroshare-gui/src/gui/elastic/graphwidget.cpp +++ b/retroshare-gui/src/gui/elastic/graphwidget.cpp @@ -362,7 +362,7 @@ void GraphWidget::timerEvent(QTimerEvent *event) bool itemsMoved = false; foreach (Node *node, _nodes) - if(node->advance()) + if(node->progress()) itemsMoved = true; if (!itemsMoved) { diff --git a/retroshare-gui/src/gui/elastic/node.cpp b/retroshare-gui/src/gui/elastic/node.cpp index bc33151df..6a3020b21 100644 --- a/retroshare-gui/src/gui/elastic/node.cpp +++ b/retroshare-gui/src/gui/elastic/node.cpp @@ -215,7 +215,7 @@ void Node::calculateForces(const double *map,int width,int height,int W,int H,fl newPos.setY(qMin(qMax(newPos.y(), sceneRect.top()) , sceneRect.bottom())); } -bool Node::advance() +bool Node::progress() { if(_type == GraphWidget::ELASTIC_NODE_TYPE_OWN) return false; diff --git a/retroshare-gui/src/gui/elastic/node.h b/retroshare-gui/src/gui/elastic/node.h index 13c717b0b..e43fa3521 100644 --- a/retroshare-gui/src/gui/elastic/node.h +++ b/retroshare-gui/src/gui/elastic/node.h @@ -77,7 +77,7 @@ public: std::string descString() const { return _desc_string ; } void calculateForces(const double *data,int width,int height,int W,int H,float x,float y,float speedf); - bool advance(); + bool progress(); QRectF boundingRect() const; QPainterPath shape() const; From eea49d96bfb58914ef031d7139571c1cc6f36d80 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sat, 18 Mar 2017 11:56:11 +0100 Subject: [PATCH 72/88] Fix Clang warnings: change ChatDialog::init definition warning: 'PopupChatDialog::init' hides overloaded virtual function [- Woverloaded-virtual] virtual void init(const ChatId &chat_id, const QString &title); ^ /retroshare-gui/src/gui/chat/ChatDialog.h:87: hidden overloaded virtual function 'ChatDialog::init' declared here: type mismatch at 1st parameter ('ChatId' vs 'const ChatId &') virtual void init(ChatId id, const QString &title); ^ --- retroshare-gui/src/gui/chat/ChatDialog.cpp | 4 ++-- retroshare-gui/src/gui/chat/ChatDialog.h | 2 +- retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp | 7 +------ retroshare-gui/src/gui/chat/ChatLobbyDialog.h | 3 +-- retroshare-gui/src/gui/chat/PopupChatDialog.h | 2 +- 5 files changed, 6 insertions(+), 12 deletions(-) diff --git a/retroshare-gui/src/gui/chat/ChatDialog.cpp b/retroshare-gui/src/gui/chat/ChatDialog.cpp index 2ab8b8e90..2a52ccf35 100644 --- a/retroshare-gui/src/gui/chat/ChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatDialog.cpp @@ -63,7 +63,7 @@ void ChatDialog::closeEvent(QCloseEvent *event) emit dialogClose(this); } -void ChatDialog::init(ChatId id, const QString &title) +void ChatDialog::init(const ChatId &id, const QString &title) { mChatId = id; ChatWidget *cw = getChatWidget(); @@ -102,7 +102,7 @@ void ChatDialog::init(ChatId id, const QString &title) if (chatflags & RS_CHAT_OPEN) { if (id.isLobbyId()) { ChatLobbyDialog* cld = new ChatLobbyDialog(id.toLobbyId()); - cld->init(); + cld->init(ChatId(), ""); cd = cld; } else if(id.isDistantChatId()) diff --git a/retroshare-gui/src/gui/chat/ChatDialog.h b/retroshare-gui/src/gui/chat/ChatDialog.h index f6b4ae57e..a5c6a0bc3 100644 --- a/retroshare-gui/src/gui/chat/ChatDialog.h +++ b/retroshare-gui/src/gui/chat/ChatDialog.h @@ -84,7 +84,7 @@ protected: virtual QString getPeerName(const ChatId &sslid) const ; // can be overloaded for chat dialogs that have specific peers virtual QString getOwnName() const; - virtual void init(ChatId id, const QString &title); + virtual void init(const ChatId &id, const QString &title); virtual void addChatMsg(const ChatMessage& msg) = 0; ChatId mChatId; diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp index c5dec3a67..20352b888 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp @@ -304,12 +304,7 @@ void ChatLobbyDialog::showInPeopleTab() idDialog->navigate(nickname); } -void ChatLobbyDialog::init(ChatId /*id*/, const QString &/*title*/) -{ - init(); -} - -void ChatLobbyDialog::init() +void ChatLobbyDialog::init(const ChatId &/*id*/, const QString &/*title*/) { ChatLobbyInfo linfo ; diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.h b/retroshare-gui/src/gui/chat/ChatLobbyDialog.h index 2dd66a554..420524f93 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.h +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.h @@ -71,8 +71,7 @@ protected: virtual ~ChatLobbyDialog(); void processSettings(bool load); - virtual void init(ChatId id, const QString &title); - void init(); + virtual void init(const ChatId &id, const QString &title); virtual bool canClose(); virtual void addChatMsg(const ChatMessage &msg); diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.h b/retroshare-gui/src/gui/chat/PopupChatDialog.h index 0a304b14c..49e3036b3 100644 --- a/retroshare-gui/src/gui/chat/PopupChatDialog.h +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.h @@ -46,7 +46,7 @@ protected: /** Default destructor */ virtual ~PopupChatDialog(); - virtual void init(const ChatId &chat_id, const QString &title); + virtual void init(const ChatId &chat_id, const QString &title); virtual void showDialog(uint chatflags); virtual ChatWidget *getChatWidget(); virtual bool hasPeerStatus() { return true; } From 07b67e9cc90bea746d92711289a212de50ad2fcf Mon Sep 17 00:00:00 2001 From: Phenom Date: Sun, 19 Mar 2017 10:40:34 +0100 Subject: [PATCH 73/88] Fix Clang warnings: 'PopupDistantChatDialog::init' hides overloaded virtual function warning: 'PopupDistantChatDialog::init' hides overloaded virtual function [-Woverloaded-virtual] virtual void init(const DistantChatPeerId& peer_id); /retroshare-gui/src/gui/chat/PopupChatDialog.h:49: hidden overloaded virtual function 'PopupChatDialog::init' declared here: different number of parameters (2 vs 1) virtual void init(const ChatId &chat_id, const QString &title); --- retroshare-gui/src/gui/chat/ChatDialog.cpp | 2 +- .../src/gui/chat/PopupDistantChatDialog.cpp | 13 ++++++++----- .../src/gui/chat/PopupDistantChatDialog.h | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/retroshare-gui/src/gui/chat/ChatDialog.cpp b/retroshare-gui/src/gui/chat/ChatDialog.cpp index 2a52ccf35..9fe8220ab 100644 --- a/retroshare-gui/src/gui/chat/ChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatDialog.cpp @@ -109,7 +109,7 @@ void ChatDialog::init(const ChatId &id, const QString &title) { PopupDistantChatDialog* pdcd = new PopupDistantChatDialog(id.toDistantChatId()); - pdcd->init(id.toDistantChatId()); + pdcd->init(id, ""); cd = pdcd; } else diff --git a/retroshare-gui/src/gui/chat/PopupDistantChatDialog.cpp b/retroshare-gui/src/gui/chat/PopupDistantChatDialog.cpp index 4992b5ff5..dea397310 100644 --- a/retroshare-gui/src/gui/chat/PopupDistantChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/PopupDistantChatDialog.cpp @@ -63,9 +63,12 @@ PopupDistantChatDialog::PopupDistantChatDialog(const DistantChatPeerId& tunnel_i updateDisplay() ; } -void PopupDistantChatDialog::init(const DistantChatPeerId &peer_id) +void PopupDistantChatDialog::init(const ChatId &chat_id, const QString &/*title*/) { - _tunnel_id = peer_id; + if (!chat_id.isDistantChatId()) + return; + + _tunnel_id = chat_id.toDistantChatId(); DistantChatPeerInfo tinfo; if(!rsMsgs->getDistantChatStatus(_tunnel_id,tinfo)) @@ -74,15 +77,15 @@ void PopupDistantChatDialog::init(const DistantChatPeerId &peer_id) RsIdentityDetails iddetails ; if(rsIdentity->getIdDetails(tinfo.to_id,iddetails)) - PopupChatDialog::init(ChatId(peer_id), QString::fromUtf8(iddetails.mNickname.c_str())) ; + PopupChatDialog::init(chat_id, QString::fromUtf8(iddetails.mNickname.c_str())) ; else - PopupChatDialog::init(ChatId(peer_id), QString::fromStdString(tinfo.to_id.toStdString())) ; + PopupChatDialog::init(chat_id, QString::fromStdString(tinfo.to_id.toStdString())) ; // Do not use setOwnId, because we don't want the user to change the GXS avatar from the chat window // it will not be transmitted. ui.ownAvatarWidget->setOwnId() ; // sets the flag - ui.ownAvatarWidget->setId(ChatId(peer_id)) ; // sets the actual Id + ui.ownAvatarWidget->setId(chat_id) ; // sets the actual Id } void PopupDistantChatDialog::updateDisplay() diff --git a/retroshare-gui/src/gui/chat/PopupDistantChatDialog.h b/retroshare-gui/src/gui/chat/PopupDistantChatDialog.h index dfe75b9de..ff05f70c0 100644 --- a/retroshare-gui/src/gui/chat/PopupDistantChatDialog.h +++ b/retroshare-gui/src/gui/chat/PopupDistantChatDialog.h @@ -38,7 +38,7 @@ class PopupDistantChatDialog: public PopupChatDialog /** Default destructor */ virtual ~PopupDistantChatDialog(); - virtual void init(const DistantChatPeerId& peer_id); + virtual void init(const ChatId& chat_id, const QString &title); virtual void closeEvent(QCloseEvent *e) ; virtual QString getPeerName(const ChatId &id) const ; From 6f2d7bbca040448b9ad906e4f816543ee3c924f0 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sun, 19 Mar 2017 10:51:48 +0100 Subject: [PATCH 74/88] Fix Clang warnings: implicit conversion from 'double' to 'int' warning: implicit conversion from 'double' to 'int' changes value from 2.5 to 2 [-Wliteral-conversion] QSize buttonSize = QSize(iconSize + QSize(FMM,FMM)); --- retroshare-gui/src/gui/chat/ChatWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/retroshare-gui/src/gui/chat/ChatWidget.cpp b/retroshare-gui/src/gui/chat/ChatWidget.cpp index 2ea4ba348..37e2b589e 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.cpp +++ b/retroshare-gui/src/gui/chat/ChatWidget.cpp @@ -76,7 +76,7 @@ ChatWidget::ChatWidget(QWidget *parent) : int iconHeight = FMM*QFontMetricsF(font()).height() ; QSize iconSize = QSize(iconHeight,iconHeight); - QSize buttonSize = QSize(iconSize + QSize(FMM,FMM)); + QSize buttonSize = QSize(iconSize + QSize((int)FMM,(int)FMM)); newMessages = false; typing = false; @@ -258,7 +258,7 @@ void ChatWidget::addChatBarWidget(QWidget *w) { int iconHeight = FMM*QFontMetricsF(font()).height() ; QSize iconSize = QSize(iconHeight,iconHeight); - QSize buttonSize = QSize(iconSize + QSize(FMM,FMM)); + QSize buttonSize = QSize(iconSize + QSize((int)FMM,(int)FMM)); w->setFixedSize(buttonSize); ui->pluginButtonFrame->layout()->addWidget(w) ; } From 8d85cf558b0f5f2167185a4b56ce5f968fec8efd Mon Sep 17 00:00:00 2001 From: Phenom Date: Tue, 28 Mar 2017 21:16:05 +0200 Subject: [PATCH 75/88] Fix Clang warnings: 'xxxWidget::sizeHint' hides overloaded vf warning: 'IdentityWidget::sizeHint' hides overloaded virtual function [- Woverloaded-virtual] QSize sizeHint(); warning: 'CircleWidget::sizeHint' hides overloaded virtual function [- Woverloaded-virtual] QSize sizeHint(); /usr/include/qt4/QtGui/qwidget.h:537: hidden overloaded virtual function 'QWidget::sizeHint' declared here: different qualifiers (const vs none) virtual QSize sizeHint() const; --- retroshare-gui/src/gui/People/CircleWidget.cpp | 2 +- retroshare-gui/src/gui/People/CircleWidget.h | 2 +- retroshare-gui/src/gui/People/IdentityWidget.cpp | 2 +- retroshare-gui/src/gui/People/IdentityWidget.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/retroshare-gui/src/gui/People/CircleWidget.cpp b/retroshare-gui/src/gui/People/CircleWidget.cpp index 3a192f97a..b36a3fa56 100644 --- a/retroshare-gui/src/gui/People/CircleWidget.cpp +++ b/retroshare-gui/src/gui/People/CircleWidget.cpp @@ -96,7 +96,7 @@ void CircleWidget::updateData(const RsGroupMetaData& gxs_group_info } } -QSize CircleWidget::sizeHint() +QSize CircleWidget::sizeHint() const { QSize size; size.setHeight(ui->graphicsView->size().height() + ui->label->size().height()); diff --git a/retroshare-gui/src/gui/People/CircleWidget.h b/retroshare-gui/src/gui/People/CircleWidget.h index 08b6ad6dc..75d6899ba 100644 --- a/retroshare-gui/src/gui/People/CircleWidget.h +++ b/retroshare-gui/src/gui/People/CircleWidget.h @@ -24,7 +24,7 @@ public: , const RsGxsCircleDetails& details); //Start QWidget Properties - QSize sizeHint(); + QSize sizeHint() const; //Start FlowLayoutItem Properties virtual const QPixmap getImage(); virtual const QPixmap getDragImage(); diff --git a/retroshare-gui/src/gui/People/IdentityWidget.cpp b/retroshare-gui/src/gui/People/IdentityWidget.cpp index 902a4dc18..0fcfbc127 100644 --- a/retroshare-gui/src/gui/People/IdentityWidget.cpp +++ b/retroshare-gui/src/gui/People/IdentityWidget.cpp @@ -148,7 +148,7 @@ void IdentityWidget::updateData(const RsGxsIdGroup &gxs_group_info, const RsPeer updateData(pgp_details); } -QSize IdentityWidget::sizeHint() +QSize IdentityWidget::sizeHint() const { QSize size; size.setHeight(ui->graphicsView->size().height() + ui->labelName->size().height()); diff --git a/retroshare-gui/src/gui/People/IdentityWidget.h b/retroshare-gui/src/gui/People/IdentityWidget.h index c9ade98e3..7f5dcd97f 100644 --- a/retroshare-gui/src/gui/People/IdentityWidget.h +++ b/retroshare-gui/src/gui/People/IdentityWidget.h @@ -26,7 +26,7 @@ public: , const RsPeerDetails& pgp_details); //Start QWidget Properties - QSize sizeHint(); + QSize sizeHint() const; //Start FlowLayoutItem Properties virtual const QPixmap getImage(); virtual const QPixmap getDragImage(); From fd92bca688e07ade46aec892a23a323e6a3bed1c Mon Sep 17 00:00:00 2001 From: Phenom Date: Tue, 28 Mar 2017 21:18:25 +0200 Subject: [PATCH 76/88] Fix Clang warnings: variable 'layout' is used uninitialized warning: variable 'layout' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] if (wid) layout = --- retroshare-gui/src/gui/People/PeopleDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/retroshare-gui/src/gui/People/PeopleDialog.cpp b/retroshare-gui/src/gui/People/PeopleDialog.cpp index 5098da953..bdf247a4f 100644 --- a/retroshare-gui/src/gui/People/PeopleDialog.cpp +++ b/retroshare-gui/src/gui/People/PeopleDialog.cpp @@ -901,7 +901,7 @@ void PeopleDialog::pf_dropEventOccursExt(QDropEvent *event) QWidget *wid = qobject_cast(event->source());//QT5 return QObject - FlowLayout *layout; + FlowLayout *layout = NULL; if (wid) layout = qobject_cast(wid->layout()); if (layout) { @@ -991,7 +991,7 @@ void PeopleDialog::pf_dropEventOccursInt(QDropEvent *event) QWidget *wid = qobject_cast(event->source());//QT5 return QObject - FlowLayout *layout; + FlowLayout *layout = NULL; if (wid) layout = qobject_cast(wid->layout()); if (layout) { From 94ac8216f7c2b7725ddd6607f5717adac1b5cd31 Mon Sep 17 00:00:00 2001 From: Phenom Date: Wed, 29 Mar 2017 18:13:17 +0200 Subject: [PATCH 77/88] Fix Clang warnings: Unused variable Pi warning: unused variable 'Pi' [-Wunused-const-variable] static const double Pi = 3.14159265358979323846264338327950288419717; --- retroshare-gui/src/gui/elastic/edge.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/elastic/edge.cpp b/retroshare-gui/src/gui/elastic/edge.cpp index 4fec24fe7..e9e60f06b 100644 --- a/retroshare-gui/src/gui/elastic/edge.cpp +++ b/retroshare-gui/src/gui/elastic/edge.cpp @@ -46,7 +46,7 @@ #include -static const double Pi = 3.14159265358979323846264338327950288419717; +//static const double Pi = 3.14159265358979323846264338327950288419717; Edge::Edge(Node *sourceNode, Node *destNode) : arrowSize(10) From a3a53b970dadc3c11c1c35b5ddff56cd1572a1e5 Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 7 Apr 2017 18:19:42 +0200 Subject: [PATCH 78/88] Fix Clang warnings: unused parameter 'req' warning: unused parameter 'req' [-Wunused-parameter] void PeersHandler::handleGetStateString(Request& req, Response& resp) --- libresapi/src/api/PeersHandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libresapi/src/api/PeersHandler.cpp b/libresapi/src/api/PeersHandler.cpp index 8473bce04..1c4129a38 100644 --- a/libresapi/src/api/PeersHandler.cpp +++ b/libresapi/src/api/PeersHandler.cpp @@ -200,7 +200,7 @@ static bool have_avatar(RsMsgs* msgs, const RsPeerId& id) return size != 0; } -void PeersHandler::handleGetStateString(Request& req, Response& resp) +void PeersHandler::handleGetStateString(Request& /*req*/, Response& resp) { { RS_STACK_MUTEX(mMtx); @@ -246,7 +246,7 @@ void PeersHandler::handleSetStateString(Request& req, Response& resp) resp.setOk(); } -void PeersHandler::handleGetCustomStateString(Request& req, Response& resp) +void PeersHandler::handleGetCustomStateString(Request& /*req*/, Response& resp) { { RS_STACK_MUTEX(mMtx); From 19196e2cb05dfb451d9ca15305042404fc3425c8 Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 7 Apr 2017 18:21:49 +0200 Subject: [PATCH 79/88] Fix Clang warnings: ariable 'status' is used uninitialized warning: variable 'status' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] else if(state_string == "away") ^~~~~~~~~~~~~~~~~~~~~~ --- libresapi/src/api/PeersHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libresapi/src/api/PeersHandler.cpp b/libresapi/src/api/PeersHandler.cpp index 1c4129a38..88e9bc445 100644 --- a/libresapi/src/api/PeersHandler.cpp +++ b/libresapi/src/api/PeersHandler.cpp @@ -234,7 +234,7 @@ void PeersHandler::handleSetStateString(Request& req, Response& resp) std::string state_string; req.mStream << makeKeyValueReference("state_string", state_string); - uint32_t status; + uint32_t status = RS_STATUS_OFFLINE; if(state_string == "online") status = RS_STATUS_ONLINE; else if(state_string == "busy") From d8a73132c11bab531cbb8b31ad9583fe09a88532 Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 7 Apr 2017 18:32:55 +0200 Subject: [PATCH 80/88] Fix Clang warnings: implicit conversion from 'double' to 'int' warning: implicit conversion from 'double' to 'int' changes value from 0.5 to 0 [-Wliteral-conversion] painter.setPen(QColor::fromRgb(0.5,0.5,0.5)); --- retroshare-gui/src/gui/statistics/GlobalRouterStatistics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/statistics/GlobalRouterStatistics.cpp b/retroshare-gui/src/gui/statistics/GlobalRouterStatistics.cpp index a309717b8..a8e830624 100644 --- a/retroshare-gui/src/gui/statistics/GlobalRouterStatistics.cpp +++ b/retroshare-gui/src/gui/statistics/GlobalRouterStatistics.cpp @@ -379,7 +379,7 @@ void GlobalRouterStatisticsWidget::updateContent() painter.setPen(QColor::fromRgb(0,0,0)) ; - painter.setPen(QColor::fromRgb(0.5,0.5,0.5)); + painter.setPen(QColor::fromRgb(127,127,127)); painter.drawRect(ox+2*cellx,current_oy+0.15*celly,fm_monospace.width(ids)+cellx*matrix_info.friend_ids.size()- 2*cellx,celly) ; float total_length = (matrix_info.friend_ids.size()+2)*cellx ; From a476a8138cb410e7b00090e6c371461398365900 Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 7 Apr 2017 18:40:02 +0200 Subject: [PATCH 81/88] Fix Clang warnings: function 'update_children_background' is not needed warning: function 'update_children_background' is not needed and will not be emitted [-Wunneeded-internal-declaration] static void update_children_background(QTreeWidgetItem *item, uint32_t type) ^ --- retroshare-gui/src/gui/Identity/IdDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 1cf93055b..3b097b986 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -1233,6 +1233,7 @@ static void set_item_background(QTreeWidgetItem *item, uint32_t type) item->setBackground (0, brush); } +#ifdef SUSPENDED static void update_children_background(QTreeWidgetItem *item, uint32_t type) { int count = item->childCount(); @@ -1248,7 +1249,6 @@ static void update_children_background(QTreeWidgetItem *item, uint32_t type) } } -#ifdef SUSPENDED static void set_tree_background(QTreeWidget *tree, uint32_t type) { std::cerr << "CirclesDialog set_tree_background()"; From 0bbd1499d4a57f235032068f6d5824b745d1fbbd Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 7 Apr 2017 18:42:22 +0200 Subject: [PATCH 82/88] Fix Clang warnings: comparison of integers of different signs warning: comparison of integers of different signs: 'uint32_t' (aka 'unsigned int') and 'int' [-Wsign-compare] for(uint32_t i=0;i<(*it).size();++i) ~^~~~~~~~~~~~~ --- retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index 4254af49e..5c479005c 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -1607,7 +1607,7 @@ void GxsForumThreadWidget::insertMessage() int current_index = 0 ; - for(uint32_t i=0;i<(*it).size();++i) + for(int i=0;i<(*it).size();++i) { ui->versions_CB->insertItem(i, ((i==0)?tr("(Latest) "):tr("(Old) "))+" "+DateTime::formatLongDateTime( (*it)[i].first)); ui->versions_CB->setItemData(i,QString::fromStdString((*it)[i].second.toStdString())); From 76f75736598c1e1ce7fca9741bc7b34ccef0185b Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 7 Apr 2017 18:48:40 +0200 Subject: [PATCH 83/88] Fix Clang warnings: comparison of array != a null pointer is always true warning: comparison of array 'known_zones[i].tzName' not equal to a null pointer is always true [-Wtautological-pointer-compare] for (int i=0; known_zones[i].tzName != 0; i++) { --- plugins/FeedReader/services/p3FeedReaderThread.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/FeedReader/services/p3FeedReaderThread.cc b/plugins/FeedReader/services/p3FeedReaderThread.cc index c638304f4..9ec1106ef 100644 --- a/plugins/FeedReader/services/p3FeedReaderThread.cc +++ b/plugins/FeedReader/services/p3FeedReaderThread.cc @@ -651,7 +651,7 @@ static time_t parseRFC822Date(const std::string &pubDate) offset = abs(offset); offset = ((offset / 100)*60 + (offset % 100))*sgn; } else { - for (int i=0; known_zones[i].tzName != 0; i++) { + for (int i=0; known_zones[i].tzName[0] != 0; i++) { if (0 == strncasecmp(dateString, known_zones[i].tzName, strlen(known_zones[i].tzName))) { offset = known_zones[i].tzOffset; break; From 4f939b2b760ae0257cb49db19d9da610a11b1ac3 Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 7 Apr 2017 19:29:27 +0200 Subject: [PATCH 84/88] Fix Clang warnings: unused function 'set_item_background' warning: unused function 'set_item_background' [-Wunused-function] static void set_item_background(QTreeWidgetItem *item, uint32_t type) --- retroshare-gui/src/gui/Identity/IdDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 3b097b986..aac7e3ba5 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -1208,6 +1208,7 @@ void IdDialog::CircleListCustomPopupMenu( QPoint ) contextMnu.exec(QCursor::pos()); } +#ifdef SUSPENDED static void set_item_background(QTreeWidgetItem *item, uint32_t type) { QBrush brush; @@ -1233,7 +1234,6 @@ static void set_item_background(QTreeWidgetItem *item, uint32_t type) item->setBackground (0, brush); } -#ifdef SUSPENDED static void update_children_background(QTreeWidgetItem *item, uint32_t type) { int count = item->childCount(); From 87dd6140885771e9534782b438b1ad9fb31691c6 Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 7 Apr 2017 19:32:19 +0200 Subject: [PATCH 85/88] Fix Clang Warnings: private field 'encoding_debug_file' is not used warning: private field 'encoding_debug_file' is not used [-Wunused- private-field] FILE *encoding_debug_file ; --- plugins/VOIP/gui/VideoProcessor.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/VOIP/gui/VideoProcessor.h b/plugins/VOIP/gui/VideoProcessor.h index 4e47b2c29..4946c4342 100644 --- a/plugins/VOIP/gui/VideoProcessor.h +++ b/plugins/VOIP/gui/VideoProcessor.h @@ -66,7 +66,9 @@ private: AVPacket decoding_buffer; uint64_t encoding_frame_count ; +#ifdef DEBUG_MPEG_VIDEO FILE *encoding_debug_file ; +#endif }; // This class decodes video from a stream. It keeps a queue of From 7d9a80326dc3b14b1a04362eb18e635d9d41a27e Mon Sep 17 00:00:00 2001 From: Phenom Date: Tue, 18 Apr 2017 11:18:10 +0200 Subject: [PATCH 86/88] Fix Clang warnings: bdnet_inet_ntoa C-linkage /libbitdht/src/util/bdnet.h:107: warning: 'bdnet_inet_ntoa' has C- linkage specified, but returns user-defined type 'std::string' (aka 'basic_string') which is incompatible with C [-Wreturn-type-c- linkage] std::string bdnet_inet_ntoa(struct in_addr in); ^ --- libbitdht/src/util/bdnet.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libbitdht/src/util/bdnet.h b/libbitdht/src/util/bdnet.h index 9b9d36f48..7e3e24644 100644 --- a/libbitdht/src/util/bdnet.h +++ b/libbitdht/src/util/bdnet.h @@ -103,8 +103,6 @@ int bdnet_inet_aton(const char *name, struct in_addr *addr); int bdnet_checkTTL(int fd); void bdsockaddr_clear(struct sockaddr_in *addr); -/* thread-safe version of inet_ntoa */ -std::string bdnet_inet_ntoa(struct in_addr in); /* Extra stuff to declare for windows error handling (mimics unix errno) */ @@ -175,4 +173,7 @@ int usleep(unsigned int usec); } /* C Interface */ #endif +/* thread-safe version of inet_ntoa */ +std::string bdnet_inet_ntoa(struct in_addr in); + #endif /* BITDHT_UNIVERSAL_NETWORK_HEADER */ From 37331372c145d24291d5e53ac45acd426ef4ee4d Mon Sep 17 00:00:00 2001 From: Phenom Date: Tue, 18 Apr 2017 11:25:41 +0200 Subject: [PATCH 87/88] Fix Clang warnings: implicit conversion warning: implicit conversion from 'int' to 'char' changes value from 255 to -1 [-Wconstant-conversion] asctobin()[i] = 255; /* used to detect invalid characters */ --- libretroshare/src/util/radix64.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/util/radix64.h b/libretroshare/src/util/radix64.h index 9ee80f2dd..7776995f9 100644 --- a/libretroshare/src/util/radix64.h +++ b/libretroshare/src/util/radix64.h @@ -147,7 +147,7 @@ again: private: static inline char *bintoasc() { static char bta[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; return bta ; } - static inline char *asctobin() { static char s[256]; return s ; } /* runtime radix64_initd */ + static inline uint8_t *asctobin() { static uint8_t s[256]; return s ; } /* runtime radix64_initd */ static int& is_radix64_initd() { static int is_inited = false ; return is_inited ; } /* hey, guess what: this is a read-only table. From 3c5e61a297d548683e97d5e16568333dc29204ca Mon Sep 17 00:00:00 2001 From: Phenom Date: Tue, 18 Apr 2017 17:36:43 +0200 Subject: [PATCH 88/88] Encode Radix in RSLinks. Because it can contains special characters like '+', '/'. But this is not backward compatible. --- retroshare-gui/src/gui/RetroShareLink.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index 4d32930aa..28a2d09c6 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -309,8 +309,8 @@ void RetroShareLink::fromUrl(const QUrl& url) if(url.host() == HOST_IDENTITY) { _type = TYPE_IDENTITY ; - QString name = urlQuery.queryItemValue(IDENTITY_NAME) ; - QString radix= urlQuery.queryItemValue(IDENTITY_GROUP) ; + QString name = decodedQueryItemValue(urlQuery, IDENTITY_NAME) ; + QString radix= decodedQueryItemValue(urlQuery, IDENTITY_GROUP) ; QString gxsid= urlQuery.queryItemValue(IDENTITY_ID) ; RsGxsId id(gxsid.toStdString()) ; @@ -331,7 +331,7 @@ void RetroShareLink::fromUrl(const QUrl& url) if (url.host() == HOST_CERTIFICATE) { _type = TYPE_CERTIFICATE; - _radix = urlQuery.queryItemValue(CERTIFICATE_RADIX); + _radix = decodedQueryItemValue(urlQuery, CERTIFICATE_RADIX); #ifdef DEBUG_RSLINK std::cerr << "Got a certificate link!!" << std::endl; @@ -765,7 +765,7 @@ QString RetroShareLink::toString() const url.setHost(HOST_IDENTITY) ; urlQuery.addQueryItem(IDENTITY_ID,_hash) ; urlQuery.addQueryItem(IDENTITY_NAME,encodeItem(_name)) ; - urlQuery.addQueryItem(IDENTITY_GROUP,_radix_group_data) ; + urlQuery.addQueryItem(IDENTITY_GROUP,encodeItem(_radix_group_data)) ; break ; case TYPE_EXTRAFILE: @@ -839,9 +839,9 @@ QString RetroShareLink::toString() const case TYPE_CERTIFICATE: url.setScheme(RSLINK_SCHEME); url.setHost(HOST_CERTIFICATE) ; - urlQuery.addQueryItem(CERTIFICATE_RADIX, _radix); - urlQuery.addQueryItem(CERTIFICATE_NAME, _name); - urlQuery.addQueryItem(CERTIFICATE_LOCATION, _location); + urlQuery.addQueryItem(CERTIFICATE_RADIX, encodeItem(_radix)); + urlQuery.addQueryItem(CERTIFICATE_NAME, encodeItem(_name)); + urlQuery.addQueryItem(CERTIFICATE_LOCATION, encodeItem(_location)); break; }