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