diaspora-vines 0.2.0.develop.2 → 0.2.0.develop.3
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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/lib/vines/storage/sql.rb +6 -2
- data/lib/vines/stream/server/outbound/auth.rb +1 -1
- data/lib/vines/version.rb +1 -1
- data/test/cluster/subscriber_test.rb +2 -0
- data/test/storage/sql_schema.rb +4 -0
- data/test/storage/sql_test.rb +57 -67
- data/test/stream/server/auth_method_test.rb +68 -46
- data/test/stream/server/auth_test.rb +31 -22
- data/test/stream/server/outbound/auth_dialback_result_test.rb +28 -13
- data/test/stream/server/outbound/auth_external_test.rb +60 -30
- data/test/stream/server/outbound/auth_restart_test.rb +47 -23
- data/test/stream/server/outbound/auth_test.rb +62 -40
- data/test/stream/server/outbound/authoritative_test.rb +53 -33
- data/test/stream/server/outbound/start_test.rb +21 -9
- data/test/stream/server/ready_test.rb +77 -53
- data/test/stream/server/start_test.rb +65 -30
- data/test/test_helper.rb +8 -0
- metadata +34 -12
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require
|
3
|
+
require "test_helper"
|
4
4
|
|
5
5
|
describe Vines::Stream::Server::Auth do
|
6
6
|
# disable logging for tests
|
@@ -13,49 +13,58 @@ describe Vines::Stream::Server::Auth do
|
|
13
13
|
class << stream
|
14
14
|
attr_accessor :remote_domain
|
15
15
|
end
|
16
|
-
stream.remote_domain =
|
16
|
+
stream.remote_domain = "wonderland.lit"
|
17
17
|
end
|
18
18
|
|
19
|
-
describe
|
19
|
+
describe "when given a valid authzid" do
|
20
20
|
before do
|
21
|
-
stream.expect :cert_domain_matches?, true, [
|
22
|
-
stream.expect :write, nil, [
|
21
|
+
stream.expect :cert_domain_matches?, true, ["wonderland.lit"]
|
22
|
+
stream.expect :write, nil, [%(<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>)]
|
23
23
|
stream.expect :advance, nil, [Vines::Stream::Server::FinalRestart]
|
24
24
|
stream.expect :reset, nil
|
25
|
-
stream.expect :authentication_mechanisms, [
|
25
|
+
stream.expect :authentication_mechanisms, ["EXTERNAL"]
|
26
26
|
end
|
27
27
|
|
28
|
-
it
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
it "passes external auth with empty authzid" do
|
29
|
+
EM.run {
|
30
|
+
node = external("=")
|
31
|
+
subject.node(node)
|
32
|
+
stream.verify
|
33
|
+
EM.stop
|
34
|
+
}
|
32
35
|
end
|
33
36
|
|
34
|
-
it
|
35
|
-
|
36
|
-
|
37
|
-
|
37
|
+
it "passes external auth with authzid matching from domain" do
|
38
|
+
EM.run {
|
39
|
+
node = external(Base64.strict_encode64("wonderland.lit"))
|
40
|
+
subject.node(node)
|
41
|
+
stream.verify
|
42
|
+
EM.stop
|
43
|
+
}
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
41
|
-
describe
|
47
|
+
describe "when given an invalid authzid" do
|
42
48
|
before do
|
43
|
-
stream.expect :write, nil, [
|
49
|
+
stream.expect :write, nil, ["</stream:stream>"]
|
44
50
|
stream.expect :close_connection_after_writing, nil
|
45
51
|
stream.expect :error, nil, [Vines::SaslErrors::InvalidAuthzid]
|
46
|
-
stream.expect :authentication_mechanisms, [
|
52
|
+
stream.expect :authentication_mechanisms, ["EXTERNAL"]
|
47
53
|
end
|
48
54
|
|
49
|
-
it
|
50
|
-
|
51
|
-
|
52
|
-
|
55
|
+
it "fails external auth with mismatched from domain" do
|
56
|
+
EM.run {
|
57
|
+
node = external(Base64.strict_encode64("verona.lit"))
|
58
|
+
subject.node(node)
|
59
|
+
stream.verify
|
60
|
+
EM.stop
|
61
|
+
}
|
53
62
|
end
|
54
63
|
end
|
55
64
|
|
56
65
|
private
|
57
66
|
|
58
67
|
def external(authzid)
|
59
|
-
node(%
|
68
|
+
node(%(<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="EXTERNAL">#{authzid}</auth>))
|
60
69
|
end
|
61
70
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require
|
3
|
+
require "test_helper"
|
4
4
|
|
5
5
|
describe Vines::Stream::Server::Outbound::AuthDialbackResult do
|
6
6
|
before do
|
@@ -9,24 +9,39 @@ describe Vines::Stream::Server::Outbound::AuthDialbackResult do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_invalid_stanza
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
EM.run {
|
13
|
+
node = node("<message/>")
|
14
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
15
|
+
assert @stream.verify
|
16
|
+
EM.stop
|
17
|
+
}
|
15
18
|
end
|
16
19
|
|
17
20
|
def test_invalid_result
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
EM.run {
|
22
|
+
node = node(
|
23
|
+
%(<db:result xmlns:db="#{Vines::NAMESPACES[:legacy_dialback]}" ) +
|
24
|
+
%(from="remote.host" to="local.host" type="invalid"/>)
|
25
|
+
)
|
26
|
+
@stream.expect(:close_connection, nil)
|
27
|
+
@state.node(node)
|
28
|
+
assert @stream.verify
|
29
|
+
EM.stop
|
30
|
+
}
|
22
31
|
end
|
23
32
|
|
24
33
|
def test_valid_result
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
34
|
+
EM.run {
|
35
|
+
node = node(
|
36
|
+
%(<db:result xmlns:db="#{Vines::NAMESPACES[:legacy_dialback]}" ) +
|
37
|
+
%(from="remote.host" to="local.host" type="valid"/>)
|
38
|
+
)
|
39
|
+
@stream.expect(:advance, nil, [Vines::Stream::Server::Ready])
|
40
|
+
@stream.expect(:notify_connected, nil)
|
41
|
+
@state.node(node)
|
42
|
+
assert @stream.verify
|
43
|
+
EM.stop
|
44
|
+
}
|
30
45
|
end
|
31
46
|
|
32
47
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require
|
3
|
+
require "test_helper"
|
4
4
|
|
5
5
|
describe Vines::Stream::Server::Outbound::AuthExternal do
|
6
6
|
before do
|
@@ -9,62 +9,92 @@ describe Vines::Stream::Server::Outbound::AuthExternal do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_invalid_element
|
12
|
-
|
13
|
-
|
12
|
+
EM.run {
|
13
|
+
node = node("<message/>")
|
14
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
15
|
+
EM.stop
|
16
|
+
}
|
14
17
|
end
|
15
18
|
|
16
19
|
def test_invalid_sasl_element
|
17
|
-
|
18
|
-
|
20
|
+
EM.run {
|
21
|
+
node = node(%(<message xmlns="#{Vines::NAMESPACES[:sasl]}"/>))
|
22
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
23
|
+
EM.stop
|
24
|
+
}
|
19
25
|
end
|
20
26
|
|
21
27
|
def test_missing_namespace
|
22
|
-
|
23
|
-
|
28
|
+
EM.run {
|
29
|
+
node = node("<stream:features/>")
|
30
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
31
|
+
EM.stop
|
32
|
+
}
|
24
33
|
end
|
25
34
|
|
26
35
|
def test_invalid_namespace
|
27
|
-
|
28
|
-
|
36
|
+
EM.run {
|
37
|
+
node = node(%(<stream:features xmlns="bogus"/>))
|
38
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
39
|
+
EM.stop
|
40
|
+
}
|
29
41
|
end
|
30
42
|
|
31
43
|
def test_missing_mechanisms
|
32
|
-
|
33
|
-
|
44
|
+
EM.run {
|
45
|
+
node = node(%(<stream:features xmlns:stream="#{Vines::NAMESPACES[:stream]}"/>))
|
46
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
47
|
+
EM.stop
|
48
|
+
}
|
34
49
|
end
|
35
50
|
|
36
51
|
def test_missing_mechanisms_namespace
|
37
|
-
|
38
|
-
|
52
|
+
EM.run {
|
53
|
+
node = node(%(<stream:features xmlns:stream="#{Vines::NAMESPACES[:stream]}"><mechanisms/></stream:features>))
|
54
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
55
|
+
EM.stop
|
56
|
+
}
|
39
57
|
end
|
40
58
|
|
41
59
|
def test_missing_mechanism
|
42
|
-
|
43
|
-
|
44
|
-
|
60
|
+
EM.run {
|
61
|
+
mechanisms = %(<mechanisms xmlns="#{Vines::NAMESPACES[:sasl]}"/>)
|
62
|
+
node = node(%(<stream:features xmlns:stream="#{Vines::NAMESPACES[:stream]}">#{mechanisms}</stream:features>))
|
63
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
64
|
+
EM.stop
|
65
|
+
}
|
45
66
|
end
|
46
67
|
|
47
68
|
def test_missing_mechanism_text
|
48
|
-
|
49
|
-
|
50
|
-
|
69
|
+
EM.run {
|
70
|
+
mechanisms = %(<mechanisms xmlns="#{Vines::NAMESPACES[:sasl]}"><mechanism></mechanism></mechanisms>)
|
71
|
+
node = node(%(<stream:features xmlns:stream="#{Vines::NAMESPACES[:stream]}">#{mechanisms}</stream:features>))
|
72
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
73
|
+
EM.stop
|
74
|
+
}
|
51
75
|
end
|
52
76
|
|
53
77
|
def test_invalid_mechanism_text
|
54
|
-
|
55
|
-
|
56
|
-
|
78
|
+
EM.run {
|
79
|
+
mechanisms = %(<mechanisms xmlns="#{Vines::NAMESPACES[:sasl]}"><mechanism>BOGUS</mechanism></mechanisms>)
|
80
|
+
node = node(%(<stream:features xmlns:stream="#{Vines::NAMESPACES[:stream]}">#{mechanisms}</stream:features>))
|
81
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
82
|
+
EM.stop
|
83
|
+
}
|
57
84
|
end
|
58
85
|
|
59
86
|
def test_valid_mechanism
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
87
|
+
EM.run {
|
88
|
+
@stream.expect(:domain, "wonderland.lit")
|
89
|
+
expected = %(<auth xmlns="#{Vines::NAMESPACES[:sasl]}" mechanism="EXTERNAL">d29uZGVybGFuZC5saXQ=</auth>)
|
90
|
+
@stream.expect(:write, nil, [expected])
|
91
|
+
@stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::AuthExternalResult.new(@stream)])
|
92
|
+
mechanisms = %(<mechanisms xmlns="#{Vines::NAMESPACES[:sasl]}"><mechanism>EXTERNAL</mechanism></mechanisms>)
|
93
|
+
node = node(%(<stream:features xmlns:stream="#{Vines::NAMESPACES[:stream]}">#{mechanisms}</stream:features>))
|
94
|
+
@state.node(node)
|
95
|
+
assert @stream.verify
|
96
|
+
EM.stop
|
97
|
+
}
|
68
98
|
end
|
69
99
|
|
70
100
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require
|
3
|
+
require "test_helper"
|
4
4
|
|
5
5
|
describe Vines::Stream::Server::Outbound::AuthRestart do
|
6
6
|
before do
|
@@ -9,40 +9,64 @@ describe Vines::Stream::Server::Outbound::AuthRestart do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_missing_namespace
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
EM.run {
|
13
|
+
node = node("<stream:stream/>")
|
14
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
15
|
+
assert @stream.verify
|
16
|
+
EM.stop
|
17
|
+
}
|
15
18
|
end
|
16
19
|
|
17
20
|
def test_invalid_namespace
|
18
|
-
|
19
|
-
|
21
|
+
EM.run {
|
22
|
+
node = node(%(<stream:stream xmlns="#{Vines::NAMESPACES[:stream]}"/>))
|
23
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
24
|
+
EM.stop
|
25
|
+
}
|
20
26
|
end
|
21
27
|
|
22
28
|
def test_valid_stream
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
29
|
+
EM.run {
|
30
|
+
node = node(
|
31
|
+
%(<stream:stream xmlns="jabber:client" xmlns:stream="#{Vines::NAMESPACES[:stream]}" ) +
|
32
|
+
%(xml:lang="en" id="1234" from="host.com" version="1.0">)
|
33
|
+
)
|
34
|
+
@stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::AuthExternal])
|
35
|
+
@stream.expect(:dialback_retry?, false)
|
36
|
+
@state.node(node)
|
37
|
+
assert @stream.verify
|
38
|
+
EM.stop
|
39
|
+
}
|
28
40
|
end
|
29
41
|
|
30
42
|
def test_valid_stream_restart
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
43
|
+
EM.run {
|
44
|
+
node = node(
|
45
|
+
%(<stream:stream xmlns="jabber:client" xmlns:stream="#{Vines::NAMESPACES[:stream]}" ) +
|
46
|
+
%(xml:lang="en" id="1234" from="host.com" version="1.0">)
|
47
|
+
)
|
48
|
+
@stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::Auth])
|
49
|
+
@stream.expect(:outbound_tls_required?, false)
|
50
|
+
@stream.expect(:dialback_retry?, true)
|
51
|
+
@state.node(node)
|
52
|
+
assert @stream.verify
|
53
|
+
EM.stop
|
54
|
+
}
|
37
55
|
end
|
38
56
|
|
39
57
|
def test_valid_stream_required_tls
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
58
|
+
EM.run {
|
59
|
+
node = node(
|
60
|
+
%(<stream:stream xmlns="jabber:client" xmlns:stream="#{Vines::NAMESPACES[:stream]}") +
|
61
|
+
%( xml:lang="en" id="1234" from="host.com" version="1.0">)
|
62
|
+
)
|
63
|
+
@stream.expect(:close_connection, nil)
|
64
|
+
@stream.expect(:outbound_tls_required?, true)
|
65
|
+
@stream.expect(:dialback_retry?, true)
|
66
|
+
@state.node(node)
|
67
|
+
assert @stream.verify
|
68
|
+
EM.stop
|
69
|
+
}
|
46
70
|
end
|
47
71
|
|
48
72
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require
|
3
|
+
require "test_helper"
|
4
4
|
|
5
5
|
class OperatorWrapper
|
6
6
|
def <<(stream)
|
@@ -30,57 +30,79 @@ describe Vines::Stream::Server::Outbound::Auth do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_missing_children
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
EM.run {
|
34
|
+
node = node("<stream:features/>")
|
35
|
+
@stream.expect(:dialback_verify_key?, false)
|
36
|
+
@stream.expect(:outbound_tls_required, nil, [Boolean])
|
37
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
38
|
+
assert @stream.verify
|
39
|
+
EM.stop
|
40
|
+
}
|
38
41
|
end
|
39
42
|
|
40
43
|
def test_invalid_children
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
EM.run {
|
45
|
+
node = node(%(<stream:features><message/></stream:features>))
|
46
|
+
@stream.expect(:dialback_verify_key?, false)
|
47
|
+
@stream.expect(:outbound_tls_required, nil, [Boolean])
|
48
|
+
assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) }
|
49
|
+
assert @stream.verify
|
50
|
+
EM.stop
|
51
|
+
}
|
46
52
|
end
|
47
53
|
|
48
54
|
def test_valid_stream_features
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
55
|
+
EM.run {
|
56
|
+
node = node(
|
57
|
+
%(<stream:features xmlns:stream="#{Vines::NAMESPACES[:stream]}">) +
|
58
|
+
%(<starttls xmlns="#{Vines::NAMESPACES[:tls]}"><required/></starttls>) +
|
59
|
+
%(<dialback xmlns="#{Vines::NAMESPACES[:dialback]}"/></stream:features>)
|
60
|
+
)
|
61
|
+
starttls = %(<starttls xmlns='#{Vines::NAMESPACES[:tls]}'/>)
|
62
|
+
@stream.expect(:dialback_verify_key?, false)
|
63
|
+
@stream.expect(:outbound_tls_required, nil, [Boolean])
|
64
|
+
@stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::TLSResult])
|
65
|
+
@stream.expect(:write, nil, [starttls])
|
66
|
+
@state.node(node)
|
67
|
+
assert @stream.verify
|
68
|
+
EM.stop
|
69
|
+
}
|
57
70
|
end
|
58
71
|
|
59
72
|
def test_dialback_feature_only
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
73
|
+
EM.run {
|
74
|
+
node = node(
|
75
|
+
%(<stream:features xmlns:stream="#{Vines::NAMESPACES[:stream]}">) +
|
76
|
+
%(<dialback xmlns="#{Vines::NAMESPACES[:dialback]}"/></stream:features>)
|
77
|
+
)
|
78
|
+
@stream.expect(:dialback_verify_key?, false)
|
79
|
+
@stream.expect(:router, OperatorWrapper.new)
|
80
|
+
@stream.expect(:domain, "local.host")
|
81
|
+
@stream.expect(:remote_domain, "remote.host")
|
82
|
+
@stream.expect(:domain, "local.host")
|
83
|
+
@stream.expect(:remote_domain, "remote.host")
|
84
|
+
@stream.expect(:id, "1234")
|
85
|
+
@stream.expect(:write, nil, [String])
|
86
|
+
@stream.expect(:outbound_tls_required, nil, [Boolean])
|
87
|
+
@stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::AuthDialbackResult])
|
88
|
+
@stream.expect(:state, StateWrapper.new)
|
89
|
+
@state.node(node)
|
90
|
+
assert @stream.verify
|
91
|
+
EM.stop
|
92
|
+
}
|
74
93
|
end
|
75
94
|
|
76
95
|
def test_dialback_verify_key
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
96
|
+
EM.run {
|
97
|
+
node = node("<stream:stream/>")
|
98
|
+
@stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::Authoritative])
|
99
|
+
@stream.expect(:dialback_verify_key?, true)
|
100
|
+
@stream.expect(:callback!, nil)
|
101
|
+
@stream.expect(:outbound_tls_required, nil, [Boolean])
|
102
|
+
@state.node(node)
|
103
|
+
assert @stream.verify
|
104
|
+
EM.stop
|
105
|
+
}
|
84
106
|
end
|
85
107
|
|
86
108
|
private
|