1 /* iksemel (XML parser for Jabber)
2 ** Copyright (C) 2000-2007 Gurer Ozen
3 ** This code is free software; you can redistribute it and/or
4 ** modify it under the terms of GNU Lesser General Public License.
5 */
6 
7 #ifndef IKSEMEL_H
8 #define IKSEMEL_H 1
9 
10 #ifdef __cplusplus
11 #include <cstddef>	/* size_t for C++ */
12 extern "C" {
13 #else
14 #include <stddef.h>	/* size_t for C */
15 #endif
16 
17 /*****  object stack  *****/
18 
19 struct ikstack_struct;
20 typedef struct ikstack_struct ikstack;
21 
22 ikstack *iks_stack_new (size_t meta_chunk, size_t data_chunk);
23 void *iks_stack_alloc (ikstack *s, size_t size);
24 char *iks_stack_strdup (ikstack *s, const char *src, size_t len);
25 char *iks_stack_strcat (ikstack *s, char *old, size_t old_len, const char *src, size_t src_len);
26 void iks_stack_stat (ikstack *s, size_t *allocated, size_t *used);
27 void iks_stack_delete (ikstack *s);
28 
29 /*****  utilities  *****/
30 
31 void *iks_malloc (size_t size);
32 void iks_free (void *ptr);
33 void iks_set_mem_funcs (void *(*malloc_func)(size_t size), void (*free_func)(void *ptr));
34 
35 char *iks_strdup (const char *src);
36 char *iks_strcat (char *dest, const char *src);
37 int iks_strcmp (const char *a, const char *b);
38 int iks_strcasecmp (const char *a, const char *b);
39 int iks_strncmp (const char *a, const char *b, size_t n);
40 int iks_strncasecmp (const char *a, const char *b, size_t n);
41 size_t iks_strlen (const char *src);
42 char *iks_escape (ikstack *s, char *src, size_t len);
43 char *iks_unescape (ikstack *s, char *src, size_t len);
44 
45 /*****  dom tree  *****/
46 
47 enum ikstype {
48 	IKS_NONE = 0,
49 	IKS_TAG,
50 	IKS_ATTRIBUTE,
51 	IKS_CDATA
52 };
53 
54 struct iks_struct;
55 typedef struct iks_struct iks;
56 
57 iks *iks_new (const char *name);
58 iks *iks_new_within (const char *name, ikstack *s);
59 iks *iks_insert (iks *x, const char *name);
60 iks *iks_insert_cdata (iks *x, const char *data, size_t len);
61 iks *iks_insert_attrib (iks *x, const char *name, const char *value);
62 iks *iks_insert_node (iks *x, iks *y);
63 iks *iks_append (iks *x, const char *name);
64 iks *iks_prepend (iks *x, const char *name);
65 iks *iks_append_cdata (iks *x, const char *data, size_t len);
66 iks *iks_prepend_cdata (iks *x, const char *data, size_t len);
67 void iks_hide (iks *x);
68 void iks_delete (iks *x);
69 iks *iks_next (iks *x);
70 iks *iks_next_tag (iks *x);
71 iks *iks_prev (iks *x);
72 iks *iks_prev_tag (iks *x);
73 iks *iks_parent (iks *x);
74 iks *iks_root (iks *x);
75 iks *iks_child (iks *x);
76 iks *iks_first_tag (iks *x);
77 iks *iks_attrib (iks *x);
78 iks *iks_find (iks *x, const char *name);
79 char *iks_find_cdata (iks *x, const char *name);
80 char *iks_find_attrib (iks *x, const char *name);
81 iks *iks_find_with_attrib (iks *x, const char *tagname, const char *attrname, const char *value);
82 ikstack *iks_stack (iks *x);
83 enum ikstype iks_type (iks *x);
84 char *iks_name (iks *x);
85 char *iks_cdata (iks *x);
86 size_t iks_cdata_size (iks *x);
87 int iks_has_children (iks *x);
88 int iks_has_attribs (iks *x);
89 char *iks_string (ikstack *s, iks *x);
90 iks *iks_copy (iks *x);
91 iks *iks_copy_within (iks *x, ikstack *s);
92 
93 /*****  sax parser  *****/
94 
95 enum ikserror {
96 	IKS_OK = 0,
97 	IKS_NOMEM,
98 	IKS_BADXML,
99 	IKS_HOOK
100 };
101 
102 enum ikstagtype {
103 	IKS_OPEN,
104 	IKS_CLOSE,
105 	IKS_SINGLE
106 };
107 
108 typedef int (iksTagHook)(void *user_data, char *name, char **atts, int type);
109 typedef int (iksCDataHook)(void *user_data, char *data, size_t len);
110 typedef void (iksDeleteHook)(void *user_data);
111 
112 struct iksparser_struct;
113 typedef struct iksparser_struct  iksparser;
114 
115 iksparser *iks_sax_new (void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook);
116 iksparser *iks_sax_extend (ikstack *s, void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook, iksDeleteHook *deleteHook);
117 ikstack *iks_parser_stack (iksparser *prs);
118 void *iks_user_data (iksparser *prs);
119 unsigned long iks_nr_bytes (iksparser *prs);
120 unsigned long iks_nr_lines (iksparser *prs);
121 int iks_parse (iksparser *prs, const char *data, size_t len, int finish);
122 void iks_parser_reset (iksparser *prs);
123 void iks_parser_delete (iksparser *prs);
124 
125 /*****  dom parser  *****/
126 
127 enum iksfileerror {
128 	IKS_FILE_NOFILE = 4,
129 	IKS_FILE_NOACCESS,
130 	IKS_FILE_RWERR
131 };
132 
133 iksparser *iks_dom_new (iks **iksptr);
134 void iks_set_size_hint (iksparser *prs, size_t approx_size);
135 iks *iks_tree (const char *xml_str, size_t len, int *err);
136 int iks_load (const char *fname, iks **xptr);
137 int iks_save (const char *fname, iks *x);
138 
139 /*****  transport layer  *****/
140 
141 enum iksasyncevents {
142 	IKS_ASYNC_RESOLVED,
143 	IKS_ASYNC_CONNECTED,
144 	IKS_ASYNC_WRITE,
145 	IKS_ASYNC_WRITTEN,
146 	IKS_ASYNC_READ,
147 	IKS_ASYNC_CLOSED,
148 	IKS_ASYNC_ERROR
149 };
150 
151 typedef struct iksasyncevent_struct {
152 	int event;
153 	int data0;
154 	int data1;
155 } iksasyncevent;
156 
157 typedef void (iksTClose)(void *socket);
158 typedef int (iksTConnect)(iksparser *prs, void **socketptr, const char *server, int port);
159 typedef int (iksTSend)(void *socket, const char *data, size_t len);
160 typedef int (iksTRecv)(void *socket, char *buffer, size_t buf_len, int timeout);
161 typedef int (iksAsyncNotify)(void *user_data, iksasyncevent *event);
162 typedef int (iksTConnectAsync)(iksparser *prs, void **socketptr, const char *server, const char *server_name, int port, void *notify_data, iksAsyncNotify *notify_func);
163 
164 #define IKS_TRANSPORT_V1 0
165 
166 typedef const struct ikstransport_struct {
167 	int abi_version;
168 	/* basic api, connect can be NULL if only async api is provided */
169 	iksTConnect *connect;
170 	iksTSend *send;
171 	iksTRecv *recv;
172 	iksTClose *close;
173 	/* optional async api */
174 	iksTConnectAsync *connect_async;
175 } ikstransport;
176 
177 extern ikstransport iks_default_transport;
178 
179 /*****  stream parser  *****/
180 
181 enum iksneterror {
182 	IKS_NET_NODNS = 4,
183 	IKS_NET_NOSOCK,
184 	IKS_NET_NOCONN,
185 	IKS_NET_RWERR,
186 	IKS_NET_NOTSUPP,
187 	IKS_NET_TLSFAIL,
188 	IKS_NET_DROPPED,
189 	IKS_NET_UNKNOWN
190 };
191 
192 enum iksnodetype {
193 	IKS_NODE_START,
194 	IKS_NODE_NORMAL,
195 	IKS_NODE_ERROR,
196 	IKS_NODE_STOP
197 };
198 
199 enum ikssasltype {
200 	IKS_SASL_PLAIN,
201 	IKS_SASL_DIGEST_MD5
202 };
203 
204 #define IKS_JABBER_PORT 5222
205 
206 typedef int (iksStreamHook)(void *user_data, int type, iks *node);
207 typedef void (iksLogHook)(void *user_data, const char *data, size_t size, int is_incoming);
208 
209 iksparser *iks_stream_new (char *name_space, void *user_data, iksStreamHook *streamHook);
210 void *iks_stream_user_data (iksparser *prs);
211 void iks_set_log_hook (iksparser *prs, iksLogHook *logHook);
212 int iks_connect_tcp (iksparser *prs, const char *server, int port);
213 int iks_connect_fd (iksparser *prs, int fd);
214 int iks_connect_via (iksparser *prs, const char *server, int port, const char *server_name);
215 int iks_connect_with (iksparser *prs, const char *server, int port, const char *server_name, ikstransport *trans);
216 int iks_connect_async (iksparser *prs, const char *server, int port, void *notify_data, iksAsyncNotify *notify_func);
217 int iks_connect_async_with (iksparser *prs, const char *server, int port, const char *server_name, ikstransport *trans, void *notify_data, iksAsyncNotify *notify_func);
218 int iks_fd (iksparser *prs);
219 int iks_recv (iksparser *prs, int timeout);
220 int iks_send_header (iksparser *prs, const char *to);
221 int iks_send (iksparser *prs, iks *x);
222 int iks_send_raw (iksparser *prs, const char *xmlstr);
223 void iks_disconnect (iksparser *prs);
224 int iks_has_tls (void);
225 int iks_is_secure (iksparser *prs);
226 int iks_start_tls (iksparser *prs);
227 int iks_start_sasl (iksparser *prs, enum ikssasltype type, char *username, char *pass);
228 
229 /*****  jabber  *****/
230 
231 #define IKS_NS_CLIENT     "jabber:client"
232 #define IKS_NS_SERVER     "jabber:server"
233 #define IKS_NS_AUTH       "jabber:iq:auth"
234 #define IKS_NS_AUTH_0K    "jabber:iq:auth:0k"
235 #define IKS_NS_REGISTER   "jabber:iq:register"
236 #define IKS_NS_ROSTER     "jabber:iq:roster"
237 #define IKS_NS_XROSTER	"jabber:x:roster"
238 #define IKS_NS_OFFLINE    "jabber:x:offline"
239 #define IKS_NS_AGENT      "jabber:iq:agent"
240 #define IKS_NS_AGENTS     "jabber:iq:agents"
241 #define IKS_NS_BROWSE     "jabber:iq:browse"
242 #define IKS_NS_CONFERENCE "jabber:iq:conference"
243 #define IKS_NS_DELAY      "jabber:x:delay"
244 #define IKS_NS_VERSION    "jabber:iq:version"
245 #define IKS_NS_TIME       "jabber:iq:time"
246 #define IKS_NS_VCARD      "vcard-temp"
247 #define IKS_NS_PRIVATE    "jabber:iq:private"
248 #define IKS_NS_SEARCH     "jabber:iq:search"
249 #define IKS_NS_OOB        "jabber:iq:oob"
250 #define IKS_NS_XOOB       "jabber:x:oob"
251 #define IKS_NS_ADMIN      "jabber:iq:admin"
252 #define IKS_NS_FILTER     "jabber:iq:filter"
253 #define IKS_NS_GATEWAY    "jabber:iq:gateway"
254 #define IKS_NS_LAST       "jabber:iq:last"
255 #define IKS_NS_SIGNED     "jabber:x:signed"
256 #define IKS_NS_ENCRYPTED  "jabber:x:encrypted"
257 #define IKS_NS_ENVELOPE   "jabber:x:envelope"
258 #define IKS_NS_EVENT      "jabber:x:event"
259 #define IKS_NS_EXPIRE     "jabber:x:expire"
260 #define IKS_NS_XHTML      "http://www.w3.org/1999/xhtml"
261 #define IKS_NS_XMPP_SASL  "urn:ietf:params:xml:ns:xmpp-sasl"
262 #define IKS_NS_XMPP_BIND  "urn:ietf:params:xml:ns:xmpp-bind"
263 #define IKS_NS_XMPP_SESSION  "urn:ietf:params:xml:ns:xmpp-session"
264 
265 #define IKS_ID_USER 1
266 #define IKS_ID_SERVER 2
267 #define IKS_ID_RESOURCE 4
268 #define IKS_ID_PARTIAL IKS_ID_USER | IKS_ID_SERVER
269 #define IKS_ID_FULL IKS_ID_USER | IKS_ID_SERVER | IKS_ID_RESOURCE
270 
271 #define IKS_STREAM_STARTTLS                   1
272 #define IKS_STREAM_SESSION                    2
273 #define IKS_STREAM_BIND                       4
274 #define IKS_STREAM_SASL_PLAIN                 8
275 #define IKS_STREAM_SASL_MD5                  16
276 
277 typedef struct iksid_struct {
278 	char *user;
279 	char *server;
280 	char *resource;
281 	char *partial;
282 	char *full;
283 } iksid;
284 
285 iksid *iks_id_new (ikstack *s, const char *jid);
286 int iks_id_cmp (iksid *a, iksid *b, int parts);
287 
288 enum ikspaktype {
289 	IKS_PAK_NONE = 0,
290 	IKS_PAK_MESSAGE,
291 	IKS_PAK_PRESENCE,
292 	IKS_PAK_IQ,
293 	IKS_PAK_S10N
294 };
295 
296 enum iksubtype {
297 	IKS_TYPE_NONE = 0,
298 	IKS_TYPE_ERROR,
299 
300 	IKS_TYPE_CHAT,
301 	IKS_TYPE_GROUPCHAT,
302 	IKS_TYPE_HEADLINE,
303 
304 	IKS_TYPE_GET,
305 	IKS_TYPE_SET,
306 	IKS_TYPE_RESULT,
307 
308 	IKS_TYPE_SUBSCRIBE,
309 	IKS_TYPE_SUBSCRIBED,
310 	IKS_TYPE_UNSUBSCRIBE,
311 	IKS_TYPE_UNSUBSCRIBED,
312 	IKS_TYPE_PROBE,
313 	IKS_TYPE_AVAILABLE,
314 	IKS_TYPE_UNAVAILABLE
315 };
316 
317 enum ikshowtype {
318 	IKS_SHOW_UNAVAILABLE = 0,
319 	IKS_SHOW_AVAILABLE,
320 	IKS_SHOW_CHAT,
321 	IKS_SHOW_AWAY,
322 	IKS_SHOW_XA,
323 	IKS_SHOW_DND
324 };
325 
326 typedef struct ikspak_struct {
327 	iks *x;
328 	iksid *from;
329 	iks *query;
330 	char *ns;
331 	char *id;
332 	enum ikspaktype type;
333 	enum iksubtype subtype;
334 	enum ikshowtype show;
335 } ikspak;
336 
337 ikspak *iks_packet (iks *x);
338 
339 iks *iks_make_auth (iksid *id, const char *pass, const char *sid);
340 iks *iks_make_msg (enum iksubtype type, const char *to, const char *body);
341 iks *iks_make_s10n (enum iksubtype type, const char *to, const char *msg);
342 iks *iks_make_pres (enum ikshowtype show, const char *status);
343 iks *iks_make_iq (enum iksubtype type, const char *xmlns);
344 iks *iks_make_resource_bind(iksid *id);
345 iks *iks_make_session(void);
346 int iks_stream_features(iks *x);
347 
348 /*****  jabber packet filter  *****/
349 
350 #define IKS_RULE_DONE 0
351 #define IKS_RULE_ID 1
352 #define IKS_RULE_TYPE 2
353 #define IKS_RULE_SUBTYPE 4
354 #define IKS_RULE_FROM 8
355 #define IKS_RULE_FROM_PARTIAL 16
356 #define IKS_RULE_NS 32
357 
358 enum iksfilterret {
359 	IKS_FILTER_PASS,
360 	IKS_FILTER_EAT
361 };
362 
363 typedef int (iksFilterHook)(void *user_data, ikspak *pak);
364 
365 struct iksfilter_struct;
366 typedef struct iksfilter_struct iksfilter;
367 struct iksrule_struct;
368 typedef struct iksrule_struct iksrule;
369 
370 iksfilter *iks_filter_new (void);
371 iksrule *iks_filter_add_rule (iksfilter *f, iksFilterHook *filterHook, void *user_data, ...);
372 void iks_filter_remove_rule (iksfilter *f, iksrule *rule);
373 void iks_filter_remove_hook (iksfilter *f, iksFilterHook *filterHook);
374 void iks_filter_packet (iksfilter *f, ikspak *pak);
375 void iks_filter_delete (iksfilter *f);
376 
377 /*****  sha1  *****/
378 
379 struct iksha_struct;
380 typedef struct iksha_struct iksha;
381 
382 iksha *iks_sha_new (void);
383 void iks_sha_reset (iksha *sha);
384 void iks_sha_hash (iksha *sha, const unsigned char *data, size_t len, int finish);
385 void iks_sha_print (iksha *sha, char *hash);
386 void iks_sha_delete (iksha *sha);
387 void iks_sha (const char *data, char *hash);
388 
389 /*****  md5  *****/
390 
391 struct ikmd5_struct;
392 typedef struct iksmd5_struct iksmd5;
393 
394 iksmd5 *iks_md5_new(void);
395 void iks_md5_reset(iksmd5 *md5);
396 void iks_md5_hash(iksmd5 *md5, const unsigned char *data, size_t slen, int finish);
397 void iks_md5_delete(iksmd5 *md5);
398 void iks_md5_print(iksmd5 *md5, char *buf);
399 void iks_md5_digest(iksmd5 *md5, unsigned char *digest);
400 void iks_md5(const char *data, char *buf);
401 
402 /*****  base64  *****/
403 
404 char *iks_base64_decode(const char *buf);
405 char *iks_base64_encode(const char *buf, int len);
406 
407 #ifdef __cplusplus
408 }
409 #endif
410 
411 #endif  /* IKSEMEL_H */
412