xmppify 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/app/assets/javascripts/xmpp/index.js +0 -0
  8. data/app/assets/javascripts/xmpp/scripts/checkplayer.js +12 -0
  9. data/app/assets/javascripts/xmpp/scripts/crossdomain.xml +7 -0
  10. data/app/assets/javascripts/xmpp/scripts/flXHR.js +2 -0
  11. data/app/assets/javascripts/xmpp/scripts/flXHR.swf +0 -0
  12. data/app/assets/javascripts/xmpp/scripts/flXHR.vbs +44 -0
  13. data/app/assets/javascripts/xmpp/scripts/flensed.js +12 -0
  14. data/app/assets/javascripts/xmpp/scripts/strophe.flxhr.js +31 -0
  15. data/app/assets/javascripts/xmpp/scripts/strophe.js +3538 -0
  16. data/app/assets/javascripts/xmpp/scripts/swfobject.js +5 -0
  17. data/app/assets/javascripts/xmpp/scripts/updateplayer.swf +0 -0
  18. data/app/assets/javascripts/xmpp/scripts/xmpp.js.coffee +386 -0
  19. data/app/assets/javascripts/xmpp/strophejs-plugins/LICENSE.txt +19 -0
  20. data/app/assets/javascripts/xmpp/strophejs-plugins/README.markdown +95 -0
  21. data/app/assets/javascripts/xmpp/strophejs-plugins/archive/README.markdown +14 -0
  22. data/app/assets/javascripts/xmpp/strophejs-plugins/archive/iso8601_support.js +32 -0
  23. data/app/assets/javascripts/xmpp/strophejs-plugins/archive/strophe.archive.js +88 -0
  24. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/README.markdown +53 -0
  25. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/sha1.js +202 -0
  26. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.CAPS.coffee +153 -0
  27. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.CAPS.js +88 -0
  28. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.caps.jsonly.js +240 -0
  29. data/app/assets/javascripts/xmpp/strophejs-plugins/chatstates/strophe.chatstates.js +80 -0
  30. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/README.markdown +47 -0
  31. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/GetUrlComamndSpec.js +66 -0
  32. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/strophe.cmds.spec.coffee +145 -0
  33. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/support/jasmine.json +16 -0
  34. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/src/strophe.cmds.coffee +265 -0
  35. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/src/strophe.cmds.js +403 -0
  36. data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/README.markdown +82 -0
  37. data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/spec/strophe.x.coffee +715 -0
  38. data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/src/strophe.x.coffee +443 -0
  39. data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/src/strophe.x.js +854 -0
  40. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/.gitignore +1 -0
  41. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/README.markdown +0 -0
  42. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/convert.js +13 -0
  43. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/jasmine.json +11 -0
  44. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/lib/strophe.disco.js +137 -0
  45. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/public/javascript/strophe.disco.js +137 -0
  46. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/01_querying_information.xml +6 -0
  47. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/02_result_set_for_information_request.xml +22 -0
  48. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/03_target_entity_does_not_exist.xml +10 -0
  49. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/04_service_unavailable.xml +11 -0
  50. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/09_querying_specific_jid_and_node_combination.xml +7 -0
  51. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/10_jid_and_node_result.xml +12 -0
  52. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/11_requesting_all_items.xml +6 -0
  53. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/12_result_set_for_all_items.xml +23 -0
  54. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/13_empty_result_set.xml +7 -0
  55. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/17_service_returns_nodes.xml +16 -0
  56. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/18_requesting_further_nodes.xml +7 -0
  57. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/24_jid_and_node_error.xml +11 -0
  58. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/DiscoNodeSpec.js +50 -0
  59. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/SpecHelper.js +51 -0
  60. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/Stanzas.js +0 -0
  61. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/strophe.disco.spec.helper.js +54 -0
  62. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/strophe.disco.spec.js +0 -0
  63. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/support/jasmine.json +13 -0
  64. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/strophe.disco.js +232 -0
  65. data/app/assets/javascripts/xmpp/strophejs-plugins/epic/public/javascript/jquery.epic.js +61 -0
  66. data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/SpecHelper.js +9 -0
  67. data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/jquery.epic.js +39 -0
  68. data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/support/jasmine.json +22 -0
  69. data/app/assets/javascripts/xmpp/strophejs-plugins/iexdomain/iexdomain.js +36 -0
  70. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/README.markdown +117 -0
  71. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/buster.js +23 -0
  72. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/jid.coffee +64 -0
  73. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/jid.js +92 -0
  74. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/browserSetup.coffee +1 -0
  75. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/jid.spec.coffee +96 -0
  76. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/strophe.joap.spec.coffee +461 -0
  77. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/strophe.joap.coffee +304 -0
  78. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/strophe.joap.js +522 -0
  79. data/app/assets/javascripts/xmpp/strophejs-plugins/mam/LICENSE.txt +19 -0
  80. data/app/assets/javascripts/xmpp/strophejs-plugins/mam/README.markdown +52 -0
  81. data/app/assets/javascripts/xmpp/strophejs-plugins/mam/strophe.mam.js +62 -0
  82. data/app/assets/javascripts/xmpp/strophejs-plugins/muc/LICENSE.txt +20 -0
  83. data/app/assets/javascripts/xmpp/strophejs-plugins/muc/strophe.muc.js +1003 -0
  84. data/app/assets/javascripts/xmpp/strophejs-plugins/ping/README.markdown +28 -0
  85. data/app/assets/javascripts/xmpp/strophejs-plugins/ping/strophe.ping.js +68 -0
  86. data/app/assets/javascripts/xmpp/strophejs-plugins/private/README.markdown +16 -0
  87. data/app/assets/javascripts/xmpp/strophejs-plugins/private/strophe.private.js +192 -0
  88. data/app/assets/javascripts/xmpp/strophejs-plugins/pubsub/strophe.pubsub.js +555 -0
  89. data/app/assets/javascripts/xmpp/strophejs-plugins/receipts/strophe.receipts.js +155 -0
  90. data/app/assets/javascripts/xmpp/strophejs-plugins/register/README.markdown +44 -0
  91. data/app/assets/javascripts/xmpp/strophejs-plugins/register/strophe.register.js +431 -0
  92. data/app/assets/javascripts/xmpp/strophejs-plugins/roster/public/javascript/strophe.roster.js +40 -0
  93. data/app/assets/javascripts/xmpp/strophejs-plugins/roster/spec/strophe.roster.spec.js +65 -0
  94. data/app/assets/javascripts/xmpp/strophejs-plugins/roster/spec/support/jasmine.json +15 -0
  95. data/app/assets/javascripts/xmpp/strophejs-plugins/roster/strophe.roster.js +438 -0
  96. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/.gitignore +6 -0
  97. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/README.md +113 -0
  98. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/buster.js +11 -0
  99. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/lib/strophe.js +4198 -0
  100. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/spec/strophe.rpc.spec.helper.js +38 -0
  101. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/spec/strophe.rpc.spec.js +262 -0
  102. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/strophe.rpc.js +464 -0
  103. data/app/assets/javascripts/xmpp/strophejs-plugins/rsm/strophe.rsm.js +52 -0
  104. data/app/assets/javascripts/xmpp/strophejs-plugins/serverdate/strophe.serverdate.js +58 -0
  105. data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/examples/index.html +17 -0
  106. data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/examples/strophevcard.js +0 -0
  107. data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/strophe.vcard.coffee +44 -0
  108. data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/strophe.vcard.js +66 -0
  109. data/app/assets/stylesheets/xmpp/index.css +0 -0
  110. data/app/controllers/omniauth_callbacks_controller.rb +15 -0
  111. data/app/controllers/ruby_bosh.rb +221 -0
  112. data/app/models/identity.rb +3 -0
  113. data/app/models/user.rb +40 -0
  114. data/bin/rails +8 -0
  115. data/db/migrate/20140329065635_create_users.rb +10 -0
  116. data/db/migrate/20140329070238_create_identities.rb +11 -0
  117. data/lib/xmppify/version.rb +3 -0
  118. data/lib/xmppify.rb +6 -0
  119. data/xmppify.gemspec +23 -0
  120. metadata +197 -0
