source: protocols/jabber/jabber.h @ 25d1be7

Last change on this file since 25d1be7 was b7d3cc34, checked in by Wilmer van der Gaast <wilmer@…>, at 2005-11-06T18:23:18Z

Initial repository (0.99 release tree)

  • Property mode set to 100644
File size: 11.7 KB
Line 
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
107{
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
152{
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
171{
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
264{
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}
313#endif
314
315#endif  /* INCL_JABBER_H */
Note: See TracBrowser for help on using the repository browser.