oversip_p 1.0.0
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 +7 -0
- data/AUTHORS +22 -0
- data/LICENSE +25 -0
- data/README.md +43 -0
- data/Rakefile +54 -0
- data/bin/oversip +184 -0
- data/etc/oversip.conf +274 -0
- data/etc/proxies.conf +145 -0
- data/etc/server.rb +315 -0
- data/etc/tls/ca/cacert.pem +3894 -0
- data/etc/tls/demo-tls.oversip.net.crt +17 -0
- data/etc/tls/demo-tls.oversip.net.key +15 -0
- data/etc/tls/upgrade-cacert.sh +12 -0
- data/etc/tls/utils/create-cert.rb +162 -0
- data/etc/tls/utils/get-sip-identities.rb +95 -0
- data/ext/common/c_util.h +74 -0
- data/ext/common/ruby_c_util.h +88 -0
- data/ext/sip_parser/common_headers.h +210 -0
- data/ext/sip_parser/ext_help.h +18 -0
- data/ext/sip_parser/extconf.rb +3 -0
- data/ext/sip_parser/sip_message_parser.c +29741 -0
- data/ext/sip_parser/sip_parser.h +250 -0
- data/ext/sip_parser/sip_parser_ruby.c +1370 -0
- data/ext/sip_parser/sip_uri_parser.c +39699 -0
- data/ext/stud/extconf.rb +43 -0
- data/ext/stun/ext_help.h +16 -0
- data/ext/stun/extconf.rb +3 -0
- data/ext/stun/stun_ruby.c +394 -0
- data/ext/utils/ext_help.h +14 -0
- data/ext/utils/extconf.rb +3 -0
- data/ext/utils/haproxy_protocol.c +6163 -0
- data/ext/utils/haproxy_protocol.h +27 -0
- data/ext/utils/ip_utils.c +5952 -0
- data/ext/utils/ip_utils.h +64 -0
- data/ext/utils/outbound_utils.c +3227 -0
- data/ext/utils/outbound_utils.h +27 -0
- data/ext/utils/utils_ruby.c +392 -0
- data/ext/utils/utils_ruby.h +76 -0
- data/ext/websocket_framing_utils/ext_help.h +18 -0
- data/ext/websocket_framing_utils/extconf.rb +3 -0
- data/ext/websocket_framing_utils/ws_framing_utils.h +47 -0
- data/ext/websocket_framing_utils/ws_framing_utils_ruby.c +135 -0
- data/ext/websocket_http_parser/ext_help.h +18 -0
- data/ext/websocket_http_parser/extconf.rb +3 -0
- data/ext/websocket_http_parser/ws_http_parser.c +1635 -0
- data/ext/websocket_http_parser/ws_http_parser.h +87 -0
- data/ext/websocket_http_parser/ws_http_parser_ruby.c +630 -0
- data/lib/oversip/config.rb +597 -0
- data/lib/oversip/config_validators.rb +126 -0
- data/lib/oversip/default_server.rb +52 -0
- data/lib/oversip/errors.rb +10 -0
- data/lib/oversip/fiber_pool.rb +56 -0
- data/lib/oversip/launcher.rb +635 -0
- data/lib/oversip/logger.rb +84 -0
- data/lib/oversip/modules/outbound_mangling.rb +56 -0
- data/lib/oversip/modules/user_assertion.rb +73 -0
- data/lib/oversip/proxies_config.rb +189 -0
- data/lib/oversip/ruby_ext/eventmachine.rb +38 -0
- data/lib/oversip/sip/client.rb +428 -0
- data/lib/oversip/sip/client_transaction.rb +586 -0
- data/lib/oversip/sip/constants.rb +88 -0
- data/lib/oversip/sip/core.rb +217 -0
- data/lib/oversip/sip/launcher.rb +221 -0
- data/lib/oversip/sip/listeners/connection.rb +54 -0
- data/lib/oversip/sip/listeners/ipv4_tcp_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_tcp_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv4_tls_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_tls_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv4_tls_tunnel_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv4_udp_server.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tcp_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tcp_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv6_tls_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tls_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv6_tls_tunnel_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv6_udp_server.rb +21 -0
- data/lib/oversip/sip/listeners/tcp_client.rb +97 -0
- data/lib/oversip/sip/listeners/tcp_connection.rb +202 -0
- data/lib/oversip/sip/listeners/tcp_server.rb +71 -0
- data/lib/oversip/sip/listeners/tls_client.rb +125 -0
- data/lib/oversip/sip/listeners/tls_server.rb +88 -0
- data/lib/oversip/sip/listeners/tls_tunnel_connection.rb +89 -0
- data/lib/oversip/sip/listeners/tls_tunnel_server.rb +61 -0
- data/lib/oversip/sip/listeners/udp_connection.rb +214 -0
- data/lib/oversip/sip/listeners.rb +24 -0
- data/lib/oversip/sip/message.rb +177 -0
- data/lib/oversip/sip/message_processor.rb +213 -0
- data/lib/oversip/sip/name_addr.rb +51 -0
- data/lib/oversip/sip/proxy.rb +324 -0
- data/lib/oversip/sip/request.rb +179 -0
- data/lib/oversip/sip/response.rb +37 -0
- data/lib/oversip/sip/rfc3263.rb +643 -0
- data/lib/oversip/sip/server_transaction.rb +295 -0
- data/lib/oversip/sip/sip.rb +76 -0
- data/lib/oversip/sip/tags.rb +39 -0
- data/lib/oversip/sip/timers.rb +55 -0
- data/lib/oversip/sip/transport_manager.rb +130 -0
- data/lib/oversip/sip/uac.rb +89 -0
- data/lib/oversip/sip/uac_request.rb +84 -0
- data/lib/oversip/sip/uri.rb +208 -0
- data/lib/oversip/syslog.rb +68 -0
- data/lib/oversip/system_callbacks.rb +45 -0
- data/lib/oversip/tls.rb +172 -0
- data/lib/oversip/utils.rb +30 -0
- data/lib/oversip/version.rb +21 -0
- data/lib/oversip/websocket/constants.rb +55 -0
- data/lib/oversip/websocket/http_request.rb +59 -0
- data/lib/oversip/websocket/launcher.rb +183 -0
- data/lib/oversip/websocket/listeners/connection.rb +51 -0
- data/lib/oversip/websocket/listeners/ipv4_ws_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv4_wss_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv4_wss_tunnel_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv6_ws_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv6_wss_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv6_wss_tunnel_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ws_server.rb +331 -0
- data/lib/oversip/websocket/listeners/wss_server.rb +88 -0
- data/lib/oversip/websocket/listeners/wss_tunnel_server.rb +133 -0
- data/lib/oversip/websocket/listeners.rb +13 -0
- data/lib/oversip/websocket/websocket.rb +13 -0
- data/lib/oversip/websocket/ws_framing.rb +545 -0
- data/lib/oversip/websocket/ws_sip_app.rb +120 -0
- data/lib/oversip.rb +127 -0
- data/test/oversip_test_helper.rb +19 -0
- data/test/test_http_parser.rb +73 -0
- data/test/test_name_addr.rb +27 -0
- data/test/test_name_addr_parser.rb +24 -0
- data/test/test_sip_message_parser.rb +168 -0
- data/test/test_sip_uri_parser.rb +56 -0
- data/test/test_uri.rb +68 -0
- data/thirdparty/stud/stud.tar.gz +0 -0
- metadata +334 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
# This module is included by OverSIP::SIP::Request class.
|
|
4
|
+
module Core
|
|
5
|
+
|
|
6
|
+
# Create a server transaction for the incoming request.
|
|
7
|
+
def create_transaction
|
|
8
|
+
return false if @server_transaction
|
|
9
|
+
|
|
10
|
+
case @sip_method
|
|
11
|
+
when :INVITE
|
|
12
|
+
::OverSIP::SIP::InviteServerTransaction.new self
|
|
13
|
+
return true
|
|
14
|
+
when :ACK
|
|
15
|
+
return nil
|
|
16
|
+
when :CANCEL
|
|
17
|
+
return nil
|
|
18
|
+
else
|
|
19
|
+
::OverSIP::SIP::NonInviteServerTransaction.new self
|
|
20
|
+
return true
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def check_max_forwards max_forwards
|
|
26
|
+
if @max_forwards
|
|
27
|
+
unless @max_forwards.zero?
|
|
28
|
+
@new_max_forwards = ( @max_forwards > max_forwards ? max_forwards : @max_forwards - 1 )
|
|
29
|
+
return true
|
|
30
|
+
else
|
|
31
|
+
log_system_notice "Max-Forwards is 0 => 483"
|
|
32
|
+
reply 483
|
|
33
|
+
return false
|
|
34
|
+
end
|
|
35
|
+
else
|
|
36
|
+
@new_max_forwards = max_forwards
|
|
37
|
+
return true
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def loose_route
|
|
43
|
+
num_removes = 0
|
|
44
|
+
has_preloaded_route_with_ob_param = false
|
|
45
|
+
|
|
46
|
+
# Remove all the Route's pointing to the proxy until a Route not pointing to us is found.
|
|
47
|
+
if @routes
|
|
48
|
+
@routes.each do |route|
|
|
49
|
+
if ::OverSIP::SIP::Tags.check_value_for_route_ovid(route.ovid_param)
|
|
50
|
+
num_removes += 1
|
|
51
|
+
else
|
|
52
|
+
if local_uri? route
|
|
53
|
+
has_preloaded_route_with_ob_param = true if route.ob_param?
|
|
54
|
+
num_removes += 1
|
|
55
|
+
else
|
|
56
|
+
break
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
### Outbound stuf. RFC 5626 section 5.3.
|
|
63
|
+
|
|
64
|
+
# Outgoing initial request asking for Outbound. Just valid when:
|
|
65
|
+
# - It's an initial request.
|
|
66
|
+
# - The request comes via UDP or comes via TCP/TLS/WS/WSS but through a connection
|
|
67
|
+
# opened by the peer (and not by OverSIP).
|
|
68
|
+
# - Single Via (so there is no a proxy in front of us).
|
|
69
|
+
# - It's an INVITE, REGISTER, SUBSCRIBE or REFER request.
|
|
70
|
+
# - Has a preloaded top Route with ;ob param pointing to us, or has Contact with ;ob, or
|
|
71
|
+
# it's a REGISTER with ;+sip.instance..
|
|
72
|
+
#
|
|
73
|
+
if (
|
|
74
|
+
initial? and
|
|
75
|
+
@connection.class.outbound_listener? and (
|
|
76
|
+
@force_outgoing_outbound or (
|
|
77
|
+
@num_vias == 1 and
|
|
78
|
+
outbound_aware? and (
|
|
79
|
+
( has_preloaded_route_with_ob_param or (@contact and @contact.ob_param?) ) or
|
|
80
|
+
( @sip_method == :REGISTER and contact_reg_id? )
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
)
|
|
84
|
+
)
|
|
85
|
+
@outgoing_outbound_requested = true
|
|
86
|
+
log_system_debug "applying outgoing Outbound support" if $oversip_debug
|
|
87
|
+
else
|
|
88
|
+
@outgoing_outbound_requested = false
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Incoming initial request or in-dialog incoming/outgoing request. Must only perform
|
|
92
|
+
# Outbound for the incoming case and just when:
|
|
93
|
+
# - All the Route headers point to us.
|
|
94
|
+
# - There are 1 or 2 Route headers.
|
|
95
|
+
# - The latest Route has a flow token and a valid ;ovid param (so has been generated
|
|
96
|
+
# previously by us).
|
|
97
|
+
# NOTE: But don't check its value so it still would work in case of server reboot.
|
|
98
|
+
# - It's an incoming Outbound request (so flow token in the Route does not match the
|
|
99
|
+
# flow token of the incoming connection).
|
|
100
|
+
if (
|
|
101
|
+
(num_removes == 1 or num_removes == 2) and
|
|
102
|
+
@routes.size == num_removes and
|
|
103
|
+
(outbound_route = @routes.last) and
|
|
104
|
+
outbound_route.ovid_param and
|
|
105
|
+
(@route_outbound_flow_token = outbound_route.user) and
|
|
106
|
+
@route_outbound_flow_token != @connection_outbound_flow_token
|
|
107
|
+
)
|
|
108
|
+
@incoming_outbound_requested = true
|
|
109
|
+
log_system_debug "destination is an incoming Outbound connection" if $oversip_debug
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# If there are not Route headers return false.
|
|
113
|
+
return false unless @routes
|
|
114
|
+
|
|
115
|
+
# Remove the Route values pointintg to us.
|
|
116
|
+
unless num_removes == 0
|
|
117
|
+
@headers["Route"].shift num_removes
|
|
118
|
+
@routes.shift num_removes
|
|
119
|
+
end
|
|
120
|
+
@routes.empty? and @routes = nil
|
|
121
|
+
|
|
122
|
+
# Return true if it is an in-dialog request and the top Route pointed to us.
|
|
123
|
+
# False otherwise as we shouldn't receive an in-dialog request with a top Route non
|
|
124
|
+
# pointing to us.
|
|
125
|
+
if in_dialog?
|
|
126
|
+
return ( num_removes > 0 ? true : false )
|
|
127
|
+
# Return true if it was an initial request and more Route headers remain after inspection.
|
|
128
|
+
elsif @routes
|
|
129
|
+
return true
|
|
130
|
+
# Return false if it was an initial request and all its Route headers pointed to the proxy.
|
|
131
|
+
else
|
|
132
|
+
return false
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# Checks whether the RURI points to a local domain or address.
|
|
138
|
+
# Typically, prior to using this method the user has verified the return value of loose_route()
|
|
139
|
+
# in case it's an initial request (if it's _true_ then the request has pre-loaded Route).
|
|
140
|
+
def destination_myself?
|
|
141
|
+
return true if @destination_myself
|
|
142
|
+
return false if @destination_myself == false
|
|
143
|
+
|
|
144
|
+
if local_uri? @ruri
|
|
145
|
+
return @destination_myself = true
|
|
146
|
+
else
|
|
147
|
+
return @destination_myself = false
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def fix_nat
|
|
153
|
+
# Force rport usage for UDP clients.
|
|
154
|
+
@via_rport = @source_port
|
|
155
|
+
|
|
156
|
+
# Force outgoing Outbound.
|
|
157
|
+
if initial? and @num_vias == 1 and outbound_aware?
|
|
158
|
+
@force_outgoing_outbound = true
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def outgoing_outbound_requested?
|
|
164
|
+
return true if @outgoing_outbound_requested
|
|
165
|
+
return false if @outgoing_outbound_requested == false
|
|
166
|
+
|
|
167
|
+
# It could be an initial request so we must provide Outbound support if
|
|
168
|
+
# forced via request.fix_nat() or if the request properly indicates it, even
|
|
169
|
+
# when route.loose_route() is not called.
|
|
170
|
+
if (
|
|
171
|
+
initial? and
|
|
172
|
+
@connection.class.outbound_listener? and (
|
|
173
|
+
@force_outgoing_outbound or (
|
|
174
|
+
@num_vias == 1 and
|
|
175
|
+
outbound_aware? and (
|
|
176
|
+
( @contact and @contact.ob_param? ) or
|
|
177
|
+
( @sip_method == :REGISTER and contact_reg_id? )
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
)
|
|
182
|
+
log_system_debug "applying outgoing Outbound support" if $oversip_debug
|
|
183
|
+
@outgoing_outbound_requested = true
|
|
184
|
+
else
|
|
185
|
+
@outgoing_outbound_requested = false
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def incoming_outbound_requested? ; @incoming_outbound_requested end
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def connection_outbound_flow_token
|
|
193
|
+
@connection_outbound_flow_token ||= if @transport == :udp
|
|
194
|
+
# NOTE: Add "_" so later we can figure that this is for UDP.
|
|
195
|
+
# NOTE: Replace "=" with "-" so it can be added as a SIP URI param (needed i.e.
|
|
196
|
+
# for the OutboundMangling module).
|
|
197
|
+
"_" << ::Base64.strict_encode64("#{@source_ip}_#{@source_port}").gsub(/=/,"-")
|
|
198
|
+
else
|
|
199
|
+
@connection.outbound_flow_token
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
private
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def local_uri? uri
|
|
208
|
+
return false unless uri.scheme == :sip or uri.scheme == :sips
|
|
209
|
+
# NOTE: uri.host has been normalized during parsing in case it's an IPv6 and it's
|
|
210
|
+
# an :ipv6_reference.
|
|
211
|
+
( uri.port and ::OverSIP::SIP.local_aliases["#{uri.host}:#{uri.port}"] ) or
|
|
212
|
+
( not uri.port and ::OverSIP::SIP.local_aliases[uri.host] )
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
end # module Core
|
|
216
|
+
|
|
217
|
+
end
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
module Launcher
|
|
4
|
+
|
|
5
|
+
extend ::OverSIP::Logger
|
|
6
|
+
|
|
7
|
+
IP_TYPE = {
|
|
8
|
+
:ipv4 => "IPv4",
|
|
9
|
+
:ipv6 => "IPv6"
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@log_id = "SIP launcher"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def self.run enabled, ip_type, ip, port, transport, virtual_ip=nil, virtual_port=nil
|
|
16
|
+
uri_ip = case ip_type
|
|
17
|
+
when :ipv4 ; ip
|
|
18
|
+
when :ipv6 ; "[#{ip}]"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
if virtual_ip
|
|
22
|
+
uri_virtual_ip = case ip_type
|
|
23
|
+
when :ipv4 ; virtual_ip
|
|
24
|
+
when :ipv6 ; "[#{virtual_ip}]"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
klass = case transport
|
|
29
|
+
when :udp
|
|
30
|
+
case ip_type
|
|
31
|
+
when :ipv4 ; ::OverSIP::SIP::IPv4UdpServer
|
|
32
|
+
when :ipv6 ; ::OverSIP::SIP::IPv6UdpServer
|
|
33
|
+
end
|
|
34
|
+
when :tcp
|
|
35
|
+
case ip_type
|
|
36
|
+
when :ipv4 ; ::OverSIP::SIP::IPv4TcpServer
|
|
37
|
+
when :ipv6 ; ::OverSIP::SIP::IPv6TcpServer
|
|
38
|
+
end
|
|
39
|
+
when :tls
|
|
40
|
+
case ip_type
|
|
41
|
+
when :ipv4 ; ::OverSIP::SIP::IPv4TlsServer
|
|
42
|
+
when :ipv6 ; ::OverSIP::SIP::IPv6TlsServer
|
|
43
|
+
end
|
|
44
|
+
when :tls_tunnel
|
|
45
|
+
case ip_type
|
|
46
|
+
when :ipv4 ; ::OverSIP::SIP::IPv4TlsTunnelServer
|
|
47
|
+
when :ipv6 ; ::OverSIP::SIP::IPv6TlsTunnelServer
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
klass.ip = virtual_ip || ip
|
|
52
|
+
klass.port = virtual_port || port
|
|
53
|
+
|
|
54
|
+
case
|
|
55
|
+
|
|
56
|
+
when klass == ::OverSIP::SIP::IPv4UdpServer
|
|
57
|
+
if ::OverSIP.configuration[:sip][:advertised_ipv4]
|
|
58
|
+
used_uri_host = ::OverSIP.configuration[:sip][:advertised_ipv4]
|
|
59
|
+
else
|
|
60
|
+
used_uri_host = uri_ip
|
|
61
|
+
end
|
|
62
|
+
klass.via_core = "SIP/2.0/UDP #{used_uri_host}:#{port}"
|
|
63
|
+
klass.record_route = "<sip:#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
64
|
+
klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
65
|
+
klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
|
|
66
|
+
|
|
67
|
+
if enabled
|
|
68
|
+
::EM::open_datagram_socket(ip, port, klass) do |conn|
|
|
69
|
+
klass.connections = conn
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
when klass == ::OverSIP::SIP::IPv6UdpServer
|
|
74
|
+
if ::OverSIP.configuration[:sip][:advertised_ipv6]
|
|
75
|
+
used_uri_host = "[#{::OverSIP.configuration[:sip][:advertised_ipv6]}]"
|
|
76
|
+
else
|
|
77
|
+
used_uri_host = uri_ip
|
|
78
|
+
end
|
|
79
|
+
klass.via_core = "SIP/2.0/UDP #{used_uri_host}:#{port}"
|
|
80
|
+
klass.record_route = "<sip:#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
81
|
+
klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
82
|
+
klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
|
|
83
|
+
|
|
84
|
+
if enabled
|
|
85
|
+
::EM::open_datagram_socket(ip, port, klass) do |conn|
|
|
86
|
+
klass.connections = conn
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
when klass == ::OverSIP::SIP::IPv4TcpServer
|
|
91
|
+
if ::OverSIP.configuration[:sip][:advertised_ipv4]
|
|
92
|
+
used_uri_host = ::OverSIP.configuration[:sip][:advertised_ipv4]
|
|
93
|
+
else
|
|
94
|
+
used_uri_host = uri_ip
|
|
95
|
+
end
|
|
96
|
+
klass.via_core = "SIP/2.0/TCP #{used_uri_host}:#{port}"
|
|
97
|
+
klass.record_route = "<sip:#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
98
|
+
klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
99
|
+
klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
|
|
100
|
+
|
|
101
|
+
if enabled
|
|
102
|
+
::EM.start_server(ip, port, klass) do |conn|
|
|
103
|
+
conn.post_connection
|
|
104
|
+
conn.set_comm_inactivity_timeout 7200
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
when klass == ::OverSIP::SIP::IPv6TcpServer
|
|
109
|
+
if ::OverSIP.configuration[:sip][:advertised_ipv6]
|
|
110
|
+
used_uri_host = "[#{::OverSIP.configuration[:sip][:advertised_ipv6]}]"
|
|
111
|
+
else
|
|
112
|
+
used_uri_host = uri_ip
|
|
113
|
+
end
|
|
114
|
+
klass.via_core = "SIP/2.0/TCP #{used_uri_host}:#{port}"
|
|
115
|
+
klass.record_route = "<sip:#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
116
|
+
klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
117
|
+
klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
|
|
118
|
+
|
|
119
|
+
if enabled
|
|
120
|
+
::EM.start_server(ip, port, klass) do |conn|
|
|
121
|
+
conn.post_connection
|
|
122
|
+
conn.set_comm_inactivity_timeout 7200
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
when klass == ::OverSIP::SIP::IPv4TlsServer
|
|
127
|
+
if ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4]
|
|
128
|
+
used_uri_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4]
|
|
129
|
+
elsif ::OverSIP.configuration[:sip][:advertised_ipv4]
|
|
130
|
+
used_uri_host = ::OverSIP.configuration[:sip][:advertised_ipv4]
|
|
131
|
+
else
|
|
132
|
+
used_uri_host = uri_ip
|
|
133
|
+
end
|
|
134
|
+
klass.via_core = "SIP/2.0/TLS #{used_uri_host}:#{port}"
|
|
135
|
+
klass.record_route = "<sip:#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
136
|
+
klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
137
|
+
klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
|
|
138
|
+
|
|
139
|
+
if enabled
|
|
140
|
+
::EM.start_server(ip, port, klass) do |conn|
|
|
141
|
+
conn.post_connection
|
|
142
|
+
conn.set_comm_inactivity_timeout 7200
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
when klass == ::OverSIP::SIP::IPv6TlsServer
|
|
147
|
+
if ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6]
|
|
148
|
+
used_uri_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6]
|
|
149
|
+
elsif ::OverSIP.configuration[:sip][:advertised_ipv6]
|
|
150
|
+
used_uri_host = "[#{::OverSIP.configuration[:sip][:advertised_ipv6]}]"
|
|
151
|
+
else
|
|
152
|
+
used_uri_host = uri_ip
|
|
153
|
+
end
|
|
154
|
+
klass.via_core = "SIP/2.0/TLS #{used_uri_host}:#{port}"
|
|
155
|
+
klass.record_route = "<sip:#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
156
|
+
klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
157
|
+
klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
|
|
158
|
+
|
|
159
|
+
if enabled
|
|
160
|
+
::EM.start_server(ip, port, klass) do |conn|
|
|
161
|
+
conn.post_connection
|
|
162
|
+
conn.set_comm_inactivity_timeout 7200
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
when klass == ::OverSIP::SIP::IPv4TlsTunnelServer
|
|
167
|
+
if ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4]
|
|
168
|
+
used_uri_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4]
|
|
169
|
+
elsif ::OverSIP.configuration[:sip][:advertised_ipv4]
|
|
170
|
+
used_uri_host = ::OverSIP.configuration[:sip][:advertised_ipv4]
|
|
171
|
+
else
|
|
172
|
+
used_uri_host = uri_virtual_ip
|
|
173
|
+
end
|
|
174
|
+
klass.via_core = "SIP/2.0/TLS #{used_uri_host}:#{virtual_port}"
|
|
175
|
+
klass.record_route = "<sip:#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
176
|
+
klass.outbound_record_route_fragment = "@#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
177
|
+
klass.outbound_path_fragment = "@#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
|
|
178
|
+
|
|
179
|
+
if enabled
|
|
180
|
+
::EM.start_server(ip, port, klass) do |conn|
|
|
181
|
+
conn.post_connection
|
|
182
|
+
conn.set_comm_inactivity_timeout 7200
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
when klass == ::OverSIP::SIP::IPv6TlsTunnelServer
|
|
187
|
+
if ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6]
|
|
188
|
+
used_uri_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6]
|
|
189
|
+
elsif ::OverSIP.configuration[:sip][:advertised_ipv6]
|
|
190
|
+
used_uri_host = "[#{::OverSIP.configuration[:sip][:advertised_ipv6]}]"
|
|
191
|
+
else
|
|
192
|
+
used_uri_host = uri_virtual_ip
|
|
193
|
+
end
|
|
194
|
+
klass.via_core = "SIP/2.0/TLS #{used_uri_host}:#{virtual_port}"
|
|
195
|
+
klass.record_route = "<sip:#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
196
|
+
klass.outbound_record_route_fragment = "@#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
|
|
197
|
+
klass.outbound_path_fragment = "@#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
|
|
198
|
+
|
|
199
|
+
if enabled
|
|
200
|
+
::EM.start_server(ip, port, klass) do |conn|
|
|
201
|
+
conn.post_connection
|
|
202
|
+
conn.set_comm_inactivity_timeout 7200
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
end # case
|
|
207
|
+
|
|
208
|
+
transport_str = case transport
|
|
209
|
+
when :tls_tunnel ; "TLS-Tunnel"
|
|
210
|
+
else ; transport.to_s.upcase
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
if enabled
|
|
214
|
+
log_system_info "SIP #{transport_str} server listening on #{IP_TYPE[ip_type]} #{uri_ip}:#{port}"
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
end # def self.run
|
|
218
|
+
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class Connection < ::EM::Connection
|
|
4
|
+
|
|
5
|
+
include ::OverSIP::Logger
|
|
6
|
+
include ::OverSIP::SIP::MessageProcessor
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
attr_accessor :ip_type, :ip, :port, :transport,
|
|
10
|
+
:via_core,
|
|
11
|
+
:record_route,
|
|
12
|
+
:outbound_record_route_fragment, :outbound_path_fragment,
|
|
13
|
+
:connections,
|
|
14
|
+
:invite_server_transactions, :non_invite_server_transactions,
|
|
15
|
+
:invite_client_transactions, :non_invite_client_transactions
|
|
16
|
+
|
|
17
|
+
def reliable_transport_listener?
|
|
18
|
+
@is_reliable_transport_listener
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def outbound_listener?
|
|
22
|
+
@is_outbound_listener
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
attr_reader :cvars
|
|
28
|
+
|
|
29
|
+
def initialize
|
|
30
|
+
@parser = ::OverSIP::SIP::MessageParser.new
|
|
31
|
+
@buffer = ::IO::Buffer.new
|
|
32
|
+
@state = :init
|
|
33
|
+
@cvars = {}
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def receive_senderror error, data
|
|
38
|
+
log_system_error "Socket sending error: #{error.inspect}, #{data.inspect}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def transport
|
|
42
|
+
self.class.transport
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def open?
|
|
46
|
+
! error?
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# close() method causes @local_closed = true.
|
|
50
|
+
alias close close_connection_after_writing
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv4TcpClient < TcpClient
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv4
|
|
6
|
+
@transport = :tcp
|
|
7
|
+
@server_class = ::OverSIP::SIP::IPv4TcpServer
|
|
8
|
+
@connections = @server_class.connections
|
|
9
|
+
@invite_server_transactions = @server_class.invite_server_transactions
|
|
10
|
+
@non_invite_server_transactions = @server_class.non_invite_server_transactions
|
|
11
|
+
@invite_client_transactions = @server_class.invite_client_transactions
|
|
12
|
+
@non_invite_client_transactions = @server_class.non_invite_client_transactions
|
|
13
|
+
|
|
14
|
+
LOG_ID = "SIP TCP IPv4 client"
|
|
15
|
+
def log_id
|
|
16
|
+
LOG_ID
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv4TcpServer < TcpServer
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv4
|
|
6
|
+
@transport = :tcp
|
|
7
|
+
@connections = {}
|
|
8
|
+
@invite_server_transactions = {}
|
|
9
|
+
@non_invite_server_transactions = {}
|
|
10
|
+
@invite_client_transactions = {}
|
|
11
|
+
@non_invite_client_transactions = {}
|
|
12
|
+
@is_reliable_transport_listener = true
|
|
13
|
+
@is_outbound_listener = true
|
|
14
|
+
|
|
15
|
+
LOG_ID = "SIP TCP IPv4 server"
|
|
16
|
+
def log_id
|
|
17
|
+
LOG_ID
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv4TlsClient < TlsClient
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv4
|
|
6
|
+
@transport = :tls
|
|
7
|
+
@server_class = ::OverSIP::SIP::IPv4TlsServer
|
|
8
|
+
@connections = @server_class.connections
|
|
9
|
+
@invite_server_transactions = @server_class.invite_server_transactions
|
|
10
|
+
@non_invite_server_transactions = @server_class.non_invite_server_transactions
|
|
11
|
+
@invite_client_transactions = @server_class.invite_client_transactions
|
|
12
|
+
@non_invite_client_transactions = @server_class.non_invite_client_transactions
|
|
13
|
+
|
|
14
|
+
LOG_ID = "SIP TLS IPv4 client"
|
|
15
|
+
def log_id
|
|
16
|
+
LOG_ID
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv4TlsServer < TlsServer
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv4
|
|
6
|
+
@transport = :tls
|
|
7
|
+
@connections = {}
|
|
8
|
+
@invite_server_transactions = {}
|
|
9
|
+
@non_invite_server_transactions = {}
|
|
10
|
+
@invite_client_transactions = {}
|
|
11
|
+
@non_invite_client_transactions = {}
|
|
12
|
+
@is_reliable_transport_listener = true
|
|
13
|
+
@is_outbound_listener = true
|
|
14
|
+
|
|
15
|
+
LOG_ID = "SIP TLS IPv4 server"
|
|
16
|
+
def log_id
|
|
17
|
+
LOG_ID
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv4TlsTunnelServer < TlsTunnelServer
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv4
|
|
6
|
+
@transport = :tls
|
|
7
|
+
@connections = {}
|
|
8
|
+
@invite_server_transactions = {}
|
|
9
|
+
@non_invite_server_transactions = {}
|
|
10
|
+
@invite_client_transactions = {}
|
|
11
|
+
@non_invite_client_transactions = {}
|
|
12
|
+
@is_reliable_transport_listener = true
|
|
13
|
+
@is_outbound_listener = true
|
|
14
|
+
|
|
15
|
+
LOG_ID = "SIP TLS-Tunnel IPv4 server"
|
|
16
|
+
def log_id
|
|
17
|
+
LOG_ID
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv4UdpServer < UdpConnection
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv4
|
|
6
|
+
@transport = :udp
|
|
7
|
+
@connections = nil # To be set after creating the unique server instance.
|
|
8
|
+
@invite_server_transactions = {}
|
|
9
|
+
@non_invite_server_transactions = {}
|
|
10
|
+
@invite_client_transactions = {}
|
|
11
|
+
@non_invite_client_transactions = {}
|
|
12
|
+
@is_outbound_listener = true
|
|
13
|
+
|
|
14
|
+
LOG_ID = "SIP UDP IPv4 server"
|
|
15
|
+
def log_id
|
|
16
|
+
LOG_ID
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv6TcpClient < TcpClient
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv6
|
|
6
|
+
@transport = :tcp
|
|
7
|
+
@server_class = ::OverSIP::SIP::IPv6TcpServer
|
|
8
|
+
@connections = @server_class.connections
|
|
9
|
+
@invite_server_transactions = @server_class.invite_server_transactions
|
|
10
|
+
@non_invite_server_transactions = @server_class.non_invite_server_transactions
|
|
11
|
+
@invite_client_transactions = @server_class.invite_client_transactions
|
|
12
|
+
@non_invite_client_transactions = @server_class.non_invite_client_transactions
|
|
13
|
+
|
|
14
|
+
LOG_ID = "SIP TCP IPv6 client"
|
|
15
|
+
def log_id
|
|
16
|
+
LOG_ID
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv6TcpServer < TcpServer
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv6
|
|
6
|
+
@transport = :tcp
|
|
7
|
+
@connections = {}
|
|
8
|
+
@invite_server_transactions = {}
|
|
9
|
+
@non_invite_server_transactions = {}
|
|
10
|
+
@invite_client_transactions = {}
|
|
11
|
+
@non_invite_client_transactions = {}
|
|
12
|
+
@is_reliable_transport_listener = true
|
|
13
|
+
@is_outbound_listener = true
|
|
14
|
+
|
|
15
|
+
LOG_ID = "SIP TCP IPv6 server"
|
|
16
|
+
def log_id
|
|
17
|
+
LOG_ID
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
class IPv6TlsClient < TlsClient
|
|
4
|
+
|
|
5
|
+
@ip_type = :ipv6
|
|
6
|
+
@transport = :tls
|
|
7
|
+
@server_class = ::OverSIP::SIP::IPv6TlsServer
|
|
8
|
+
@connections = @server_class.connections
|
|
9
|
+
@invite_server_transactions = @server_class.invite_server_transactions
|
|
10
|
+
@non_invite_server_transactions = @server_class.non_invite_server_transactions
|
|
11
|
+
@invite_client_transactions = @server_class.invite_client_transactions
|
|
12
|
+
@non_invite_client_transactions = @server_class.non_invite_client_transactions
|
|
13
|
+
|
|
14
|
+
LOG_ID = "SIP TLS IPv6 client"
|
|
15
|
+
def log_id
|
|
16
|
+
LOG_ID
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|