vines 0.4.5 → 0.4.6
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/Gemfile +3 -0
 - data/README.md +48 -0
 - data/Rakefile +6 -58
 - data/bin/vines +12 -2
 - data/conf/certs/ca-bundle.crt +568 -39
 - data/conf/config.rb +9 -42
 - data/lib/vines.rb +1 -8
 - data/lib/vines/command/cert.rb +4 -4
 - data/lib/vines/command/init.rb +3 -3
 - data/lib/vines/config.rb +9 -0
 - data/lib/vines/kit.rb +2 -7
 - data/lib/vines/storage/local.rb +50 -17
 - data/lib/vines/store.rb +6 -4
 - data/lib/vines/stream.rb +1 -1
 - data/lib/vines/stream/http/session.rb +0 -0
 - data/lib/vines/stream/http/sessions.rb +0 -0
 - data/lib/vines/stream/parser.rb +3 -2
 - data/lib/vines/token_bucket.rb +19 -10
 - data/lib/vines/version.rb +1 -1
 - data/test/cluster/publisher_test.rb +45 -33
 - data/test/cluster/sessions_test.rb +32 -39
 - data/test/cluster/subscriber_test.rb +93 -78
 - data/test/config/host_test.rb +2 -4
 - data/test/config/pubsub_test.rb +132 -126
 - data/test/config_test.rb +2 -4
 - data/test/contact_test.rb +80 -66
 - data/test/error_test.rb +54 -55
 - data/test/jid_test.rb +1 -2
 - data/test/kit_test.rb +22 -17
 - data/test/router_test.rb +187 -146
 - data/test/stanza/iq/disco_info_test.rb +59 -59
 - data/test/stanza/iq/disco_items_test.rb +36 -34
 - data/test/stanza/iq/private_storage_test.rb +138 -143
 - data/test/stanza/iq/roster_test.rb +198 -175
 - data/test/stanza/iq/session_test.rb +17 -18
 - data/test/stanza/iq/vcard_test.rb +117 -116
 - data/test/stanza/iq/version_test.rb +47 -46
 - data/test/stanza/iq_test.rb +53 -49
 - data/test/stanza/message_test.rb +92 -89
 - data/test/stanza/presence/probe_test.rb +2 -5
 - data/test/stanza/presence/subscribe_test.rb +67 -54
 - data/test/stanza/pubsub/create_test.rb +86 -108
 - data/test/stanza/pubsub/delete_test.rb +141 -114
 - data/test/stanza/pubsub/publish_test.rb +256 -320
 - data/test/stanza/pubsub/subscribe_test.rb +169 -150
 - data/test/stanza/pubsub/unsubscribe_test.rb +111 -142
 - data/test/stanza_test.rb +61 -54
 - data/test/storage/ldap_test.rb +1 -2
 - data/test/storage/local_test.rb +3 -5
 - data/test/storage/null_test.rb +3 -4
 - data/test/storage/storage_tests.rb +1 -3
 - data/test/storage_test.rb +1 -2
 - data/test/store_test.rb +1 -2
 - data/test/stream/client/auth_test.rb +61 -63
 - data/test/stream/client/ready_test.rb +7 -8
 - data/test/stream/client/session_test.rb +19 -18
 - data/test/stream/component/handshake_test.rb +40 -37
 - data/test/stream/component/ready_test.rb +76 -61
 - data/test/stream/component/start_test.rb +7 -8
 - data/test/stream/http/auth_test.rb +3 -4
 - data/test/stream/http/ready_test.rb +52 -60
 - data/test/stream/http/request_test.rb +1 -3
 - data/test/stream/http/sessions_test.rb +2 -3
 - data/test/stream/http/start_test.rb +3 -4
 - data/test/stream/parser_test.rb +3 -4
 - data/test/stream/sasl_test.rb +105 -86
 - data/test/stream/server/auth_test.rb +40 -36
 - data/test/stream/server/outbound/auth_test.rb +3 -4
 - data/test/stream/server/ready_test.rb +51 -51
 - data/test/test_helper.rb +42 -0
 - data/test/token_bucket_test.rb +38 -18
 - data/test/user_test.rb +79 -49
 - data/vines.gemspec +33 -0
 - data/web/chat/javascripts/app.js +1 -1
 - data/web/lib/coffeescripts/layout.coffee +1 -1
 - data/web/lib/javascripts/base.js +10 -10
 - data/web/lib/javascripts/jquery.js +4 -4
 - metadata +31 -128
 - data/README +0 -35
 - data/lib/vines/storage/couchdb.rb +0 -129
 - data/lib/vines/storage/mongodb.rb +0 -132
 - data/lib/vines/storage/redis.rb +0 -127
 - data/lib/vines/storage/sql.rb +0 -220
 - data/test/rake_test_loader.rb +0 -17
 - data/test/storage/couchdb_test.rb +0 -107
 - data/test/storage/mock_mongo.rb +0 -40
 - data/test/storage/mongodb_test.rb +0 -81
 - data/test/storage/redis_test.rb +0 -51
 - data/test/storage/sql_test.rb +0 -62
 
| 
         @@ -1,9 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: UTF-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
            require 'minitest/autorun'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe Vines::Stream::Http::Sessions do
         
     | 
| 
       7 
6 
     | 
    
         
             
              class MockSessions < Vines::Stream::Http::Sessions
         
     | 
| 
       8 
7 
     | 
    
         
             
                def start_timer
         
     | 
| 
       9 
