source: protocols/jabber/jabber.h @ 0cab388

Last change on this file since 0cab388 was 1ba7e8f, checked in by ulim <a.sporto+bee@…>, at 2008-02-15T17:38:57Z

Merged with upstream r328

Wilmer van der Gaast 2008-02-11 Got rid of some noise at startup: complaining when the default configuration

Wilmer van der Gaast 2008-02-10 Added support for password-protected Jabber chatrooms.
Wilmer van der Gaast 2008-02-10 Making AI_ADDRCONFIG optional, it doesn't exist on at least NetBSD and
Wilmer van der Gaast 2008-02-09 Restored "add -tmp". A bit hackish, but it will do for now.
Wilmer van der Gaast 2008-02-07 Fixed getnameinfo() calls, this fixes Solaris stability issues. Thanks to
Wilmer van der Gaast 2008-02-04 Added bogus G_GNUC_MALLOC to restore GLib 2.4 compatibility (hopefully).
Wilmer van der Gaast 2008-02-03 Messages from the user are also included in backlogs when joining a Jabber
Wilmer van der Gaast 2008-02-03 Disabling "Unknown command" warnings since they're very noisy and pretty
Wilmer van der Gaast 2008-02-03 Implemented XEP-0115. This adds some info to the <presence/> tags so
Wilmer van der Gaast 2008-02-03 Saner garbage collection of cached packets in the Jabber module. Now
Wilmer van der Gaast 2008-02-02 Added help_free() and cleaned up some very stale help-related stuff I
Wilmer van der Gaast 2008-01-30 Fixed handling of OSCAR multi-part messages... They're not arrays, they're
Wilmer van der Gaast 2008-01-24 Keeping track of valid Jabber connections so _connected() events will be
Wilmer van der Gaast 2008-01-24 Fixed two valgrind warnings (partially uninitialized "struct tm" vars.)
Wilmer van der Gaast 2008-01-20 The Jabber module now uses imcb_chat_log() instead of imcb_log() where
Wilmer van der Gaast 2008-01-20 Added imcb_chat_log() for chatroom system messages, so they can be
Wilmer van der Gaast 2008-01-20 GET_BUDDY_FIRST wasn't actually implemented, even though it was in use
Wilmer van der Gaast 2008-01-19 Using test -f instead of test -e. This breaks if the include files are
Wilmer van der Gaast 2008-01-19 Added byte swapping code to the new MD5 checksumming code to make it work
Wilmer van der Gaast 2008-01-18 Moving imcb_chat_new() to a saner location (no code changes) and fixing
Wilmer van der Gaast 2008-01-17 Apparently ext_yahoo_got_im can be called with msg=NULL, so it should be
Wilmer van der Gaast 2008-01-17 Fixing some Solaris compiler warnings (u_int->uint, adding some typecasts
Wilmer van der Gaast 2008-01-13 Fixed handing of failed groupchat joins.
Wilmer van der Gaast 2008-01-13 Fixed "Conditional jump or move depends on uninitialised value(s)" at
Wilmer van der Gaast 2008-01-13 Fixed quickstart2. (Bug #349.)
Wilmer van der Gaast 2008-01-13 Different handling of charset mismatches before login time. Ignoring a
Wilmer van der Gaast 2008-01-12 When a switchboard connection dies (at the TCP level) and there are still
Wilmer van der Gaast 2008-01-12 Killed info_string_append() and now showing the IP address of ICQ users
Wilmer van der Gaast 2008-01-11 Fixing bug #344, now away states should always be correct, even when people
Wilmer van der Gaast 2008-01-11 Adding own handle to protocol name in blist output for people with multiple
Wilmer van der Gaast 2008-01-10 Now setting odata->icq properly again, this got lost some time ago, which
Wilmer van der Gaast 2008-01-06 More consistency in error/warning errors. Until now "WARNING:" was usually
Wilmer van der Gaast 2008-01-06 Changed warning message about unsent MSN messages. It should show the actual
Wilmer van der Gaast 2008-01-05 Added "mail_notifications" setting. Who needs those notifications anyway?
Wilmer van der Gaast 2008-01-05 Build fix from vmiklos.
Wilmer van der Gaast 2008-01-05 Added handling of MSN switchboard NAK messages. Untested, but hey, it
Wilmer van der Gaast 2008-01-05 Removed closure->result. I was planning to add some more stuff, but will
Miklos Vajna 2007-12-31 encode: md5.c is no longer in protocols/, it's in lib/
Wilmer van der Gaast 2007-12-28 Fixed return value check in proxy_connect(), since on some systems
Wilmer van der Gaast 2007-12-28 Added missing return in jabber_login().
Wilmer van der Gaast 2007-12-16 Implemented XEP-0199 (patch from misc@…).
Wilmer van der Gaast 2007-12-12 Checking conn->xcred before trying to clean it up since GnuTLS doesn't
Wilmer van der Gaast 2007-12-12 Killed the <server> parameter to "account add" and changed the default
Wilmer van der Gaast 2007-12-12 Fixed sockerr_again() usage in Jabber module to (hopefully) fix a 100% CPU
Wilmer van der Gaast 2007-12-10 Don't allow nicks that start with a number.
Wilmer van der Gaast 2007-12-10 Fixed "set xxx" syntax (it showed all settings instead of just xxx).
Wilmer van der Gaast 2007-12-09 If I keep forgetting to credit people in commit msgs I should probably add
Wilmer van der Gaast 2007-12-09 Added /invite support for Jabber chatrooms (and fixed the argument order

  • Property mode set to 100644
File size: 13.0 KB
RevLine 
[f06894d]1/***************************************************************************\
2*                                                                           *
3*  BitlBee - An IRC to IM gateway                                           *
4*  Jabber module - Main file                                                *
5*                                                                           *
6*  Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net>                   *
7*                                                                           *
8*  This program is free software; you can redistribute it and/or modify     *
9*  it under the terms of the GNU General Public License as published by     *
10*  the Free Software Foundation; either version 2 of the License, or        *
11*  (at your option) any later version.                                      *
12*                                                                           *
13*  This program is distributed in the hope that it will be useful,          *
14*  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
15*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
16*  GNU General Public License for more details.                             *
17*                                                                           *
18*  You should have received a copy of the GNU General Public License along  *
19*  with this program; if not, write to the Free Software Foundation, Inc.,  *
20*  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.              *
21*                                                                           *
22\***************************************************************************/
23
24#ifndef _JABBER_H
25#define _JABBER_H
26
27#include <glib.h>
28
29#include "xmltree.h"
30#include "bitlbee.h"
31
[b5c8a34]32extern GSList *jabber_connections;
33
[21167d2]34typedef enum
35{
[bb95d43]36        JFLAG_STREAM_STARTED = 1,       /* Set when we detected the beginning of the stream
[a21a8ac]37                                           and want to do auth. */
[bb95d43]38        JFLAG_AUTHENTICATED = 2,        /* Set when we're successfully authenticatd. */
39        JFLAG_STREAM_RESTART = 4,       /* Set when we want to restart the stream (after
[a21a8ac]40                                           SASL or TLS). */
[bb95d43]41        JFLAG_WAIT_SESSION = 8,         /* Set if we sent a <session> tag and need a reply
[a21a8ac]42                                           before we continue. */
[bb95d43]43        JFLAG_WAIT_BIND = 16,           /* ... for <bind> tag. */
44        JFLAG_WANT_TYPING = 32,         /* Set if we ever sent a typing notification, this
[788a1af]45                                           activates all XEP-85 related code. */
[bb95d43]46        JFLAG_XMLCONSOLE = 64,          /* If the user added an xmlconsole buddy. */
[21167d2]47} jabber_flags_t;
48
[a21a8ac]49typedef enum
50{
[63075d7]51        JBFLAG_PROBED_XEP85 = 1,        /* Set this when we sent our probe packet to make
[a21a8ac]52                                           sure it gets sent only once. */
[63075d7]53        JBFLAG_DOES_XEP85 = 2,          /* Set this when the resource seems to support
[788a1af]54                                           XEP85 (typing notification shite). */
[63075d7]55        JBFLAG_IS_CHATROOM = 4,         /* It's convenient to use this JID thingy for
[e35d1a1]56                                           groupchat state info too. */
[63075d7]57        JBFLAG_IS_ANONYMOUS = 8,        /* For anonymous chatrooms, when we don't have
[6286f80]58                                           have a real JID. */
[0d3f30f]59} jabber_buddy_flags_t;
[a21a8ac]60
[dc0ba9c]61/* Stores a streamhost's(a.k.a. proxy) data */
62typedef struct
63{
64        char *jid;
65        char *host;
66        char port[6];
67} jabber_streamhost_t;
68
[63075d7]69typedef enum
70{
71        JCFLAG_MESSAGE_SENT = 1,        /* Set this after sending the first message, so
72                                           we can detect echoes/backlogs. */
73} jabber_chat_flags_t;
74
[5e202b0]75struct jabber_data
76{
[0da65d5]77        struct im_connection *ic;
[5e202b0]78       
79        int fd;
80        void *ssl;
81        char *txq;
82        int tx_len;
83        int r_inpa, w_inpa;
84       
85        struct xt_parser *xt;
86        jabber_flags_t flags;
87       
88        char *username;         /* USERNAME@server */
89        char *server;           /* username@SERVER -=> server/domain, not hostname */
[172a73f1]90       
91        /* After changing one of these two (or the priority setting), call
92           presence_send_update() to inform the server about the changes. */
[5e202b0]93        struct jabber_away_state *away_state;
94        char *away_message;
95       
[608f8cf]96        char *cached_id_prefix;
[038d17f]97        GHashTable *node_cache;
[6a1128d]98        GHashTable *buddies;
[2c2df7d]99
100        GSList *filetransfers;
[dc0ba9c]101        GSList *streamhosts;
102        int have_streamhosts;
[5e202b0]103};
104
105struct jabber_away_state
106{
107        char code[5];
108        char *full_name;
109};
110
[0da65d5]111typedef xt_status (*jabber_cache_event) ( struct im_connection *ic, struct xt_node *node, struct xt_node *orig );
[038d17f]112
113struct jabber_cache_entry
114{
[979cfb4]115        time_t saved_at;
[038d17f]116        struct xt_node *node;
117        jabber_cache_event func;
118};
119
[6a1128d]120struct jabber_buddy
121{
[0d3f30f]122        char *bare_jid;
[a21a8ac]123        char *full_jid;
[6a1128d]124        char *resource;
125       
[6286f80]126        char *ext_jid; /* The JID to use in BitlBee. The real JID if possible, */
127                       /* otherwise something similar to the conference JID. */
[e35d1a1]128       
[6a1128d]129        int priority;
130        struct jabber_away_state *away_state;
131        char *away_message;
[dc0ba9c]132        GSList *features;
[6a1128d]133       
134        time_t last_act;
[0d3f30f]135        jabber_buddy_flags_t flags;
[6a1128d]136       
137        struct jabber_buddy *next;
138};
139
[e35d1a1]140struct jabber_chat
141{
142        int flags;
143        char *name;
[9c9b37c]144        char *my_full_jid; /* Separate copy because of case sensitivity. */
[e35d1a1]145        struct jabber_buddy *me;
146};
147
[2c2df7d]148struct jabber_transfer
149{
150        /* bitlbee's handle for this transfer */
151        file_transfer_t *ft;
152
153        /* the stream's private handle */
154        gpointer streamhandle;
155
156        struct im_connection *ic;
157
158        int watch_in;
159        int watch_out;
160
161        char *ini_jid;
162        char *tgt_jid;
163        char *iq_id;
164        char *sid;
165        int accepted;
166
167        size_t bytesread, byteswritten;
168        int fd;
[2ff2076]169        struct sockaddr_storage saddr;
[2c2df7d]170};
171
[bb95d43]172#define JABBER_XMLCONSOLE_HANDLE "xmlconsole"
173
174#define JABBER_PORT_DEFAULT "5222"
175#define JABBER_PORT_MIN 5220
176#define JABBER_PORT_MAX 5229
177
[dfa41a4]178/* Prefixes to use for packet IDs (mainly for IQ packets ATM). Usually the
179   first one should be used, but when storing a packet in the cache, a
180   "special" kind of ID is assigned to make it easier later to figure out
[608f8cf]181   if we have to do call an event handler for the response packet. Also
182   we'll append a hash to make sure we won't trigger on cached packets from
183   other BitlBee users. :-) */
[dfa41a4]184#define JABBER_PACKET_ID "BeeP"
185#define JABBER_CACHED_ID "BeeC"
186
[979cfb4]187/* The number of seconds to keep cached packets before garbage collecting
188   them. This gc is done on every keepalive (every minute). */
189#define JABBER_CACHE_MAX_AGE 600
190
[47d3ac4]191/* RFC 392[01] stuff */
192#define XMLNS_TLS          "urn:ietf:params:xml:ns:xmpp-tls"
193#define XMLNS_SASL         "urn:ietf:params:xml:ns:xmpp-sasl"
194#define XMLNS_BIND         "urn:ietf:params:xml:ns:xmpp-bind"
195#define XMLNS_SESSION      "urn:ietf:params:xml:ns:xmpp-session"
196#define XMLNS_STANZA_ERROR "urn:ietf:params:xml:ns:xmpp-stanzas"
197#define XMLNS_STREAM_ERROR "urn:ietf:params:xml:ns:xmpp-streams"
198#define XMLNS_ROSTER       "jabber:iq:roster"
199
200/* Some supported extensions/legacy stuff */
[2c2df7d]201#define XMLNS_AUTH         "jabber:iq:auth"                                      /* XEP-0078 */
202#define XMLNS_VERSION      "jabber:iq:version"                                   /* XEP-0092 */
203#define XMLNS_TIME         "jabber:iq:time"                                      /* XEP-0090 */
[eded1f7]204#define XMLNS_PING         "urn:xmpp:ping"                                       /* XEP-0199 */
[2c2df7d]205#define XMLNS_VCARD        "vcard-temp"                                          /* XEP-0054 */
206#define XMLNS_DELAY        "jabber:x:delay"                                      /* XEP-0091 */
207#define XMLNS_XDATA        "jabber:x:data"                                       /* XEP-0004 */
208#define XMLNS_CHATSTATES   "http://jabber.org/protocol/chatstates"               /* XEP-0085 */
[dc0ba9c]209#define XMLNS_DISCO_INFO   "http://jabber.org/protocol/disco#info"               /* XEP-0030 */
210#define XMLNS_DISCO_ITEMS  "http://jabber.org/protocol/disco#items"              /* XEP-0030 */
[2c2df7d]211#define XMLNS_MUC          "http://jabber.org/protocol/muc"                      /* XEP-0045 */
212#define XMLNS_MUC_USER     "http://jabber.org/protocol/muc#user"                 /* XEP-0045 */
[1ba7e8f]213#define XMLNS_CAPS         "http://jabber.org/protocol/caps"                     /* XEP-0115 */
[2c2df7d]214#define XMLNS_FEATURE      "http://jabber.org/protocol/feature-neg"              /* XEP-0020 */
215#define XMLNS_SI           "http://jabber.org/protocol/si"                       /* XEP-0095 */
216#define XMLNS_FILETRANSFER "http://jabber.org/protocol/si/profile/file-transfer" /* XEP-0096 */
217#define XMLNS_BYTESTREAMS  "http://jabber.org/protocol/bytestreams"              /* XEP-0065 */
218#define XMLNS_IBB          "http://jabber.org/protocol/ibb"                      /* XEP-0047 */
[47d3ac4]219
[21167d2]220/* iq.c */
[f06894d]221xt_status jabber_pkt_iq( struct xt_node *node, gpointer data );
[0da65d5]222int jabber_init_iq_auth( struct im_connection *ic );
223xt_status jabber_pkt_bind_sess( struct im_connection *ic, struct xt_node *node, struct xt_node *orig );
224int jabber_get_roster( struct im_connection *ic );
225int jabber_get_vcard( struct im_connection *ic, char *bare_jid );
226int jabber_add_to_roster( struct im_connection *ic, char *handle, char *name );
227int jabber_remove_from_roster( struct im_connection *ic, char *handle );
[dc0ba9c]228xt_status jabber_iq_query_features( struct im_connection *ic, char *bare_jid );
229xt_status jabber_iq_query_server( struct im_connection *ic, char *jid, char *xmlns );
[21167d2]230
[2c2df7d]231/* si.c */
[2ff2076]232int jabber_si_handle_request( struct im_connection *ic, struct xt_node *node, struct xt_node *sinode );
233void jabber_si_transfer_request( struct im_connection *ic, file_transfer_t *ft, char *who );
234void jabber_si_free_transfer( file_transfer_t *ft);
235
236/* s5bytestream.c */
237int jabber_bs_recv_request( struct im_connection *ic, struct xt_node *node, struct xt_node *qnode);
238gboolean jabber_bs_send_start( struct jabber_transfer *tf );
[dce3903]239gboolean jabber_bs_send_write( file_transfer_t *ft, char *buffer, unsigned int len );
[2c2df7d]240
[cfbb3a6]241/* message.c */
[f06894d]242xt_status jabber_pkt_message( struct xt_node *node, gpointer data );
[0b4a0db]243
244/* presence.c */
[f06894d]245xt_status jabber_pkt_presence( struct xt_node *node, gpointer data );
[0da65d5]246int presence_send_update( struct im_connection *ic );
247int presence_send_request( struct im_connection *ic, char *handle, char *request );
[f06894d]248
[21167d2]249/* jabber_util.c */
[ebe7b36]250char *set_eval_priority( set_t *set, char *value );
[f06894d]251char *set_eval_tls( set_t *set, char *value );
[21167d2]252struct xt_node *jabber_make_packet( char *name, char *type, char *to, struct xt_node *children );
[2c2df7d]253struct xt_node *jabber_make_error_packet( struct xt_node *orig, char *err_cond, char *err_type, char *err_code );
[0da65d5]254void jabber_cache_add( struct im_connection *ic, struct xt_node *node, jabber_cache_event func );
255struct xt_node *jabber_cache_get( struct im_connection *ic, char *id );
[038d17f]256void jabber_cache_entry_free( gpointer entry );
[0da65d5]257void jabber_cache_clean( struct im_connection *ic );
[4306d8b]258xt_status jabber_cache_handle_packet( struct im_connection *ic, struct xt_node *node );
[5e202b0]259const struct jabber_away_state *jabber_away_state_by_code( char *code );
260const struct jabber_away_state *jabber_away_state_by_name( char *name );
[0da65d5]261void jabber_buddy_ask( struct im_connection *ic, char *handle );
[e35d1a1]262char *jabber_normalize( const char *orig );
[0d3f30f]263
264typedef enum
265{
266        GET_BUDDY_CREAT = 1,    /* Try to create it, if necessary. */
[e35d1a1]267        GET_BUDDY_EXACT = 2,    /* Get an exact match (only makes sense with bare JIDs). */
268        GET_BUDDY_FIRST = 4,    /* No selection, simply get the first resource for this JID. */
[0d3f30f]269} get_buddy_flags_t;
270
[1baaef8]271struct jabber_error
272{
273        char *code, *text, *type;
274};
275
[0da65d5]276struct jabber_buddy *jabber_buddy_add( struct im_connection *ic, char *full_jid );
277struct jabber_buddy *jabber_buddy_by_jid( struct im_connection *ic, char *jid, get_buddy_flags_t flags );
[b9f8b87]278struct jabber_buddy *jabber_buddy_by_ext_jid( struct im_connection *ic, char *jid, get_buddy_flags_t flags );
[0da65d5]279int jabber_buddy_remove( struct im_connection *ic, char *full_jid );
280int jabber_buddy_remove_bare( struct im_connection *ic, char *bare_jid );
[43671b9]281time_t jabber_get_timestamp( struct xt_node *xt );
[1baaef8]282struct jabber_error *jabber_error_parse( struct xt_node *node, char *xmlns );
283void jabber_error_free( struct jabber_error *err );
[5e202b0]284
285extern const struct jabber_away_state jabber_away_state_list[];
[21167d2]286
287/* io.c */
[0da65d5]288int jabber_write_packet( struct im_connection *ic, struct xt_node *node );
289int jabber_write( struct im_connection *ic, char *buf, int len );
[21167d2]290gboolean jabber_connected_plain( gpointer data, gint source, b_input_condition cond );
[42127dc]291gboolean jabber_connected_ssl( gpointer data, void *source, b_input_condition cond );
[0da65d5]292gboolean jabber_start_stream( struct im_connection *ic );
293void jabber_end_stream( struct im_connection *ic );
[21167d2]294
[5997488]295/* sasl.c */
296xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data );
297xt_status sasl_pkt_challenge( struct xt_node *node, gpointer data );
298xt_status sasl_pkt_result( struct xt_node *node, gpointer data );
[0da65d5]299gboolean sasl_supported( struct im_connection *ic );
[5997488]300
[e35d1a1]301/* conference.c */
302struct groupchat *jabber_chat_join( struct im_connection *ic, char *room, char *nick, char *password );
[5bd21df]303struct groupchat *jabber_chat_by_jid( struct im_connection *ic, const char *name );
[9da0bbf]304void jabber_chat_free( struct groupchat *c );
[43671b9]305int jabber_chat_msg( struct groupchat *ic, char *message, int flags );
[ef5c185]306int jabber_chat_topic( struct groupchat *c, char *topic );
[e35d1a1]307int jabber_chat_leave( struct groupchat *c, const char *reason );
308void jabber_chat_pkt_presence( struct im_connection *ic, struct jabber_buddy *bud, struct xt_node *node );
309void jabber_chat_pkt_message( struct im_connection *ic, struct jabber_buddy *bud, struct xt_node *node );
[eded1f7]310void jabber_chat_invite( struct groupchat *c, char *who, char *message );
[e35d1a1]311
[f06894d]312#endif
Note: See TracBrowser for help on using the repository browser.