wampproto 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +39 -0
  4. data/CHANGELOG.md +5 -0
  5. data/CODE_OF_CONDUCT.md +84 -0
  6. data/LICENSE +22 -0
  7. data/README.md +35 -0
  8. data/Rakefile +12 -0
  9. data/Steepfile +33 -0
  10. data/lib/wampproto/acceptor/authenticator.rb +14 -0
  11. data/lib/wampproto/acceptor/request.rb +58 -0
  12. data/lib/wampproto/acceptor/response.rb +19 -0
  13. data/lib/wampproto/acceptor.rb +183 -0
  14. data/lib/wampproto/auth/anonymous.rb +14 -0
  15. data/lib/wampproto/auth/base.rb +20 -0
  16. data/lib/wampproto/auth/cra.rb +84 -0
  17. data/lib/wampproto/auth/cryptosign.rb +86 -0
  18. data/lib/wampproto/auth/helpers.rb +25 -0
  19. data/lib/wampproto/auth/ticket.rb +27 -0
  20. data/lib/wampproto/auth.rb +14 -0
  21. data/lib/wampproto/broker.rb +155 -0
  22. data/lib/wampproto/dealer.rb +143 -0
  23. data/lib/wampproto/id_generator.rb +23 -0
  24. data/lib/wampproto/joiner.rb +78 -0
  25. data/lib/wampproto/message/abort.rb +32 -0
  26. data/lib/wampproto/message/authenticate.rb +25 -0
  27. data/lib/wampproto/message/base.rb +30 -0
  28. data/lib/wampproto/message/call.rb +33 -0
  29. data/lib/wampproto/message/challenge.rb +25 -0
  30. data/lib/wampproto/message/error.rb +27 -0
  31. data/lib/wampproto/message/event.rb +33 -0
  32. data/lib/wampproto/message/goodbye.rb +25 -0
  33. data/lib/wampproto/message/hello.rb +64 -0
  34. data/lib/wampproto/message/invocation.rb +33 -0
  35. data/lib/wampproto/message/publish.rb +33 -0
  36. data/lib/wampproto/message/published.rb +25 -0
  37. data/lib/wampproto/message/register.rb +26 -0
  38. data/lib/wampproto/message/registered.rb +25 -0
  39. data/lib/wampproto/message/result.rb +32 -0
  40. data/lib/wampproto/message/subscribe.rb +26 -0
  41. data/lib/wampproto/message/subscribed.rb +25 -0
  42. data/lib/wampproto/message/unregister.rb +25 -0
  43. data/lib/wampproto/message/unregistered.rb +24 -0
  44. data/lib/wampproto/message/unsubscribe.rb +25 -0
  45. data/lib/wampproto/message/unsubscribed.rb +24 -0
  46. data/lib/wampproto/message/welcome.rb +41 -0
  47. data/lib/wampproto/message/yield.rb +32 -0
  48. data/lib/wampproto/message.rb +108 -0
  49. data/lib/wampproto/message_with_recipient.rb +13 -0
  50. data/lib/wampproto/serializer/cbor.rb +18 -0
  51. data/lib/wampproto/serializer/json.rb +18 -0
  52. data/lib/wampproto/serializer/msgpack.rb +18 -0
  53. data/lib/wampproto/serializer.rb +5 -0
  54. data/lib/wampproto/session.rb +144 -0
  55. data/lib/wampproto/session_details.rb +24 -0
  56. data/lib/wampproto/validate.rb +52 -0
  57. data/lib/wampproto/version.rb +5 -0
  58. data/lib/wampproto.rb +32 -0
  59. data/sig/cbor.rbs +5 -0
  60. data/sig/ed25519/signing_key.rbs +7 -0
  61. data/sig/ed25519/verify_key.rbs +7 -0
  62. data/sig/message_pack.rbs +5 -0
  63. data/sig/wampproto/acceptor/authenticator.rbs +9 -0
  64. data/sig/wampproto/acceptor/request.rbs +46 -0
  65. data/sig/wampproto/acceptor/response.rbs +25 -0
  66. data/sig/wampproto/acceptor.rbs +86 -0
  67. data/sig/wampproto/auth/anonymous.rbs +13 -0
  68. data/sig/wampproto/auth/base.rbs +25 -0
  69. data/sig/wampproto/auth/cra.rbs +34 -0
  70. data/sig/wampproto/auth/cryptosign.rbs +38 -0
  71. data/sig/wampproto/auth/helpers.rbs +16 -0
  72. data/sig/wampproto/auth/ticket.rbs +21 -0
  73. data/sig/wampproto/broker.rbs +48 -0
  74. data/sig/wampproto/dealer.rbs +49 -0
  75. data/sig/wampproto/id_generator.rbs +17 -0
  76. data/sig/wampproto/joiner.rbs +43 -0
  77. data/sig/wampproto/message/abort.rbs +31 -0
  78. data/sig/wampproto/message/authenticate.rbs +20 -0
  79. data/sig/wampproto/message/base.rbs +14 -0
  80. data/sig/wampproto/message/call.rbs +34 -0
  81. data/sig/wampproto/message/challenge.rbs +20 -0
  82. data/sig/wampproto/message/error.rbs +28 -0
  83. data/sig/wampproto/message/event.rbs +34 -0
  84. data/sig/wampproto/message/goodbye.rbs +21 -0
  85. data/sig/wampproto/message/hello.rbs +39 -0
  86. data/sig/wampproto/message/invocation.rbs +34 -0
  87. data/sig/wampproto/message/publish.rbs +32 -0
  88. data/sig/wampproto/message/published.rbs +20 -0
  89. data/sig/wampproto/message/register.rbs +24 -0
  90. data/sig/wampproto/message/registered.rbs +20 -0
  91. data/sig/wampproto/message/result.rbs +32 -0
  92. data/sig/wampproto/message/subscribe.rbs +24 -0
  93. data/sig/wampproto/message/subscribed.rbs +20 -0
  94. data/sig/wampproto/message/unregister.rbs +20 -0
  95. data/sig/wampproto/message/unregistered.rbs +16 -0
  96. data/sig/wampproto/message/unsubscribe.rbs +20 -0
  97. data/sig/wampproto/message/unsubscribed.rbs +16 -0
  98. data/sig/wampproto/message/welcome.rbs +36 -0
  99. data/sig/wampproto/message/yield.rbs +30 -0
  100. data/sig/wampproto/message.rbs +59 -0
  101. data/sig/wampproto/message_with_recipient.rbs +15 -0
  102. data/sig/wampproto/serializer/cbor.rbs +10 -0
  103. data/sig/wampproto/serializer/json.rbs +11 -0
  104. data/sig/wampproto/serializer/msgpack.rbs +11 -0
  105. data/sig/wampproto/session.rbs +43 -0
  106. data/sig/wampproto/session_details.rbs +25 -0
  107. data/sig/wampproto/validate.rbs +18 -0
  108. data/sig/wampproto.rbs +17 -0
  109. data/wampproto.gemspec +39 -0
  110. metadata +196 -0
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "message/base"
4
+ require_relative "message/hello"
5
+ require_relative "message/welcome"
6
+ require_relative "message/abort"
7
+ require_relative "message/challenge"
8
+ require_relative "message/authenticate"
9
+ require_relative "message/goodbye"
10
+
11
+ require_relative "message/error"
12
+
13
+ require_relative "message/publish"
14
+ require_relative "message/published"
15
+
16
+ require_relative "message/subscribe"
17
+ require_relative "message/subscribed"
18
+ require_relative "message/unsubscribe"
19
+ require_relative "message/unsubscribed"
20
+ require_relative "message/event"
21
+
22
+ require_relative "message/call"
23
+ require_relative "message/result"
24
+
25
+ require_relative "message/register"
26
+ require_relative "message/registered"
27
+ require_relative "message/unregister"
28
+ require_relative "message/unregistered"
29
+
30
+ require_relative "message/invocation"
31
+ require_relative "message/yield"
32
+
33
+ module Wampproto
34
+ # message root
35
+ module Message
36
+ module Type
37
+ HELLO = 1
38
+ WELCOME = 2
39
+ ABORT = 3
40
+ CHALLENGE = 4
41
+ AUTHENTICATE = 5
42
+ GOODBYE = 6
43
+
44
+ ERROR = 8
45
+
46
+ PUBLISH = 16
47
+ PUBLISHED = 17
48
+
49
+ SUBSCRIBE = 32
50
+ SUBSCRIBED = 33
51
+ UNSUBSCRIBE = 34
52
+ UNSUBSCRIBED = 35
53
+ EVENT = 36
54
+
55
+ CALL = 48
56
+ CANCEL = 49
57
+ RESULT = 50
58
+
59
+ REGISTER = 64
60
+ REGISTERED = 65
61
+ UNREGISTER = 66
62
+ UNREGISTERED = 67
63
+ INVOCATION = 68
64
+ INTERRUPT = 69
65
+ YIELD = 70
66
+ end
67
+
68
+ HANDLER = {
69
+ Type::HELLO => Hello,
70
+ Type::WELCOME => Welcome,
71
+ Type::ABORT => Abort,
72
+ Type::CHALLENGE => Challenge,
73
+ Type::AUTHENTICATE => Authenticate,
74
+ Type::GOODBYE => Goodbye,
75
+
76
+ Type::ERROR => Error,
77
+
78
+ Type::PUBLISH => Publish,
79
+ Type::PUBLISHED => Published,
80
+
81
+ Type::SUBSCRIBE => Subscribe,
82
+ Type::SUBSCRIBED => Subscribed,
83
+ Type::UNSUBSCRIBE => Unsubscribe,
84
+ Type::UNSUBSCRIBED => Unsubscribed,
85
+ Type::EVENT => Event,
86
+
87
+ Type::CALL => Call,
88
+ Type::RESULT => Result,
89
+
90
+ Type::REGISTER => Register,
91
+ Type::REGISTERED => Registered,
92
+ Type::UNREGISTER => Unregister,
93
+ Type::UNREGISTERED => Unregistered,
94
+ Type::INVOCATION => Invocation,
95
+ Type::YIELD => Yield
96
+ }.freeze
97
+
98
+ def self.resolve(wamp_message)
99
+ type, = Validate.array!("Wamp Message", wamp_message)
100
+ begin
101
+ HANDLER[type].parse(wamp_message)
102
+ rescue StandardError => e
103
+ p wamp_message
104
+ raise e
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ # handler class for dealer and broker responses
5
+ class MessageWithRecipient
6
+ attr_reader :message, :recipient
7
+
8
+ def initialize(message, recipient)
9
+ @message = message
10
+ @recipient = recipient
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cbor"
4
+
5
+ module Wampproto
6
+ module Serializer
7
+ # Add common API for serializer
8
+ class Cbor
9
+ def self.serialize(message)
10
+ CBOR.encode(message.marshal).unpack("c*")
11
+ end
12
+
13
+ def self.deserialize(message)
14
+ CBOR.decode(message.pack("c*")).then { Message.resolve(_1) }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module Wampproto
6
+ module Serializer
7
+ # Add common API for serializer
8
+ class JSON
9
+ def self.serialize(message)
10
+ ::JSON.dump(message.marshal)
11
+ end
12
+
13
+ def self.deserialize(message)
14
+ ::JSON.parse(message).then { Message.resolve(_1) }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "msgpack"
4
+
5
+ module Wampproto
6
+ module Serializer
7
+ # Add common API for serializer
8
+ class Msgpack
9
+ def self.serialize(message)
10
+ ::MessagePack.pack(message.marshal).unpack("c*")
11
+ end
12
+
13
+ def self.deserialize(message)
14
+ ::MessagePack.unpack(message.pack("c*")).then { Message.resolve(_1) }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "serializer/json"
4
+ require_relative "serializer/msgpack"
5
+ require_relative "serializer/cbor"
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ # Session
5
+ class Session # rubocop:disable Metrics/ClassLength
6
+ attr_reader :serializer
7
+
8
+ def initialize(serializer = Serializer::JSON)
9
+ @serializer = serializer
10
+ init_state
11
+ end
12
+
13
+ ACCESSORS = %i[
14
+ call_requests
15
+ register_requests
16
+ registrations
17
+ invocation_requests
18
+ unregister_requests
19
+
20
+ publish_requests
21
+ subscribe_requests
22
+ subscriptions
23
+ unsubscribe_requests
24
+ ].freeze
25
+
26
+ def send_message(msg) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
27
+ case msg
28
+ when Message::Call
29
+ call_requests[msg.request_id] = msg.request_id
30
+ when Message::Register
31
+ register_requests[msg.request_id] = msg.request_id
32
+ when Message::Unregister
33
+ unregister_requests[msg.request_id] = msg.registration_id
34
+ when Message::Yield
35
+ unless invocation_requests.include?(msg.request_id)
36
+ raise ValueError, "cannot yield for unknown invocation request"
37
+ end
38
+
39
+ invocation_requests.delete(msg.request_id)
40
+ when Message::Publish
41
+ publish_requests[msg.request_id] = msg.request_id if msg.options.fetch(:acknowledge, false)
42
+ when Message::Subscribe
43
+ subscribe_requests[msg.request_id] = msg.request_id
44
+ when Message::Unsubscribe
45
+ unsubscribe_requests[msg.request_id] = msg.subscription_id
46
+ when Message::Error
47
+ error_message = "send only supported for invocation error"
48
+ raise ValueError, error_message if msg.message_type != Message::Invocation.type
49
+
50
+ invocation_requests.delete(msg.request_id)
51
+ end
52
+
53
+ serializer.serialize(msg)
54
+ end
55
+
56
+ def receive(data)
57
+ msg = serializer.deserialize(data)
58
+ receive_message(msg)
59
+ end
60
+
61
+ def receive_message(msg) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
62
+ case msg
63
+ when Message::Result
64
+ error_message = "received RESULT for invalid request_id"
65
+ raise ValueError, error_message unless call_requests.delete(msg.request_id)
66
+ when Message::Registered
67
+ error_message = "received REGISTERED for invalid request_id"
68
+ raise ValueError, error_message unless register_requests.delete(msg.request_id)
69
+
70
+ registrations[msg.registration_id] = msg.registration_id
71
+ when Message::Unregistered
72
+ error_message = "received UNREGISTERED for invalid request_id"
73
+ registration_id = unregister_requests.delete(msg.request_id)
74
+ raise ValueError, error_message unless registration_id
75
+
76
+ error_message = "received UNREGISTERED for invalid registration_id"
77
+ raise ValueError, error_message unless registrations.delete(registration_id)
78
+ when Message::Invocation
79
+ error_message = "received INVOCATION for invalid registration_id"
80
+ raise ValueError, error_message unless registrations.delete(msg.registration_id)
81
+
82
+ invocation_requests[msg.request_id] = msg.request_id
83
+ when Message::Published
84
+ error_message = "received PUBLISHED for invalid topic"
85
+ raise ValueError, error_message unless publish_requests.delete(msg.request_id)
86
+ when Message::Subscribed
87
+ error_message = "received SUBSCRIBED for invalid request_id"
88
+ raise ValueError, error_message unless subscribe_requests.delete(msg.request_id)
89
+
90
+ subscriptions[msg.subscription_id] = msg.subscription_id
91
+ when Message::Unsubscribed
92
+ error_message = "received UNSUBSCRIBED for invalid request_id"
93
+ subscription_id = unsubscribe_requests.delete(msg.request_id)
94
+ raise ValueError, error_message unless subscription_id
95
+
96
+ error_message = "received UNSUBSCRIBED for invalid subscription_id"
97
+ raise ValueError, error_message unless subscriptions.delete(subscription_id)
98
+ when Message::Event
99
+ error_message = "received EVENT for invalid subscription_id"
100
+ raise ValueError, error_message unless subscriptions.include?(msg.subscription_id)
101
+ when Message::Error
102
+ case msg.message_type
103
+ when Message::Call.type
104
+ error_message = "received ERROR for invalid call request"
105
+ raise ValueError, error_message unless call_requests.delete(msg.request_id)
106
+ when Message::Register.type
107
+ error_message = "received ERROR for invalid register request"
108
+ raise ValueError, error_message unless register_requests.delete(msg.request_id)
109
+ when Message::Unregister.type
110
+ error_message = "received ERROR for invalid unregister request"
111
+ raise ValueError, error_message unless unregister_requests.delete(msg.request_id)
112
+ when Message::Subscribe.type
113
+ error_message = "received ERROR for invalid subscribe request"
114
+ raise ValueError, error_message unless subscribe_requests.delete(msg.request_id)
115
+ when Message::Unsubscribe.type
116
+ error_message = "received ERROR for invalid unsubscribe request"
117
+ raise ValueError, error_message unless unsubscribe_requests.delete(msg.request_id)
118
+ when Message::Publish.type
119
+ error_message = "received ERROR for invalid publish request"
120
+ raise ValueError, error_message unless publish_requests.delete(msg.request_id)
121
+ else
122
+ error_message = "unknown error message type #{msg.class}"
123
+ raise ValueError, error_message
124
+ end
125
+ when Message::Abort
126
+ p [:session, :abort, msg]
127
+ else
128
+ raise ValueError, "unknown message #{msg.class}"
129
+ end
130
+
131
+ msg
132
+ end
133
+
134
+ private
135
+
136
+ attr_reader(*ACCESSORS)
137
+
138
+ def init_state
139
+ ACCESSORS.each do |attr|
140
+ instance_variable_set("@#{attr}", {})
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ # Session Details
5
+ class SessionDetails
6
+ attr_reader :session_id, :realm, :authid, :authrole
7
+
8
+ def initialize(session_id, realm, authid, authrole)
9
+ @session_id = session_id
10
+ @realm = realm
11
+ @authid = authid
12
+ @authrole = authrole
13
+ end
14
+
15
+ def ==(other)
16
+ return false unless other.instance_of?(SessionDetails)
17
+
18
+ session_id == other.session_id &&
19
+ realm == other.realm &&
20
+ authid == other.authid &&
21
+ authrole == other.authrole
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ # validation
5
+ class Validate
6
+ class << self
7
+ def int!(name, value)
8
+ return value if value.is_a?(Integer)
9
+
10
+ raise ArgumentError, "The #{name} argument should be an integer."
11
+ end
12
+
13
+ def string!(name, value)
14
+ return value if value.is_a?(String)
15
+
16
+ raise ArgumentError, "The #{name} argument should be a string."
17
+ end
18
+
19
+ def hash!(name, value)
20
+ return value.transform_keys(&:to_sym) if value.is_a?(Hash)
21
+
22
+ raise ArgumentError, "The #{name} argument should be a dictionary."
23
+ end
24
+
25
+ def array!(name, value)
26
+ return value if value.is_a?(Array)
27
+
28
+ raise ArgumentError, "The #{name} argument should be a list."
29
+ end
30
+
31
+ def length!(array, expected_length)
32
+ return array if array.length == expected_length
33
+
34
+ raise ArgumentError, "The response message length should be #{expected_length} but got #{array.length} "
35
+ end
36
+
37
+ def greater_than_equal!(array, expected_length)
38
+ return array if array.length >= expected_length
39
+
40
+ raise ArgumentError, "The response message length is #{array.length} but it should be #{expected_length} "
41
+ end
42
+
43
+ def options!(options, valid_keys)
44
+ options.each_key do |key|
45
+ raise ArgumentError, "Unrecognized option: #{key.inspect}" unless valid_keys.include?(key)
46
+ end
47
+
48
+ options
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ VERSION = "0.1.0"
5
+ end
data/lib/wampproto.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "wampproto/version"
4
+ require_relative "wampproto/validate"
5
+ require_relative "wampproto/message"
6
+ require_relative "wampproto/serializer"
7
+ require_relative "wampproto/auth"
8
+ require_relative "wampproto/id_generator"
9
+ require_relative "wampproto/session_details"
10
+ require_relative "wampproto/joiner"
11
+ require_relative "wampproto/acceptor"
12
+ require_relative "wampproto/session"
13
+ require_relative "wampproto/message_with_recipient"
14
+ require_relative "wampproto/dealer"
15
+ require_relative "wampproto/broker"
16
+
17
+ module Wampproto
18
+ class Error < StandardError; end
19
+
20
+ # ProtocolViolation Exception
21
+ class ProtocolViolation < StandardError
22
+ attr_reader :uri
23
+
24
+ def initialize(msg = "Protocol Violation", uri = "wamp.error.protocol_violation")
25
+ @uri = uri
26
+ super(msg)
27
+ end
28
+ end
29
+
30
+ class ValueError < StandardError
31
+ end
32
+ end
data/sig/cbor.rbs ADDED
@@ -0,0 +1,5 @@
1
+ module CBOR
2
+ def self.encode: (untyped message) -> String
3
+
4
+ def self.decode: (String message) -> untyped
5
+ end
@@ -0,0 +1,7 @@
1
+ module Ed25519
2
+ class SigningKey
3
+ def initialize: (String private_key) -> void
4
+
5
+ def sign: (String challenge) -> untyped
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Ed25519
2
+ class VerifyKey
3
+ def initialize: (String private_key) -> void
4
+
5
+ def verify: (String signature, String message) -> bool
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module MessagePack
2
+ def self.pack: (untyped message) -> String
3
+
4
+ def self.unpack: (String message) -> untyped
5
+ end
@@ -0,0 +1,9 @@
1
+ module Wampproto
2
+ class Acceptor
3
+ # Interface to handle Authentications
4
+ class Authenticator
5
+ def self.authenticate: (Request request) -> Response
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,46 @@
1
+ module Wampproto
2
+ class Acceptor
3
+ # Request object sent for authentication
4
+ class Request
5
+ @hello: Message::Hello
6
+
7
+ extend Forwardable
8
+
9
+ attr_reader realm: String
10
+
11
+ attr_reader authid: String
12
+
13
+ attr_reader authextra: Hash[Symbol, untyped]
14
+
15
+ attr_reader hello: Message::Hello
16
+
17
+ def initialize: (Message::Hello hello) -> void
18
+
19
+ def authmethod: () -> Symbol
20
+
21
+ def public_key: () -> String
22
+
23
+ def secret: () -> nil
24
+
25
+ def ticket: () -> nil
26
+ end
27
+
28
+ # AuthenticateRequest
29
+ class AuthenticateRequest < Request
30
+ @authenticate: Message::Authenticate
31
+
32
+ @hello_request: Request
33
+
34
+ extend Forwardable
35
+
36
+ attr_reader authenticate: Message::Authenticate
37
+
38
+ def initialize: (Message::Authenticate authenticate, Request hello_request) -> void
39
+
40
+ def ticket: () -> (String | nil)
41
+
42
+ def secret: () -> (String | nil)
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,25 @@
1
+ module Wampproto
2
+ class Acceptor
3
+ # Request object sent for authentication
4
+ class Response
5
+ @authid: String
6
+
7
+ @authrole: String
8
+
9
+ @secret: String
10
+
11
+ attr_reader authid: String
12
+
13
+ attr_reader authrole: String
14
+
15
+ attr_reader secret: String
16
+
17
+ def initialize: (String authid, String authrole, ?String? secret) -> void
18
+
19
+ alias ticket secret
20
+
21
+ alias public_key secret
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,86 @@
1
+ module Wampproto
2
+ # Accepts Request
3
+ class Acceptor
4
+ type serializerTypes = (singleton(Serializer::JSON) | singleton(Serializer::Msgpack) | singleton(Serializer::Cbor))
5
+ # type authenticatorsType = Auth::Anonymous | Auth::Ticket | Auth::Cra | Auth::Cryptosign
6
+
7
+ @serializer: serializerTypes
8
+
9
+ @authenticator: singleton(Authenticator)
10
+
11
+ @state: Integer
12
+
13
+ @session_id: Integer
14
+
15
+ @hello: Message::Hello
16
+
17
+ @authid: String
18
+
19
+ @authmethod: String
20
+
21
+ @request: Request
22
+
23
+ @response: Response
24
+
25
+ @challenge: String
26
+
27
+ @public_key: String
28
+
29
+ @auth_request: AuthenticateRequest
30
+
31
+ STATE_NONE: 0
32
+
33
+ STATE_HELLO_RECEIVED: 1
34
+
35
+ STATE_CHALLENGE_SENT: 2
36
+
37
+ STATE_WELCOME_SENT: 3
38
+
39
+ STATE_ERROR: 4
40
+
41
+ ROUTER_ROLES: { dealer: ::Hash[untyped, untyped], broker: ::Hash[untyped, untyped] }
42
+
43
+ attr_reader serializer: serializerTypes
44
+
45
+ attr_reader session_id: Integer
46
+
47
+ attr_reader authmethod: String
48
+
49
+ attr_reader authenticator: singleton(Authenticator)
50
+
51
+ attr_accessor state: Integer
52
+
53
+ attr_accessor session_details: SessionDetails
54
+
55
+ def initialize: (?serializerTypes serializer, ?singleton(Authenticator) authenticator) -> void
56
+
57
+ def receive: (untyped data) -> untyped
58
+
59
+ def receive_message: (Message::Base msg) -> Message::Base
60
+
61
+ private
62
+
63
+ def handle_hello_message: (Message::Hello msg) -> (Message::Challenge | Message::Welcome | Message::Abort)
64
+
65
+ def handle_wampcra_hello: (Message::Hello msg) -> Message::Challenge
66
+
67
+ def handle_ticket_hello: (Message::Hello _msg) -> Message::Challenge
68
+
69
+ def handle_cryptosign_hello: (Message::Hello msg) -> Message::Challenge
70
+
71
+ def handle_anonymous_hello: (Message::Hello msg) -> Message::Welcome
72
+
73
+ def handle_authenticate_message: (Message::Authenticate msg) -> (Message::Welcome | Message::Abort)
74
+
75
+ def handle_wampcra_authenticate: (Message::Authenticate msg) -> (Message::Welcome | Message::Abort)
76
+
77
+ def abort_message: () -> Message::Abort
78
+
79
+ def handle_ticket_authenticate: (Message::Authenticate msg) -> (Message::Welcome | Message::Abort)
80
+
81
+ def handle_cryptosign_authenticate: (Message::Authenticate msg) -> (Message::Welcome | Message::Abort)
82
+
83
+ def create_session_id: () -> Integer
84
+ end
85
+ end
86
+
@@ -0,0 +1,13 @@
1
+ module Wampproto
2
+ module Auth
3
+ # anonymous authentication
4
+ class Anonymous < Base
5
+ @authid: String
6
+
7
+ AUTH_METHOD: "anonymous"
8
+
9
+ def initialize: (?String authid, ?::Hash[Symbol, untyped] authextra) -> void
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,25 @@
1
+ module Wampproto
2
+ module Auth
3
+ # Auth Base
4
+ class Base
5
+ @authmethod: String
6
+
7
+ @authid: String
8
+
9
+ @authextra: Hash[Symbol, untyped]
10
+
11
+ attr_reader authmethod: String
12
+
13
+ attr_reader authid: String
14
+
15
+ attr_reader authextra: Hash[Symbol, untyped]
16
+
17
+ attr_reader details: Hash[Symbol, untyped]
18
+
19
+ def initialize: (String method, String authid, Hash[Symbol, untyped] authextra) -> void
20
+
21
+ def authenticate: (Message::Challenge _challenge) -> String
22
+ end
23
+ end
24
+ end
25
+