8 
     | 
    
         
             
                  # do nothing
         
     | 
| 
         @@ -1,10 +1,9 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: UTF-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
            require 'minitest/autorun'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
               
     | 
| 
      
 5 
     | 
    
         
            +
            describe Vines::Stream::Http::Start do
         
     | 
| 
      
 6 
     | 
    
         
            +
              before do
         
     | 
| 
       8 
7 
     | 
    
         
             
                @stream = MiniTest::Mock.new
         
     | 
| 
       9 
8 
     | 
    
         
             
                @state = Vines::Stream::Http::Start.new(@stream)
         
     | 
| 
       10 
9 
     | 
    
         
             
              end
         
     | 
    
        data/test/stream/parser_test.rb
    CHANGED
    
    | 
         @@ -1,12 +1,11 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: UTF-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
            require 'minitest/autorun'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe Vines::Stream::Parser do
         
     | 
| 
       7 
6 
     | 
    
         
             
              STREAM_START = '<stream:stream to="wonderland.lit" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams">'.freeze
         
     | 
| 
       8 
7 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
               
     | 
| 
      
 8 
     | 
    
         
            +
              before do
         
     | 
| 
       10 
9 
     | 
    
         
             
                @events = []
         
     | 
| 
       11 
10 
     | 
    
         
             
                @parser = Vines::Stream::Parser.new.tap do |p|
         
     | 
| 
       12 
11 
     | 
    
         
             
                  p.stream_open  {|el| @events << el }
         
     | 
    
        data/test/stream/sasl_test.rb
    CHANGED
    
    | 
         @@ -1,13 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: UTF-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
            require 'minitest/autorun'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
5 
     | 
    
         
             
            describe Vines::Stream::SASL do
         
     | 
| 
      
 6 
     | 
    
         
            +
              subject       { Vines::Stream::SASL.new(stream) }
         
     | 
| 
      
 7 
     | 
    
         
            +
              let(:stream)  { MiniTest::Mock.new }
         
     | 
| 
      
 8 
     | 
    
         
            +
              let(:storage) { MiniTest::Mock.new }
         
     | 
| 
      
 9 
     | 
    
         
            +
              let(:romeo)   { Vines::User.new(jid: 'romeo@verona.lit') }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       7 
11 
     | 
    
         
             
              before do
         
     | 
| 
       8 
     | 
    
         
            -
                 
     | 
| 
       9 
     | 
    
         
            -
                @sasl = Vines::Stream::SASL.new(@stream)
         
     | 
| 
       10 
     | 
    
         
            -
                def @sasl.log
         
     | 
| 
      
 12 
     | 
    
         
            +
                def subject.log
         
     | 
| 
       11 
13 
     | 
    
         
             
                  Class.new do
         
     | 
| 
       12 
14 
     | 
    
         
             
                    def method_missing(*args)
         
     | 
| 
       13 
15 
     | 
    
         
             
                      # do nothing
         
     | 
| 
         @@ -17,95 +19,104 @@ describe Vines::Stream::SASL do 
     | 
|
| 
       17 
19 
     | 
    
         
             
              end
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
       19 
21 
     | 
    
         
             
              describe '#plain_auth' do
         
     | 
| 
       20 
     | 
    
         
            -
                 
     | 
| 
       21 
     | 
    
         
            -
                   
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                   
     | 
| 
      
 22 
     | 
    
         
            +
                before do
         
     | 
| 
      
 23 
     | 
    
         
            +
                  stream.expect :domain, 'verona.lit'
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                it 'fails with empty input' do
         
     | 
| 
      
 27 
     | 
    
         
            +
                  -> { subject.plain_auth(nil) }.must_raise Vines::SaslErrors::IncorrectEncoding
         
     | 
| 
      
 28 
     | 
    
         
            +
                  -> { subject.plain_auth('') }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                it 'fails with plain text' do
         
     | 
| 
      
 32 
     | 
    
         
            +
                  -> { subject.plain_auth('bogus') }.must_raise Vines::SaslErrors::IncorrectEncoding
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                it 'fails with incorrectly encoded base64 text' do
         
     | 
| 
      
 36 
     | 
    
         
            +
                  -> { subject.plain_auth('=dmVyb25hLmxpdA==') }.must_raise Vines::SaslErrors::IncorrectEncoding
         
     | 
| 
      
 37 
     | 
    
         
            +
                  -> { subject.plain_auth("dmVyb25hLmxpdA==\n") }.must_raise Vines::SaslErrors::IncorrectEncoding
         
     | 
| 
       26 
38 
     | 
    
         
             
                end
         
     | 
| 
       27 
39 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                it 'fails when authzid does not match authcid' do
         
     | 
| 
       29 
     | 
    
         
            -
                  @stream.expect(:domain, 'verona.lit')
         
     | 
| 
      
 40 
     | 
    
         
            +
                it 'fails when authzid does not match authcid username' do
         
     | 
| 
       30 
41 
     | 
    
         
             
                  encoded = Base64.strict_encode64("juliet@verona.lit\x00romeo\x00secr3t")
         
     | 
| 
       31 
     | 
    
         
            -
                   
     | 
| 
      
 42 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::InvalidAuthzid
         
     | 
| 
      
 43 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                it 'fails when authzid does not match authcid domain' do
         
     | 
| 
       32 
47 
     | 
    
         
             
                  encoded = Base64.strict_encode64("romeo@wonderland.lit\x00romeo\x00secr3t")
         
     | 
| 
       33 
     | 
    
         
            -
                   
     | 
