mack-notifier 0.8.1 → 0.8.2

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 (288) hide show
  1. data/lib/gems.rb +13 -0
  2. data/lib/gems/tmail-1.2.3.1/ext/Makefile +20 -0
  3. data/lib/gems/tmail-1.2.3.1/ext/tmailscanner/tmail/MANIFEST +4 -0
  4. data/lib/gems/tmail-1.2.3.1/ext/tmailscanner/tmail/depend +1 -0
  5. data/lib/gems/tmail-1.2.3.1/ext/tmailscanner/tmail/extconf.rb +33 -0
  6. data/lib/gems/tmail-1.2.3.1/ext/tmailscanner/tmail/tmailscanner.c +583 -0
  7. data/lib/gems/tmail-1.2.3.1/lib/tmail.rb +5 -0
  8. data/lib/gems/tmail-1.2.3.1/lib/tmail/Makefile +18 -0
  9. data/lib/gems/tmail-1.2.3.1/lib/tmail/address.rb +426 -0
  10. data/lib/gems/tmail-1.2.3.1/lib/tmail/attachments.rb +46 -0
  11. data/lib/gems/tmail-1.2.3.1/lib/tmail/base64.rb +46 -0
  12. data/lib/gems/tmail-1.2.3.1/lib/tmail/compat.rb +41 -0
  13. data/lib/gems/tmail-1.2.3.1/lib/tmail/config.rb +67 -0
  14. data/lib/gems/tmail-1.2.3.1/lib/tmail/core_extensions.rb +63 -0
  15. data/lib/gems/tmail-1.2.3.1/lib/tmail/encode.rb +581 -0
  16. data/lib/gems/tmail-1.2.3.1/lib/tmail/header.rb +960 -0
  17. data/lib/gems/tmail-1.2.3.1/lib/tmail/index.rb +9 -0
  18. data/lib/gems/tmail-1.2.3.1/lib/tmail/interface.rb +1125 -0
  19. data/lib/gems/tmail-1.2.3.1/lib/tmail/loader.rb +3 -0
  20. data/lib/gems/tmail-1.2.3.1/lib/tmail/mail.rb +578 -0
  21. data/lib/gems/tmail-1.2.3.1/lib/tmail/mailbox.rb +495 -0
  22. data/lib/gems/tmail-1.2.3.1/lib/tmail/main.rb +6 -0
  23. data/lib/gems/tmail-1.2.3.1/lib/tmail/mbox.rb +3 -0
  24. data/lib/gems/tmail-1.2.3.1/lib/tmail/net.rb +248 -0
  25. data/lib/gems/tmail-1.2.3.1/lib/tmail/obsolete.rb +132 -0
  26. data/lib/gems/tmail-1.2.3.1/lib/tmail/parser.rb +1476 -0
  27. data/lib/gems/tmail-1.2.3.1/lib/tmail/parser.y +381 -0
  28. data/lib/gems/tmail-1.2.3.1/lib/tmail/port.rb +379 -0
  29. data/lib/gems/tmail-1.2.3.1/lib/tmail/quoting.rb +118 -0
  30. data/lib/gems/tmail-1.2.3.1/lib/tmail/require_arch.rb +58 -0
  31. data/lib/gems/tmail-1.2.3.1/lib/tmail/scanner.rb +49 -0
  32. data/lib/gems/tmail-1.2.3.1/lib/tmail/scanner_r.rb +261 -0
  33. data/lib/gems/tmail-1.2.3.1/lib/tmail/stringio.rb +280 -0
  34. data/lib/gems/tmail-1.2.3.1/lib/tmail/utils.rb +337 -0
  35. data/lib/gems/tmail-1.2.3.1/lib/tmail/version.rb +39 -0
  36. data/lib/gems/tmail-1.2.3.1/meta/MANIFEST +128 -0
  37. data/lib/gems/tmail-1.2.3.1/meta/VERSION +1 -0
  38. data/lib/gems/tmail-1.2.3.1/meta/project.yaml +30 -0
  39. data/lib/gems/tmail-1.2.3.1/meta/unixname +1 -0
  40. data/lib/gems/validatable-1.6.7/README +118 -0
  41. data/lib/gems/validatable-1.6.7/lib/child_validation.rb +15 -0
  42. data/lib/gems/validatable-1.6.7/lib/errors.rb +74 -0
  43. data/lib/gems/validatable-1.6.7/lib/included_validation.rb +9 -0
  44. data/lib/gems/validatable-1.6.7/lib/macros.rb +283 -0
  45. data/lib/gems/validatable-1.6.7/lib/object_extension.rb +21 -0
  46. data/lib/gems/validatable-1.6.7/lib/requireable.rb +26 -0
  47. data/lib/gems/validatable-1.6.7/lib/understandable.rb +31 -0
  48. data/lib/gems/validatable-1.6.7/lib/validatable.rb +19 -0
  49. data/lib/gems/validatable-1.6.7/lib/validatable_class_methods.rb +85 -0
  50. data/lib/gems/validatable-1.6.7/lib/validatable_instance_methods.rb +106 -0
  51. data/lib/gems/validatable-1.6.7/lib/validations/validates_acceptance_of.rb +11 -0
  52. data/lib/gems/validatable-1.6.7/lib/validations/validates_confirmation_of.rb +15 -0
  53. data/lib/gems/validatable-1.6.7/lib/validations/validates_each.rb +14 -0
  54. data/lib/gems/validatable-1.6.7/lib/validations/validates_format_of.rb +13 -0
  55. data/lib/gems/validatable-1.6.7/lib/validations/validates_length_of.rb +25 -0
  56. data/lib/gems/validatable-1.6.7/lib/validations/validates_numericality_of.rb +16 -0
  57. data/lib/gems/validatable-1.6.7/lib/validations/validates_presence_of.rb +13 -0
  58. data/lib/gems/validatable-1.6.7/lib/validations/validates_true_for.rb +13 -0
  59. data/lib/gems/validatable-1.6.7/lib/validations/validation_base.rb +88 -0
  60. data/lib/gems/validatable-1.6.7/rakefile.rb +50 -0
  61. data/lib/gems/validatable-1.6.7/test/all_tests.rb +1 -0
  62. data/lib/gems/validatable-1.6.7/test/functional/validatable_test.rb +437 -0
  63. data/lib/gems/validatable-1.6.7/test/functional/validates_acceptance_of_test.rb +16 -0
  64. data/lib/gems/validatable-1.6.7/test/functional/validates_confirmation_of_test.rb +56 -0
  65. data/lib/gems/validatable-1.6.7/test/functional/validates_each_test.rb +14 -0
  66. data/lib/gems/validatable-1.6.7/test/functional/validates_format_of_test.rb +34 -0
  67. data/lib/gems/validatable-1.6.7/test/functional/validates_length_of_test.rb +64 -0
  68. data/lib/gems/validatable-1.6.7/test/functional/validates_numericality_of_test.rb +57 -0
  69. data/lib/gems/validatable-1.6.7/test/functional/validates_presence_of_test.rb +16 -0
  70. data/lib/gems/validatable-1.6.7/test/functional/validates_true_for_test.rb +27 -0
  71. data/lib/gems/validatable-1.6.7/test/test_helper.rb +33 -0
  72. data/lib/gems/validatable-1.6.7/test/unit/errors_test.rb +64 -0
  73. data/lib/gems/validatable-1.6.7/test/unit/understandable_test.rb +19 -0
  74. data/lib/gems/validatable-1.6.7/test/unit/validatable_test.rb +38 -0
  75. data/lib/gems/validatable-1.6.7/test/unit/validates_acceptance_of_test.rb +21 -0
  76. data/lib/gems/validatable-1.6.7/test/unit/validates_confirmation_of_test.rb +64 -0
  77. data/lib/gems/validatable-1.6.7/test/unit/validates_format_of_test.rb +34 -0
  78. data/lib/gems/validatable-1.6.7/test/unit/validates_length_of_test.rb +75 -0
  79. data/lib/gems/validatable-1.6.7/test/unit/validates_numericality_of_test.rb +52 -0
  80. data/lib/gems/validatable-1.6.7/test/unit/validates_presence_of_test.rb +25 -0
  81. data/lib/gems/validatable-1.6.7/test/unit/validates_true_for_test.rb +29 -0
  82. data/lib/gems/validatable-1.6.7/test/unit/validation_base_test.rb +52 -0
  83. data/lib/gems/xmpp4r-0.4/CHANGELOG +83 -0
  84. data/lib/gems/xmpp4r-0.4/COPYING +340 -0
  85. data/lib/gems/xmpp4r-0.4/LICENSE +59 -0
  86. data/lib/gems/xmpp4r-0.4/README.rdoc +110 -0
  87. data/lib/gems/xmpp4r-0.4/README_ruby19.txt +43 -0
  88. data/lib/gems/xmpp4r-0.4/Rakefile +262 -0
  89. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/README +56 -0
  90. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
  91. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
  92. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
  93. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
  94. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/world.rb +424 -0
  95. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
  96. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -0
  97. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
  98. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
  99. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/migrate.rb +88 -0
  100. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
  101. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
  102. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
  103. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
  104. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
  105. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
  106. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
  107. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
  108. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
  109. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
  110. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/versionpoll.rb +90 -0
  111. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
  112. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
  113. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
  114. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/client.rb +70 -0
  115. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/component.rb +11 -0
  116. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
  117. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
  118. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
  119. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
  120. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
  121. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
  122. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/register.rb +42 -0
  123. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
  124. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
  125. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
  126. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
  127. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
  128. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
  129. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
  130. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
  131. data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
  132. data/lib/gems/xmpp4r-0.4/lib/xmpp4r.rb +116 -0
  133. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/base64.rb +32 -0
  134. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams.rb +15 -0
  135. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
  136. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
  137. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
  138. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/ibb/target.rb +47 -0
  139. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
  140. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
  141. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
  142. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
  143. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +73 -0
  144. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb.orig +62 -0
  145. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
  146. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
  147. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/callbacks.rb +124 -0
  148. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/caps.rb +1 -0
  149. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/caps/c.rb +53 -0
  150. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/caps/helper/generator.rb +160 -0
  151. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/caps/helper/helper.rb +87 -0
  152. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/client.rb +317 -0
  153. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/command/helper/responder.rb +53 -0
  154. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/command/iq/command.rb +154 -0
  155. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/component.rb +103 -0
  156. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/connection.rb +219 -0
  157. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/dataforms.rb +5 -0
  158. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/dataforms/x/data.rb +297 -0
  159. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/debuglog.rb +42 -0
  160. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/delay.rb +5 -0
  161. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/delay/x/delay.rb +99 -0
  162. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/discovery.rb +7 -0
  163. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/discovery/helper/responder.rb +165 -0
  164. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
  165. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
  166. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/errors.rb +281 -0
  167. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/feature_negotiation.rb +5 -0
  168. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
  169. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/framework/base.rb +55 -0
  170. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/framework/bot.rb +148 -0
  171. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/httpbinding.rb +5 -0
  172. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/httpbinding/client.rb +285 -0
  173. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/idgenerator.rb +37 -0
  174. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/iq.rb +221 -0
  175. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/jid.rb +167 -0
  176. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/message.rb +148 -0
  177. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc.rb +14 -0
  178. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
  179. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
  180. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
  181. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
  182. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
  183. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
  184. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/item.rb +143 -0
  185. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/x/muc.rb +70 -0
  186. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
  187. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
  188. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/presence.rb +232 -0
  189. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub.rb +8 -0
  190. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
  191. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/event.rb +49 -0
  192. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/item.rb +35 -0
  193. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/items.rb +44 -0
  194. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
  195. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/publish.rb +24 -0
  196. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
  197. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
  198. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
  199. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/helper/nodebrowser.rb +130 -0
  200. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
  201. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/helper/servicehelper.rb +417 -0
  202. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
  203. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/query.rb +15 -0
  204. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rexmladdons.rb +151 -0
  205. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/roster.rb +7 -0
  206. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/roster/helper/roster.rb +519 -0
  207. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/roster/iq/roster.rb +215 -0
  208. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/roster/x/roster.rb +138 -0
  209. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc.rb +2 -0
  210. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc/helper/client.rb +123 -0
  211. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc/helper/server.rb +74 -0
  212. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
  213. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
  214. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/sasl.rb +237 -0
  215. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/semaphore.rb +38 -0
  216. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/stream.rb +497 -0
  217. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/streamparser.rb +77 -0
  218. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/tune.rb +2 -0
  219. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/tune/helper/helper.rb +58 -0
  220. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/tune/tune.rb +113 -0
  221. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/vcard.rb +6 -0
  222. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
  223. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
  224. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/version.rb +7 -0
  225. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/version/helper/responder.rb +72 -0
  226. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  227. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/version/iq/version.rb +105 -0
  228. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/x.rb +37 -0
  229. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xhtml.rb +1 -0
  230. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xhtml/html.rb +115 -0
  231. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xmpp4r.rb +18 -0
  232. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xmppelement.rb +168 -0
  233. data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xmppstanza.rb +162 -0
  234. data/lib/gems/xmpp4r-0.4/setup.rb +1586 -0
  235. data/lib/gems/xmpp4r-0.4/test/bytestreams/tc_ibb.rb +186 -0
  236. data/lib/gems/xmpp4r-0.4/test/bytestreams/tc_socks5bytestreams.rb +113 -0
  237. data/lib/gems/xmpp4r-0.4/test/caps/tc_helper.rb +156 -0
  238. data/lib/gems/xmpp4r-0.4/test/dataforms/tc_data.rb +81 -0
  239. data/lib/gems/xmpp4r-0.4/test/delay/tc_xdelay.rb +51 -0
  240. data/lib/gems/xmpp4r-0.4/test/discovery/tc_responder.rb +91 -0
  241. data/lib/gems/xmpp4r-0.4/test/lib/assert_equal_xml.rb +14 -0
  242. data/lib/gems/xmpp4r-0.4/test/lib/clienttester.rb +120 -0
  243. data/lib/gems/xmpp4r-0.4/test/muc/tc_muc_mucclient.rb +830 -0
  244. data/lib/gems/xmpp4r-0.4/test/muc/tc_muc_simplemucclient.rb +114 -0
  245. data/lib/gems/xmpp4r-0.4/test/muc/tc_mucowner.rb +50 -0
  246. data/lib/gems/xmpp4r-0.4/test/pubsub/tc_helper.rb +662 -0
  247. data/lib/gems/xmpp4r-0.4/test/pubsub/tc_nodeconfig.rb +54 -0
  248. data/lib/gems/xmpp4r-0.4/test/pubsub/tc_subscriptionconfig.rb +41 -0
  249. data/lib/gems/xmpp4r-0.4/test/roster/tc_helper.rb +514 -0
  250. data/lib/gems/xmpp4r-0.4/test/roster/tc_iqqueryroster.rb +173 -0
  251. data/lib/gems/xmpp4r-0.4/test/roster/tc_xroster.rb +73 -0
  252. data/lib/gems/xmpp4r-0.4/test/rpc/tc_helper.rb +96 -0
  253. data/lib/gems/xmpp4r-0.4/test/tc_callbacks.rb +129 -0
  254. data/lib/gems/xmpp4r-0.4/test/tc_class_names.rb +146 -0
  255. data/lib/gems/xmpp4r-0.4/test/tc_client.rb +30 -0
  256. data/lib/gems/xmpp4r-0.4/test/tc_errors.rb +146 -0
  257. data/lib/gems/xmpp4r-0.4/test/tc_idgenerator.rb +30 -0
  258. data/lib/gems/xmpp4r-0.4/test/tc_iq.rb +113 -0
  259. data/lib/gems/xmpp4r-0.4/test/tc_iqquery.rb +31 -0
  260. data/lib/gems/xmpp4r-0.4/test/tc_jid.rb +204 -0
  261. data/lib/gems/xmpp4r-0.4/test/tc_message.rb +116 -0
  262. data/lib/gems/xmpp4r-0.4/test/tc_presence.rb +150 -0
  263. data/lib/gems/xmpp4r-0.4/test/tc_rexml.rb +139 -0
  264. data/lib/gems/xmpp4r-0.4/test/tc_stream.rb +229 -0
  265. data/lib/gems/xmpp4r-0.4/test/tc_streamComponent.rb +95 -0
  266. data/lib/gems/xmpp4r-0.4/test/tc_streamError.rb +131 -0
  267. data/lib/gems/xmpp4r-0.4/test/tc_streamSend.rb +59 -0
  268. data/lib/gems/xmpp4r-0.4/test/tc_streamparser.rb +112 -0
  269. data/lib/gems/xmpp4r-0.4/test/tc_xmppstanza.rb +135 -0
  270. data/lib/gems/xmpp4r-0.4/test/ts_xmpp4r.rb +53 -0
  271. data/lib/gems/xmpp4r-0.4/test/tune/tc_helper_recv.rb +84 -0
  272. data/lib/gems/xmpp4r-0.4/test/tune/tc_helper_send.rb +74 -0
  273. data/lib/gems/xmpp4r-0.4/test/tune/tc_tune.rb +79 -0
  274. data/lib/gems/xmpp4r-0.4/test/vcard/tc_helper.rb +49 -0
  275. data/lib/gems/xmpp4r-0.4/test/vcard/tc_iqvcard.rb +62 -0
  276. data/lib/gems/xmpp4r-0.4/test/version/tc_helper.rb +60 -0
  277. data/lib/gems/xmpp4r-0.4/test/version/tc_iqqueryversion.rb +97 -0
  278. data/lib/gems/xmpp4r-0.4/test/xhtml/tc_html.rb +41 -0
  279. data/lib/gems/xmpp4r-0.4/tools/gen_requires.bash +31 -0
  280. data/lib/gems/xmpp4r-0.4/tools/xmpp4r-gemspec-test.rb +11 -0
  281. data/lib/gems/xmpp4r-0.4/xmpp4r.gemspec +291 -0
  282. data/lib/gems/xmpp4r-simple-0.8.8/CHANGELOG +73 -0
  283. data/lib/gems/xmpp4r-simple-0.8.8/COPYING +281 -0
  284. data/lib/gems/xmpp4r-simple-0.8.8/README +59 -0
  285. data/lib/gems/xmpp4r-simple-0.8.8/lib/xmpp4r-simple.rb +492 -0
  286. data/lib/gems/xmpp4r-simple-0.8.8/test/test_xmpp4r_simple.rb +242 -0
  287. data/lib/mack-notifier.rb +1 -3
  288. metadata +398 -46
