cerberus 0.6 → 0.7

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 (290) hide show
  1. data/Authors.txt +4 -0
  2. data/Changelog.txt +11 -0
  3. data/Copyright.txt +16 -0
  4. data/Rakefile +16 -25
  5. data/Readme.markdown +1 -3
  6. data/bin/cerberus +5 -0
  7. data/lib/cerberus/builder/bjam.rb +1 -3
  8. data/lib/cerberus/builder/maven2.rb +0 -1
  9. data/lib/cerberus/builder/rake.rb +1 -1
  10. data/lib/cerberus/builder/rspec.rb +0 -1
  11. data/lib/cerberus/builder/ruby_base.rb +0 -1
  12. data/lib/cerberus/component_lazy_loader.rb +6 -2
  13. data/lib/cerberus/config.example.yml +1 -0
  14. data/lib/cerberus/constants.rb +2 -2
  15. data/lib/cerberus/manager.rb +7 -1
  16. data/lib/cerberus/publisher/mail.rb +4 -4
  17. data/lib/cerberus/publisher/twitter.rb +0 -1
  18. data/lib/cerberus/scm/base.rb +19 -0
  19. data/lib/cerberus/scm/bzr.rb +62 -0
  20. data/lib/cerberus/scm/cvs.rb +2 -7
  21. data/lib/cerberus/scm/darcs.rb +2 -11
  22. data/lib/cerberus/scm/git.rb +6 -14
  23. data/lib/cerberus/scm/perforce.rb +4 -4
  24. data/lib/cerberus/scm/svn.rb +2 -7
  25. data/lib/cerberus/utils.rb +5 -0
  26. data/lib/vendor/irc/README +23 -0
  27. data/lib/vendor/irc/lib/IRC.rb +164 -0
  28. data/lib/vendor/irc/lib/IRCChannel.rb +33 -0
  29. data/lib/vendor/irc/lib/IRCConnection.rb +134 -0
  30. data/lib/vendor/irc/lib/IRCEvent.rb +91 -0
  31. data/lib/vendor/irc/lib/IRCUser.rb +23 -0
  32. data/lib/vendor/irc/lib/IRCUtil.rb +49 -0
  33. data/lib/vendor/irc/lib/eventmap.yml +247 -0
  34. data/lib/vendor/twitter/CHANGES +129 -0
  35. data/lib/vendor/twitter/MIT-LICENSE +20 -0
  36. data/lib/vendor/twitter/README +37 -0
  37. data/lib/vendor/twitter/TODO +7 -0
  38. data/lib/vendor/twitter/lib/twitter.rb +34 -0
  39. data/lib/vendor/twitter/lib/twitter/client.rb +24 -0
  40. data/lib/vendor/twitter/lib/twitter/client/account.rb +24 -0
  41. data/lib/vendor/twitter/lib/twitter/client/auth.rb +27 -0
  42. data/lib/vendor/twitter/lib/twitter/client/base.rb +93 -0
  43. data/lib/vendor/twitter/lib/twitter/client/blocks.rb +35 -0
  44. data/lib/vendor/twitter/lib/twitter/client/favorites.rb +53 -0
  45. data/lib/vendor/twitter/lib/twitter/client/friendship.rb +35 -0
  46. data/lib/vendor/twitter/lib/twitter/client/graph.rb +37 -0
  47. data/lib/vendor/twitter/lib/twitter/client/messaging.rb +79 -0
  48. data/lib/vendor/twitter/lib/twitter/client/profile.rb +29 -0
  49. data/lib/vendor/twitter/lib/twitter/client/search.rb +27 -0
  50. data/lib/vendor/twitter/lib/twitter/client/status.rb +51 -0
  51. data/lib/vendor/twitter/lib/twitter/client/timeline.rb +72 -0
  52. data/lib/vendor/twitter/lib/twitter/client/user.rb +65 -0
  53. data/lib/vendor/twitter/lib/twitter/config.rb +77 -0
  54. data/lib/vendor/twitter/lib/twitter/console.rb +31 -0
  55. data/lib/vendor/twitter/lib/twitter/core.rb +137 -0
  56. data/lib/vendor/twitter/lib/twitter/ext.rb +2 -0
  57. data/lib/vendor/twitter/lib/twitter/ext/stdlib.rb +52 -0
  58. data/lib/vendor/twitter/lib/twitter/extras.rb +39 -0
  59. data/lib/vendor/twitter/lib/twitter/meta.rb +56 -0
  60. data/lib/vendor/twitter/lib/twitter/model.rb +360 -0
  61. data/lib/vendor/twitter/lib/twitter/version.rb +19 -0
  62. data/lib/vendor/twitter/spec/twitter/client/account_spec.rb +28 -0
  63. data/lib/vendor/twitter/spec/twitter/client/auth_spec.rb +34 -0
  64. data/lib/vendor/twitter/spec/twitter/client/base_spec.rb +242 -0
  65. data/lib/vendor/twitter/spec/twitter/client/blocks_spec.rb +76 -0
  66. data/lib/vendor/twitter/spec/twitter/client/favorites_spec.rb +183 -0
  67. data/lib/vendor/twitter/spec/twitter/client/friendship_spec.rb +76 -0
  68. data/lib/vendor/twitter/spec/twitter/client/graph_spec.rb +67 -0
  69. data/lib/vendor/twitter/spec/twitter/client/messaging_spec.rb +135 -0
  70. data/lib/vendor/twitter/spec/twitter/client/profile_spec.rb +91 -0
  71. data/lib/vendor/twitter/spec/twitter/client/search_spec.rb +68 -0
  72. data/lib/vendor/twitter/spec/twitter/client/status_spec.rb +119 -0
  73. data/lib/vendor/twitter/spec/twitter/client/timeline_spec.rb +79 -0
  74. data/lib/vendor/twitter/spec/twitter/client/user_spec.rb +203 -0
  75. data/lib/vendor/twitter/spec/twitter/client_spec.rb +2 -0
  76. data/lib/vendor/twitter/spec/twitter/config_spec.rb +86 -0
  77. data/lib/vendor/twitter/spec/twitter/console_spec.rb +15 -0
  78. data/lib/vendor/twitter/spec/twitter/core_spec.rb +127 -0
  79. data/lib/vendor/twitter/spec/twitter/ext/stdlib_spec.rb +59 -0
  80. data/lib/vendor/twitter/spec/twitter/extras_spec.rb +46 -0
  81. data/lib/vendor/twitter/spec/twitter/meta_spec.rb +90 -0
  82. data/lib/vendor/twitter/spec/twitter/model_spec.rb +508 -0
  83. data/lib/vendor/twitter/spec/twitter/version_spec.rb +19 -0
  84. data/lib/vendor/xmpp4r/CHANGELOG +83 -0
  85. data/lib/vendor/xmpp4r/COPYING +340 -0
  86. data/lib/vendor/xmpp4r/LICENSE +59 -0
  87. data/lib/vendor/xmpp4r/README.rdoc +110 -0
  88. data/lib/vendor/xmpp4r/README_ruby19.txt +43 -0
  89. data/lib/vendor/xmpp4r/Rakefile +262 -0
  90. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/README +56 -0
  91. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
  92. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
  93. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
  94. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
  95. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/world.rb +424 -0
  96. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
  97. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -0
  98. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
  99. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
  100. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/migrate.rb +88 -0
  101. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
  102. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
  103. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
  104. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
  105. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
  106. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
  107. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
  108. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
  109. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
  110. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
  111. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/versionpoll.rb +90 -0
  112. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
  113. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
  114. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
  115. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/client.rb +70 -0
  116. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/component.rb +11 -0
  117. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
  118. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
  119. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
  120. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
  121. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
  122. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
  123. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/register.rb +42 -0
  124. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
  125. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
  126. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
  127. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
  128. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
  129. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
  130. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
  131. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
  132. data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
  133. data/lib/vendor/xmpp4r/lib/xmpp4r.rb +116 -0
  134. data/lib/vendor/xmpp4r/lib/xmpp4r/base64.rb +32 -0
  135. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams.rb +15 -0
  136. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
  137. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
  138. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
  139. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/target.rb +47 -0
  140. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
  141. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
  142. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
  143. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
  144. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +73 -0
  145. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb.orig +62 -0
  146. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
  147. data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
  148. data/lib/vendor/xmpp4r/lib/xmpp4r/callbacks.rb +124 -0
  149. data/lib/vendor/xmpp4r/lib/xmpp4r/caps.rb +1 -0
  150. data/lib/vendor/xmpp4r/lib/xmpp4r/caps/c.rb +53 -0
  151. data/lib/vendor/xmpp4r/lib/xmpp4r/caps/helper/generator.rb +160 -0
  152. data/lib/vendor/xmpp4r/lib/xmpp4r/caps/helper/helper.rb +87 -0
  153. data/lib/vendor/xmpp4r/lib/xmpp4r/client.rb +317 -0
  154. data/lib/vendor/xmpp4r/lib/xmpp4r/command/helper/responder.rb +53 -0
  155. data/lib/vendor/xmpp4r/lib/xmpp4r/command/iq/command.rb +154 -0
  156. data/lib/vendor/xmpp4r/lib/xmpp4r/component.rb +103 -0
  157. data/lib/vendor/xmpp4r/lib/xmpp4r/connection.rb +219 -0
  158. data/lib/vendor/xmpp4r/lib/xmpp4r/dataforms.rb +5 -0
  159. data/lib/vendor/xmpp4r/lib/xmpp4r/dataforms/x/data.rb +297 -0
  160. data/lib/vendor/xmpp4r/lib/xmpp4r/debuglog.rb +42 -0
  161. data/lib/vendor/xmpp4r/lib/xmpp4r/delay.rb +5 -0
  162. data/lib/vendor/xmpp4r/lib/xmpp4r/delay/x/delay.rb +99 -0
  163. data/lib/vendor/xmpp4r/lib/xmpp4r/discovery.rb +7 -0
  164. data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/helper/responder.rb +165 -0
  165. data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
  166. data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
  167. data/lib/vendor/xmpp4r/lib/xmpp4r/errors.rb +281 -0
  168. data/lib/vendor/xmpp4r/lib/xmpp4r/feature_negotiation.rb +5 -0
  169. data/lib/vendor/xmpp4r/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
  170. data/lib/vendor/xmpp4r/lib/xmpp4r/framework/base.rb +55 -0
  171. data/lib/vendor/xmpp4r/lib/xmpp4r/framework/bot.rb +148 -0
  172. data/lib/vendor/xmpp4r/lib/xmpp4r/httpbinding.rb +5 -0
  173. data/lib/vendor/xmpp4r/lib/xmpp4r/httpbinding/client.rb +285 -0
  174. data/lib/vendor/xmpp4r/lib/xmpp4r/idgenerator.rb +37 -0
  175. data/lib/vendor/xmpp4r/lib/xmpp4r/iq.rb +221 -0
  176. data/lib/vendor/xmpp4r/lib/xmpp4r/jid.rb +167 -0
  177. data/lib/vendor/xmpp4r/lib/xmpp4r/message.rb +148 -0
  178. data/lib/vendor/xmpp4r/lib/xmpp4r/muc.rb +14 -0
  179. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
  180. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
  181. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
  182. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
  183. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
  184. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
  185. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/item.rb +143 -0
  186. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/muc.rb +70 -0
  187. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
  188. data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
  189. data/lib/vendor/xmpp4r/lib/xmpp4r/presence.rb +232 -0
  190. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub.rb +8 -0
  191. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
  192. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/event.rb +49 -0
  193. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/item.rb +35 -0
  194. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/items.rb +44 -0
  195. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
  196. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/publish.rb +24 -0
  197. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
  198. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
  199. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
  200. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/nodebrowser.rb +130 -0
  201. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
  202. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/servicehelper.rb +417 -0
  203. data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
  204. data/lib/vendor/xmpp4r/lib/xmpp4r/query.rb +15 -0
  205. data/lib/vendor/xmpp4r/lib/xmpp4r/rexmladdons.rb +151 -0
  206. data/lib/vendor/xmpp4r/lib/xmpp4r/roster.rb +7 -0
  207. data/lib/vendor/xmpp4r/lib/xmpp4r/roster/helper/roster.rb +519 -0
  208. data/lib/vendor/xmpp4r/lib/xmpp4r/roster/iq/roster.rb +215 -0
  209. data/lib/vendor/xmpp4r/lib/xmpp4r/roster/x/roster.rb +138 -0
  210. data/lib/vendor/xmpp4r/lib/xmpp4r/rpc.rb +2 -0
  211. data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/client.rb +123 -0
  212. data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/server.rb +74 -0
  213. data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
  214. data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
  215. data/lib/vendor/xmpp4r/lib/xmpp4r/sasl.rb +237 -0
  216. data/lib/vendor/xmpp4r/lib/xmpp4r/semaphore.rb +38 -0
  217. data/lib/vendor/xmpp4r/lib/xmpp4r/stream.rb +497 -0
  218. data/lib/vendor/xmpp4r/lib/xmpp4r/streamparser.rb +77 -0
  219. data/lib/vendor/xmpp4r/lib/xmpp4r/tune.rb +2 -0
  220. data/lib/vendor/xmpp4r/lib/xmpp4r/tune/helper/helper.rb +58 -0
  221. data/lib/vendor/xmpp4r/lib/xmpp4r/tune/tune.rb +113 -0
  222. data/lib/vendor/xmpp4r/lib/xmpp4r/vcard.rb +6 -0
  223. data/lib/vendor/xmpp4r/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
  224. data/lib/vendor/xmpp4r/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
  225. data/lib/vendor/xmpp4r/lib/xmpp4r/version.rb +7 -0
  226. data/lib/vendor/xmpp4r/lib/xmpp4r/version/helper/responder.rb +72 -0
  227. data/lib/vendor/xmpp4r/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  228. data/lib/vendor/xmpp4r/lib/xmpp4r/version/iq/version.rb +105 -0
  229. data/lib/vendor/xmpp4r/lib/xmpp4r/x.rb +37 -0
  230. data/lib/vendor/xmpp4r/lib/xmpp4r/xhtml.rb +1 -0
  231. data/lib/vendor/xmpp4r/lib/xmpp4r/xhtml/html.rb +115 -0
  232. data/lib/vendor/xmpp4r/lib/xmpp4r/xmpp4r.rb +18 -0
  233. data/lib/vendor/xmpp4r/lib/xmpp4r/xmppelement.rb +168 -0
  234. data/lib/vendor/xmpp4r/lib/xmpp4r/xmppstanza.rb +162 -0
  235. data/lib/vendor/xmpp4r/setup.rb +1586 -0
  236. data/lib/vendor/xmpp4r/test/bytestreams/tc_ibb.rb +186 -0
  237. data/lib/vendor/xmpp4r/test/bytestreams/tc_socks5bytestreams.rb +113 -0
  238. data/lib/vendor/xmpp4r/test/caps/tc_helper.rb +156 -0
  239. data/lib/vendor/xmpp4r/test/dataforms/tc_data.rb +81 -0
  240. data/lib/vendor/xmpp4r/test/delay/tc_xdelay.rb +51 -0
  241. data/lib/vendor/xmpp4r/test/discovery/tc_responder.rb +91 -0
  242. data/lib/vendor/xmpp4r/test/lib/assert_equal_xml.rb +14 -0
  243. data/lib/vendor/xmpp4r/test/lib/clienttester.rb +120 -0
  244. data/lib/vendor/xmpp4r/test/muc/tc_muc_mucclient.rb +830 -0
  245. data/lib/vendor/xmpp4r/test/muc/tc_muc_simplemucclient.rb +114 -0
  246. data/lib/vendor/xmpp4r/test/muc/tc_mucowner.rb +50 -0
  247. data/lib/vendor/xmpp4r/test/pubsub/tc_helper.rb +662 -0
  248. data/lib/vendor/xmpp4r/test/pubsub/tc_nodeconfig.rb +54 -0
  249. data/lib/vendor/xmpp4r/test/pubsub/tc_subscriptionconfig.rb +41 -0
  250. data/lib/vendor/xmpp4r/test/roster/tc_helper.rb +514 -0
  251. data/lib/vendor/xmpp4r/test/roster/tc_iqqueryroster.rb +173 -0
  252. data/lib/vendor/xmpp4r/test/roster/tc_xroster.rb +73 -0
  253. data/lib/vendor/xmpp4r/test/rpc/tc_helper.rb +96 -0
  254. data/lib/vendor/xmpp4r/test/tc_callbacks.rb +129 -0
  255. data/lib/vendor/xmpp4r/test/tc_class_names.rb +146 -0
  256. data/lib/vendor/xmpp4r/test/tc_client.rb +30 -0
  257. data/lib/vendor/xmpp4r/test/tc_errors.rb +146 -0
  258. data/lib/vendor/xmpp4r/test/tc_idgenerator.rb +30 -0
  259. data/lib/vendor/xmpp4r/test/tc_iq.rb +113 -0
  260. data/lib/vendor/xmpp4r/test/tc_iqquery.rb +31 -0
  261. data/lib/vendor/xmpp4r/test/tc_jid.rb +204 -0
  262. data/lib/vendor/xmpp4r/test/tc_message.rb +116 -0
  263. data/lib/vendor/xmpp4r/test/tc_presence.rb +150 -0
  264. data/lib/vendor/xmpp4r/test/tc_rexml.rb +139 -0
  265. data/lib/vendor/xmpp4r/test/tc_stream.rb +229 -0
  266. data/lib/vendor/xmpp4r/test/tc_streamComponent.rb +95 -0
  267. data/lib/vendor/xmpp4r/test/tc_streamError.rb +131 -0
  268. data/lib/vendor/xmpp4r/test/tc_streamSend.rb +59 -0
  269. data/lib/vendor/xmpp4r/test/tc_streamparser.rb +112 -0
  270. data/lib/vendor/xmpp4r/test/tc_xmppstanza.rb +135 -0
  271. data/lib/vendor/xmpp4r/test/ts_xmpp4r.rb +53 -0
  272. data/lib/vendor/xmpp4r/test/tune/tc_helper_recv.rb +84 -0
  273. data/lib/vendor/xmpp4r/test/tune/tc_helper_send.rb +74 -0
  274. data/lib/vendor/xmpp4r/test/tune/tc_tune.rb +79 -0
  275. data/lib/vendor/xmpp4r/test/vcard/tc_helper.rb +49 -0
  276. data/lib/vendor/xmpp4r/test/vcard/tc_iqvcard.rb +62 -0
  277. data/lib/vendor/xmpp4r/test/version/tc_helper.rb +60 -0
  278. data/lib/vendor/xmpp4r/test/version/tc_iqqueryversion.rb +97 -0
  279. data/lib/vendor/xmpp4r/test/xhtml/tc_html.rb +41 -0
  280. data/lib/vendor/xmpp4r/tools/gen_requires.bash +31 -0
  281. data/lib/vendor/xmpp4r/tools/xmpp4r-gemspec-test.rb +11 -0
  282. data/lib/vendor/xmpp4r/xmpp4r.gemspec +291 -0
  283. data/test/jabber_publisher_test.rb +1 -1
  284. data/test/mail_publisher_test.rb +2 -2
  285. data/test/mock/twitter.rb +0 -1
  286. data/test/rspec_builder_test.rb +39 -2
  287. data/test/rss_publisher_test.rb +1 -1
  288. data/test/twitter_publisher_test.rb +1 -1
  289. metadata +268 -53
  290. data/lib/cerberus/publisher/gmailer.rb +0 -17