| 
       34 
     | 
    
         
            -
                   
     | 
| 
      
 48 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::InvalidAuthzid
         
     | 
| 
      
 49 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                it 'fails when username and password are missing' do
         
     | 
| 
      
 53 
     | 
    
         
            +
                  encoded = Base64.strict_encode64("\x00\x00")
         
     | 
| 
      
 54 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
       35 
55 
     | 
    
         
             
                end
         
     | 
| 
       36 
56 
     | 
    
         | 
| 
       37 
57 
     | 
    
         
             
                it 'fails when username is missing' do
         
     | 
| 
       38 
58 
     | 
    
         
             
                  encoded = Base64.strict_encode64("\x00\x00secr3t")
         
     | 
| 
       39 
     | 
    
         
            -
                   
     | 
| 
       40 
     | 
    
         
            -
                  encoded = Base64.strict_encode64("\x00\x00")
         
     | 
| 
       41 
     | 
    
         
            -
                  proc { @sasl.plain_auth(encoded) }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
      
 59 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
       42 
60 
     | 
    
         
             
                end
         
     | 
| 
       43 
61 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
                it 'fails when password is missing' do
         
     | 
| 
      
 62 
     | 
    
         
            +
                it 'fails when password is missing with delimiter' do
         
     | 
| 
       45 
63 
     | 
    
         
             
                  encoded = Base64.strict_encode64("\x00romeo\x00")
         
     | 
| 
       46 
     | 
    
         
            -
                   
     | 
| 
      
 64 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                it 'fails when password is missing' do
         
     | 
| 
       47 
68 
     | 
    
         
             
                  encoded = Base64.strict_encode64("\x00romeo")
         
     | 
| 
       48 
     | 
    
         
            -
                   
     | 
| 
      
 69 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
       49 
70 
     | 
    
         
             
                end
         
     | 
| 
       50 
71 
     | 
    
         | 
| 
       51 
72 
     | 
    
         
             
                it 'fails with invalid jid' do
         
     | 
| 
       52 
     | 
    
         
            -
                   
     | 
| 
       53 
     | 
    
         
            -
                   
     | 
| 
       54 
     | 
    
         
            -
                   
     | 
| 
       55 
     | 
    
         
            -
                  proc { @sasl.plain_auth(encoded) }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
       56 
     | 
    
         
            -
                  @stream.verify.must_equal true
         
     | 
| 
      
 73 
     | 
    
         
            +
                  encoded = Base64.strict_encode64("\x00#{'a' * 1024}\x00secr3t")
         
     | 
| 
      
 74 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
      
 75 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       57 
76 
     | 
    
         
             
                end
         
     | 
| 
       58 
77 
     | 
    
         | 
| 
       59 
78 
     | 
    
         
             
                it 'fails with invalid password' do
         
     | 
| 
       60 
     | 
    
         
            -
                   
     | 
| 
       61 
     | 
    
         
            -
                  storage  
     | 
| 
       62 
     | 
    
         
            -
                  storage.expect(:authenticate, nil, [romeo, 'secr3t'])
         
     | 
| 
       63 
     | 
    
         
            -
                  @stream.expect(:domain, 'verona.lit')
         
     | 
| 
       64 
     | 
    
         
            -
                  @stream.expect(:storage, storage)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  storage.expect :authenticate, nil, [romeo.jid, 'secr3t']
         
     | 
| 
      
 80 
     | 
    
         
            +
                  stream.expect :storage, storage
         
     | 
| 
       65 
81 
     | 
    
         | 
| 
       66 
82 
     | 
    
         
             
                  encoded = Base64.strict_encode64("\x00romeo\x00secr3t")
         
     | 
| 
       67 
     | 
    
         
            -
                   
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                   
     | 
| 
      
 83 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 86 
     | 
    
         
            +
                  storage.verify
         
     | 
| 
       70 
87 
     | 
    
         
             
                end
         
     | 
| 
       71 
88 
     | 
    
         | 
| 
       72 
89 
     | 
    
         
             
                it 'passes with valid password' do
         
     | 
| 
       73 
     | 
    
         
            -
                   
     | 
| 
       74 
     | 
    
         
            -
                  storage  
     | 
| 
       75 
     | 
    
         
            -
                  storage.expect(:authenticate, Vines::User.new(jid: romeo), [romeo, 'secr3t'])
         
     | 
| 
       76 
     | 
    
         
            -
                  @stream.expect(:domain, 'verona.lit')
         
     | 
| 
       77 
     | 
    
         
            -
                  @stream.expect(:storage, storage)
         
     | 
| 
      
 90 
     | 
    
         
            +
                  storage.expect :authenticate, romeo, [romeo.jid, 'secr3t']
         
     | 
| 
      
 91 
     | 
    
         
            +
                  stream.expect :storage, storage
         
     | 
| 
       78 
92 
     | 
    
         | 
| 
       79 
93 
     | 
    
         
             
                  encoded = Base64.strict_encode64("\x00romeo\x00secr3t")
         
     | 
| 
       80 
     | 
    
         
            -
                   
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
                   
     | 
| 
      
 94 
     | 
    
         
            +
                  subject.plain_auth(encoded).must_equal romeo
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 97 
     | 
    
         
            +
                  storage.verify
         
     | 
| 
       83 
98 
     | 
    
         
             
                end
         
     | 
| 
       84 
99 
     | 
    
         | 
| 
       85 
100 
     | 
    
         
             
                it 'passes with valid password and authzid provided by strophe and blather' do
         
     | 
