mcabber/mcabber/xmpp.c
author franky
Sun, 19 Feb 2017 18:55:12 +0100
changeset 2312 def5f64c253d
parent 2303 4f3821bda633
child 2320 dff24f3d007f
permissions -rw-r--r--
Rebuild the buddylist after disconnect/before buddylist search
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     1
/*
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     2
 * xmpp.c       -- Jabber protocol handling
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 387
diff changeset
     3
 *
2134
fc7a758ebbde Remove deprecated options comments, update headers
Mikael Berthe <mikael@lilotux.net>
parents: 2118
diff changeset
     4
 * Copyright (C) 2008-2014 Frank Zschockelt <mcabber@freakysoft.de>
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
     5
 * Copyright (C) 2005-2015 Mikael Berthe <mikael@lilotux.net>
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     6
 * Parts come from the centericq project:
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     7
 * Copyright (C) 2002-2005 by Konstantin Klyagin <konst@konst.org.ua>
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     8
 *
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     9
 * This program is free software; you can redistribute it and/or modify
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    10
 * it under the terms of the GNU General Public License as published by
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    11
 * the Free Software Foundation; either version 2 of the License, or (at
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    12
 * your option) any later version.
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    13
 *
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    14
 * This program is distributed in the hope that it will be useful, but
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    15
 * WITHOUT ANY WARRANTY; without even the implied warranty of
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    17
 * General Public License for more details.
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    18
 *
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    19
 * 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: 2261
diff changeset
    20
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    21
 */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    22
#include <stdlib.h>
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    23
#include <string.h>
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    24
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    25
#include "xmpp.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    26
#include "xmpp_helper.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    27
#include "xmpp_iq.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    28
#include "xmpp_iqrequest.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    29
#include "xmpp_muc.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    30
#include "xmpp_s10n.h"
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
    31
#include "caps.h"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    32
#include "events.h"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    33
#include "histolog.h"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    34
#include "hooks.h"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    35
#include "otr.h"
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 52
diff changeset
    36
#include "roster.h"
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    37
#include "screen.h"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    38
#include "settings.h"
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    39
#include "utils.h"
1653
fca9a4c17432 Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1647
diff changeset
    40
#include "main.h"
2118
51fde9c25401 Reset carbons when the connection is closed
Mikael Berthe <mikael@lilotux.net>
parents: 2113
diff changeset
    41
#include "carbons.h"
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    42
1001
dff25377c11f Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents: 999
diff changeset
    43
#define RECONNECTION_TIMEOUT    60L
dff25377c11f Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents: 999
diff changeset
    44
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
    45
#ifndef LOUDMOUTH_USES_SHA256
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
    46
#define FINGERPRINT_LENGTH      16  // old loudmouth still uses MD5 :(
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
    47
#endif
2203
170597f5365b Use more generic routines to convert fingerprints to/from hexadecimal
Mikael Berthe <mikael@lilotux.net>
parents: 2199
diff changeset
    48
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
    49
LmConnection* lconnection = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    50
static guint AutoConnection;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    51
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    52
inline void update_last_use(void);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    53
inline gboolean xmpp_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    54
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    55
enum imstatus mystatus = offline;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    56
static enum imstatus mywantedstatus = available;
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    57
gchar *mystatusmsg;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    58
353
3fe43f6daa5a Make imstatus2char a null-terminated string
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
    59
char imstatus2char[imstatus_size+1] = {
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
    60
    '_', 'o', 'f', 'd', 'n', 'a', 'i', '\0'
46
f22e1d120606 [/trunk] Changeset 62 by mikael
mikael
parents: 43
diff changeset
    61
};
f22e1d120606 [/trunk] Changeset 62 by mikael
mikael
parents: 43
diff changeset
    62
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    63
char *imstatus_showmap[] = {
1378
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    64
  "",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    65
  "",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    66
  "chat",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    67
  "dnd",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    68
  "xa",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    69
  "away",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    70
  ""
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    71
};
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
    72
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    73
LmMessageNode *bookmarks = NULL;
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
    74
LmMessageNode *rosternotes = NULL;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    75
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    76
static struct IqHandlers
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 114
diff changeset
    77
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    78
  const gchar *xmlns;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    79
  LmHandleMessageFunction handler;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    80
} iq_handlers[] = {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    81
  {NS_PING,       &handle_iq_ping},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    82
  {NS_VERSION,    &handle_iq_version},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    83
  {NS_TIME,       &handle_iq_time},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    84
  {NS_ROSTER,     &handle_iq_roster},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    85
  {NS_XMPP_TIME,  &handle_iq_time202},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    86
  {NS_LAST,       &handle_iq_last},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    87
  {NS_DISCO_INFO, &handle_iq_disco_info},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    88
  {NS_DISCO_ITEMS,&handle_iq_disco_items},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    89
  {NS_COMMANDS,   &handle_iq_commands},
1615
171ae5a258fa Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents: 1614
diff changeset
    90
  {NS_VCARD,      &handle_iq_vcard},
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    91
  {NULL, NULL}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
    92
};
519
5c338d31de56 Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents: 513
diff changeset
    93
1558
3df441efb7c2 Fix gcc warnings related to inline/static uses
Mikael Berthe <mikael@lilotux.net>
parents: 1546
diff changeset
    94
void update_last_use(void)
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
    95
{
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
    96
  iqlast = time(NULL);
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
    97
}
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
    98
1684
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
    99
gboolean xmpp_is_online(void)
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   100
{
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   101
  if (lconnection && lm_connection_is_authenticated(lconnection))
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   102
    return TRUE;
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   103
  else
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   104
    return FALSE;
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   105
}
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   106
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   107
// Note: the caller should check the jid is correct
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   108
void xmpp_addbuddy(const char *bjid, const char *name, const char *group)
1215
80c095886fb5 Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents: 1213
diff changeset
   109
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   110
  LmMessageNode *query, *y;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   111
  LmMessage *iq;
1701
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   112
  LmMessageHandler *handler;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   113
  char *cleanjid;
1255
ceada40bbe20 Update Entity Capabilities (add iq:last)
Mikael Berthe <mikael@lilotux.net>
parents: 1254
diff changeset
   114
1684
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   115
  if (!xmpp_is_online())
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
   116
    return;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   117
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   118
  cleanjid = jidtodisp(bjid); // Stripping resource, just in case...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   119
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   120
  // We don't check if the jabber user already exists in the roster,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   121
  // because it allows to re-ask for notification.