@@ -0,0 +1 @@
1
+ require 'xmpp4r/caps/helper/helper'
@@ -0,0 +1,53 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r/xmppelement'
6
+
7
+ module Jabber
8
+ module Caps
9
+ NS_CAPS='http://jabber.org/protocol/caps'
10
+
11
+ ##
12
+ # The <c/> XMPP element, used to advertise entity capabilities.
13
+ #
14
+ # See http://www.xmpp.org/extensions/xep-0115.html#protocol.
15
+ #
16
+ # You should not need to construct this element directly, see
17
+ # Jabber::Caps::Helper.
18
+ class C < XMPPElement
19
+ name_xmlns 'c', NS_CAPS
20
+ force_xmlns true
21
+
22
+ def initialize(node = nil, ver = nil)
23
+ super()
24
+ add_attribute('node', node) if node
25
+ if ver
26
+ add_attribute('ver', ver)
27
+ add_attribute('hash', 'sha-1')
28
+ end
29
+ end
30
+
31
+ ##
32
+ # Get the value of this element's 'ver' attribute,
33
+ # an opaque hash representing this entity's capabilities.
34
+ def ver
35
+ attributes['ver']
36
+ end
37
+
38
+ ##
39
+ # Get the value of this element's 'node' attribute,
40
+ # a 'unique identifier for the software underlying the entity'
41
+ def node
42
+ attributes['node']
43
+ end
44
+
45
+ ##
46
+ # Get the value of this element's 'hash' attribute,
47
+ # the algorithm used in generating the 'ver' attribute
48
+ def hash
49
+ attributes['hash']
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,160 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r'
6
+ require 'xmpp4r/discovery'
7
+ require 'xmpp4r/dataforms'
8
+ require 'xmpp4r/caps/c'
9
+ require 'digest'
10
+ require 'xmpp4r/base64'
11
+
12
+ module Jabber
13
+ module Caps
14
+ def self.generate_ver_str(identities, features, forms=[])
15
+ # 1. Initialize an empty string S.
16
+ s = ''
17
+
18
+ # 2. Sort the service discovery identities [14] by category and
19
+ # then by type (if it exists) and then by xml:lang (if it
20
+ # exists), formatted as CATEGORY '/' [TYPE] '/' [LANG] '/'
21
+ # [NAME]. Note that each slash is included even if the TYPE,
22
+ # LANG, or NAME is not included.
23
+ identities.sort! do |identity1,identity2|
24
+ cmp_result = nil
25
+ [:category, :type, :xml_lang, :iname].each do |field|
26
+ value1 = identity1.send(field)
27
+ value2 = identity2.send(field)
28
+
29
+ if value1 != value2
30
+ cmp_result = value1 <=> value2
31
+ break
32
+ end
33
+ end
34
+
35
+
36
+ cmp_result
37
+ end
38
+
39
+ # 3. For each identity, append the 'category/type/lang/name' to
40
+ # S, followed by the '<' character.
41
+ s += identities.collect do |identity|
42
+ [:category, :type, :xml_lang, :iname].collect do |field|
43
+ identity.send(field).to_s
44
+ end.join('/') + '<'
45
+ end.join
46
+
47
+ # 4. Sort the supported service discovery features. [15]
48
+ features.sort! do |feature1,feature2|
49
+ feature1.var <=> feature2.var
50
+ end
51
+
52
+ # 5. For each feature, append the feature to S, followed by the
53
+ # '<' character.
54
+ s += features.collect do |feature|
55
+ feature.var.to_s + '<'
56
+ end.join
57
+
58
+ # 6. If the service discovery information response includes
59
+ # XEP-0128 data forms, sort the forms by the FORM_TYPE (i.e., by
60
+ # the XML character data of the <value/> element).
61
+ forms.sort! do |form1,form2|
62
+ fform_type1 = form1.field('FORM_TYPE')
63
+ fform_type2 = form2.field('FORM_TYPE')
64
+ form_type1 = fform_type1 ? fform_type1.values.to_s : nil
65
+ form_type2 = fform_type2 ? fform_type2.values.to_s : nil
66
+ form_type1 <=> form_type2
67
+ end
68
+
69
+ # 7. For each extended service discovery information form:
70
+ forms.each do |form|
71
+ # 7.1. Append the XML character data of the FORM_TYPE field's
72
+ # <value/> element, followed by the '<' character.
73
+ fform_type = form.field('FORM_TYPE')
74
+ form_type = fform_type ? fform_type.values.to_s : nil
75
+ s += "#{form_type}<"
76
+
77
+ # 7.2. Sort the fields by the value of the "var" attribute.
78
+ fields = form.fields(false).sort do |field1,field2|
79
+ field1.var <=> field2.var
80
+ end
81
+
82
+ # 7.3. For each field:
83
+
84
+ fields.each do |field|
85
+ # 7.3.1. Append the value of the "var" attribute, followed by
86
+ # the '<' character.
87
+ s += "#{field.var}<"
88
+
89
+ # 7.3.2. Sort values by the XML character data of the <value/>
90
+ # element.
91
+ values = field.values.sort do |value1,value2|
92
+ value1 <=> value2
93
+ end
94
+
95
+ # 7.3.3. For each <value/> element, append the XML character
96
+ # data, followed by the '<' character.
97
+ s += values.collect do |value|
98
+ "#{value}<"
99
+ end.join
100
+ end
101
+ end
102
+
103
+ # 8. Ensure that S is encoded according to the UTF-8 encoding
104
+ # (RFC 3269 [16]).
105
+
106
+ # (given in XMPP4R)
107
+
108
+ s
109
+ end
110
+
111
+ ##
112
+ # Implementation of the algorithm defined at:
113
+ # http://www.xmpp.org/extensions/xep-0115.html#ver-gen
114
+ def self.generate_ver(identities, features, forms=[], hash='sha-1')
115
+ s = generate_ver_str(identities, features, forms)
116
+
117
+ # 9. Compute the verification string by hashing S using the
118
+ # algorithm specified in the 'hash' attribute (e.g., SHA-1 as
119
+ # defined in RFC 3174 [17]). The hashed data MUST be generated
120
+ # with binary output and encoded using Base64 as specified in
121
+ # Section 4 of RFC 4648 [18] (note: the Base64 output MUST NOT
122
+ # include whitespace and MUST set padding bits to zero). [19]
123
+
124
+ # See http://www.iana.org/assignments/hash-function-text-names
125
+ hash_klass = case hash
126
+ when 'md2' then nil
127
+ when 'md5' then Digest::MD5
128
+ when 'sha-1' then Digest::SHA1
129
+ when 'sha-224' then nil
130
+ when 'sha-256' then Digest::SHA256
131
+ when 'sha-384' then Digest::SHA384
132
+ when 'sha-512' then Digest::SHA512
133
+ end
134
+ if hash_klass
135
+ Base64::encode64(hash_klass::digest(s)).strip
136
+ else
137
+ nil
138
+ end
139
+ end
140
+
141
+ ##
142
+ # Generate a ver hash from a Jabber::Discovery::IqQueryDiscoInfo result
143
+ # query:: [Jabber::Discovery::IqQueryDiscoInfo]
144
+ def self.generate_ver_from_discoinfo(query, hash='sha-1')
145
+ identities = []
146
+ features = []
147
+ forms = []
148
+ query.each_element do |element|
149
+ if element.kind_of? Discovery::Identity
150
+ identities << element
151
+ elsif element.kind_of? Discovery::Feature
152
+ features << element
153
+ elsif element.kind_of? Dataforms::XData
154
+ forms << element
155
+ end
156
+ end
157
+ generate_ver(identities, features, forms, hash)
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,87 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r'
6
+ require 'xmpp4r/discovery'
7
+ require 'xmpp4r/caps/c'
8
+ require 'xmpp4r/caps/helper/generator'
9
+
10
+ module Jabber
11
+ module Caps
12
+ ##
13
+ # A Helper to manage advertising and discovery of entity capabilities.
14
+ #
15
+ # Following XEP-0115 (ver 1.4 http://www.xmpp.org/extensions/xep-0115.html).
16
+ # you can use this Helper to, for example, advertise that your client
17
+ # wishes to receive XEP-0118 User Tune notifications, eg:
18
+ #
19
+ # caps_helper=Jabber::Caps::Helper(cl,
20
+ # [Jabber::Discovery::Identity.new('client',nil,'bot')],
21
+ # [Jabber::Discovery::Feature.new('http://jabber.org/protocol/tune+notify')]
22
+ # )
23
+ class Helper
24
+ attr_accessor :identities, :features, :node
25
+
26
+ ##
27
+ # Construct a new Caps Helper.
28
+ #
29
+ # This will send a <presence> message containing
30
+ # a <c/> (Jabber::Caps::C) stanza to your server.
31
+ # client:: [Jabber::Stream]
32
+ # i:: [Array] of [Jabber::Discovery::Identity] objects that this entity will advertise
33
+ # f:: [Array] of [Jabber::Discovery::Feature] objects that this entity will advertise
34
+ # n:: [String] an identifier representing the software underlying this entity
35
+ def initialize(client,i=[],f=[],n="http://home.gna.org/xmpp4r/##{Jabber::XMPP4R_VERSION}")
36
+ @stream = client
37
+ @identities = i
38
+ @features = f
39
+ @node = n
40
+
41
+ @stream.add_iq_callback(250) do |iq|
42
+ if iq.type == :get and iq.query.kind_of? Jabber::Discovery::IqQueryDiscoInfo
43
+ Thread.new do
44
+ Thread.abort_on_exception = true
45
+ handle_discoinfo_query(iq)
46
+ end
47
+ true
48
+ else
49
+ false
50
+ end
51
+ end
52
+
53
+ p = Jabber::Presence.new()
54
+ p.add(c)
55
+ @stream.send(p)
56
+ end
57
+
58
+ ##
59
+ # Return a <c/> element for inclusion in your own <presence>
60
+ # stanzas.
61
+ def c
62
+ Jabber::Caps::C.new(node, ver)
63
+ end
64
+
65
+ ##
66
+ # Send actual identities/ features back to a requesting entity
67
+ def handle_discoinfo_query(iq)
68
+ caps_reply = Jabber::XMPPStanza.answer(iq)
69
+ caps_reply.type = :result
70
+ caps_reply.query = Jabber::Discovery::IqQueryDiscoInfo.new
71
+ @identities.each { |i| caps_reply.query.add(i) }
72
+ @features.each { |f| caps_reply.query.add(f) }
73
+
74
+ @stream.send(caps_reply)
75
+ end
76
+
77
+ ##
78
+ # Generate 'ver', an opaque hash used to represent this entity's
79
+ # capabilities
80
+ #
81
+ # See http://www.xmpp.org/extensions/xep-0115.html#ver
82
+ def ver
83
+ Caps::generate_ver(@identities, @features)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,317 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'resolv'
6
+ require 'xmpp4r/connection'
7
+ require 'xmpp4r/sasl'
8
+
9
+ module Jabber
10
+
11
+ # The client class provides everything needed to build a basic XMPP
12
+ # Client.
13
+ #
14
+ # If you want your connection to survive disconnects and timeouts,
15
+ # catch exception in Stream#on_exception and re-call Client#connect
16
+ # and Client#auth. Don't forget to re-send initial Presence and
17
+ # everything else you need to setup your session.
18
+ class Client < Connection
19
+
20
+ # The client's JID
21
+ attr_reader :jid
22
+
23
+ ##
24
+ # Create a new Client.
25
+ #
26
+ # Remember to *always* put a resource in your JID unless the server can do SASL.
27
+ def initialize(jid)
28
+ super()
29
+ @jid = (jid.kind_of?(JID) ? jid : JID.new(jid.to_s))
30
+ end
31
+
32
+ ##
33
+ # connect to the server
34
+ # (chaining-friendly)
35
+ #
36
+ # If you omit the optional host argument SRV records for your jid will
37
+ # be resolved. If none works, fallback is connecting to the domain part
38
+ # of the jid.
39
+ # host:: [String] Optional c2s host, will be extracted from jid if nil
40
+ # use_ssl:: [Boolean] Optional. Use (old, deprecated) SSL when connecting.
41
+ # return:: self
42
+ def connect(host = nil, port = 5222)
43
+ if host.nil?
44
+ begin
45
+ srv = []
46
+ Resolv::DNS.open { |dns|
47
+ # If ruby version is too old and SRV is unknown, this will raise a NameError
48
+ # which is caught below
49
+ Jabber::debuglog("RESOLVING:\n_xmpp-client._tcp.#{@jid.domain} (SRV)")
50
+ srv = dns.getresources("_xmpp-client._tcp.#{@jid.domain}", Resolv::DNS::Resource::IN::SRV)
51
+ }
52
+ # Sort SRV records: lowest priority first, highest weight first
53
+ srv.sort! { |a,b| (a.priority != b.priority) ? (a.priority <=> b.priority) : (b.weight <=> a.weight) }
54
+
55
+ srv.each { |record|
56
+ begin
57
+ connect(record.target.to_s, record.port)
58
+ # Success
59
+ return self
60
+ rescue SocketError, Errno::ECONNREFUSED
61
+ # Try next SRV record
62
+ end
63
+ }
64
+ rescue NameError
65
+ Jabber::debuglog "Resolv::DNS does not support SRV records. Please upgrade to ruby-1.8.3 or later!"
66
+ end
67
+ # Fallback to normal connect method
68
+ end
69
+
70
+ super(host.nil? ? jid.domain : host, port)
71
+ self
72
+ end
73
+
74
+ ##
75
+ # Close the connection,
76
+ # sends <tt></stream:stream></tt> tag first
77
+ def close
78
+ send("</stream:stream>")
79
+ super
80
+ end
81
+
82
+ ##
83
+ # Start the stream-parser and send the client-specific stream opening element
84
+ def start
85
+ super
86
+ send(generate_stream_start(@jid.domain)) { |e|
87
+ if e.name == 'stream'
88
+ true
89
+ else
90
+ false
91
+ end
92
+ }
93
+ end
94
+
95
+ ##
96
+ # Authenticate with the server
97
+ #
98
+ # Throws ClientAuthenticationFailure
99
+ #
100
+ # Authentication mechanisms are used in the following preference:
101
+ # * SASL DIGEST-MD5
102
+ # * SASL PLAIN
103
+ # * Non-SASL digest
104
+ # password:: [String]
105
+ def auth(password)
106
+ begin
107
+ if @stream_mechanisms.include? 'DIGEST-MD5'
108
+ auth_sasl SASL.new(self, 'DIGEST-MD5'), password
109
+ elsif @stream_mechanisms.include? 'PLAIN'
110
+ auth_sasl SASL.new(self, 'PLAIN'), password
111
+ else
112
+ auth_nonsasl(password)
113
+ end
114
+ rescue
115
+ Jabber::debuglog("#{$!.class}: #{$!}\n#{$!.backtrace.join("\n")}")
116
+ raise ClientAuthenticationFailure.new, $!.to_s
117
+ end
118
+ end
119
+
120
+ ##
121
+ # Use a SASL authentication mechanism and bind to a resource
122
+ #
123
+ # If there was no resource given in the jid, the jid/resource
124
+ # generated by the server will be accepted.
125
+ #
126
+ # This method should not be used directly. Instead, Client#auth
127
+ # may look for the best mechanism suitable.
128
+ # sasl:: Descendant of [Jabber::SASL::Base]
129
+ # password:: [String]
130
+ def auth_sasl(sasl, password)
131
+ sasl.auth(password)
132
+
133
+ # Restart stream after SASL auth
134
+ stop
135
+ start
136
+ # And wait for features - again
137
+ @features_sem.wait
138
+
139
+ # Resource binding (RFC3920 - 7)
140
+ if @stream_features.has_key? 'bind'
141
+ iq = Iq.new(:set)
142
+ bind = iq.add REXML::Element.new('bind')
143
+ bind.add_namespace @stream_features['bind']
144
+ if jid.resource
145
+ resource = bind.add REXML::Element.new('resource')
146
+ resource.text = jid.resource
147
+ end
148
+
149
+ send_with_id(iq) do |reply|
150
+ reported_jid = reply.first_element('jid')
151
+ if reported_jid and reported_jid.text
152
+ @jid = JID.new(reported_jid.text)
153
+ end
154
+ end
155
+ end
156
+
157
+ # Session starting
158
+ if @stream_features.has_key? 'session'
159
+ iq = Iq.new(:set)
160
+ session = iq.add REXML::Element.new('session')
161
+ session.add_namespace @stream_features['session']
162
+
163
+ send_with_id(iq)
164
+ end
165
+ end
166
+
167
+ ##
168
+ # See Client#auth_anonymous_sasl
169
+ def auth_anonymous
170
+ auth_anonymous_sasl
171
+ end
172
+
173
+
174
+ ##
175
+ # Shortcut for anonymous connection to server
176
+ #
177
+ # Throws ClientAuthenticationFailure
178
+ def auth_anonymous_sasl
179
+ if self.supports_anonymous?
180
+ begin
181
+ auth_sasl SASL.new(self, 'ANONYMOUS'), ""
182
+ rescue
183
+ Jabber::debuglog("#{$!.class}: #{$!}\n#{$!.backtrace.join("\n")}")
184
+ raise ClientAuthenticationFailure, $!.to_s
185
+ end
186
+ else
187
+ raise ClientAuthenticationFailure, 'Anonymous authentication unsupported'
188
+ end
189
+ end
190
+
191
+ ##
192
+ # Reports whether or not anonymous authentication is reported
193
+ # by the client.
194
+ #
195
+ # Returns true or false
196
+ def supports_anonymous?
197
+ @stream_mechanisms.include? 'ANONYMOUS'
198
+ end
199
+
200
+ ##
201
+ # Send auth with given password and wait for result
202
+ # (non-SASL)
203
+ #
204
+ # Throws ServerError
205
+ # password:: [String] the password
206
+ # digest:: [Boolean] use Digest authentication
207
+ def auth_nonsasl(password, digest=true)
208
+ authset = nil
209
+ if digest
210
+ authset = Iq.new_authset_digest(@jid, @streamid.to_s, password)
211
+ else
212
+ authset = Iq.new_authset(@jid, password)
213
+ end
214
+ send_with_id(authset)
215
+ $defout.flush
216
+
217
+ true
218
+ end
219
+
220
+ ##
221
+ # Get instructions and available fields for registration
222
+ # return:: [instructions, fields] Where instructions is a String and fields is an Array of Strings
223
+ def register_info
224
+ instructions = nil
225
+ fields = []
226
+
227
+ reg = Iq.new_registerget
228
+ reg.to = jid.domain
229
+ send_with_id(reg) do |answer|
230
+ if answer.query
231
+ answer.query.each_element { |e|
232
+ if e.namespace == 'jabber:iq:register'
233
+ if e.name == 'instructions'
234
+ instructions = e.text.strip
235
+ else
236
+ fields << e.name
237
+ end
238
+ end
239
+ }
240
+ end
241
+
242
+ true
243
+ end
244
+
245
+ [instructions, fields]
246
+ end
247
+
248
+ ##
249
+ # Register a new user account
250
+ # (may be used instead of Client#auth)
251
+ #
252
+ # This method may raise ServerError if the registration was
253
+ # not successful.
254
+ #
255
+ # password:: String
256
+ # fields:: {String=>String} additional registration information
257
+ #
258
+ # XEP-0077 Defines the following fields for registration information:
259
+ # http://www.xmpp.org/extensions/xep-0077.html
260
+ #
261
+ # 'username' => 'Account name associated with the user'
262
+ # 'nick' => 'Familiar name of the user'
263
+ # 'password' => 'Password or secret for the user'
264
+ # 'name' => 'Full name of the user'
265
+ # 'first' => 'First name or given name of the user'
266
+ # 'last' => 'Last name, surname, or family name of the user'
267
+ # 'email' => 'Email address of the user'
268
+ # 'address' => 'Street portion of a physical or mailing address'
269
+ # 'city' => 'Locality portion of a physical or mailing address'
270
+ # 'state' => 'Region portion of a physical or mailing address'
271
+ # 'zip' => 'Postal code portion of a physical or mailing address'
272
+ # 'phone' => 'Telephone number of the user'
273
+ # 'url' => 'URL to web page describing the user'
274
+ # 'date' => 'Some date (e.g., birth date, hire date, sign-up date)'
275
+ #
276
+ def register(password, fields={})
277
+ reg = Iq.new_register(jid.node, password)
278
+ reg.to = jid.domain
279
+ fields.each { |name,value|
280
+ reg.query.add(REXML::Element.new(name)).text = value
281
+ }
282
+
283
+ send_with_id(reg)
284
+ end
285
+
286
+ ##
287
+ # Remove the registration of a user account
288
+ #
289
+ # *WARNING:* this deletes your roster and everything else
290
+ # stored on the server!
291
+ def remove_registration
292
+ reg = Iq.new_register
293
+ reg.to = jid.domain
294
+ reg.query.add(REXML::Element.new('remove'))
295
+ send_with_id(reg)
296
+ end
297
+
298
+ ##
299
+ # Change the client's password
300
+ #
301
+ # Threading is suggested, as this code waits
302
+ # for an answer.
303
+ #
304
+ # Raises an exception upon error response (ServerError from
305
+ # Stream#send_with_id).
306
+ # new_password:: [String] New password
307
+ def password=(new_password)
308
+ iq = Iq.new_query(:set, @jid.domain)
309
+ iq.query.add_namespace('jabber:iq:register')
310
+ iq.query.add(REXML::Element.new('username')).text = @jid.node
311
+ iq.query.add(REXML::Element.new('password')).text = new_password
312
+
313
+ err = nil
314
+ send_with_id(iq)
315
+ end
316
+ end
317
+ end