diff options
| author | Jelmer Vernooij <jelmer@samba.org> | 2008-04-02 16:22:57 +0200 | 
|---|---|---|
| committer | Jelmer Vernooij <jelmer@samba.org> | 2008-04-02 16:22:57 +0200 | 
| commit | 85d7b857fb8ca8e3c03d4abb3368a0966760630c (patch) | |
| tree | a16163e557bcae3af41bde7d2d771d64ca248a97 /protocols/jabber/jabber.h | |
| parent | 875ad4201402b1a8f80ba22a6cdcdb152c6e5510 (diff) | |
| parent | dd345753c1742905c9f81aa71d8b09109fbc5456 (diff) | |
Merge trunk.
Diffstat (limited to 'protocols/jabber/jabber.h')
| -rw-r--r-- | protocols/jabber/jabber.h | 549 | 
1 files changed, 245 insertions, 304 deletions
| diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h index 0b907500..1ff0e8dd 100644 --- a/protocols/jabber/jabber.h +++ b/protocols/jabber/jabber.h @@ -1,315 +1,256 @@ -/* - *  This program is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License as published by - *  the Free Software Foundation; either version 2 of the License, or - *  (at your option) any later version. - * - *  This program is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU General Public License for more details. - * - *  You should have received a copy of the GNU General Public License - *  along with this program; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - *  Jabber - *  Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ - */ - -#include <string.h> -#include <stdlib.h> -#include <sys/types.h> -#include <stdio.h> -#include <setjmp.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <signal.h> -#include <stdarg.h> -#include <time.h> -#include <ctype.h> -#ifdef _WIN32 -#undef DATADIR -#include "sock.h" -#endif - -#include "lib.h" - - -#ifndef INCL_JABBER_H -#define INCL_JABBER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* --------------------------------------------------------- */ -/*                                                           */ -/* JID structures & constants                                */ -/*                                                           */ -/* --------------------------------------------------------- */ -#define JID_RESOURCE 1 -#define JID_USER     2 -#define JID_SERVER   4 - -typedef struct jid_struct -{  -    pool               p; -    char*              resource; -    char*              user; -    char*              server; -    char*              full; -    struct jid_struct *next; /* for lists of jids */ -} *jid; -   -jid     jid_new(pool p, char *idstr);	       /* Creates a jabber id from the idstr */ -void    jid_set(jid id, char *str, int item);  /* Individually sets jid components */ -char*   jid_full(jid id);		       /* Builds a string type=user/resource@server from the jid data */ -int     jid_cmp(jid a, jid b);		       /* Compares two jid's, returns 0 for perfect match */ -int     jid_cmpx(jid a, jid b, int parts);     /* Compares just the parts specified as JID_|JID_ */ -jid     jid_append(jid a, jid b);	       /* Appending b to a (list), no dups */ -xmlnode jid_xres(jid id);		       /* Returns xmlnode representation of the resource?query=string */ -xmlnode jid_nodescan(jid id, xmlnode x);       /* Scans the children of the node for a matching jid attribute */ -jid     jid_user(jid a);                       /* returns the same jid but just of the user@host part */ - - -/* --------------------------------------------------------- */ -/*                                                           */ -/* JPacket structures & constants                            */ -/*                                                           */ -/* --------------------------------------------------------- */ -#define JPACKET_UNKNOWN   0x00 -#define JPACKET_MESSAGE   0x01 -#define JPACKET_PRESENCE  0x02 -#define JPACKET_IQ        0x04 -#define JPACKET_S10N      0x08 - -#define JPACKET__UNKNOWN      0 -#define JPACKET__NONE         1 -#define JPACKET__ERROR        2 -#define JPACKET__CHAT         3 -#define JPACKET__GROUPCHAT    4 -#define JPACKET__GET          5 -#define JPACKET__SET          6 -#define JPACKET__RESULT       7 -#define JPACKET__SUBSCRIBE    8 -#define JPACKET__SUBSCRIBED   9 -#define JPACKET__UNSUBSCRIBE  10 -#define JPACKET__UNSUBSCRIBED 11 -#define JPACKET__AVAILABLE    12 -#define JPACKET__UNAVAILABLE  13 -#define JPACKET__PROBE        14 -#define JPACKET__HEADLINE     15 -#define JPACKET__INVISIBLE    16 - -typedef struct jpacket_struct +/***************************************************************************\ +*                                                                           * +*  BitlBee - An IRC to IM gateway                                           * +*  Jabber module - Main file                                                * +*                                                                           * +*  Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net>                   * +*                                                                           * +*  This program is free software; you can redistribute it and/or modify     * +*  it under the terms of the GNU General Public License as published by     * +*  the Free Software Foundation; either version 2 of the License, or        * +*  (at your option) any later version.                                      * +*                                                                           * +*  This program is distributed in the hope that it will be useful,          * +*  but WITHOUT ANY WARRANTY; without even the implied warranty of           * +*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            * +*  GNU General Public License for more details.                             * +*                                                                           * +*  You should have received a copy of the GNU General Public License along  * +*  with this program; if not, write to the Free Software Foundation, Inc.,  * +*  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.              * +*                                                                           * +\***************************************************************************/ + +#ifndef _JABBER_H +#define _JABBER_H + +#include <glib.h> + +#include "xmltree.h" +#include "bitlbee.h" + +extern GSList *jabber_connections; + +typedef enum  { -    unsigned char type; -    int           subtype; -    int           flag; -    void*         aux1; -    xmlnode       x; -    jid           to; -    jid           from; -    char*         iqns; -    xmlnode       iq; -    pool          p; -} *jpacket, _jpacket; -  -jpacket jpacket_new(xmlnode x);	    /* Creates a jabber packet from the xmlnode */ -int     jpacket_subtype(jpacket p); /* Returns the subtype value (looks at xmlnode for it) */ - - -/* --------------------------------------------------------- */ -/*                                                           */ -/* Presence Proxy DB structures & constants                  */ -/*                                                           */ -/* --------------------------------------------------------- */ -typedef struct ppdb_struct -{			       -    jid     id;		       /* entry data */ -    int     pri; -    xmlnode x; -    struct ppdb_struct* user;  /* linked list for user@server */ -    pool                p;     /* db-level data */ -    struct ppdb_struct* next; -} _ppdb, *ppdb; - -ppdb    ppdb_insert(ppdb db, jid id, xmlnode x); /* Inserts presence into the proxy */ -xmlnode ppdb_primary(ppdb db, jid id);		 /* Fetches the matching primary presence for the id */ -void    ppdb_free(ppdb db);			 /* Frees the db and all entries */ -xmlnode ppdb_get(ppdb db, jid id);		 /* Called successively to return each presence xmlnode */ -						 /*   for the id and children, returns NULL at the end */ - - -/* --------------------------------------------------------- */ -/*                                                           */ -/* Simple Jabber Rate limit functions                        */ -/*                                                           */ -/* --------------------------------------------------------- */ -typedef struct jlimit_struct +	JFLAG_STREAM_STARTED = 1,       /* Set when we detected the beginning of the stream +	                                   and want to do auth. */ +	JFLAG_AUTHENTICATED = 2,        /* Set when we're successfully authenticatd. */ +	JFLAG_STREAM_RESTART = 4,       /* Set when we want to restart the stream (after +	                                   SASL or TLS). */ +	JFLAG_WAIT_SESSION = 8,	        /* Set if we sent a <session> tag and need a reply +	                                   before we continue. */ +	JFLAG_WAIT_BIND = 16,           /* ... for <bind> tag. */ +	JFLAG_WANT_TYPING = 32,         /* Set if we ever sent a typing notification, this +	                                   activates all XEP-85 related code. */ +	JFLAG_XMLCONSOLE = 64,          /* If the user added an xmlconsole buddy. */ +} jabber_flags_t; + +typedef enum  { -    char *key; -    int start; -    int points; -    int maxt, maxp; -    pool p; -} *jlimit, _jlimit; -  -jlimit jlimit_new(int maxt, int maxp); -void jlimit_free(jlimit r); -int jlimit_check(jlimit r, char *key, int points); - - -/* --------------------------------------------------------- */ -/*                                                           */ -/* Error structures & constants                              */ -/*                                                           */ -/* --------------------------------------------------------- */ -typedef struct terror_struct +	JBFLAG_PROBED_XEP85 = 1,        /* Set this when we sent our probe packet to make +	                                   sure it gets sent only once. */ +	JBFLAG_DOES_XEP85 = 2,          /* Set this when the resource seems to support +	                                   XEP85 (typing notification shite). */ +	JBFLAG_IS_CHATROOM = 4,         /* It's convenient to use this JID thingy for +	                                   groupchat state info too. */ +	JBFLAG_IS_ANONYMOUS = 8,        /* For anonymous chatrooms, when we don't have +	                                   have a real JID. */ +} jabber_buddy_flags_t; + +typedef enum  { -    int  code; -    char msg[64]; -} terror; - -#define TERROR_BAD           (terror){400,"Bad Request"} -#define TERROR_AUTH          (terror){401,"Unauthorized"} -#define TERROR_PAY           (terror){402,"Payment Required"} -#define TERROR_FORBIDDEN     (terror){403,"Forbidden"} -#define TERROR_NOTFOUND      (terror){404,"Not Found"} -#define TERROR_NOTALLOWED    (terror){405,"Not Allowed"} -#define TERROR_NOTACCEPTABLE (terror){406,"Not Acceptable"} -#define TERROR_REGISTER      (terror){407,"Registration Required"} -#define TERROR_REQTIMEOUT    (terror){408,"Request Timeout"} -#define TERROR_CONFLICT      (terror){409,"Conflict"} - -#define TERROR_INTERNAL   (terror){500,"Internal Server Error"} -#define TERROR_NOTIMPL    (terror){501,"Not Implemented"} -#define TERROR_EXTERNAL   (terror){502,"Remote Server Error"} -#define TERROR_UNAVAIL    (terror){503,"Service Unavailable"} -#define TERROR_EXTTIMEOUT (terror){504,"Remote Server Timeout"} -#define TERROR_DISCONNECTED (terror){510,"Disconnected"} +	JCFLAG_MESSAGE_SENT = 1,        /* Set this after sending the first message, so +	                                   we can detect echoes/backlogs. */ +} jabber_chat_flags_t; -/* --------------------------------------------------------- */ -/*                                                           */ -/* Namespace constants                                       */ -/*                                                           */ -/* --------------------------------------------------------- */ -#define NSCHECK(x,n) (j_strcmp(xmlnode_get_attrib(x,"xmlns"),n) == 0) - -#define NS_CLIENT    "jabber:client" -#define NS_SERVER    "jabber:server" -#define NS_AUTH      "jabber:iq:auth" -#define NS_REGISTER  "jabber:iq:register" -#define NS_ROSTER    "jabber:iq:roster" -#define NS_OFFLINE   "jabber:x:offline" -#define NS_AGENT     "jabber:iq:agent" -#define NS_AGENTS    "jabber:iq:agents" -#define NS_DELAY     "jabber:x:delay" -#define NS_VERSION   "jabber:iq:version" -#define NS_TIME      "jabber:iq:time" -#define NS_VCARD     "vcard-temp" -#define NS_PRIVATE   "jabber:iq:private" -#define NS_SEARCH    "jabber:iq:search" -#define NS_OOB       "jabber:iq:oob" -#define NS_XOOB      "jabber:x:oob" -#define NS_ADMIN     "jabber:iq:admin" -#define NS_FILTER    "jabber:iq:filter" -#define NS_AUTH_0K   "jabber:iq:auth:0k" - - -/* --------------------------------------------------------- */ -/*                                                           */ -/* Message Types                                             */ -/*                                                           */ -/* --------------------------------------------------------- */ -#define TMSG_NORMAL	"normal" -#define TMSG_ERROR	"error" -#define TMSG_CHAT	"chat" -#define TMSG_GROUPCHAT	"groupchat" -#define TMSG_HEADLINE	"headline" - - -/* --------------------------------------------------------- */ -/*                                                           */ -/* JUtil functions                                           */ -/*                                                           */ -/* --------------------------------------------------------- */ -xmlnode jutil_presnew(int type, char *to, char *status); /* Create a skeleton presence packet */ -xmlnode jutil_iqnew(int type, char *ns);		 /* Create a skeleton iq packet */ -xmlnode jutil_msgnew(char *type, char *to, char *subj, char *body); -							 /* Create a skeleton message packet */ -xmlnode jutil_header(char* xmlns, char* server);	 /* Create a skeleton stream packet */ -int     jutil_priority(xmlnode x);			 /* Determine priority of this packet */ -void    jutil_tofrom(xmlnode x);			 /* Swaps to/from fields on a packet */ -xmlnode jutil_iqresult(xmlnode x);			 /* Generate a skeleton iq/result, given a iq/query */ -char*   jutil_timestamp(void);				 /* Get stringified timestamp */ -void    jutil_error(xmlnode x, terror E);		 /* Append an <error> node to x */ -void    jutil_delay(xmlnode msg, char *reason);		 /* Append a delay packet to msg */ -char*   jutil_regkey(char *key, char *seed);		 /* pass a seed to generate a key, pass the key again to validate (returns it) */ - - -/* --------------------------------------------------------- */ -/*                                                           */ -/* JConn structures & functions                              */ -/*                                                           */ -/* --------------------------------------------------------- */ -#define JCONN_STATE_OFF       0 -#define JCONN_STATE_CONNECTED 1 -#define JCONN_STATE_ON        2 -#define JCONN_STATE_AUTH      3 - -typedef struct jconn_struct +struct jabber_data  { -    /* Core structure */ -    pool        p;	       /* Memory allocation pool */ -    int         state;	   /* Connection state flag */ -    int         fd;	       /* Connection file descriptor */ -    jid         user;      /* User info */ -    char        *pass;     /* User passwd */ - -    /* Stream stuff */ -    int         id;        /* id counter for jab_getid() function */ -    char        idbuf[9];  /* temporary storage for jab_getid() */ -    char        *sid;      /* stream id from server, for digest auth */ -    XML_Parser  parser;    /* Parser instance */ -    xmlnode     current;   /* Current node in parsing instance.. */ - -    /* Event callback ptrs */ -    void (*on_state)(struct jconn_struct *j, int state); -    void (*on_packet)(struct jconn_struct *j, jpacket p); - -} *jconn, jconn_struct; - -typedef void (*jconn_state_h)(jconn j, int state); -typedef void (*jconn_packet_h)(jconn j, jpacket p); - - -jconn jab_new(char *user, char *pass); -void jab_delete(jconn j); -void jab_state_handler(jconn j, jconn_state_h h); -void jab_packet_handler(jconn j, jconn_packet_h h); -void jab_start(jconn j); -void jab_stop(jconn j); - -int jab_getfd(jconn j); -jid jab_getjid(jconn j); -char *jab_getsid(jconn j); -char *jab_getid(jconn j); +	struct im_connection *ic; +	 +	int fd; +	void *ssl; +	char *txq; +	int tx_len; +	int r_inpa, w_inpa; +	 +	struct xt_parser *xt; +	jabber_flags_t flags; +	 +	char *username;		/* USERNAME@server */ +	char *server;		/* username@SERVER -=> server/domain, not hostname */ +	 +	/* After changing one of these two (or the priority setting), call +	   presence_send_update() to inform the server about the changes. */ +	struct jabber_away_state *away_state; +	char *away_message; +	 +	char *cached_id_prefix; +	GHashTable *node_cache; +	GHashTable *buddies; +}; + +struct jabber_away_state +{ +	char code[5]; +	char *full_name; +}; -void jab_send(jconn j, xmlnode x); -void jab_send_raw(jconn j, const char *str); -void jab_recv(jconn j); -void jab_poll(jconn j, int timeout); +typedef xt_status (*jabber_cache_event) ( struct im_connection *ic, struct xt_node *node, struct xt_node *orig ); -char *jab_auth(jconn j); -char *jab_reg(jconn j); +struct jabber_cache_entry +{ +	time_t saved_at; +	struct xt_node *node; +	jabber_cache_event func; +}; +struct jabber_buddy +{ +	char *bare_jid; +	char *full_jid; +	char *resource; +	 +	char *ext_jid; /* The JID to use in BitlBee. The real JID if possible, */ +	               /* otherwise something similar to the conference JID. */ +	 +	int priority; +	struct jabber_away_state *away_state; +	char *away_message; +	 +	time_t last_act; +	jabber_buddy_flags_t flags; +	 +	struct jabber_buddy *next; +}; + +struct jabber_chat +{ +	int flags; +	char *name; +	char *my_full_jid; /* Separate copy because of case sensitivity. */ +	struct jabber_buddy *me; +}; + +#define JABBER_XMLCONSOLE_HANDLE "xmlconsole" + +#define JABBER_PORT_DEFAULT "5222" +#define JABBER_PORT_MIN 5220 +#define JABBER_PORT_MAX 5229 + +/* Prefixes to use for packet IDs (mainly for IQ packets ATM). Usually the +   first one should be used, but when storing a packet in the cache, a +   "special" kind of ID is assigned to make it easier later to figure out +   if we have to do call an event handler for the response packet. Also +   we'll append a hash to make sure we won't trigger on cached packets from +   other BitlBee users. :-) */ +#define JABBER_PACKET_ID "BeeP" +#define JABBER_CACHED_ID "BeeC" + +/* The number of seconds to keep cached packets before garbage collecting +   them. This gc is done on every keepalive (every minute). */ +#define JABBER_CACHE_MAX_AGE 600 + +/* RFC 392[01] stuff */ +#define XMLNS_TLS          "urn:ietf:params:xml:ns:xmpp-tls" +#define XMLNS_SASL         "urn:ietf:params:xml:ns:xmpp-sasl" +#define XMLNS_BIND         "urn:ietf:params:xml:ns:xmpp-bind" +#define XMLNS_SESSION      "urn:ietf:params:xml:ns:xmpp-session" +#define XMLNS_STANZA_ERROR "urn:ietf:params:xml:ns:xmpp-stanzas" +#define XMLNS_STREAM_ERROR "urn:ietf:params:xml:ns:xmpp-streams" +#define XMLNS_ROSTER       "jabber:iq:roster" + +/* Some supported extensions/legacy stuff */ +#define XMLNS_AUTH         "jabber:iq:auth"                     /* XEP-0078 */ +#define XMLNS_VERSION      "jabber:iq:version"                  /* XEP-0092 */ +#define XMLNS_TIME         "jabber:iq:time"                     /* XEP-0090 */ +#define XMLNS_PING         "urn:xmpp:ping"                      /* XEP-0199 */ +#define XMLNS_VCARD        "vcard-temp"                         /* XEP-0054 */ +#define XMLNS_DELAY        "jabber:x:delay"                     /* XEP-0091 */ +#define XMLNS_CHATSTATES   "http://jabber.org/protocol/chatstates"  /* 0085 */ +#define XMLNS_DISCOVER     "http://jabber.org/protocol/disco#info"  /* 0030 */ +#define XMLNS_MUC          "http://jabber.org/protocol/muc"     /* XEP-0045 */ +#define XMLNS_MUC_USER     "http://jabber.org/protocol/muc#user"/* XEP-0045 */ +#define XMLNS_CAPS         "http://jabber.org/protocol/caps"    /* XEP-0115 */ + +/* iq.c */ +xt_status jabber_pkt_iq( struct xt_node *node, gpointer data ); +int jabber_init_iq_auth( struct im_connection *ic ); +xt_status jabber_pkt_bind_sess( struct im_connection *ic, struct xt_node *node, struct xt_node *orig ); +int jabber_get_roster( struct im_connection *ic ); +int jabber_get_vcard( struct im_connection *ic, char *bare_jid ); +int jabber_add_to_roster( struct im_connection *ic, char *handle, char *name ); +int jabber_remove_from_roster( struct im_connection *ic, char *handle ); + +/* message.c */ +xt_status jabber_pkt_message( struct xt_node *node, gpointer data ); + +/* presence.c */ +xt_status jabber_pkt_presence( struct xt_node *node, gpointer data ); +int presence_send_update( struct im_connection *ic ); +int presence_send_request( struct im_connection *ic, char *handle, char *request ); + +/* jabber_util.c */ +char *set_eval_priority( set_t *set, char *value ); +char *set_eval_tls( set_t *set, char *value ); +struct xt_node *jabber_make_packet( char *name, char *type, char *to, struct xt_node *children ); +struct xt_node *jabber_make_error_packet( struct xt_node *orig, char *err_cond, char *err_type ); +void jabber_cache_add( struct im_connection *ic, struct xt_node *node, jabber_cache_event func ); +struct xt_node *jabber_cache_get( struct im_connection *ic, char *id ); +void jabber_cache_entry_free( gpointer entry ); +void jabber_cache_clean( struct im_connection *ic ); +xt_status jabber_cache_handle_packet( struct im_connection *ic, struct xt_node *node ); +const struct jabber_away_state *jabber_away_state_by_code( char *code ); +const struct jabber_away_state *jabber_away_state_by_name( char *name ); +void jabber_buddy_ask( struct im_connection *ic, char *handle ); +char *jabber_normalize( const char *orig ); + +typedef enum +{ +	GET_BUDDY_CREAT = 1,	/* Try to create it, if necessary. */ +	GET_BUDDY_EXACT = 2,	/* Get an exact match (only makes sense with bare JIDs). */ +	GET_BUDDY_FIRST = 4,	/* No selection, simply get the first resource for this JID. */ +} get_buddy_flags_t; +struct jabber_error +{ +	char *code, *text, *type; +}; + +struct jabber_buddy *jabber_buddy_add( struct im_connection *ic, char *full_jid ); +struct jabber_buddy *jabber_buddy_by_jid( struct im_connection *ic, char *jid, get_buddy_flags_t flags ); +struct jabber_buddy *jabber_buddy_by_ext_jid( struct im_connection *ic, char *jid, get_buddy_flags_t flags ); +int jabber_buddy_remove( struct im_connection *ic, char *full_jid ); +int jabber_buddy_remove_bare( struct im_connection *ic, char *bare_jid ); +time_t jabber_get_timestamp( struct xt_node *xt ); +struct jabber_error *jabber_error_parse( struct xt_node *node, char *xmlns ); +void jabber_error_free( struct jabber_error *err ); + +extern const struct jabber_away_state jabber_away_state_list[]; + +/* io.c */ +int jabber_write_packet( struct im_connection *ic, struct xt_node *node ); +int jabber_write( struct im_connection *ic, char *buf, int len ); +gboolean jabber_connected_plain( gpointer data, gint source, b_input_condition cond ); +gboolean jabber_connected_ssl( gpointer data, void *source, b_input_condition cond ); +gboolean jabber_start_stream( struct im_connection *ic ); +void jabber_end_stream( struct im_connection *ic ); + +/* sasl.c */ +xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data ); +xt_status sasl_pkt_challenge( struct xt_node *node, gpointer data ); +xt_status sasl_pkt_result( struct xt_node *node, gpointer data ); +gboolean sasl_supported( struct im_connection *ic ); + +/* conference.c */ +struct groupchat *jabber_chat_join( struct im_connection *ic, char *room, char *nick, char *password ); +struct groupchat *jabber_chat_by_jid( struct im_connection *ic, const char *name ); +void jabber_chat_free( struct groupchat *c ); +int jabber_chat_msg( struct groupchat *ic, char *message, int flags ); +int jabber_chat_topic( struct groupchat *c, char *topic ); +int jabber_chat_leave( struct groupchat *c, const char *reason ); +void jabber_chat_pkt_presence( struct im_connection *ic, struct jabber_buddy *bud, struct xt_node *node ); +void jabber_chat_pkt_message( struct im_connection *ic, struct jabber_buddy *bud, struct xt_node *node ); +void jabber_chat_invite( struct groupchat *c, char *who, char *message ); -#ifdef __cplusplus -}  #endif - -#endif	/* INCL_JABBER_H */ | 
