stropheruby 0.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,6 +1,7 @@
1
- == 0.2 2010-02-26
2
- * update the libstrophe src to 20090526
1
+ == 0.2.1 2010-09-19
3
2
 
3
+ * Scope md5 function to avoid name clashing
4
+
4
5
  == 0.1.4 2010-02-26
5
6
 
6
7
  * accessor of the connect_timeout in Connection class
data/README.txt CHANGED
@@ -4,7 +4,6 @@ Stropheruby is a ruby bindings for Strophe, a C library for writing XMPP clients
4
4
 
5
5
  This is a fork of flamontagne's stropheruby (http://github.com/flamontagne/stropheruby/tree/master) with the following improvements:
6
6
 
7
- * accessor of the connect_timeout in the Connection class
8
7
  * A patched version of libstrophe (trunk) is included. So there is no extra library to install.
9
8
  * (libstrophe) Fixed a timeout issue on Mac OSX: http://groups.google.com/group/strophe-dev/browse_thread/thread/ef4cb19785020fb6
10
9
  * (libstrophe) Fixed basic auth: http://groups.google.com/group/strophe-dev/browse_thread/thread/b770f72c83d1a0b9
@@ -18,15 +17,11 @@ This is a fork of flamontagne's stropheruby (http://github.com/flamontagne/strop
18
17
 
19
18
  == INSTALLATION
20
19
 
21
- sudo gem sources -a http://gemcutter.org
22
- sudo gem install stropheruby
20
+ sudo gem sources -a http://gems.github.com
21
+ sudo gem install yong-stropheruby
23
22
 
24
23
  For Rails app, add this line in your config/environment.rb:
25
- config.gem "stropheruby", :source => "http://gemcutter.org", :lib => "strophe_ruby"
26
-
27
- == NOTES
28
-
29
- Stropheruby v2.0 has upgraded the libstrophe to the upstream which is 20090526
24
+ config.gem "yong-stropheruby", :source => "http://gems.github.com", :lib => "strophe_ruby"
30
25
 
31
26
  == EXAMPLE
32
27
 
data/ext/auth.c CHANGED
@@ -1,7 +1,7 @@
1
1
  /* auth.c
2
2
  ** strophe XMPP client library -- auth functions and handlers
3
3
  **
4
- ** Copyright (C) 2005-2009 Collecta, Inc.
4
+ ** Copyright (C) 2005-2008 OGG, LLC. All rights reserved.
5
5
  **
6
6
  ** This software is provided AS-IS with no warranty, either express or
7
7
  ** implied.
@@ -208,11 +208,9 @@ static int _handle_features(xmpp_conn_t * const conn,
208
208
  xmpp_timed_handler_delete(conn, _handle_missing_features);
209
209
 
210
210
  /* check for TLS */
211
- if (!conn->secured) {
212
- child = xmpp_stanza_get_child_by_name(stanza, "starttls");
213
- if (child && (strcmp(xmpp_stanza_get_ns(child), XMPP_NS_TLS) == 0))
214
- conn->tls_support = 1;
215
- }
211
+ child = xmpp_stanza_get_child_by_name(stanza, "starttls");
212
+ if (child && (strcmp(xmpp_stanza_get_ns(child), XMPP_NS_TLS) == 0))
213
+ conn->tls_support = 1;
216
214
 
217
215
  /* check for SASL */
218
216
  child = xmpp_stanza_get_child_by_name(stanza, "mechanisms");
@@ -236,13 +234,13 @@ static int _handle_features(xmpp_conn_t * const conn,
236
234
  if (conn->pass == NULL || conn->pass[0] == '\0') {
237
235
  xmpp_debug(conn->ctx, "auth", "do not attempt auth as there is no password given");
238
236
  //If no password, do not login, this will give 'register' a chance to run
239
- conn->authenticated = 1;
240
- /* call connection handler */
241
- conn->conn_handler(conn, XMPP_CONN_CONNECT, 0, NULL, conn->userdata);
237
+ conn->authenticated = 1;
238
+ /* call connection handler */
239
+ conn->conn_handler(conn, XMPP_CONN_CONNECT, 0, NULL, conn->userdata);
242
240
  } else {
243
241
  _auth(conn);
244
242
  }
245
-
243
+
246
244
  return 0;
247
245
  }
