Added size limit for chat types - Public, Private, Lobby, Distant

Set the size limit for private and distant chat to unlimited.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@7761 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2014-12-16 10:39:56 +00:00
parent 93f77a0e2c
commit 55be6675af
6 changed files with 60 additions and 17 deletions

View File

@ -509,25 +509,42 @@ void p3ChatService::handleRecvChatAvatarItem(RsChatAvatarItem *ca)
RsServer::notify()->notifyPeerHasNewAvatar(ca->PeerId().toStdString()) ;
}
int p3ChatService::getMaxMessageSecuritySize()
uint32_t p3ChatService::getMaxMessageSecuritySize(int type)
{
switch (type)
{
case RS_CHAT_TYPE_PUBLIC:
case RS_CHAT_TYPE_LOBBY:
return MAX_MESSAGE_SECURITY_SIZE;
case RS_CHAT_TYPE_PRIVATE:
case RS_CHAT_TYPE_DISTANT:
return 0; // unlimited
}
std::cerr << "p3ChatService::getMaxMessageSecuritySize: Unknown chat type " << type << std::endl;
return MAX_MESSAGE_SECURITY_SIZE;
}
bool p3ChatService::checkForMessageSecurity(RsChatMsgItem *ci)
{
// Remove too big messages
if (ci->message.length() > MAX_MESSAGE_SECURITY_SIZE && (ci->chatFlags & RS_CHAT_FLAG_LOBBY))
if (ci->chatFlags & RS_CHAT_FLAG_LOBBY)
{
std::ostringstream os;
os << getMaxMessageSecuritySize();
uint32_t maxMessageSize = getMaxMessageSecuritySize(RS_CHAT_TYPE_LOBBY);
if (maxMessageSize > 0 && ci->message.length() > maxMessageSize)
{
std::ostringstream os;
os << getMaxMessageSecuritySize(RS_CHAT_TYPE_LOBBY);
ci->message = "**** Security warning: Message bigger than ";
ci->message += os.str();
ci->message += " characters, forwarded to you by ";
ci->message += rsPeers->getPeerName(ci->PeerId());
ci->message += ", dropped. ****";
return false;
ci->message = "**** Security warning: Message bigger than ";
ci->message += os.str();
ci->message += " characters, forwarded to you by ";
ci->message += rsPeers->getPeerName(ci->PeerId());
ci->message += ", dropped. ****";
return false;
}
}
// The following code has been suggested, but is kept suspended since it is a bit too much restrictive.

View File

@ -159,8 +159,10 @@ class p3ChatService: public p3Service, public DistantChatService, public Distrib
/*!
* Return the max message size for security forwarding
* @param type RS_CHAT_TYPE_...
* return 0 unlimited
*/
static int getMaxMessageSecuritySize();
static uint32_t getMaxMessageSecuritySize(int type);
/*!
* Checks message security, especially remove billion laughs attacks

View File

@ -83,6 +83,11 @@
#define RS_CHAT_LOBBY_PRIVACY_LEVEL_PUBLIC 1 /* lobby is visible by friends. Friends can connect.*/
#define RS_CHAT_LOBBY_PRIVACY_LEVEL_PRIVATE 2 /* lobby invisible by friends. Peers on invitation only .*/
#define RS_CHAT_TYPE_PUBLIC 1
#define RS_CHAT_TYPE_PRIVATE 2
#define RS_CHAT_TYPE_LOBBY 3
#define RS_CHAT_TYPE_DISTANT 4
const ChatLobbyFlags RS_CHAT_LOBBY_FLAGS_AUTO_SUBSCRIBE( 0x00000001 ) ;
typedef uint64_t ChatLobbyId ;
@ -384,7 +389,7 @@ virtual int getPrivateChatQueueCount(bool incoming) = 0;
virtual bool getPrivateChatQueueIds(bool incoming, std::list<RsPeerId> &ids) = 0;
virtual bool getPrivateChatQueue(bool incoming, const RsPeerId& id, std::list<ChatInfo> &chats) = 0;
virtual bool clearPrivateChatQueue(bool incoming, const RsPeerId& id) = 0;
virtual int getMaxMessageSecuritySize() = 0;
virtual uint32_t getMaxMessageSecuritySize(int type) = 0;
virtual void sendStatusString(const RsPeerId& id,const std::string& status_string) = 0 ;
virtual void sendGroupChatStatusString(const std::string& status_string) = 0 ;

View File

@ -252,9 +252,9 @@ bool p3Msgs::clearPrivateChatQueue(bool incoming, const RsPeerId& id)
return mChatSrv->clearPrivateChatQueue(incoming, id);
}
int p3Msgs::getMaxMessageSecuritySize()
uint32_t p3Msgs::getMaxMessageSecuritySize(int type)
{
return mChatSrv->getMaxMessageSecuritySize();
return mChatSrv->getMaxMessageSecuritySize(type);
}
void p3Msgs::getOwnAvatarData(unsigned char *& data,int& size)

View File

@ -161,7 +161,7 @@ class p3Msgs: public RsMsgs
/*!
* Return the max message size for security forwarding
*/
virtual int getMaxMessageSecuritySize();
virtual uint32_t getMaxMessageSecuritySize(int type);
/*!
* sends immediate status string to a specific peer, e.g. in a private chat

View File

@ -848,10 +848,29 @@ void ChatWidget::updateLenOfChatTextEdit()
QString text;
RsHtml::optimizeHtml(chatWidget, text);
std::wstring msg = text.toStdWString();
bool msgToLarge = (msg.length()>=size_t(rsMsgs->getMaxMessageSecuritySize()));
uint32_t maxMessageSize = 0;
switch (chatType()) {
case CHATTYPE_UNKNOWN:
break;
case CHATTYPE_PRIVATE:
maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_PRIVATE);
break;
case CHATTYPE_LOBBY:
maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_LOBBY);
break;
case CHATTYPE_DISTANT:
maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_DISTANT);
break;
}
bool msgToLarge = false;
if (maxMessageSize > 0) {
msgToLarge = (msg.length() >= maxMessageSize);
}
ui->sendButton->setEnabled(!msgToLarge);
text = tr("%1This message counts %2 characters.").arg(msgToLarge?tr("Warning: "):"").arg(msg.length());
text = tr("%1This message counts %2 characters.").arg(msgToLarge ? tr("Warning: ") : "").arg(msg.length());
ui->sendButton->setToolTip(text);
ui->chatTextEdit->setToolTip(msgToLarge?text:"");
}