oversip 1.1.0.beta5 → 1.1.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.
- 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
data/ext/sip_parser/sip_parser.h
CHANGED
@@ -128,6 +128,7 @@ typedef struct struct_message {
|
|
128
128
|
msg_element_cb from_tag;
|
129
129
|
msg_element_cb to_tag;
|
130
130
|
msg_element_cb contact_params;
|
131
|
+
msg_has_param_cb contact_has_reg_id;
|
131
132
|
/* Header value without header params. */
|
132
133
|
header_core_value_cb header_core_value;
|
133
134
|
header_param_cb header_param;
|
@@ -50,6 +50,7 @@ static ID id_to_tag;
|
|
50
50
|
static ID id_routes;
|
51
51
|
static ID id_contact;
|
52
52
|
static ID id_contact_params;
|
53
|
+
static ID id_contact_has_reg_id;
|
53
54
|
static ID id_require;
|
54
55
|
static ID id_proxy_require;
|
55
56
|
static ID id_supported;
|
@@ -362,7 +363,7 @@ static void msg_via_has_rport(VALUE parsed)
|
|
362
363
|
static void msg_via_has_alias(VALUE parsed)
|
363
364
|
{
|
364
365
|
TRACE();
|
365
|
-
|
366
|
+
|
366
367
|
rb_ivar_set(parsed, id_via_has_alias, Qtrue);
|
367
368
|
}
|
368
369
|
|
@@ -588,7 +589,7 @@ static void uri_has_param(VALUE parsed, enum uri_owner owner, enum uri_param_nam
|
|
588
589
|
TRACE();
|
589
590
|
|
590
591
|
VALUE p;
|
591
|
-
|
592
|
+
|
592
593
|
switch(param_name) {
|
593
594
|
case uri_param_lr: p = id_uri_lr_param; break;
|
594
595
|
case uri_param_ob: p = id_uri_ob_param; break;
|
@@ -683,6 +684,14 @@ static void msg_contact_params(VALUE parsed, const char *at, size_t length)
|
|
683
684
|
}
|
684
685
|
|
685
686
|
|
687
|
+
static void msg_contact_has_reg_id(VALUE parsed)
|
688
|
+
{
|
689
|
+
TRACE();
|
690
|
+
|
691
|
+
rb_ivar_set(parsed, id_contact_has_reg_id, Qtrue);
|
692
|
+
}
|
693
|
+
|
694
|
+
|
686
695
|
static void option_tag(VALUE parsed, enum header_field header_field, const char *at, size_t length)
|
687
696
|
{
|
688
697
|
TRACE();
|
@@ -786,6 +795,7 @@ VALUE SipMessageParser_alloc(VALUE klass)
|
|
786
795
|
parser->message.from_tag = msg_from_tag;
|
787
796
|
parser->message.to_tag = msg_to_tag;
|
788
797
|
parser->message.contact_params = msg_contact_params;
|
798
|
+
parser->message.contact_has_reg_id = msg_contact_has_reg_id;
|
789
799
|
parser->message.header_core_value = header_core_value;
|
790
800
|
parser->message.header_param = header_param;
|
791
801
|
parser->message.option_tag = option_tag;
|
@@ -1178,9 +1188,9 @@ void Init_sip_parser()
|
|
1178
1188
|
rb_define_method(cSIPMessageParser, "duplicated_core_header?", SipMessageParser_has_duplicated_core_header,0);
|
1179
1189
|
rb_define_method(cSIPMessageParser, "missing_core_header?", SipMessageParser_has_missing_core_header,0);
|
1180
1190
|
rb_define_method(cSIPMessageParser, "post_parsing", SipMessageParser_post_parsing,0);
|
1181
|
-
|
1191
|
+
|
1182
1192
|
rb_define_module_function(cSIPMessageParser, "headerize", SipMessageParser_Class_headerize,1);
|
1183
|
-
|
1193
|
+
|
1184
1194
|
init_common_headers();
|
1185
1195
|
init_short_headers();
|
1186
1196
|
|
@@ -1213,6 +1223,7 @@ void Init_sip_parser()
|
|
1213
1223
|
id_routes = rb_intern("@routes");
|
1214
1224
|
id_contact = rb_intern("@contact");
|
1215
1225
|
id_contact_params = rb_intern("@contact_params");
|
1226
|
+
id_contact_has_reg_id = rb_intern("@contact_has_reg_id");
|
1216
1227
|
id_require = rb_intern("@require");
|
1217
1228
|
id_proxy_require = rb_intern("@proxy_require");
|
1218
1229
|
id_supported = rb_intern("@supported");
|
@@ -6152,12 +6152,15 @@ case 374:
|
|
6152
6152
|
|
6153
6153
|
#line 77 "haproxy_protocol.rl"
|
6154
6154
|
|
6155
|
-
if(finished && len == p-str)
|
6155
|
+
/* if(finished && len == p-str) */
|
6156
|
+
if(finished)
|
6156
6157
|
haproxy_protocol.valid = 1;
|
6157
6158
|
|
6158
6159
|
/* Write the number of read bytes so the HAProxy Protocol line can be removed. */
|
6159
6160
|
haproxy_protocol.total_len = (int)(p - str);
|
6160
6161
|
|
6162
|
+
printf("**** haproxy_protocol.total_len = %i\n", haproxy_protocol.total_len);
|
6163
|
+
|
6161
6164
|
return haproxy_protocol;
|
6162
6165
|
}
|
6163
6166
|
|
@@ -14,7 +14,7 @@ static VALUE cUtf8Validator;
|
|
14
14
|
* Ruby functions.
|
15
15
|
*/
|
16
16
|
|
17
|
-
VALUE
|
17
|
+
VALUE WsFramingUtils_unmask(VALUE self, VALUE payload, VALUE mask)
|
18
18
|
{
|
19
19
|
char *payload_str, *mask_str;
|
20
20
|
long payload_len; /* mask length is always 4 bytes. */
|
@@ -127,7 +127,7 @@ void Init_ws_framing_utils()
|
|
127
127
|
mFramingUtils = rb_define_module_under(mWebSocket, "FramingUtils");
|
128
128
|
cUtf8Validator = rb_define_class_under(mFramingUtils, "Utf8Validator", rb_cObject);
|
129
129
|
|
130
|
-
rb_define_module_function(mFramingUtils, "unmask",
|
130
|
+
rb_define_module_function(mFramingUtils, "unmask", WsFramingUtils_unmask,2);
|
131
131
|
|
132
132
|
rb_define_alloc_func(cUtf8Validator, Utf8Validator_alloc);
|
133
133
|
rb_define_method(cUtf8Validator, "reset", Utf8Validator_reset,0);
|
data/lib/oversip/config.rb
CHANGED
@@ -38,6 +38,7 @@ module OverSIP
|
|
38
38
|
:listen_port_tls => 5061,
|
39
39
|
:use_tls_tunnel => false,
|
40
40
|
:listen_port_tls_tunnel => 5062,
|
41
|
+
:callback_on_client_tls_handshake => true,
|
41
42
|
:local_domains => nil,
|
42
43
|
:tcp_keepalive_interval => nil,
|
43
44
|
:record_route_hostname_tls_ipv4 => nil,
|
@@ -54,6 +55,7 @@ module OverSIP
|
|
54
55
|
:listen_port_tls => 10443,
|
55
56
|
:use_tls_tunnel => false,
|
56
57
|
:listen_port_tls_tunnel => 10444,
|
58
|
+
:callback_on_client_tls_handshake => true,
|
57
59
|
:max_ws_message_size => 65536,
|
58
60
|
:max_ws_frame_size => 65536,
|
59
61
|
:ws_keepalive_interval => nil
|
@@ -67,52 +69,54 @@ module OverSIP
|
|
67
69
|
|
68
70
|
CONFIG_VALIDATIONS = {
|
69
71
|
:core => {
|
70
|
-
:nameservers
|
71
|
-
:syslog_facility
|
72
|
+
:nameservers => [ :ipv4, :multi_value ],
|
73
|
+
:syslog_facility => [
|
72
74
|
[ :choices,
|
73
75
|
%w{ kern user daemon local0 local1 local2 local3 local4 local5 local6 local7 } ]
|
74
76
|
],
|
75
|
-
:syslog_level
|
77
|
+
:syslog_level => [
|
76
78
|
[ :choices,
|
77
79
|
%w{ debug info notice warn error crit } ]
|
78
80
|
],
|
79
81
|
},
|
80
82
|
:sip => {
|
81
|
-
:sip_udp
|
82
|
-
:sip_tcp
|
83
|
-
:sip_tls
|
84
|
-
:enable_ipv4
|
85
|
-
:listen_ipv4
|
86
|
-
:enable_ipv6
|
87
|
-
:listen_ipv6
|
88
|
-
:listen_port
|
89
|
-
:listen_port_tls
|
90
|
-
:use_tls_tunnel
|
91
|
-
:listen_port_tls_tunnel
|
92
|
-
:
|
93
|
-
:
|
94
|
-
:
|
95
|
-
:
|
83
|
+
:sip_udp => :boolean,
|
84
|
+
:sip_tcp => :boolean,
|
85
|
+
:sip_tls => :boolean,
|
86
|
+
:enable_ipv4 => :boolean,
|
87
|
+
:listen_ipv4 => :ipv4,
|
88
|
+
:enable_ipv6 => :boolean,
|
89
|
+
:listen_ipv6 => :ipv6,
|
90
|
+
:listen_port => :port,
|
91
|
+
:listen_port_tls => :port,
|
92
|
+
:use_tls_tunnel => :boolean,
|
93
|
+
:listen_port_tls_tunnel => :port,
|
94
|
+
:callback_on_client_tls_handshake => :boolean,
|
95
|
+
:local_domains => [ :domain, :multi_value ],
|
96
|
+
:tcp_keepalive_interval => [ :fixnum, [ :greater_equal_than, 180 ] ],
|
97
|
+
:record_route_hostname_tls_ipv4 => :domain,
|
98
|
+
:record_route_hostname_tls_ipv6 => :domain,
|
96
99
|
},
|
97
100
|
:websocket => {
|
98
|
-
:sip_ws
|
99
|
-
:sip_wss
|
100
|
-
:enable_ipv4
|
101
|
-
:listen_ipv4
|
102
|
-
:enable_ipv6
|
103
|
-
:listen_ipv6
|
104
|
-
:listen_port
|
105
|
-
:listen_port_tls
|
106
|
-
:use_tls_tunnel
|
107
|
-
:listen_port_tls_tunnel
|
108
|
-
:
|
109
|
-
:
|
110
|
-
:
|
101
|
+
:sip_ws => :boolean,
|
102
|
+
:sip_wss => :boolean,
|
103
|
+
:enable_ipv4 => :boolean,
|
104
|
+
:listen_ipv4 => :ipv4,
|
105
|
+
:enable_ipv6 => :boolean,
|
106
|
+
:listen_ipv6 => :ipv6,
|
107
|
+
:listen_port => :port,
|
108
|
+
:listen_port_tls => :port,
|
109
|
+
:use_tls_tunnel => :boolean,
|
110
|
+
:listen_port_tls_tunnel => :port,
|
111
|
+
:callback_on_client_tls_handshake => :boolean,
|
112
|
+
:max_ws_message_size => [ :fixnum, [ :minor_than, 1048576 ] ],
|
113
|
+
:max_ws_frame_size => [ :fixnum, [ :minor_than, 1048576 ] ],
|
114
|
+
:ws_keepalive_interval => [ :fixnum, [ :greater_equal_than, 180 ] ]
|
111
115
|
},
|
112
116
|
:tls => {
|
113
|
-
:public_cert
|
114
|
-
:private_cert
|
115
|
-
:ca_dir
|
117
|
+
:public_cert => [ :readable_file, :tls_pem_chain ],
|
118
|
+
:private_cert => [ :readable_file, :tls_pem_private ],
|
119
|
+
:ca_dir => :readable_dir
|
116
120
|
}
|
117
121
|
}
|
118
122
|
|
@@ -306,7 +310,7 @@ module OverSIP
|
|
306
310
|
|
307
311
|
if ( @use_sip_udp_or_tcp or @use_sip_tls ) and @configuration[:sip][:listen_ipv4] == nil and @configuration[:sip][:enable_ipv4]
|
308
312
|
unless (@configuration[:sip][:listen_ipv4] = discover_local_ip(:ipv4))
|
309
|
-
log_system_warn "
|
313
|
+
log_system_warn "disabling IPv4 for SIP"
|
310
314
|
@configuration[:sip][:listen_ipv4] = nil
|
311
315
|
@configuration[:sip][:enable_ipv4] = false
|
312
316
|
end
|
@@ -314,7 +318,7 @@ module OverSIP
|
|
314
318
|
|
315
319
|
if ( @use_sip_udp_or_tcp or @use_sip_tls ) and @configuration[:sip][:listen_ipv6] == nil and @configuration[:sip][:enable_ipv6]
|
316
320
|
unless (@configuration[:sip][:listen_ipv6] = discover_local_ip(:ipv6))
|
317
|
-
log_system_warn "
|
321
|
+
log_system_warn "disabling IPv6 for SIP"
|
318
322
|
@configuration[:sip][:listen_ipv6] = nil
|
319
323
|
@configuration[:sip][:enable_ipv6] = false
|
320
324
|
end
|
@@ -322,7 +326,7 @@ module OverSIP
|
|
322
326
|
|
323
327
|
if ( @use_sip_ws or @use_sip_wss ) and @configuration[:websocket][:listen_ipv4] == nil and @configuration[:websocket][:enable_ipv4]
|
324
328
|
unless (@configuration[:websocket][:listen_ipv4] = discover_local_ip(:ipv4))
|
325
|
-
log_system_warn "
|
329
|
+
log_system_warn "disabling IPv4 for WebSocket"
|
326
330
|
@configuration[:websocket][:listen_ipv4] = nil
|
327
331
|
@configuration[:websocket][:enable_ipv4] = false
|
328
332
|
end
|
@@ -330,7 +334,7 @@ module OverSIP
|
|
330
334
|
|
331
335
|
if ( @use_sip_ws or @use_sip_wss ) and @configuration[:websocket][:listen_ipv6] == nil and @configuration[:websocket][:enable_ipv6]
|
332
336
|
unless (@configuration[:websocket][:listen_ipv6] = discover_local_ip(:ipv6))
|
333
|
-
log_system_warn "
|
337
|
+
log_system_warn "disabling IPv6 for WebSocket"
|
334
338
|
@configuration[:websocket][:listen_ipv6] = nil
|
335
339
|
@configuration[:websocket][:enable_ipv6] = false
|
336
340
|
end
|
@@ -420,6 +424,14 @@ module OverSIP
|
|
420
424
|
end
|
421
425
|
end
|
422
426
|
|
427
|
+
unless @configuration[:sip][:use_tls_tunnel]
|
428
|
+
@configuration[:sip][:listen_port_tls_tunnel] = nil
|
429
|
+
end
|
430
|
+
|
431
|
+
unless @configuration[:websocket][:use_tls_tunnel]
|
432
|
+
@configuration[:websocket][:listen_port_tls_tunnel] = nil
|
433
|
+
end
|
434
|
+
|
423
435
|
[:udp, :tcp].each do |transport|
|
424
436
|
transport_str = transport.to_s.upcase
|
425
437
|
binds[transport].each do |ip, port|
|
@@ -27,6 +27,14 @@ module OverSIP
|
|
27
27
|
log_system_notice "on_request() callback is not defined"
|
28
28
|
end
|
29
29
|
|
30
|
+
def self.on_client_tls_handshake connection, pems
|
31
|
+
log_system_notice "on_client_tls_handshake() callback is not defined"
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.on_server_tls_handshake connection, pems
|
35
|
+
log_system_notice "on_server_tls_handshake() callback is not defined"
|
36
|
+
end
|
37
|
+
|
30
38
|
end
|
31
39
|
|
32
40
|
module WebSocketEvents
|
@@ -41,6 +49,10 @@ module OverSIP
|
|
41
49
|
log_system_notice "on_disconnection() callback is not defined"
|
42
50
|
end
|
43
51
|
|
52
|
+
def self.on_client_tls_handshake connection, pems
|
53
|
+
log_system_notice "on_client_tls_handshake() callback is not defined"
|
54
|
+
end
|
55
|
+
|
44
56
|
end
|
45
57
|
|
46
58
|
end
|
data/lib/oversip/launcher.rb
CHANGED
@@ -106,8 +106,9 @@ module OverSIP::Launcher
|
|
106
106
|
::OverSIP::TLS.module_init
|
107
107
|
::OverSIP::SIP.module_init
|
108
108
|
::OverSIP::SIP::RFC3263.module_init
|
109
|
+
::OverSIP::WebSocket.module_init
|
109
110
|
::OverSIP::WebSocket::WsFraming.class_init
|
110
|
-
::OverSIP::WebSocket::
|
111
|
+
::OverSIP::WebSocket::WsSipApp.class_init
|
111
112
|
|
112
113
|
# I'm the syslogger process.
|
113
114
|
else
|
@@ -211,15 +212,13 @@ module OverSIP::Launcher
|
|
211
212
|
# WebSocket IPv4 TCP SIP server.
|
212
213
|
if configuration[:websocket][:enable_ipv4]
|
213
214
|
::OverSIP::WebSocket::Launcher.run true, :ipv4, configuration[:websocket][:listen_ipv4],
|
214
|
-
configuration[:websocket][:listen_port], :
|
215
|
-
::OverSIP::WebSocket::WS_SIP_PROTOCOL
|
215
|
+
configuration[:websocket][:listen_port], :ws
|
216
216
|
end
|
217
217
|
|
218
218
|
# WebSocket IPv6 TCP SIP server.
|
219
219
|
if configuration[:websocket][:enable_ipv6]
|
220
220
|
::OverSIP::WebSocket::Launcher.run true, :ipv6, configuration[:websocket][:listen_ipv6],
|
221
|
-
configuration[:websocket][:listen_port], :
|
222
|
-
::OverSIP::WebSocket::WS_SIP_PROTOCOL
|
221
|
+
configuration[:websocket][:listen_port], :ws
|
223
222
|
end
|
224
223
|
end
|
225
224
|
|
@@ -228,27 +227,23 @@ module OverSIP::Launcher
|
|
228
227
|
# WebSocket IPv4 TLS SIP server (native).
|
229
228
|
if configuration[:websocket][:enable_ipv4]
|
230
229
|
::OverSIP::WebSocket::Launcher.run true, :ipv4, configuration[:websocket][:listen_ipv4],
|
231
|
-
configuration[:websocket][:listen_port_tls], :
|
232
|
-
::OverSIP::WebSocket::WS_SIP_PROTOCOL
|
230
|
+
configuration[:websocket][:listen_port_tls], :wss
|
233
231
|
end
|
234
232
|
|
235
233
|
# WebSocket IPv6 TLS SIP server (native).
|
236
234
|
if configuration[:websocket][:enable_ipv6]
|
237
235
|
::OverSIP::WebSocket::Launcher.run true, :ipv6, configuration[:websocket][:listen_ipv6],
|
238
|
-
configuration[:websocket][:listen_port_tls], :
|
239
|
-
::OverSIP::WebSocket::WS_SIP_PROTOCOL
|
236
|
+
configuration[:websocket][:listen_port_tls], :wss
|
240
237
|
end
|
241
238
|
else
|
242
239
|
# WebSocket IPv4 TLS SIP server (Stud).
|
243
240
|
if configuration[:websocket][:enable_ipv4]
|
244
241
|
::OverSIP::WebSocket::Launcher.run true, :ipv4, "127.0.0.1",
|
245
|
-
configuration[:websocket][:listen_port_tls_tunnel], :
|
246
|
-
::OverSIP::WebSocket::WS_SIP_PROTOCOL,
|
242
|
+
configuration[:websocket][:listen_port_tls_tunnel], :wss_tunnel,
|
247
243
|
configuration[:websocket][:listen_ipv4],
|
248
244
|
configuration[:websocket][:listen_port_tls]
|
249
245
|
::OverSIP::WebSocket::Launcher.run false, :ipv4, configuration[:websocket][:listen_ipv4],
|
250
|
-
configuration[:websocket][:listen_port_tls], :
|
251
|
-
::OverSIP::WebSocket::WS_SIP_PROTOCOL
|
246
|
+
configuration[:websocket][:listen_port_tls], :wss
|
252
247
|
|
253
248
|
# Spawn a Stud process.
|
254
249
|
spawn_stud_process options,
|
@@ -260,13 +255,11 @@ module OverSIP::Launcher
|
|
260
255
|
# WebSocket IPv6 TLS SIP server (Stud).
|
261
256
|
if configuration[:sip][:enable_ipv6]
|
262
257
|
::OverSIP::WebSocket::Launcher.run true, :ipv6, "::1",
|
263
|
-
configuration[:websocket][:listen_port_tls_tunnel], :
|
264
|
-
::OverSIP::WebSocket::WS_SIP_PROTOCOL,
|
258
|
+
configuration[:websocket][:listen_port_tls_tunnel], :wss_tunnel,
|
265
259
|
configuration[:websocket][:listen_ipv6],
|
266
260
|
configuration[:websocket][:listen_port_tls]
|
267
261
|
::OverSIP::WebSocket::Launcher.run false, :ipv6, configuration[:websocket][:listen_ipv6],
|
268
|
-
configuration[:websocket][:listen_port_tls], :
|
269
|
-
::OverSIP::WebSocket::WS_SIP_PROTOCOL
|
262
|
+
configuration[:websocket][:listen_port_tls], :wss
|
270
263
|
|
271
264
|
# Spawn a Stud process.
|
272
265
|
spawn_stud_process options,
|
@@ -278,24 +271,6 @@ module OverSIP::Launcher
|
|
278
271
|
end
|
279
272
|
|
280
273
|
|
281
|
-
# TEST: WebSocket Autobahn server.
|
282
|
-
#if configuration[:websocket][:sip_ws]
|
283
|
-
# if configuration[:websocket][:enable_ipv4]
|
284
|
-
# ::OverSIP::WebSocket::Launcher.run true, :ipv4, configuration[:websocket][:listen_ipv4],
|
285
|
-
# 9001, :tcp,
|
286
|
-
# ::OverSIP::WebSocket::WS_AUTOBAHN_PROTOCOL
|
287
|
-
# end
|
288
|
-
#end
|
289
|
-
#
|
290
|
-
#if configuration[:websocket][:sip_wss]
|
291
|
-
# if configuration[:websocket][:enable_ipv4]
|
292
|
-
# ::OverSIP::WebSocket::Launcher.run true, :ipv4, configuration[:websocket][:listen_ipv4],
|
293
|
-
# 9002, :tls,
|
294
|
-
# ::OverSIP::WebSocket::WS_AUTOBAHN_PROTOCOL
|
295
|
-
# end
|
296
|
-
#end
|
297
|
-
|
298
|
-
|
299
274
|
# Change process permissions if requested.
|
300
275
|
set_user_group(options[:user], options[:group])
|
301
276
|
|
@@ -43,6 +43,7 @@ require "oversip/sip/tags.rb"
|
|
43
43
|
require "oversip/sip/rfc3263.rb"
|
44
44
|
require "oversip/sip/proxy.rb"
|
45
45
|
|
46
|
+
require "oversip/websocket/websocket.rb"
|
46
47
|
require "oversip/websocket/ws_http_parser.so"
|
47
48
|
require "oversip/websocket/constants.rb"
|
48
49
|
require "oversip/websocket/http_request.rb"
|
@@ -50,8 +51,7 @@ require "oversip/websocket/listeners.rb"
|
|
50
51
|
require "oversip/websocket/launcher.rb"
|
51
52
|
require "oversip/websocket/ws_framing_utils.so"
|
52
53
|
require "oversip/websocket/ws_framing.rb"
|
53
|
-
require "oversip/websocket/
|
54
|
-
require "oversip/websocket/ws_apps.rb"
|
54
|
+
require "oversip/websocket/ws_sip_app.rb"
|
55
55
|
|
56
56
|
require "oversip/sip/modules/core.rb"
|
57
57
|
require "oversip/sip/modules/user_assertion.rb"
|
@@ -23,7 +23,7 @@ module OverSIP
|
|
23
23
|
:timer_B => 32,
|
24
24
|
:timer_C => 120,
|
25
25
|
:timer_F => 32,
|
26
|
-
:
|
26
|
+
:callback_on_server_tls_handshake => true
|
27
27
|
}
|
28
28
|
|
29
29
|
PROXY_CONFIG_VALIDATIONS = {
|
@@ -40,7 +40,7 @@ module OverSIP
|
|
40
40
|
:timer_B => [ :fixnum, [ :greater_equal_than, 2 ], [ :minor_equal_than, 64 ] ],
|
41
41
|
:timer_C => [ :fixnum, [ :greater_equal_than, 8 ], [ :minor_equal_than, 180 ] ],
|
42
42
|
:timer_F => [ :fixnum, [ :greater_equal_than, 2 ], [ :minor_equal_than, 64 ] ],
|
43
|
-
:
|
43
|
+
:callback_on_server_tls_handshake => :boolean
|
44
44
|
}
|
45
45
|
|
46
46
|
def self.load proxies_yaml, reload=false
|
@@ -55,7 +55,7 @@ module OverSIP::SIP
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
@connection = ::OverSIP::SIP::TransportManager.get_connection @server_klass, @ip, @port, self, transaction_conf[:
|
58
|
+
@connection = ::OverSIP::SIP::TransportManager.get_connection @server_klass, @ip, @port, self, transaction_conf[:callback_on_server_tls_handshake]
|
59
59
|
end
|
60
60
|
|
61
61
|
# Ensure the request has Content-Length. Add it otherwise.
|
@@ -187,9 +187,6 @@ module OverSIP::SIP
|
|
187
187
|
# Set server transaction variables to the response.
|
188
188
|
response.tvars = @request.tvars
|
189
189
|
|
190
|
-
# Set original request's connection variables to the response.
|
191
|
-
response.cvars = @request.cvars
|
192
|
-
|
193
190
|
# Provisional response
|
194
191
|
if response.status_code < 200
|
195
192
|
case @state
|
@@ -506,9 +503,6 @@ module OverSIP::SIP
|
|
506
503
|
# Set server transaction variables to the response.
|
507
504
|
response.tvars = @request.tvars
|
508
505
|
|
509
|
-
# Set original request's connection variables to the response.
|
510
|
-
response.cvars = @request.cvars
|
511
|
-
|
512
506
|
# Provisional response
|
513
507
|
if response.status_code < 200
|
514
508
|
case @state
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module OverSIP::SIP
|
2
2
|
|
3
3
|
class Uri
|
4
|
-
attr_reader :scheme, :user, :host, :host_type, :port, :params, :transport_param, :
|
4
|
+
attr_reader :scheme, :user, :host, :host_type, :port, :params, :transport_param, :phone_context_param, :ovid_param, :headers
|
5
5
|
attr_accessor :uri_modified
|
6
6
|
|
7
7
|
def scheme= value
|
@@ -63,6 +63,28 @@ module OverSIP::SIP
|
|
63
63
|
false
|
64
64
|
end
|
65
65
|
|
66
|
+
def transport_param= value
|
67
|
+
return nil unless @scheme == :sip or @scheme == :sips
|
68
|
+
if value
|
69
|
+
@transport_param = value.to_sym
|
70
|
+
set_param "transport", value.to_s
|
71
|
+
else
|
72
|
+
@transport_param = nil
|
73
|
+
del_param "transport"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def phone_context_param= value
|
78
|
+
return nil unless @scheme == :tel
|
79
|
+
if value
|
80
|
+
@phone_context_param = value.to_sym
|
81
|
+
set_param "phone-context", value.to_s
|
82
|
+
else
|
83
|
+
@phone_context_param = nil
|
84
|
+
del_param "phone-context"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
66
88
|
def lr_param?
|
67
89
|
@lr_param ? true : false
|
68
90
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module OverSIP::SIP
|
2
2
|
|
3
|
-
class
|
3
|
+
class Connection < ::EM::Connection
|
4
4
|
|
5
5
|
include ::OverSIP::Logger
|
6
6
|
include ::OverSIP::SIP::MessageProcessor
|
@@ -19,10 +19,14 @@ module OverSIP::SIP
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
|
23
|
+
attr_reader :cvars
|
24
|
+
|
22
25
|
def initialize
|
23
26
|
@parser = ::OverSIP::SIP::MessageParser.new
|
24
27
|
@buffer = ::IO::Buffer.new
|
25
28
|
@state = :init
|
29
|
+
@cvars = {}
|
26
30
|
|
27
31
|
# Set the socket sending error handling to report the error:
|
28
32
|
# :ERRORHANDLING_KILL, :ERRORHANDLING_IGNORE, :ERRORHANDLING_REPORT
|
@@ -33,7 +37,17 @@ module OverSIP::SIP
|
|
33
37
|
log_system_error "Socket sending error: #{error.inspect}, #{data.inspect}"
|
34
38
|
end
|
35
39
|
|
36
|
-
|
40
|
+
def transport
|
41
|
+
self.class.transport
|
42
|
+
end
|
43
|
+
|
44
|
+
def open?
|
45
|
+
! error?
|
46
|
+
end
|
47
|
+
|
48
|
+
# close() method causes @local_closed = true.
|
49
|
+
alias close close_connection_after_writing
|
50
|
+
end
|
37
51
|
|
38
52
|
end
|
39
53
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module OverSIP::SIP
|
2
2
|
|
3
|
-
class TcpClient <
|
3
|
+
class TcpClient < TcpConnection
|
4
4
|
|
5
5
|
attr_reader :connected
|
6
6
|
attr_reader :pending_client_transactions
|
7
7
|
|
8
8
|
def initialize ip, port
|
9
|
-
# NOTE: The parent class implementing "initialize" method is
|
9
|
+
# NOTE: The parent class implementing "initialize" method is Connection, and allows no arguments.
|
10
10
|
# If we call just "super" from here it will fail since "ip" and "port" will be passed as
|
11
11
|
# arguments. So we must use "super()" and we are done (no arguments are passed to parent).
|
12
12
|
super()
|
@@ -19,7 +19,6 @@ module OverSIP::SIP
|
|
19
19
|
|
20
20
|
### TODO: make it configurable.
|
21
21
|
set_pending_connect_timeout 2.0
|
22
|
-
|
23
22
|
end
|
24
23
|
|
25
24
|
|
@@ -1,11 +1,23 @@
|
|
1
1
|
module OverSIP::SIP
|
2
2
|
|
3
|
-
class
|
3
|
+
class TcpConnection < Connection
|
4
4
|
|
5
5
|
# Max size (bytes) of the buffered data when receiving message headers
|
6
6
|
# (avoid DoS attacks).
|
7
7
|
HEADERS_MAX_SIZE = 16384
|
8
8
|
|
9
|
+
def remote_ip_type
|
10
|
+
@remote_ip_type || self.class.ip_type
|
11
|
+
end
|
12
|
+
|
13
|
+
def remote_ip
|
14
|
+
@remote_ip
|
15
|
+
end
|
16
|
+
|
17
|
+
def remote_port
|
18
|
+
@remote_port
|
19
|
+
end
|
20
|
+
|
9
21
|
def receive_data data
|
10
22
|
@state == :ignore and return
|
11
23
|
@buffer << data
|
@@ -104,7 +116,7 @@ module OverSIP::SIP
|
|
104
116
|
@msg.source_port = @remote_port
|
105
117
|
@msg.source_ip_type = @remote_ip_type || self.class.ip_type
|
106
118
|
|
107
|
-
unless valid_message?
|
119
|
+
unless valid_message? @parser
|
108
120
|
close_connection_after_writing
|
109
121
|
@state = :ignore
|
110
122
|
return false
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module OverSIP::SIP
|
2
2
|
|
3
|
-
class TcpServer <
|
3
|
+
class TcpServer < TcpConnection
|
4
4
|
|
5
5
|
attr_reader :outbound_flow_token
|
6
6
|
|
@@ -14,8 +14,6 @@ module OverSIP::SIP
|
|
14
14
|
return
|
15
15
|
end
|
16
16
|
|
17
|
-
log_system_info "connection opened from " << remote_desc
|
18
|
-
|
19
17
|
@connection_id = ::OverSIP::SIP::TransportManager.add_connection self, self.class, self.class.ip_type, @remote_ip, @remote_port
|
20
18
|
|
21
19
|
# Create an Outbound (RFC 5626) flow token for this connection.
|
@@ -30,8 +28,7 @@ module OverSIP::SIP
|
|
30
28
|
set_sock_opt Socket::SOL_TCP, Socket::TCP_KEEPINTVL, ::OverSIP::SIP.tcp_keepalive_interval # Interval between TCP pings.
|
31
29
|
end
|
32
30
|
|
33
|
-
|
34
|
-
@cvars = {}
|
31
|
+
log_system_info "connection opened from " << remote_desc
|
35
32
|
end
|
36
33
|
|
37
34
|
def remote_desc force=nil
|