From 59535eac8ab6bee0f5fe713d54ae688d82ad2acf Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 2 Sep 2018 17:07:40 +0200 Subject: [PATCH] added a flag for moderating messages to help removign them when the author is not a moderator anymore --- libretroshare/src/gxs/rsgxsdata.h | 2 +- libretroshare/src/retroshare/rsgxsflags.h | 3 +-- libretroshare/src/retroshare/rsgxsforums.h | 8 ++++++++ libretroshare/src/retroshare/rsgxsifacetypes.h | 2 +- libretroshare/src/services/p3photoservice.cc | 4 ++-- retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp | 7 +++++-- retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h | 3 ++- .../src/gui/gxsforums/GxsForumThreadWidget.cpp | 2 +- .../src/gui/gxsforums/GxsForumsFillThread.cpp | 10 ++++++++-- 9 files changed, 29 insertions(+), 12 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsdata.h b/libretroshare/src/gxs/rsgxsdata.h index fffcfbe6a..ff76539cc 100644 --- a/libretroshare/src/gxs/rsgxsdata.h +++ b/libretroshare/src/gxs/rsgxsdata.h @@ -111,7 +111,7 @@ public: RsTlvKeySignatureSet signSet; std::string mMsgName; time_t mPublishTs; - uint32_t mMsgFlags; // Whats this for? + uint32_t mMsgFlags; // used by some services (e.g. by forums to store message moderation flags) // BELOW HERE IS LOCAL DATA, THAT IS NOT FROM MSG. // normally READ / UNREAD flags. LOCAL Data. diff --git a/libretroshare/src/retroshare/rsgxsflags.h b/libretroshare/src/retroshare/rsgxsflags.h index b2645aaab..885c5ae67 100644 --- a/libretroshare/src/retroshare/rsgxsflags.h +++ b/libretroshare/src/retroshare/rsgxsflags.h @@ -115,8 +115,7 @@ namespace GXS_SERV { /** START GXS Grp status flags **/ static const uint32_t GXS_GRP_STATUS_UNPROCESSED = 0x000000100; - - static const uint32_t GXS_GRP_STATUS_UNREAD = 0x00000200; + static const uint32_t GXS_GRP_STATUS_UNREAD = 0x000000200; /** END GXS Grp status flags **/ } diff --git a/libretroshare/src/retroshare/rsgxsforums.h b/libretroshare/src/retroshare/rsgxsforums.h index 802603ce5..690523055 100644 --- a/libretroshare/src/retroshare/rsgxsforums.h +++ b/libretroshare/src/retroshare/rsgxsforums.h @@ -30,6 +30,14 @@ #include "retroshare/rsgxsifacehelper.h" #include "serialiser/rstlvidset.h" +// Forum Service message flags, to be used in RsMsgMetaData::mMsgFlags +// Gxs imposes to use the first two bytes (lower bytes) of mMsgFlags for private forum flags, the upper bytes being used for internal GXS stuff. + +static const uint32_t RS_GXS_FORUM_MSG_FLAGS_MASK = 0x0000000f ; +static const uint32_t RS_GXS_FORUM_MSG_FLAGS_MODERATED = 0x00000001 ; + +#define IS_FORUM_MSG_MODERATION(flags) (flags & RS_GXS_FORUM_MSG_FLAGS_MODERATED) + /* The Main Interface Class - for information about your Peers */ class RsGxsForums; extern RsGxsForums *rsGxsForums; diff --git a/libretroshare/src/retroshare/rsgxsifacetypes.h b/libretroshare/src/retroshare/rsgxsifacetypes.h index 8c90cb3b2..1ee523b6a 100644 --- a/libretroshare/src/retroshare/rsgxsifacetypes.h +++ b/libretroshare/src/retroshare/rsgxsifacetypes.h @@ -138,7 +138,7 @@ struct RsMsgMetaData : RsSerializable std::string mMsgName; time_t mPublishTs; - /// the first 16 bits for service, last 16 for GXS + /// the lower 16 bits for service, upper 16 bits for GXS uint32_t mMsgFlags; // BELOW HERE IS LOCAL DATA, THAT IS NOT FROM MSG. diff --git a/libretroshare/src/services/p3photoservice.cc b/libretroshare/src/services/p3photoservice.cc index fa42224d7..71a920345 100644 --- a/libretroshare/src/services/p3photoservice.cc +++ b/libretroshare/src/services/p3photoservice.cc @@ -26,8 +26,8 @@ RsPhoto *rsPhoto = NULL; -const uint32_t RsPhoto::FLAG_MSG_TYPE_MASK = 0x000f; -const uint32_t RsPhoto::FLAG_MSG_TYPE_PHOTO_POST = 0x0001; +const uint32_t RsPhoto::FLAG_MSG_TYPE_MASK = 0x000f; +const uint32_t RsPhoto::FLAG_MSG_TYPE_PHOTO_POST = 0x0001; const uint32_t RsPhoto::FLAG_MSG_TYPE_PHOTO_COMMENT = 0x0002; diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index 23d827ac3..56d34659b 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -50,8 +50,9 @@ //#define ENABLE_GENERATE /** Constructor */ -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) +CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId, const RsGxsMessageId& mOId, const RsGxsId& posterId, bool isModerating) + : QDialog(NULL, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint), + mForumId(fId), mParentId(pId), mOrigMsgId(mOId),mPosterId(posterId),mIsModerating(isModerating) { /* Invoke the Qt Designer generated object setup routine */ ui.setupUi(this); @@ -355,7 +356,9 @@ void CreateGxsForumMsg::createMsg() msg.mMeta.mGroupId = mForumId; msg.mMeta.mParentId = mParentId; msg.mMeta.mOrigMsgId = mOrigMsgId; + msg.mMeta.mMsgFlags = mIsModerating?RS_GXS_FORUM_MSG_FLAGS_MODERATED : 0; msg.mMeta.mMsgId.clear() ; + if (mParentMsgLoaded) { msg.mMeta.mThreadId = mParentMsg.mMeta.mThreadId; }//if (mParentMsgLoaded) diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h index a7e4c78c3..fdf01deb8 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, const RsGxsId &posterId = RsGxsId()); + CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessageId &pId, const RsGxsMessageId &moId, const RsGxsId &posterId = RsGxsId(),bool isModerating=false); ~CreateGxsForumMsg(); void newMsg(); /* cleanup */ @@ -75,6 +75,7 @@ private: bool mOrigMsgLoaded; bool mForumMetaLoaded; bool mForumCircleLoaded ; + bool mIsModerating; // means that the msg has a orig author Id that is not the Id of the author RsGxsForumMsg mParentMsg; RsGxsForumMsg mOrigMsg; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index f97caf24f..d1d017e7d 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -2325,7 +2325,7 @@ void GxsForumThreadWidget::editForumMessageData(const RsGxsForumMsg& msg) if (!msg.mMeta.mAuthorId.isNull()) { - CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), msg.mMeta.mParentId, msg.mMeta.mMsgId, is_own?(msg.mMeta.mAuthorId):moderator_id); + CreateGxsForumMsg *cfm = new CreateGxsForumMsg(groupId(), msg.mMeta.mParentId, msg.mMeta.mMsgId, is_own?(msg.mMeta.mAuthorId):moderator_id,!is_own); 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 6e33fab09..a0228f671 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp @@ -255,8 +255,14 @@ void GxsForumsFillThread::run() // Make sure that the author is the same than the original message, or is a moderator. This should always happen when messages are constructed using // the UI but nothing can prevent a nasty user to craft a new version of a message with his own signature. - if(msgIt2->second.mMeta.mAuthorId != msgIt->second.mMeta.mAuthorId && forum_group.mAdminList.ids.find(msgIt->second.mMeta.mAuthorId)==forum_group.mAdminList.ids.end()) - continue ; + if(msgIt2->second.mMeta.mAuthorId != msgIt->second.mMeta.mAuthorId) + { + if( !IS_FORUM_MSG_MODERATION(msgIt->second.mMeta.mMsgFlags) ) // if authors are different the moderation flag needs to be set on the editing msg + continue ; + + if( forum_group.mAdminList.ids.find(msgIt->second.mMeta.mAuthorId)==forum_group.mAdminList.ids.end()) // if author is not a moderator, continue + continue ; + } // always add the post a self version