| 
       86 
     | 
    
         
            -
                   
     | 
| 
       87 
     | 
    
         
            -
                  storage  
     | 
| 
       88 
     | 
    
         
            -
                  storage.expect(:authenticate, Vines::User.new(jid: romeo), [romeo, 'secr3t'])
         
     | 
| 
       89 
     | 
    
         
            -
                  @stream.expect(:domain, 'verona.lit')
         
     | 
| 
       90 
     | 
    
         
            -
                  @stream.expect(:storage, storage)
         
     | 
| 
      
 101 
     | 
    
         
            +
                  storage.expect :authenticate, romeo, [romeo.jid, 'secr3t']
         
     | 
| 
      
 102 
     | 
    
         
            +
                  stream.expect :storage, storage
         
     | 
| 
       91 
103 
     | 
    
         | 
| 
       92 
104 
     | 
    
         
             
                  encoded = Base64.strict_encode64("romeo@Verona.LIT\x00romeo\x00secr3t")
         
     | 
| 
       93 
     | 
    
         
            -
                   
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
                   
     | 
| 
      
 105 
     | 
    
         
            +
                  subject.plain_auth(encoded).must_equal romeo
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 108 
     | 
    
         
            +
                  storage.verify
         
     | 
| 
       96 
109 
     | 
    
         
             
                end
         
     | 
| 
       97 
110 
     | 
    
         | 
| 
       98 
111 
     | 
    
         
             
                it 'passes with valid password and authzid provided by smack' do
         
     | 
| 
       99 
     | 
    
         
            -
                   
     | 
| 
       100 
     | 
    
         
            -
                  storage  
     | 
| 
       101 
     | 
    
         
            -
                  storage.expect(:authenticate, Vines::User.new(jid: romeo), [romeo, 'secr3t'])
         
     | 
| 
       102 
     | 
    
         
            -
                  @stream.expect(:domain, 'verona.lit')
         
     | 
| 
       103 
     | 
    
         
            -
                  @stream.expect(:storage, storage)
         
     | 
| 
      
 112 
     | 
    
         
            +
                  storage.expect :authenticate, romeo, [romeo.jid, 'secr3t']
         
     | 
| 
      
 113 
     | 
    
         
            +
                  stream.expect :storage, storage
         
     | 
| 
       104 
114 
     | 
    
         | 
| 
       105 
115 
     | 
    
         
             
                  encoded = Base64.strict_encode64("romeo\x00romeo\x00secr3t")
         
     | 
| 
       106 
     | 
    
         
            -
                   
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
                   
     | 
| 
      
 116 
     | 
    
         
            +
                  subject.plain_auth(encoded).must_equal romeo
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 119 
     | 
    
         
            +
                  storage.verify
         
     | 
| 
       109 
120 
     | 
    
         
             
                end
         
     | 
| 
       110 
121 
     | 
    
         | 
| 
       111 
122 
     | 
    
         
             
                it 'raises temporary-auth-failure when storage backend fails' do
         
     | 
| 
         @@ -114,51 +125,59 @@ describe Vines::Stream::SASL do 
     | 
|
| 
       114 
125 
     | 
    
         
             
                      raise 'boom'
         
     | 
| 
       115 
126 
     | 
    
         
             
                    end
         
     | 
| 
       116 
127 
     | 
    
         
             
                  end.new
         
     | 
| 
       117 
     | 
    
         
            -
                  @stream.expect(:domain, 'verona.lit')
         
     | 
| 
       118 
     | 
    
         
            -
                  @stream.expect(:storage, storage)
         
     | 
| 
       119 
128 
     | 
    
         | 
| 
      
 129 
     | 
    
         
            +
                  stream.expect :storage, storage
         
     | 
| 
       120 
130 
     | 
    
         
             
                  encoded = Base64.strict_encode64("\x00romeo\x00secr3t")
         
     | 
| 
       121 
     | 
    
         
            -
                   
     | 
| 
       122 
     | 
    
         
            -
                   
     | 
| 
      
 131 
     | 
    
         
            +
                  -> { subject.plain_auth(encoded) }.must_raise Vines::SaslErrors::TemporaryAuthFailure
         
     | 
| 
      
 132 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       123 
133 
     | 
    
         
             
                end
         
     | 
| 
       124 
134 
     | 
    
         
             
              end
         
     | 
| 
       125 
135 
     | 
    
         | 
| 
       126 
136 
     | 
    
         
             
              describe '#external_auth' do
         
     | 
| 
       127 
     | 
    
         
            -
                it 'fails with  
     | 
| 
       128 
     | 
    
         
            -
                   
     | 
| 
       129 
     | 
    
         
            -
                   
     | 
| 
       130 
     | 
    
         
            -
                   
     | 
| 
       131 
     | 
    
         
            -
                   
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
      
 137 
     | 
    
         
            +
                it 'fails with empty input' do
         
     | 
| 
      
 138 
     | 
    
         
            +
                  stream.expect :remote_domain, 'verona.lit'
         
     | 
| 
      
 139 
     | 
    
         
            +
                  -> { subject.external_auth(nil) }.must_raise Vines::SaslErrors::IncorrectEncoding
         
     | 
| 
      
 140 
     | 
    
         
            +
                  -> { subject.external_auth('') }.must_raise Vines::SaslErrors::InvalidAuthzid
         
     | 
| 
      
 141 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 142 
     | 
    
         
            +
                end
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
                it 'fails with plain text' do
         
     | 
