Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
liblinphone
Commits
674f47f6
Commit
674f47f6
authored
Jan 09, 2021
by
johan
Browse files
Lime stalling for failed decryption by peer must check the 488 recipient
+ do not let exception flow up from encryption engine
parent
9cd2df41
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
33 additions
and
9 deletions
+33
-9
src/chat/encryption/lime-x3dh-encryption-engine.cpp
src/chat/encryption/lime-x3dh-encryption-engine.cpp
+5
-1
src/chat/notification/imdn.cpp
src/chat/notification/imdn.cpp
+4
-1
tester/group_chat_secure_tester.c
tester/group_chat_secure_tester.c
+24
-7
No files found.
src/chat/encryption/lime-x3dh-encryption-engine.cpp
View file @
674f47f6
...
...
@@ -885,7 +885,11 @@ std::shared_ptr<LimeManager> LimeX3dhEncryptionEngine::getLimeManager () {
}
void
LimeX3dhEncryptionEngine
::
stale_session
(
const
std
::
string
localDeviceId
,
const
std
::
string
peerDeviceId
)
{
limeManager
->
stale_sessions
(
localDeviceId
,
peerDeviceId
);
try
{
limeManager
->
stale_sessions
(
localDeviceId
,
peerDeviceId
);
}
catch
(
const
BctbxException
&
e
)
{
lError
()
<<
"[LIME] fail to stale session between local ["
<<
localDeviceId
<<
"] and "
<<
" remote ["
<<
peerDeviceId
<<
"]. lime says: "
<<
e
.
what
();
}
}
lime
::
limeCallback
LimeX3dhEncryptionEngine
::
setLimeCallback
(
string
operation
)
{
...
...
src/chat/notification/imdn.cpp
View file @
674f47f6
...
...
@@ -212,7 +212,10 @@ void Imdn::parse (const shared_ptr<ChatMessage> &chatMessage) {
// When the IMDN status is failed for reason code 488 (Not acceptable here) and the chatroom is encrypted,
// something is wrong with our encryption session with this peer, stale the active session the next
// message (which can be a resend of this one) will be encrypted with a new session
if
(
status
.
getFailed
().
present
()
&&
status
.
getReason
().
present
()
&&
(
cr
->
getCapabilities
()
&
ChatRoom
::
Capabilities
::
Encrypted
))
{
if
(
cr
->
getLocalAddress
()
==
cm
->
getFromAddress
()
// check the imdn is in response to a message sent by the local user
&&
status
.
getFailed
().
present
()
// that we have a fail tag
&&
status
.
getReason
().
present
()
// and a reason tag
&&
(
cr
->
getCapabilities
()
&
ChatRoom
::
Capabilities
::
Encrypted
))
{
// and the chatroom is encrypted
// Check the reason code is 488
auto
reason
=
status
.
getReason
().
get
();
auto
imee
=
cm
->
getCore
()
->
getEncryptionEngine
();
...
...
tester/group_chat_secure_tester.c
View file @
674f47f6
...
...
@@ -3844,49 +3844,62 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message(v
static
void
group_chat_lime_x3dh_session_corrupted_curve
(
const
int
curveId
)
{
LinphoneCoreManager
*
marie
=
linphone_core_manager_create
(
"marie_lime_x3dh_rc"
);
LinphoneCoreManager
*
pauline
=
linphone_core_manager_create
(
"pauline_lime_x3dh_rc"
);
LinphoneCoreManager
*
laure
=
linphone_core_manager_create
(
"laure_lime_x3dh_rc"
);
bctbx_list_t
*
coresManagerList
=
NULL
;
bctbx_list_t
*
participantsAddresses
=
NULL
;
coresManagerList
=
bctbx_list_append
(
coresManagerList
,
marie
);
coresManagerList
=
bctbx_list_append
(
coresManagerList
,
pauline
);
coresManagerList
=
bctbx_list_append
(
coresManagerList
,
laure
);
set_lime_curve_list
(
curveId
,
coresManagerList
);
stats
initialMarieStats
=
marie
->
stat
;
stats
initialPaulineStats
=
pauline
->
stat
;
stats
initialLaureStats
=
laure
->
stat
;
bctbx_list_t
*
coresList
=
init_core_for_conference
(
coresManagerList
);
start_core_for_conference
(
coresManagerList
);
participantsAddresses
=
bctbx_list_append
(
participantsAddresses
,
linphone_address_new
(
linphone_core_get_identity
(
pauline
->
lc
)));
participantsAddresses
=
bctbx_list_append
(
participantsAddresses
,
linphone_address_new
(
linphone_core_get_identity
(
laure
->
lc
)));
// Enable IMDN
linphone_im_notif_policy_enable_all
(
linphone_core_get_im_notif_policy
(
marie
->
lc
));
linphone_im_notif_policy_enable_all
(
linphone_core_get_im_notif_policy
(
pauline
->
lc
));
linphone_im_notif_policy_enable_all
(
linphone_core_get_im_notif_policy
(
laure
->
lc
));
// Wait for lime user creation
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_X3dhUserCreationSuccess
,
initialMarieStats
.
number_of_X3dhUserCreationSuccess
+
1
,
x3dhServer_creationTimeout
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
pauline
->
stat
.
number_of_X3dhUserCreationSuccess
,
initialPaulineStats
.
number_of_X3dhUserCreationSuccess
+
1
,
x3dhServer_creationTimeout
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
laure
->
stat
.
number_of_X3dhUserCreationSuccess
,
initialLaureStats
.
number_of_X3dhUserCreationSuccess
+
1
,
x3dhServer_creationTimeout
));
// Marie creates a new group chat room
const
char
*
initialSubject
=
"Colleagues"
;
LinphoneChatRoom
*
marieCr
=
create_chat_room_client_side
(
coresList
,
marie
,
&
initialMarieStats
,
participantsAddresses
,
initialSubject
,
TRUE
);
const
LinphoneAddress
*
confAddr
=
linphone_chat_room_get_conference_address
(
marieCr
);
// Check that the chat room is correctly created on Pauline's side and that the participants are added
LinphoneChatRoom
*
paulineCr
=
check_creation_chat_room_client_side
(
coresList
,
pauline
,
&
initialPaulineStats
,
confAddr
,
initialSubject
,
1
,
FALSE
);
// Check that the chat room is correctly created on Pauline's and Laure's side and that the participants are added
LinphoneChatRoom
*
paulineCr
=
check_creation_chat_room_client_side
(
coresList
,
pauline
,
&
initialPaulineStats
,
confAddr
,
initialSubject
,
2
,
FALSE
);
LinphoneChatRoom
*
laureCr
=
check_creation_chat_room_client_side
(
coresList
,
laure
,
&
initialLaureStats
,
confAddr
,
initialSubject
,
2
,
FALSE
);
if
(
!
BC_ASSERT_PTR_NOT_NULL
(
marieCr
)
||
!
BC_ASSERT_PTR_NOT_NULL
(
paulineCr
))
if
(
!
BC_ASSERT_PTR_NOT_NULL
(
marieCr
)
||
!
BC_ASSERT_PTR_NOT_NULL
(
paulineCr
)
||
!
BC_ASSERT_PTR_NOT_NULL
(
laureCr
)
)
goto
end
;
// Marie send a message to Pauline
// Marie send a message to Pauline
and Laure
const
char
*
marieTextMessage
=
"Hello"
;
LinphoneChatMessage
*
marieMessage
=
_send_message
(
marieCr
,
marieTextMessage
);
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
pauline
->
stat
.
number_of_LinphoneMessageReceived
,
initialPaulineStats
.
number_of_LinphoneMessageReceived
+
1
,
10000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_LinphoneMessageSent
,
1
,
1000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
laure
->
stat
.
number_of_LinphoneMessageReceived
,
initialLaureStats
.
number_of_LinphoneMessageReceived
+
1
,
10000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_LinphoneMessageSent
,
1
,
5000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_LinphoneMessageDelivered
,
initialMarieStats
.
number_of_LinphoneMessageDelivered
+
1
,
10000
));
linphone_chat_message_unref
(
marieMessage
);
LinphoneChatMessage
*
paulineLastMsg
=
pauline
->
stat
.
last_received_chat_message
;
if
(
!
BC_ASSERT_PTR_NOT_NULL
(
paulineLastMsg
))
goto
end
;
LinphoneChatMessage
*
laureLastMsg
=
laure
->
stat
.
last_received_chat_message
;
if
(
!
BC_ASSERT_PTR_NOT_NULL
(
laureLastMsg
))
goto
end
;
BC_ASSERT_STRING_EQUAL
(
linphone_chat_message_get_utf8_text
(
paulineLastMsg
),
marieTextMessage
);
BC_ASSERT_STRING_EQUAL
(
linphone_chat_message_get_utf8_text
(
laureLastMsg
),
marieTextMessage
);
LinphoneAddress
*
marieAddr
=
linphone_address_new
(
linphone_core_get_identity
(
marie
->
lc
));
BC_ASSERT_TRUE
(
linphone_address_weak_equal
(
marieAddr
,
linphone_chat_message_get_from_address
(
paulineLastMsg
)));
BC_ASSERT_TRUE
(
linphone_address_weak_equal
(
marieAddr
,
linphone_chat_message_get_from_address
(
laureLastMsg
)));
linphone_address_unref
(
marieAddr
);
// Corrupt Pauline sessions in lime database: WARNING: if SOCI is not found, this call does nothing and the test fails
...
...
@@ -3901,16 +3914,18 @@ static void group_chat_lime_x3dh_session_corrupted_curve(const int curveId) {
// Marie send a new message, it shall fail and get a 488 response
marieMessage
=
_send_message
(
marieCr
,
marieTextMessage
);
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_LinphoneMessageSent
,
2
,
1
000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_LinphoneMessageSent
,
2
,
5
000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_LinphoneMessageNotDelivered
,
initialMarieStats
.
number_of_LinphoneMessageNotDelivered
+
1
,
10000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
laure
->
stat
.
number_of_LinphoneMessageReceived
,
initialLaureStats
.
number_of_LinphoneMessageReceived
+
2
,
10000
));
// the message is correctly received by Laure
BC_ASSERT_EQUAL
(
pauline
->
stat
.
number_of_LinphoneMessageReceived
,
1
,
int
,
"%d"
);
linphone_chat_message_unref
(
marieMessage
);
// Try again, it shall work this time
const
char
*
marieTextMessage2
=
"Hello again"
;
marieMessage
=
_send_message
(
marieCr
,
marieTextMessage2
);
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_LinphoneMessageSent
,
3
,
1
000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
marie
->
stat
.
number_of_LinphoneMessageSent
,
3
,
5
000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
pauline
->
stat
.
number_of_LinphoneMessageReceived
,
initialPaulineStats
.
number_of_LinphoneMessageReceived
+
2
,
10000
));
BC_ASSERT_TRUE
(
wait_for_list
(
coresList
,
&
laure
->
stat
.
number_of_LinphoneMessageReceived
,
initialLaureStats
.
number_of_LinphoneMessageReceived
+
3
,
10000
));
linphone_chat_message_unref
(
marieMessage
);
paulineLastMsg
=
pauline
->
stat
.
last_received_chat_message
;
if
(
!
BC_ASSERT_PTR_NOT_NULL
(
paulineLastMsg
))
...
...
@@ -3925,11 +3940,13 @@ static void group_chat_lime_x3dh_session_corrupted_curve(const int curveId) {
// Clean db from chat room
linphone_core_manager_delete_chat_room
(
marie
,
marieCr
,
coresList
);
linphone_core_manager_delete_chat_room
(
pauline
,
paulineCr
,
coresList
);
linphone_core_manager_delete_chat_room
(
laure
,
laureCr
,
coresList
);
bctbx_list_free
(
coresList
);
bctbx_list_free
(
coresManagerList
);
linphone_core_manager_destroy
(
marie
);
linphone_core_manager_destroy
(
pauline
);
linphone_core_manager_destroy
(
laure
);
}
static
void
group_chat_lime_x3dh_session_corrupted
(
void
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment