aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/jabber/jabber.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/jabber/jabber.h')
-rw-r--r--protocols/jabber/jabber.h488
1 files changed, 184 insertions, 304 deletions
diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h
index 0b907500..42f57ae1 100644
--- a/protocols/jabber/jabber.h
+++ b/protocols/jabber/jabber.h
@@ -1,315 +1,195 @@
-/*
- * 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"
+
+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. */
+} 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);
+ 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). */
+} jabber_buddy_flags_t;
+#define JABBER_PORT_DEFAULT "5222"
+#define JABBER_PORT_MIN 5220
+#define JABBER_PORT_MAX 5229
-/* --------------------------------------------------------- */
-/* */
-/* Error structures & constants */
-/* */
-/* --------------------------------------------------------- */
-typedef struct terror_struct
+struct jabber_data
{
- 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"}
-
-/* --------------------------------------------------------- */
-/* */
-/* 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 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;
+
+ GHashTable *node_cache;
+ GHashTable *buddies;
+};
+
+struct jabber_away_state
{
- /* 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);
+ char code[5];
+ char *full_name;
+};
-} *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);
-
-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);
-
-char *jab_auth(jconn j);
-char *jab_reg(jconn j);
+typedef xt_status (*jabber_cache_event) ( struct im_connection *ic, struct xt_node *node, struct xt_node *orig );
+struct jabber_cache_entry
+{
+ struct xt_node *node;
+ jabber_cache_event func;
+};
+struct jabber_buddy
+{
+ char *bare_jid;
+ char *full_jid;
+ char *resource;
+
+ int priority;
+ struct jabber_away_state *away_state;
+ char *away_message;
+
+ time_t last_act;
+ jabber_buddy_flags_t flags;
+
+ struct jabber_buddy *next;
+};
+
+/* 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. */
+#define JABBER_PACKET_ID "BeeP"
+#define JABBER_CACHED_ID "BeeC"
+
+/* 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_VCARD "vcard-temp" /* XEP-0054 */
+#define XMLNS_CHATSTATES "http://jabber.org/protocol/chatstates" /* 0085 */
+#define XMLNS_DISCOVER "http://jabber.org/protocol/disco#info" /* 0030 */
+
+/* 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 );
+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( char *orig );
+
+typedef enum
+{
+ GET_BUDDY_CREAT = 1, /* Try to create it, if necessary. */
+ GET_BUDDY_EXACT = 2, /* Get an exact message (only makes sense with bare JIDs). */
+} get_buddy_flags_t;
+
+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 );
+int jabber_buddy_remove( struct im_connection *ic, char *full_jid );
+int jabber_buddy_remove_bare( struct im_connection *ic, char *bare_jid );
+
+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 );
-#ifdef __cplusplus
-}
#endif
-
-#endif /* INCL_JABBER_H */