| 
      
 145 
     | 
    
         
            +
                  -> { subject.external_auth('bogus') }.must_raise Vines::SaslErrors::IncorrectEncoding
         
     | 
| 
      
 146 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 147 
     | 
    
         
            +
                end
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
                it 'fails with incorrectly encoded base64 text' do
         
     | 
| 
      
 150 
     | 
    
         
            +
                  -> { subject.external_auth('=dmVyb25hLmxpdA==') }.must_raise Vines::SaslErrors::IncorrectEncoding
         
     | 
| 
      
 151 
     | 
    
         
            +
                  -> { subject.external_auth("dmVyb25hLmxpdA==\n") }.must_raise Vines::SaslErrors::IncorrectEncoding
         
     | 
| 
      
 152 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       135 
153 
     | 
    
         
             
                end
         
     | 
| 
       136 
154 
     | 
    
         | 
| 
       137 
155 
     | 
    
         
             
                it 'passes with empty authzid and matching cert' do
         
     | 
| 
       138 
     | 
    
         
            -
                   
     | 
| 
       139 
     | 
    
         
            -
                   
     | 
| 
       140 
     | 
    
         
            -
                   
     | 
| 
       141 
     | 
    
         
            -
                   
     | 
| 
      
 156 
     | 
    
         
            +
                  stream.expect :remote_domain, 'verona.lit'
         
     | 
| 
      
 157 
     | 
    
         
            +
                  stream.expect :cert_domain_matches?, true, ['verona.lit']
         
     | 
| 
      
 158 
     | 
    
         
            +
                  subject.external_auth('=').must_equal true
         
     | 
| 
      
 159 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       142 
160 
     | 
    
         
             
                end
         
     | 
| 
       143 
161 
     | 
    
         | 
| 
       144 
162 
     | 
    
         
             
                it 'fails with empty authzid and non-matching cert' do
         
     | 
| 
       145 
     | 
    
         
            -
                   
     | 
| 
       146 
     | 
    
         
            -
                   
     | 
| 
       147 
     | 
    
         
            -
                   
     | 
| 
       148 
     | 
    
         
            -
                   
     | 
| 
      
 163 
     | 
    
         
            +
                  stream.expect :remote_domain, 'verona.lit'
         
     | 
| 
      
 164 
     | 
    
         
            +
                  stream.expect :cert_domain_matches?, false, ['verona.lit']
         
     | 
| 
      
 165 
     | 
    
         
            +
                  -> { subject.external_auth('=') }.must_raise Vines::SaslErrors::NotAuthorized
         
     | 
| 
      
 166 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       149 
167 
     | 
    
         
             
                end
         
     | 
| 
       150 
168 
     | 
    
         | 
| 
       151 
169 
     | 
    
         
             
                it 'fails when authzid does not match stream from address' do
         
     | 
| 
       152 
     | 
    
         
            -
                   
     | 
| 
       153 
     | 
    
         
            -
                   
     | 
| 
       154 
     | 
    
         
            -
                   
     | 
| 
      
 170 
     | 
    
         
            +
                  stream.expect :remote_domain, 'not.verona.lit'
         
     | 
| 
      
 171 
     | 
    
         
            +
                  -> { subject.external_auth('dmVyb25hLmxpdA==') }.must_raise Vines::SaslErrors::InvalidAuthzid
         
     | 
| 
      
 172 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       155 
173 
     | 
    
         
             
                end
         
     | 
| 
       156 
174 
     | 
    
         | 
| 
       157 
175 
     | 
    
         
             
                it 'passes when authzid matches stream from address' do
         
     | 
| 
       158 
     | 
    
         
            -
                   
     | 
| 
       159 
     | 
    
         
            -
                   
     | 
| 
       160 
     | 
    
         
            -
                   
     | 
| 
       161 
     | 
    
         
            -
                   
     | 
| 
      
 176 
     | 
    
         
            +
                  stream.expect :remote_domain, 'verona.lit'
         
     | 
| 
      
 177 
     | 
    
         
            +
                  stream.expect :remote_domain, 'verona.lit'
         
     | 
| 
      
 178 
     | 
    
         
            +
                  stream.expect :cert_domain_matches?, true, ['verona.lit']
         
     | 
| 
      
 179 
     | 
    
         
            +
                  subject.external_auth('dmVyb25hLmxpdA==').must_equal true
         
     | 
| 
      
 180 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       162 
181 
     | 
    
         
             
                end
         
     | 
| 
       163 
182 
     | 
    
         
             
              end
         
     | 
| 
       164 
183 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,57 +1,61 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: UTF-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
            require 'minitest/autorun'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
5 
     | 
    
         
             
            describe Vines::Stream::Server::Auth do
         
     | 
| 
       7 
6 
     | 
    
         
             
              # disable logging for tests
         
     | 
| 
       8 
7 
     | 
    
         
             
              Class.new.extend(Vines::Log).log.level = Logger::FATAL
         
     | 
| 
       9 
8 
     | 
    
         | 
| 
      
 9 
     | 
    
         
            +
              subject      { Vines::Stream::Server::Auth.new(stream) }
         
     | 
| 
      
 10 
     | 
    
         
            +
              let(:stream) { MiniTest::Mock.new }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       10 
12 
     | 
    
         
             
              before do
         
     | 
| 
       11 
     | 
    
         
            -
                 
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
                class << stream
         
     | 
| 
      
 14 
     | 
    
         
            +
                  attr_accessor :remote_domain
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
                stream.remote_domain = 'wonderland.lit'
         
     | 
