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.
- data/lib/gems.rb +13 -0
- data/lib/gems/tmail-1.2.3.1/ext/Makefile +20 -0
- data/lib/gems/tmail-1.2.3.1/ext/tmailscanner/tmail/MANIFEST +4 -0
- data/lib/gems/tmail-1.2.3.1/ext/tmailscanner/tmail/depend +1 -0
- data/lib/gems/tmail-1.2.3.1/ext/tmailscanner/tmail/extconf.rb +33 -0
- data/lib/gems/tmail-1.2.3.1/ext/tmailscanner/tmail/tmailscanner.c +583 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail.rb +5 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/Makefile +18 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/address.rb +426 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/attachments.rb +46 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/base64.rb +46 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/compat.rb +41 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/config.rb +67 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/core_extensions.rb +63 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/encode.rb +581 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/header.rb +960 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/index.rb +9 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/interface.rb +1125 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/loader.rb +3 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/mail.rb +578 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/mailbox.rb +495 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/main.rb +6 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/mbox.rb +3 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/net.rb +248 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/obsolete.rb +132 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/parser.rb +1476 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/parser.y +381 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/port.rb +379 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/quoting.rb +118 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/require_arch.rb +58 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/scanner.rb +49 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/scanner_r.rb +261 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/stringio.rb +280 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/utils.rb +337 -0
- data/lib/gems/tmail-1.2.3.1/lib/tmail/version.rb +39 -0
- data/lib/gems/tmail-1.2.3.1/meta/MANIFEST +128 -0
- data/lib/gems/tmail-1.2.3.1/meta/VERSION +1 -0
- data/lib/gems/tmail-1.2.3.1/meta/project.yaml +30 -0
- data/lib/gems/tmail-1.2.3.1/meta/unixname +1 -0
- data/lib/gems/validatable-1.6.7/README +118 -0
- data/lib/gems/validatable-1.6.7/lib/child_validation.rb +15 -0
- data/lib/gems/validatable-1.6.7/lib/errors.rb +74 -0
- data/lib/gems/validatable-1.6.7/lib/included_validation.rb +9 -0
- data/lib/gems/validatable-1.6.7/lib/macros.rb +283 -0
- data/lib/gems/validatable-1.6.7/lib/object_extension.rb +21 -0
- data/lib/gems/validatable-1.6.7/lib/requireable.rb +26 -0
- data/lib/gems/validatable-1.6.7/lib/understandable.rb +31 -0
- data/lib/gems/validatable-1.6.7/lib/validatable.rb +19 -0
- data/lib/gems/validatable-1.6.7/lib/validatable_class_methods.rb +85 -0
- data/lib/gems/validatable-1.6.7/lib/validatable_instance_methods.rb +106 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validates_acceptance_of.rb +11 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validates_confirmation_of.rb +15 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validates_each.rb +14 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validates_format_of.rb +13 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validates_length_of.rb +25 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validates_numericality_of.rb +16 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validates_presence_of.rb +13 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validates_true_for.rb +13 -0
- data/lib/gems/validatable-1.6.7/lib/validations/validation_base.rb +88 -0
- data/lib/gems/validatable-1.6.7/rakefile.rb +50 -0
- data/lib/gems/validatable-1.6.7/test/all_tests.rb +1 -0
- data/lib/gems/validatable-1.6.7/test/functional/validatable_test.rb +437 -0
- data/lib/gems/validatable-1.6.7/test/functional/validates_acceptance_of_test.rb +16 -0
- data/lib/gems/validatable-1.6.7/test/functional/validates_confirmation_of_test.rb +56 -0
- data/lib/gems/validatable-1.6.7/test/functional/validates_each_test.rb +14 -0
- data/lib/gems/validatable-1.6.7/test/functional/validates_format_of_test.rb +34 -0
- data/lib/gems/validatable-1.6.7/test/functional/validates_length_of_test.rb +64 -0
- data/lib/gems/validatable-1.6.7/test/functional/validates_numericality_of_test.rb +57 -0
- data/lib/gems/validatable-1.6.7/test/functional/validates_presence_of_test.rb +16 -0
- data/lib/gems/validatable-1.6.7/test/functional/validates_true_for_test.rb +27 -0
- data/lib/gems/validatable-1.6.7/test/test_helper.rb +33 -0
- data/lib/gems/validatable-1.6.7/test/unit/errors_test.rb +64 -0
- data/lib/gems/validatable-1.6.7/test/unit/understandable_test.rb +19 -0
- data/lib/gems/validatable-1.6.7/test/unit/validatable_test.rb +38 -0
- data/lib/gems/validatable-1.6.7/test/unit/validates_acceptance_of_test.rb +21 -0
- data/lib/gems/validatable-1.6.7/test/unit/validates_confirmation_of_test.rb +64 -0
- data/lib/gems/validatable-1.6.7/test/unit/validates_format_of_test.rb +34 -0
- data/lib/gems/validatable-1.6.7/test/unit/validates_length_of_test.rb +75 -0
- data/lib/gems/validatable-1.6.7/test/unit/validates_numericality_of_test.rb +52 -0
- data/lib/gems/validatable-1.6.7/test/unit/validates_presence_of_test.rb +25 -0
- data/lib/gems/validatable-1.6.7/test/unit/validates_true_for_test.rb +29 -0
- data/lib/gems/validatable-1.6.7/test/unit/validation_base_test.rb +52 -0
- data/lib/gems/xmpp4r-0.4/CHANGELOG +83 -0
- data/lib/gems/xmpp4r-0.4/COPYING +340 -0
- data/lib/gems/xmpp4r-0.4/LICENSE +59 -0
- data/lib/gems/xmpp4r-0.4/README.rdoc +110 -0
- data/lib/gems/xmpp4r-0.4/README_ruby19.txt +43 -0
- data/lib/gems/xmpp4r-0.4/Rakefile +262 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/README +56 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/adventure/world.rb +424 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/migrate.rb +88 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/versionpoll.rb +90 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/client.rb +70 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/component.rb +11 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/register.rb +42 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
- data/lib/gems/xmpp4r-0.4/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r.rb +116 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/base64.rb +32 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams.rb +15 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/ibb/target.rb +47 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +73 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb.orig +62 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/callbacks.rb +124 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/caps.rb +1 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/caps/c.rb +53 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/caps/helper/generator.rb +160 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/caps/helper/helper.rb +87 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/client.rb +317 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/command/helper/responder.rb +53 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/command/iq/command.rb +154 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/component.rb +103 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/connection.rb +219 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/dataforms.rb +5 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/dataforms/x/data.rb +297 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/debuglog.rb +42 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/delay.rb +5 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/delay/x/delay.rb +99 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/discovery.rb +7 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/discovery/helper/responder.rb +165 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/errors.rb +281 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/feature_negotiation.rb +5 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/framework/base.rb +55 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/framework/bot.rb +148 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/httpbinding.rb +5 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/httpbinding/client.rb +285 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/idgenerator.rb +37 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/iq.rb +221 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/jid.rb +167 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/message.rb +148 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc.rb +14 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/item.rb +143 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/x/muc.rb +70 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/presence.rb +232 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub.rb +8 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/event.rb +49 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/item.rb +35 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/items.rb +44 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/publish.rb +24 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/helper/nodebrowser.rb +130 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/helper/servicehelper.rb +417 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/query.rb +15 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rexmladdons.rb +151 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/roster.rb +7 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/roster/helper/roster.rb +519 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/roster/iq/roster.rb +215 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/roster/x/roster.rb +138 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc.rb +2 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc/helper/client.rb +123 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc/helper/server.rb +74 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/sasl.rb +237 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/semaphore.rb +38 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/stream.rb +497 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/streamparser.rb +77 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/tune.rb +2 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/tune/helper/helper.rb +58 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/tune/tune.rb +113 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/vcard.rb +6 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/version.rb +7 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/version/helper/responder.rb +72 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/version/iq/version.rb +105 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/x.rb +37 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xhtml.rb +1 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xhtml/html.rb +115 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xmpp4r.rb +18 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xmppelement.rb +168 -0
- data/lib/gems/xmpp4r-0.4/lib/xmpp4r/xmppstanza.rb +162 -0
- data/lib/gems/xmpp4r-0.4/setup.rb +1586 -0
- data/lib/gems/xmpp4r-0.4/test/bytestreams/tc_ibb.rb +186 -0
- data/lib/gems/xmpp4r-0.4/test/bytestreams/tc_socks5bytestreams.rb +113 -0
- data/lib/gems/xmpp4r-0.4/test/caps/tc_helper.rb +156 -0
- data/lib/gems/xmpp4r-0.4/test/dataforms/tc_data.rb +81 -0
- data/lib/gems/xmpp4r-0.4/test/delay/tc_xdelay.rb +51 -0
- data/lib/gems/xmpp4r-0.4/test/discovery/tc_responder.rb +91 -0
- data/lib/gems/xmpp4r-0.4/test/lib/assert_equal_xml.rb +14 -0
- data/lib/gems/xmpp4r-0.4/test/lib/clienttester.rb +120 -0
- data/lib/gems/xmpp4r-0.4/test/muc/tc_muc_mucclient.rb +830 -0
- data/lib/gems/xmpp4r-0.4/test/muc/tc_muc_simplemucclient.rb +114 -0
- data/lib/gems/xmpp4r-0.4/test/muc/tc_mucowner.rb +50 -0
- data/lib/gems/xmpp4r-0.4/test/pubsub/tc_helper.rb +662 -0
- data/lib/gems/xmpp4r-0.4/test/pubsub/tc_nodeconfig.rb +54 -0
- data/lib/gems/xmpp4r-0.4/test/pubsub/tc_subscriptionconfig.rb +41 -0
- data/lib/gems/xmpp4r-0.4/test/roster/tc_helper.rb +514 -0
- data/lib/gems/xmpp4r-0.4/test/roster/tc_iqqueryroster.rb +173 -0
- data/lib/gems/xmpp4r-0.4/test/roster/tc_xroster.rb +73 -0
- data/lib/gems/xmpp4r-0.4/test/rpc/tc_helper.rb +96 -0
- data/lib/gems/xmpp4r-0.4/test/tc_callbacks.rb +129 -0
- data/lib/gems/xmpp4r-0.4/test/tc_class_names.rb +146 -0
- data/lib/gems/xmpp4r-0.4/test/tc_client.rb +30 -0
- data/lib/gems/xmpp4r-0.4/test/tc_errors.rb +146 -0
- data/lib/gems/xmpp4r-0.4/test/tc_idgenerator.rb +30 -0
- data/lib/gems/xmpp4r-0.4/test/tc_iq.rb +113 -0
- data/lib/gems/xmpp4r-0.4/test/tc_iqquery.rb +31 -0
- data/lib/gems/xmpp4r-0.4/test/tc_jid.rb +204 -0
- data/lib/gems/xmpp4r-0.4/test/tc_message.rb +116 -0
- data/lib/gems/xmpp4r-0.4/test/tc_presence.rb +150 -0
- data/lib/gems/xmpp4r-0.4/test/tc_rexml.rb +139 -0
- data/lib/gems/xmpp4r-0.4/test/tc_stream.rb +229 -0
- data/lib/gems/xmpp4r-0.4/test/tc_streamComponent.rb +95 -0
- data/lib/gems/xmpp4r-0.4/test/tc_streamError.rb +131 -0
- data/lib/gems/xmpp4r-0.4/test/tc_streamSend.rb +59 -0
- data/lib/gems/xmpp4r-0.4/test/tc_streamparser.rb +112 -0
- data/lib/gems/xmpp4r-0.4/test/tc_xmppstanza.rb +135 -0
- data/lib/gems/xmpp4r-0.4/test/ts_xmpp4r.rb +53 -0
- data/lib/gems/xmpp4r-0.4/test/tune/tc_helper_recv.rb +84 -0
- data/lib/gems/xmpp4r-0.4/test/tune/tc_helper_send.rb +74 -0
- data/lib/gems/xmpp4r-0.4/test/tune/tc_tune.rb +79 -0
- data/lib/gems/xmpp4r-0.4/test/vcard/tc_helper.rb +49 -0
- data/lib/gems/xmpp4r-0.4/test/vcard/tc_iqvcard.rb +62 -0
- data/lib/gems/xmpp4r-0.4/test/version/tc_helper.rb +60 -0
- data/lib/gems/xmpp4r-0.4/test/version/tc_iqqueryversion.rb +97 -0
- data/lib/gems/xmpp4r-0.4/test/xhtml/tc_html.rb +41 -0
- data/lib/gems/xmpp4r-0.4/tools/gen_requires.bash +31 -0
- data/lib/gems/xmpp4r-0.4/tools/xmpp4r-gemspec-test.rb +11 -0
- data/lib/gems/xmpp4r-0.4/xmpp4r.gemspec +291 -0
- data/lib/gems/xmpp4r-simple-0.8.8/CHANGELOG +73 -0
- data/lib/gems/xmpp4r-simple-0.8.8/COPYING +281 -0
- data/lib/gems/xmpp4r-simple-0.8.8/README +59 -0
- data/lib/gems/xmpp4r-simple-0.8.8/lib/xmpp4r-simple.rb +492 -0
- data/lib/gems/xmpp4r-simple-0.8.8/test/test_xmpp4r_simple.rb +242 -0
- data/lib/mack-notifier.rb +1 -3
- metadata +398 -46
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
module Bytestreams
|
|
7
|
+
##
|
|
8
|
+
# Implementation of IBB at the initiator side
|
|
9
|
+
class IBBInitiator < IBB
|
|
10
|
+
# You may set the block-size before open
|
|
11
|
+
attr_accessor :block_size
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Open the stream to the peer,
|
|
15
|
+
# waits for successful result
|
|
16
|
+
#
|
|
17
|
+
# May throw ServerError
|
|
18
|
+
def open
|
|
19
|
+
iq = Iq.new(:set, @peer_jid)
|
|
20
|
+
open = iq.add REXML::Element.new('open')
|
|
21
|
+
open.add_namespace IBB::NS_IBB
|
|
22
|
+
open.attributes['sid'] = @session_id
|
|
23
|
+
open.attributes['block-size'] = @block_size.to_s
|
|
24
|
+
|
|
25
|
+
@stream.send_with_id(iq)
|
|
26
|
+
|
|
27
|
+
activate
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
module Bytestreams
|
|
7
|
+
##
|
|
8
|
+
# Implementation of IBB at the target side
|
|
9
|
+
class IBBTarget < IBB
|
|
10
|
+
# You may read the block-size after accept
|
|
11
|
+
attr_reader :block_size
|
|
12
|
+
|
|
13
|
+
def initialize(stream, session_id, initiator_jid, target_jid)
|
|
14
|
+
# Target and Initiator are swapped here, because we're the target
|
|
15
|
+
super(stream, session_id, target_jid, initiator_jid)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Wait for the initiator side to start
|
|
20
|
+
# the stream.
|
|
21
|
+
def accept
|
|
22
|
+
connect_sem = Semaphore.new
|
|
23
|
+
|
|
24
|
+
@stream.add_iq_callback(200, self) { |iq|
|
|
25
|
+
open = iq.first_element('open')
|
|
26
|
+
if iq.type == :set and iq.from == @peer_jid and iq.to == @my_jid and open and open.attributes['sid'] == @session_id
|
|
27
|
+
@stream.delete_iq_callback(self)
|
|
28
|
+
activate
|
|
29
|
+
@block_size = (open.attributes['block-size'] || 4096).to_i
|
|
30
|
+
|
|
31
|
+
reply = iq.answer(false)
|
|
32
|
+
reply.type = :result
|
|
33
|
+
@stream.send(reply)
|
|
34
|
+
|
|
35
|
+
connect_sem.run
|
|
36
|
+
true
|
|
37
|
+
else
|
|
38
|
+
false
|
|
39
|
+
end
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
connect_sem.wait
|
|
43
|
+
true
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,152 @@
|
|
|
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 'socket'
|
|
6
|
+
require 'thread'
|
|
7
|
+
require 'timeout'
|
|
8
|
+
require 'digest/sha1'
|
|
9
|
+
|
|
10
|
+
require 'xmpp4r/callbacks'
|
|
11
|
+
|
|
12
|
+
module Jabber
|
|
13
|
+
module Bytestreams
|
|
14
|
+
##
|
|
15
|
+
# SOCKS5 Bytestreams (JEP-0065) implementation
|
|
16
|
+
#
|
|
17
|
+
# Don't use directly, use SOCKS5BytestreamsInitiator
|
|
18
|
+
# and SOCKS5BytestreamsTarget
|
|
19
|
+
class SOCKS5Bytestreams
|
|
20
|
+
##
|
|
21
|
+
# [StreamHost] the SOCKS connection is using
|
|
22
|
+
attr_reader :streamhost_used
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
# SOCKS connection timeout (for trying multiple streamhosts)
|
|
26
|
+
#
|
|
27
|
+
# default: nil, use the OS' default timeout
|
|
28
|
+
attr_accessor :connect_timeout
|
|
29
|
+
|
|
30
|
+
def initialize(stream, session_id, initiator_jid, target_jid)
|
|
31
|
+
@stream = stream
|
|
32
|
+
@session_id = session_id
|
|
33
|
+
@initiator_jid = (initiator_jid.kind_of?(String) ? JID.new(initiator_jid) : initiator_jid)
|
|
34
|
+
@target_jid = (target_jid.kind_of?(String) ? JID.new(target_jid) : target_jid)
|
|
35
|
+
@socks = nil
|
|
36
|
+
@connect_timeout = nil
|
|
37
|
+
@streamhost_used = nil
|
|
38
|
+
@streamhost_cbs = CallbackList.new
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
##
|
|
42
|
+
# Add a callback that will be called when there is action regarding
|
|
43
|
+
# SOCKS stream-hosts
|
|
44
|
+
#
|
|
45
|
+
# Usage of this callback is optional and serves informational purposes only.
|
|
46
|
+
#
|
|
47
|
+
# block takes three arguments:
|
|
48
|
+
# * The StreamHost instance that is currently being tried
|
|
49
|
+
# * State information (is either :connecting, :authenticating, :success or :failure)
|
|
50
|
+
# * The exception value for the state :failure, else nil
|
|
51
|
+
def add_streamhost_callback(priority = 0, ref = nil, &block)
|
|
52
|
+
@streamhost_cbs.add(priority, ref, block)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
##
|
|
56
|
+
# Receive from the stream-host
|
|
57
|
+
# length:: [Fixnum] Amount of bytes (Will be passed to TCPSocket#read for the underlying SOCKS5 connection)
|
|
58
|
+
# result:: [String] (or [nil] if finished)
|
|
59
|
+
def read(length=nil)
|
|
60
|
+
@socks.read(length)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
##
|
|
64
|
+
# Flush the SOCKS5 socket
|
|
65
|
+
def flush
|
|
66
|
+
@socks.flush
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
##
|
|
70
|
+
# Send to the stream-host
|
|
71
|
+
# buf:: [String] Data
|
|
72
|
+
# result:: [Fixnum] Amount of bytes sent
|
|
73
|
+
def write(buf)
|
|
74
|
+
@socks.write(buf)
|
|
75
|
+
# FIXME: On FreeBSD this throws Errno::EPERM after it has already written a few
|
|
76
|
+
# kilobytes, and when there are multiple sockets. ktrace told, that this originates
|
|
77
|
+
# from the syscall, not ruby.
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
##
|
|
81
|
+
# Close the stream-host connection
|
|
82
|
+
def close
|
|
83
|
+
@socks.close
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
##
|
|
87
|
+
# Query a JID for its stream-host information
|
|
88
|
+
#
|
|
89
|
+
# SOCKS5BytestreamsInitiator#add_streamhost can do this for you.
|
|
90
|
+
# Use this method if you plan to do multiple transfers, so
|
|
91
|
+
# you can cache the result.
|
|
92
|
+
# stream:: [Stream] to operate on
|
|
93
|
+
# streamhost:: [JID] of the proxy
|
|
94
|
+
# my_jid:: [JID] Optional sender JID for Component operation
|
|
95
|
+
def self.query_streamhost(stream, streamhost, my_jid=nil)
|
|
96
|
+
res = nil
|
|
97
|
+
|
|
98
|
+
iq = Iq.new(:get, streamhost)
|
|
99
|
+
iq.from = my_jid
|
|
100
|
+
iq.add(IqQueryBytestreams.new)
|
|
101
|
+
stream.send_with_id(iq) { |reply|
|
|
102
|
+
reply.query.each_element { |e|
|
|
103
|
+
if e.kind_of?(StreamHost)
|
|
104
|
+
e.jid = reply.from # Help misconfigured proxys
|
|
105
|
+
res = e
|
|
106
|
+
end
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if res and res.jid and res.host and res.port
|
|
111
|
+
res
|
|
112
|
+
else
|
|
113
|
+
nil
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
private
|
|
118
|
+
|
|
119
|
+
##
|
|
120
|
+
# The address the stream-host expects from us.
|
|
121
|
+
# According to JEP-0096 this is the SHA1 hash
|
|
122
|
+
# of the concatenation of session_id,
|
|
123
|
+
# initiator_jid and target_jid.
|
|
124
|
+
# result:: [String] SHA1 hash
|
|
125
|
+
def stream_address
|
|
126
|
+
Digest::SHA1.hexdigest("#{@session_id}#{@initiator_jid}#{@target_jid}")
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
##
|
|
130
|
+
# Try a streamhost
|
|
131
|
+
# result:: [SOCKS5Socket]
|
|
132
|
+
def connect_socks(streamhost)
|
|
133
|
+
Timeout::timeout(@connect_timeout, Errno::ETIMEDOUT) {
|
|
134
|
+
Jabber::debuglog("SOCKS5 Bytestreams: connecting to proxy #{streamhost.jid} (#{streamhost.host}:#{streamhost.port})")
|
|
135
|
+
@streamhost_cbs.process(streamhost, :connecting, nil)
|
|
136
|
+
socks = SOCKS5Socket.new(streamhost.host, streamhost.port)
|
|
137
|
+
|
|
138
|
+
Jabber::debuglog("SOCKS5 Bytestreams: connected, authenticating")
|
|
139
|
+
@streamhost_cbs.process(streamhost, :authenticating, nil)
|
|
140
|
+
socks.auth
|
|
141
|
+
|
|
142
|
+
socks.connect_domain(stream_address, 0)
|
|
143
|
+
|
|
144
|
+
Jabber::debuglog("SOCKS5 Bytestreams: connected")
|
|
145
|
+
@streamhost_cbs.process(streamhost, :success, nil)
|
|
146
|
+
|
|
147
|
+
socks
|
|
148
|
+
}
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
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
|
+
module Bytestreams
|
|
7
|
+
##
|
|
8
|
+
# SOCKS5Bytestreams implementation for the initiator side
|
|
9
|
+
class SOCKS5BytestreamsInitiator < SOCKS5Bytestreams
|
|
10
|
+
attr_reader :streamhosts
|
|
11
|
+
|
|
12
|
+
def initialize(stream, session_id, initiator_jid, target_jid)
|
|
13
|
+
super
|
|
14
|
+
@streamhosts = []
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Add a streamhost which will be offered to the target
|
|
19
|
+
#
|
|
20
|
+
# streamhost:: can be:
|
|
21
|
+
# * [StreamHost] if already got all information (host/port)
|
|
22
|
+
# * [SOCKS5BytestreamsServer] if this is the local streamhost
|
|
23
|
+
# * [String] or [JID] if information should be automatically resolved by SOCKS5Bytestreams::query_streamhost
|
|
24
|
+
def add_streamhost(streamhost)
|
|
25
|
+
if streamhost.kind_of?(StreamHost)
|
|
26
|
+
@streamhosts << streamhost
|
|
27
|
+
elsif streamhost.kind_of?(SOCKS5BytestreamsServer)
|
|
28
|
+
streamhost.each_streamhost(@initiator_jid) { |sh|
|
|
29
|
+
@streamhosts << sh
|
|
30
|
+
}
|
|
31
|
+
elsif streamhost.kind_of?(String) or streamhost.kind_of?(JID)
|
|
32
|
+
@streamhosts << SOCKS5Bytestreams::query_streamhost(@stream, streamhost, @initiator_jid)
|
|
33
|
+
else
|
|
34
|
+
raise "Unknwon streamhost type: #{streamhost.class}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Send the configured streamhosts to the target,
|
|
40
|
+
# wait for an answer and
|
|
41
|
+
# connect to the host the target chose.
|
|
42
|
+
def open
|
|
43
|
+
iq1 = Iq.new(:set, @target_jid)
|
|
44
|
+
iq1.from = @initiator_jid
|
|
45
|
+
bs = iq1.add IqQueryBytestreams.new(@session_id)
|
|
46
|
+
@streamhosts.each { |se|
|
|
47
|
+
bs.add(se)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
peer_used = nil
|
|
51
|
+
@stream.send_with_id(iq1) { |response|
|
|
52
|
+
if response.query.kind_of?(IqQueryBytestreams)
|
|
53
|
+
peer_used = response.query.streamhost_used
|
|
54
|
+
raise "No streamhost-used" unless peer_used
|
|
55
|
+
raise "Invalid streamhost-used" unless peer_used.jid
|
|
56
|
+
end
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@streamhost_used = nil
|
|
60
|
+
@streamhosts.each { |sh|
|
|
61
|
+
if peer_used.jid == sh.jid
|
|
62
|
+
@streamhost_used = sh
|
|
63
|
+
break
|
|
64
|
+
end
|
|
65
|
+
}
|
|
66
|
+
if @streamhost_used.jid == @initiator_jid
|
|
67
|
+
# This is our own JID, so the target chose SOCKS5BytestreamsServer
|
|
68
|
+
@socks = @streamhost_used.server.peer_sock(stream_address)
|
|
69
|
+
raise "Target didn't connect" unless @socks
|
|
70
|
+
@streamhost_cbs.process(@streamhost_used, :success, nil)
|
|
71
|
+
else
|
|
72
|
+
begin
|
|
73
|
+
@socks = connect_socks(@streamhost_used)
|
|
74
|
+
rescue Exception => e
|
|
75
|
+
Jabber::debuglog("SOCKS5 Bytestreams: #{e.class}: #{e}\n#{e.backtrace.join("\n")}")
|
|
76
|
+
@streamhost_cbs.process(@streamhost_used, :failure, e)
|
|
77
|
+
raise e
|
|
78
|
+
end
|
|
79
|
+
iq2 = Iq.new(:set, @streamhost_used.jid)
|
|
80
|
+
iq2.add(IqQueryBytestreams.new(@session_id)).activate = @target_jid.to_s
|
|
81
|
+
@stream.send_with_id(iq2)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,198 @@
|
|
|
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
|
+
module Bytestreams
|
|
7
|
+
##
|
|
8
|
+
# The SOCKS5BytestreamsServer is an implementation of a SOCKS5 server.
|
|
9
|
+
#
|
|
10
|
+
# You can use it if you're reachable by your SOCKS5Bytestreams peers,
|
|
11
|
+
# thus avoiding use of an external proxy.
|
|
12
|
+
#
|
|
13
|
+
# ==Usage:
|
|
14
|
+
# * Instantiate with an unfirewalled port
|
|
15
|
+
# * Add your external IP addresses with SOCKS5BytestreamsServer#add_address
|
|
16
|
+
# * Once you've got an *outgoing* SOCKS5BytestreamsInitiator, do
|
|
17
|
+
# <tt>SOCKS5BytestreamsInitiator#add_streamhost(my_socks5bytestreamsserver)</tt>
|
|
18
|
+
# *before* you do <tt>SOCKS5BytestreamsInitiator#open</tt>
|
|
19
|
+
class SOCKS5BytestreamsServer
|
|
20
|
+
##
|
|
21
|
+
# Start a local SOCKS5BytestreamsServer
|
|
22
|
+
#
|
|
23
|
+
# Will start to listen on the given TCP port and
|
|
24
|
+
# accept new peers
|
|
25
|
+
# port:: [Fixnum] TCP port to listen on
|
|
26
|
+
# listen_on:: [String] Optional address for the server socket to listen on (i.e. '0.0.0.0' or '::')
|
|
27
|
+
def initialize(port, listen_on=nil)
|
|
28
|
+
@port = port
|
|
29
|
+
@addresses = []
|
|
30
|
+
@peers = []
|
|
31
|
+
@peers_lock = Mutex.new
|
|
32
|
+
if listen_on
|
|
33
|
+
socket = TCPServer.new(listen_on, port)
|
|
34
|
+
else
|
|
35
|
+
socket = TCPServer.new(port)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
Thread.new do
|
|
39
|
+
Thread.current.abort_on_exception = true
|
|
40
|
+
loop do
|
|
41
|
+
peer = SOCKS5BytestreamsPeer.new(socket.accept)
|
|
42
|
+
Thread.new do
|
|
43
|
+
Thread.current.abort_on_exception = true
|
|
44
|
+
begin
|
|
45
|
+
peer.start
|
|
46
|
+
rescue
|
|
47
|
+
Jabber::debuglog("SOCKS5 BytestreamsServer: Error accepting peer: #{$!}")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
@peers_lock.synchronize do
|
|
51
|
+
@peers << peer
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# Find the socket a peer is associated to
|
|
59
|
+
#
|
|
60
|
+
# This method also performs some housekeeping, ie. removing
|
|
61
|
+
# peers with closed sockets.
|
|
62
|
+
# addr:: [String] Address like SOCKS5Bytestreams#stream_address
|
|
63
|
+
# result:: [TCPSocker] or [nil]
|
|
64
|
+
def peer_sock(addr)
|
|
65
|
+
res = nil
|
|
66
|
+
@peers_lock.synchronize {
|
|
67
|
+
removes = []
|
|
68
|
+
|
|
69
|
+
@peers.each { |peer|
|
|
70
|
+
if peer.socket and peer.socket.closed?
|
|
71
|
+
# Queue peers with closed socket for removal
|
|
72
|
+
removes << peer
|
|
73
|
+
elsif peer.address == addr and res.nil?
|
|
74
|
+
res = peer.socket
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# If we sent multiple addresses of our own, clients may
|
|
78
|
+
# connect multiple times. DO NOT close any other connections
|
|
79
|
+
# here. These may belong to other concurrent bytestreams,
|
|
80
|
+
# believe that the peer will close any unneeded sockets
|
|
81
|
+
# which will then be picked up by the next call to peer_sock.
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# If we sent multiple addresses of our own, clients may
|
|
85
|
+
# connect multiple times. Close these connections here.
|
|
86
|
+
@peers.delete_if { |peer|
|
|
87
|
+
if removes.include? peer
|
|
88
|
+
peer.socket.close rescue IOError
|
|
89
|
+
true
|
|
90
|
+
else
|
|
91
|
+
false
|
|
92
|
+
end
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
res
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
##
|
|
100
|
+
# Add an external IP address
|
|
101
|
+
#
|
|
102
|
+
# This is a must-have, as SOCKS5BytestreamsInitiator must inform
|
|
103
|
+
# the target where to connect
|
|
104
|
+
def add_address(address)
|
|
105
|
+
@addresses << address
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
##
|
|
109
|
+
# Iterate through all configured addresses,
|
|
110
|
+
# yielding SOCKS5BytestreamsServerStreamHost
|
|
111
|
+
# instances, which should be passed to
|
|
112
|
+
# SOCKS5BytestreamsInitiator#add_streamhost
|
|
113
|
+
#
|
|
114
|
+
# This will be automatically invoked if you pass an instance
|
|
115
|
+
# of SOCKS5BytestreamsServer to
|
|
116
|
+
# SOCKS5BytestreamsInitiator#add_streamhost
|
|
117
|
+
# my_jid:: [JID] My Jabber-ID
|
|
118
|
+
def each_streamhost(my_jid, &block)
|
|
119
|
+
@addresses.each { |address|
|
|
120
|
+
yield SOCKS5BytestreamsServerStreamHost.new(self, my_jid, address, @port)
|
|
121
|
+
}
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
##
|
|
126
|
+
# A subclass of StreamHost which possesses a
|
|
127
|
+
# server attribute, to let SOCKS5BytestreamsInitiator
|
|
128
|
+
# know this is the local SOCKS5BytestreamsServer
|
|
129
|
+
class SOCKS5BytestreamsServerStreamHost < StreamHost
|
|
130
|
+
attr_reader :server
|
|
131
|
+
def initialize(server, jid=nil, host=nil, port=nil)
|
|
132
|
+
super(jid, host, port)
|
|
133
|
+
@server = server
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
##
|
|
138
|
+
# This class will be instantiated by SOCKS5BytestreamsServer
|
|
139
|
+
# upon accepting a new connection
|
|
140
|
+
class SOCKS5BytestreamsPeer
|
|
141
|
+
attr_reader :address, :socket
|
|
142
|
+
|
|
143
|
+
##
|
|
144
|
+
# Initialize a new peer
|
|
145
|
+
# socket:: [TCPSocket]
|
|
146
|
+
def initialize(socket)
|
|
147
|
+
@socket = socket
|
|
148
|
+
Jabber::debuglog("SOCKS5 BytestreamsServer: accepted peer #{@socket.peeraddr[2]}:#{@socket.peeraddr[1]}")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
##
|
|
152
|
+
# Start handshake process
|
|
153
|
+
def start
|
|
154
|
+
if !@socket.respond_to? :getbyte
|
|
155
|
+
class << @socket; alias getbyte getc; end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
auth_ver = @socket.getbyte
|
|
159
|
+
if auth_ver != 5
|
|
160
|
+
# Unsupported version
|
|
161
|
+
@socket.close
|
|
162
|
+
return
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
auth_nmethods = @socket.getbyte
|
|
166
|
+
auth_methods = @socket.read(auth_nmethods)
|
|
167
|
+
unless auth_methods.index("\x00")
|
|
168
|
+
# Client won't accept no authentication
|
|
169
|
+
@socket.write("\x05\xff")
|
|
170
|
+
@socket.close
|
|
171
|
+
return
|
|
172
|
+
end
|
|
173
|
+
@socket.write("\x05\x00")
|
|
174
|
+
Jabber::debuglog("SOCKS5 BytestreamsServer: peer #{@socket.peeraddr[2]}:#{@socket.peeraddr[1]} authenticated")
|
|
175
|
+
|
|
176
|
+
req = @socket.read(4)
|
|
177
|
+
if req != "\x05\x01\x00\x03"
|
|
178
|
+
# Unknown version, command, reserved, address-type
|
|
179
|
+
@socket.close
|
|
180
|
+
return
|
|
181
|
+
end
|
|
182
|
+
req_addrlen = @socket.getbyte
|
|
183
|
+
req_addr = @socket.read(req_addrlen)
|
|
184
|
+
req_port = @socket.read(2)
|
|
185
|
+
if req_port != "\x00\x00"
|
|
186
|
+
# Port is not 0
|
|
187
|
+
@socket.write("\x05\x01")
|
|
188
|
+
@socket.close
|
|
189
|
+
return
|
|
190
|
+
end
|
|
191
|
+
@socket.write("\x05\x00\x00\x03#{req_addrlen.chr}#{req_addr}\x00\x00")
|
|
192
|
+
Jabber::debuglog("SOCKS5 BytestreamsServer: peer #{@socket.peeraddr[2]}:#{@socket.peeraddr[1]} connected for #{req_addr}")
|
|
193
|
+
|
|
194
|
+
@address = req_addr
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|