mcabber/mcabber/otr.c
author franky
Sun, 12 May 2019 10:10:12 +0200
changeset 2336 0dc317b5599d
parent 2329 746d72c6e1b9
permissions -rw-r--r--
Remove support for libotr 3.x libotr 4.0.0 was released in 2012... There should be no distribution with a support lifecycle left that only packages libotr 3.x
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
     1
/*
1303
b6fdbfa6b219 Minor whitespace change
Mikael Berthe <mikael@lilotux.net>
parents: 1301
diff changeset
     2
 * otr.c        -- Off-The-Record Messaging for mcabber
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
     3
 *
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     4
 * Copyright (C) 2007-2009 Frank Zschockelt <mcabber_otr@freakysoft.de>
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
     5
 *
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
     9
 * your option) any later version.
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    10
 *
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    14
 * General Public License for more details.
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    15
 *
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
2268
f5402d705f67 Fix FSF addresses in all files
Mikael Berthe <mikael@lilotux.net>
parents: 2263
diff changeset
    17
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    18
 */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    19
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    20
#include <config.h>
1470
a8b924b5474c The OTR protocol expects (X)HTML messsages
Mikael Berthe <mikael@lilotux.net>
parents: 1420
diff changeset
    21
#include <glib.h>
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    22
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    23
#ifdef HAVE_LIBOTR
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    24
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
    25
#include "hbuf.h"
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    26
#include "logprint.h"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
    27
#include "nohtml.h"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
    28
#include "otr.h"
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    29
#include "roster.h"
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    30
#include "screen.h"
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    31
#include "settings.h"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
    32
#include "utils.h"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
    33
#include "xmpp.h"
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    34
1577
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
    35
#define OTR_PROTOCOL_NAME "jabber"
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    36
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    37
static OtrlUserState userstate = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
    38
static char *account = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
    39
static char *keyfile = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
    40
static char *fprfile = NULL;
2336
0dc317b5599d Remove support for libotr 3.x
franky
parents: 2329
diff changeset
    41
static char *tagfile = NULL;
0dc317b5599d Remove support for libotr 3.x
franky
parents: 2329
diff changeset
    42
static guint otr_timer_source = 0;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    43
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
    44
static int otr_is_enabled = FALSE;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    45
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    46
static OtrlPolicy cb_policy             (void *opdata, ConnContext *ctx);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    47
static void       cb_create_privkey     (void *opdata,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    48
                                         const char *accountname,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    49
                                         const char *protocol);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    50
static int        cb_is_logged_in       (void *opdata,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    51
                                         const char *accountname,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    52
                                         const char *protocol,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    53
                                         const char *recipient);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    54
static void       cb_inject_message     (void *opdata,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    55
                                         const char *accountname,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    56
                                         const char *protocol,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    57
                                         const char *recipient,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    58
                                         const char *message);
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    59
static void       cb_update_context_list(void *opdata);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    60
static void       cb_new_fingerprint    (void *opdata, OtrlUserState us,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    61
                                         const char *accountname,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    62
                                         const char *protocol,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    63
                                         const char *username,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    64
                                         unsigned char fingerprint[20]);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    65
static void       cb_write_fingerprints (void *opdata);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    66
static void       cb_gone_secure        (void *opdata, ConnContext *context);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    67
static void       cb_gone_insecure      (void *opdata, ConnContext *context);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    68
static void       cb_still_secure       (void *opdata, ConnContext *context,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    69
                                         int is_reply);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    70
static int        cb_max_message_size   (void *opdata, ConnContext *context);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    71
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    72
static void       cb_handle_smp_event   (void *opdata, OtrlSMPEvent event,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    73
                                         ConnContext *context, unsigned short percent,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    74
                                         char *question);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    75
static void       cb_handle_msg_event   (void *opdata, OtrlMessageEvent event,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    76
                                         ConnContext *context, const char *message,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    77
                                         gcry_error_t err);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    78
static void       cb_create_instag      (void *opdata, const char *accountname,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    79
                                         const char *protocol);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    80
static void       cb_timer_control      (void *opdata, unsigned int interval);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    81
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    82
static OtrlMessageAppOps ops =
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
    83
{
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    84
  cb_policy,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    85
  cb_create_privkey,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    86
  cb_is_logged_in,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    87
  cb_inject_message,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    88
  cb_update_context_list,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    89
  cb_new_fingerprint,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    90
  cb_write_fingerprints,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    91
  cb_gone_secure,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    92
  cb_gone_insecure,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    93
  cb_still_secure,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
    94
  cb_max_message_size,
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    95
  NULL, /* account_name */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    96
  NULL, /* account_name_free */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    97
  NULL, /* received_symkey */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    98
  NULL, /* otr_error_message */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
    99
  NULL, /* otr_error_message_free */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   100
  NULL, /* resent_msg_prefix */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   101
  NULL, /* resent_msg_prefix_free */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   102
  cb_handle_smp_event,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   103
  cb_handle_msg_event,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   104
  cb_create_instag,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   105
  NULL, /* convert_msg */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   106
  NULL, /* convert_free */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   107
  cb_timer_control,
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   108
};
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   109
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   110
static void otr_message_disconnect(ConnContext *ctx);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   111
static ConnContext *otr_get_context(const char *buddy);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   112
static void otr_startstop(const char *buddy, int start);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   113
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   114
static char *otr_get_dir(void);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   115
1420
08f641e91f94 Do not use "jid" as a variable name
Mikael Berthe <mikael@lilotux.net>
parents: 1347
diff changeset
   116
