oversip 1.1.0.beta5 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/etc/oversip.conf +16 -4
- data/etc/proxies.conf +8 -9
- data/etc/server.rb +59 -0
- data/ext/sip_parser/sip_parser.c +12066 -11975
- data/ext/sip_parser/sip_parser.h +1 -0
- data/ext/sip_parser/sip_parser_ruby.c +15 -4
- data/ext/utils/haproxy_protocol.c +4 -1
- data/ext/websocket_framing_utils/ws_framing_utils_ruby.c +2 -2
- data/lib/oversip/config.rb +50 -38
- data/lib/oversip/default_server.rb +12 -0
- data/lib/oversip/launcher.rb +10 -35
- data/lib/oversip/master_process.rb +2 -2
- data/lib/oversip/proxies_config.rb +2 -2
- data/lib/oversip/sip/client_transaction.rb +1 -7
- data/lib/oversip/sip/grammar/uri.rb +23 -1
- data/lib/oversip/sip/listeners/{reactor.rb → connection.rb} +16 -2
- data/lib/oversip/sip/listeners/ipv4_udp_server.rb +1 -1
- data/lib/oversip/sip/listeners/ipv6_udp_server.rb +1 -1
- data/lib/oversip/sip/listeners/tcp_client.rb +2 -3
- data/lib/oversip/sip/listeners/{tcp_reactor.rb → tcp_connection.rb} +14 -2
- data/lib/oversip/sip/listeners/tcp_server.rb +2 -5
- data/lib/oversip/sip/listeners/tls_client.rb +15 -12
- data/lib/oversip/sip/listeners/tls_server.rb +11 -11
- data/lib/oversip/sip/listeners/{tls_tunnel_reactor.rb → tls_tunnel_connection.rb} +20 -20
- data/lib/oversip/sip/listeners/tls_tunnel_server.rb +2 -5
- data/lib/oversip/sip/listeners/{udp_reactor.rb → udp_connection.rb} +4 -4
- data/lib/oversip/sip/listeners.rb +6 -10
- data/lib/oversip/sip/message.rb +4 -3
- data/lib/oversip/sip/message_processor.rb +17 -17
- data/lib/oversip/sip/modules/core.rb +18 -13
- data/lib/oversip/sip/modules/user_assertion.rb +7 -53
- data/lib/oversip/sip/proxy.rb +3 -3
- data/lib/oversip/sip/request.rb +2 -0
- data/lib/oversip/sip/rfc3263.rb +3 -3
- data/lib/oversip/sip/sip.rb +6 -0
- data/lib/oversip/sip/transport_manager.rb +8 -8
- data/lib/oversip/tls.rb +18 -22
- data/lib/oversip/version.rb +1 -1
- data/lib/oversip/websocket/constants.rb +0 -1
- data/lib/oversip/websocket/http_request.rb +4 -8
- data/lib/oversip/websocket/launcher.rb +83 -139
- data/lib/oversip/websocket/listeners/connection.rb +47 -0
- data/lib/oversip/websocket/{ws_apps/ipv4_ws_sip_app.rb → listeners/ipv4_ws_server.rb} +3 -3
- data/lib/oversip/websocket/{ws_apps/ipv4_wss_sip_app.rb → listeners/ipv4_wss_server.rb} +2 -2
- data/lib/oversip/websocket/listeners/ipv4_wss_tunnel_server.rb +21 -0
- data/lib/oversip/websocket/{ws_apps/ipv6_ws_sip_app.rb → listeners/ipv6_ws_server.rb} +3 -3
- data/lib/oversip/websocket/{ws_apps/ipv6_wss_sip_app.rb → listeners/ipv6_wss_server.rb} +2 -3
- data/lib/oversip/websocket/listeners/ipv6_wss_tunnel_server.rb +21 -0
- data/lib/oversip/websocket/listeners/{tcp_server.rb → ws_server.rb} +63 -43
- data/lib/oversip/websocket/listeners/{tls_server.rb → wss_server.rb} +14 -13
- data/lib/oversip/websocket/listeners/{tls_tunnel_server.rb → wss_tunnel_server.rb} +36 -10
- data/lib/oversip/websocket/listeners.rb +10 -9
- data/lib/oversip/websocket/websocket.rb +13 -0
- data/lib/oversip/websocket/ws_framing.rb +35 -97
- data/lib/oversip/websocket/ws_sip_app.rb +120 -0
- data/lib/oversip.rb +1 -1
- data/test/oversip_test_helper.rb +2 -2
- data/test/test_http_parser.rb +2 -2
- data/test/test_sip_parser.rb +18 -3
- data/test/test_uri.rb +44 -0
- metadata +39 -42
- data/lib/oversip/websocket/listeners/ipv4_tcp_server.rb +0 -15
- data/lib/oversip/websocket/listeners/ipv4_tls_server.rb +0 -15
- data/lib/oversip/websocket/listeners/ipv4_tls_tunnel_server.rb +0 -15
- data/lib/oversip/websocket/listeners/ipv6_tcp_server.rb +0 -15
- data/lib/oversip/websocket/listeners/ipv6_tls_server.rb +0 -15
- data/lib/oversip/websocket/listeners/ipv6_tls_tunnel_server.rb +0 -15
- data/lib/oversip/websocket/ws_app.rb +0 -77
- data/lib/oversip/websocket/ws_apps/ws_autobahn_app.rb +0 -23
- data/lib/oversip/websocket/ws_apps/ws_sip_app.rb +0 -156
- data/lib/oversip/websocket/ws_apps.rb +0 -9
@@ -5,7 +5,7 @@ module OverSIP::SIP
|
|
5
5
|
TLS_HANDSHAKE_MAX_TIME = 4
|
6
6
|
|
7
7
|
|
8
|
-
attr_writer :
|
8
|
+
attr_writer :callback_on_server_tls_handshake
|
9
9
|
|
10
10
|
|
11
11
|
def initialize ip, port
|
@@ -19,7 +19,7 @@ module OverSIP::SIP
|
|
19
19
|
@server_last_pem = false
|
20
20
|
|
21
21
|
start_tls({
|
22
|
-
:verify_peer => @
|
22
|
+
:verify_peer => @callback_on_server_tls_handshake,
|
23
23
|
:cert_chain_file => ::OverSIP.tls_public_cert,
|
24
24
|
:private_key_file => ::OverSIP.tls_private_cert
|
25
25
|
})
|
@@ -37,7 +37,7 @@ module OverSIP::SIP
|
|
37
37
|
|
38
38
|
|
39
39
|
# Called for every certificate provided by the peer.
|
40
|
-
# This is just called in case @
|
40
|
+
# This is just called in case @callback_on_server_tls_handshake is true.
|
41
41
|
def ssl_verify_peer pem
|
42
42
|
# TODO: Dirty workaround for bug https://github.com/eventmachine/eventmachine/issues/194.
|
43
43
|
return true if @server_last_pem == pem
|
@@ -61,20 +61,23 @@ module OverSIP::SIP
|
|
61
61
|
@connected = true
|
62
62
|
@timer_tls_handshake.cancel if @timer_tls_handshake
|
63
63
|
|
64
|
-
if @
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
64
|
+
if @callback_on_server_tls_handshake
|
65
|
+
begin
|
66
|
+
::OverSIP::SipEvents.on_server_tls_handshake self, @server_pems
|
67
|
+
rescue ::Exception => e
|
68
|
+
log_system_error "error calling OverSIP::SipEvents.on_server_tls_handshake():"
|
69
|
+
log_system_error e
|
70
|
+
close_connection
|
71
|
+
end
|
72
|
+
|
73
|
+
# If the user has closed the connection in the on_server_tls_handshake() callback
|
74
|
+
# then @local_closed is true, so notify pending transactions.
|
75
|
+
if @local_closed
|
72
76
|
@pending_client_transactions.each do |client_transaction|
|
73
77
|
client_transaction.tls_validation_failed
|
74
78
|
end
|
75
79
|
@pending_client_transactions.clear
|
76
80
|
@pending_messages.clear
|
77
|
-
close_connection
|
78
81
|
@state = :ignore
|
79
82
|
return
|
80
83
|
end
|
@@ -2,7 +2,7 @@ module OverSIP::SIP
|
|
2
2
|
|
3
3
|
class TlsServer < TcpServer
|
4
4
|
|
5
|
-
TLS_HANDSHAKE_MAX_TIME =
|
5
|
+
TLS_HANDSHAKE_MAX_TIME = 4
|
6
6
|
|
7
7
|
|
8
8
|
def post_init
|
@@ -44,19 +44,20 @@ module OverSIP::SIP
|
|
44
44
|
def ssl_handshake_completed
|
45
45
|
log_system_info "TLS connection established from " << remote_desc
|
46
46
|
|
47
|
-
# TODO: What to do it falidation fails? always do validation?
|
48
|
-
|
49
|
-
validated, cert, tls_error, tls_error_string = ::OverSIP::TLS.validate @client_pems.pop, @client_pems
|
50
|
-
if validated
|
51
|
-
log_system_info "client provides a valid TLS certificate"
|
52
|
-
else
|
53
|
-
log_system_notice "client's TLS certificate validation failed (TLS error: #{tls_error.inspect}, description: #{tls_error_string.inspect})"
|
54
|
-
end
|
55
|
-
|
56
47
|
# @connected in TlsServer means "TLS connection" rather than
|
57
48
|
# just "TCP connection".
|
58
49
|
@connected = true
|
59
50
|
@timer_tls_handshake.cancel if @timer_tls_handshake
|
51
|
+
|
52
|
+
if ::OverSIP::SIP.callback_on_client_tls_handshake
|
53
|
+
begin
|
54
|
+
::OverSIP::SipEvents.on_client_tls_handshake self, @client_pems
|
55
|
+
rescue ::Exception => e
|
56
|
+
log_system_error "error calling OverSIP::SipEvents.on_client_tls_handshake():"
|
57
|
+
log_system_error e
|
58
|
+
close_connection
|
59
|
+
end
|
60
|
+
end
|
60
61
|
end
|
61
62
|
|
62
63
|
|
@@ -67,4 +68,3 @@ module OverSIP::SIP
|
|
67
68
|
|
68
69
|
end
|
69
70
|
end
|
70
|
-
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module OverSIP::SIP
|
2
2
|
|
3
|
-
class
|
3
|
+
class TlsTunnelConnection < TcpConnection
|
4
4
|
|
5
5
|
# Max size (bytes) of the buffered data when receiving message headers
|
6
6
|
# (avoid DoS attacks).
|
@@ -25,8 +25,8 @@ module OverSIP::SIP
|
|
25
25
|
when :haproxy_protocol
|
26
26
|
parse_haproxy_protocol
|
27
27
|
|
28
|
-
when :client_pems
|
29
|
-
|
28
|
+
#when :client_pems
|
29
|
+
# parse_client_pems
|
30
30
|
|
31
31
|
when :headers
|
32
32
|
parse_headers
|
@@ -88,23 +88,23 @@ module OverSIP::SIP
|
|
88
88
|
end
|
89
89
|
|
90
90
|
# TODO: Not terminated yet.
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
91
|
+
# def parse_client_pems
|
92
|
+
# # TODO: Wrong, it could occur that here the last PEMs byte arries.
|
93
|
+
# return false if @buffer.size < 3 # 3 bytes = 0\r\n (minimum data).
|
94
|
+
#
|
95
|
+
# @pems_str ||= ""
|
96
|
+
# @pems_str << @buffer.read(2)
|
97
|
+
#
|
98
|
+
# # No PEMS.
|
99
|
+
# if @pems_str == "\r\n"
|
100
|
+
# @state = :headers
|
101
|
+
# return true
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# #@pem_size_str =
|
105
|
+
#
|
106
|
+
# @state = :headers
|
107
|
+
# end
|
108
108
|
|
109
109
|
end
|
110
110
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module OverSIP::SIP
|
2
2
|
|
3
|
-
class TlsTunnelServer <
|
3
|
+
class TlsTunnelServer < TlsTunnelConnection
|
4
4
|
|
5
5
|
attr_reader :outbound_flow_token
|
6
6
|
|
@@ -15,13 +15,10 @@ module OverSIP::SIP
|
|
15
15
|
return
|
16
16
|
end
|
17
17
|
|
18
|
-
log_system_debug ("connection from the TLS tunnel " << remote_desc) if $oversip_debug
|
19
|
-
|
20
18
|
# Create an Outbound (RFC 5626) flow token for this connection.
|
21
19
|
@outbound_flow_token = ::OverSIP::SIP::TransportManager.add_outbound_connection self
|
22
20
|
|
23
|
-
|
24
|
-
@cvars = {}
|
21
|
+
log_system_debug ("connection from the TLS tunnel " << remote_desc) if $oversip_debug
|
25
22
|
end
|
26
23
|
|
27
24
|
def remote_desc force=nil
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module OverSIP::SIP
|
2
2
|
|
3
|
-
class
|
3
|
+
class UdpConnection < Connection
|
4
4
|
|
5
5
|
def receive_data data
|
6
6
|
@buffer << data
|
@@ -63,7 +63,7 @@ module OverSIP::SIP
|
|
63
63
|
@buffer.clear
|
64
64
|
@state = :init
|
65
65
|
return false
|
66
|
-
end
|
66
|
+
end
|
67
67
|
|
68
68
|
# Parse the currently buffered data. If parsing fails @parser_nbytes gets nil value.
|
69
69
|
unless @parser_nbytes = @parser.execute(buffer_str, @parser_nbytes)
|
@@ -129,7 +129,7 @@ module OverSIP::SIP
|
|
129
129
|
@msg.source_port = source_port
|
130
130
|
@msg.source_ip_type = self.class.ip_type
|
131
131
|
|
132
|
-
unless valid_message?
|
132
|
+
unless valid_message? @parser
|
133
133
|
@buffer.clear
|
134
134
|
@state = :init
|
135
135
|
return false
|
@@ -208,7 +208,7 @@ module OverSIP::SIP
|
|
208
208
|
end
|
209
209
|
end
|
210
210
|
|
211
|
-
end
|
211
|
+
end
|
212
212
|
|
213
213
|
end
|
214
214
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# OverSIP files
|
2
2
|
|
3
|
-
require "oversip/sip/listeners/
|
4
|
-
|
5
|
-
require "oversip/sip/listeners/
|
6
|
-
require "oversip/sip/listeners/
|
7
|
-
require "oversip/sip/listeners/tls_tunnel_reactor"
|
8
|
-
|
3
|
+
require "oversip/sip/listeners/connection"
|
4
|
+
require "oversip/sip/listeners/udp_connection"
|
5
|
+
require "oversip/sip/listeners/tcp_connection"
|
6
|
+
require "oversip/sip/listeners/tls_tunnel_connection"
|
9
7
|
require "oversip/sip/listeners/tcp_server"
|
10
8
|
require "oversip/sip/listeners/tls_server"
|
11
9
|
require "oversip/sip/listeners/tls_tunnel_server"
|
10
|
+
require "oversip/sip/listeners/tcp_client"
|
11
|
+
require "oversip/sip/listeners/tls_client"
|
12
12
|
|
13
13
|
require "oversip/sip/listeners/ipv4_udp_server"
|
14
14
|
require "oversip/sip/listeners/ipv6_udp_server"
|
@@ -18,10 +18,6 @@ require "oversip/sip/listeners/ipv4_tls_server"
|
|
18
18
|
require "oversip/sip/listeners/ipv6_tls_server"
|
19
19
|
require "oversip/sip/listeners/ipv4_tls_tunnel_server"
|
20
20
|
require "oversip/sip/listeners/ipv6_tls_tunnel_server"
|
21
|
-
|
22
|
-
require "oversip/sip/listeners/tcp_client"
|
23
|
-
require "oversip/sip/listeners/tls_client"
|
24
|
-
|
25
21
|
require "oversip/sip/listeners/ipv4_tcp_client"
|
26
22
|
require "oversip/sip/listeners/ipv6_tcp_client"
|
27
23
|
require "oversip/sip/listeners/ipv4_tls_client"
|
data/lib/oversip/sip/message.rb
CHANGED
@@ -59,13 +59,12 @@ module OverSIP::SIP
|
|
59
59
|
|
60
60
|
# Other attributes.
|
61
61
|
attr_accessor :tvars # Transaction variables (a hash).
|
62
|
-
attr_accessor :cvars # Connection variables (a hash).
|
63
62
|
|
64
63
|
def udp? ; @transport == :udp end
|
65
64
|
def tcp? ; @transport == :tcp end
|
66
65
|
def tls? ; @transport == :tls end
|
67
66
|
def ws? ; @transport == :ws end
|
68
|
-
def
|
67
|
+
def wss? ; @transport == :wss end
|
69
68
|
|
70
69
|
def websocket? ; @transport == :ws || @transport == :wss end
|
71
70
|
|
@@ -75,6 +74,8 @@ module OverSIP::SIP
|
|
75
74
|
|
76
75
|
def via_alias? ; @via_has_alias end
|
77
76
|
|
77
|
+
def contact_reg_id? ; @contact_has_reg_id end
|
78
|
+
|
78
79
|
def dialog_forming?
|
79
80
|
DIALOG_FORMING_METHODS[@sip_method]
|
80
81
|
end
|
@@ -167,7 +168,7 @@ module OverSIP::SIP
|
|
167
168
|
# received.
|
168
169
|
def close_connection
|
169
170
|
return false if @transport == :udp
|
170
|
-
@connection.
|
171
|
+
@connection.close
|
171
172
|
true
|
172
173
|
end
|
173
174
|
|
@@ -10,11 +10,11 @@ module OverSIP::SIP
|
|
10
10
|
}
|
11
11
|
|
12
12
|
|
13
|
-
def valid_message?
|
14
|
-
if header =
|
13
|
+
def valid_message? parser
|
14
|
+
if header = parser.missing_core_header?
|
15
15
|
log_system_notice "ignoring #{MSG_TYPE[@msg.class]} missing #{header} header"
|
16
16
|
return false
|
17
|
-
elsif header =
|
17
|
+
elsif header = parser.duplicated_core_header?
|
18
18
|
log_system_notice "ignoring #{MSG_TYPE[@msg.class]} with duplicated #{header} header"
|
19
19
|
return false
|
20
20
|
end
|
@@ -76,20 +76,20 @@ module OverSIP::SIP
|
|
76
76
|
# Run the user provided OverSIP::SipEvents.on_request() callback (unless the request
|
77
77
|
# it's a retransmission, a CANCEL or an ACK for a final non-2XX response).
|
78
78
|
unless check_transaction
|
79
|
-
|
80
|
-
|
81
|
-
@msg.antiloop_id = ::OverSIP::SIP::Tags.create_antiloop_id(@msg)
|
79
|
+
# Create the antiloop identifier for this request.
|
80
|
+
@msg.antiloop_id = ::OverSIP::SIP::Tags.create_antiloop_id(@msg)
|
82
81
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
82
|
+
# Check loops.
|
83
|
+
if @msg.antiloop_id == @msg.via_branch_id[-32..-1]
|
84
|
+
@msg.reply 482, "Loop Detected"
|
85
|
+
return
|
86
|
+
end
|
88
87
|
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
# Initialize some attributes for the request.
|
89
|
+
@msg.tvars = {}
|
90
|
+
@msg.cvars = @msg.connection.cvars
|
92
91
|
|
92
|
+
begin
|
93
93
|
# Run the callback.
|
94
94
|
::OverSIP::SipEvents.on_request @msg
|
95
95
|
rescue ::Exception => e
|
@@ -109,18 +109,18 @@ module OverSIP::SIP
|
|
109
109
|
### TODO: Esto va a petar cuando tenga una clase que hereda de, p.ej, IPv4TcpServer que se llame xxxClient,
|
110
110
|
# ya que en ella no existirá @invite_client_transactions. Tengo que hacer que su @invite_client_transactions
|
111
111
|
# se rellene al de la clase padre al hacer el load de las clases.
|
112
|
-
if client_transaction =
|
112
|
+
if client_transaction = @msg.connection.class.invite_client_transactions[@msg.via_branch_id]
|
113
113
|
client_transaction.receive_response(@msg)
|
114
114
|
return
|
115
115
|
end
|
116
116
|
when :ACK
|
117
117
|
when :CANCEL
|
118
|
-
if client_transaction =
|
118
|
+
if client_transaction = @msg.connection.class.invite_client_transactions[@msg.via_branch_id]
|
119
119
|
client_transaction.receive_response_to_cancel(@msg)
|
120
120
|
return
|
121
121
|
end
|
122
122
|
else
|
123
|
-
if client_transaction =
|
123
|
+
if client_transaction = @msg.connection.class.non_invite_client_transactions[@msg.via_branch_id]
|
124
124
|
client_transaction.receive_response(@msg)
|
125
125
|
return
|
126
126
|
end
|
@@ -5,13 +5,19 @@ module OverSIP::SIP
|
|
5
5
|
|
6
6
|
# Create a server transaction for the incoming request.
|
7
7
|
def create_transaction
|
8
|
+
return false if @server_transaction
|
9
|
+
|
8
10
|
case @sip_method
|
9
11
|
when :INVITE
|
10
12
|
::OverSIP::SIP::InviteServerTransaction.new self
|
13
|
+
return true
|
11
14
|
when :ACK
|
15
|
+
return nil
|
12
16
|
when :CANCEL
|
17
|
+
return nil
|
13
18
|
else
|
14
19
|
::OverSIP::SIP::NonInviteServerTransaction.new self
|
20
|
+
return true
|
15
21
|
end
|
16
22
|
end
|
17
23
|
|
@@ -44,7 +50,6 @@ module OverSIP::SIP
|
|
44
50
|
num_removes += 1
|
45
51
|
else
|
46
52
|
if local_uri? route
|
47
|
-
log_system_debug "removing pre-loaded Route pointing to this server" if $oversip_debug
|
48
53
|
has_preloaded_route_with_ob_param = true if route.ob_param?
|
49
54
|
num_removes += 1
|
50
55
|
else
|
@@ -63,14 +68,15 @@ module OverSIP::SIP
|
|
63
68
|
# - Has a preloaded top Route with ;ob param pointing to us, or has Contact with ;ob, or
|
64
69
|
# it's a REGISTER with ;+sip.instance.
|
65
70
|
#
|
66
|
-
# TODO: and (has_preloaded_route_with_ob_param or @request.contact.ob_param?).
|
67
|
-
# TODO: For REGISTER check also ;+sip.instance Contact param.
|
68
71
|
if (
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
72
|
+
initial? and (
|
73
|
+
@force_outgoing_outbound or (
|
74
|
+
@num_vias == 1 and
|
75
|
+
outbound_aware? and (
|
76
|
+
( has_preloaded_route_with_ob_param or (@contact and @contact.ob_param?) ) or
|
77
|
+
( @sip_method == :REGISTER and contact_reg_id?)
|
78
|
+
)
|
79
|
+
)
|
74
80
|
)
|
75
81
|
)
|
76
82
|
@outgoing_outbound_requested = true
|
@@ -107,7 +113,7 @@ module OverSIP::SIP
|
|
107
113
|
end
|
108
114
|
@routes.empty? and @routes = nil
|
109
115
|
|
110
|
-
# Return true if it is an in-dialog request and
|
116
|
+
# Return true if it is an in-dialog request and the top Route pointed to us.
|
111
117
|
# False otherwise as we shouldn't receive an in-dialog request with a top Route non
|
112
118
|
# pointing to us.
|
113
119
|
if in_dialog?
|
@@ -122,8 +128,9 @@ module OverSIP::SIP
|
|
122
128
|
end
|
123
129
|
|
124
130
|
|
125
|
-
#
|
126
|
-
#
|
131
|
+
# Checks whether the RURI points to a local domain or address.
|
132
|
+
# Typically, prior to using this method the user has verified the return value of loose_route()
|
133
|
+
# in case it's an initial request (if it's _true_ then the request has pre-loaded Route).
|
127
134
|
def destination_myself?
|
128
135
|
return true if @destination_myself
|
129
136
|
return false if @destination_myself == false
|
@@ -149,8 +156,6 @@ module OverSIP::SIP
|
|
149
156
|
end
|
150
157
|
|
151
158
|
|
152
|
-
# TODO: It must be true if top Route or Contact has ;ob param, or also if the Contact
|
153
|
-
# has +sip.instance.
|
154
159
|
def outgoing_outbound_requested? ; @outgoing_outbound_requested end
|
155
160
|
|
156
161
|
def incoming_outbound_requested? ; @incoming_outbound_requested end
|
@@ -22,13 +22,13 @@ module OverSIP::SIP
|
|
22
22
|
# Don't do this stuf for UDP or for outbound connections.
|
23
23
|
return false unless request.connection.class.reliable_transport_listener?
|
24
24
|
# Return if already set.
|
25
|
-
return request.
|
25
|
+
return request.cvars[:asserted_user] if request.cvars[:asserted_user]
|
26
26
|
# Don't do this stuf in case of P-Preferred-Identity header is present.
|
27
27
|
return false if request.headers["P-Preferred-Identity"]
|
28
28
|
|
29
29
|
log_system_debug "user #{request.from.uri} asserted to connection" if $oversip_debug
|
30
30
|
# Store the request From URI as "asserted_user" for this connection.
|
31
|
-
request.
|
31
|
+
request.cvars[:asserted_user] = request.from.uri
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.revoke_assertion message
|
@@ -41,7 +41,7 @@ module OverSIP::SIP
|
|
41
41
|
raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
|
42
42
|
end
|
43
43
|
|
44
|
-
request.
|
44
|
+
request.cvars.delete :asserted_user
|
45
45
|
true
|
46
46
|
end
|
47
47
|
|
@@ -50,16 +50,17 @@ module OverSIP::SIP
|
|
50
50
|
# in case it matches request From URI !
|
51
51
|
# NOTE: If the connection is not asserted (it's null) then it will not match this
|
52
52
|
# comparisson, so OK.
|
53
|
-
if request.
|
53
|
+
if request.cvars[:asserted_user] == request.from.uri
|
54
54
|
# Don't add P-Asserted-Identity if the request contains P-Preferred-Identity header.
|
55
55
|
unless request.headers["P-Preferred-Identity"]
|
56
56
|
log_system_debug "user asserted, adding P-Asserted-Identity for #{request.log_id}" if $oversip_debug
|
57
|
-
request.set_header "P-Asserted-Identity", "<" << request.
|
57
|
+
request.set_header "P-Asserted-Identity", "<" << request.cvars[:asserted_user] << ">"
|
58
58
|
return true
|
59
59
|
else
|
60
60
|
# Remove posible P-Asserted-Identity header!
|
61
61
|
log_system_debug "user asserted but P-Preferred-Identity header present, P-Asserted-Identity not added for #{request.log_id}" if $oversip_debug
|
62
62
|
request.headers.delete "P-Asserted-Identity"
|
63
|
+
return nil
|
63
64
|
end
|
64
65
|
|
65
66
|
# Otherwise ensure the request has no spoofed P-Asserted-Identity headers!
|
@@ -73,51 +74,4 @@ module OverSIP::SIP
|
|
73
74
|
end # module UserAssertion
|
74
75
|
end # module Modules
|
75
76
|
|
76
|
-
end
|
77
|
-
|
78
|
-
|
79
|
-
module OverSIP::SIP
|
80
|
-
class Request
|
81
|
-
def asserted_user?
|
82
|
-
true if self.connection.asserted_user
|
83
|
-
end
|
84
|
-
|
85
|
-
def asserted_user
|
86
|
-
self.connection.asserted_user
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
class Response
|
91
|
-
def asserted_user?
|
92
|
-
true if self.request.connection.asserted_user
|
93
|
-
end
|
94
|
-
|
95
|
-
def asserted_user
|
96
|
-
self.request.connection.asserted_user
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
class TcpServer
|
101
|
-
attr_accessor :asserted_user
|
102
|
-
end
|
103
|
-
|
104
|
-
class TlsServer
|
105
|
-
attr_accessor :asserted_user
|
106
|
-
end
|
107
|
-
|
108
|
-
class TlsTunnelServer
|
109
|
-
attr_accessor :asserted_user
|
110
|
-
end
|
111
|
-
|
112
|
-
# This is never used since it's not a reliable connection, but it's required not to fail.
|
113
|
-
class UdpReactor
|
114
|
-
attr_accessor :asserted_user
|
115
|
-
end
|
116
|
-
end # OverSIP::SIP
|
117
|
-
|
118
|
-
|
119
|
-
module OverSIP::WebSocket
|
120
|
-
class WsSipApp
|
121
|
-
attr_accessor :asserted_user
|
122
|
-
end
|
123
|
-
end # OverSIP::WebSocket
|
77
|
+
end
|
data/lib/oversip/sip/proxy.rb
CHANGED
@@ -4,9 +4,9 @@ module OverSIP::SIP
|
|
4
4
|
|
5
5
|
include ::OverSIP::Logger
|
6
6
|
|
7
|
-
def initialize
|
8
|
-
unless (@proxy_conf = ::OverSIP.proxies[
|
9
|
-
raise ::OverSIP::RuntimeError, "proxy '#{
|
7
|
+
def initialize proxy_profile=:default_proxy
|
8
|
+
unless (@proxy_conf = ::OverSIP.proxies[proxy_profile.to_sym])
|
9
|
+
raise ::OverSIP::RuntimeError, "proxy '#{proxy_profile}' is not defined in Proxies Configuration file"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
data/lib/oversip/sip/request.rb
CHANGED
data/lib/oversip/sip/rfc3263.rb
CHANGED
@@ -285,7 +285,7 @@ module OverSIP::SIP
|
|
285
285
|
|
286
286
|
# If @use_srv is false then perform A/AAAA queries.
|
287
287
|
else
|
288
|
-
log_system_debug "SRV is
|
288
|
+
log_system_debug "SRV is disabled, performing A/AAAA queries" if $oversip_debug
|
289
289
|
|
290
290
|
port = 5061 if dns_transport == :tls
|
291
291
|
port ||= case @uri_scheme
|
@@ -311,12 +311,12 @@ module OverSIP::SIP
|
|
311
311
|
# If @use_naptr is false then NAPTR must not be performed.
|
312
312
|
if ! @use_naptr
|
313
313
|
if @use_srv
|
314
|
-
log_system_debug "NAPTR is
|
314
|
+
log_system_debug "NAPTR is disabled, performing SRV queries" if $oversip_debug
|
315
315
|
continue_with_SRV
|
316
316
|
|
317
317
|
# If @use_srv is false then perform A/AAAA queries.
|
318
318
|
else
|
319
|
-
log_system_debug "NAPTR and SRV are
|
319
|
+
log_system_debug "NAPTR and SRV are disabled, performing A/AAAA queries" if $oversip_debug
|
320
320
|
case @uri_scheme
|
321
321
|
when :sip
|
322
322
|
if @has_sip_udp
|
data/lib/oversip/sip/sip.rb
CHANGED
@@ -49,6 +49,8 @@ module OverSIP::SIP
|
|
49
49
|
ws_local_ips.each do |ip|
|
50
50
|
@local_aliases[ip] = true if conf[:websocket][:listen_port] == 80 or conf[:websocket][:listen_port_tls] == 443
|
51
51
|
end
|
52
|
+
|
53
|
+
@callback_on_client_tls_handshake = conf[:sip][:callback_on_client_tls_handshake]
|
52
54
|
end
|
53
55
|
|
54
56
|
def self.local_aliases
|
@@ -67,4 +69,8 @@ module OverSIP::SIP
|
|
67
69
|
@local_ipv6
|
68
70
|
end
|
69
71
|
|
72
|
+
def self.callback_on_client_tls_handshake
|
73
|
+
@callback_on_client_tls_handshake
|
74
|
+
end
|
75
|
+
|
70
76
|
end
|
@@ -15,7 +15,7 @@ module OverSIP::SIP
|
|
15
15
|
# the client transaction is stored in the @pending_client_transactions of the client
|
16
16
|
# connection.
|
17
17
|
# This method always returns a connection object, never nil or false.
|
18
|
-
def self.get_connection klass, ip, port, client_transaction=nil,
|
18
|
+
def self.get_connection klass, ip, port, client_transaction=nil, callback_on_server_tls_handshake=false
|
19
19
|
# A normal connection (so we arrive here after RFC 3263 procedures).
|
20
20
|
case klass.transport
|
21
21
|
|
@@ -28,13 +28,13 @@ module OverSIP::SIP
|
|
28
28
|
when :tcp
|
29
29
|
case klass.ip_type
|
30
30
|
when :ipv4
|
31
|
-
conn = klass.connections["#{ip}_#{port}"] || ::EM.oversip_connect_tcp_server(::OverSIP::SIP.local_ipv4, ip, port, IPv4TcpClient, ip, port)
|
31
|
+
conn = klass.connections["#{ip}_#{port}"] || ::EM.oversip_connect_tcp_server(::OverSIP::SIP.local_ipv4, ip, port, ::OverSIP::SIP::IPv4TcpClient, ip, port)
|
32
32
|
|
33
33
|
if conn.is_a? ::OverSIP::SIP::IPv4TcpClient and not conn.connected
|
34
34
|
conn.pending_client_transactions << client_transaction
|
35
35
|
end
|
36
36
|
when :ipv6
|
37
|
-
conn = klass.connections["#{::OverSIP::Utils.normalize_ipv6 ip}_#{port}"] || ::EM.oversip_connect_tcp_server(::OverSIP::SIP.local_ipv6, ip, port, IPv6TcpClient, ip, port)
|
37
|
+
conn = klass.connections["#{::OverSIP::Utils.normalize_ipv6 ip}_#{port}"] || ::EM.oversip_connect_tcp_server(::OverSIP::SIP.local_ipv6, ip, port, ::OverSIP::SIP::IPv6TcpClient, ip, port)
|
38
38
|
|
39
39
|
if conn.is_a? ::OverSIP::SIP::IPv6TcpClient and not conn.connected
|
40
40
|
conn.pending_client_transactions << client_transaction
|
@@ -44,17 +44,17 @@ module OverSIP::SIP
|
|
44
44
|
when :tls
|
45
45
|
case klass.ip_type
|
46
46
|
when :ipv4
|
47
|
-
conn = klass.connections["#{ip}_#{port}"] || ::EM.oversip_connect_tcp_server(::OverSIP::SIP.local_ipv4, ip, port, IPv4TlsClient, ip, port)
|
47
|
+
conn = klass.connections["#{ip}_#{port}"] || ::EM.oversip_connect_tcp_server(::OverSIP::SIP.local_ipv4, ip, port, ::OverSIP::SIP::IPv4TlsClient, ip, port)
|
48
48
|
|
49
49
|
if conn.is_a? ::OverSIP::SIP::IPv4TlsClient and not conn.connected
|
50
|
-
conn.
|
50
|
+
conn.callback_on_server_tls_handshake = callback_on_server_tls_handshake
|
51
51
|
conn.pending_client_transactions << client_transaction
|
52
52
|
end
|
53
53
|
when :ipv6
|
54
|
-
conn = klass.connections["#{::OverSIP::Utils.normalize_ipv6 ip}_#{port}"] || ::EM.oversip_connect_tcp_server(::OverSIP::SIP.local_ipv6, ip, port, IPv6TlsClient, ip, port)
|
54
|
+
conn = klass.connections["#{::OverSIP::Utils.normalize_ipv6 ip}_#{port}"] || ::EM.oversip_connect_tcp_server(::OverSIP::SIP.local_ipv6, ip, port, ::OverSIP::SIP::IPv6TlsClient, ip, port)
|
55
55
|
|
56
56
|
if conn.is_a? ::OverSIP::SIP::IPv6TlsClient and not conn.connected
|
57
|
-
conn.
|
57
|
+
conn.callback_on_server_tls_handshake = callback_on_server_tls_handshake
|
58
58
|
conn.pending_client_transactions << client_transaction
|
59
59
|
end
|
60
60
|
end
|
@@ -105,7 +105,7 @@ module OverSIP::SIP
|
|
105
105
|
return false
|
106
106
|
end
|
107
107
|
|
108
|
-
# It not, the flow token has been generated for a TCP/TLS/WS connection so let's lookup
|
108
|
+
# It not, the flow token has been generated for a TCP/TLS/WS/WSS connection so let's lookup
|
109
109
|
# it into the Outbound connection collection and return nil for IP and port.
|
110
110
|
else
|
111
111
|
@outbound_connections[flow_token]
|