Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/jabber.h

    r259edd4 rb7d3cc34  
    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 
    32 typedef enum
     1/*
     2 *  This program is free software; you can redistribute it and/or modify
     3 *  it under the terms of the GNU General Public License as published by
     4 *  the Free Software Foundation; either version 2 of the License, or
     5 *  (at your option) any later version.
     6 *
     7 *  This program is distributed in the hope that it will be useful,
     8 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     9 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     10 *  GNU General Public License for more details.
     11 *
     12 *  You should have received a copy of the GNU General Public License
     13 *  along with this program; if not, write to the Free Software
     14 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     15 *
     16 *  Jabber
     17 *  Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
     18 */
     19
     20#include <string.h>
     21#include <stdlib.h>
     22#include <sys/types.h>
     23#include <stdio.h>
     24#include <setjmp.h>
     25#include <sys/stat.h>
     26#include <fcntl.h>
     27#include <errno.h>
     28#include <signal.h>
     29#include <stdarg.h>
     30#include <time.h>
     31#include <ctype.h>
     32#ifdef _WIN32
     33#undef DATADIR
     34#include "sock.h"
     35#endif
     36
     37#include "lib.h"
     38
     39
     40#ifndef INCL_JABBER_H
     41#define INCL_JABBER_H
     42
     43#ifdef __cplusplus
     44extern "C" {
     45#endif
     46
     47/* --------------------------------------------------------- */
     48/*                                                           */
     49/* JID structures & constants                                */
     50/*                                                           */
     51/* --------------------------------------------------------- */
     52#define JID_RESOURCE 1
     53#define JID_USER     2
     54#define JID_SERVER   4
     55
     56typedef struct jid_struct
     57{
     58    pool               p;
     59    char*              resource;
     60    char*              user;
     61    char*              server;
     62    char*              full;
     63    struct jid_struct *next; /* for lists of jids */
     64} *jid;
     65 
     66jid     jid_new(pool p, char *idstr);          /* Creates a jabber id from the idstr */
     67void    jid_set(jid id, char *str, int item);  /* Individually sets jid components */
     68char*   jid_full(jid id);                      /* Builds a string type=user/resource@server from the jid data */
     69int     jid_cmp(jid a, jid b);                 /* Compares two jid's, returns 0 for perfect match */
     70int     jid_cmpx(jid a, jid b, int parts);     /* Compares just the parts specified as JID_|JID_ */
     71jid     jid_append(jid a, jid b);              /* Appending b to a (list), no dups */
     72xmlnode jid_xres(jid id);                      /* Returns xmlnode representation of the resource?query=string */
     73xmlnode jid_nodescan(jid id, xmlnode x);       /* Scans the children of the node for a matching jid attribute */
     74jid     jid_user(jid a);                       /* returns the same jid but just of the user@host part */
     75
     76
     77/* --------------------------------------------------------- */
     78/*                                                           */
     79/* JPacket structures & constants                            */
     80/*                                                           */
     81/* --------------------------------------------------------- */
     82#define JPACKET_UNKNOWN   0x00
     83#define JPACKET_MESSAGE   0x01
     84#define JPACKET_PRESENCE  0x02
     85#define JPACKET_IQ        0x04
     86#define JPACKET_S10N      0x08
     87
     88#define JPACKET__UNKNOWN      0
     89#define JPACKET__NONE         1
     90#define JPACKET__ERROR        2
     91#define JPACKET__CHAT         3
     92#define JPACKET__GROUPCHAT    4
     93#define JPACKET__GET          5
     94#define JPACKET__SET          6
     95#define JPACKET__RESULT       7
     96#define JPACKET__SUBSCRIBE    8
     97#define JPACKET__SUBSCRIBED   9
     98#define JPACKET__UNSUBSCRIBE  10
     99#define JPACKET__UNSUBSCRIBED 11
     100#define JPACKET__AVAILABLE    12
     101#define JPACKET__UNAVAILABLE  13
     102#define JPACKET__PROBE        14
     103#define JPACKET__HEADLINE     15
     104#define JPACKET__INVISIBLE    16
     105
     106typedef struct jpacket_struct
    33107{
    34         JFLAG_STREAM_STARTED = 1,       /* Set when we detected the beginning of the stream
    35                                            and want to do auth. */
    36         JFLAG_AUTHENTICATED = 2,        /* Set when we're successfully authenticatd. */
    37         JFLAG_STREAM_RESTART = 4,       /* Set when we want to restart the stream (after
    38                                            SASL or TLS). */
    39         JFLAG_WAIT_SESSION = 8,         /* Set if we sent a <session> tag and need a reply
    40                                            before we continue. */
    41         JFLAG_WAIT_BIND = 16,           /* ... for <bind> tag. */
    42         JFLAG_WANT_TYPING = 32,         /* Set if we ever sent a typing notification, this
    43                                            activates all JEP-85 related code. */
    44 } jabber_flags_t;
    45 
    46 typedef enum
     108    unsigned char type;
     109    int           subtype;
     110    int           flag;
     111    void*         aux1;
     112    xmlnode       x;
     113    jid           to;
     114    jid           from;
     115    char*         iqns;
     116    xmlnode       iq;
     117    pool          p;
     118} *jpacket, _jpacket;
     119 
     120jpacket jpacket_new(xmlnode x);     /* Creates a jabber packet from the xmlnode */
     121int     jpacket_subtype(jpacket p); /* Returns the subtype value (looks at xmlnode for it) */
     122
     123
     124/* --------------------------------------------------------- */
     125/*                                                           */
     126/* Presence Proxy DB structures & constants                  */
     127/*                                                           */
     128/* --------------------------------------------------------- */
     129typedef struct ppdb_struct
     130{                             
     131    jid     id;                /* entry data */
     132    int     pri;
     133    xmlnode x;
     134    struct ppdb_struct* user;  /* linked list for user@server */
     135    pool                p;     /* db-level data */
     136    struct ppdb_struct* next;
     137} _ppdb, *ppdb;
     138
     139ppdb    ppdb_insert(ppdb db, jid id, xmlnode x); /* Inserts presence into the proxy */
     140xmlnode ppdb_primary(ppdb db, jid id);           /* Fetches the matching primary presence for the id */
     141void    ppdb_free(ppdb db);                      /* Frees the db and all entries */
     142xmlnode ppdb_get(ppdb db, jid id);               /* Called successively to return each presence xmlnode */
     143                                                 /*   for the id and children, returns NULL at the end */
     144
     145
     146/* --------------------------------------------------------- */
     147/*                                                           */
     148/* Simple Jabber Rate limit functions                        */
     149/*                                                           */
     150/* --------------------------------------------------------- */
     151typedef struct jlimit_struct
    47152{
    48         JBFLAG_PROBED_JEP85 = 1,        /* Set this when we sent our probe packet to make
    49                                            sure it gets sent only once. */
    50         JBFLAG_DOES_JEP85 = 2,          /* Set this when the resource seems to support
    51                                            JEP85 (typing notification shite). */
    52 } jabber_buddy_flag_t;
    53 
    54 struct jabber_data
     153    char *key;
     154    int start;
     155    int points;
     156    int maxt, maxp;
     157    pool p;
     158} *jlimit, _jlimit;
     159 
     160jlimit jlimit_new(int maxt, int maxp);
     161void jlimit_free(jlimit r);
     162int jlimit_check(jlimit r, char *key, int points);
     163
     164
     165/* --------------------------------------------------------- */
     166/*                                                           */
     167/* Error structures & constants                              */
     168/*                                                           */
     169/* --------------------------------------------------------- */
     170typedef struct terror_struct
    55171{
    56         struct gaim_connection *gc;
    57        
    58         int fd;
    59         void *ssl;
    60         char *txq;
    61         int tx_len;
    62         int r_inpa, w_inpa;
    63        
    64         struct xt_parser *xt;
    65         jabber_flags_t flags;
    66        
    67         char *username;         /* USERNAME@server */
    68         char *server;           /* username@SERVER -=> server/domain, not hostname */
    69        
    70         /* After changing one of these two (or the priority setting), call
    71            presence_send_update() to inform the server about the changes. */
    72         struct jabber_away_state *away_state;
    73         char *away_message;
    74        
    75         GHashTable *node_cache;
    76         GHashTable *buddies;
    77 };
    78 
    79 struct jabber_away_state
     172    int  code;
     173    char msg[64];
     174} terror;
     175
     176#define TERROR_BAD           (terror){400,"Bad Request"}
     177#define TERROR_AUTH          (terror){401,"Unauthorized"}
     178#define TERROR_PAY           (terror){402,"Payment Required"}
     179#define TERROR_FORBIDDEN     (terror){403,"Forbidden"}
     180#define TERROR_NOTFOUND      (terror){404,"Not Found"}
     181#define TERROR_NOTALLOWED    (terror){405,"Not Allowed"}
     182#define TERROR_NOTACCEPTABLE (terror){406,"Not Acceptable"}
     183#define TERROR_REGISTER      (terror){407,"Registration Required"}
     184#define TERROR_REQTIMEOUT    (terror){408,"Request Timeout"}
     185#define TERROR_CONFLICT      (terror){409,"Conflict"}
     186
     187#define TERROR_INTERNAL   (terror){500,"Internal Server Error"}
     188#define TERROR_NOTIMPL    (terror){501,"Not Implemented"}
     189#define TERROR_EXTERNAL   (terror){502,"Remote Server Error"}
     190#define TERROR_UNAVAIL    (terror){503,"Service Unavailable"}
     191#define TERROR_EXTTIMEOUT (terror){504,"Remote Server Timeout"}
     192#define TERROR_DISCONNECTED (terror){510,"Disconnected"}
     193
     194/* --------------------------------------------------------- */
     195/*                                                           */
     196/* Namespace constants                                       */
     197/*                                                           */
     198/* --------------------------------------------------------- */
     199#define NSCHECK(x,n) (j_strcmp(xmlnode_get_attrib(x,"xmlns"),n) == 0)
     200
     201#define NS_CLIENT    "jabber:client"
     202#define NS_SERVER    "jabber:server"
     203#define NS_AUTH      "jabber:iq:auth"
     204#define NS_REGISTER  "jabber:iq:register"
     205#define NS_ROSTER    "jabber:iq:roster"
     206#define NS_OFFLINE   "jabber:x:offline"
     207#define NS_AGENT     "jabber:iq:agent"
     208#define NS_AGENTS    "jabber:iq:agents"
     209#define NS_DELAY     "jabber:x:delay"
     210#define NS_VERSION   "jabber:iq:version"
     211#define NS_TIME      "jabber:iq:time"
     212#define NS_VCARD     "vcard-temp"
     213#define NS_PRIVATE   "jabber:iq:private"
     214#define NS_SEARCH    "jabber:iq:search"
     215#define NS_OOB       "jabber:iq:oob"
     216#define NS_XOOB      "jabber:x:oob"
     217#define NS_ADMIN     "jabber:iq:admin"
     218#define NS_FILTER    "jabber:iq:filter"
     219#define NS_AUTH_0K   "jabber:iq:auth:0k"
     220
     221
     222/* --------------------------------------------------------- */
     223/*                                                           */
     224/* Message Types                                             */
     225/*                                                           */
     226/* --------------------------------------------------------- */
     227#define TMSG_NORMAL     "normal"
     228#define TMSG_ERROR      "error"
     229#define TMSG_CHAT       "chat"
     230#define TMSG_GROUPCHAT  "groupchat"
     231#define TMSG_HEADLINE   "headline"
     232
     233
     234/* --------------------------------------------------------- */
     235/*                                                           */
     236/* JUtil functions                                           */
     237/*                                                           */
     238/* --------------------------------------------------------- */
     239xmlnode jutil_presnew(int type, char *to, char *status); /* Create a skeleton presence packet */
     240xmlnode jutil_iqnew(int type, char *ns);                 /* Create a skeleton iq packet */
     241xmlnode jutil_msgnew(char *type, char *to, char *subj, char *body);
     242                                                         /* Create a skeleton message packet */
     243xmlnode jutil_header(char* xmlns, char* server);         /* Create a skeleton stream packet */
     244int     jutil_priority(xmlnode x);                       /* Determine priority of this packet */
     245void    jutil_tofrom(xmlnode x);                         /* Swaps to/from fields on a packet */
     246xmlnode jutil_iqresult(xmlnode x);                       /* Generate a skeleton iq/result, given a iq/query */
     247char*   jutil_timestamp(void);                           /* Get stringified timestamp */
     248void    jutil_error(xmlnode x, terror E);                /* Append an <error> node to x */
     249void    jutil_delay(xmlnode msg, char *reason);          /* Append a delay packet to msg */
     250char*   jutil_regkey(char *key, char *seed);             /* pass a seed to generate a key, pass the key again to validate (returns it) */
     251
     252
     253/* --------------------------------------------------------- */
     254/*                                                           */
     255/* JConn structures & functions                              */
     256/*                                                           */
     257/* --------------------------------------------------------- */
     258#define JCONN_STATE_OFF       0
     259#define JCONN_STATE_CONNECTED 1
     260#define JCONN_STATE_ON        2
     261#define JCONN_STATE_AUTH      3
     262
     263typedef struct jconn_struct
    80264{
    81         char code[5];
    82         char *full_name;
    83 };
    84 
    85 typedef xt_status (*jabber_cache_event) ( struct gaim_connection *gc, struct xt_node *node, struct xt_node *orig );
    86 
    87 struct jabber_cache_entry
    88 {
    89         struct xt_node *node;
    90         jabber_cache_event func;
    91 };
    92 
    93 struct jabber_buddy
    94 {
    95         char *handle;
    96         char *full_jid;
    97         char *resource;
    98        
    99         int priority;
    100         struct jabber_away_state *away_state;
    101         char *away_message;
    102        
    103         time_t last_act;
    104         int flags;
    105        
    106         struct jabber_buddy *next;
    107 };
    108 
    109 /* iq.c */
    110 xt_status jabber_pkt_iq( struct xt_node *node, gpointer data );
    111 int jabber_init_iq_auth( struct gaim_connection *gc );
    112 xt_status jabber_pkt_bind_sess( struct gaim_connection *gc, struct xt_node *node, struct xt_node *orig );
    113 int jabber_get_roster( struct gaim_connection *gc );
    114 int jabber_add_to_roster( struct gaim_connection *gc, char *handle, char *name );
    115 int jabber_remove_from_roster( struct gaim_connection *gc, char *handle );
    116 
    117 /* message.c */
    118 xt_status jabber_pkt_message( struct xt_node *node, gpointer data );
    119 
    120 /* presence.c */
    121 xt_status jabber_pkt_presence( struct xt_node *node, gpointer data );
    122 int presence_send_update( struct gaim_connection *gc );
    123 int presence_send_request( struct gaim_connection *gc, char *handle, char *request );
    124 
    125 /* jabber_util.c */
    126 char *set_eval_priority( set_t *set, char *value );
    127 char *set_eval_tls( set_t *set, char *value );
    128 struct xt_node *jabber_make_packet( char *name, char *type, char *to, struct xt_node *children );
    129 struct xt_node *jabber_make_error_packet( struct xt_node *orig, char *err_cond, char *err_type );
    130 void jabber_cache_add( struct gaim_connection *gc, struct xt_node *node, jabber_cache_event func );
    131 struct xt_node *jabber_cache_get( struct gaim_connection *gc, char *id );
    132 void jabber_cache_entry_free( gpointer entry );
    133 void jabber_cache_clean( struct gaim_connection *gc );
    134 const struct jabber_away_state *jabber_away_state_by_code( char *code );
    135 const struct jabber_away_state *jabber_away_state_by_name( char *name );
    136 void jabber_buddy_ask( struct gaim_connection *gc, char *handle );
    137 struct jabber_buddy *jabber_buddy_add( struct gaim_connection *gc, char *full_jid );
    138 struct jabber_buddy *jabber_buddy_by_jid( struct gaim_connection *gc, char *jid );
    139 int jabber_buddy_remove( struct gaim_connection *gc, char *full_jid );
    140 
    141 extern const struct jabber_away_state jabber_away_state_list[];
    142 
    143 /* io.c */
    144 int jabber_write_packet( struct gaim_connection *gc, struct xt_node *node );
    145 int jabber_write( struct gaim_connection *gc, char *buf, int len );
    146 gboolean jabber_connected_plain( gpointer data, gint source, b_input_condition cond );
    147 gboolean jabber_connected_ssl( gpointer data, void *source, b_input_condition cond );
    148 gboolean jabber_start_stream( struct gaim_connection *gc );
    149 void jabber_end_stream( struct gaim_connection *gc );
    150 
    151 /* sasl.c */
    152 xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data );
    153 xt_status sasl_pkt_challenge( struct xt_node *node, gpointer data );
    154 xt_status sasl_pkt_result( struct xt_node *node, gpointer data );
    155 gboolean sasl_supported( struct gaim_connection *gc );
    156 
     265    /* Core structure */
     266    pool        p;             /* Memory allocation pool */
     267    int         state;     /* Connection state flag */
     268    int         fd;            /* Connection file descriptor */
     269    jid         user;      /* User info */
     270    char        *pass;     /* User passwd */
     271
     272    /* Stream stuff */
     273    int         id;        /* id counter for jab_getid() function */
     274    char        idbuf[9];  /* temporary storage for jab_getid() */
     275    char        *sid;      /* stream id from server, for digest auth */
     276    XML_Parser  parser;    /* Parser instance */
     277    xmlnode     current;   /* Current node in parsing instance.. */
     278
     279    /* Event callback ptrs */
     280    void (*on_state)(struct jconn_struct *j, int state);
     281    void (*on_packet)(struct jconn_struct *j, jpacket p);
     282
     283} *jconn, jconn_struct;
     284
     285typedef void (*jconn_state_h)(jconn j, int state);
     286typedef void (*jconn_packet_h)(jconn j, jpacket p);
     287
     288
     289jconn jab_new(char *user, char *pass);
     290void jab_delete(jconn j);
     291void jab_state_handler(jconn j, jconn_state_h h);
     292void jab_packet_handler(jconn j, jconn_packet_h h);
     293void jab_start(jconn j);
     294void jab_stop(jconn j);
     295
     296int jab_getfd(jconn j);
     297jid jab_getjid(jconn j);
     298char *jab_getsid(jconn j);
     299char *jab_getid(jconn j);
     300
     301void jab_send(jconn j, xmlnode x);
     302void jab_send_raw(jconn j, const char *str);
     303void jab_recv(jconn j);
     304void jab_poll(jconn j, int timeout);
     305
     306char *jab_auth(jconn j);
     307char *jab_reg(jconn j);
     308
     309
     310
     311#ifdef __cplusplus
     312}
    157313#endif
     314
     315#endif  /* INCL_JABBER_H */
Note: See TracChangeset for help on using the changeset viewer.