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