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