2013-08-13 17:23:47 -04:00
/*
2014-02-13 18:07:09 -05:00
* otrlibv3 . c
2019-11-13 06:11:05 -05:00
* vim : expandtab : ts = 4 : sts = 4 : sw = 4
2013-08-13 17:23:47 -04:00
*
2019-01-22 05:31:45 -05:00
* Copyright ( C ) 2012 - 2019 James Booth < boothj5 @ gmail . com >
2013-08-13 17:23:47 -04:00
*
* This file is part of Profanity .
*
* Profanity is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* Profanity is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2016-07-23 20:14:49 -04:00
* along with Profanity . If not , see < https : //www.gnu.org/licenses/>.
2013-08-13 17:23:47 -04:00
*
2014-08-24 15:57:39 -04:00
* In addition , as a special exception , the copyright holders give permission to
* link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file , and
* distribute linked combinations including the two .
*
* You must obey the GNU General Public License in all respects for all of the
* code used other than OpenSSL . If you modify file ( s ) with this exception , you
* may extend this exception to your version of the file ( s ) , but you are not
* obligated to do so . If you do not wish to do so , delete this exception
* statement from your version . If you delete this exception statement from all
* source files in the program , then also delete it here .
*
2013-08-13 17:23:47 -04:00
*/
# include <libotr/proto.h>
# include <libotr/privkey.h>
2013-08-17 13:45:51 -04:00
# include <libotr/message.h>
2013-08-13 17:23:47 -04:00
2014-04-26 19:32:04 -04:00
# include "otr/otr.h"
# include "otr/otrlib.h"
2016-07-24 10:43:51 -04:00
# include "ui/ui.h"
# include "ui/window_list.h"
2013-08-13 17:23:47 -04:00
2014-02-13 18:07:09 -05:00
OtrlPolicy
otrlib_policy ( void )
2013-08-17 13:45:51 -04:00
{
2014-02-10 18:20:06 -05:00
return OTRL_POLICY_ALLOW_V1 | OTRL_POLICY_ALLOW_V2 ;
2013-08-17 13:45:51 -04:00
}
2014-04-28 17:23:39 -04:00
void
otrlib_init_timer ( void )
{
}
void
otrlib_poll ( void )
{
}
2015-10-25 18:40:09 -04:00
char *
2014-02-18 17:31:27 -05:00
otrlib_start_query ( void )
{
2014-04-22 18:53:15 -04:00
return " ?OTR?v2? This user has requested an Off-the-Record private conversation. However, you do not have a plugin to support that. See http://otr.cypherpunks.ca/ for more information. " ;
2014-02-18 17:31:27 -05:00
}
2013-08-17 13:45:51 -04:00
static int
cb_display_otr_message ( void * opdata , const char * accountname ,
const char * protocol , const char * username , const char * msg )
{
2014-01-09 19:08:49 -05:00
cons_show_error ( " %s " , msg ) ;
2013-08-17 13:45:51 -04:00
return 0 ;
}
2013-08-13 17:23:47 -04:00
void
2014-02-13 18:07:09 -05:00
otrlib_init_ops ( OtrlMessageAppOps * ops )
2013-08-13 17:23:47 -04:00
{
2014-02-13 18:07:09 -05:00
ops - > display_otr_message = cb_display_otr_message ;
2013-08-13 17:23:47 -04:00
}
2013-08-14 17:27:44 -04:00
2015-10-25 18:40:09 -04:00
ConnContext *
otrlib_context_find ( OtrlUserState user_state , const char * const recipient , char * jid )
2013-08-14 17:27:44 -04:00
{
2014-02-13 18:07:09 -05:00
return otrl_context_find ( user_state , recipient , jid , " xmpp " , 0 , NULL , NULL , NULL ) ;
2014-01-11 10:48:22 -05:00
}
void
2015-10-25 18:40:09 -04:00
otrlib_end_session ( OtrlUserState user_state , const char * const recipient , char * jid , OtrlMessageAppOps * ops )
2014-01-11 14:10:00 -05:00
{
2014-01-11 15:02:35 -05:00
ConnContext * context = otrl_context_find ( user_state , recipient , jid , " xmpp " ,
0 , NULL , NULL , NULL ) ;
2015-05-04 17:55:04 -04:00
if ( context ) {
2014-02-13 18:07:09 -05:00
otrl_message_disconnect ( user_state , ops , NULL , jid , " xmpp " , recipient ) ;
2014-01-11 15:02:35 -05:00
}
2014-01-11 14:10:00 -05:00
}
2014-02-13 18:07:09 -05:00
gcry_error_t
2015-10-25 18:40:09 -04:00
otrlib_encrypt_message ( OtrlUserState user_state , OtrlMessageAppOps * ops , char * jid , const char * const to ,
const char * const message , char * * newmessage )
2013-08-17 13:45:51 -04:00
{
gcry_error_t err ;
err = otrl_message_sending (
user_state ,
2014-02-13 18:07:09 -05:00
ops ,
2013-08-17 13:45:51 -04:00
NULL ,
jid ,
" xmpp " ,
to ,
message ,
0 ,
2014-02-13 18:07:09 -05:00
newmessage ,
2013-08-17 13:45:51 -04:00
NULL ,
2014-01-09 19:08:49 -05:00
NULL ) ;
2014-02-13 18:07:09 -05:00
return err ;
2013-08-17 13:45:51 -04:00
}
2014-02-13 18:07:09 -05:00
int
2015-10-25 18:40:09 -04:00
otrlib_decrypt_message ( OtrlUserState user_state , OtrlMessageAppOps * ops , char * jid , const char * const from ,
const char * const message , char * * decrypted , OtrlTLV * * tlvs )
2014-01-09 19:08:49 -05:00
{
2014-02-13 18:07:09 -05:00
return otrl_message_receiving (
user_state ,
ops ,
NULL ,
jid ,
" xmpp " ,
from ,
message ,
decrypted ,
tlvs ,
NULL ,
NULL ) ;
2014-01-09 19:08:49 -05:00
}
2014-04-26 17:08:53 -04:00
void
2014-04-26 17:52:25 -04:00
otrlib_handle_tlvs ( OtrlUserState user_state , OtrlMessageAppOps * ops , ConnContext * context , OtrlTLV * tlvs , GHashTable * smp_initiators )
2014-04-26 17:08:53 -04:00
{
NextExpectedSMP nextMsg = context - > smstate - > nextExpected ;
OtrlTLV * tlv = otrl_tlv_find ( tlvs , OTRL_TLV_SMP1 ) ;
if ( tlv ) {
if ( nextMsg ! = OTRL_SMP_EXPECT1 ) {
otrl_message_abort_smp ( user_state , ops , NULL , context ) ;
} else {
2015-10-26 19:22:59 -04:00
ProfChatWin * chatwin = wins_get_chat ( context - > username ) ;
if ( chatwin ) {
2015-10-27 18:39:48 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_INIT , NULL ) ;
2015-10-26 19:22:59 -04:00
}
2014-04-26 17:52:25 -04:00
g_hash_table_insert ( smp_initiators , strdup ( context - > username ) , strdup ( context - > username ) ) ;
2014-04-26 17:08:53 -04:00
}
}
2014-04-30 18:59:40 -04:00
tlv = otrl_tlv_find ( tlvs , OTRL_TLV_SMP1Q ) ;
if ( tlv ) {
if ( nextMsg ! = OTRL_SMP_EXPECT1 ) {
otrl_message_abort_smp ( user_state , ops , NULL , context ) ;
} else {
2015-10-26 19:29:01 -04:00
ProfChatWin * chatwin = wins_get_chat ( context - > username ) ;
if ( chatwin ) {
char * question = ( char * ) tlv - > data ;
char * eoq = memchr ( question , ' \0 ' , tlv - > len ) ;
if ( eoq ) {
2015-10-27 18:25:02 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_INIT_Q , question ) ;
2015-10-26 19:29:01 -04:00
}
2014-04-30 18:59:40 -04:00
}
}
}
2014-04-26 17:08:53 -04:00
tlv = otrl_tlv_find ( tlvs , OTRL_TLV_SMP2 ) ;
if ( tlv ) {
if ( nextMsg ! = OTRL_SMP_EXPECT2 ) {
otrl_message_abort_smp ( user_state , ops , NULL , context ) ;
} else {
context - > smstate - > nextExpected = OTRL_SMP_EXPECT4 ;
}
}
tlv = otrl_tlv_find ( tlvs , OTRL_TLV_SMP3 ) ;
if ( tlv ) {
if ( nextMsg ! = OTRL_SMP_EXPECT3 ) {
otrl_message_abort_smp ( user_state , ops , NULL , context ) ;
} else {
context - > smstate - > nextExpected = OTRL_SMP_EXPECT1 ;
2015-10-26 20:19:22 -04:00
ProfChatWin * chatwin = wins_get_chat ( context - > username ) ;
if ( chatwin ) {
if ( context - > smstate - > received_question = = 0 ) {
if ( context - > active_fingerprint - > trust & & ( context - > active_fingerprint - > trust [ 0 ] ! = ' \0 ' ) ) {
2015-10-27 18:25:02 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_SUCCESS , NULL ) ;
2015-10-27 17:23:56 -04:00
chatwin_otr_trust ( chatwin ) ;
2015-10-26 20:19:22 -04:00
} else {
2015-10-27 18:25:02 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_SENDER_FAIL , NULL ) ;
2015-10-27 17:23:56 -04:00
chatwin_otr_untrust ( chatwin ) ;
2015-10-26 19:36:11 -04:00
}
2014-05-07 15:41:05 -04:00
} else {
2015-10-26 20:19:22 -04:00
if ( context - > smstate - > sm_prog_state = = OTRL_SMP_PROG_SUCCEEDED ) {
2015-10-27 18:25:02 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_SUCCESS_Q , NULL ) ;
2015-10-26 20:19:22 -04:00
} else {
2015-10-27 18:25:02 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_FAIL_Q , NULL ) ;
2015-10-26 20:19:22 -04:00
}
2014-04-30 18:59:40 -04:00
}
2014-04-26 17:52:25 -04:00
}
2014-04-26 17:08:53 -04:00
}
}
tlv = otrl_tlv_find ( tlvs , OTRL_TLV_SMP4 ) ;
if ( tlv ) {
if ( nextMsg ! = OTRL_SMP_EXPECT4 ) {
otrl_message_abort_smp ( user_state , ops , NULL , context ) ;
} else {
context - > smstate - > nextExpected = OTRL_SMP_EXPECT1 ;
2015-10-26 19:50:56 -04:00
ProfChatWin * chatwin = wins_get_chat ( context - > username ) ;
2015-10-26 20:19:22 -04:00
if ( chatwin ) {
if ( context - > active_fingerprint - > trust & & ( context - > active_fingerprint - > trust [ 0 ] ! = ' \0 ' ) ) {
2015-10-27 18:25:02 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_SUCCESS , NULL ) ;
2015-10-27 17:23:56 -04:00
chatwin_otr_trust ( chatwin ) ;
2015-10-26 20:19:22 -04:00
} else {
2015-10-27 18:25:02 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_RECEIVER_FAIL , NULL ) ;
2015-10-27 17:23:56 -04:00
chatwin_otr_untrust ( chatwin ) ;
2015-10-26 19:40:37 -04:00
}
2014-04-26 17:52:25 -04:00
}
2014-04-26 17:08:53 -04:00
}
}
tlv = otrl_tlv_find ( tlvs , OTRL_TLV_SMP_ABORT ) ;
if ( tlv ) {
context - > smstate - > nextExpected = OTRL_SMP_EXPECT1 ;
2015-10-26 19:45:39 -04:00
ProfChatWin * chatwin = wins_get_chat ( context - > username ) ;
if ( chatwin ) {
2015-10-27 18:25:02 -04:00
chatwin_otr_smp_event ( chatwin , PROF_OTR_SMP_ABORT , NULL ) ;
2015-10-27 17:23:56 -04:00
chatwin_otr_untrust ( chatwin ) ;
2015-10-26 19:45:39 -04:00
}
2014-04-26 19:32:04 -04:00
otr_untrust ( context - > username ) ;
2014-04-26 17:08:53 -04:00
}
2014-04-28 17:23:39 -04:00
}