248
246
 
@@ -267,7 +265,7 @@ static int _handle_proceedtls_default(xmpp_conn_t * const conn,
267
265
  {
268
266
  char *name;
269
267
  name = xmpp_stanza_get_name(stanza);
270
- xmpp_debug(conn->ctx, "xmpp",
268
+ xmpp_debug(conn->ctx, "xmpp",
271
269
  "handle proceedtls called for %s", name);
272
270
 
273
271
  if (strcmp(name, "proceed") == 0) {
@@ -287,8 +285,7 @@ static int _handle_proceedtls_default(xmpp_conn_t * const conn,
287
285
  }
288
286
  else
289
287
  {
290
- conn->secured = 1;
291
- conn_prepare_reset(conn, auth_handle_open);
288
+ parser_prepare_reset(conn, _handle_open_tls);
292
289
 
293
290
  conn_open_stream(conn);
294
291
  }
@@ -318,7 +315,7 @@ static int _handle_sasl_result(xmpp_conn_t * const conn,
318
315
  (char *)userdata);
319
316
 
320
317
  /* reset parser */
321
- conn_prepare_reset(conn, _handle_open_sasl);
318
+ parser_prepare_reset(conn, _handle_open_sasl);
322
319
 
323
320
  /* send stream tag */
324
321
  conn_open_stream(conn);
@@ -703,6 +700,16 @@ void auth_handle_open(xmpp_conn_t * const conn)
703
700
  FEATURES_TIMEOUT, NULL);
704
701
  }
705
702
 
703
+ /* called when stream:stream tag received after TLS connection */
704
+ static void _handle_open_tls(xmpp_conn_t * const conn)
705
+ {
706
+ xmpp_debug(conn->ctx, "xmpp", "TLS successful, proceeding with SASL");
707
+
708
+ /* go straight to SASL auth */
709
+ _auth(conn);
710
+ }
711
+
712
+
706
713
  /* called when stream:stream tag received after SASL auth */
707
714
  static void _handle_open_sasl(xmpp_conn_t * const conn)
708
715
  {
@@ -841,17 +848,9 @@ static int _handle_bind(xmpp_conn_t * const conn,
841
848
  xmpp_error(conn->ctx, "xmpp", "Binding failed.");
842
849
  xmpp_disconnect(conn);
843
850
  } else if (type && strcmp(type, "result") == 0) {
844
- xmpp_stanza_t *binding = xmpp_stanza_get_child_by_name(stanza, "bind");
851
+ /* TODO: extract resource if present */
845
852
  xmpp_debug(conn->ctx, "xmpp", "Bind successful.");
846
853
 
847
- if (binding) {
848
- xmpp_stanza_t *jid_stanza = xmpp_stanza_get_child_by_name(binding,
849
- "jid");
850
- if (jid_stanza) {
851
- conn->bound_jid = xmpp_stanza_get_text(jid_stanza);
852
- }
853
- }
854
-
855
854
  /* establish a session if required */
856
855
  if (conn->session_required) {
857
856
  /* setup response handlers */
data/ext/common.h CHANGED
@@ -1,7 +1,7 @@
1
1
  /* common.h
2
2
  ** strophe XMPP client library -- internal common structures
3
3
  **
4
- ** Copyright (C) 2005-2009 Collecta, Inc.
4
+ ** Copyright (C) 2005-2008 OGG, LLC. All rights reserved.
5
5
  **
6
6
  ** This software is provided AS-IS with no warranty, either express or
7
7
  ** implied.
@@ -31,7 +31,8 @@
31
31
  #include "tls.h"
32
32
  #include "hash.h"
33
33
  #include "util.h"
34
- #include "parser.h"
34
+
35
+ #include "expat.h"
35
36
 
36
37
  /** run-time context **/
37
38
 
@@ -162,11 +163,10 @@ struct _xmpp_conn_t {
162
163
  sock_t sock;
163
164
  tls_t *tls;
164
165
 
165
- int tls_support;
166
+ int tls_support;
166
167
  int tls_failed; /* set when tls fails, so we don't try again */
167
168
  int sasl_support; /* if true, field is a bitfield of supported
168
169
  mechanisms */
169
- int secured; /* set when stream is secured with TLS */
170
170
 
171
171
  /* if server returns <bind/> or <session/> we must do them */
172
172
  int bind_required;
@@ -178,7 +178,6 @@ struct _xmpp_conn_t {
178
178
  char *connectport;
179
179
  char *jid;
180
180
  char *pass;
181
- char *bound_jid;
182
181
  char *stream_id;
183
182
 
184
183
  /* send queue and parameters */
@@ -190,7 +189,9 @@ struct _xmpp_conn_t {
190
189
 
191
190
  /* xml parser */
192
191
  int reset_parser;
193
- parser_t *parser;
192
+ XML_Parser parser;
193
+ int depth;
194
+ xmpp_stanza_t *stanza;
194
195
 
195
196
  /* timeouts */
196
197
  unsigned int connect_timeout;
@@ -216,8 +217,6 @@ struct _xmpp_conn_t {
216
217
  void conn_disconnect(xmpp_conn_t * const conn);
217
218
  void conn_disconnect_clean(xmpp_conn_t * const conn);
218
219
  void conn_open_stream(xmpp_conn_t * const conn);
219
- void conn_prepare_reset(xmpp_conn_t * const conn, xmpp_open_handler handler);
220
- void conn_parser_reset(xmpp_conn_t * const conn);
221
220
 
222
221
 
223
222
  typedef enum {
@@ -242,6 +241,19 @@ struct _xmpp_stanza_t {
242
241
  hash_t *attributes;
243
242
  };
244
243
 
244
+ int xmpp_stanza_set_attributes(xmpp_stanza_t * const stanza,
245
+ const char * const * const attr);
246
+
247
+ /* parser functions */
248
+ void parser_handle_start(void *userdata,
249
+ const XML_Char *name,
250
+ const XML_Char **attr);
251
+ void parser_handle_character(void *userdata, const XML_Char *s, int len);
252
+ void parser_handle_end(void *userdata, const XML_Char *name);
253
+ void parser_prepare_reset(xmpp_conn_t * const conn,
254
+ xmpp_open_handler handler);
255
+ int parser_reset(xmpp_conn_t * const conn);
256
+
245
257
  /* handler management */
246
258
  void handler_fire_stanza(xmpp_conn_t * const conn,
247
259
  xmpp_stanza_t * const stanza);
data/ext/conn.c CHANGED
@@ -1,7 +1,7 @@
1
1
  /* conn.c
2
2
  ** strophe XMPP client library -- connection object functions
3
3
  **
4
- ** Copyright (C) 2005-2009 Collecta, Inc.
4
+ ** Copyright (C) 2005-2008 OGG, LLC. All rights reserved.
5
5
  **
6
6
  ** This software is provided AS-IS with no warranty, either express
7
7
  ** or implied.
@@ -23,11 +23,9 @@
23
23
  #include <stdlib.h>
24
24
  #include <string.h>
25
25
 
26
- #include <strophe.h>
27
-
26
+ #include "strophe.h"
28
27
  #include "common.h"
29
28
  #include "util.h"
30
- #include "parser.h"
31
29
 
32
30
  #ifndef DEFAULT_SEND_QUEUE_MAX
33
31
  /** @def DEFAULT_SEND_QUEUE_MAX
@@ -53,13 +51,6 @@
53
51
  static int _disconnect_cleanup(xmpp_conn_t * const conn,
54
52
  void * const userdata);
55
53
 
56
- static void _handle_stream_start(char *name, char **attrs,
57
- void * const userdata);
58
- static void _handle_stream_end(char *name,
59
- void * const userdata);
60
- static void _handle_stream_stanza(xmpp_stanza_t *stanza,
61
- void * const userdata);
62
-
63
54
  /** Create a new Strophe connection object.
64
55
  *
65
56
  * @param ctx a Strophe context object
@@ -105,23 +96,17 @@ xmpp_conn_t *xmpp_conn_new(xmpp_ctx_t * const ctx)
105
96
  conn->jid = NULL;
106
97
  conn->pass = NULL;
107
98
  conn->stream_id = NULL;
108
- conn->bound_jid = NULL;
109
99
 
110
100
  conn->tls_support = 0;
111
101
  conn->tls_failed = 0;
112
102
  conn->sasl_support = 0;
113
- conn->secured = 0;
114
103
 
115
104
  conn->bind_required = 0;
116
105
  conn->session_required = 0;
117
106
 
118
- conn->parser = parser_new(conn->ctx,
119
- _handle_stream_start,
120
- _handle_stream_end,
121
- _handle_stream_stanza,
122
- conn);
123
- conn->reset_parser = 0;
124
- conn_prepare_reset(conn, auth_handle_open);
107
+ conn->parser = NULL;
108
+ conn->stanza = NULL;
109
+ parser_prepare_reset(conn, auth_handle_open);
125
110
 
126
111
  conn->authenticated = 0;
127
112
  conn->conn_handler = NULL;
@@ -142,7 +127,7 @@ xmpp_conn_t *xmpp_conn_new(xmpp_ctx_t * const ctx)
142
127
  if (!item) {
143
128
  xmpp_error(conn->ctx, "xmpp", "failed to allocate memory");
144
129
  xmpp_free(conn->ctx, conn->lang);
145
- parser_free(conn->parser);
130
+ XML_ParserFree(conn->parser);
146
131
  xmpp_free(conn->ctx, conn);
147
132
  conn = NULL;
148
133
  } else {
@@ -166,7 +151,7 @@ xmpp_conn_t *xmpp_conn_new(xmpp_ctx_t * const ctx)
166
151
  *
167
152
  * @ingroup Connections
168
153
  */
169
- xmpp_conn_t *xmpp_conn_clone(xmpp_conn_t * const conn)
154
+ xmpp_conn_t * xmpp_conn_clone(xmpp_conn_t * const conn)
170
155
  {
171
156
  conn->ref++;
172
157
  return conn;
@@ -264,14 +249,12 @@ int xmpp_conn_release(xmpp_conn_t * const conn)
264
249
  xmpp_free(ctx, conn->stream_error);
265
250
  }
266
251
 
267
- parser_free(conn->parser);
252
+ XML_ParserFree(conn->parser);
268
253
 
269
254
  if (conn->domain) xmpp_free(ctx, conn->domain);
270
255
  if (conn->jid) xmpp_free(ctx, conn->jid);
271
- if (conn->bound_jid) xmpp_free(ctx, conn->bound_jid);
272
256
  if (conn->pass) xmpp_free(ctx, conn->pass);
273
257
  if (conn->stream_id) xmpp_free(ctx, conn->stream_id);
274
- if (conn->lang) xmpp_free(ctx, conn->lang);
275
258
  xmpp_free(ctx, conn);
276
259
  released = 1;
277
260
  }
@@ -292,24 +275,6 @@ const char *xmpp_conn_get_jid(const xmpp_conn_t * const conn)
292
275
  return conn->jid;
293
276
  }
294
277
 
295
- /**
296
- * Get the JID discovered during binding time.
297
- *
298
- * This JID will contain the resource used by the current connection.
299
- * This is useful in the case where a resource was not specified for
300
- * binding.
301
- *
302
- * @param conn a Strophe connection object.
303
- *
304
- * @return a string containing the full JID or NULL if it's not been discovered
305
- *
306
- * @ingroup Connections
307
- */
308
- const char *xmpp_conn_get_bound_jid(const xmpp_conn_t * const conn)
309
- {
310
- return conn->bound_jid;
311
- }
312
-
313
278
  /** Set the JID of the user that will be bound to the connection.
314
279
  * If any JID was previously set, it will be discarded. This should not be
315
280
  * be used after a connection is created. The function will make a copy of
@@ -414,32 +379,25 @@ int xmpp_connect_client(xmpp_conn_t * const conn,
414
379
  {
415
380
  char connectdomain[2048];
416
381
  int connectport;
417
- const char * domain;
382
+ char *domain;
418
383
 
419
384
  conn->type = XMPP_CLIENT;
420
385
 
421
386
  conn->domain = xmpp_jid_domain(conn->ctx, conn->jid);
422
387
  if (!conn->domain) return -1;
423
388
 
424
- if (altdomain) {
425
- xmpp_debug(conn->ctx, "xmpp", "Connecting via altdomain.");
426
- strcpy(connectdomain, altdomain);
427
- connectport = altport ? altport : 5222;
428
- } else if (!sock_srv_lookup("xmpp-client", "tcp", conn->domain,
429
- connectdomain, 2048, &connectport)) {
389
+ if (!sock_srv_lookup("xmpp-client", "tcp", conn->domain, connectdomain, 2048, &connectport))
390
+ {
430
391
  xmpp_debug(conn->ctx, "xmpp", "SRV lookup failed.");
431
392
  if (!altdomain)
432
393
  domain = conn->domain;
433
394
  else
434
395
  domain = altdomain;
435
- xmpp_debug(conn->ctx, "xmpp", "Using alternate domain %s, port %d",
436
- altdomain, altport);
396
+ xmpp_debug(conn->ctx, "xmpp", "Using alternate domain %s, port %d", altdomain, altport);
437
397
  strcpy(connectdomain, domain);
438
398
  connectport = altport ? altport : 5222;
439
399
  }
440
400
  conn->sock = sock_connect(connectdomain, connectport);
441
- xmpp_debug(conn->ctx, "xmpp", "sock_connect to %s:%d returned %d",
442
- connectdomain, connectport, conn->sock);
443
401
  if (conn->sock == -1) return -1;
444
402
 
445
403
  /* setup handler */
@@ -468,7 +426,7 @@ void conn_disconnect_clean(xmpp_conn_t * const conn)
468
426
  {
469
427
  /* remove the timed handler */
470
428
  xmpp_timed_handler_delete(conn, _disconnect_cleanup);
471
-
429
+ conn->error = -4;
472
430
  conn_disconnect(conn);
473
431
  }
474
432
 
@@ -487,26 +445,13 @@ void conn_disconnect(xmpp_conn_t * const conn)
487
445
  tls_free(conn->tls);
488
446
  conn->tls = NULL;
489
447
  }
490
- sock_close(conn->sock);
491
448
 
449
+ sock_close(conn->sock);
492
450
  /* fire off connection handler */
493
- conn->conn_handler(conn, XMPP_CONN_DISCONNECT, conn->error,
451
+ if (NULL != conn->conn_handler) {
452
+ conn->conn_handler(conn, XMPP_CONN_DISCONNECT, conn->error,
494
453
  conn->stream_error, conn->userdata);
495
- }
496
-
497
- /* prepares a parser reset. this is called from handlers. we can't
498
- * reset the parser immediately as it is not re-entrant. */
499
- void conn_prepare_reset(xmpp_conn_t * const conn, xmpp_open_handler handler)
500
- {
501
- conn->reset_parser = 1;
502
- conn->open_handler = handler;
503
- }
504
-
505
- /* reset the parser */
506
- void conn_parser_reset(xmpp_conn_t * const conn)
507
- {
508
- conn->reset_parser = 0;
509
- parser_reset(conn->parser);
454
+ }
510
455
  }
511
456
 
512
457
  /* timed handler for cleanup if normal disconnect procedure takes too long */
@@ -515,7 +460,7 @@ static int _disconnect_cleanup(xmpp_conn_t * const conn,
515
460
  {
516
461
  xmpp_debug(conn->ctx, "xmpp",
517
462
  "disconnection forced by cleanup timeout");
518
-
463
+ conn->error = -5;
519
464
  conn_disconnect(conn);
520
465
 
521
466
  return 0;
@@ -682,97 +627,3 @@ void conn_open_stream(xmpp_conn_t * const conn)
682
627
  conn->type == XMPP_CLIENT ? XMPP_NS_CLIENT : XMPP_NS_COMPONENT,
683
628
  XMPP_NS_STREAMS);
684
629
  }
685
-
686
- static void _log_open_tag(xmpp_conn_t *conn, char **attrs)
687
- {
688
- char buf[4096];
689
- size_t len, pos;
690
- int i;
691
-
692
- if (!attrs) return;
693
-
694
- pos = 0;
695
- len = xmpp_snprintf(buf, 4096, "<stream:stream");
696
- if (len < 0) return;
697
-
698
- pos += len;
699
-
700
- for (i = 0; attrs[i]; i += 2) {
701
- len = xmpp_snprintf(&buf[pos], 4096 - pos, " %s='%s'",
702
- attrs[i], attrs[i+1]);
703
- if (len < 0) return;
704
- pos += len;
705
- }
706
-
707
- len = xmpp_snprintf(&buf[pos], 4096 - pos, ">");
708
- if (len < 0) return;
709
-
710
- xmpp_debug(conn->ctx, "xmpp", "RECV: %s", buf);
711
- }
712
-
713
- static char *_get_stream_attribute(char **attrs, char *name)
714
- {
715
- int i;
716
-
717
- if (!attrs) return NULL;
718
-
719
- for (i = 0; attrs[i]; i += 2)
720
- if (strcmp(name, attrs[i]) == 0)
721
- return attrs[i+1];
722
-
723
- return NULL;
724
- }
725
-
726
- static void _handle_stream_start(char *name, char **attrs,
727
- void * const userdata)
728
- {
729
- xmpp_conn_t *conn = (xmpp_conn_t *)userdata;
730
- char *id;
731
-
732
- if (strcmp(name, "stream:stream") != 0) {
733
- printf("name = %s\n", name);
734
- xmpp_error(conn->ctx, "conn", "Server did not open valid stream.");
735
- conn_disconnect(conn);
736
- } else {
737
- _log_open_tag(conn, attrs);
738
-
739
- if (conn->stream_id) xmpp_free(conn->ctx, conn->stream_id);
740
-
741
- id = _get_stream_attribute(attrs, "id");
742
- if (id)
743
- conn->stream_id = xmpp_strdup(conn->ctx, id);
744
-
745
- if (!conn->stream_id) {
746
- xmpp_error(conn->ctx, "conn", "Memory allocation failed.");
747
- conn_disconnect(conn);
748
- }
749
- }
750
-
751
- /* call stream open handler */
752
- conn->open_handler(conn);
753
- }
754
-
755
- static void _handle_stream_end(char *name,
756
- void * const userdata)
757
- {
758
- xmpp_conn_t *conn = (xmpp_conn_t *)userdata;
759
-
760
- /* stream is over */
761
- xmpp_debug(conn->ctx, "xmpp", "RECV: </stream:stream>");
762
- conn_disconnect_clean(conn);
763
- }
764
-
765
- static void _handle_stream_stanza(xmpp_stanza_t *stanza,
766
- void * const userdata)
767
- {
768
- xmpp_conn_t *conn = (xmpp_conn_t *)userdata;
769
- char *buf;
770
- size_t len;
771
-
772
- if (xmpp_stanza_to_text(stanza, &buf, &len) == 0) {
773
- xmpp_debug(conn->ctx, "xmpp", "RECV: %s", buf);
774
- xmpp_free(conn->ctx, buf);
775
- }
776
-
777
- handler_fire_stanza(conn, stanza);
778
- }
data/ext/ctx.c CHANGED
@@ -1,7 +1,7 @@
1
1
  /* ctx.c
2
2
  ** strophe XMPP client library -- run-time context implementation
3
3
  **
4
- ** Copyright (C) 2005-2009 Collecta, Inc.
4
+ ** Copyright (C) 2005-2008 OGG, LLC. All rights reserved.
5
5
  **
6
6
  ** This software is provided AS-IS with no warranty, either express
7
7
  ** or implied.
@@ -58,7 +58,7 @@
58
58
  *
59
59
  * @ingroup Init
60
60
  */
61
- void xmpp_initialize(void)
61
+ void xmpp_initialize(void)
62
62
  {
63
63
  sock_initialize();
64
64
  tls_initialize();
@@ -248,12 +248,12 @@ void xmpp_log(const xmpp_ctx_t * const ctx,
248
248
  va_list ap)
249
249
  {
250
250
  int oldret, ret;
251
- char smbuf[1024];
251
+ char smbuf[4096] = {0};
252
252
  char *buf;
253
253
 
254
254
  buf = smbuf;
255
- ret = xmpp_vsnprintf(buf, 1023, fmt, ap);
256
- if (ret > 1023) {
255
+ ret = xmpp_vsnprintf(buf, 4096 - 1, fmt, ap);
256
+ if (ret > 4096 - 1) {
257
257
  buf = (char *)xmpp_alloc(ctx, ret + 1);
258
258
  if (!buf) {
259
259
  buf = NULL;