1215
80c095886fb5 Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents: 1213
diff changeset
   122
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   123
  iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   124
                                    LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   125
  query = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   126
  lm_message_node_set_attribute(query, "xmlns", NS_ROSTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   127
  y = lm_message_node_add_child(query, "item", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   128
  lm_message_node_set_attribute(y, "jid", cleanjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   129
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   130
  if (name)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   131
    lm_message_node_set_attribute(y, "name", name);
1215
80c095886fb5 Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents: 1213
diff changeset
   132
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   133
  if (group)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   134
    lm_message_node_add_child(y, "group", group);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   135
1701
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   136
  handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE);
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   137
  lm_connection_send_with_reply(lconnection, iq, handler, NULL);
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   138
  lm_message_handler_unref(handler);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   139
  lm_message_unref(iq);
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 531
diff changeset
   140
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   141
  xmpp_send_s10n(cleanjid, LM_MESSAGE_SUB_TYPE_SUBSCRIBE);
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 531
diff changeset
   142
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   143
  roster_add_user(cleanjid, name, group, ROSTER_TYPE_USER, sub_pending, -1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   144
  g_free(cleanjid);
2291
0d350e979bde Don't rebuild the buddylist multiple times before a screen refresh
franky
parents: 2282
diff changeset
   145
  buddylist_defer_build();
2292
f181418db215 Replace global variable update_roster with scr_update_roster()
franky
parents: 2291
diff changeset
   146
  scr_update_roster();
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 531
diff changeset
   147
}
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 531
diff changeset
   148
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   149
void xmpp_updatebuddy(const char *bjid, const char *name, const char *group)
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   150
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   151
  LmMessage *iq;
1701
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   152
  LmMessageHandler *handler;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   153
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   154
  char *cleanjid;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   155
1684
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   156
  if (!xmpp_is_online())
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
   157
    return;
444
5927c3bfba13 Add /status_to command
Mikael Berthe <mikael@lilotux.net>
parents: 441
diff changeset
   158
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   159
  // XXX We should check name's and group's correctness
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   160
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   161
  cleanjid = jidtodisp(bjid); // Stripping resource, just in case...
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   162
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   163
  iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   164
                                    LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   165
  x = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   166
  lm_message_node_set_attribute(x, "xmlns", NS_ROSTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   167
  x = lm_message_node_add_child(x, "item", NULL);
1937
118524e9d7b6 Fix "/rename -" (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1920
diff changeset
   168
  lm_message_node_set_attribute(x, "jid", cleanjid);
118524e9d7b6 Fix "/rename -" (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1920
diff changeset
   169
  if (name)
118524e9d7b6 Fix "/rename -" (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1920
diff changeset
   170
    lm_message_node_set_attribute(x, "name", name);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   171
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   172
  if (group)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   173
    lm_message_node_add_child(x, "group", group);
1419
fb438482b28e New option to customize the away/notavail priority (Michael Gehring)
Mikael Berthe <mikael@lilotux.net>
parents: 1415
diff changeset
   174
1701
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   175
  handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE);
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   176
  lm_connection_send_with_reply(lconnection, iq, handler, NULL);
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   177
  lm_message_handler_unref(handler);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   178
  lm_message_unref(iq);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   179
  g_free(cleanjid);
534
3569d38f7bbb Add presnew()
Mikael Berthe <mikael@lilotux.net>
parents: 533
diff changeset
   180
}
3569d38f7bbb Add presnew()
Mikael Berthe <mikael@lilotux.net>
parents: 533
diff changeset
   181
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   182
void xmpp_delbuddy(const char *bjid)
534
3569d38f7bbb Add presnew()
Mikael Berthe <mikael@lilotux.net>
parents: 533
diff changeset
   183
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   184
  LmMessageNode *y, *z;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   185
  LmMessage *iq;
1701
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   186
  LmMessageHandler *handler;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   187
  char *cleanjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   188
1684
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   189
  if (!xmpp_is_online())
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
   190
    return;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   191
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   192
  cleanjid = jidtodisp(bjid); // Stripping resource, just in case...
534
3569d38f7bbb Add presnew()
Mikael Berthe <mikael@lilotux.net>
parents: 533
diff changeset
   193
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   194
  // If the current buddy is an agent, unsubscribe from it
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   195
  if (roster_gettype(cleanjid) == ROSTER_TYPE_AGENT) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   196
    scr_LogPrint(LPRINT_LOGNORM, "Unregistering from the %s agent", cleanjid);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   197
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   198
    iq = lm_message_new_with_sub_type(cleanjid, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   199
                                      LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   200
    y = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   201
    lm_message_node_set_attribute(y, "xmlns", NS_REGISTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   202
    lm_message_node_add_child(y, "remove", NULL);
1994
024bdd1c6418 Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents: 1984
diff changeset
   203
    handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE);
024bdd1c6418 Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents: 1984
diff changeset
   204
    lm_connection_send_with_reply(lconnection, iq, handler, NULL);
024bdd1c6418 Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents: 1984
diff changeset
   205
    lm_message_handler_unref(handler);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   206
    lm_message_unref(iq);
1014
99c5278bf6b8 Keep the status and status messages when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents: 1013
diff changeset
   207
  }
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   208
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   209
  // Cancel the subscriptions
1729
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1728
diff changeset
   210
  xmpp_send_s10n(cleanjid, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED); // cancel "from"
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1728
diff changeset
   211
  xmpp_send_s10n(cleanjid, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE);  // cancel "to"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   212
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   213
  // Ask for removal from roster
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   214
  iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   215
                                    LM_MESSAGE_SUB_TYPE_SET);
444
5927c3bfba13 Add /status_to command
Mikael Berthe <mikael@lilotux.net>
parents: 441
diff changeset
   216
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   217
  y = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   218
  lm_message_node_set_attribute(y, "xmlns", NS_ROSTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   219
  z = lm_message_node_add_child(y, "item", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   220
  lm_message_node_set_attributes(z,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   221
                                 "jid", cleanjid,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   222
                                 "subscription", "remove",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   223
                                 NULL);
1701
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   224
  handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE);
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   225
  lm_connection_send_with_reply(lconnection, iq, handler, NULL);
44e023ad99ed Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1693
diff changeset
   226
  lm_message_handler_unref(handler);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   227
  lm_message_unref(iq);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   228
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   229
  roster_del_user(cleanjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   230
  g_free(cleanjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   231
2292
f181418db215 Replace global variable update_roster with scr_update_roster()
franky
parents: 2291
diff changeset
   232
  scr_update_roster();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   233
}
1365
c7e709719c43 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1363
diff changeset
   234
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   235
void xmpp_request(const char *fjid, enum iqreq_type reqtype)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   236
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   237
  GSList *resources, *p_res;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   238
  GSList *roster_elt;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   239
  const char *strreqtype, *xmlns;
1722
b18142457ca9 Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents: 1721
diff changeset
   240
  gboolean vcard2user;
1365
c7e709719c43 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1363
diff changeset
   241
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   242
  if (reqtype == iqreq_version) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   243
    xmlns = NS_VERSION;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   244
    strreqtype = "version";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   245
  } else if (reqtype == iqreq_time) {
2017
87049d55e34f Fix /request time
Mikael Berthe <mikael@lilotux.net>
parents: 2013
diff changeset
   246
    xmlns = NS_XMPP_TIME;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   247
    strreqtype = "time";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   248
  } else if (reqtype == iqreq_last) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   249
    xmlns = NS_LAST;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   250
    strreqtype = "last";
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1701
diff changeset
   251
  } else if (reqtype == iqreq_ping) {
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1701
diff changeset
   252
    xmlns = NS_PING;
1711
3a1afbfb28dd Fix typo introduced in ac881b5f9248 (s/last/ping)
franky
parents: 1705
diff changeset
   253
    strreqtype = "ping";
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   254
  } else if (reqtype == iqreq_vcard) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   255
    xmlns = NS_VCARD;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   256
    strreqtype = "vCard";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   257
  } else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   258
    return;
1365
c7e709719c43 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1363
diff changeset
   259
1722
b18142457ca9 Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents: 1721
diff changeset
   260
  // Is it a vCard request to a regular user?
b18142457ca9 Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents: 1721
diff changeset
   261
  // (vCard requests are sent to bare JIDs, except in MUC rooms...)
b18142457ca9 Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents: 1721
diff changeset
   262
  vcard2user = (reqtype == iqreq_vcard &&
b18142457ca9 Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents: 1721
diff changeset
   263
                !roster_find(fjid, jidsearch, ROSTER_TYPE_ROOM));
b18142457ca9 Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents: 1721
diff changeset
   264
b18142457ca9 Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents: 1721
diff changeset
   265
  if (strchr(fjid, JID_RESOURCE_SEPARATOR) || vcard2user) {
b18142457ca9 Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents: 1721
diff changeset
   266
    // This is a full JID or a vCard request to a contact
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   267
    xmpp_iq_request(fjid, xmlns);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   268
    scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   269
    return;
521
cc8c969ab6e5 "/status" changes
Mikael Berthe <mikael@lilotux.net>
parents: 519
diff changeset
   270
  }
713
b5aa7b7afee8 Update status lines
Mikael Berthe <mikael@lilotux.net>
parents: 706
diff changeset
   271
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   272
  // The resource has not been specified
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   273
  roster_elt = roster_find(fjid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_ROOM);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   274
  if (!roster_elt) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   275
    scr_LogPrint(LPRINT_NORMAL, "No known resource for <%s>...", fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   276
    xmpp_iq_request(fjid, xmlns); // Let's send a request anyway...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   277
    scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   278
    return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   279
  }
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
   280
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   281
  // Send a request to each resource
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   282
  resources = buddy_getresources(roster_elt->data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   283
  if (!resources) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   284
    scr_LogPrint(LPRINT_NORMAL, "No known resource for <%s>...", fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   285
    xmpp_iq_request(fjid, xmlns); // Let's send a request anyway...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   286
    scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   287
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   288
  for (p_res = resources ; p_res ; p_res = g_slist_next(p_res)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   289
    gchar *fulljid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   290
    fulljid = g_strdup_printf("%s/%s", fjid, (char*)p_res->data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   291
    xmpp_iq_request(fulljid, xmlns);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   292
    scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fulljid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   293
    g_free(fulljid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   294
    g_free(p_res->data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   295
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   296
  g_slist_free(resources);
1014
99c5278bf6b8 Keep the status and status messages when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents: 1013
diff changeset
   297
}
99c5278bf6b8 Keep the status and status messages when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents: 1013
diff changeset
   298
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   299
//  xmpp_send_msg(jid, text, type, subject,
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   300
//                otrinject, *encrypted, type_overwrite, *xep184)
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   301
// When encrypted is not NULL, the function set *encrypted to 1 if the
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   302
// message has been PGP (or OTR) -encrypted.  If encryption enforcement is set
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   303
// and encryption fails, *encrypted is set to -1.
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   304
// otrinject should be set to FALSE (unless the message already has an OTR
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   305
// payload, i.e. if the function is called from an otr.c routine).
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   306
void xmpp_send_msg(const char *fjid, const char *text, int type,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   307
                   const char *subject, gboolean otrinject, gint *encrypted,
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
   308
                   LmMessageSubType type_overwrite, gpointer *xep184)
35
a8ceaa3005fd [/trunk] Changeset 51 by mikael
mikael
parents: 33
diff changeset
   309
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   310
  LmMessage *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   311
  LmMessageSubType subtype;
1304
8ada97e5eb75 Fix a gcc warning
Mikael Berthe <mikael@lilotux.net>
parents: 1299
diff changeset
   312
#ifdef HAVE_LIBOTR
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
   313
  int otr_msg = 0;
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   314
  char *otr_msg_string = NULL;
1304
8ada97e5eb75 Fix a gcc warning
Mikael Berthe <mikael@lilotux.net>
parents: 1299
diff changeset
   315
#endif
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
   316
  char *barejid;
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   317
#if defined HAVE_GPGME || defined XEP0085
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
   318
  char *rname;
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   319
  GSList *sl_buddy;
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   320
#endif
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   321
#ifdef XEP0085
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   322
  LmMessageNode *event;
1998
41667bc02883 Fix GCC warnings (variables set but not used)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1994
diff changeset
   323
  struct xep0085 *xep85 = NULL;
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   324
#endif
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   325
  gchar *enc = NULL;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
   326
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1053
diff changeset
   327
  if (encrypted)
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   328
    *encrypted = 0;
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1053
diff changeset
   329
1684
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   330
  if (!xmpp_is_online())
1435
9bf7f3ddff10 Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1426
diff changeset
   331
    return;
9bf7f3ddff10 Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1426
diff changeset
   332
9bf7f3ddff10 Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1426
diff changeset
   333
  if (!text && type == ROSTER_TYPE_USER)
9bf7f3ddff10 Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1426
diff changeset
   334
    return;
472
75442262c082 Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents: 470
diff changeset
   335
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   336
  if (type_overwrite != LM_MESSAGE_SUB_TYPE_NOT_SET)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   337
    subtype = type_overwrite;
1305
9bc68473f8a3 -n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1304
diff changeset
   338
  else {
9bc68473f8a3 -n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1304
diff changeset
   339
    if (type == ROSTER_TYPE_ROOM)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   340
      subtype = LM_MESSAGE_SUB_TYPE_GROUPCHAT;
1305
9bc68473f8a3 -n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1304
diff changeset
   341
    else
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   342
      subtype = LM_MESSAGE_SUB_TYPE_CHAT;
1305
9bc68473f8a3 -n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1304
diff changeset
   343
  }
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
   344
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
   345
  barejid = jidtodisp(fjid);
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   346
#if defined HAVE_GPGME || defined HAVE_LIBOTR || defined XEP0085
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
   347
  rname = strchr(fjid, JID_RESOURCE_SEPARATOR);
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   348
  sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   349
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   350
  // If we can get a resource name, we use it.  Else we use NULL,
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   351
  // which hopefully will give us the most likely resource.
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   352
  if (rname)
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   353
    rname++;
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   354
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
   355
#ifdef HAVE_LIBOTR
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   356
  if (otr_enabled() && !otrinject) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   357
    if (type == ROSTER_TYPE_USER) {
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   358
      otr_msg_string = otr_send(text, barejid, &otr_msg);
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   359
      if (!otr_msg_string) {
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
   360
        if (encrypted)
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
   361
          *encrypted = -1;
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   362
        goto xmpp_send_msg_return;
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
   363
      }
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   364
      text = otr_msg_string;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
   365
    }
1484
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
   366
    if (otr_msg && encrypted)
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
   367
      *encrypted = ENCRYPTED_OTR;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
   368
  }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
   369
#endif
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
   370
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   371
#ifdef HAVE_GPGME
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   372
  if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) {
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   373
    if (!settings_pgp_getdisabled(barejid)) { // not disabled for this contact?
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   374
      guint force;
1065
230dca34dbea Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
   375
      struct pgp_data *res_pgpdata;
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   376
      force = settings_pgp_getforce(barejid);
1065
230dca34dbea Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
   377
      res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname);
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   378
      if (force || (res_pgpdata && res_pgpdata->sign_keyid)) {
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   379
        /* Remote client has PGP support (we have a signature)
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   380
         * OR encryption is enforced (force = TRUE).
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   381
         * If the contact has a specific KeyId, we'll use it;
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   382
         * if not, we'll use the key used for the signature.
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   383
         * Both keys should match, in theory (cf. XEP-0027). */
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   384
        const char *key;
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   385
        key = settings_pgp_getkeyid(barejid);
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   386
        if (!key && res_pgpdata)
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   387
          key = res_pgpdata->sign_keyid;
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 2167
diff changeset
   388
        if (key) {
2188
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
   389
          int nkeys = 1;
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
   390
          const char *keys[] = { key, 0 };
2195
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2194
diff changeset
   391
          if (carbons_enabled())
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2194
diff changeset
   392
            keys[nkeys++] = gpg_get_private_key_id();
2188
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
   393
          enc = gpg_encrypt(text, keys, nkeys);
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 2167
diff changeset
   394
        }
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   395
        if (!enc && force) {
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   396
          if (encrypted)
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   397
            *encrypted = -1;
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   398
          goto xmpp_send_msg_return;
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
   399
        }
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   400
      }
1065
230dca34dbea Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
   401
    }
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   402
  }
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   403
#endif // HAVE_GPGME
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   404
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   405
#endif // HAVE_GPGME || defined XEP0085
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   406
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   407
  x = lm_message_new_with_sub_type(fjid, LM_MESSAGE_TYPE_MESSAGE, subtype);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   408
  lm_message_node_add_child(x->node, "body",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   409
                            enc ? "This message is PGP-encrypted." : text);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   410
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   411
  if (subject)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   412
    lm_message_node_add_child(x->node, "subject", subject);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   413
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   414
  if (enc) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   415
    LmMessageNode *y;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   416
    y = lm_message_node_add_child(x->node, "x", enc);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   417
    lm_message_node_set_attribute(y, "xmlns", NS_ENCRYPTED);
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1053
diff changeset
   418
    if (encrypted)
1484
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
   419
      *encrypted = ENCRYPTED_PGP;
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   420
    g_free(enc);
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   421
  }
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   422
2194
f4c00c72b27d Fix compilation when OTR is disabled
Mikael Berthe <mikael@lilotux.net>
parents: 2192
diff changeset
   423
#ifdef HAVE_LIBOTR
2152
2ce6dd6861ea Use the Carbons <private/> element for outgoing encrypted messages
Mikael Berthe <mikael@lilotux.net>
parents: 2151
diff changeset
   424
  // We probably don't want Carbons for encrypted messages, since the other
2ce6dd6861ea Use the Carbons <private/> element for outgoing encrypted messages
Mikael Berthe <mikael@lilotux.net>
parents: 2151
diff changeset
   425
  // resources won't be able to decrypt them.
2192
cb53950fb1de Do not use <private> for PGP-encrypted outgoing messages
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2190
diff changeset
   426
  if (otr_msg && carbons_enabled())
2152
2ce6dd6861ea Use the Carbons <private/> element for outgoing encrypted messages
Mikael Berthe <mikael@lilotux.net>
parents: 2151
diff changeset
   427
    lm_message_node_add_child(x->node, "private", NS_CARBONS_2);
2194
f4c00c72b27d Fix compilation when OTR is disabled
Mikael Berthe <mikael@lilotux.net>
parents: 2192
diff changeset
   428
#endif
2152
2ce6dd6861ea Use the Carbons <private/> element for outgoing encrypted messages
Mikael Berthe <mikael@lilotux.net>
parents: 2151
diff changeset
   429
1729
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1728
diff changeset
   430
  // XEP-0184: Message Receipts
1730
860b58a0e8da Update XEP-0184 support
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
   431
  if (sl_buddy && xep184 &&
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
   432
      caps_has_feature(buddy_resource_getcaps(sl_buddy->data, rname),
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
   433
                       NS_RECEIPTS, barejid)) {
2032
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
   434
    lm_message_node_set_attribute(lm_message_node_add_child(x->node, "request",
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
   435
                                                            NULL),
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
   436
                                  "xmlns", NS_RECEIPTS);
2036
f8958ab545ac Make message delivery receipts more backward-compatible
Mikael Berthe <mikael@lilotux.net>
parents: 2033
diff changeset
   437
    *xep184 = g_strdup(lm_message_get_id(x));
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
   438
  }
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
   439
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   440
#ifdef XEP0085
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   441
  // If typing notifications are disabled, we can skip all this stuff...
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   442
  if (chatstates_disabled || type == ROSTER_TYPE_ROOM)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   443
    goto xmpp_send_msg_no_chatstates;
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
   444
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   445
  if (sl_buddy)
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   446
    xep85 = buddy_resource_xep85(sl_buddy->data, rname);
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   447
1691
b2e0083891cc Replace JEP with XEP
Mikael Berthe <mikael@lilotux.net>
parents: 1689
diff changeset
   448
  /* XEP-0085 5.1
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   449
   * "Until receiving a reply to the initial content message (or a standalone
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   450
   * notification) from the Contact, the User MUST NOT send subsequent chat
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   451
   * state notifications to the Contact."
1378
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
   452
   * In our implementation support is initially "unknown", then it's "probed"
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   453
   * and can become "ok".
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   454
   */
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   455
  if (xep85 && (xep85->support == CHATSTATES_SUPPORT_OK ||
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   456
                xep85->support == CHATSTATES_SUPPORT_UNKNOWN)) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   457
    event = lm_message_node_add_child(x->node, "active", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   458
    lm_message_node_set_attribute(event, "xmlns", NS_CHATSTATES);
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   459
    if (xep85->support == CHATSTATES_SUPPORT_UNKNOWN)
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   460
      xep85->support = CHATSTATES_SUPPORT_PROBED;
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   461
    xep85->last_state_sent = ROSTER_EVENT_ACTIVE;
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   462
  }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
   463
#endif
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   464
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   465
xmpp_send_msg_no_chatstates:
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
   466
#ifdef WITH_DEPRECATED_STATUS_INVISIBLE
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
   467
  if (mystatus != invisible)
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
   468
#endif
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
   469
    update_last_use();
2032
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
   470
  lm_connection_send(lconnection, x, NULL);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   471
  lm_message_unref(x);
2213
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   472
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   473
xmpp_send_msg_return:
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   474
#ifdef HAVE_LIBOTR
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   475
  g_free(otr_msg_string);
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   476
#endif
0c78d31c753d Change otr_send() prototype
Mikael Berthe <mikael@lilotux.net>
parents: 2212
diff changeset
   477
  g_free(barejid);
35
a8ceaa3005fd [/trunk] Changeset 51 by mikael
mikael
parents: 33
diff changeset
   478
}
a8ceaa3005fd [/trunk] Changeset 51 by mikael
mikael
parents: 33
diff changeset
   479
1691
b2e0083891cc Replace JEP with XEP
Mikael Berthe <mikael@lilotux.net>
parents: 1689
diff changeset
   480
#ifdef XEP0085
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   481
//  xmpp_send_xep85_chatstate()
1691
b2e0083891cc Replace JEP with XEP
Mikael Berthe <mikael@lilotux.net>
parents: 1689
diff changeset
   482
// Send a XEP-85 chatstate.
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   483
static void xmpp_send_xep85_chatstate(const char *bjid, const char *resname,
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   484
                                      guint state)
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   485
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   486
  LmMessage *m;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   487
  LmMessageNode *event;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   488
  GSList *sl_buddy;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   489
  const char *chattag;
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   490
  char *rjid, *fjid = NULL;
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   491
  struct xep0085 *xep85 = NULL;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   492
1684
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
   493
  if (!xmpp_is_online())
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
   494
    return;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   495
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   496
  sl_buddy = roster_find(bjid, jidsearch, ROSTER_TYPE_USER);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   497
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   498
  // If we have a resource name, we use it.  Else we use NULL,
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   499
  // which hopefully will give us the most likely resource.
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   500
  if (sl_buddy)
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   501
    xep85 = buddy_resource_xep85(sl_buddy->data, resname);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   502
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   503
  if (!xep85 || (xep85->support != CHATSTATES_SUPPORT_OK))
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   504
    return;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   505
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   506
  if (state == xep85->last_state_sent)
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   507
    return;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   508
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   509
  if (state == ROSTER_EVENT_ACTIVE)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   510
    chattag = "active";
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   511
  else if (state == ROSTER_EVENT_COMPOSING)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   512
    chattag = "composing";
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   513
  else if (state == ROSTER_EVENT_PAUSED)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   514
    chattag = "paused";
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   515
  else {
1691
b2e0083891cc Replace JEP with XEP
Mikael Berthe <mikael@lilotux.net>
parents: 1689
diff changeset
   516
    scr_LogPrint(LPRINT_LOGNORM, "Error: unsupported XEP-85 state (%d)", state);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   517
    return;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   518
  }
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   519
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   520
  xep85->last_state_sent = state;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   521
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   522
  if (resname)
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   523
    fjid = g_strdup_printf("%s/%s", bjid, resname);
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   524
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   525
  rjid = resname ? fjid : (char*)bjid;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   526
  m = lm_message_new_with_sub_type(rjid, LM_MESSAGE_TYPE_MESSAGE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   527
                                   LM_MESSAGE_SUB_TYPE_CHAT);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   528
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   529
  event = lm_message_node_add_child(m->node, chattag, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   530
  lm_message_node_set_attribute(event, "xmlns", NS_CHATSTATES);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   531
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   532
  lm_connection_send(lconnection, m, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   533
  lm_message_unref(m);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   534
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   535
  g_free(fjid);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   536
}
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   537
#endif
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   538
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   539
//  xmpp_send_chatstate(buddy, state)
1691
b2e0083891cc Replace JEP with XEP
Mikael Berthe <mikael@lilotux.net>
parents: 1689
diff changeset
   540
// Send a chatstate or event (XEP-22/85) according to the buddy's capabilities.
997
d0d0cd9e39c4 Cosmetics & comments
Mikael Berthe <mikael@lilotux.net>
parents: 993
diff changeset
   541
// The message is sent to one of the resources with the highest priority.
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   542
#if defined XEP0085
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   543
void xmpp_send_chatstate(gpointer buddy, guint chatstate)
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   544
{
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
   545
  const char *bjid;
2013
8dc418af3e72 Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents: 2010
diff changeset
   546
  const char *activeres;
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   547
  GSList *resources, *p_res, *p_next;
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   548
  struct xep0085 *xep85 = NULL;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   549
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
   550
  bjid = buddy_getjid(buddy);
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
   551
  if (!bjid) return;
2013
8dc418af3e72 Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents: 2010
diff changeset
   552
  activeres = buddy_getactiveresource(buddy);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   553
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   554
  /* Send the chatstate to the last resource (which should have the highest
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   555
     priority).
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   556
     If chatstate is "active", send an "active" state to all resources
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   557
     which do not curently have this state.
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   558
   */
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   559
  resources = buddy_getresources(buddy);
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   560
  for (p_res = resources ; p_res ; p_res = p_next) {
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   561
    p_next = g_slist_next(p_res);
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   562
    xep85 = buddy_resource_xep85(buddy, p_res->data);
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   563
    if (xep85 && xep85->support == CHATSTATES_SUPPORT_OK) {
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   564
      // If p_next is NULL, this is the highest (prio) resource, i.e.
2013
8dc418af3e72 Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents: 2010
diff changeset
   565
      // the one we are probably writing to - unless there is defined an
8dc418af3e72 Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents: 2010
diff changeset
   566
      // active resource
8dc418af3e72 Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents: 2010
diff changeset
   567
      if (!g_strcmp0(p_res->data, activeres) || (!p_next && !activeres) ||
8dc418af3e72 Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents: 2010
diff changeset
   568
             (xep85->last_state_sent != ROSTER_EVENT_ACTIVE &&
8dc418af3e72 Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents: 2010
diff changeset
   569
              chatstate == ROSTER_EVENT_ACTIVE))
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   570
        xmpp_send_xep85_chatstate(bjid, p_res->data, chatstate);
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   571
    }
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   572
    g_free(p_res->data);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   573
  }
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
   574
  g_slist_free(resources);
1099
7804dbac3875 Fix a potential JEP22/85 issue introduced by changeset 10f9d6fcfeab
Mikael Berthe <mikael@lilotux.net>
parents: 1091
diff changeset
   575
  // If the last resource had chatstates support when can return now,
1691
b2e0083891cc Replace JEP with XEP
Mikael Berthe <mikael@lilotux.net>
parents: 1689
diff changeset
   576
  // we don't want to send a XEP22 event.
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   577
  if (xep85 && xep85->support == CHATSTATES_SUPPORT_OK)
1099
7804dbac3875 Fix a potential JEP22/85 issue introduced by changeset 10f9d6fcfeab
Mikael Berthe <mikael@lilotux.net>
parents: 1091
diff changeset
   578
    return;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   579
}
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   580
#endif
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
   581
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   582
999
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   583
//  chatstates_reset_probed(fulljid)
1691
b2e0083891cc Replace JEP with XEP
Mikael Berthe <mikael@lilotux.net>
parents: 1689
diff changeset
   584
// If the XEP has been probed for this contact, set it back to unknown so
999
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   585
// that we probe it again.  The parameter must be a full jid (w/ resource).
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   586
#if defined XEP0085
999
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   587
static void chatstates_reset_probed(const char *fulljid)
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   588
{
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   589
  char *rname, *barejid;
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   590
  GSList *sl_buddy;
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   591
  struct xep0085 *xep85;
999
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   592
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   593
  rname = strchr(fulljid, JID_RESOURCE_SEPARATOR);
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   594
  if (!rname++)
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   595
    return;
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   596
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   597
  barejid = jidtodisp(fulljid);
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   598
  sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   599
  g_free(barejid);
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   600
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   601
  if (!sl_buddy)
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   602
    return;
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   603
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   604
  xep85 = buddy_resource_xep85(sl_buddy->data, rname);
999
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   605
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   606
  if (xep85 && xep85->support == CHATSTATES_SUPPORT_PROBED)
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   607
    xep85->support = CHATSTATES_SUPPORT_UNKNOWN;
999
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   608
}
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   609
#endif
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
   610
1194
03d8fafe8104 Remove a warning when gpgme is disabled
Mikael Berthe <mikael@lilotux.net>
parents: 1166
diff changeset
   611
#ifdef HAVE_GPGME
1104
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   612
//  keys_mismatch(key, expectedkey)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   613
// Return TRUE if both keys are non-null and "expectedkey" doesn't match
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   614
// the end of "key".
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   615
// If one of the keys is null, return FALSE.
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   616
// If expectedkey is less than 8 bytes long, return TRUE.
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   617
//
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   618
// Example: keys_mismatch("C9940A9BB0B92210", "B0B92210") will return FALSE.
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   619
static bool keys_mismatch(const char *key, const char *expectedkey)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   620
{
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   621
  int lk, lek;
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   622
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   623
  if (!expectedkey || !key)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   624
    return FALSE;
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   625
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   626
  lk = strlen(key);
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   627
  lek = strlen(expectedkey);
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   628
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   629
  // If the expectedkey is less than 8 bytes long, this is probably a
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   630
  // user mistake so we consider it's a mismatch.
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   631
  if (lek < 8)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   632
    return TRUE;
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   633
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   634
  if (lek < lk)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   635
    key += lk - lek;
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   636
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   637
  return strcasecmp(key, expectedkey);
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   638
}
1194
03d8fafe8104 Remove a warning when gpgme is disabled
Mikael Berthe <mikael@lilotux.net>
parents: 1166
diff changeset
   639
#endif
1104
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   640
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   641
//  check_signature(barejid, resourcename, xmldata, text)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   642
// Verify the signature (in xmldata) of "text" for the contact
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   643
// barejid/resourcename.
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   644
// xmldata is the 'jabber:x:signed' stanza.
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   645
// If the key id is found, the contact's PGP data are updated.
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   646
static void check_signature(const char *barejid, const char *rname,
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   647
                            LmMessageNode *node, const char *text)
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   648
{
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   649
#ifdef HAVE_GPGME
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   650
  const char *p, *key;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   651
  GSList *sl_buddy;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   652
  struct pgp_data *res_pgpdata;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   653
  gpgme_sigsum_t sigsum;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   654
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   655
  // All parameters must be valid
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   656
  if (!(node && barejid && rname && text))
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   657
    return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   658
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   659
  if (!gpg_enabled())
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   660
    return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   661
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   662
  // Get the resource PGP data structure
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   663
  sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   664
  if (!sl_buddy)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   665
    return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   666
  res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname);
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   667
  if (!res_pgpdata)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   668
    return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   669
1729
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1728
diff changeset
   670
  if (!node->name || strcmp(node->name, "x")) // XXX: probably useless
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   671
    return; // We expect "<x xmlns='jabber:x:signed'>"
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   672
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   673
  // Get signature
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   674
  p = lm_message_node_get_value(node);
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   675
  if (!p)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   676
    return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   677
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   678
  key = gpg_verify(p, text, &sigsum);
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   679
  if (key) {
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   680
    const char *expectedkey;
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   681
    char *buf;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   682
    g_free(res_pgpdata->sign_keyid);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   683
    res_pgpdata->sign_keyid = (char *)key;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   684
    res_pgpdata->last_sigsum = sigsum;
1046
a3748bd3d010 Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents: 1045
diff changeset
   685
    if (sigsum & GPGME_SIGSUM_RED) {
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   686
      buf = g_strdup_printf("Bad signature from <%s/%s>", barejid, rname);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
   687
      scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_INFO, 0);
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   688
      scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   689
      g_free(buf);
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   690
    }
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   691
    // Verify that the key id is the one we expect.
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   692
    expectedkey = settings_pgp_getkeyid(barejid);
1104
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
   693
    if (keys_mismatch(key, expectedkey)) {
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   694
      buf = g_strdup_printf("Warning: The KeyId from <%s/%s> doesn't match "
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
   695
                            "the key you set up", barejid, rname);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
   696
      scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_INFO, 0);
1046
a3748bd3d010 Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents: 1045
diff changeset
   697
      scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
a3748bd3d010 Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents: 1045
diff changeset
   698
      g_free(buf);
a3748bd3d010 Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents: 1045
diff changeset
   699
    }
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   700
  }
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   701
#endif
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   702
}
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   703
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   704
static LmSSLResponse ssl_cb(LmSSL *ssl, LmSSLStatus status, gpointer ud)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   705
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   706
  switch (status) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   707
  case LM_SSL_STATUS_NO_CERT_FOUND:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   708
    scr_LogPrint(LPRINT_LOGNORM, "No certificate found!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   709
    break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   710
  case LM_SSL_STATUS_UNTRUSTED_CERT:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   711
    scr_LogPrint(LPRINT_LOGNORM, "Certificate is not trusted!");
2250
df5837a72b35 Ignore the untrusted certificate warning when user sets a fingerprint
franky
parents: 2248
diff changeset
   712
    // The user specified a fingerprint, let's wait for lm to check that
df5837a72b35 Ignore the untrusted certificate warning when user sets a fingerprint
franky
parents: 2248
diff changeset
   713
    if (settings_opt_get("ssl_fingerprint"))
df5837a72b35 Ignore the untrusted certificate warning when user sets a fingerprint
franky
parents: 2248
diff changeset
   714
      return LM_SSL_RESPONSE_CONTINUE;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   715
    break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   716
  case LM_SSL_STATUS_CERT_EXPIRED:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   717
    scr_LogPrint(LPRINT_LOGNORM, "Certificate has expired!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   718
    break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   719
  case LM_SSL_STATUS_CERT_NOT_ACTIVATED:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   720
    scr_LogPrint(LPRINT_LOGNORM, "Certificate has not been activated!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   721
    break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   722
  case LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   723
    scr_LogPrint(LPRINT_LOGNORM,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   724
                 "Certificate hostname does not match expected hostname!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   725
    break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   726
  case LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH: {
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   727
#ifndef LOUDMOUTH_USES_SHA256
2203
170597f5365b Use more generic routines to convert fingerprints to/from hexadecimal
Mikael Berthe <mikael@lilotux.net>
parents: 2199
diff changeset
   728
      char fpr[3*FINGERPRINT_LENGTH] = {0};
170597f5365b Use more generic routines to convert fingerprints to/from hexadecimal
Mikael Berthe <mikael@lilotux.net>
parents: 2199
diff changeset
   729
      fingerprint_to_hex(lm_ssl_get_fingerprint(ssl), fpr, FINGERPRINT_LENGTH);
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   730
#endif
2197
189abf03ef24 Fix fingerprint management
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
   731
      scr_LogPrint(LPRINT_LOGNORM,
189abf03ef24 Fix fingerprint management
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
   732
                "Certificate fingerprint does not match expected fingerprint!");
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   733
#ifndef LOUDMOUTH_USES_SHA256
2197
189abf03ef24 Fix fingerprint management
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
   734
      scr_LogPrint(LPRINT_LOGNORM, "Remote fingerprint: %s", fpr);
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   735
#else
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   736
      scr_LogPrint(LPRINT_LOGNORM, "Remote fingerprint: %s", lm_ssl_get_fingerprint(ssl));
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   737
#endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   738
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   739
      scr_LogPrint(LPRINT_LOGNORM, "Expect fingerprint: %s",
2197
189abf03ef24 Fix fingerprint management
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
   740
                   settings_opt_get("ssl_fingerprint"));
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   741
2197
189abf03ef24 Fix fingerprint management
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
   742
      return LM_SSL_RESPONSE_STOP;
189abf03ef24 Fix fingerprint management
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
   743
    }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   744
    break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   745
  case LM_SSL_STATUS_GENERIC_ERROR:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   746
    scr_LogPrint(LPRINT_LOGNORM, "Generic SSL error!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   747
    break;
1911
baa52ea32b47 Only print the ssl status as an integer if we don't understand it
franky
parents: 1910
diff changeset
   748
  default:
baa52ea32b47 Only print the ssl status as an integer if we don't understand it
franky
parents: 1910
diff changeset
   749
    scr_LogPrint(LPRINT_LOGNORM, "SSL error:%d", status);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   750
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   751
1656
fbab3c1300d5 Update fix for ssl_ignore_checks option (changeset 8effa82ae593)
franky
parents: 1655
diff changeset
   752
  if (settings_opt_get_int("ssl_ignore_checks"))
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   753
    return LM_SSL_RESPONSE_CONTINUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   754
  return LM_SSL_RESPONSE_STOP;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   755
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   756
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   757
static void connection_auth_cb(LmConnection *connection, gboolean success,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   758
                               gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   759
{
2199
527ba1c1873e Display the server SSL fingerprint when we connect
Mikael Berthe <mikael@lilotux.net>
parents: 2198
diff changeset
   760
  LmSSL *lssl;
527ba1c1873e Display the server SSL fingerprint when we connect
Mikael Berthe <mikael@lilotux.net>
parents: 2198
diff changeset
   761
  if ((lssl = lm_connection_get_ssl(connection)) != NULL) {
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   762
#ifndef LOUDMOUTH_USES_SHA256
2203
170597f5365b Use more generic routines to convert fingerprints to/from hexadecimal
Mikael Berthe <mikael@lilotux.net>
parents: 2199
diff changeset
   763
    char fpr[3*FINGERPRINT_LENGTH] = {0};
170597f5365b Use more generic routines to convert fingerprints to/from hexadecimal
Mikael Berthe <mikael@lilotux.net>
parents: 2199
diff changeset
   764
    fingerprint_to_hex(lm_ssl_get_fingerprint(lssl), fpr, FINGERPRINT_LENGTH);
2199
527ba1c1873e Display the server SSL fingerprint when we connect
Mikael Berthe <mikael@lilotux.net>
parents: 2198
diff changeset
   765
    scr_LogPrint(LPRINT_LOGNORM, "Connection established.\n"
527ba1c1873e Display the server SSL fingerprint when we connect
Mikael Berthe <mikael@lilotux.net>
parents: 2198
diff changeset
   766
                 "Remote fingerprint: %s", fpr);
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   767
#else
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   768
    scr_LogPrint(LPRINT_LOGNORM, "Connection established.\n"
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   769
                 "Remote fingerprint: %s", lm_ssl_get_fingerprint(lssl));
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
   770
#endif
2199
527ba1c1873e Display the server SSL fingerprint when we connect
Mikael Berthe <mikael@lilotux.net>
parents: 2198
diff changeset
   771
  }
527ba1c1873e Display the server SSL fingerprint when we connect
Mikael Berthe <mikael@lilotux.net>
parents: 2198
diff changeset
   772
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   773
  if (success) {
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
   774
    xmpp_iq_request(NULL, NS_ROSTER);
2103
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2090
diff changeset
   775
    xmpp_iq_request(NULL, NS_DISCO_INFO);
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
   776
    xmpp_request_storage("storage:bookmarks");
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
   777
    xmpp_request_storage("storage:rosternotes");
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
   778
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
   779
    /* XXX Not needed before xmpp_setprevstatus()
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   780
    LmMessage *m;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   781
    m = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_PRESENCE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   782
                                     LM_MESSAGE_SUB_TYPE_AVAILABLE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   783
    lm_connection_send(connection, m, NULL);
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
   784
    lm_message_unref(m);
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
   785
    */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   786
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   787
    xmpp_setprevstatus();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   788
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   789
    AutoConnection = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   790
  } else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   791
    scr_LogPrint(LPRINT_LOGNORM, "Authentication failed");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   792
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   793
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   794
gboolean xmpp_reconnect()
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   795
{
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
   796
  if (!lconnection)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   797
    xmpp_connect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   798
  return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   799
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   800
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   801
static void _try_to_reconnect(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   802
{
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
   803
  xmpp_disconnect();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   804
  if (AutoConnection)
1747
c4f67e2e675f Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents: 1746
diff changeset
   805
    g_timeout_add_seconds(RECONNECTION_TIMEOUT + (random() % 90L),
c4f67e2e675f Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents: 1746
diff changeset
   806
                          xmpp_reconnect, NULL);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   807
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   808
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   809
static void connection_open_cb(LmConnection *connection, gboolean success,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   810
                               gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   811
{
1663
dcb0b4522ded Fix GError handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1656
diff changeset
   812
  GError *error = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   813
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   814
  if (success) {
1613
509fa8558483 Remove unused variable
Mikael Berthe <mikael@lilotux.net>
parents: 1612
diff changeset
   815
    const char *password, *resource;
509fa8558483 Remove unused variable
Mikael Berthe <mikael@lilotux.net>
parents: 1612
diff changeset
   816
    char *username;
1611
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1610
diff changeset
   817
    username   = jid_get_username(settings_opt_get("jid"));
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   818
    password   = settings_opt_get("password");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   819
    resource   = strchr(lm_connection_get_jid(connection),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   820
                        JID_RESOURCE_SEPARATOR);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   821
    if (resource)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   822
      resource++;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   823
1611
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1610
diff changeset
   824
    if (!lm_connection_authenticate(lconnection, username, password, resource,
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   825
                                    connection_auth_cb, NULL, FALSE, &error)) {
1717
c12455fec611 Remove extra newlines in scr_LogPrint() calls
Mikael Berthe <mikael@lilotux.net>
parents: 1716
diff changeset
   826
      scr_LogPrint(LPRINT_LOGNORM, "Failed to authenticate: %s",
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   827
                   error->message);
1663
dcb0b4522ded Fix GError handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1656
diff changeset
   828
      g_error_free (error);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   829
      _try_to_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   830
    }
1611
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1610
diff changeset
   831
    g_free(username);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   832
  } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   833
    scr_LogPrint(LPRINT_LOGNORM, "There was an error while connecting.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   834
    _try_to_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   835
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   836
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   837
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   838
static void connection_close_cb(LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   839
                                LmDisconnectReason reason,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   840
                                gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   841
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   842
  const char *str;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   843
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   844
  switch (reason) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   845
  case LM_DISCONNECT_REASON_OK:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   846
          str = "LM_DISCONNECT_REASON_OK";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   847
          break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   848
  case LM_DISCONNECT_REASON_PING_TIME_OUT:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   849
          str = "LM_DISCONNECT_REASON_PING_TIME_OUT";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   850
          break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   851
  case LM_DISCONNECT_REASON_HUP:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   852
          str = "LM_DISCONNECT_REASON_HUP";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   853
          break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   854
  case LM_DISCONNECT_REASON_ERROR:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   855
          str = "LM_DISCONNECT_REASON_ERROR";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   856
          break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   857
  case LM_DISCONNECT_REASON_UNKNOWN:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   858
  default:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   859
          str = "LM_DISCONNECT_REASON_UNKNOWN";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   860
          break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   861
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   862
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   863
  if (reason != LM_DISCONNECT_REASON_OK)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   864
    _try_to_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   865
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   866
  // Free bookmarks
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   867
  if (bookmarks)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   868
    lm_message_node_unref(bookmarks);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   869
  bookmarks = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   870
  // Free roster
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   871
  roster_free();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   872
  if (rosternotes)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   873
    lm_message_node_unref(rosternotes);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   874
  rosternotes = NULL;
2118
51fde9c25401 Reset carbons when the connection is closed
Mikael Berthe <mikael@lilotux.net>
parents: 2113
diff changeset
   875
  // Reset carbons
51fde9c25401 Reset carbons when the connection is closed
Mikael Berthe <mikael@lilotux.net>
parents: 2113
diff changeset
   876
  carbons_reset();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   877
  // Update display
2292
f181418db215 Replace global variable update_roster with scr_update_roster()
franky
parents: 2291
diff changeset
   878
  scr_update_roster();
1780
e4378fbab5d7 Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents: 1747
diff changeset
   879
  scr_update_buddy_window();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   880
1715
1b6a04703fa0 Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents: 1711
diff changeset
   881
  if (!reason)
1b6a04703fa0 Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents: 1711
diff changeset
   882
    scr_LogPrint(LPRINT_LOGNORM, "Disconnected.");
1b6a04703fa0 Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents: 1711
diff changeset
   883
  else
1b6a04703fa0 Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents: 1711
diff changeset
   884
    scr_LogPrint(LPRINT_NORMAL, "Disconnected, reason: %d->'%s'", reason, str);
1b6a04703fa0 Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents: 1711
diff changeset
   885
1693
32c6d81bd1ef Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents: 1691
diff changeset
   886
  xmpp_setstatus(offline, NULL, mystatusmsg, TRUE);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   887
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   888
2166
f51c341a9da5 Simplify handle_state_events()
franky
parents: 2165
diff changeset
   889
static void handle_state_events(const char *bjid,
f51c341a9da5 Simplify handle_state_events()
franky
parents: 2165
diff changeset
   890
                                const char *resource,
f51c341a9da5 Simplify handle_state_events()
franky
parents: 2165
diff changeset
   891
                                LmMessageNode *node)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   892
{
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   893
#if defined XEP0085
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   894
  LmMessageNode *state_ns = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   895
  GSList *sl_buddy;
1866
e45d13074721 s/jep/xep/
Mikael Berthe <mikael@lilotux.net>
parents: 1818
diff changeset
   896
  struct xep0085 *xep85 = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   897
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   898
  sl_buddy = roster_find(bjid, jidsearch, ROSTER_TYPE_USER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   899
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   900
  if (!sl_buddy) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   901
    return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   902
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   903
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   904
  /* Let's see whether the contact supports XEP0085 */
2166
f51c341a9da5 Simplify handle_state_events()
franky
parents: 2165
diff changeset
   905
  xep85 = buddy_resource_xep85(sl_buddy->data, resource);
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   906
  if (xep85)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   907
    state_ns = lm_message_node_find_xmlns(node, NS_CHATSTATES);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   908
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   909
  if (!state_ns) { /* Sender does not use chat states */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   910
    return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   911
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   912
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   913
  xep85->support = CHATSTATES_SUPPORT_OK;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   914
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   915
  if (!strcmp(state_ns->name, "composing")) {
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   916
    xep85->last_state_rcvd = ROSTER_EVENT_COMPOSING;
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   917
  } else if (!strcmp(state_ns->name, "active")) {
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   918
    xep85->last_state_rcvd = ROSTER_EVENT_ACTIVE;
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   919
  } else if (!strcmp(state_ns->name, "paused")) {
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   920
    xep85->last_state_rcvd = ROSTER_EVENT_PAUSED;
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   921
  } else if (!strcmp(state_ns->name, "inactive")) {
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   922
    xep85->last_state_rcvd = ROSTER_EVENT_INACTIVE;
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   923
  } else if (!strcmp(state_ns->name, "gone")) {
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
   924
    xep85->last_state_rcvd = ROSTER_EVENT_GONE;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   925
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   926
2166
f51c341a9da5 Simplify handle_state_events()
franky
parents: 2165
diff changeset
   927
  buddy_resource_setevents(sl_buddy->data, resource, xep85->last_state_rcvd);
2292
f181418db215 Replace global variable update_roster with scr_update_roster()
franky
parents: 2291
diff changeset
   928
  scr_update_roster();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   929
#endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   930
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   931
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   932
static void gotmessage(LmMessageSubType type, const char *from,
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
   933
                       const char *body, const char *enc,
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
   934
                       const char *subject, time_t timestamp,
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
   935
                       LmMessageNode *node_signed, gboolean carbon)
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   936
{
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
   937
  char *bjid;
1689
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
   938
  const char *rname;
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
   939
  char *decrypted_pgp = NULL;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
   940
  char *decrypted_otr = NULL;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
   941
  int otr_msg = 0, free_msg = 0;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   942
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
   943
  bjid = jidtodisp(from);
441
51b8f10cfeb8 Handle g_locale_from_utf8() failures
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
   944
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 960
diff changeset
   945
  rname = strchr(from, JID_RESOURCE_SEPARATOR);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
   946
  if (rname) rname++;
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 818
diff changeset
   947
1042
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
   948
#ifdef HAVE_GPGME
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
   949
  if (gpg_enabled()) {
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
   950
    if (enc) {
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
   951
      decrypted_pgp = gpg_decrypt(enc);
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
   952
      if (decrypted_pgp)
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
   953
        body = decrypted_pgp;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
   954
    }
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
   955
    // Check signature of the unencrypted/decrypted message
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
   956
    if (node_signed)
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
   957
      check_signature(bjid, rname, node_signed, body);
1042
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
   958
  }
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
   959
#endif
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
   960
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   961
  // Check for unexpected groupchat messages
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   962
  // If we receive a groupchat message from a room we're not a member of,
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   963
  // this is probably a server issue and the best we can do is to send
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   964
  // a type unavailable.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   965
  if (type == LM_MESSAGE_SUB_TYPE_GROUPCHAT && !roster_getnickname(bjid)) {
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   966
    // It shouldn't happen, probably a server issue
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   967
    GSList *room_elt;
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   968
    char *mbuf;
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   969
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   970
    mbuf = g_strdup_printf("Unexpected groupchat packet!");
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   971
    scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
   972
    scr_WriteIncomingMessage(bjid, mbuf, 0, HBB_PREFIX_INFO, 0);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   973
    g_free(mbuf);
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   974
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   975
    // Send back an unavailable packet
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
   976
    xmpp_setstatus(offline, bjid, "", TRUE);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   977
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   978
    // MUC
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   979
    // Make sure this is a room (it can be a conversion user->room)
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
   980
    room_elt = roster_find(bjid, jidsearch, 0);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   981
    if (!room_elt) {
1665
1a4890514eb9 Clean up some dead assignments/dead variables
Ulrich Spörlein
parents: 1663
diff changeset
   982
      roster_add_user(bjid, NULL, NULL, ROSTER_TYPE_ROOM, sub_none, -1);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   983
    } else {
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   984
      buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   985
    }
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   986
2291
0d350e979bde Don't rebuild the buddylist multiple times before a screen refresh
franky
parents: 2282
diff changeset
   987
    buddylist_defer_build();
2292
f181418db215 Replace global variable update_roster with scr_update_roster()
franky
parents: 2291
diff changeset
   988
    scr_update_roster();
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
   989
    goto gotmessage_return;
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   990
  }
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
   991
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 818
diff changeset
   992
  // We don't call the message_in hook if 'block_unsubscribed' is true and
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 818
diff changeset
   993
  // this is a regular message from an unsubscribed user.
956
819396bebdf5 Do not block system messages when block_unsubscribed is set
Mikael Berthe <mikael@lilotux.net>
parents: 940
diff changeset
   994
  // System messages (from our server) are allowed.
1689
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
   995
  if (settings_opt_get_int("block_unsubscribed") &&
1895
7043542b3565 Do not block MUC private messages when 'block_unsubscribed' is set
Mikael Berthe <mikael@lilotux.net>
parents: 1869
diff changeset
   996
      (roster_gettype(bjid) != ROSTER_TYPE_ROOM) &&
1689
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
   997
      !(roster_getsubscription(bjid) & sub_from) &&
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
   998
      (type != LM_MESSAGE_SUB_TYPE_GROUPCHAT)) {
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
   999
    char *sbjid = jidtodisp(lm_connection_get_jid(lconnection));
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1000
    const char *server = strchr(sbjid, JID_DOMAIN_SEPARATOR);
1963
5d718766d2d6 Do not block system messages when block_unsubscribed is set
Mikael Berthe <mikael@lilotux.net>
parents: 1953
diff changeset
  1001
    if (server && g_strcmp0(server+1, bjid)) {
1689
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1002
      scr_LogPrint(LPRINT_LOGNORM, "Blocked a message from <%s>", bjid);
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1003
      g_free(sbjid);
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1004
      goto gotmessage_return;
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1005
    }
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1006
    g_free(sbjid);
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1007
  }
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1008
2044
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1009
#ifdef HAVE_LIBOTR
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1010
  if (otr_enabled()) {
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1011
    decrypted_otr = (char*)body;
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1012
    otr_msg = otr_receive(&decrypted_otr, bjid, &free_msg);
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1013
    if (!decrypted_otr) {
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1014
      goto gotmessage_return;
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1015
    }
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1016
    body = decrypted_otr;
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1017
  }
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1018
#endif
c00b919cf4ac Hopefully fix #94 (OTR leak when block_unsubscribed is set)
Mikael Berthe <mikael@lilotux.net>
parents: 2036
diff changeset
  1019
1689
b8f9481dd0fe Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1688
diff changeset
  1020
  { // format and pass message for further processing
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1021
    gchar *fullbody = NULL;
1484
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1022
    guint encrypted;
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1023
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1024
    if (decrypted_pgp)
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1025
      encrypted = ENCRYPTED_PGP;
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1026
    else if (otr_msg)
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1027
      encrypted = ENCRYPTED_OTR;
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1028
    else
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1029
      encrypted = 0;
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
  1030
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1031
    if (subject) {
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1032
      if (body)
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1033
        fullbody = g_strdup_printf("[%s]\n%s", subject, body);
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1034
      else
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1035
        fullbody = g_strdup_printf("[%s]\n", subject);
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1036
      body = fullbody;
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1037
    }
2156
a54c084af4d6 Add a "carbon" parameter to the hook-{pre,post}-message-in hooks
Mikael Berthe <mikael@lilotux.net>
parents: 2155
diff changeset
  1038
    hk_message_in(bjid, rname, timestamp, body, type, encrypted, carbon);
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1039
    g_free(fullbody);
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 818
diff changeset
  1040
  }
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
  1041
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
  1042
gotmessage_return:
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
  1043
  // Clean up and exit
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
  1044
  g_free(bjid);
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
  1045
  g_free(decrypted_pgp);
1333
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1330
diff changeset
  1046
  if (free_msg)
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
  1047
    g_free(decrypted_otr);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
  1048
}
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
  1049
420
04a0b450380b Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
  1050
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1051
static LmHandlerResult handle_messages(LmMessageHandler *handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1052
                                       LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1053
                                       LmMessage *m, gpointer user_data)
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
  1054
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1055
  const char *p, *from=lm_message_get_from(m);
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1056
  char *bjid, *res;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1057
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1058
  const char *body = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1059
  const char *enc = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1060
  const char *subject = NULL;
1001
dff25377c11f Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents: 999
diff changeset
  1061
  time_t timestamp = 0L;
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1062
  LmMessageSubType mstype;
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1063
  gboolean skip_process = FALSE;
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1064
  LmMessageNode *ns_signed = NULL;
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1065
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1066
  mstype = lm_message_get_sub_type(m);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1067
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1068
  body = lm_message_node_get_child_value(m->node, "body");
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1069
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1070
  x = lm_message_node_find_xmlns(m->node, NS_ENCRYPTED);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1071
  if (x && (p = lm_message_node_get_value(x)) != NULL)
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1072
    enc = p;
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1073
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1074
  // Get the bare-JID/room (bjid) and the resource/nickname (res)
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1075
  bjid = g_strdup(lm_message_get_from(m));
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1076
  res = strchr(bjid, JID_RESOURCE_SEPARATOR);
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1077
  if (res) *res++ = 0;
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1078
2090
16b04d64ec88 Add option to highlight timestamp added by server.
Hermitifier
parents: 2089
diff changeset
  1079
  // Timestamp?
16b04d64ec88 Add option to highlight timestamp added by server.
Hermitifier
parents: 2089
diff changeset
  1080
  timestamp = lm_message_node_get_timestamp(m->node);
16b04d64ec88 Add option to highlight timestamp added by server.
Hermitifier
parents: 2089
diff changeset
  1081
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1082
  p = lm_message_node_get_child_value(m->node, "subject");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1083
  if (p != NULL) {
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1084
    if (mstype != LM_MESSAGE_SUB_TYPE_GROUPCHAT) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1085
      // Chat message
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
  1086
      subject = p;
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1087
    } else {
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1088
      // Room topic
549
448e299e45da MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents: 547
diff changeset
  1089
      GSList *roombuddy;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1090
      gchar *mbuf;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1091
      const gchar *subj = p;
549
448e299e45da MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents: 547
diff changeset
  1092
      // Set the new topic
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1093
      roombuddy = roster_find(bjid, jidsearch, 0);
549
448e299e45da MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents: 547
diff changeset
  1094
      if (roombuddy)
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
  1095
        buddy_settopic(roombuddy->data, subj);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1096
      // Display inside the room window
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1097
      if (!res) {
560
64cb4de94972 Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents: 549
diff changeset
  1098
        // No specific resource (this is certainly history)
1896
c5ab9cf3819a [MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1895
diff changeset
  1099
        if (*subj)
c5ab9cf3819a [MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1895
diff changeset
  1100
          mbuf = g_strdup_printf("The topic has been set to: %s", subj);
c5ab9cf3819a [MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1895
diff changeset
  1101
        else
c5ab9cf3819a [MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1895
diff changeset
  1102
          mbuf = g_strdup_printf("The topic has been cleared");
560
64cb4de94972 Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents: 549
diff changeset
  1103
      } else {
1896
c5ab9cf3819a [MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1895
diff changeset
  1104
        if (*subj)
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1105
          mbuf = g_strdup_printf("%s has set the topic to: %s", res, subj);
1896
c5ab9cf3819a [MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1895
diff changeset
  1106
        else
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1107
          mbuf = g_strdup_printf("%s has cleared the topic", res);
560
64cb4de94972 Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents: 549
diff changeset
  1108
      }
2090
16b04d64ec88 Add option to highlight timestamp added by server.
Hermitifier
parents: 2089
diff changeset
  1109
      scr_WriteIncomingMessage(bjid, mbuf, timestamp,
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1110
                               HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1111
      if (settings_opt_get_int("log_muc_conf"))
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1112
        hlog_write_message(bjid, 0, -1, mbuf);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1113
      g_free(mbuf);
732
ab623c2df964 MUC: Update the chat status line when the topic is updated
Mikael Berthe <mikael@lilotux.net>
parents: 724
diff changeset
  1114
      // The topic is displayed in the chat status line, so refresh now.
1780
e4378fbab5d7 Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents: 1747
diff changeset
  1115
      scr_update_chat_status(TRUE);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1116
    }
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1117
  }
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1118
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1119
  if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1120
    x = lm_message_node_get_child(m->node, "error");
1800
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1780
diff changeset
  1121
    display_server_error(x, from);
2165
db6ca1e1e082 Remove support for obsolete XEP 22
franky
parents: 2161
diff changeset
  1122
#ifdef XEP0085
1691
b2e0083891cc Replace JEP with XEP
Mikael Berthe <mikael@lilotux.net>
parents: 1689
diff changeset
  1123
    // If the XEP85/22 support is probed, set it back to unknown so that
999
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
  1124
    // we probe it again.
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
  1125
    chatstates_reset_probed(from);
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
  1126
#endif
1132
1650056b96fc Do not use chat states of error messages :)
Mikael Berthe <mikael@lilotux.net>
parents: 1128
diff changeset
  1127
  } else {
2166
f51c341a9da5 Simplify handle_state_events()
franky
parents: 2165
diff changeset
  1128
    handle_state_events(bjid, res, m->node);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1129
  }
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1130
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1131
  // Check for carbons!
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1132
  x = lm_message_node_find_xmlns(m->node, NS_CARBONS_2);
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1133
  gboolean carbons = FALSE;
2209
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1134
  if (x && (!g_strcmp0(x->name, "received") || !g_strcmp0(x->name, "sent"))) {
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1135
    LmMessageNode *xenc;
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1136
    const char *carbon_name = x->name;
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1137
    carbons = TRUE;
2295
eb96666502f5 Carbons: Check barejid in sent messages, too
franky
parents: 2294
diff changeset
  1138
eb96666502f5 Carbons: Check barejid in sent messages, too
franky
parents: 2294
diff changeset
  1139
    // Check envelope JID for carbon messages
eb96666502f5 Carbons: Check barejid in sent messages, too
franky
parents: 2294
diff changeset
  1140
    if (!jid_equal(lm_connection_get_jid(lconnection), bjid)) {
eb96666502f5 Carbons: Check barejid in sent messages, too
franky
parents: 2294
diff changeset
  1141
      scr_LogPrint(LPRINT_LOGNORM, "Received invalid carbon copy from %s.", bjid);
eb96666502f5 Carbons: Check barejid in sent messages, too
franky
parents: 2294
diff changeset
  1142
      goto handle_messages_return;
eb96666502f5 Carbons: Check barejid in sent messages, too
franky
parents: 2294
diff changeset
  1143
    }
eb96666502f5 Carbons: Check barejid in sent messages, too
franky
parents: 2294
diff changeset
  1144
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1145
    // Go 1 level deeper to the forwarded message
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1146
    x = lm_message_node_find_xmlns(x, NS_FORWARD);
2209
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1147
    if (x)
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1148
      x = lm_message_node_get_child(x, "message");
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1149
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1150
    if (!x) {
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1151
      scr_LogPrint(LPRINT_LOGNORM,
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1152
                   "Could not read carbon message!  Please fill a bug.");
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1153
      goto handle_messages_return;
412322678d59 Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents: 2203
diff changeset
  1154
    }
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1155
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1156
    xenc = lm_message_node_find_xmlns(x, NS_ENCRYPTED);
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1157
    if (xenc && (p = lm_message_node_get_value(xenc)) != NULL)
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1158
      enc = p;
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1159
2303
4f3821bda633 LM: Use get_child in place of find_child
Mikael Berthe <mikael@lilotux.net>
parents: 2295
diff changeset
  1160
    body = lm_message_node_get_child_value(x, "body");
4f3821bda633 LM: Use get_child in place of find_child
Mikael Berthe <mikael@lilotux.net>
parents: 2295
diff changeset
  1161
    subject = lm_message_node_get_child_value(x, "subject");
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1162
    if (body && *body && !subject)
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1163
      ns_signed = lm_message_node_find_xmlns(x, NS_SIGNED);
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1164
    else
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1165
      skip_process = TRUE;
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1166
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1167
    // Parse a message that is send to one of our other resources
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1168
    if (!g_strcmp0(carbon_name, "received")) {
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1169
      from = lm_message_node_get_attribute(x, "from");
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1170
      if (!from) {
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1171
        scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy!");
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1172
        goto handle_messages_return;
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1173
      }
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1174
      g_free(bjid);
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1175
      bjid = g_strdup(from);
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1176
      res = strchr(bjid, JID_RESOURCE_SEPARATOR);
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1177
      if (res) *res++ = 0;
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1178
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1179
      // Try to handle forwarded chat state messages
2166
f51c341a9da5 Simplify handle_state_events()
franky
parents: 2165
diff changeset
  1180
      handle_state_events(from, res, x);
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1181
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1182
      scr_LogPrint(LPRINT_DEBUG, "Received incoming carbon from <%s>", from);
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1183
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1184
    } else if (!g_strcmp0(carbon_name, "sent")) {
2195
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2194
diff changeset
  1185
#ifdef HAVE_GPGME
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2194
diff changeset
  1186
      char *decrypted_pgp = NULL;
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2194
diff changeset
  1187
#endif
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1188
      guint encrypted = 0;
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1189
      const char *to= lm_message_node_get_attribute(x, "to");
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1190
      if (!to) {
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1191
        scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy!");
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1192
        goto handle_messages_return;
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1193
      }
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1194
      g_free(bjid);
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1195
      bjid = jidtodisp(to);
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1196
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1197
#ifdef HAVE_GPGME
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1198
      if (gpg_enabled()) {
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1199
        if (enc) {
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1200
          decrypted_pgp = gpg_decrypt(enc);
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1201
          if (decrypted_pgp) {
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1202
            body = decrypted_pgp;
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1203
            encrypted = ENCRYPTED_PGP;
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1204
          }
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1205
        }
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1206
        /*
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1207
        // Check messsage signature
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1208
        // This won't work here, since check_signature wasn't intended
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1209
        // to be used to check our own messages.
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1210
        if (ns_signed)
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1211
          check_signature(ME, NULL, ns_signed, body);
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1212
        */
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1213
      }
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1214
#endif
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1215
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1216
      if (body && *body)
2190
ee3a40ffcd8b New option: 'clear_unread_on_carbon'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2189
diff changeset
  1217
        hk_message_out(bjid, NULL, timestamp, body, encrypted, TRUE, NULL);
2113
44c4b850263a Cosmetics
Mikael Berthe <mikael@lilotux.net>
parents: 2109
diff changeset
  1218
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1219
      scr_LogPrint(LPRINT_DEBUG, "Received outgoing carbon for <%s>", to);
2195
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2194
diff changeset
  1220
#ifdef HAVE_GPGME
2189
3b91f6a100f5 PGP: Decrypt our own encrypted messages when Carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
  1221
      g_free(decrypted_pgp);
2195
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2194
diff changeset
  1222
#endif
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1223
      goto handle_messages_return;
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1224
    }
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1225
  } else { // Not a Carbon
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1226
    ns_signed = lm_message_node_find_xmlns(m->node, NS_SIGNED);
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1227
  }
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1228
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1229
  // Do not process the message if some fields are missing
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1230
  if (!from || (!body && !subject))
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1231
    skip_process = TRUE;
2105
1cc84780eb5f Very basic carbons support is hacked into mcabber.
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2103
diff changeset
  1232
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1233
  if (!skip_process) {
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1234
    gotmessage(mstype, from, body, enc, subject, timestamp,
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1235
               ns_signed, carbons);
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1236
  }
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1237
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1238
  // We're done if it was a Carbon forwarded message
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1239
  if (carbons)
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1240
    goto handle_messages_return;
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1241
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1242
  // Report received message if message delivery receipt was requested
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1243
  if (lm_message_node_get_child(m->node, "request") &&
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1244
      (roster_getsubscription(bjid) & sub_from)) {
1869
fe385f2cfb93 Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents: 1866
diff changeset
  1245
    const gchar *mid;
fe385f2cfb93 Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents: 1866
diff changeset
  1246
    LmMessageNode *y;
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
  1247
    LmMessage *rcvd = lm_message_new(from, LM_MESSAGE_TYPE_MESSAGE);
1869
fe385f2cfb93 Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents: 1866
diff changeset
  1248
    mid = lm_message_get_id(m);
fe385f2cfb93 Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents: 1866
diff changeset
  1249
    // For backward compatibility (XEP184 < v.1.1):
fe385f2cfb93 Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents: 1866
diff changeset
  1250
    lm_message_node_set_attribute(rcvd->node, "id", mid);
fe385f2cfb93 Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents: 1866
diff changeset
  1251
    y = lm_message_node_add_child(rcvd->node, "received", NULL);
fe385f2cfb93 Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents: 1866
diff changeset
  1252
    lm_message_node_set_attribute(y, "xmlns", NS_RECEIPTS);
fe385f2cfb93 Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents: 1866
diff changeset
  1253
    lm_message_node_set_attribute(y, "id", mid);
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
  1254
    lm_connection_send(connection, rcvd, NULL);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
  1255
    lm_message_unref(rcvd);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
  1256
  }
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1257
2032
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1258
  { // xep184 receipt confirmation
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1259
    LmMessageNode *received = lm_message_node_get_child(m->node, "received");
2113
44c4b850263a Cosmetics
Mikael Berthe <mikael@lilotux.net>
parents: 2109
diff changeset
  1260
    if (received && !g_strcmp0(lm_message_node_get_attribute(received, "xmlns"),
44c4b850263a Cosmetics
Mikael Berthe <mikael@lilotux.net>
parents: 2109
diff changeset
  1261
                               NS_RECEIPTS)) {
2032
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1262
      char       *jid = jidtodisp(from);
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1263
      const char *id  = lm_message_node_get_attribute(received, "id");
2036
f8958ab545ac Make message delivery receipts more backward-compatible
Mikael Berthe <mikael@lilotux.net>
parents: 2033
diff changeset
  1264
      // This is for backward compatibility; if the remote client didn't add
f8958ab545ac Make message delivery receipts more backward-compatible
Mikael Berthe <mikael@lilotux.net>
parents: 2033
diff changeset
  1265
      // the id as an attribute of the 'received' tag, we use the message id:
f8958ab545ac Make message delivery receipts more backward-compatible
Mikael Berthe <mikael@lilotux.net>
parents: 2033
diff changeset
  1266
      if (!id)
f8958ab545ac Make message delivery receipts more backward-compatible
Mikael Berthe <mikael@lilotux.net>
parents: 2033
diff changeset
  1267
        id = lm_message_get_id(m);
2032
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1268
      scr_remove_receipt_flag(jid, id);
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1269
      g_free(jid);
2141
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1270
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1271
#ifdef MODULES_ENABLE
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1272
      {
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1273
        hk_arg_t args[] = {
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1274
          { "jid", from },
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1275
          { NULL, NULL },
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1276
        };
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1277
        hk_run_handlers("hook-mdr-received", args);
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1278
      }
e702073612de Add "hook-mdr-received" hook
Mikael Berthe <mikael@lilotux.net>
parents: 2138
diff changeset
  1279
#endif
2032
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1280
    }
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1281
  }
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2027
diff changeset
  1282
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1283
  if (from) {
1908
e2def760c6d0 Introduce NS_MUC_{USER,ADMIN,OWNER}
Mikael Berthe <mikael@lilotux.net>
parents: 1906
diff changeset
  1284
    x = lm_message_node_find_xmlns(m->node, NS_MUC_USER);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1285
    if (x && !strcmp(x->name, "x"))
1953
9f443617e96b Improve MUC support (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1951
diff changeset
  1286
      got_muc_message(from, x, timestamp);
1951
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1287
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1288
    x = lm_message_node_find_xmlns(m->node, NS_X_CONFERENCE);
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1289
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1290
    if (x && !strcmp(x->name, "x")) {
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1291
      const char *jid = lm_message_node_get_attribute(x, "jid");
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1292
      if (jid) {
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1293
        const char *reason = lm_message_node_get_attribute(x, "reason");
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1294
        const char *password = lm_message_node_get_attribute(x, "password");
2027
107d39cd968b Update a comment
Mikael Berthe <mikael@lilotux.net>
parents: 2023
diff changeset
  1295
        // We won't send decline stanzas as it is a Direct Invitation
1951
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1296
        got_invite(from, jid, reason, password, FALSE);
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1297
      }
1a01a7ef4e43 Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents: 1937
diff changeset
  1298
    }
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1299
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1300
2151
8819bab88053 Improve Message Carbons support
Mikael Berthe <mikael@lilotux.net>
parents: 2141
diff changeset
  1301
handle_messages_return:
1984
b0470ef8669b XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents: 1979
diff changeset
  1302
  g_free(bjid);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1303
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1304
}
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1305
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1306
static LmHandlerResult cb_caps(LmMessageHandler *h, LmConnection *c,
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1307
                               LmMessage *m, gpointer user_data)
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1308
{
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1309
  char *ver = user_data;
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1310
  char *hash;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1311
  const char *from = lm_message_get_from(m);
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1312
  char *bjid = jidtodisp(from);
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1313
  LmMessageSubType mstype = lm_message_get_sub_type(m);
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1314
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1315
  hash = strchr(ver, ',');
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1316
  if (hash)
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1317
    *hash++ = '\0';
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1318
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1319
  if (mstype == LM_MESSAGE_SUB_TYPE_RESULT) {
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1320
    LmMessageNode *info;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1321
    LmMessageNode *query = lm_message_node_get_child(m->node, "query");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1322
2210
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
  1323
    if (caps_has_hash(ver, bjid) || !query)
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1324
      goto caps_callback_return;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1325
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1326
    caps_add(ver);
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1327
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1328
    info = lm_message_node_get_child(query, "identity");
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1329
    while (info) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1330
      if (!g_strcmp0(info->name, "identity"))
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1331
        caps_add_identity(ver, lm_message_node_get_attribute(info, "category"),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1332
                          lm_message_node_get_attribute(info, "name"),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1333
                          lm_message_node_get_attribute(info, "type"),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1334
                          lm_message_node_get_attribute(info, "xml:lang"));
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1335
        info = info->next;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1336
    }
2033
a37fbc3ac6aa Delivery receipts: Use LM-generated messages id
Mikael Berthe <mikael@lilotux.net>
parents: 2032
diff changeset
  1337
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1338
    info = lm_message_node_get_child(query, "feature");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1339
    while (info) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1340
      if (!g_strcmp0(info->name, "feature"))
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1341
        caps_add_feature(ver, lm_message_node_get_attribute(info, "var"));
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1342
      info = info->next;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1343
    }
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1344
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1345
    info = lm_message_node_get_child(query, "x");
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1346
    {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1347
      LmMessageNode *field;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1348
      LmMessageNode *value;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1349
      const char *formtype, *var;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1350
      while (info) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1351
        if (!g_strcmp0(info->name, "x")
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1352
            && !g_strcmp0(lm_message_node_get_attribute(info, "type"),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1353
                          "result")
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1354
            && !g_strcmp0(lm_message_node_get_attribute(info, "xmlns"),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1355
                          "jabber:x:data")) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1356
          field = lm_message_node_get_child(info, "field");
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1357
          formtype = NULL;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1358
          while (field) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1359
            if (!g_strcmp0(field->name, "field")
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1360
                && !g_strcmp0(lm_message_node_get_attribute(field, "var"),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1361
                              "FORM_TYPE")
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1362
                && !g_strcmp0(lm_message_node_get_attribute(field, "type"),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1363
                              "hidden")) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1364
              value = lm_message_node_get_child(field, "value");
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1365
              if (value)
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1366
                formtype = lm_message_node_get_value(value);
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1367
            }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1368
            field = field->next;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1369
          }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1370
          if (formtype) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1371
            caps_add_dataform(ver, formtype);
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1372
            field = lm_message_node_get_child(info, "field");
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1373
            while (field) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1374
              var = lm_message_node_get_attribute(field, "var");
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1375
              if (!g_strcmp0(field->name, "field")
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1376
                  && (g_strcmp0(var, "FORM_TYPE")
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1377
                  || g_strcmp0(lm_message_node_get_attribute(field, "type"),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1378
                               "hidden"))) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1379
                value = lm_message_node_get_child(field, "value");
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1380
                while (value) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1381
                  if (!g_strcmp0(value->name, "value"))
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1382
                    caps_add_dataform_field(ver, formtype, var,
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1383
                      lm_message_node_get_value(value));
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1384
                  value = value->next;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1385
                }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1386
              }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1387
              field = field->next;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1388
            }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1389
          }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1390
        }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1391
        info = info->next;
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1392
      }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1393
    }
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1394
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1395
    if (caps_verify(ver, hash))
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1396
      caps_copy_to_persistent(ver, lm_message_node_to_string(query));
2033
a37fbc3ac6aa Delivery receipts: Use LM-generated messages id
Mikael Berthe <mikael@lilotux.net>
parents: 2032
diff changeset
  1397
    else
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1398
      caps_move_to_local(ver, bjid);
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1399
  }
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1400
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1401
caps_callback_return:
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1402
  g_free(bjid);
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1403
  g_free(ver);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1404
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1405
}
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1406
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1407
static LmHandlerResult handle_presence(LmMessageHandler *handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1408
                                       LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1409
                                       LmMessage *m, gpointer user_data)
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
  1410
{
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1411
  char *bjid;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1412
  const char *from, *rname, *p=NULL, *ustmsg=NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1413
  enum imstatus ust;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1414
  char bpprio;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1415
  time_t timestamp = 0L;
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1416
  LmMessageNode *muc_packet, *caps;
1910
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1417
  LmMessageSubType mstype = lm_message_get_sub_type(m);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1418
1644
73fc85ea0b4b Do not send disco requests to offline resources
Mikael Berthe <mikael@lilotux.net>
parents: 1637
diff changeset
  1419
  // Check for MUC presence packet
1908
e2def760c6d0 Introduce NS_MUC_{USER,ADMIN,OWNER}
Mikael Berthe <mikael@lilotux.net>
parents: 1906
diff changeset
  1420
  muc_packet = lm_message_node_find_xmlns(m->node, NS_MUC_USER);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1421
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1422
  from = lm_message_get_from(m);
1910
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1423
  if (!from) {
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1424
    scr_LogPrint(LPRINT_LOGNORM, "Unexpected presence packet!");
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1425
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1426
    if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1427
      display_server_error(lm_message_node_get_child(m->node, "error"),
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1428
                           lm_message_get_from(m));
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1429
      return LM_HANDLER_RESULT_REMOVE_MESSAGE;
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1430
    }
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1431
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1432
  }
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
  1433
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
  1434
  rname = strchr(from, JID_RESOURCE_SEPARATOR);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1435
  if (rname) rname++;
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
  1436
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1437
  if (settings_opt_get_int("ignore_self_presence")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1438
    const char *self_fjid = lm_connection_get_jid(connection);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1439
    if (self_fjid && !strcasecmp(self_fjid, from)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1440
      return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Ignoring self presence
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
  1441
    }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
  1442
  }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
  1443
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1444
  bjid = jidtodisp(from);
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
  1445
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1446
  if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1447
    LmMessageNode *x;
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1448
    scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", bjid);
2303
4f3821bda633 LM: Use get_child in place of find_child
Mikael Berthe <mikael@lilotux.net>
parents: 2295
diff changeset
  1449
    x = lm_message_node_get_child(m->node, "error");
1800
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1780
diff changeset
  1450
    display_server_error(x, from);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1451
    // Let's check it isn't a nickname conflict.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1452
    // XXX Note: We should handle the <conflict/> string condition.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1453
    if ((p = lm_message_node_get_attribute(x, "code")) != NULL) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1454
      if (atoi(p) == 409) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1455
        // 409 = conflict (nickname is in use or registered by another user)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1456
        // If we are not inside this room, we should reset the nickname
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1457
        GSList *room_elt = roster_find(bjid, jidsearch, 0);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1458
        if (room_elt && !buddy_getinsideroom(room_elt->data))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1459
          buddy_setnickname(room_elt->data, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1460
      }
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
  1461
    }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
  1462
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1463
    g_free(bjid);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1464
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
  1465
  }
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
  1466
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1467
  p = lm_message_node_get_child_value(m->node, "priority");
2075
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1468
  if (p && *p) {
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1469
    int rawprio = atoi(p);
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1470
    if (rawprio > 127)
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1471
      bpprio = 127;
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1472
    else if (rawprio < -128)
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1473
      bpprio = -128;
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1474
    else
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1475
      bpprio = rawprio;
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1476
  } else {
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1477
    bpprio = 0;
f52b47f29ca0 Round high priority
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2044
diff changeset
  1478
  }
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
  1479
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1480
  ust = available;
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
  1481
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1482
  p = lm_message_node_get_child_value(m->node, "show");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1483
  if (p) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1484
    if (!strcmp(p, "away"))      ust = away;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1485
    else if (!strcmp(p, "dnd"))  ust = dontdisturb;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1486
    else if (!strcmp(p, "xa"))   ust = notavail;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1487
    else if (!strcmp(p, "chat")) ust = freeforchat;
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
  1488
  }
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
  1489
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1490
  if (mstype == LM_MESSAGE_SUB_TYPE_UNAVAILABLE)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1491
    ust = offline;
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
  1492
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1493
  ustmsg = lm_message_node_get_child_value(m->node, "status");
1899
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1896
diff changeset
  1494
  if (ustmsg && !*ustmsg)
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1896
diff changeset
  1495
    ustmsg = NULL;
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
  1496
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1497
  // Timestamp?
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1498
  timestamp = lm_message_node_get_timestamp(m->node);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1499
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1500
  if (muc_packet) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1501
    // This is a MUC presence message
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1502
    handle_muc_presence(from, muc_packet, bjid, rname,
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1503
                        ust, ustmsg, timestamp, bpprio);
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
  1504
  } else {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1505
    // Not a MUC message, so this is a regular buddy...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1506
    // Call hk_statuschange() if status has changed or if the
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1507
    // status message is different
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1508
    const char *msg;
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1509
    msg = roster_getstatusmsg(bjid, rname);
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1510
    if ((ust != roster_getstatus(bjid, rname)) ||
1728
15b3834cbe5f Handle priority changes when the contact status doesn't change
Mikael Berthe <mikael@lilotux.net>
parents: 1722
diff changeset
  1511
        (!ustmsg && msg && msg[0]) ||
15b3834cbe5f Handle priority changes when the contact status doesn't change
Mikael Berthe <mikael@lilotux.net>
parents: 1722
diff changeset
  1512
        (ustmsg && (!msg || strcmp(ustmsg, msg))) ||
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1513
        (bpprio != roster_getprio(bjid, rname)))
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1514
      hk_statuschange(bjid, rname, bpprio, timestamp, ust, ustmsg);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1515
    // Presence signature processing
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1516
    if (!ustmsg)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1517
      ustmsg = ""; // Some clients omit the <status/> element :-(
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1518
    check_signature(bjid, rname,
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1519
                    lm_message_node_find_xmlns(m->node, NS_SIGNED), ustmsg);
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1520
  }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1521
1644
73fc85ea0b4b Do not send disco requests to offline resources
Mikael Berthe <mikael@lilotux.net>
parents: 1637
diff changeset
  1522
  // XEP-0115 Entity Capabilities
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1523
  caps = lm_message_node_find_xmlns(m->node, NS_CAPS);
1644
73fc85ea0b4b Do not send disco requests to offline resources
Mikael Berthe <mikael@lilotux.net>
parents: 1637
diff changeset
  1524
  if (caps && ust != offline) {
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1525
    const char *ver = lm_message_node_get_attribute(caps, "ver");
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1526
    const char *hash = lm_message_node_get_attribute(caps, "hash");
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1527
    GSList *sl_buddy = NULL;
1917
33d1c42cf07e Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents: 1911
diff changeset
  1528
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1529
    if (!hash) {
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1530
      // No support for legacy format
1917
33d1c42cf07e Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents: 1911
diff changeset
  1531
      goto handle_presence_return;
33d1c42cf07e Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents: 1911
diff changeset
  1532
    }
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1533
    if (!ver || !g_strcmp0(ver, "") || !g_strcmp0(hash, ""))
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1534
      goto handle_presence_return;
1917
33d1c42cf07e Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents: 1911
diff changeset
  1535
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1536
    if (rname)
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1537
      sl_buddy = roster_find(bjid, jidsearch, ROSTER_TYPE_USER);
1644
73fc85ea0b4b Do not send disco requests to offline resources
Mikael Berthe <mikael@lilotux.net>
parents: 1637
diff changeset
  1538
    // Only cache the caps if the user is on the roster
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1539
    if (sl_buddy && buddy_getonserverflag(sl_buddy->data)) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1540
      buddy_resource_setcaps(sl_buddy->data, rname, ver);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1541
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1542
      if (!caps_has_hash(ver, bjid) && !caps_restore_from_persistent(ver)) {
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1543
        char *node;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1544
        LmMessageHandler *handler;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1545
        LmMessage *iq = lm_message_new_with_sub_type(from, LM_MESSAGE_TYPE_IQ,
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1546
                                                     LM_MESSAGE_SUB_TYPE_GET);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1547
        node = g_strdup_printf("%s#%s",
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1548
                               lm_message_node_get_attribute(caps, "node"),
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1549
                               ver);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1550
        lm_message_node_set_attributes
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1551
                (lm_message_node_add_child(iq->node, "query", NULL),
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1552
                 "xmlns", NS_DISCO_INFO,
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1553
                 "node", node,
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1554
                 NULL);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1555
        g_free(node);
1999
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1556
        handler = lm_message_handler_new(cb_caps,
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1557
                                         g_strdup_printf("%s,%s",ver,hash),
51f032d5ca22 Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents: 1998
diff changeset
  1558
                                         NULL);
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1559
        lm_connection_send_with_reply(connection, iq, handler, NULL);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1560
        lm_message_unref(iq);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1561
        lm_message_handler_unref(handler);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1562
      }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1563
    }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1564
  }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1565
1917
33d1c42cf07e Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents: 1911
diff changeset
  1566
handle_presence_return:
1731
4fbfae993c24 Improve login process
Mikael Berthe <mikael@lilotux.net>
parents: 1730
diff changeset
  1567
  g_free(bjid);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1568
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1569
}
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1570
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1571
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1572
static LmHandlerResult handle_iq(LmMessageHandler *handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1573
                                 LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1574
                                 LmMessage *m, gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1575
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1576
  int i;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1577
  const char *xmlns = NULL;
2212
778280b01bcb Fix a few memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 2210
diff changeset
  1578
  char *nodestr;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1579
  LmMessageNode *x;
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1580
  LmMessageSubType mstype = lm_message_get_sub_type(m);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1581
1647
cfa1fff86f78 Reorder processing in handle_iq()
Mikael Berthe <mikael@lilotux.net>
parents: 1646
diff changeset
  1582
  if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
1800
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1780
diff changeset
  1583
    display_server_error(lm_message_node_get_child(m->node, "error"),
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1780
diff changeset
  1584
                         lm_message_get_from(m));
1647
cfa1fff86f78 Reorder processing in handle_iq()
Mikael Berthe <mikael@lilotux.net>
parents: 1646
diff changeset
  1585
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
cfa1fff86f78 Reorder processing in handle_iq()
Mikael Berthe <mikael@lilotux.net>
parents: 1646
diff changeset
  1586
  }
cfa1fff86f78 Reorder processing in handle_iq()
Mikael Berthe <mikael@lilotux.net>
parents: 1646
diff changeset
  1587
1904
9a3d7a7dada2 Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents: 1902
diff changeset
  1588
  if (mstype == LM_MESSAGE_SUB_TYPE_RESULT) {
2212
778280b01bcb Fix a few memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 2210
diff changeset
  1589
    nodestr = lm_message_node_to_string(m->node);
778280b01bcb Fix a few memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 2210
diff changeset
  1590
    scr_LogPrint(LPRINT_DEBUG, "Unhandled IQ result? %s", nodestr);
778280b01bcb Fix a few memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 2210
diff changeset
  1591
    g_free(nodestr);
1904
9a3d7a7dada2 Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents: 1902
diff changeset
  1592
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
9a3d7a7dada2 Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents: 1902
diff changeset
  1593
  }
9a3d7a7dada2 Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents: 1902
diff changeset
  1594
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1595
  for (x = m->node->children; x; x=x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1596
    xmlns = lm_message_node_get_attribute(x, "xmlns");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1597
    if (xmlns)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1598
      for (i=0; iq_handlers[i].xmlns; ++i)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1599
        if (!strcmp(iq_handlers[i].xmlns, xmlns))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1600
          return iq_handlers[i].handler(NULL, connection, m, user_data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1601
    xmlns = NULL;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1602
  }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1603
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1604
  if ((mstype == LM_MESSAGE_SUB_TYPE_SET) ||
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1605
      (mstype == LM_MESSAGE_SUB_TYPE_GET))
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1606
    send_iq_error(connection, m, XMPP_ERROR_NOT_IMPLEMENTED);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1607
2212
778280b01bcb Fix a few memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 2210
diff changeset
  1608
  nodestr = lm_message_node_to_string(m->node);
778280b01bcb Fix a few memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 2210
diff changeset
  1609
  scr_LogPrint(LPRINT_DEBUG, "Unhandled IQ: %s", nodestr);
778280b01bcb Fix a few memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 2210
diff changeset
  1610
  g_free(nodestr);
1621
eec2fa456d0f Do not print Unhandled IQ results to the log window
Mikael Berthe <mikael@lilotux.net>
parents: 1616
diff changeset
  1611
1904
9a3d7a7dada2 Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents: 1902
diff changeset
  1612
  scr_LogPrint(LPRINT_NORMAL, "Received unhandled IQ request from <%s>.",
9a3d7a7dada2 Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents: 1902
diff changeset
  1613
               lm_message_get_from(m));
1721
8cfc2a386b1f Do not display Unhandled IQ request stanzas in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 1720
diff changeset
  1614
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1615
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1616
}
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
  1617
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1618
static LmHandlerResult handle_s10n(LmMessageHandler *handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1619
                                   LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1620
                                   LmMessage *m, gpointer user_data)
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1621
{
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1622
  char *r;
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1623
  char *buf;
818
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
  1624
  int newbuddy;
1906
5d37cee8c6c6 Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents: 1905
diff changeset
  1625
  guint hook_result;
1910
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1626
  LmMessageSubType mstype = lm_message_get_sub_type(m);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1627
  const char *from = lm_message_get_from(m);
1906
5d37cee8c6c6 Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents: 1905
diff changeset
  1628
  const char *msg = lm_message_node_get_child_value(m->node, "status");
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1629
1910
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1630
  if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1631
    display_server_error(lm_message_node_get_child(m->node, "error"),
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1632
                         lm_message_get_from(m));
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1633
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1634
  }
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1635
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1636
  if (!from) {
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1637
    scr_LogPrint(LPRINT_DEBUG, "handle_s10n: Unexpected presence packet!");
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1638
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1909
diff changeset
  1639
  }
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1640
  r = jidtodisp(from);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1641
818
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
  1642
  newbuddy = !roster_find(r, jidsearch, 0);
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
  1643
1906
5d37cee8c6c6 Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents: 1905
diff changeset
  1644
  hook_result = hk_subscription(mstype, r, msg);
5d37cee8c6c6 Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents: 1905
diff changeset
  1645
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1646
  if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1647
    /* The sender wishes to subscribe to our presence */
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1648
1906
5d37cee8c6c6 Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents: 1905
diff changeset
  1649
    if (hook_result) {
5d37cee8c6c6 Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents: 1905
diff changeset
  1650
      g_free(r);
5d37cee8c6c6 Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents: 1905
diff changeset
  1651
      return LM_HANDLER_RESULT_REMOVE_MESSAGE;
5d37cee8c6c6 Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents: 1905
diff changeset
  1652
    }
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1653
617
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
  1654
    buf = g_strdup_printf("<%s> wants to subscribe to your presence updates",
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
  1655
                          from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
  1656
    scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
617
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
  1657
    scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
  1658
    g_free(buf);
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
  1659
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1660
    if (msg) {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
  1661
      buf = g_strdup_printf("<%s> said: %s", from, msg);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
  1662
      scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
  1663
      replace_nl_with_dots(buf);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
  1664
      scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
  1665
      g_free(buf);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1666
    }
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1667
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
  1668
    // Create a new event item
1685
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1669
    {
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1670
      const char *id;
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1671
      char *desc = g_strdup_printf("<%s> wants to subscribe to your "
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1672
                                   "presence updates", r);
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1673
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1674
      id = evs_new(desc, NULL, 0, evscallback_subscription, g_strdup(r),
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1675
                   (GDestroyNotify)g_free);
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1676
      g_free(desc);
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1677
      if (id)
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1678
        buf = g_strdup_printf("Please use /event %s accept|reject", id);
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1679
      else
1342df44c814 Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1684
diff changeset
  1680
        buf = g_strdup_printf("Unable to create a new event!");
751
4a7271e69694 Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents: 749
diff changeset
  1681
    }
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
  1682
    scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
617
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
  1683
    scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1684
    g_free(buf);
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1685
  } else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE) {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1686
    /* The sender is unsubscribing from our presence */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1687
    xmpp_send_s10n(from, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1688
    buf = g_strdup_printf("<%s> is unsubscribing from your "
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1689
                          "presence updates", from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
  1690
    scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1691
    scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1692
    g_free(buf);
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1693
  } else if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBED) {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1694
    /* The sender has allowed us to receive their presence */
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1695
    buf = g_strdup_printf("<%s> has allowed you to receive their "
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1696
                          "presence updates", from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
  1697
    scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1698
    scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1699
    g_free(buf);
1646
472cd6ac20fa Small optimization
Mikael Berthe <mikael@lilotux.net>
parents: 1644
diff changeset
  1700
  } else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED) {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1701
    /* The subscription request has been denied or a previously-granted
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1702
       subscription has been cancelled */
610
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 609
diff changeset
  1703
    roster_unsubscribed(from);
2292
f181418db215 Replace global variable update_roster with scr_update_roster()
franky
parents: 2291
diff changeset
  1704
    scr_update_roster();
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1705
    buf = g_strdup_printf("<%s> has cancelled your subscription to "
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1706
                          "their presence updates", from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
  1707
    scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1708
    scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1709
    g_free(buf);
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 600
diff changeset
  1710
  } else {
1634
81e2d8a9106b Add missing g_free()
Mikael Berthe <mikael@lilotux.net>
parents: 1633
diff changeset
  1711
    g_free(r);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1712
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
818
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
  1713
  }
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
  1714
1010
54405d09b15a Add a call to buddylist_build()
Mikael Berthe <mikael@lilotux.net>
parents: 1008
diff changeset
  1715
  if (newbuddy)
2292
f181418db215 Replace global variable update_roster with scr_update_roster()
franky
parents: 2291
diff changeset
  1716
    scr_update_roster();
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
  1717
  g_free(r);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1718
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1719
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1720
1729
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1728
diff changeset
  1721
// TODO: Use the enum of loudmouth, when it's included in the header...
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1722
typedef enum {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1723
  LM_LOG_LEVEL_VERBOSE = 1 << (G_LOG_LEVEL_USER_SHIFT),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1724
  LM_LOG_LEVEL_NET     = 1 << (G_LOG_LEVEL_USER_SHIFT + 1),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1725
  LM_LOG_LEVEL_PARSER  = 1 << (G_LOG_LEVEL_USER_SHIFT + 2),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1726
  LM_LOG_LEVEL_SSL     = 1 << (G_LOG_LEVEL_USER_SHIFT + 3),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1727
  LM_LOG_LEVEL_SASL    = 1 << (G_LOG_LEVEL_USER_SHIFT + 4),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1728
  LM_LOG_LEVEL_ALL     = (LM_LOG_LEVEL_NET |
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1729
        LM_LOG_LEVEL_VERBOSE |
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1730
        LM_LOG_LEVEL_PARSER |
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1731
        LM_LOG_LEVEL_SSL |
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1732
        LM_LOG_LEVEL_SASL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1733
} LmLogLevelFlags;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1734
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1735
static void lm_debug_handler (const gchar    *log_domain,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1736
                              GLogLevelFlags  log_level,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1737
                              const gchar    *message,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1738
                              gpointer        user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1739
{
1616
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1740
  if (message && *message) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1741
    char *msg;
1616
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1742
    int mcabber_loglevel = settings_opt_get_int("tracelog_level");
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1743
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1744
    if (mcabber_loglevel < 2)
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1745
      return;
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1746
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1747
    if (message[0] == '\n')
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1748
      msg = g_strdup(&message[1]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1749
    else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1750
      msg = g_strdup(message);
1616
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1751
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1752
    if (msg[strlen(msg)-1] == '\n')
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1753
      msg[strlen(msg)-1] = '\0';
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1754
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1755
    if (log_level & LM_LOG_LEVEL_VERBOSE) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1756
      scr_LogPrint(LPRINT_DEBUG, "LM-VERBOSE: %s", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1757
    }
1616
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1758
    if (log_level & LM_LOG_LEVEL_NET) {
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1759
      if (mcabber_loglevel > 2)
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1760
        scr_LogPrint(LPRINT_DEBUG, "LM-NET: %s", msg);
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1761
    } else if (log_level & LM_LOG_LEVEL_PARSER) {
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1762
      if (mcabber_loglevel > 3)
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1763
        scr_LogPrint(LPRINT_DEBUG, "LM-PARSER: %s", msg);
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1764
    } else if (log_level & LM_LOG_LEVEL_SASL) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1765
      scr_LogPrint(LPRINT_DEBUG, "LM-SASL: %s", msg);
1616
4c7104ec5f3b Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents: 1615
diff changeset
  1766
    } else if (log_level & LM_LOG_LEVEL_SSL) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1767
      scr_LogPrint(LPRINT_DEBUG, "LM-SSL: %s", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1768
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1769
    g_free(msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1770
  }
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1771
}
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  1772
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1773
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1774
//  xmpp_connect()
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1775
// Return a non-zero value if there's an obvious problem
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1776
// (no JID, no password, etc.)
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1777
gint xmpp_connect(void)
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  1778
{
2087
305297d088c2 Fix GCC warning (variable set but not used)
franky
parents: 2086
diff changeset
  1779
  const char *userjid, *password, *resource, *servername, *ssl_fpr;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1780
  char *dynresource = NULL;
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
  1781
#ifndef LOUDMOUTH_USES_SHA256
2203
170597f5365b Use more generic routines to convert fingerprints to/from hexadecimal
Mikael Berthe <mikael@lilotux.net>
parents: 2199
diff changeset
  1782
  char fpr[FINGERPRINT_LENGTH] = {0};
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
  1783
#endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1784
  const char *proxy_host;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1785
  const char *resource_prefix = PACKAGE_NAME;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1786
  char *fjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1787
  int ssl, tls;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1788
  LmSSL *lssl;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1789
  unsigned int port;
2197
189abf03ef24 Fix fingerprint management
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
  1790
  unsigned int ping = 40;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1791
  LmMessageHandler *handler;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1792
  GError *error = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1793
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1794
  xmpp_disconnect();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1795
2085
88b6e9707e02 Added setting "ssl_ciphers" to define the allowed ciphers
franky
parents: 2075
diff changeset
  1796
  servername  = settings_opt_get("server");
88b6e9707e02 Added setting "ssl_ciphers" to define the allowed ciphers
franky
parents: 2075
diff changeset
  1797
  userjid     = settings_opt_get("jid");
88b6e9707e02 Added setting "ssl_ciphers" to define the allowed ciphers
franky
parents: 2075
diff changeset
  1798
  password    = settings_opt_get("password");
88b6e9707e02 Added setting "ssl_ciphers" to define the allowed ciphers
franky
parents: 2075
diff changeset
  1799
  resource    = settings_opt_get("resource");
88b6e9707e02 Added setting "ssl_ciphers" to define the allowed ciphers
franky
parents: 2075
diff changeset
  1800
  proxy_host  = settings_opt_get("proxy_host");
88b6e9707e02 Added setting "ssl_ciphers" to define the allowed ciphers
franky
parents: 2075
diff changeset
  1801
  ssl_fpr     = settings_opt_get("ssl_fingerprint");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1802
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
  1803
  if (!userjid) {
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
  1804
    scr_LogPrint(LPRINT_LOGNORM, "Your JID has not been specified!");
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1805
    return -1;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1806
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1807
  if (!password) {
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
  1808
    scr_LogPrint(LPRINT_LOGNORM, "Your password has not been specified!");
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1809
    return -1;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1810
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1811
1653
fca9a4c17432 Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1647
diff changeset
  1812
  lconnection = lm_connection_new_with_context(NULL, main_context);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1813
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1814
  g_log_set_handler("LM", LM_LOG_LEVEL_ALL, lm_debug_handler, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1815
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1816
  if (settings_opt_get("pinginterval"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1817
    ping = (unsigned int) settings_opt_get_int("pinginterval");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1818
  lm_connection_set_keep_alive_rate(lconnection, ping);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1819
  scr_LogPrint(LPRINT_DEBUG, "Ping interval established: %d secs", ping);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1820
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1821
  lm_connection_set_disconnect_function(lconnection, connection_close_cb,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1822
                                        NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1823
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1824
  handler = lm_message_handler_new(handle_messages, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1825
  lm_connection_register_message_handler(lconnection, handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1826
                                         LM_MESSAGE_TYPE_MESSAGE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1827
                                         LM_HANDLER_PRIORITY_NORMAL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1828
  lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1829
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1830
  handler = lm_message_handler_new(handle_iq, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1831
  lm_connection_register_message_handler(lconnection, handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1832
                                         LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1833
                                         LM_HANDLER_PRIORITY_NORMAL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1834
  lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1835
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1836
  handler = lm_message_handler_new(handle_presence, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1837
  lm_connection_register_message_handler(lconnection, handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1838
                                         LM_MESSAGE_TYPE_PRESENCE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1839
                                         LM_HANDLER_PRIORITY_LAST);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1840
  lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1841
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1842
  handler = lm_message_handler_new(handle_s10n, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1843
  lm_connection_register_message_handler(lconnection, handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1844
                                         LM_MESSAGE_TYPE_PRESENCE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1845
                                         LM_HANDLER_PRIORITY_NORMAL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1846
  lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1847
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1848
  /* Connect to server */
1902
51cc01a1a5ec Improve messages when connecting to the Jabber server
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
  1849
  scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "Connecting to server%s%s",
51cc01a1a5ec Improve messages when connecting to the Jabber server
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
  1850
               servername ? ": " : "",
51cc01a1a5ec Improve messages when connecting to the Jabber server
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
  1851
               servername ? servername : "");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1852
  if (!resource)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1853
    resource = resource_prefix;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  1854
1747
c4f67e2e675f Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents: 1746
diff changeset
  1855
  // Initialize pseudo-random seed
c4f67e2e675f Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents: 1746
diff changeset
  1856
  srandom(time(NULL));
c4f67e2e675f Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents: 1746
diff changeset
  1857
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1858
  if (!settings_opt_get("disable_random_resource")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1859
#if HAVE_ARC4RANDOM
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1860
    dynresource = g_strdup_printf("%s.%08x", resource, arc4random());
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1861
#else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1862
    unsigned int tab[2];
1746
b7574de9ae4b Use random() instead of rand()
Mikael Berthe <mikael@lilotux.net>
parents: 1733
diff changeset
  1863
    tab[0] = (unsigned int) (0xffff * (random() / (RAND_MAX + 1.0)));
b7574de9ae4b Use random() instead of rand()
Mikael Berthe <mikael@lilotux.net>
parents: 1733
diff changeset
  1864
    tab[1] = (unsigned int) (0xffff * (random() / (RAND_MAX + 1.0)));
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1865
    dynresource = g_strdup_printf("%s.%04x%04x", resource, tab[0], tab[1]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1866
#endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1867
    resource = dynresource;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1868
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1869
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1870
  port = (unsigned int) settings_opt_get_int("port");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1871
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1872
  if (port)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1873
    scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " using port %d", port);
1902
51cc01a1a5ec Improve messages when connecting to the Jabber server
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
  1874
  scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " with resource %s", resource);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1875
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1876
  if (proxy_host) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1877
    int proxy_port = settings_opt_get_int("proxy_port");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1878
    if (proxy_port <= 0 || proxy_port > 65535) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1879
      scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "Invalid proxy port: %d",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1880
                   proxy_port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1881
    } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1882
      const char *proxy_user, *proxy_pass;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1883
      LmProxy *lproxy;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1884
      proxy_user = settings_opt_get("proxy_user");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1885
      proxy_pass = settings_opt_get("proxy_pass");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1886
      // Proxy initialization
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1887
      lproxy = lm_proxy_new_with_server(LM_PROXY_TYPE_HTTP,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1888
                                        proxy_host, proxy_port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1889
      lm_proxy_set_username(lproxy, proxy_user);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1890
      lm_proxy_set_password(lproxy, proxy_pass);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1891
      lm_connection_set_proxy(lconnection, lproxy);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1892
      lm_proxy_unref(lproxy);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1893
      scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " using proxy %s:%d",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1894
                   proxy_host, proxy_port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1895
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1896
  }
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  1897
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
  1898
  fjid = compose_jid(userjid, servername, resource);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1899
  lm_connection_set_jid(lconnection, fjid);
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
  1900
  if (servername)
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
  1901
    lm_connection_set_server(lconnection, servername);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1902
#if defined(HAVE_LIBOTR)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1903
  otr_init(fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1904
#endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1905
  g_free(fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1906
  g_free(dynresource);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1907
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1908
  ssl = settings_opt_get_int("ssl");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1909
  tls = settings_opt_get_int("tls");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1910
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1911
  if (!lm_ssl_is_supported()) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1912
    if (ssl || tls) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1913
      scr_LogPrint(LPRINT_LOGNORM, "** Error: SSL is NOT available, "
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1914
                   "please recompile loudmouth with SSL enabled.");
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1915
      return -1;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1916
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1917
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1918
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1919
  if (ssl && tls) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1920
    scr_LogPrint(LPRINT_LOGNORM, "You can only set ssl or tls, not both.");
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1921
    return -1;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1922
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1923
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1924
  if (!port)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1925
    port = (ssl ? LM_CONNECTION_DEFAULT_PORT_SSL : LM_CONNECTION_DEFAULT_PORT);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1926
  lm_connection_set_port(lconnection, port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1927
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
  1928
#ifndef LOUDMOUTH_USES_SHA256
2203
170597f5365b Use more generic routines to convert fingerprints to/from hexadecimal
Mikael Berthe <mikael@lilotux.net>
parents: 2199
diff changeset
  1929
  if (ssl_fpr && (!hex_to_fingerprint(ssl_fpr, fpr, FINGERPRINT_LENGTH))) {
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1930
    scr_LogPrint(LPRINT_LOGNORM, "** Please set the fingerprint in the format "
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1931
                 "97:5C:00:3F:1D:77:45:25:E2:C5:70:EC:83:C8:87:EE");
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1932
    return -1;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1933
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1934
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1935
  lssl = lm_ssl_new((ssl_fpr ? fpr : NULL), ssl_cb, NULL, NULL);
2248
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
  1936
#else
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
  1937
  lssl = lm_ssl_new(ssl_fpr, ssl_cb, NULL, NULL);
377b6a52b25f Prepare for loudmouth with sha256 support (>=1.5.3)
franky
parents: 2247
diff changeset
  1938
#endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1939
  if (lssl) {
2086
3667697d677d Fix compilation for old loudmouth libraries
franky
parents: 2085
diff changeset
  1940
#ifdef HAVE_LM_SSL_CIPHER_LIST
2087
305297d088c2 Fix GCC warning (variable set but not used)
franky
parents: 2086
diff changeset
  1941
    const char *ssl_ciphers = settings_opt_get("ssl_ciphers");
2085
88b6e9707e02 Added setting "ssl_ciphers" to define the allowed ciphers
franky
parents: 2075
diff changeset
  1942
    lm_ssl_set_cipher_list(lssl, ssl_ciphers);
2086
3667697d677d Fix compilation for old loudmouth libraries
franky
parents: 2085
diff changeset
  1943
#endif
2089
91a8f3740a1a Added setting "ssl_ca" to set additional certificates to trust
franky
parents: 2087
diff changeset
  1944
#ifdef HAVE_LM_SSL_CA
91a8f3740a1a Added setting "ssl_ca" to set additional certificates to trust
franky
parents: 2087
diff changeset
  1945
    const char *ssl_ca = settings_opt_get("ssl_ca");
2247
fe89cdd66446 Expand filename for ssl_ca option
franky
parents: 2230
diff changeset
  1946
    char *ssl_ca_xp;
fe89cdd66446 Expand filename for ssl_ca option
franky
parents: 2230
diff changeset
  1947
    ssl_ca_xp = expand_filename(ssl_ca);
2261
b23e0e4e19bf Really expand the ssl_ca filename... m(
franky
parents: 2250
diff changeset
  1948
    lm_ssl_set_ca(lssl, ssl_ca_xp);
2247
fe89cdd66446 Expand filename for ssl_ca option
franky
parents: 2230
diff changeset
  1949
    g_free(ssl_ca_xp);
2089
91a8f3740a1a Added setting "ssl_ca" to set additional certificates to trust
franky
parents: 2087
diff changeset
  1950
#endif
2087
305297d088c2 Fix GCC warning (variable set but not used)
franky
parents: 2086
diff changeset
  1951
    lm_ssl_use_starttls(lssl, !ssl, tls);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1952
    lm_connection_set_ssl(lconnection, lssl);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1953
    lm_ssl_unref(lssl);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1954
  } else if (ssl || tls) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1955
    scr_LogPrint(LPRINT_LOGNORM, "** Error: Couldn't create SSL struct.");
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1956
    return -1;
671
c5da36fd437a Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents: 668
diff changeset
  1957
  }
c5da36fd437a Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents: 668
diff changeset
  1958
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1959
  if (!lm_connection_open(lconnection, connection_open_cb,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1960
                          NULL, FALSE, &error)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1961
    _try_to_reconnect();
1717
c12455fec611 Remove extra newlines in scr_LogPrint() calls
Mikael Berthe <mikael@lilotux.net>
parents: 1716
diff changeset
  1962
    scr_LogPrint(LPRINT_LOGNORM, "Failed to open: %s", error->message);
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1963
    g_error_free(error);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1964
  }
1810
8c2651fc217a Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
  1965
  return 0;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1966
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1967
1920
bfa507815e0c Add caps to presence when joining a MUC room
Mikael Berthe <mikael@lilotux.net>
parents: 1917
diff changeset
  1968
//  xmpp_insert_entity_capabilities(presence_stanza)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1969
// Entity Capabilities (XEP-0115)
1920
bfa507815e0c Add caps to presence when joining a MUC room
Mikael Berthe <mikael@lilotux.net>
parents: 1917
diff changeset
  1970
void xmpp_insert_entity_capabilities(LmMessageNode *x, enum imstatus status)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1971
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1972
  LmMessageNode *y;
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1973
  const char *ver = entity_version(status);
2230
f5659f0f9db8 Add safety check to xmpp_insert_entity_capabilities()
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
  1974
  if (!ver)
f5659f0f9db8 Add safety check to xmpp_insert_entity_capabilities()
Mikael Berthe <mikael@lilotux.net>
parents: 2213
diff changeset
  1975
    return;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1976
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1977
  y = lm_message_node_add_child(x, "c", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1978
  lm_message_node_set_attribute(y, "xmlns", NS_CAPS);
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
  1979
  lm_message_node_set_attribute(y, "hash", "sha-1");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1980
  lm_message_node_set_attribute(y, "node", MCABBER_CAPS_NODE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1981
  lm_message_node_set_attribute(y, "ver", ver);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1982
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1983
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1984
void xmpp_disconnect(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1985
{
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1986
  if (!lconnection)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1987
    return;
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1988
  if (lm_connection_is_authenticated(lconnection)) {
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1989
    // Launch pre-disconnect internal hook
1683
b09f82f61745 Split HOOK_INTERNAL
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1682
diff changeset
  1990
    hk_predisconnect();
1682
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1991
    // Announce it to  everyone else
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1992
    xmpp_setstatus(offline, NULL, "", FALSE);
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1993
  }
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1994
  if (lm_connection_is_open(lconnection))
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1995
    lm_connection_close(lconnection, NULL);
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1996
  lm_connection_unref(lconnection);
d1e8fb14ce2d Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
  1997
  lconnection = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1998
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  1999
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2000
void xmpp_setstatus(enum imstatus st, const char *recipient, const char *msg,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2001
                  int do_not_sign)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2002
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2003
  LmMessage *m;
1693
32c6d81bd1ef Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents: 1691
diff changeset
  2004
  gboolean isonline;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2005
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2006
  if (msg) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2007
    // The status message has been specified.  We'll use it, unless it is
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2008
    // "-" which is a special case (option meaning "no status message").
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2009
    if (!strcmp(msg, "-"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2010
      msg = "";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2011
  } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2012
    // No status message specified; we'll use:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2013
    // a) the default status message (if provided by the user);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2014
    // b) the current status message;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2015
    // c) no status message (i.e. an empty one).
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2016
    msg = settings_get_status_msg(st);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2017
    if (!msg) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2018
      if (mystatusmsg)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2019
        msg = mystatusmsg;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2020
      else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2021
        msg = "";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2022
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2023
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2024
1693
32c6d81bd1ef Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents: 1691
diff changeset
  2025
  isonline = xmpp_is_online();
32c6d81bd1ef Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents: 1691
diff changeset
  2026
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2027
  // Only send the packet if we're online.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2028
  // (But we want to update internal status even when disconnected,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2029
  // in order to avoid some problems during network failures)
1693
32c6d81bd1ef Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents: 1691
diff changeset
  2030
  if (isonline) {
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2031
#ifdef WITH_DEPRECATED_STATUS_INVISIBLE
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2032
    const char *s_msg = (st != invisible ? msg : NULL);
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2033
#else
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2034
    // XXX Could be removed if/when we get rid of status invisible
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2035
    // completely.
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2036
    const char *s_msg = msg;
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2037
#endif
2023
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2038
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2039
    if (!recipient) {
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2040
      // This is a global status, send presence to chatrooms
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2041
#ifdef WITH_DEPRECATED_STATUS_INVISIBLE
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2042
      if (st != invisible)
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2043
#endif
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2044
      {
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2045
        struct T_presence room_presence;
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2046
        room_presence.st = st;
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2047
        room_presence.msg = msg;
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2048
        foreach_buddy(ROSTER_TYPE_ROOM, &roompresence, &room_presence);
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2049
      }
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2050
    }
26edaf6ea10b xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents: 2017
diff changeset
  2051
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2052
    m = lm_message_new_presence(st, recipient, s_msg);
1920
bfa507815e0c Add caps to presence when joining a MUC room
Mikael Berthe <mikael@lilotux.net>
parents: 1917
diff changeset
  2053
    xmpp_insert_entity_capabilities(m->node, st); // Entity Caps (XEP-0115)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2054
#ifdef HAVE_GPGME
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2055
    if (!do_not_sign && gpg_enabled()) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2056
      char *signature;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2057
      signature = gpg_sign(s_msg ? s_msg : "");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2058
      if (signature) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2059
        LmMessageNode *y;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2060
        y = lm_message_node_add_child(m->node, "x", signature);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2061
        lm_message_node_set_attribute(y, "xmlns", NS_SIGNED);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2062
        g_free(signature);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2063
      }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2064
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2065
#endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2066
    lm_connection_send(lconnection, m, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2067
    lm_message_unref(m);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2068
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2069
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2070
  // If we didn't change our _global_ status, we are done
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2071
  if (recipient) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2072
1693
32c6d81bd1ef Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents: 1691
diff changeset
  2073
  if (isonline || !st) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2074
    // We'll have to update the roster if we switch to/from offline because
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2075
    // we don't know the presences of buddies when offline...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2076
    if (mystatus == offline || st == offline)
2292
f181418db215 Replace global variable update_roster with scr_update_roster()
franky
parents: 2291
diff changeset
  2077
      scr_update_roster();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2078
1716
d30fb41725fe Do not call hk_mystatuschange() twice when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents: 1715
diff changeset
  2079
    if (isonline || mystatus || st)
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2080
#ifdef WITH_DEPRECATED_STATUS_INVISIBLE
1716
d30fb41725fe Do not call hk_mystatuschange() twice when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents: 1715
diff changeset
  2081
      hk_mystatuschange(0, mystatus, st, (st != invisible ? msg : ""));
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2082
#else
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2083
      hk_mystatuschange(0, mystatus, st, msg);
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1963
diff changeset
  2084
#endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2085
    mystatus = st;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2086
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2087
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2088
  if (st)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2089
    mywantedstatus = st;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2090
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2091
  if (msg != mystatusmsg) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2092
    g_free(mystatusmsg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2093
    if (*msg)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2094
      mystatusmsg = g_strdup(msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2095
    else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2096
      mystatusmsg = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2097
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2098
1780
e4378fbab5d7 Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents: 1747
diff changeset
  2099
  if (!scr_curses_status())
1733
a9b0364c0cb2 Fix segfault introduced in previous commit
Mikael Berthe <mikael@lilotux.net>
parents: 1731
diff changeset
  2100
    return;  // Called from config. file
a9b0364c0cb2 Fix segfault introduced in previous commit
Mikael Berthe <mikael@lilotux.net>
parents: 1731
diff changeset
  2101
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2102
  if (!Autoaway)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2103
    update_last_use();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2104
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2105
  // Update status line
1780
e4378fbab5d7 Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents: 1747
diff changeset
  2106
  scr_update_main_status(TRUE);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2107
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2108
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
  2109
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2110
enum imstatus xmpp_getstatus(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2111
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2112
  return mystatus;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2113
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2114
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2115
const char *xmpp_getstatusmsg(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2116
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2117
  return mystatusmsg;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2118
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2119
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2120
//  xmpp_setprevstatus()
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2121
// Set previous status.  This wrapper function is used after a disconnection.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2122
void xmpp_setprevstatus(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2123
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2124
  xmpp_setstatus(mywantedstatus, NULL, mystatusmsg, FALSE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2125
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2126
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2127
//  send_storage(store)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2128
// Send the node "store" to update the server.
2282
dc1b123d63d5 Improve message when bookmarks are updated
Mikael Berthe <mikael@lilotux.net>
parents: 2268
diff changeset
  2129
// Note: the caller should check we're online.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2130
void send_storage(LmMessageNode *store)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2131
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2132
  LmMessage *iq;
1994
024bdd1c6418 Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents: 1984
diff changeset
  2133
  LmMessageHandler *handler;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2134
  LmMessageNode *query;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2135
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2136
  if (!rosternotes) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2137
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2138
  iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2139
                                    LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2140
  query = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2141
  lm_message_node_set_attribute(query, "xmlns", NS_PRIVATE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2142
  lm_message_node_insert_childnode(query, store);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2143
1994
024bdd1c6418 Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents: 1984
diff changeset
  2144
  handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE);
024bdd1c6418 Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents: 1984
diff changeset
  2145
  lm_connection_send_with_reply(lconnection, iq, handler, NULL);
024bdd1c6418 Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents: 1984
diff changeset
  2146
  lm_message_handler_unref(handler);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2147
  lm_message_unref(iq);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2148
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2149
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2150
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2151
//  xmpp_is_bookmarked(roomjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2152
// Return TRUE if there's a bookmark for the given jid.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2153
guint xmpp_is_bookmarked(const char *bjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2154
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2155
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2156
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2157
  if (!bookmarks)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2158
    return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2159
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2160
  // Walk through the storage bookmark tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2161
  for (x = bookmarks->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2162
    // If the node is a conference item, check the jid.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2163
    if (x->name && !strcmp(x->name, "conference")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2164
      const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2165
      if (fjid && !strcasecmp(bjid, fjid))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2166
        return TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2167
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2168
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2169
  return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2170
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2171
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2172
//  xmpp_get_bookmark_nick(roomjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2173
// Return the room nickname if it is present in a bookmark.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2174
const char *xmpp_get_bookmark_nick(const char *bjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2175
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2176
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2177
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2178
  if (!bookmarks || !bjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2179
    return NULL;
469
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
  2180
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2181
  // Walk through the storage bookmark tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2182
  for (x = bookmarks->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2183
    // If the node is a conference item, check the jid.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2184
    if (x->name && !strcmp(x->name, "conference")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2185
      const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2186
      if (fjid && !strcasecmp(bjid, fjid))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2187
        return lm_message_node_get_child_value(x, "nick");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2188
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2189
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2190
  return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2191
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2192
2138
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2193
//  xmpp_get_bookmark_password(roomjid)
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2194
// Return the room password if it is present in a bookmark.
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2195
const char *xmpp_get_bookmark_password(const char *bjid)
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2196
{
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2197
  LmMessageNode *x;
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2198
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2199
  if (!bookmarks || !bjid)
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2200
    return NULL;
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2201
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2202
  // Walk through the storage bookmark tags
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2203
  for (x = bookmarks->children ; x; x = x->next) {
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2204
    // If the node is a conference item, check the jid.
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2205
    if (x->name && !strcmp(x->name, "conference")) {
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2206
      const char *fjid = lm_message_node_get_attribute(x, "jid");
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2207
      if (fjid && !strcasecmp(bjid, fjid))
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2208
        return lm_message_node_get_child_value(x, "password");
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2209
    }
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2210
  }
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2211
  return NULL;
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2212
}
f063e36425a2 Use bookmarked password (if any) when using "/room join"
Mikael Berthe <mikael@lilotux.net>
parents: 2137
diff changeset
  2213
2010
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2214
int xmpp_get_bookmark_autojoin(const char *bjid)
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2215
{
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2216
  LmMessageNode *x;
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2217
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2218
  if (!bookmarks || !bjid)
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2219
    return 0;
2033
a37fbc3ac6aa Delivery receipts: Use LM-generated messages id
Mikael Berthe <mikael@lilotux.net>
parents: 2032
diff changeset
  2220
2010
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2221
  // Walk through the storage bookmark tags
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2222
  for (x = bookmarks->children ; x; x = x->next) {
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2223
    // If the node is a conference item, check the jid.
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2224
    if (x->name && !strcmp(x->name, "conference")) {
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2225
      const char *fjid = lm_message_node_get_attribute(x, "jid");
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2226
      if (fjid && !strcasecmp(bjid, fjid)) {
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2227
        const char *autojoin;
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2228
        autojoin = lm_message_node_get_attribute(x, "autojoin");
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2229
        if (autojoin && (!strcmp(autojoin, "1") || !strcmp(autojoin, "true")))
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2230
          return 1;
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2231
        return 0;
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2232
      }
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2233
    }
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2234
  }
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2235
  return 0;
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2236
}
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2237
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2238
//  xmpp_get_all_storage_bookmarks()
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2239
// Return a GSList with all storage bookmarks.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2240
// The caller should g_free the list (not the MUC jids).
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2241
GSList *xmpp_get_all_storage_bookmarks(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2242
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2243
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2244
  GSList *sl_bookmarks = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2245
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2246
  // If we have no bookmarks, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2247
  if (!bookmarks)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2248
    return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2249
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2250
  // Walk through the storage bookmark tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2251
  for (x = bookmarks->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2252
    // If the node is a conference item, let's add the note to our list.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2253
    if (x->name && !strcmp(x->name, "conference")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2254
      struct bookmark *bm_elt;
2137
0bfc4bfc127c Add support for storing passwords to a MUC (Nico Golde)
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
  2255
      const char *autojoin, *name, *nick, *passwd;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2256
      const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2257
      if (!fjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2258
        continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2259
      bm_elt = g_new0(struct bookmark, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2260
      bm_elt->roomjid = g_strdup(fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2261
      autojoin = lm_message_node_get_attribute(x, "autojoin");
1818
4694fad35ed8 Fix not displaying of MUC nick, set in bookmark
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1811
diff changeset
  2262
      nick = lm_message_node_get_child_value(x, "nick");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2263
      name = lm_message_node_get_attribute(x, "name");
2137
0bfc4bfc127c Add support for storing passwords to a MUC (Nico Golde)
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
  2264
      passwd = lm_message_node_get_child_value(x, "password");
2004
aa7e03c35488 Accept "true" as well as "1" for autojoin in bookmarked rooms
Hermitifier
parents: 1999
diff changeset
  2265
      if (autojoin && (!strcmp(autojoin, "1") || !strcmp(autojoin, "true")))
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2266
        bm_elt->autojoin = 1;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2267
      if (nick)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2268
        bm_elt->nick = g_strdup(nick);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2269
      if (name)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2270
        bm_elt->name = g_strdup(name);
2137
0bfc4bfc127c Add support for storing passwords to a MUC (Nico Golde)
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
  2271
      if (passwd)
0bfc4bfc127c Add support for storing passwords to a MUC (Nico Golde)
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
  2272
        bm_elt->password = g_strdup(passwd);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2273
      sl_bookmarks = g_slist_append(sl_bookmarks, bm_elt);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2274
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2275
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2276
  return sl_bookmarks;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2277
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2278
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2279
//  xmpp_set_storage_bookmark(roomid, name, nick, passwd, autojoin,
1979
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
  2280
//                          printstatus, autowhois, flagjoins, group)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2281
// Update the private storage bookmarks: add a conference room.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2282
// If name is nil, we remove the bookmark.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2283
void xmpp_set_storage_bookmark(const char *roomid, const char *name,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2284
                               const char *nick, const char *passwd,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2285
                               int autojoin, enum room_printstatus pstatus,
1979
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
  2286
                               enum room_autowhois awhois,
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
  2287
                               enum room_flagjoins fjoins, const char *group)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2288
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2289
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2290
  bool changed = FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2291
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2292
  if (!roomid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2293
    return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2294
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2295
  // If we have no bookmarks, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2296
  if (!bookmarks) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2297
    scr_LogPrint(LPRINT_NORMAL,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2298
                 "Sorry, your server doesn't seem to support private storage.");
469
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
  2299
    return;
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
  2300
  }
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  2301
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2302
  // Walk through the storage tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2303
  for (x = bookmarks->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2304
    // If the current node is a conference item, see if we have to replace it.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2305
    if (x->name && !strcmp(x->name, "conference")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2306
      const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2307
      if (!fjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2308
        continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2309
      if (!strcmp(fjid, roomid)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2310
        // We've found a bookmark for this room.  Let's hide it and we'll
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2311
        // create a new one.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2312
        lm_message_node_hide(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2313
        changed = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2314
        if (!name)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2315
          scr_LogPrint(LPRINT_LOGNORM, "Deleting bookmark...");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2316
      }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2317
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2318
  }
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  2319
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2320
  // Let's create a node/bookmark for this roomid, if the name is not NULL.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2321
  if (name) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2322
    x = lm_message_node_add_child(bookmarks, "conference", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2323
    lm_message_node_set_attributes(x,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2324
                                   "jid", roomid,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2325
                                   "name", name,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2326
                                   "autojoin", autojoin ? "1" : "0",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2327
                                   NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2328
    if (nick)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2329
      lm_message_node_add_child(x, "nick", nick);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2330
    if (passwd)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2331
      lm_message_node_add_child(x, "password", passwd);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2332
    if (pstatus)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2333
      lm_message_node_add_child(x, "print_status", strprintstatus[pstatus]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2334
    if (awhois)
1633
e3afe1da8a5f Fix saving autowhois option in bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1621
diff changeset
  2335
      lm_message_node_set_attributes(x, "autowhois",
e3afe1da8a5f Fix saving autowhois option in bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1621
diff changeset
  2336
                                     (awhois == autowhois_on) ? "1" : "0",
e3afe1da8a5f Fix saving autowhois option in bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1621
diff changeset
  2337
                                     NULL);
1979
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
  2338
    if (fjoins)
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
  2339
      lm_message_node_add_child(x, "flag_joins", strflagjoins[fjoins]);
2010
a73ce708c2c9 Fix bookmarks losing autojoin attribute
Hermitifier
parents: 2004
diff changeset
  2340
    if (group && *group)
1976
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1972
diff changeset
  2341
      lm_message_node_add_child(x, "group", group);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2342
    changed = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2343
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2344
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2345
  if (!changed)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2346
    return;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  2347
2282
dc1b123d63d5 Improve message when bookmarks are updated
Mikael Berthe <mikael@lilotux.net>
parents: 2268
diff changeset
  2348
  if (xmpp_is_online()) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2349
    send_storage(bookmarks);
2282
dc1b123d63d5 Improve message when bookmarks are updated
Mikael Berthe <mikael@lilotux.net>
parents: 2268
diff changeset
  2350
    scr_LogPrint(LPRINT_LOGNORM, "Bookmarks updated.");
dc1b123d63d5 Improve message when bookmarks are updated
Mikael Berthe <mikael@lilotux.net>
parents: 2268
diff changeset
  2351
  } else {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2352
    scr_LogPrint(LPRINT_LOGNORM,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2353
                 "Warning: you're not connected to the server.");
2282
dc1b123d63d5 Improve message when bookmarks are updated
Mikael Berthe <mikael@lilotux.net>
parents: 2268
diff changeset
  2354
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2355
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2356
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2357
static struct annotation *parse_storage_rosternote(LmMessageNode *notenode)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2358
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2359
  const char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2360
  struct annotation *note = g_new0(struct annotation, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2361
  p = lm_message_node_get_attribute(notenode, "cdate");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2362
  if (p)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2363
    note->cdate = from_iso8601(p, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2364
  p = lm_message_node_get_attribute(notenode, "mdate");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2365
  if (p)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2366
    note->mdate = from_iso8601(p, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2367
  note->text = g_strdup(lm_message_node_get_value(notenode));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2368
  note->jid = g_strdup(lm_message_node_get_attribute(notenode, "jid"));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2369
  return note;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2370
}
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  2371
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2372
//  xmpp_get_all_storage_rosternotes()
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2373
// Return a GSList with all storage annotations.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2374
// The caller should g_free the list and its contents.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2375
GSList *xmpp_get_all_storage_rosternotes(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2376
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2377
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2378
  GSList *sl_notes = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2379
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2380
  // If we have no rosternotes, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2381
  if (!rosternotes)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2382
    return NULL;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  2383
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2384
  // Walk through the storage rosternotes tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2385
  for (x = rosternotes->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2386
    struct annotation *note;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2387
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2388
    // We want a note item
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2389
    if (!x->name || strcmp(x->name, "note"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2390
      continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2391
    // Just in case, check the jid...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2392
    if (!lm_message_node_get_attribute(x, "jid"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2393
      continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2394
    // Ok, let's add the note to our list
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2395
    note = parse_storage_rosternote(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2396
    sl_notes = g_slist_append(sl_notes, note);
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  2397
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2398
  return sl_notes;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  2399
}
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
  2400
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2401
//  xmpp_get_storage_rosternotes(barejid, silent)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2402
// Return the annotation associated with this jid.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2403
// If silent is TRUE, no warning is displayed when rosternotes is disabled
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2404
// The caller should g_free the string and structure after use.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2405
struct annotation *xmpp_get_storage_rosternotes(const char *barejid, int silent)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2406
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2407
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2408
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2409
  if (!barejid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2410
    return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2411
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2412
  // If we have no rosternotes, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2413
  if (!rosternotes) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2414
    if (!silent)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2415
      scr_LogPrint(LPRINT_NORMAL, "Sorry, "
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2416
                   "your server doesn't seem to support private storage.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2417
    return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2418
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2419
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2420
  // Walk through the storage rosternotes tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2421
  for (x = rosternotes->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2422
    const char *fjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2423
    // We want a note item
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2424
    if (!x->name || strcmp(x->name, "note"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2425
      continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2426
    // Just in case, check the jid...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2427
    fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2428
    if (fjid && !strcmp(fjid, barejid)) // We've found a note for this contact.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2429
      return parse_storage_rosternote(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2430
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2431
  return NULL;  // No note found
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2432
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2433
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2434
//  xmpp_set_storage_rosternotes(barejid, note)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2435
// Update the private storage rosternotes: add/delete a note.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2436
// If note is nil, we remove the existing note.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2437
void xmpp_set_storage_rosternotes(const char *barejid, const char *note)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2438
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2439
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2440
  bool changed = FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2441
  const char *cdate = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2442
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2443
  if (!barejid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2444
    return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2445
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2446
  // If we have no rosternotes, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2447
  if (!rosternotes) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2448
    scr_LogPrint(LPRINT_NORMAL,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2449
                 "Sorry, your server doesn't seem to support private storage.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2450
    return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2451
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2452
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2453
  // Walk through the storage tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2454
  for (x = rosternotes->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2455
    // If the current node is a conference item, see if we have to replace it.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2456
    if (x->name && !strcmp(x->name, "note")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2457
      const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2458
      if (!fjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2459
        continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2460
      if (!strcmp(fjid, barejid)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2461
        // We've found a note for this jid.  Let's hide it and we'll
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2462
        // create a new one.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2463
        cdate = lm_message_node_get_attribute(x, "cdate");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2464
        lm_message_node_hide(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2465
        changed = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2466
        break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2467
      }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2468
    }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2469
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2470
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2471
  // Let's create a node for this jid, if the note is not NULL.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2472
  if (note) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2473
    char mdate[20];
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2474
    time_t now;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2475
    time(&now);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2476
    to_iso8601(mdate, now);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2477
    if (!cdate)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2478
      cdate = mdate;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2479
    x = lm_message_node_add_child(rosternotes, "note", note);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2480
    lm_message_node_set_attributes(x,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2481
                                   "jid", barejid,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2482
                                   "cdate", cdate,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2483
                                   "mdate", mdate,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2484
                                   NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2485
    changed = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2486
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2487
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2488
  if (!changed)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2489
    return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2490
1684
95df4ea512c8 Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1683
diff changeset
  2491
  if (xmpp_is_online())
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2492
    send_storage(rosternotes);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2493
  else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2494
    scr_LogPrint(LPRINT_LOGNORM,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2495
                 "Warning: you're not connected to the server.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
  2496
}
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
  2497
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1810
diff changeset
  2498
/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2:  For Vim users... */