| 
       13 
17 
     | 
    
         
             
              end
         
     | 
| 
       14 
18 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
              describe ' 
     | 
| 
       16 
     | 
    
         
            -
                 
     | 
| 
       17 
     | 
    
         
            -
                   
     | 
| 
       18 
     | 
    
         
            -
                   
     | 
| 
       19 
     | 
    
         
            -
                   
     | 
| 
       20 
     | 
    
         
            -
                   
     | 
| 
       21 
     | 
    
         
            -
                   
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                   
     | 
| 
      
 19 
     | 
    
         
            +
              describe 'when given a valid authzid' do
         
     | 
| 
      
 20 
     | 
    
         
            +
                before do
         
     | 
| 
      
 21 
     | 
    
         
            +
                  stream.expect :cert_domain_matches?, true, ['wonderland.lit']
         
     | 
| 
      
 22 
     | 
    
         
            +
                  stream.expect :write, nil, ['<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>']
         
     | 
| 
      
 23 
     | 
    
         
            +
                  stream.expect :advance, nil, [Vines::Stream::Server::FinalRestart]
         
     | 
| 
      
 24 
     | 
    
         
            +
                  stream.expect :reset, nil
         
     | 
| 
      
 25 
     | 
    
         
            +
                  stream.expect :authentication_mechanisms, ['EXTERNAL']
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                it 'passes external auth with empty authzid' do
         
     | 
| 
      
 29 
     | 
    
         
            +
                  node = external('=')
         
     | 
| 
      
 30 
     | 
    
         
            +
                  subject.node(node)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       26 
32 
     | 
    
         
             
                end
         
     | 
| 
       27 
33 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                it 'passes  
     | 
| 
       29 
     | 
    
         
            -
                   
     | 
| 
       30 
     | 
    
         
            -
                   
     | 
| 
       31 
     | 
    
         
            -
                   
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                   
     | 
| 
      
 34 
     | 
    
         
            +
                it 'passes external auth with authzid matching from domain' do
         
     | 
| 
      
 35 
     | 
    
         
            +
                  node = external(Base64.strict_encode64('wonderland.lit'))
         
     | 
| 
      
 36 
     | 
    
         
            +
                  subject.node(node)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              describe 'when given an invalid authzid' do
         
     | 
| 
      
 42 
     | 
    
         
            +
                before do
         
     | 
| 
      
 43 
     | 
    
         
            +
                  stream.expect :write, nil, ['</stream:stream>']
         
     | 
| 
      
 44 
     | 
    
         
            +
                  stream.expect :close_connection_after_writing, nil
         
     | 
| 
      
 45 
     | 
    
         
            +
                  stream.expect :error, nil, [Vines::SaslErrors::InvalidAuthzid]
         
     | 
| 
      
 46 
     | 
    
         
            +
                  stream.expect :authentication_mechanisms, ['EXTERNAL']
         
     | 
| 
       38 
47 
     | 
    
         
             
                end
         
     | 
| 
       39 
48 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                it 'fails  
     | 
| 
       41 
     | 
    
         
            -
                   
     | 
| 
       42 
     | 
    
         
            -
                   
     | 
| 
       43 
     | 
    
         
            -
                   
     | 
| 
       44 
     | 
    
         
            -
                  @stream.expect(:error, nil, [Vines::SaslErrors::InvalidAuthzid])
         
     | 
| 
       45 
     | 
    
         
            -
                  @stream.expect(:authentication_mechanisms, ['EXTERNAL'])
         
     | 
