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,126 @@
|
|
|
1
|
+
require "openssl"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module OverSIP
|
|
5
|
+
|
|
6
|
+
module Config
|
|
7
|
+
|
|
8
|
+
module Validators
|
|
9
|
+
|
|
10
|
+
extend ::OverSIP::Logger
|
|
11
|
+
|
|
12
|
+
DOMAIN_REGEXP = /^(([0-9a-zA-Z\-_])+\.)*([0-9a-zA-Z\-_])+$/
|
|
13
|
+
TLS_PEM_CHAIN_REGEXP = /-{5}BEGIN CERTIFICATE-{5}\n.*?-{5}END CERTIFICATE-{5}\n/m
|
|
14
|
+
|
|
15
|
+
def boolean value
|
|
16
|
+
value == true or value == false
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def string value
|
|
20
|
+
value.is_a? ::String
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def fixnum value
|
|
24
|
+
value.is_a? ::Fixnum
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def port value
|
|
28
|
+
fixnum(value) and value.between?(1,65536)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def ipv4 value
|
|
32
|
+
return false unless value.is_a? ::String
|
|
33
|
+
::OverSIP::Utils.ip_type(value) == :ipv4 and value != "0.0.0.0"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def ipv6 value
|
|
37
|
+
return false unless value.is_a? ::String
|
|
38
|
+
::OverSIP::Utils.ip_type(value) == :ipv6 and ::OverSIP::Utils.normalize_ipv6(value) != "::"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def ipv4_any value
|
|
42
|
+
return false unless value.is_a? ::String
|
|
43
|
+
::OverSIP::Utils.ip_type(value) == :ipv4
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def ipv6_any value
|
|
47
|
+
return false unless value.is_a? ::String
|
|
48
|
+
::OverSIP::Utils.ip_type(value) == :ipv6
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def domain value
|
|
52
|
+
value =~ DOMAIN_REGEXP
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def choices value, choices
|
|
56
|
+
choices.include? value
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def greater_than value, minimum
|
|
60
|
+
value > minimum rescue false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def greater_equal_than value, minimum
|
|
64
|
+
value >= minimum rescue false
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def minor_than value, maximum
|
|
68
|
+
value < maximum rescue false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def minor_equal_than value, maximum
|
|
72
|
+
value <= maximum rescue false
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def readable_file file
|
|
76
|
+
::File.file?(file) and ::File.readable?(file)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def readable_dir dir
|
|
80
|
+
::File.directory?(dir) and ::File.readable?(dir)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def tls_pem_chain file
|
|
84
|
+
chain = ::File.read file
|
|
85
|
+
pems = chain.scan(TLS_PEM_CHAIN_REGEXP).flatten
|
|
86
|
+
pem_found = nil
|
|
87
|
+
|
|
88
|
+
begin
|
|
89
|
+
pems.each do |pem|
|
|
90
|
+
::OpenSSL::X509::Certificate.new pem
|
|
91
|
+
pem_found = true
|
|
92
|
+
end
|
|
93
|
+
rescue => e
|
|
94
|
+
log_system_error "#{e.class}: #{e.message}"
|
|
95
|
+
return false
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
if pem_found
|
|
99
|
+
return true
|
|
100
|
+
else
|
|
101
|
+
log_system_error "no valid X509 PEM found in the file"
|
|
102
|
+
return false
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def tls_pem_private file
|
|
107
|
+
pem = ::File.read file
|
|
108
|
+
key_classes = [::OpenSSL::PKey::RSA, ::OpenSSL::PKey::DSA]
|
|
109
|
+
|
|
110
|
+
begin
|
|
111
|
+
key_class = key_classes.shift
|
|
112
|
+
key_class.new pem
|
|
113
|
+
return true
|
|
114
|
+
rescue => e
|
|
115
|
+
retry if key_classes.any?
|
|
116
|
+
log_system_error e.message
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
return false
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end # module Validators
|
|
123
|
+
|
|
124
|
+
end # module Config
|
|
125
|
+
|
|
126
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module OverSIP
|
|
2
|
+
|
|
3
|
+
module SystemEvents
|
|
4
|
+
|
|
5
|
+
extend ::OverSIP::Logger
|
|
6
|
+
|
|
7
|
+
def self.on_initialize
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.on_started
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.on_user_reload
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.on_terminated error
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
module SipEvents
|
|
23
|
+
|
|
24
|
+
extend ::OverSIP::Logger
|
|
25
|
+
|
|
26
|
+
def self.on_request request
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.on_client_tls_handshake connection, pems
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.on_server_tls_handshake connection, pems
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
module WebSocketEvents
|
|
38
|
+
|
|
39
|
+
extend ::OverSIP::Logger
|
|
40
|
+
|
|
41
|
+
def self.on_connection connection, http_request
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.on_disconnection connection, client_closed
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.on_client_tls_handshake connection, pems
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# NOTE: Extracted from https://github.com/schmurfy/fiber_pool.
|
|
2
|
+
|
|
3
|
+
module OverSIP
|
|
4
|
+
class FiberPool
|
|
5
|
+
|
|
6
|
+
# Prepare a list of fibers that are able to run different blocks of code
|
|
7
|
+
# every time. Once a fiber is done with its block, it attempts to fetch
|
|
8
|
+
# another one from the queue.
|
|
9
|
+
def initialize count = 100
|
|
10
|
+
@fibers,@busy_fibers,@queue = [],{},[]
|
|
11
|
+
|
|
12
|
+
count.times do |i|
|
|
13
|
+
add_fiber()
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add_fiber
|
|
18
|
+
fiber = ::Fiber.new do |block|
|
|
19
|
+
loop do
|
|
20
|
+
block.call
|
|
21
|
+
unless @queue.empty?
|
|
22
|
+
block = @queue.shift
|
|
23
|
+
else
|
|
24
|
+
@busy_fibers.delete ::Fiber.current.object_id
|
|
25
|
+
@fibers.unshift ::Fiber.current
|
|
26
|
+
block = ::Fiber.yield
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
@fibers << fiber
|
|
32
|
+
fiber
|
|
33
|
+
end
|
|
34
|
+
private :add_fiber
|
|
35
|
+
|
|
36
|
+
# If there is an available fiber use it, otherwise, leave it to linger
|
|
37
|
+
# in a queue.
|
|
38
|
+
def spawn &block
|
|
39
|
+
# resurrect dead fibers
|
|
40
|
+
@busy_fibers.values.reject(&:alive?).each do |f|
|
|
41
|
+
@busy_fibers.delete f.object_id
|
|
42
|
+
add_fiber()
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
if (fiber = @fibers.shift)
|
|
46
|
+
@busy_fibers[fiber.object_id] = fiber
|
|
47
|
+
fiber.resume block
|
|
48
|
+
else
|
|
49
|
+
@queue << block
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
fiber
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end # class FiberPool
|
|
56
|
+
end
|