xmppify 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
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,304 @@
1
+ ###
2
+ This program is distributed under the terms of the MIT license.
3
+ Copyright 2012 - 2013 (c) Markus Kohlhase <mail@markus-kohlhase.de>
4
+ ###
5
+
6
+ JOAP_NS = "jabber:iq:joap"
7
+ RPC_NS = "jabber:iq:rpc"
8
+
9
+ # Private static members
10
+
11
+ conn = null
12
+
13
+ onError = (cb=->) -> (iq) ->
14
+ err = iq.getElementsByTagName("error")[0]
15
+ if err?
16
+ code = err.getAttribute("code") * 1
17
+ msg = err.textContent
18
+ msg = "JOAP server is unavailable" if code is 503
19
+ cb iq, new JOAPError msg, code
20
+ else
21
+ cb iq, new JOAPError "Unknown error"
22
+
23
+ addXMLAttributes = (iq, attrs) ->
24
+ return if not attrs?
25
+ if attrs instanceof Array
26
+ return console?.warn? "No attributes added: attribute parameter is not an object"
27
+ else if typeof attrs is "object"
28
+ for k,v of attrs
29
+ iq.c("attribute")
30
+ .c("name").t(k).up()
31
+ .cnode(conn.rpc._convertToXML v).up().up()
32
+
33
+ addRPCElements = (iq, method, params=[]) ->
34
+ throw new TypeError unless typeof method is "string"
35
+ iq.c("methodCall").c("methodName").t(method).up()
36
+ if not (params instanceof Array)
37
+ console?.warn? "No parameters added: parameter is not an array"
38
+ return
39
+ if params.length > 0
40
+ iq.c("params")
41
+ for p in params
42
+ iq.c("param")
43
+ .cnode(conn.rpc._convertToXML p).up().up()
44
+
45
+ parseAttributes = (iq) ->
46
+ attrs = iq.getElementsByTagName("attribute")
47
+ data = {}
48
+ for a in attrs
49
+ key = a.getElementsByTagName("name")[0].textContent
50
+ data[key] = conn.rpc._convertFromXML a.getElementsByTagName("value")[0]
51
+ data
52
+
53
+ parseRPCParams = (iq) ->
54
+ conn.rpc._convertFromXML iq
55
+ .getElementsByTagName("param")[0]
56
+ .getElementsByTagName("value")[0]
57
+
58
+ parseNewAddress = (iq) ->
59
+ address = new JID(iq.getElementsByTagName("newAddress")[0].textContent).toString()
60
+
61
+ parseSearch = (iq) ->
62
+ items = iq.getElementsByTagName("item")
63
+ (new JID(i.textContent).toString() for i in items)
64
+
65
+ parseAttributeDescription = (d) ->
66
+ name: d.getElementsByTagName("name")[0]?.textContent
67
+ type: d.getElementsByTagName("type")[0]?.textContent
68
+ desc: parseDesc d.getElementsByTagName("desc")
69
+
70
+ parseMethodDescription = (d) ->
71
+ name: d.getElementsByTagName("name")[0]?.textContent
72
+ returnType: d.getElementsByTagName("returnType")[0]?.textContent
73
+ desc: parseDesc d.getElementsByTagName("desc")
74
+
75
+ parseDesc = (desc) ->
76
+ res = {}
77
+ if desc instanceof NodeList
78
+ for c in desc
79
+ res[c.getAttribute "xml:lang"] = c.textContent
80
+ else
81
+ res.desc[desc.getAttribute "xml:lang"] = desc.textContent
82
+ res
83
+
84
+ parseDescription = (iq) ->
85
+ result = desc: {}, attributes: {}, methods: {}, classes: []
86
+ describe = iq.getElementsByTagName("describe")[0]
87
+ for c in describe.childNodes
88
+ switch c.tagName.toLowerCase()
89
+ when "desc"
90
+ result.desc[c.getAttribute "xml:lang"] = c.textContent
91
+ when "attributedescription"
92
+ ad = parseAttributeDescription c
93
+ result.attributes[ad.name] = ad
94
+ when "methoddescription"
95
+ md = parseMethodDescription c
96
+ result.methods[md.name] = md
97
+ when "superclass"
98
+ result.superclass = new JID(c.textContent).toString()
99
+ when "timestamp"
100
+ result.timestamp = c.textContent
101
+ when "class"
102
+ classes.push = c.textContent
103
+ result
104
+
105
+ getAddress = (clazz, service, instance) ->
106
+ (new JID clazz, service, instance).toString()
107
+
108
+ createIq = (type, to) ->
109
+ iqType = if (type in ["read", "search", "describe"]) then "get" else "set"
110
+ xmlns = if type is "query" then RPC_NS else JOAP_NS
111
+ $iq(to: to, type: iqType)
112
+ .c(type, xmlns: xmlns)
113
+
114
+ sendRequest = (type, to, cb, opt={}) ->
115
+ iq = createIq type, to
116
+ opt.beforeSend? iq
117
+ success = (res) -> cb? res, null, opt.onResult?(res)
118
+ conn.sendIQ iq, success, onError(cb)
119
+
120
+ describe = (id, cb) ->
121
+ sendRequest "describe", id, cb,
122
+ onResult: parseDescription
123
+
124
+ read = (instance, limits, cb) ->
125
+ if typeof limits is "function"
126
+ cb = limits; limits = null
127
+ sendRequest "read", instance, cb,
128
+ beforeSend: (iq) -> if limits instanceof Array
129
+ iq.c("name").t(l).up() for l in limits
130
+ onResult: parseAttributes
131
+
132
+ add = (clazz, attrs, cb) ->
133
+ cb = attrs if typeof attrs is "function"
134
+ sendRequest "add", clazz, cb,
135
+ beforeSend: (iq) -> addXMLAttributes iq, attrs
136
+ onResult: parseNewAddress
137
+
138
+ edit = (instance, attrs, cb) ->
139
+ sendRequest "edit", instance, cb,
140
+ beforeSend: (iq) -> addXMLAttributes iq, attrs
141
+ onResult: parseAttributes
142
+
143
+ search = (clazz, attrs, cb) ->
144
+ if typeof attrs is "function"
145
+ cb = attrs; attrs=null
146
+ sendRequest "search", clazz, cb,
147
+ beforeSend: (iq) -> addXMLAttributes iq, attrs
148
+ onResult: parseSearch
149
+
150
+ searchAndRead = (clazz, attrs, limits, cb) ->
151
+ if typeof limits is "function"
152
+ cb = limits; limits = null
153
+ if typeof attrs is "function" and not limits?
154
+ cb = attrs; attrs = null
155
+ else if attrs instanceof Array and not limits?
156
+ limits = attrs; attrs = null
157
+ search clazz, attrs, (iq, err, res) ->
158
+ if err?
159
+ cb err
160
+ else
161
+ objects = []
162
+ count = res.length
163
+ if count > 0
164
+ readCB = (iq, err, o) ->
165
+ if err?
166
+ cb err
167
+ else
168
+ count--
169
+ objects.push o
170
+ cb null, objects if count is 0
171
+ for id in res then do (id) -> read id, limits, readCB
172
+ else
173
+ cb null, objects
174
+
175
+ del = (instance, cb) ->
176
+ sendRequest "delete", instance, cb
177
+
178
+ methodCall = (method, address, params, cb) ->
179
+ sendRequest "query", address, cb,
180
+ beforeSend: (iq) -> addRPCElements iq, method, params
181
+ onResult: parseRPCParams
182
+
183
+ class JOAPError extends Error
184
+
185
+ constructor: (@message, @code)->
186
+ @name = "JOAPError"
187
+
188
+ class JOAPServer
189
+
190
+ constructor: (service) ->
191
+ @jid = new JID service
192
+
193
+ describe: (clazz, instance, cb) ->
194
+ if typeof clazz is "function"
195
+ cb = clazz; clazz = instance = null
196
+ else if typeof instance is "function"
197
+ cb = instance; instance = null
198
+ describe getAddress(clazz, @jid.domain, instance), cb
199
+
200
+ add: (clazz, attrs, cb) ->
201
+ add getAddress(clazz, @jid.domain), attrs, cb
202
+
203
+ read: (clazz, instance, limits, cb) ->
204
+ read getAddress(clazz, @jid.domain, instance), limits, cb
205
+
206
+ edit: (clazz, instance, attrs, cb) ->
207
+ edit getAddress(clazz, @jid.domain, instance), attrs, cb
208
+
209
+ delete: (clazz, instance, cb) ->
210
+ del getAddress(clazz, @jid.domain, instance), cb
211
+
212
+ search: (clazz, attrs, cb) ->
213
+ search getAddress(clazz, @jid.domain), attrs, cb
214
+
215
+ searchAndRead: (clazz, attrs, limits, cb) ->
216
+ searchAndRead getAddress(clazz, @jid.domain), attrs, limits, cb
217
+
218
+ methodCall: (method, clazz, instance, params, cb) ->
219
+ if typeof clazz is "function"
220
+ cb = clazz; clazz = instance = params = null
221
+ else if typeof instance is "function"
222
+ cb = instance; instance = params = null
223
+ else if typeof params is "function"
224
+ cb = params; params = null
225
+ methodCall method, getAddress(clazz, @jid.domain, instance), params, cb
226
+
227
+ class JOAPObject
228
+
229
+ constructor: (id) ->
230
+ @jid = new JID id
231
+
232
+ read: (limits, cb) -> read @jid.toString(), limits, cb
233
+
234
+ edit: (attrs, cb) -> edit @jid.toString(), attrs, cb
235
+
236
+ describe: (cb) -> describe @jid.toString(), cb
237
+
238
+ methodCall: (method, params, cb) ->
239
+ if typeof params is "function"
240
+ cb = params; params = null
241
+ methodCall method, @jid.toString(), params, cb
242
+
243
+ class JOAPClass
244
+
245
+ constructor: (id) ->
246
+ @jid = new JID id
247
+
248
+ describe: (instance, cb) ->
249
+ if typeof instance is "function"
250
+ cb = instance
251
+ instance = null
252
+ describe getAddress(@jid.user, @jid.domain, instance), cb
253
+
254
+ add: (attrs, cb) ->
255
+ add getAddress(@jid.user, @jid.domain), attrs, cb
256
+
257
+ read: (instance, limits, cb) ->
258
+ read getAddress(@jid.user, @jid.domain, instance), limits, cb
259
+
260
+ edit: (instance, attrs, cb) ->
261
+ edit getAddress(@jid.user, @jid.domain, instance), attrs, cb
262
+
263
+ delete: (instance, cb) ->
264
+ del getAddress(@jid.user, @jid.domain, instance), cb
265
+
266
+ search: (attrs, cb) ->
267
+ search getAddress(@jid.user, @jid.domain), attrs, cb
268
+
269
+ searchAndRead: (attrs, limits, cb) ->
270
+ searchAndRead getAddress(@jid.user, @jid.domain), attrs, limits, cb
271
+
272
+ methodCall: (method, instance, params, cb) ->
273
+ if typeof instance is "function"
274
+ cb = instance; instance = params = null
275
+ else if typeof params is "function"
276
+ cb = params; params = null
277
+ methodCall method, getAddress(@jid.user, @jid.domain, instance), params, cb
278
+
279
+ Strophe.addConnectionPlugin 'joap', do ->
280
+
281
+ init = (c) ->
282
+ conn = c
283
+ Strophe.addNamespace "JOAP", JOAP_NS
284
+
285
+ if not conn.hasOwnProperty "disco"
286
+ Strophe.warn "You need the discovery plugin to have JOAP fully implemented."
287
+ else
288
+ conn.disco.addIdentity "automation", "joap"
289
+ conn.disco.addFeature Strophe.NS.JOAP
290
+
291
+ # public API
292
+ init: init
293
+ describe: describe
294
+ add: add
295
+ read: read
296
+ edit: edit
297
+ delete: del
298
+ search: search
299
+ searchAndRead: searchAndRead
300
+ methodCall: methodCall
301
+ JOAPError: JOAPError
302
+ JOAPServer: JOAPServer
303
+ JOAPObject: JOAPObject
304
+ JOAPClass: JOAPClass