| 
       46 
     | 
    
         
            -
                  node = node(%Q{<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="EXTERNAL">#{Base64.strict_encode64('verona.lit')}</auth>})
         
     | 
| 
       47 
     | 
    
         
            -
                  @state.node(node)
         
     | 
| 
       48 
     | 
    
         
            -
                  assert @stream.verify
         
     | 
| 
      
 49 
     | 
    
         
            +
                it 'fails external auth with mismatched from domain' do
         
     | 
| 
      
 50 
     | 
    
         
            +
                  node = external(Base64.strict_encode64('verona.lit'))
         
     | 
| 
      
 51 
     | 
    
         
            +
                  subject.node(node)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  stream.verify
         
     | 
| 
       49 
53 
     | 
    
         
             
                end
         
     | 
| 
       50 
54 
     | 
    
         
             
              end
         
     | 
| 
       51 
55 
     | 
    
         | 
| 
       52 
56 
     | 
    
         
             
              private
         
     | 
| 
       53 
57 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
              def  
     | 
| 
       55 
     | 
    
         
            -
                 
     | 
| 
      
 58 
     | 
    
         
            +
              def external(authzid)
         
     | 
| 
      
 59 
     | 
    
         
            +
                node(%Q{<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="EXTERNAL">#{authzid}</auth>})
         
     | 
| 
       56 
60 
     | 
    
         
             
              end
         
     | 
| 
       57 
61 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,10 +1,9 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: UTF-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
            require 'minitest/autorun'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
               
     | 
| 
      
 5 
     | 
    
         
            +
            describe Vines::Stream::Server::Outbound::Auth do
         
     | 
| 
      
 6 
     | 
    
         
            +
              before do
         
     | 
| 
       8 
7 
     | 
    
         
             
                @stream = MiniTest::Mock.new
         
     | 
| 
       9 
8 
     | 
    
         
             
                @state = Vines::Stream::Server::Outbound::Auth.new(@stream)
         
     | 
| 
       10 
9 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,93 +1,93 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: UTF-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
            require 'minitest/autorun'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
               
     | 
| 
      
 5 
     | 
    
         
            +
            describe Vines::Stream::Server::Ready do
         
     | 
| 
      
 6 
     | 
    
         
            +
              subject      { Vines::Stream::Server::Ready.new(stream, nil) }
         
     | 
| 
      
 7 
     | 
    
         
            +
              let(:stream) { MiniTest::Mock.new }
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
               
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                def  
     | 
| 
       13 
     | 
    
         
            -
                  Vines::Stanza.from_node(node,  
     | 
| 
      
 9 
     | 
    
         
            +
              SERVER_STANZAS = []
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              before do
         
     | 
| 
      
 12 
     | 
    
         
            +
                def subject.to_stanza(node)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  Vines::Stanza.from_node(node, stream).tap do |stanza|
         
     | 
| 
       14 
14 
     | 
    
         
             
                    def stanza.process
         
     | 
| 
       15 
     | 
    
         
            -
                       
     | 
| 
      
 15 
     | 
    
         
            +
                      SERVER_STANZAS << self
         
     | 
| 
       16 
16 
     | 
    
         
             
                    end if stanza
         
     | 
| 
       17 
17 
     | 
    
         
             
                  end
         
     | 
| 
       18 
18 
     | 
    
         
             
                end
         
     | 
| 
       19 
19 
     | 
    
         
             
              end
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
               
     | 
| 
       22 
     | 
    
         
            -
                 
     | 
| 
      
 21 
     | 
    
         
            +
              after do
         
     | 
| 
      
 22 
     | 
    
         
            +
                SERVER_STANZAS.clear
         
     | 
| 
       23 
23 
     | 
    
         
             
              end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
               
     | 
| 
      
 25 
     | 
    
         
            +
              it 'processes a valid node' do
         
     | 
| 
       26 
26 
     | 
    
         
             
                config = MiniTest::Mock.new
         
     | 
| 
       27 
27 
     | 
    
         
             
                config.expect(:local_jid?, true, [Vines::JID.new('romeo@verona.lit')])
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
                 
     | 
| 
       30 
     | 
    
         
            -
                 
     | 
| 
       31 
     | 
    
         
            -
                 
     | 
| 
       32 
     | 
    
         
            -
                 
     | 
| 
      
 29 
     | 
    
         
            +
                stream.expect(:config, config)
         
     | 
| 
      
 30 
     | 
    
         
            +
                stream.expect(:remote_domain, 'wonderland.lit')
         
     | 
| 
      
 31 
     | 
    
         
            +
                stream.expect(:domain, 'verona.lit')
         
     | 
| 
      
 32 
     | 
    
         
            +
                stream.expect(:user=, nil, [Vines::User.new(jid: 'alice@wonderland.lit')])
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
                node = node(%Q{<message from="alice@wonderland.lit" to="romeo@verona.lit"/>})
         
     | 
| 
       35 
     | 
    
         
            -
                 
     | 
| 
       36 
     | 
    
         
            -
                assert_equal 1,  
     | 
| 
       37 
     | 
    
         
            -
                assert  
     | 
| 
      
 35 
     | 
    
         
            +
                subject.node(node)
         
     | 
| 
      
 36 
     | 
    
         
            +
                assert_equal 1, SERVER_STANZAS.size
         
     | 
| 
      
 37 
     | 
    
         
            +
                assert stream.verify
         
     | 
| 
       38 
38 
     | 
    
         
             
                assert config.verify
         
     | 
| 
       39 
39 
     | 
    
         
             
              end
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
               
     | 
| 
      
 41 
     | 
    
         
            +
              it 'raises unsupported-stanza-type stream error' do
         
     | 
| 
       42 
42 
     | 
    
         
             
                node = node('<bogus/>')
         
     | 
| 
       43 
     | 
    
         
            -
                 
     | 
| 
       44 
     | 
    
         
            -
                assert  
     | 
| 
       45 
     | 
    
         
            -
                assert  
     | 
| 
      
 43 
     | 
    
         
            +
                -> { subject.node(node) }.must_raise Vines::StreamErrors::UnsupportedStanzaType
         
     | 
| 
      
 44 
     | 
    
         
            +
                assert SERVER_STANZAS.empty?
         
     | 
| 
      
 45 
     | 
    
         
            +
                assert stream.verify
         
     | 
| 
       46 
46 
     | 
    
         
             
              end
         
     | 
| 
       47 
47 
     | 
    
         | 
| 
       48 
     | 
    
         
            -
               
     | 
| 
      
 48 
     | 
    
         
            +
              it 'raises improper-addressing stream error when to address is missing' do
         
     | 
| 
       49 
49 
     | 
    
         
             
                node = node(%Q{<message from="alice@wonderland.lit"/>})
         
     | 
| 
       50 
     | 
    
         
            -
                 
     | 
| 
       51 
     | 
    
         
            -
                assert  
     | 
| 
       52 
     | 
    
         
            -
                assert  
     | 
| 
      
 50 
     | 
    
         
            +
                -> { subject.node(node) }.must_raise Vines::StreamErrors::ImproperAddressing
         
     | 
| 
      
 51 
     | 
    
         
            +
                assert SERVER_STANZAS.empty?
         
     | 
| 
      
 52 
     | 
    
         
            +
                assert stream.verify
         
     | 
| 
       53 
53 
     | 
    
         
             
              end
         
     | 
| 
       54 
54 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
               
     | 
| 
      
 55 
     | 
    
         
            +
              it 'raises jid-malformed stanza error when to address is invalid' do
         
     | 
| 
       56 
56 
     | 
    
         
             
                node = node(%Q{<message from="alice@wonderland.lit" to=" "/>})
         
     | 
| 
       57 
     | 
    
         
            -
                 
     | 
| 
       58 
     | 
    
         
            -
                assert  
     | 
| 
       59 
     | 
    
         
            -
                assert  
     | 
| 
      
 57 
     | 
    
         
            +
                -> { subject.node(node) }.must_raise Vines::StanzaErrors::JidMalformed
         
     | 
| 
      
 58 
     | 
    
         
            +
                assert SERVER_STANZAS.empty?
         
     | 
| 
      
 59 
     | 
    
         
            +
                assert stream.verify
         
     | 
| 
       60 
60 
     | 
    
         
             
              end
         
     | 
| 
       61 
61 
     | 
    
         | 
| 
       62 
     | 
    
         
            -
               
     | 
| 
      
 62 
     | 
    
         
            +
              it 'raises improper-addressing stream error' do
         
     | 
| 
       63 
63 
     | 
    
         
             
                node = node(%Q{<message to="romeo@verona.lit"/>})
         
     | 
| 
       64 
     | 
    
         
            -
                 
     | 
| 
       65 
     | 
    
         
            -
                assert  
     | 
| 
       66 
     | 
    
         
            -
                assert  
     | 
| 
      
 64 
     | 
    
         
            +
                -> { subject.node(node) }.must_raise Vines::StreamErrors::ImproperAddressing
         
     | 
| 
      
 65 
     | 
    
         
            +
                assert SERVER_STANZAS.empty?
         
     | 
| 
      
 66 
     | 
    
         
            +
                assert stream.verify
         
     | 
| 
       67 
67 
     | 
    
         
             
              end
         
     | 
| 
       68 
68 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
               
     | 
| 
      
 69 
     | 
    
         
            +
              it 'raises jid-malformed stanza error for invalid from address' do
         
     | 
| 
       70 
70 
     | 
    
         
             
                node = node(%Q{<message from=" " to="romeo@verona.lit"/>})
         
     | 
| 
       71 
     | 
    
         
            -
                 
     | 
| 
       72 
     | 
    
         
            -
                assert  
     | 
| 
       73 
     | 
    
         
            -
                assert  
     | 
| 
      
 71 
     | 
    
         
            +
                -> { subject.node(node) }.must_raise Vines::StanzaErrors::JidMalformed
         
     | 
| 
      
 72 
     | 
    
         
            +
                assert SERVER_STANZAS.empty?
         
     | 
| 
      
 73 
     | 
    
         
            +
                assert stream.verify
         
     | 
| 
       74 
74 
     | 
    
         
             
              end
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
       76 
     | 
    
         
            -
               
     | 
| 
       77 
     | 
    
         
            -
                 
     | 
| 
      
 76 
     | 
    
         
            +
              it 'raises invalid-from stream error' do
         
     | 
| 
      
 77 
     | 
    
         
            +
                stream.expect(:remote_domain, 'wonderland.lit')
         
     | 
| 
       78 
78 
     | 
    
         
             
                node = node(%Q{<message from="alice@bogus.lit" to="romeo@verona.lit"/>})
         
     | 
| 
       79 
     | 
    
         
            -
                 
     | 
| 
       80 
     | 
    
         
            -
                assert  
     | 
| 
       81 
     | 
    
         
            -
                assert  
     | 
| 
      
 79 
     | 
    
         
            +
                -> { subject.node(node) }.must_raise Vines::StreamErrors::InvalidFrom
         
     | 
| 
      
 80 
     | 
    
         
            +
                assert SERVER_STANZAS.empty?
         
     | 
| 
      
 81 
     | 
    
         
            +
                assert stream.verify
         
     | 
| 
       82 
82 
     | 
    
         
             
              end
         
     | 
| 
       83 
83 
     | 
    
         | 
| 
       84 
     | 
    
         
            -
               
     | 
| 
       85 
     | 
    
         
            -
                 
     | 
| 
       86 
     | 
    
         
            -
                 
     | 
| 
      
 84 
     | 
    
         
            +
              it 'raises host-unknown stream error' do
         
     | 
| 
      
 85 
     | 
    
         
            +
                stream.expect(:remote_domain, 'wonderland.lit')
         
     | 
| 
      
 86 
     | 
    
         
            +
                stream.expect(:domain, 'verona.lit')
         
     | 
| 
       87 
87 
     | 
    
         
             
                node = node(%Q{<message from="alice@wonderland.lit" to="romeo@bogus.lit"/>})
         
     | 
| 
       88 
     | 
    
         
            -
                 
     | 
| 
       89 
     | 
    
         
            -
                assert  
     | 
| 
       90 
     | 
    
         
            -
                assert  
     | 
| 
      
 88 
     | 
    
         
            +
                -> { subject.node(node) }.must_raise Vines::StreamErrors::HostUnknown
         
     | 
| 
      
 89 
     | 
    
         
            +
                assert SERVER_STANZAS.empty?
         
     | 
| 
      
 90 
     | 
    
         
            +
                assert stream.verify
         
     | 
| 
       91 
91 
     | 
    
         
             
              end
         
     | 
| 
       92 
92 
     | 
    
         | 
| 
       93 
93 
     | 
    
         
             
              private
         
     |