added the possibility to distant chat with unverified identities, while warning the user about it. Should help distant chatting.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6812 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2013-10-07 20:49:02 +00:00
parent ed44bc6884
commit e4e28c733c
10 changed files with 56 additions and 7 deletions

View File

@ -163,6 +163,9 @@ public:
#define RS_DISTANT_CHAT_ERROR_UNKNOWN_KEY 0x0003
#define RS_DISTANT_CHAT_ERROR_UNKNOWN_HASH 0x0004
#define RS_DISTANT_CHAT_FLAG_SIGNED 0x0001
#define RS_DISTANT_CHAT_FLAG_SIGNATURE_OK 0x0002
class ChatInfo
{
public:
@ -220,6 +223,7 @@ struct DistantChatInviteInfo
std::string encrypted_radix64_string ; // encrypted radix string used to for the chat link
std::string destination_pgp_id ; // pgp is of the destination of the chat link
time_t time_of_validity ; // time when te invite becomes unusable
uint32_t invite_flags ; // used to keep track of wether signature was ok or not.
};
std::ostream &operator<<(std::ostream &out, const MessageInfo &info);

View File

@ -208,6 +208,9 @@ std::ostream& RsPrivateChatDistantInviteConfigItem::print(std::ostream &out, uin
printIndent(out, int_Indent);
out << "time of last hit: " << last_hit_time << std::endl;
printIndent(out, int_Indent);
out << "flags: " << flags << std::endl;
printRsItemEnd(out, "RsPrivateChatDistantInviteConfigItem", indent);
return out;
}
@ -432,6 +435,7 @@ uint32_t RsPrivateChatDistantInviteConfigItem::serial_size()
s += 16; /* aes_key */
s += 4; /* time_of_validity */
s += 4; /* last_hit_time */
s += 4; /* flags */
return s;
}
@ -849,6 +853,7 @@ bool RsPrivateChatDistantInviteConfigItem::serialise(void *data, uint32_t& pktsi
ok &= setRawUInt32(data, tlvsize, &offset, time_of_validity);
ok &= setRawUInt32(data, tlvsize, &offset, last_hit_time);
ok &= setRawUInt32(data, tlvsize, &offset, flags);
if (offset != tlvsize)
{
@ -1256,6 +1261,11 @@ RsPrivateChatDistantInviteConfigItem::RsPrivateChatDistantInviteConfigItem(void
ok &= getRawUInt32(data, rssize, &offset, &time_of_validity);
ok &= getRawUInt32(data, rssize, &offset, &last_hit_time);
if(offset+4 == rssize) // flags are optional for retro-compatibility.
ok &= getRawUInt32(data, rssize, &offset, &flags);
else
flags = 0 ;
#ifdef CHAT_DEBUG
std::cerr << "Building new chat msg config item." << std::endl ;
#endif

View File

@ -338,6 +338,7 @@ class RsPrivateChatDistantInviteConfigItem: public RsChatItem
std::string destination_pgp_id ;
uint32_t time_of_validity ;
uint32_t last_hit_time ;
uint32_t flags ;
};
class RsChatLobbyConfigItem: public RsChatItem
{

View File

@ -1989,6 +1989,7 @@ bool p3ChatService::loadList(std::list<RsItem*>& load)
invite.destination_pgp_id = ditem->destination_pgp_id ;
invite.time_of_validity = ditem->time_of_validity ;
invite.last_hit_time = ditem->last_hit_time ;
invite.flags = ditem->flags ;
_distant_chat_invites[ditem->hash] = invite ;
@ -2075,6 +2076,7 @@ bool p3ChatService::saveList(bool& cleanup, std::list<RsItem*>& list)
ei->destination_pgp_id = it->second.destination_pgp_id ;
ei->time_of_validity = it->second.time_of_validity ;
ei->last_hit_time = it->second.last_hit_time ;
ei->flags = it->second.flags ;
list.push_back(ei) ;
}
@ -3573,11 +3575,8 @@ bool p3ChatService::initiateDistantChatConnexion(const std::string& encrypted_st
return false ;
}
if(!AuthGPG::getAuthGPG()->VerifySignBin(data,header_size,data+header_size,data_size-header_size,fingerprint.toStdString()))
{
error_code = RS_DISTANT_CHAT_ERROR_SIGNATURE_MISMATCH ;
return false ;
}
bool signature_checked = AuthGPG::getAuthGPG()->VerifySignBin(data,header_size,data+header_size,data_size-header_size,fingerprint.toStdString()) ;
#ifdef DEBUG_DISTANT_CHAT
std::cerr << "Signature successfuly verified!" << std::endl;
#endif
@ -3593,6 +3592,7 @@ bool p3ChatService::initiateDistantChatConnexion(const std::string& encrypted_st
dinvite.destination_pgp_id = pgp_id.toStdString() ;
dinvite.time_of_validity = time_of_validity ;
dinvite.last_hit_time = time(NULL) ;
dinvite.flags = RS_DISTANT_CHAT_FLAG_SIGNED | (signature_checked ? RS_DISTANT_CHAT_FLAG_SIGNATURE_OK : 0) ;
memcpy(dinvite.aes_key,data+DISTANT_CHAT_HASH_SIZE,DISTANT_CHAT_AES_KEY_SIZE) ;
{
@ -3610,7 +3610,8 @@ bool p3ChatService::initiateDistantChatConnexion(const std::string& encrypted_st
// And notify about chatting.
error_code = RS_DISTANT_CHAT_ERROR_NO_ERROR ;
error_code = signature_checked ? RS_DISTANT_CHAT_ERROR_NO_ERROR : RS_DISTANT_CHAT_ERROR_UNKNOWN_KEY;
getPqiNotify()->AddPopupMessage(RS_POPUP_CHAT, hash, "Distant peer", "Conversation starts...");
// Save config, since a new invite was added.
@ -3713,6 +3714,7 @@ bool p3ChatService::getDistantChatInviteList(std::vector<DistantChatInviteInfo>&
info.encrypted_radix64_string = it->second.encrypted_radix64_string ;
info.time_of_validity = it->second.time_of_validity ;
info.destination_pgp_id = it->second.destination_pgp_id ;
info.invite_flags = it->second.flags ;
invites.push_back(info);
}

View File

@ -344,6 +344,7 @@ class p3ChatService: public p3Service, public p3Config, public pqiMonitor, publi
std::string destination_pgp_id ;
time_t time_of_validity ;
time_t last_hit_time ;
uint32_t flags ;
};
struct DistantChatPeerInfo
{

View File

@ -1274,8 +1274,13 @@ static void processList(const QStringList &list, const QString &textSingular, co
QMessageBox::information(NULL,QObject::tr("Chat connection is not possible"),error_msg) ;
}
else
{
if(error_code == RS_DISTANT_CHAT_ERROR_UNKNOWN_KEY)
QMessageBox::information(NULL,QObject::tr("Chat connection is unauthentified"),QObject::tr("Signature check failed!\nMake sure you know who you're talking to.")) ;
ChatDialog::chatFriend(hash);
}
}
break ;
case TYPE_FILE:

View File

@ -9,6 +9,8 @@
<file>images/edit_24.png</file>
<file>images/stock_signature_bad.png</file>
<file>images/stock_signature_ok.png</file>
<file>images/stock_signature_missing.png</file>
<file>images/stock_signature_unverified.png</file>
<file>images/anonymous_128_blue.png</file>
<file>images/browsable_128_green.png</file>
<file>images/browsable_128_blue.png</file>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -402,8 +402,32 @@ ChatPage::load()
if(invites[i].encrypted_radix64_string.empty())
{
QListWidgetItem *item = new QListWidgetItem;
item->setData(Qt::DisplayRole,tr("Private chat invite from ")+QString::fromStdString(detail.name)+" ("+QString::fromStdString(invites[i].destination_pgp_id)+", " + QString::fromStdString(detail.name) + ", valid until " + QDateTime::fromTime_t(invites[i].time_of_validity).toString() + ")") ;
item->setData(Qt::DisplayRole,tr("Private chat invite from ")+QString::fromUtf8(detail.name.c_str())) ;
QString tt ;
tt += tr("Name : ") + QString::fromStdString(detail.name) ;
tt += "\n" + QString("PGP id : ") + QString::fromStdString(invites[i].destination_pgp_id) ;
tt += "\n" + QString("Valid until : ") + QDateTime::fromTime_t(invites[i].time_of_validity).toString() ;
if(invites[i].invite_flags & RS_DISTANT_CHAT_FLAG_SIGNED)
if(invites[i].invite_flags & RS_DISTANT_CHAT_FLAG_SIGNATURE_OK)
{
tt += "\n"+tr("Authentified signature") ;
item->setIcon(QIcon(":images/stock_signature_ok.png")) ;
}
else
{
tt += "\n"+tr("Signed with key not in keyring") ;
item->setIcon(QIcon(":images/stock_signature_unverified.png")) ;
}
else
{
tt += "\n"+tr("Not signed.") ;
item->setIcon(QIcon(":images/stock_signature_missing.png")) ;
}
item->setData(Qt::UserRole,QString::fromStdString(invites[i].hash)) ;
item->setToolTip(tt) ;
ui._collected_contacts_LW->insertItem(0,item) ;
}