@@ -0,0 +1,124 @@
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
+ module Jabber
6
+ ##
7
+ # This class manages a list of callbacks.
8
+ #
9
+ # ==Callbacks management and priority
10
+ #
11
+ # Callbacks are managed by the class CallbackList. When they are added, a
12
+ # priority (just a number or anything Comparable with other priorities) is
13
+ # specified. The biggest the priority is, the earliest the callback will be
14
+ # considered.
15
+ #
16
+ # Callbacks are processed for a given set of objects as long as they return
17
+ # false. If you want to stop processing, you must return true. Example :
18
+ # cbl = CallbackList.new
19
+ # c1 = false
20
+ # c2 = false
21
+ # c3 = false
22
+ # cbl.add(10) { c1 = true; 1 }
23
+ # cbl.add(5) { c2 = true; true }
24
+ # cbl.add(0) { c3 = true }
25
+ # cbl.process('aa')
26
+ # puts "#{c1} #{c2} #{c3}"
27
+ # This example would display "true true false" as callbacks processing was
28
+ # stopped after the second callback returned true.
29
+ #
30
+ # In XMPP4R, callbacks' priorities are quite normalized since we want to be
31
+ # able to "cascade" callbacks in a clean way. Here are values your code should
32
+ # take into account :
33
+ #
34
+ # >= 200:: logging & debugging callbacks. Those callbacks should not consume
35
+ # elements.
36
+ # 100-199:: Where Helpers register their callbacks. The normal value is 100,
37
+ # and Helpers shouldn't register something else unless there's a
38
+ # very good reason to.
39
+ # < 100:: all those numbers are normally available for your application.
40
+ # That's enough, don't you think ?
41
+ class CallbackList
42
+
43
+ # Create a new list of callbacks
44
+ def initialize
45
+ @list = []
46
+ end
47
+
48
+ ##
49
+ # Add a callback to the list
50
+ #
51
+ # List will be sorted afterwards
52
+ #
53
+ # prio:: [Integer] the callback's priority, the higher, the sooner.
54
+ # ref:: [String] the callback's reference
55
+ # block:: [Block] a block to execute
56
+ # return:: [Jabber::CallbackList] The list, for chaining
57
+ def add(prio = 0, ref = nil, proc = nil, &block)
58
+ block = proc if proc
59
+ @list.push(Callback.new(prio, ref, block))
60
+ @list.sort! { |a, b| b.priority <=> a.priority }
61
+ self
62
+ end
63
+
64
+ ##
65
+ # Delete a callback by reference
66
+ # ref:: [String] the reference of the callback to delete
67
+ # return:: [CallBackList] The list, for chaining
68
+ def delete(ref)
69
+ @list.delete_if { |item| item.ref == ref }
70
+ self
71
+ end
72
+
73
+ ##
74
+ # Number of elements in the list
75
+ # return:: [Integer] The number of elements
76
+ def length
77
+ @list.length
78
+ end
79
+
80
+ ##
81
+ # Process an element through all my callbacks. returns e.consumed?
82
+ # e:: [Object] The elements to pass to the callback. You can pass
83
+ # several, but of course, you block must know how to handle them.
84
+ # return:: [Boolean] true if the element has been consumed
85
+ def process(*e)
86
+ # If somebody adds a new callback the list will get modified
87
+ # and sorted(!) while still iterating through it. So we use a
88
+ # local copy of @list. Any freshly added callback will receive
89
+ # the next stanzas, not the current.
90
+ list = @list.dup
91
+
92
+ # process through callbacks
93
+ list.each do |item|
94
+ return true if item.block.call(*e) == true
95
+ end
96
+ false
97
+ end
98
+ end
99
+
100
+ # This class is used to store callbacks inside CallbackList. See the
101
+ # CallbackList class for more detailed explanations.
102
+ class Callback
103
+
104
+ # The Callback's priority
105
+ attr_reader :priority
106
+
107
+ # The Callback's reference, using for deleting purposes
108
+ attr_reader :ref
109
+
110
+ # The Callback's block to execute
111
+ attr_reader :block
112
+
113
+ ##
114
+ # Create a new callback
115
+ # priority:: [Integer] the callback's priority. The higher, the sooner it
116
+ # will be executed
117
+ # ref:: [String] The callback's reference
118
+ def initialize(priority = 0, ref = nil, block = Proc.new {})
119
+ @priority = priority
120
+ @ref = ref
121
+ @block = block
122
+ end
123
+ end
124
+ end
@@ -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