void otr_init(const char *fjid)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   117
{
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   118
  char *root;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   119
1729
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1668
diff changeset
   120
  if (userstate) // already initialised
1501
24ff212a1c54 Fixed a memleak in otr
franky@veqlargh.fs
parents: 1495
diff changeset
   121
    return;
24ff212a1c54 Fixed a memleak in otr
franky@veqlargh.fs
parents: 1495
diff changeset
   122
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   123
  otr_is_enabled = !!settings_opt_get_int("otr");
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   124
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   125
  if (!otr_is_enabled)
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   126
    return;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   127
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   128
  OTRL_INIT;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   129
1577
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
   130
  userstate = otrl_userstate_create();
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   131
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   132
  root = otr_get_dir();
1420
08f641e91f94 Do not use "jid" as a variable name
Mikael Berthe <mikael@lilotux.net>
parents: 1347
diff changeset
   133
  account = jidtodisp(fjid);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   134
  keyfile = g_strdup_printf("%s%s.key", root, account);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   135
  fprfile = g_strdup_printf("%s%s.fpr", root, account);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   136
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   137
  if (otrl_privkey_read(userstate, keyfile)){
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   138
    scr_LogPrint(LPRINT_LOGNORM, "Could not read OTR key from %s", keyfile);
1577
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
   139
    cb_create_privkey(NULL, account, OTR_PROTOCOL_NAME);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   140
  }
2336
0dc317b5599d Remove support for libotr 3.x
franky
parents: 2329
diff changeset
   141
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   142
  if (otrl_privkey_read_fingerprints(userstate, fprfile, NULL, NULL)){
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   143
    scr_LogPrint(LPRINT_LOGNORM, "Could not read OTR fingerprints from %s",
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   144
                 fprfile);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   145
  }
2336
0dc317b5599d Remove support for libotr 3.x
franky
parents: 2329
diff changeset
   146
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   147
  tagfile = g_strdup_printf("%s%s.tag", root, account);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   148
  if (otrl_instag_read(userstate, tagfile)) {
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   149
    scr_LogPrint(LPRINT_LOGNORM, "Could not read OTR instance tag from %s", tagfile);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   150
    cb_create_instag(NULL, account, OTR_PROTOCOL_NAME);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   151
  }
2336
0dc317b5599d Remove support for libotr 3.x
franky
parents: 2329
diff changeset
   152
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   153
  g_free(root);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   154
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   155
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   156
void otr_terminate(void)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   157
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   158
  ConnContext *ctx;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   159
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   160
  if (!otr_is_enabled)
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   161
    return;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   162
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   163
  if (otr_timer_source > 0) {
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   164
    g_source_remove (otr_timer_source);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   165
    otr_timer_source = 0;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   166
  }
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   167
1320
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   168
  for (ctx = userstate->context_root; ctx; ctx = ctx->next)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   169
    if (ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   170
      otr_message_disconnect(ctx);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   171
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   172
  g_free(account);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   173
  account = NULL;
1307
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   174
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   175
  /* XXX This #ifdef is a quick workaround: when mcabber
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   176
   * is linked to both gnutls and libotr, libgcrypt will
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   177
   * segfault when we call otrl_userstate_free().
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   178
   * This is reported to be a bug in libgcrypt :-/
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   179
   * Mikael
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   180
   */
1729
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1668
diff changeset
   181
#if defined(HAVE_GNUTLS) && !defined(HAVE_OPENSSL) // TODO: broken now
1307
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   182
  if (!settings_opt_get_int("ssl"))
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   183
#endif
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   184
  otrl_userstate_free(userstate);
1307
6c116207ab2e Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1306
diff changeset
   185
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   186
  userstate = NULL;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   187
  g_free(keyfile);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   188
  keyfile = NULL;
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   189
  g_free(fprfile);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   190
  fprfile = NULL;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   191
  g_free(tagfile);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   192
  tagfile = NULL;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   193
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   194
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   195
static char *otr_get_dir(void)
1320
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   196
{
1346
e36b21e11760 Remove useless casts
Mikael Berthe <mikael@lilotux.net>
parents: 1343
diff changeset
   197
  const char *configured_dir = settings_opt_get("otr_dir");
1320
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   198
1335
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   199
  if (configured_dir && *configured_dir) {
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   200
    char *xp_conf_dir;
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   201
    int l;
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   202
    xp_conf_dir = expand_filename(configured_dir);
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   203
    // The path must be slash-terminated
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   204
    l = strlen(xp_conf_dir);
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   205
    if (xp_conf_dir[l-1] != '/') {
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   206
      char *xp_conf_dir_tmp = xp_conf_dir;
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   207
      xp_conf_dir = g_strdup_printf("%s/", xp_conf_dir_tmp);
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   208
      g_free(xp_conf_dir_tmp);
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   209
    }
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   210
    return xp_conf_dir;
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   211
  } else {
1320
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   212
    return expand_filename("~/.mcabber/otr/");
1335
ab1b7f7a682e Make sure the otr_dir is always slash-terminated
Mikael Berthe <mikael@lilotux.net>
parents: 1320
diff changeset
   213
  }
1320
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   214
}
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   215
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   216
static ConnContext *otr_get_context(const char *buddy)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   217
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   218
  int null = 0;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   219
  ConnContext *ctx;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   220
  char *lowcasebuddy = g_strdup(buddy);
1495
6f5754f86fbb Fix JID case issue with OTR, v2 (franky)
Mikael Berthe <mikael@lilotux.net>
parents: 1470
diff changeset
   221
6f5754f86fbb Fix JID case issue with OTR, v2 (franky)
Mikael Berthe <mikael@lilotux.net>
parents: 1470
diff changeset
   222
  mc_strtolower(lowcasebuddy);
1577
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
   223
  ctx = otrl_context_find(userstate, lowcasebuddy, account, OTR_PROTOCOL_NAME,
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   224
                          // INSTAG XXX
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   225
                          OTRL_INSTAG_BEST, 1, &null, NULL, NULL);
1495
6f5754f86fbb Fix JID case issue with OTR, v2 (franky)
Mikael Berthe <mikael@lilotux.net>
parents: 1470
diff changeset
   226
  g_free(lowcasebuddy);
6f5754f86fbb Fix JID case issue with OTR, v2 (franky)
Mikael Berthe <mikael@lilotux.net>
parents: 1470
diff changeset
   227
  return ctx;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   228
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   229
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   230
static void otr_message_disconnect(ConnContext *ctx)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   231
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   232
  if (ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   233
    cb_gone_insecure(NULL, ctx);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   234
  otrl_message_disconnect(userstate, &ops, NULL, ctx->accountname,
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   235
                          // INSTAG XXX
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   236
                          ctx->protocol, ctx->username, OTRL_INSTAG_BEST);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   237
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   238
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   239
static void otr_startstop(const char *buddy, int start)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   240
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   241
  char *msg = NULL;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   242
  ConnContext *ctx = otr_get_context(buddy);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   243
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   244
  if (!userstate || !ctx)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   245
    return;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   246
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   247
  if (start && ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   248
    otr_message_disconnect(ctx);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   249
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   250
  if (start) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   251
    OtrlPolicy policy = cb_policy(NULL, ctx);
1308
b17754d9221b Show a warning for /otr start|stop, if policy == plain
franky@veqlargh.fs
parents: 1307
diff changeset
   252
    if (policy == plain) {
b17754d9221b Show a warning for /otr start|stop, if policy == plain
franky@veqlargh.fs
parents: 1307
diff changeset
   253
      scr_LogPrint(LPRINT_LOGNORM, "The OTR policy for this user is set to"
b17754d9221b Show a warning for /otr start|stop, if policy == plain
franky@veqlargh.fs
parents: 1307
diff changeset
   254
      " plain. You have to change it first.");
b17754d9221b Show a warning for /otr start|stop, if policy == plain
franky@veqlargh.fs
parents: 1307
diff changeset
   255
      return;
b17754d9221b Show a warning for /otr start|stop, if policy == plain
franky@veqlargh.fs
parents: 1307
diff changeset
   256
    }
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   257
    msg = otrl_proto_default_query_msg(ctx->accountname, policy);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   258
    cb_inject_message(NULL, ctx->accountname, ctx->protocol, ctx->username,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   259
                      msg);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   260
    free (msg);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   261
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   262
  else
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   263
    otr_message_disconnect(ctx);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   264
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   265
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   266
void otr_establish(const char *buddy)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   267
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   268
  otr_startstop(buddy, 1);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   269
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   270
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   271
void otr_disconnect(const char *buddy)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   272
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   273
  otr_startstop(buddy, 0);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   274
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   275
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   276
void otr_fingerprint(const char *buddy, const char *trust)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   277
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   278
  char fpr[45], *tr;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   279
  ConnContext *ctx = otr_get_context(buddy);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   280
  if (!userstate || !ctx)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   281
    return;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   282
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   283
  if (!ctx->active_fingerprint || !ctx->active_fingerprint->fingerprint) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   284
    scr_LogPrint(LPRINT_LOGNORM,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   285
                 "No active fingerprint - start OTR for this buddy first.");
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   286
    return;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   287
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   288
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   289
  otrl_privkey_hash_to_human(fpr, ctx->active_fingerprint->fingerprint);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   290
  if (trust) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   291
    if (strcmp(fpr, trust) == 0)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   292
      otrl_context_set_trust(ctx->active_fingerprint, "trust");
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   293
    else
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   294
      otrl_context_set_trust(ctx->active_fingerprint, NULL);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   295
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   296
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   297
  tr = ctx->active_fingerprint->trust;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   298
  scr_LogPrint(LPRINT_LOGNORM, "%s [%44s]: %s", ctx->username, fpr,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   299
               tr && *tr ?  "trusted" : "untrusted");
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   300
  cb_write_fingerprints(NULL);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   301
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   302
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   303
static void cb_handle_smp_event(void *opdata, OtrlSMPEvent event,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   304
                                ConnContext *context, unsigned short percent,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   305
                                char *question)
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   306
{
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   307
  const char *msg = NULL;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   308
  char *freeme = NULL;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   309
  switch (event) {
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   310
    case OTRL_SMPEVENT_ASK_FOR_SECRET:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   311
      msg = freeme = g_strdup_printf("OTR: Socialist Millionaires' Protocol: "
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   312
                                     "Received SMP Initiation.\n"
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   313
                                     "Answer with /otr smpr %s $secret",
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   314
                                     context->username);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   315
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   316
    case OTRL_SMPEVENT_ASK_FOR_ANSWER:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   317
      msg = freeme = g_strdup_printf("OTR: Socialist Millionaires' Protocol: "
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   318
                                     "Received SMP Initiation.\n"
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   319
                                     "Answer with /otr smpr %s $secret\n"
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   320
                                     "Question: %s", context->username,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   321
                                     question);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   322
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   323
    case OTRL_SMPEVENT_CHEATED:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   324
      msg = "OTR: Socialist Millionaires' Protocol: Correspondent cancelled negotiation!";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   325
      otrl_message_abort_smp(userstate, &ops, opdata, context);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   326
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   327
    case OTRL_SMPEVENT_IN_PROGRESS:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   328
      scr_log_print(LPRINT_DEBUG, "OTR: Socialist Millionaires' Protocol: "
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   329
                                  "Negotiation is in pogress...");
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   330
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   331
    case OTRL_SMPEVENT_SUCCESS:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   332
      msg = "OTR: Socialist Millionaires' Protocol: Success!";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   333
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   334
    case OTRL_SMPEVENT_FAILURE:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   335
      msg = "OTR: Socialist Millionaires' Protocol: Failure.";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   336
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   337
    case OTRL_SMPEVENT_ABORT:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   338
      msg = "OTR: Socialist Millionaires' Protocol: Aborted.";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   339
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   340
    case OTRL_SMPEVENT_ERROR:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   341
      msg = "OTR: Socialist Millionaires' Protocol: Error occured, aborting negotiations!";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   342
      otrl_message_abort_smp(userstate, &ops, opdata, context);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   343
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   344
    default:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   345
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   346
  }
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   347
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   348
  if (msg) {
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   349
    scr_WriteIncomingMessage(context->username, msg, 0, HBB_PREFIX_INFO, 0);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   350
    g_free(freeme);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   351
  }
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   352
}
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   353
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   354
static void cb_handle_msg_event(void *opdata, OtrlMessageEvent event,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   355
                                ConnContext *context, const char *message,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   356
                                gcry_error_t err)
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   357
{
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   358
  const char *msg = NULL;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   359
  char *freeme = NULL;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   360
  switch (event) {
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   361
    case OTRL_MSGEVENT_ENCRYPTION_REQUIRED:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   362
      msg = "OTR: Policy requires encryption on message!";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   363
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   364
    case OTRL_MSGEVENT_ENCRYPTION_ERROR:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   365
      msg = "OTR: Encryption error! Message not sent.";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   366
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   367
    case OTRL_MSGEVENT_CONNECTION_ENDED:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   368
      msg = "OTR: Connection closed by remote end, message lost. "
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   369
            "Close or refresh connection.";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   370
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   371
    case OTRL_MSGEVENT_SETUP_ERROR:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   372
      // FIXME
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   373
      msg = freeme = g_strdup_printf("OTR: Error setting up private conversation: %u",
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   374
                                     err);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   375
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   376
    case OTRL_MSGEVENT_MSG_REFLECTED:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   377
      msg = "OTR: Received own OTR message!";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   378
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   379
    case OTRL_MSGEVENT_MSG_RESENT:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   380
      msg = "OTR: Previous message was resent.";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   381
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   382
    case OTRL_MSGEVENT_RCVDMSG_NOT_IN_PRIVATE:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   383
      msg = "OTR: Received encrypted message, but connection is not established " \
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   384
            "yet! Message lost.";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   385
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   386
    case OTRL_MSGEVENT_RCVDMSG_UNREADABLE:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   387
      msg = "OTR: Unable to read incoming message!";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   388
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   389
    case OTRL_MSGEVENT_RCVDMSG_MALFORMED:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   390
      msg = "OTR: Malformed incoming message!";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   391
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   392
    case OTRL_MSGEVENT_LOG_HEARTBEAT_RCVD:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   393
      scr_log_print(LPRINT_DEBUG, "OTR: Received heartbeat.");
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   394
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   395
    case OTRL_MSGEVENT_LOG_HEARTBEAT_SENT:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   396
      scr_log_print(LPRINT_DEBUG, "OTR: Sent heartbeat.");
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   397
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   398
    case OTRL_MSGEVENT_RCVDMSG_GENERAL_ERR:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   399
      msg = freeme = g_strdup_printf("OTR: Received general otr error: %s",
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   400
                                     message);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   401
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   402
    case OTRL_MSGEVENT_RCVDMSG_UNENCRYPTED:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   403
      msg = freeme = g_strdup_printf("OTR: Received unencrypted message: %s",
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   404
                                     message);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   405
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   406
    case OTRL_MSGEVENT_RCVDMSG_UNRECOGNIZED:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   407
      msg = "OTR: Unable to determine type of received OTR message!";
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   408
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   409
    case OTRL_MSGEVENT_RCVDMSG_FOR_OTHER_INSTANCE:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   410
      // XXX
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   411
      scr_log_print(LPRINT_DEBUG, "OTR: Received message for other instance.");
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   412
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   413
    default:
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   414
      break;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   415
  }
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   416
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   417
  if (msg) {
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   418
    scr_WriteIncomingMessage(context->username, msg, 0, HBB_PREFIX_INFO, 0);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   419
    g_free(freeme);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   420
  }
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   421
}
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   422
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   423
2218
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   424
/*  otr_receive
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   425
 * Returns whether a otr_message was received.
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   426
 * Sets *otr_data to NULL, when it was an internal otr message.
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   427
 */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   428
int otr_receive(char **otr_data, const char *buddy, int *free_msg)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   429
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   430
  int ignore_message;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   431
  char *newmessage = NULL;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   432
  OtrlTLV *tlvs = NULL;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   433
  OtrlTLV *tlv = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   434
  ConnContext *ctx;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   435
1577
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
   436
  ctx = otr_get_context(buddy);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   437
  *free_msg = 0;
2329
746d72c6e1b9 Fix otr disconnected message for otrv4
franky
parents: 2268
diff changeset
   438
746d72c6e1b9 Fix otr disconnected message for otrv4
franky
parents: 2268
diff changeset
   439
  if (!ctx)
746d72c6e1b9 Fix otr disconnected message for otrv4
franky
parents: 2268
diff changeset
   440
    return 0;
746d72c6e1b9 Fix otr disconnected message for otrv4
franky
parents: 2268
diff changeset
   441
1577
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
   442
  ignore_message = otrl_message_receiving(userstate, &ops, NULL,
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
   443
                                          ctx->accountname, ctx->protocol,
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
   444
                                          ctx->username, *otr_data,
2329
746d72c6e1b9 Fix otr disconnected message for otrv4
franky
parents: 2268
diff changeset
   445
                                          &newmessage, &tlvs, NULL, NULL, NULL);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   446
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   447
  tlv = otrl_tlv_find(tlvs, OTRL_TLV_DISCONNECTED);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   448
  if (tlv) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   449
    /* Notify the user that the other side disconnected. */
2329
746d72c6e1b9 Fix otr disconnected message for otrv4
franky
parents: 2268
diff changeset
   450
    cb_gone_insecure(NULL, ctx);
746d72c6e1b9 Fix otr disconnected message for otrv4
franky
parents: 2268
diff changeset
   451
    otr_disconnect(ctx->username);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   452
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   453
2329
746d72c6e1b9 Fix otr disconnected message for otrv4
franky
parents: 2268
diff changeset
   454
  otrl_tlv_free(tlvs);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   455
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   456
  if (ignore_message)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   457
    *otr_data = NULL;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   458
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   459
  if (!ignore_message && newmessage) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   460
    *free_msg = 1;
1470
a8b924b5474c The OTR protocol expects (X)HTML messsages
Mikael Berthe <mikael@lilotux.net>
parents: 1420
diff changeset
   461
    *otr_data = html_strip(newmessage);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   462
    otrl_message_free(newmessage);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   463
    if (ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   464
      return 1;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   465
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   466
  return 0;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   467
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   468
2218
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   469
/*  otr_send
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   470
 * Returns a newly allocated string, or NULL if no message should be sent.
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   471
 * Sets *encryption_status to 1 if "the otr context is encrypted or otr tries
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   472
 * to establish a session before the message is sent".
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   473
 * (If the session isn't established, but the user choose "otr required", then
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   474
 * the string just contains the "initiate session" message, not the message of
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   475
 * the user.)
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   476
 */
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   477
char *otr_send(const char *msg, const char *buddy, int *encryption_status)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   478
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   479
  gcry_error_t err;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   480
  char *newmessage = NULL;
2251
f3bd1564fa70 Stop html-escaping otr messages and do only strip known tags.
franky
parents: 2219
diff changeset
   481
  char *rmsg;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   482
  ConnContext *ctx = otr_get_context(buddy);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   483
2219
3958793d0d03 otr_send: Fix my previous fix and abort if the initial message is empty
Mikael Berthe <mikael@lilotux.net>
parents: 2218
diff changeset
   484
  if (!encryption_status)
3958793d0d03 otr_send: Fix my previous fix and abort if the initial message is empty
Mikael Berthe <mikael@lilotux.net>
parents: 2218
diff changeset
   485
    return NULL;
3958793d0d03 otr_send: Fix my previous fix and abort if the initial message is empty
Mikael Berthe <mikael@lilotux.net>
parents: 2218
diff changeset
   486
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   487
  *encryption_status = 0;
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   488
2219
3958793d0d03 otr_send: Fix my previous fix and abort if the initial message is empty
Mikael Berthe <mikael@lilotux.net>
parents: 2218
diff changeset
   489
  if (!buddy || !msg || !msg[0])
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   490
    return NULL;
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   491
1580
c8be6c2243d6 Only html escape messages when otr session is established
franky
parents: 1577
diff changeset
   492
  if (ctx->msgstate == OTRL_MSGSTATE_PLAINTEXT)
c8be6c2243d6 Only html escape messages when otr session is established
franky
parents: 1577
diff changeset
   493
    err = otrl_message_sending(userstate, &ops, NULL, ctx->accountname,
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   494
                               // INSTAG XXX
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   495
                               ctx->protocol, ctx->username, OTRL_INSTAG_BEST,
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   496
                               msg, NULL, &newmessage, OTRL_FRAGMENT_SEND_SKIP,
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   497
                               NULL, NULL, NULL);
1580
c8be6c2243d6 Only html escape messages when otr session is established
franky
parents: 1577
diff changeset
   498
  else {
c8be6c2243d6 Only html escape messages when otr session is established
franky
parents: 1577
diff changeset
   499
    err = otrl_message_sending(userstate, &ops, NULL, ctx->accountname,
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   500
                               // INSTAG XXX
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   501
                               ctx->protocol, ctx->username, OTRL_INSTAG_BEST,
2251
f3bd1564fa70 Stop html-escaping otr messages and do only strip known tags.
franky
parents: 2219
diff changeset
   502
                               msg, NULL, &newmessage, OTRL_FRAGMENT_SEND_SKIP,
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   503
                               NULL, NULL, NULL);
1580
c8be6c2243d6 Only html escape messages when otr session is established
franky
parents: 1577
diff changeset
   504
  }
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   505
2215
ba1a770dd632 Fix changeset 0c78d31c753d
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
   506
  if (err)
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   507
    return NULL; /* something went wrong, don't send the plain-message! */
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   508
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   509
  if (cb_policy(NULL, ctx) & OTRL_POLICY_REQUIRE_ENCRYPTION ||
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   510
      ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED)
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   511
    *encryption_status = 1;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   512
2215
ba1a770dd632 Fix changeset 0c78d31c753d
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
   513
  if (!newmessage) {
ba1a770dd632 Fix changeset 0c78d31c753d
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
   514
    if (*encryption_status == 1)
2218
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   515
      return NULL;  /* This message should have been encrypted */
2215
ba1a770dd632 Fix changeset 0c78d31c753d
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
   516
2218
b56be18d5a04 Update OTR comments
Mikael Berthe <mikael@lilotux.net>
parents: 2217
diff changeset
   517
    /* If not, the encryption was not required - send the original message */
2215
ba1a770dd632 Fix changeset 0c78d31c753d
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
   518
    return g_strdup(msg);
ba1a770dd632 Fix changeset 0c78d31c753d
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
   519
  }
ba1a770dd632 Fix changeset 0c78d31c753d
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
   520
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   521
  /* Check the new message is not empty */
2219
3958793d0d03 otr_send: Fix my previous fix and abort if the initial message is empty
Mikael Berthe <mikael@lilotux.net>
parents: 2218
diff changeset
   522
  if (newmessage[0]) {
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   523
    rmsg = g_strdup(newmessage);
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   524
  } else {
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   525
    rmsg = NULL;
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   526
    *encryption_status = 0;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   527
  }
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   528
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   529
  otrl_message_free(newmessage);
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2076
diff changeset
   530
  return rmsg;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   531
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   532
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   533
/* Prints OTR connection state */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   534
void otr_print_info(const char *buddy)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   535
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   536
  const char *state, *auth, *policy;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   537
  ConnContext *ctx = otr_get_context(buddy);
1577
e1a642472f4e Use otr context where possible, saves one mc_strtolower() per received message
franky
parents: 1501
diff changeset
   538
  OtrlPolicy p = cb_policy(ctx->app_data, ctx);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   539
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   540
  if (!userstate || !ctx)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   541
    return;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   542
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   543
  switch (ctx->msgstate) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   544
    case OTRL_MSGSTATE_PLAINTEXT: state = "plaintext"; break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   545
    case OTRL_MSGSTATE_ENCRYPTED:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   546
     switch (ctx->protocol_version) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   547
       case 1: state = "encrypted V1"; break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   548
       case 2: state = "encrypted V2"; break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   549
       default:state = "encrypted";
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   550
     };
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   551
     break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   552
    case OTRL_MSGSTATE_FINISHED:  state = "finished";  break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   553
    default:                      state = "unknown state";
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   554
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   555
  switch (ctx->auth.authstate) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   556
    case OTRL_AUTHSTATE_NONE:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   557
      switch (ctx->otr_offer) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   558
        case OFFER_NOT:      auth = "no offer sent";  break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   559
        case OFFER_SENT:     auth = "offer sent";     break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   560
        case OFFER_ACCEPTED: auth = "offer accepted"; break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   561
        case OFFER_REJECTED: auth = "offer rejected"; break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   562
        default:             auth = "unknown auth";
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   563
      }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   564
      break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   565
    case OTRL_AUTHSTATE_AWAITING_DHKEY:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   566
      auth = "awaiting D-H key";          break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   567
    case OTRL_AUTHSTATE_AWAITING_REVEALSIG:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   568
      auth = "awaiting reveal signature"; break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   569
    case OTRL_AUTHSTATE_AWAITING_SIG:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   570
      auth = "awaiting signature";        break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   571
    case OTRL_AUTHSTATE_V1_SETUP:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   572
      auth = "v1 setup";                  break;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   573
    default:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   574
      auth = "unknown auth";
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   575
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   576
  if (p == OTRL_POLICY_NEVER)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   577
    policy = "plain";
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   578
  else if (p == (OTRL_POLICY_OPPORTUNISTIC & ~OTRL_POLICY_ALLOW_V1))
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   579
    policy = "opportunistic";
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   580
  else if (p == (OTRL_POLICY_MANUAL & ~OTRL_POLICY_ALLOW_V1))
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   581
    policy = "manual";
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   582
  else if (p == (OTRL_POLICY_ALWAYS & ~OTRL_POLICY_ALLOW_V1))
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   583
    policy = "always";
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   584
  else
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   585
    policy = "unknown";
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   586
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   587
  scr_LogPrint(LPRINT_LOGNORM, "%s: %s (%s) [%s]",
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   588
               ctx->username, state, auth, policy);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   589
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   590
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   591
static ConnContext *otr_context_encrypted(const char *buddy)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   592
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   593
  ConnContext *ctx = otr_get_context(buddy);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   594
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   595
  if (!userstate || !ctx  || ctx->msgstate != OTRL_MSGSTATE_ENCRYPTED){
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   596
    scr_LogPrint(LPRINT_LOGNORM,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   597
                 "You have to start an OTR channel with %s before you can "
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   598
                 "use SMP.", buddy);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   599
    return NULL;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   600
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   601
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   602
  return ctx;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   603
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   604
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   605
void otr_smp_query(const char *buddy, const char *secret)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   606
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   607
  ConnContext *ctx = otr_context_encrypted(buddy);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   608
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   609
  if (!secret) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   610
    scr_LogPrint(LPRINT_LOGNORM,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   611
                 "Using SMP without a secret isn't a good idea.");
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   612
    return;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   613
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   614
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   615
  if (ctx) {
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   616
    otrl_message_initiate_smp(userstate, &ops, NULL, ctx,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   617
                              (const unsigned char *)secret,
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   618
                              strlen(secret));
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   619
    scr_WriteIncomingMessage(ctx->username,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   620
                             "OTR: Socialist Millionaires' Protocol "
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   621
                             "initiated.", 0, HBB_PREFIX_INFO, 0);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   622
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   623
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   624
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   625
void otr_smp_respond(const char *buddy, const char *secret)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   626
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   627
  ConnContext *ctx = otr_context_encrypted(buddy);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   628
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   629
  if (!secret) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   630
    scr_LogPrint(LPRINT_LOGNORM,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   631
                 "Using SMP without a secret isn't a good idea.");
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   632
    return;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   633
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   634
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   635
  if (ctx) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   636
    if (!ctx->smstate->secret) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   637
      scr_LogPrint(LPRINT_LOGNORM,
1584
18069a9dca4a Fix typo in OTR messages (Anne)
Mikael Berthe <mikael@lilotux.net>
parents: 1580
diff changeset
   638
                   "Don't call smpr until you have received an SMP "
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   639
                   "Initiation!");
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   640
      return;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   641
    }
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   642
    otrl_message_respond_smp(userstate, &ops, NULL, ctx,
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   643
                             (const unsigned char *)secret,
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   644
                             strlen(secret));
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   645
    scr_WriteIncomingMessage(ctx->username,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   646
                             "OTR: Socialist Millionaires' Protocol: "
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   647
                             "response sent", 0, HBB_PREFIX_INFO, 0);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   648
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   649
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   650
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   651
void otr_smp_abort(const char *buddy)
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   652
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   653
  ConnContext *ctx = otr_context_encrypted(buddy);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   654
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   655
  if (ctx) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   656
    otrl_message_abort_smp(userstate, &ops, NULL, ctx);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   657
    scr_WriteIncomingMessage(ctx->username,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   658
                             "OTR: Socialist Millionaires' Protocol aborted.",
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   659
                             0, HBB_PREFIX_INFO, 0);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   660
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   661
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   662
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   663
void otr_key(void)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   664
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   665
  OtrlPrivKey *key;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   666
  char readable[45] = "";
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   667
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   668
  if(!userstate)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   669
    return;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   670
  for (key = userstate->privkey_root; key; key = key->next) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   671
    otrl_privkey_fingerprint(userstate, readable, key->accountname,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   672
                             key->protocol);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   673
    scr_LogPrint(LPRINT_LOGNORM, "%s: %s", key->accountname, readable);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   674
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   675
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   676
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   677
/* Return the OTR policy for the given context. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   678
static OtrlPolicy cb_policy(void *opdata, ConnContext *ctx)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   679
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   680
  enum otr_policy p = settings_otr_getpolicy(NULL);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   681
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   682
  if(ctx)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   683
    if(settings_otr_getpolicy(ctx->username))
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   684
      p = settings_otr_getpolicy(ctx->username);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   685
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   686
  switch (p) {
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   687
    case plain:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   688
      return OTRL_POLICY_NEVER;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   689
    case opportunistic:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   690
      return OTRL_POLICY_OPPORTUNISTIC & ~OTRL_POLICY_ALLOW_V1;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   691
    case manual:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   692
      return OTRL_POLICY_MANUAL & ~OTRL_POLICY_ALLOW_V1;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   693
    case always:
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   694
      return OTRL_POLICY_ALWAYS & ~OTRL_POLICY_ALLOW_V1;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   695
  }
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   696
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   697
  return OTRL_POLICY_MANUAL & ~OTRL_POLICY_ALLOW_V1;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   698
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   699
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   700
/* Create a private key for the given accountname/protocol if
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   701
 * desired. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   702
static void cb_create_privkey(void *opdata, const char *accountname,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   703
                              const char *protocol)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   704
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   705
  gcry_error_t e;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1584
diff changeset
   706
  char *root;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   707
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   708
  scr_LogPrint(LPRINT_LOGNORM,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   709
               "Generating new OTR key for %s. This may take a while...",
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   710
               accountname);
1780
e4378fbab5d7 Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
   711
  scr_do_update();
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   712
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   713
  e = otrl_privkey_generate(userstate, keyfile, accountname, protocol);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   714
1320
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   715
  if (e) {
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   716
    root = otr_get_dir();
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   717
    scr_LogPrint(LPRINT_LOGNORM, "OTR key generation failed! Please mkdir "
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   718
                 "%s if you want to use otr encryption.", root);
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   719
    g_free(root);
cb400799db8f Configurable OTR directory
franky@veqlargh.fs
parents: 1308
diff changeset
   720
  }
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   721
  else
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   722
    scr_LogPrint(LPRINT_LOGNORM, "OTR key generated.");
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   723
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   724
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   725
/* Report whether you think the given user is online.  Return 1 if
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   726
 * you think he is, 0 if you think he isn't, -1 if you're not sure.
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   727
 * If you return 1, messages such as heartbeats or other
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   728
 * notifications may be sent to the user, which could result in "not
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   729
 * logged in" errors if you're wrong. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   730
static int cb_is_logged_in(void *opdata, const char *accountname,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   731
                           const char *protocol, const char *recipient)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   732
{
1346
e36b21e11760 Remove useless casts
Mikael Berthe <mikael@lilotux.net>
parents: 1343
diff changeset
   733
  int ret = (roster_getstatus(recipient, NULL) != offline);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   734
  return ret;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   735
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   736
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   737
/* Send the given IM to the given recipient from the given
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   738
 * accountname/protocol. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   739
static void cb_inject_message(void *opdata, const char *accountname,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   740
                              const char *protocol, const char *recipient,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   741
                              const char *message)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   742
{
1343
8a05feb23c5a Only use OTR encryption on other users
franky@veqlargh.fs
parents: 1335
diff changeset
   743
  if (roster_gettype(recipient) == ROSTER_TYPE_USER)
2263
223827268b2b Do not send empty subjects when using otr
franky
parents: 2251
diff changeset
   744
    xmpp_send_msg(recipient, message, ROSTER_TYPE_USER, NULL, TRUE, NULL,
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
   745
                  LM_MESSAGE_SUB_TYPE_NOT_SET, NULL);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   746
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   747
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   748
/* When the list of ConnContexts changes (including a change in
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   749
 * state), this is called so the UI can be updated. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   750
static void cb_update_context_list(void *opdata)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   751
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   752
  /*maybe introduce new status characters for mcabber,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   753
   * then use this function (?!)*/
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   754
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   755
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   756
/* A new fingerprint for the given user has been received. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   757
static void cb_new_fingerprint(void *opdata, OtrlUserState us,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   758
                               const char *accountname, const char *protocol,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   759
                               const char *username,
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   760
                               unsigned char fingerprint[20])
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   761
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   762
  char *sbuf = NULL;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   763
  char readable[45];
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   764
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   765
  otrl_privkey_hash_to_human(readable, fingerprint);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   766
  sbuf = g_strdup_printf("OTR: new fingerprint: %s", readable);
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   767
  scr_WriteIncomingMessage(username, sbuf, 0, HBB_PREFIX_INFO, 0);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   768
  g_free(sbuf);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   769
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   770
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   771
/* The list of known fingerprints has changed.  Write them to disk. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   772
static void cb_write_fingerprints(void *opdata)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   773
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   774
  otrl_privkey_write_fingerprints(userstate, fprfile);
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   775
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   776
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   777
/* A ConnContext has entered a secure state. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   778
static void cb_gone_secure(void *opdata, ConnContext *context)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   779
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   780
  scr_WriteIncomingMessage(context->username, "OTR: channel established", 0,
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   781
                           HBB_PREFIX_INFO, 0);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   782
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   783
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   784
/* A ConnContext has left a secure state. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   785
static void cb_gone_insecure(void *opdata, ConnContext *context)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   786
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   787
  scr_WriteIncomingMessage(context->username, "OTR: channel closed", 0,
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   788
                           HBB_PREFIX_INFO, 0);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   789
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   790
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   791
/* We have completed an authentication, using the D-H keys we
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   792
 * already knew.  is_reply indicates whether we initiated the AKE. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   793
static void cb_still_secure(void *opdata, ConnContext *context, int is_reply)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   794
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   795
  scr_WriteIncomingMessage(context->username, "OTR: channel reestablished", 0,
1301
37b41ed9ed35 Fixed compiler warnings
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1299
diff changeset
   796
                           HBB_PREFIX_INFO, 0);
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   797
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   798
2076
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   799
/* Generate unique instance tag for account. */
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   800
static void cb_create_instag(void *opdata, const char *accountname,
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   801
                             const char *protocol)
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   802
{
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   803
  if (otrl_instag_generate(userstate, tagfile, accountname, protocol)) {
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   804
    scr_LogPrint(LPRINT_LOGNORM, "OTR instance tag generation failed!");
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   805
  }
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   806
}
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   807
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   808
static gboolean otr_timer_cb(gpointer userdata)
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   809
{
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   810
  otrl_message_poll(userstate, &ops, userdata);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   811
  return TRUE;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   812
}
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   813
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   814
static void cb_timer_control(void *opdata, unsigned int interval)
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   815
{
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   816
  if (otr_timer_source > 0) {
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   817
    g_source_remove(otr_timer_source);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   818
    otr_timer_source = 0;
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   819
  }
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   820
  if (interval > 0)
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   821
    otr_timer_source = g_timeout_add_seconds(interval, otr_timer_cb, opdata);
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   822
}
9fb1ccf291cc Switch to libotr v4 API
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
   823
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   824
/* Find the maximum message size supported by this protocol. */
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   825
static int cb_max_message_size(void *opdata, ConnContext *context)
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   826
{
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   827
  return 8192;
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   828
}
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   829
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   830
int otr_enabled(void)
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   831
{
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   832
  return otr_is_enabled;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   833
}
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   834
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   835
#else /* !HAVE_LIBOTR */
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   836
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   837
int otr_enabled(void)
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   838
{
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   839
  return FALSE;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   840
}
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1346
diff changeset
   841
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
diff changeset
   842
#endif /* HAVE_LIBOTR */
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
   843
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1780
diff changeset
   844
/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2:  For Vim users... */