@@ -0,0 +1,464 @@
1
+ /**
2
+ * This program is distributed under the terms of the MIT license.
3
+ *
4
+ * Copyright 2011 (c) Pierre Guilleminot <pierre.guilleminot@gmail.com>
5
+ */
6
+
7
+ /**
8
+ * Jabber-RPC plugin (XEP-0009)
9
+ * Allow the management of RPC
10
+ */
11
+ Strophe.addConnectionPlugin("rpc", {
12
+
13
+ _connection : undefined,
14
+
15
+ _whitelistEnabled : false,
16
+
17
+ jidWhiteList : [],
18
+ nodeWhiteList : [],
19
+ domainWhiteList : [],
20
+
21
+ /**
22
+ * Plugin init
23
+ *
24
+ * @param {Strophe.Connection} connection Strophe connection
25
+ */
26
+ init: function(connection) {
27
+
28
+ this._connection = connection;
29
+
30
+ this._whitelistEnabled = false;
31
+
32
+ this.jidWhiteList = [];
33
+ this.nodeWhiteList = [];
34
+ this.domainWhiteList = [];
35
+
36
+ Strophe.addNamespace("RPC", "jabber:iq:rpc");
37
+
38
+ if (!connection.hasOwnProperty("disco")) {
39
+ Strophe.warn("You need the discovery plugin " +
40
+ "to have Jabber-RPC fully implemented.");
41
+ }
42
+ else {
43
+ this._connection.disco.addIdentity("automation", "rpc");
44
+ this._connection.disco.addFeature(Strophe.NS.RPC);
45
+ }
46
+ },
47
+
48
+ /**
49
+ * Add a jid or an array of jids to
50
+ * the whitelist.
51
+ * It's possible to use wildecards for the domain
52
+ * or the node. ie:
53
+ * *@*
54
+ * myname@*
55
+ * *@jabber.org
56
+ *
57
+ * @param {String|Array} jid
58
+ */
59
+ addJidToWhiteList: function(jids) {
60
+ if (typeof(jids.sort) !== "function") {
61
+ jids = [jids];
62
+ }
63
+
64
+ for (var i = 0; i < jids.length; i++) {
65
+ var jid = jids[i];
66
+
67
+ if (jid === "*@*") {
68
+ this._whitelistEnabled = false;
69
+ return;
70
+ }
71
+
72
+ var node = Strophe.getNodeFromJid(jid);
73
+ var domain = Strophe.getDomainFromJid(jid);
74
+ if (jid) {
75
+ if (node === "*") {
76
+ this.domainWhiteList.push(domain);
77
+ } else if (domain === "*") {
78
+ this.nodeWhiteList.push(node);
79
+ } else {
80
+ this.jidWhiteList.push(jid);
81
+ }
82
+ this._whitelistEnabled = true;
83
+ }
84
+ }
85
+ },
86
+
87
+ /**
88
+ * Helper to filter out Jid outside of the whitelists
89
+ *
90
+ * @param {String} jid Jid to test
91
+ * @return {Boolean}
92
+ */
93
+ _jidInWhitelist: function(jid) {
94
+ if (!this._whitelistEnabled)
95
+ return true;
96
+
97
+ if (jid === this._connection.jid)
98
+ return true;
99
+
100
+ return (
101
+ this.domainWhiteList.indexOf(Strophe.getDomainFromJid(jid)) !== -1 ||
102
+ this.nodeWhiteList.indexOf(Strophe.getNodeFromJid(jid)) !== -1 ||
103
+ this.jidWhiteList.indexOf(jid) !== -1
104
+ );
105
+ },
106
+
107
+ /**
108
+ * Send a request message
109
+ *
110
+ * @param {Object} id ID of the request
111
+ * @param {String} to JID of the recipient
112
+ * @param {String} method name of the method
113
+ * @param {Array} params Array of parameters
114
+ */
115
+ sendRequest: function(id, to, method, params) {
116
+ params = (typeof(params.sort) === "function") ? params : [params];
117
+
118
+ var element = new Strophe.Builder("methodCall")
119
+ .c("methodName").t(method)
120
+ .up()
121
+ .c("params");
122
+
123
+ for (var i = 0; i < params.length; i++) {
124
+ element.c("param")
125
+ .cnode(this._convertToXML(params[i]))
126
+ .up().up();
127
+ }
128
+
129
+ this.sendXMLElement(id, to, "set", element.tree());
130
+ },
131
+
132
+ /**
133
+ * Send a response message
134
+ *
135
+ * @param {String} id ID of the request
136
+ * @param {String} to JID of the recipient
137
+ * @param {Object} result Result of the function call
138
+ */
139
+ sendResponse: function(id, to, result) {
140
+ var element = new Strophe.Builder("methodResponse")
141
+ .c("params")
142
+ .c("param")
143
+ .cnode(this._convertToXML(result));
144
+
145
+ this.sendXMLElement(id, to, "result", element.tree());
146
+ },
147
+
148
+ /**
149
+ * Send an error response (or fault)
150
+ *
151
+ * @param {String} id ID of the faulted request
152
+ * @param {String} to JID of the recipient
153
+ * @param {Number} code Code of the error
154
+ * @param {String} message Error message
155
+ */
156
+ sendError: function(id, to, code, message) {
157
+ if (isNaN(code)) {
158
+ Strophe.error(code + " is not a number");
159
+ return;
160
+ }
161
+
162
+ var element = new Strophe.Builder("methodResponse")
163
+ .c("fault")
164
+ .cnode(this._convertToXML({
165
+ faultCode: code,
166
+ faultString: String(message)
167
+ }));
168
+
169
+ this.sendXMLElement(id, to, "result", element.tree());
170
+ },
171
+
172
+ /**
173
+ * Send a XMLElement as the request
174
+ * Does not check whether it is properly formed or not
175
+ *
176
+ * @param {String} id ID of the request or response
177
+ * @param {String} to JID of the recipient
178
+ * @param {String} type Type of the request ('set' for a request and 'result' for a response)
179
+ * @param {Element} element The XMLElement to send
180
+ */
181
+ sendXMLElement: function(id, to, type, element) {
182
+ if (typeof element.tree === 'function') {
183
+ element = element.tree();
184
+ }
185
+
186
+ var iq = $iq({type: type, id: id, from: this._connection.jid, to: to})
187
+ .c("query", {xmlns: Strophe.NS.RPC})
188
+ .cnode(element);
189
+
190
+ this._connection.send(iq.tree());
191
+ },
192
+
193
+ _sendForbiddenAccess: function(id, to) {
194
+ var iq = $iq({type: "error", id: id, from: this._connection.jid, to: to})
195
+ .c("error", {code: 403, type: "auth"})
196
+ .c("forbidden", {xmlns: Strophe.NS.STANZAS});
197
+
198
+ this._connection.send(iq.tree());
199
+ },
200
+
201
+ /**
202
+ * Add a request and response handlers
203
+ *
204
+ * @param {Function} request_h Request handler
205
+ * @param {Function} response_h Response handler
206
+ * @param {Object} context Context of the handlers
207
+ */
208
+ addHandlers: function(request_h, response_h, context) {
209
+ this.addRequestHandler(request_h, context);
210
+ this.addResponseHandler(response_h, context);
211
+ },
212
+
213
+ /**
214
+ * Add a request handler
215
+ * called every time a request is received
216
+ *
217
+ * @param {Function} handler The handler function
218
+ * @param {Object} context Context of the handler
219
+ */
220
+ addRequestHandler: function(handler, context) {
221
+ this._connection.addHandler(this._filteredRequestHandler(handler, context), Strophe.NS.RPC, "iq", "set");
222
+ },
223
+
224
+ /**
225
+ * Add a response handler
226
+ * called every time a response is received
227
+ *
228
+ * @param {Function} handler The handler function called every time a response is received
229
+ * @param {Object} context Context of the handler
230
+ */
231
+ addResponseHandler: function(handler, context) {
232
+ this._connection.addHandler(this._filteredResponseHandler(handler, context), Strophe.NS.RPC, "iq", "result");
233
+ },
234
+
235
+ /**
236
+ * Add a raw XML handler for every RPC message incoming
237
+ * @param {Function} handler The handler function called every time a rpc is received
238
+ * @param {Object} context Context of the handler
239
+ */
240
+ addXMLHandler: function(handler, context) {
241
+ this._connection.addHandler(this._filteredHandler(handler, context), Strophe.NS.RPC, "iq");
242
+ },
243
+
244
+ _filter: function(xml) {
245
+ var from = xml.getAttribute("from");
246
+ if (!this._jidInWhitelist(from)) {
247
+ this._sendForbiddenAccess(xml.getAttribute("id"), from);
248
+ return false;
249
+ }
250
+ return true;
251
+ },
252
+
253
+ _filteredHandler: function(handler, context) {
254
+ context = context || this;
255
+ var self = this;
256
+ return function(xml) {
257
+ if (self._filter(xml)) {
258
+ return handler.apply(context, arguments);
259
+ }
260
+ return true;
261
+ };
262
+ },
263
+
264
+ _filteredResponseHandler: function(handler, context) {
265
+ context = context || this;
266
+ var self = this;
267
+ return function(xml) {
268
+ if (self._filter(xml)) {
269
+ var rpc = self._parseResponseMessage(xml);
270
+ if (rpc.result || rpc.result === null)
271
+ return handler.call(context, rpc.id, rpc.from, rpc.result, false);
272
+ else if (rpc.fault || rpc.fault === null)
273
+ return handler.call(context, rpc.id, rpc.from, rpc.fault, true);
274
+ }
275
+ return true;
276
+ };
277
+ },
278
+
279
+ _filteredRequestHandler: function(handler, context) {
280
+ context = context || this;
281
+ var self = this;
282
+ return function(xml) {
283
+ if (self._filter(xml)) {
284
+ var rpc = self._parseRequestMessage(xml);
285
+ return handler.call(context, rpc.id, rpc.from, rpc.method, rpc.params);
286
+ }
287
+ return true;
288
+ };
289
+ },
290
+
291
+ /**
292
+ * Helper to transform a Javascript object
293
+ * into its XML representation as described in
294
+ * the XML-RPC spec
295
+ *
296
+ * @param {Object} obj The object to convert
297
+ * @return {Element} A <value> element
298
+ */
299
+ _convertToXML: function(obj) {
300
+ var key;
301
+
302
+ var xml = new Strophe.Builder("value");
303
+ var type = new RegExp("function (.*?)\\(\\) \\{.*").exec(obj.constructor.toString())[1];
304
+
305
+ switch (type) {
306
+ case "Number":
307
+ // Numbers can only be sent as integers or doubles.
308
+ var number = (Math.floor(obj) !== obj) ? "double" : "i4";
309
+ xml.c(number).t(obj.toString());
310
+ break;
311
+ case "String":
312
+ xml.c("string").t(obj);
313
+ break;
314
+ case "Boolean":
315
+ xml.c("boolean").t((obj*1).toString());
316
+ break;
317
+ case "Object":
318
+ xml.c("struct");
319
+ for (key in obj) {
320
+ if (obj.hasOwnProperty(key) && typeof(obj[key]) !== "function") {
321
+ xml.c("member").c("name").t(key);
322
+ xml.up().cnode(this._convertToXML(obj[key]));
323
+ xml.up().up();
324
+ }
325
+ }
326
+ break;
327
+ case "Date":
328
+ var datetext = obj.getFullYear() +
329
+ this._padNumber(obj.getMonth()+1) +
330
+ this._padNumber(obj.getDate()) + "T" +
331
+ this._padNumber(obj.getHours()) + ":" +
332
+ this._padNumber(obj.getMinutes()) + ":" +
333
+ this._padNumber(obj.getSeconds());
334
+ xml.c("dateTime.iso8601").t(datetext);
335
+ break;
336
+ case "Array":
337
+ xml.c("array").c("data");
338
+ for (key in obj) {
339
+ if (obj.hasOwnProperty(key) && typeof(obj[key]) !== "function") {
340
+ xml.cnode(this._convertToXML(obj[key]));
341
+ xml.up();
342
+ }
343
+ }
344
+ break;
345
+ default:
346
+ break;
347
+ }
348
+
349
+ return xml.tree();
350
+ },
351
+
352
+ _padNumber: function(num) {
353
+ if (num < 10) {
354
+ num = "0" + num;
355
+ }
356
+ return num;
357
+ },
358
+
359
+ _parseRequestMessage: function(iq) {
360
+ var rpc = {};
361
+ rpc.from = iq.getAttribute("from");
362
+ rpc.id = iq.getAttribute("id") || null;
363
+
364
+ // Method name
365
+ var method = iq.getElementsByTagName("methodName")[0];
366
+ rpc.method = method ? method.textContent : null;
367
+
368
+ // Parameters
369
+ rpc.params = null;
370
+ try {
371
+ var params = iq.getElementsByTagName("params")[0]
372
+ .childNodes;
373
+ if (params && params.length > 0) {
374
+ rpc.params = [];
375
+ for (var i = 0; i < params.length; i++) {
376
+ rpc.params.push(this._convertFromXML(params[i].firstChild));
377
+ }
378
+ }
379
+ } catch(e) {
380
+ rpc.params = null;
381
+ }
382
+ return rpc;
383
+ },
384
+
385
+ _parseResponseMessage: function(iq) {
386
+ var rpc = {};
387
+ rpc.from = iq.getAttribute("from");
388
+ rpc.id = iq.getAttribute("id") || null;
389
+
390
+ try {
391
+ var result = iq.getElementsByTagName("methodResponse")[0].firstChild;
392
+
393
+ // Response
394
+ var tag = result.tagName;
395
+ if (tag === "params") {
396
+ rpc.result = this._convertFromXML(result.firstChild.firstChild);
397
+ }
398
+ // Error
399
+ else if (tag === "fault") {
400
+ rpc.fault = this._convertFromXML(result.firstChild);
401
+ }
402
+ } catch(e) {
403
+ rpc.result = null;
404
+ }
405
+ return rpc;
406
+ },
407
+
408
+ _convertFromXML: function(obj) {
409
+ if (!obj)
410
+ return null;
411
+
412
+ var data;
413
+ var tag = obj.tagName.toLowerCase();
414
+
415
+ try {
416
+ switch (tag) {
417
+ case "value":
418
+ return this._convertFromXML(obj.firstChild);
419
+ case "double":
420
+ case "i4":
421
+ case "int":
422
+ var number = obj.textContent;
423
+ data = number * 1;
424
+ break;
425
+ case "boolean":
426
+ var bool = obj.textContent;
427
+ data = (bool === "1" || bool === "true") ? true : false;
428
+ break;
429
+ case "datetime.iso8601":
430
+ var date = obj.textContent;
431
+ data = new Date();
432
+ data.setFullYear(date.substring(0,4), date.substring(4,6) - 1, date.substring(6,8));
433
+ data.setHours(date.substring(9,11), date.substring(12,14), date.substring(15,17));
434
+ break;
435
+ case "array":
436
+ data = [];
437
+ var datatag = obj.firstChild;
438
+ for (var k = 0; k < datatag.childNodes.length; k++) {
439
+ var value = datatag.childNodes[k];
440
+ data.push(this._convertFromXML(value.firstChild));
441
+ }
442
+ break;
443
+ case "struct":
444
+ data = {};
445
+ for (var j = 0; j < obj.childNodes.length; j++) {
446
+ var membername = obj.childNodes[j].getElementsByTagName("name")[0].textContent;
447
+ var membervalue = obj.childNodes[j].getElementsByTagName("value")[0].firstChild;
448
+ data[membername] = membervalue ? this._convertFromXML(membervalue) : null;
449
+ }
450
+ break;
451
+ case "string":
452
+ data = obj.textContent;
453
+ break;
454
+ default:
455
+ data = null;
456
+ break;
457
+ }
458
+ } catch(e) {
459
+ data = null;
460
+ }
461
+ return data;
462
+ }
463
+
464
+ });
@@ -0,0 +1,52 @@
1
+ // http://xmpp.org/extensions/xep-0059.html
2
+
3
+ Strophe.addNamespace('RSM', 'http://jabber.org/protocol/rsm');
4
+
5
+ Strophe.RSM = function(options) {
6
+ this.attribs = ['max', 'first', 'last', 'after', 'before', 'index', 'count'];
7
+
8
+ if (typeof options.xml != 'undefined') {
9
+ this.fromXMLElement(options.xml);
10
+ } else {
11
+ for (var ii = 0; ii < this.attribs.length; ii++) {
12
+ var attrib = this.attribs[ii];
13
+ this[attrib] = options[attrib];
14
+ }
15
+ }
16
+ };
17
+
18
+ Strophe.RSM.prototype = {
19
+ toXML: function() {
20
+ var xml = $build('set', {xmlns: Strophe.NS.RSM});
21
+ for (var ii = 0; ii < this.attribs.length; ii++) {
22
+ var attrib = this.attribs[ii];
23
+ if (typeof this[attrib] != 'undefined') {
24
+ xml = xml.c(attrib).t(this[attrib].toString()).up();
25
+ }
26
+ }
27
+ return xml.tree();
28
+ },
29
+
30
+ next: function(max) {
31
+ var newSet = new Strophe.RSM({max: max, after: this.last});
32
+ return newSet;
33
+ },
34
+
35
+ previous: function(max) {
36
+ var newSet = new Strophe.RSM({max: max, before: this.first});
37
+ return newSet;
38
+ },
39
+
40
+ fromXMLElement: function(xmlElement) {
41
+ for (var ii = 0; ii < this.attribs.length; ii++) {
42
+ var attrib = this.attribs[ii];
43
+ var elem = xmlElement.getElementsByTagName(attrib)[0];
44
+ if (typeof elem != 'undefined' && elem !== null) {
45
+ this[attrib] = Strophe.getText(elem);
46
+ if (attrib == 'first') {
47
+ this.index = elem.getAttribute('index');
48
+ }
49
+ }
50
+ }
51
+ }
52
+ };
@@ -0,0 +1,58 @@
1
+
2
+
3
+ /* serverdate plugin
4
+ **
5
+ ** This plugin syncs a local clock to the servers using the response header
6
+ ** on the BOSH connection
7
+ **
8
+ */
9
+
10
+ var ServerDate = function(){
11
+ if( arguments.length === 0 ){
12
+ return new Date( new Date().valueOf() + ServerDate.skew );
13
+ }
14
+ else if ( arguments.length === 1 ){
15
+ // Covers case where a string is passed in
16
+ return new Date( arguments[0] );
17
+ }
18
+ else {
19
+ return new Date( Date.UTC.apply( null, arguments ) + ((new Date()).getTimezoneOffset() * 60000) );
20
+ }
21
+ };
22
+ ServerDate.parse = Date.parse;
23
+ ServerDate.UTC = Date.UTC;
24
+ ServerDate.now = function(){ return (new ServerDate()).valueOf(); };
25
+ ServerDate.skew = 0;
26
+
27
+ Strophe.addConnectionPlugin('serverdate', {
28
+ init: function(connection){
29
+ Strophe.Request.prototype._newXHR = function () {
30
+ var xhr = null;
31
+ if (window.XMLHttpRequest) {
32
+ xhr = new XMLHttpRequest();
33
+ if (xhr.overrideMimeType) {
34
+ xhr.overrideMimeType("text/xml");
35
+ }
36
+ } else if (window.ActiveXObject) {
37
+ xhr = new ActiveXObject("Microsoft.XMLHTTP");
38
+ }
39
+
40
+ var handler = this.func.prependArg(this);
41
+
42
+ xhr.onreadystatechange = function(){
43
+ if(this.readyState == 2){
44
+ var header = this.getResponseHeader('Date');
45
+ var server_date = new Date(header);
46
+ if ( header && server_date != 'Invalid Date' ){
47
+ system_date = new Date();
48
+ skew_ms = server_date - system_date;
49
+ ServerDate.skew = skew_ms;
50
+ }
51
+ }
52
+ handler();
53
+ };
54
+
55
+ return xhr;
56
+ };
57
+ }
58
+ });
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+
6
+ <title>Strophe Vcard Example</title>
7
+ <!-- Load jQuery -->
8
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script>
9
+
10
+ <script src="../../strophe.min.js"></script>
11
+ <script src="../strophe.vcard.js"></script>
12
+ <script src="strophevcard.js"></script>
13
+ </head>
14
+ <body class='avatar'>
15
+ <canvas id='example' width='100' height='100'></canvas>
16
+ </body>
17
+ </html>
@@ -0,0 +1,44 @@
1
+ ###
2
+ Plugin to implement the vCard extension.
3
+ http://xmpp.org/extensions/xep-0054.html
4
+
5
+ Author: Nathan Zorn (nathan.zorn@gmail.com)
6
+ CoffeeScript port: Andreas Guth (guth@dbis.rwth-aachen.de)
7
+
8
+ ###
9
+ ### jslint configuration: ###
10
+ ### global document, window, setTimeout, clearTimeout, console,
11
+ XMLHttpRequest, ActiveXObject,
12
+ Base64, MD5,
13
+ Strophe, $build, $msg, $iq, $pres
14
+ ###
15
+ buildIq = (type, jid, vCardEl) ->
16
+ iq = $iq if jid then type:type, to:jid else type:type
17
+ iq.c "vCard", xmlns:Strophe.NS.VCARD
18
+ iq.cnode vCardEl if vCardEl
19
+ iq
20
+
21
+ Strophe.addConnectionPlugin 'vcard',
22
+ _connection: null
23
+ # Called by Strophe.Connection constructor
24
+ init: (conn) ->
25
+ this._connection = conn
26
+ Strophe.addNamespace 'VCARD', 'vcard-temp'
27
+
28
+ ###Function
29
+ Retrieve a vCard for a JID/Entity
30
+ Parameters:
31
+ (Function) handler_cb - The callback function used to handle the request.
32
+ (String) jid - optional - The name of the entity to request the vCard
33
+ If no jid is given, this function retrieves the current user's vcard.
34
+ ###
35
+ get: (handler_cb, jid, error_cb) ->
36
+ iq = buildIq "get", jid
37
+ this._connection.sendIQ iq, handler_cb, error_cb
38
+
39
+ ### Function
40
+ Set an entity's vCard.
41
+ ###
42
+ set: (handler_cb, vCardEl, jid, error_cb) ->
43
+ iq = buildIq "set", jid, vCardEl
44
+ this._connection.sendIQ iq, handler_cb, error_cb
@@ -0,0 +1,66 @@
1
+ // Generated by CoffeeScript 1.3.3
2
+ /*
3
+ Plugin to implement the vCard extension.
4
+ http://xmpp.org/extensions/xep-0054.html
5
+
6
+ Author: Nathan Zorn (nathan.zorn@gmail.com)
7
+ CoffeeScript port: Andreas Guth (guth@dbis.rwth-aachen.de)
8
+ */
9
+
10
+ /* jslint configuration:
11
+ */
12
+
13
+ /* global document, window, setTimeout, clearTimeout, console,
14
+ XMLHttpRequest, ActiveXObject,
15
+ Base64, MD5,
16
+ Strophe, $build, $msg, $iq, $pres
17
+ */
18
+
19
+ var buildIq;
20
+
21
+ buildIq = function(type, jid, vCardEl) {
22
+ var iq;
23
+ iq = $iq(jid ? {
24
+ type: type,
25
+ to: jid
26
+ } : {
27
+ type: type
28
+ });
29
+ iq.c("vCard", {
30
+ xmlns: Strophe.NS.VCARD
31
+ });
32
+ if (vCardEl) {
33
+ iq.cnode(vCardEl);
34
+ }
35
+ return iq;
36
+ };
37
+
38
+ Strophe.addConnectionPlugin('vcard', {
39
+ _connection: null,
40
+ init: function(conn) {
41
+ this._connection = conn;
42
+ return Strophe.addNamespace('VCARD', 'vcard-temp');
43
+ },
44
+ /*Function
45
+ Retrieve a vCard for a JID/Entity
46
+ Parameters:
47
+ (Function) handler_cb - The callback function used to handle the request.
48
+ (String) jid - optional - The name of the entity to request the vCard
49
+ If no jid is given, this function retrieves the current user's vcard.
50
+ */
51
+
52
+ get: function(handler_cb, jid, error_cb) {
53
+ var iq;
54
+ iq = buildIq("get", jid);
55
+ return this._connection.sendIQ(iq, handler_cb, error_cb);
56
+ },
57
+ /* Function
58
+ Set an entity's vCard.
59
+ */
60
+
61
+ set: function(handler_cb, vCardEl, jid, error_cb) {
62
+ var iq;
63
+ iq = buildIq("set", jid, vCardEl);
64
+ return this._connection.sendIQ(iq, handler_cb, error_rb);
65
+ }
66
+ });
File without changes