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.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +22 -0
  3. data/LICENSE +25 -0
  4. data/README.md +43 -0
  5. data/Rakefile +54 -0
  6. data/bin/oversip +184 -0
  7. data/etc/oversip.conf +274 -0
  8. data/etc/proxies.conf +145 -0
  9. data/etc/server.rb +315 -0
  10. data/etc/tls/ca/cacert.pem +3894 -0
  11. data/etc/tls/demo-tls.oversip.net.crt +17 -0
  12. data/etc/tls/demo-tls.oversip.net.key +15 -0
  13. data/etc/tls/upgrade-cacert.sh +12 -0
  14. data/etc/tls/utils/create-cert.rb +162 -0
  15. data/etc/tls/utils/get-sip-identities.rb +95 -0
  16. data/ext/common/c_util.h +74 -0
  17. data/ext/common/ruby_c_util.h +88 -0
  18. data/ext/sip_parser/common_headers.h +210 -0
  19. data/ext/sip_parser/ext_help.h +18 -0
  20. data/ext/sip_parser/extconf.rb +3 -0
  21. data/ext/sip_parser/sip_message_parser.c +29741 -0
  22. data/ext/sip_parser/sip_parser.h +250 -0
  23. data/ext/sip_parser/sip_parser_ruby.c +1370 -0
  24. data/ext/sip_parser/sip_uri_parser.c +39699 -0
  25. data/ext/stud/extconf.rb +43 -0
  26. data/ext/stun/ext_help.h +16 -0
  27. data/ext/stun/extconf.rb +3 -0
  28. data/ext/stun/stun_ruby.c +394 -0
  29. data/ext/utils/ext_help.h +14 -0
  30. data/ext/utils/extconf.rb +3 -0
  31. data/ext/utils/haproxy_protocol.c +6163 -0
  32. data/ext/utils/haproxy_protocol.h +27 -0
  33. data/ext/utils/ip_utils.c +5952 -0
  34. data/ext/utils/ip_utils.h +64 -0
  35. data/ext/utils/outbound_utils.c +3227 -0
  36. data/ext/utils/outbound_utils.h +27 -0
  37. data/ext/utils/utils_ruby.c +392 -0
  38. data/ext/utils/utils_ruby.h +76 -0
  39. data/ext/websocket_framing_utils/ext_help.h +18 -0
  40. data/ext/websocket_framing_utils/extconf.rb +3 -0
  41. data/ext/websocket_framing_utils/ws_framing_utils.h +47 -0
  42. data/ext/websocket_framing_utils/ws_framing_utils_ruby.c +135 -0
  43. data/ext/websocket_http_parser/ext_help.h +18 -0
  44. data/ext/websocket_http_parser/extconf.rb +3 -0
  45. data/ext/websocket_http_parser/ws_http_parser.c +1635 -0
  46. data/ext/websocket_http_parser/ws_http_parser.h +87 -0
  47. data/ext/websocket_http_parser/ws_http_parser_ruby.c +630 -0
  48. data/lib/oversip/config.rb +597 -0
  49. data/lib/oversip/config_validators.rb +126 -0
  50. data/lib/oversip/default_server.rb +52 -0
  51. data/lib/oversip/errors.rb +10 -0
  52. data/lib/oversip/fiber_pool.rb +56 -0
  53. data/lib/oversip/launcher.rb +635 -0
  54. data/lib/oversip/logger.rb +84 -0
  55. data/lib/oversip/modules/outbound_mangling.rb +56 -0
  56. data/lib/oversip/modules/user_assertion.rb +73 -0
  57. data/lib/oversip/proxies_config.rb +189 -0
  58. data/lib/oversip/ruby_ext/eventmachine.rb +38 -0
  59. data/lib/oversip/sip/client.rb +428 -0
  60. data/lib/oversip/sip/client_transaction.rb +586 -0
  61. data/lib/oversip/sip/constants.rb +88 -0
  62. data/lib/oversip/sip/core.rb +217 -0
  63. data/lib/oversip/sip/launcher.rb +221 -0
  64. data/lib/oversip/sip/listeners/connection.rb +54 -0
  65. data/lib/oversip/sip/listeners/ipv4_tcp_client.rb +21 -0
  66. data/lib/oversip/sip/listeners/ipv4_tcp_server.rb +22 -0
  67. data/lib/oversip/sip/listeners/ipv4_tls_client.rb +21 -0
  68. data/lib/oversip/sip/listeners/ipv4_tls_server.rb +22 -0
  69. data/lib/oversip/sip/listeners/ipv4_tls_tunnel_server.rb +22 -0
  70. data/lib/oversip/sip/listeners/ipv4_udp_server.rb +21 -0
  71. data/lib/oversip/sip/listeners/ipv6_tcp_client.rb +21 -0
  72. data/lib/oversip/sip/listeners/ipv6_tcp_server.rb +22 -0
  73. data/lib/oversip/sip/listeners/ipv6_tls_client.rb +21 -0
  74. data/lib/oversip/sip/listeners/ipv6_tls_server.rb +22 -0
  75. data/lib/oversip/sip/listeners/ipv6_tls_tunnel_server.rb +22 -0
  76. data/lib/oversip/sip/listeners/ipv6_udp_server.rb +21 -0
  77. data/lib/oversip/sip/listeners/tcp_client.rb +97 -0
  78. data/lib/oversip/sip/listeners/tcp_connection.rb +202 -0
  79. data/lib/oversip/sip/listeners/tcp_server.rb +71 -0
  80. data/lib/oversip/sip/listeners/tls_client.rb +125 -0
  81. data/lib/oversip/sip/listeners/tls_server.rb +88 -0
  82. data/lib/oversip/sip/listeners/tls_tunnel_connection.rb +89 -0
  83. data/lib/oversip/sip/listeners/tls_tunnel_server.rb +61 -0
  84. data/lib/oversip/sip/listeners/udp_connection.rb +214 -0
  85. data/lib/oversip/sip/listeners.rb +24 -0
  86. data/lib/oversip/sip/message.rb +177 -0
  87. data/lib/oversip/sip/message_processor.rb +213 -0
  88. data/lib/oversip/sip/name_addr.rb +51 -0
  89. data/lib/oversip/sip/proxy.rb +324 -0
  90. data/lib/oversip/sip/request.rb +179 -0
  91. data/lib/oversip/sip/response.rb +37 -0
  92. data/lib/oversip/sip/rfc3263.rb +643 -0
  93. data/lib/oversip/sip/server_transaction.rb +295 -0
  94. data/lib/oversip/sip/sip.rb +76 -0
  95. data/lib/oversip/sip/tags.rb +39 -0
  96. data/lib/oversip/sip/timers.rb +55 -0
  97. data/lib/oversip/sip/transport_manager.rb +130 -0
  98. data/lib/oversip/sip/uac.rb +89 -0
  99. data/lib/oversip/sip/uac_request.rb +84 -0
  100. data/lib/oversip/sip/uri.rb +208 -0
  101. data/lib/oversip/syslog.rb +68 -0
  102. data/lib/oversip/system_callbacks.rb +45 -0
  103. data/lib/oversip/tls.rb +172 -0
  104. data/lib/oversip/utils.rb +30 -0
  105. data/lib/oversip/version.rb +21 -0
  106. data/lib/oversip/websocket/constants.rb +55 -0
  107. data/lib/oversip/websocket/http_request.rb +59 -0
  108. data/lib/oversip/websocket/launcher.rb +183 -0
  109. data/lib/oversip/websocket/listeners/connection.rb +51 -0
  110. data/lib/oversip/websocket/listeners/ipv4_ws_server.rb +22 -0
  111. data/lib/oversip/websocket/listeners/ipv4_wss_server.rb +22 -0
  112. data/lib/oversip/websocket/listeners/ipv4_wss_tunnel_server.rb +22 -0
  113. data/lib/oversip/websocket/listeners/ipv6_ws_server.rb +22 -0
  114. data/lib/oversip/websocket/listeners/ipv6_wss_server.rb +22 -0
  115. data/lib/oversip/websocket/listeners/ipv6_wss_tunnel_server.rb +22 -0
  116. data/lib/oversip/websocket/listeners/ws_server.rb +331 -0
  117. data/lib/oversip/websocket/listeners/wss_server.rb +88 -0
  118. data/lib/oversip/websocket/listeners/wss_tunnel_server.rb +133 -0
  119. data/lib/oversip/websocket/listeners.rb +13 -0
  120. data/lib/oversip/websocket/websocket.rb +13 -0
  121. data/lib/oversip/websocket/ws_framing.rb +545 -0
  122. data/lib/oversip/websocket/ws_sip_app.rb +120 -0
  123. data/lib/oversip.rb +127 -0
  124. data/test/oversip_test_helper.rb +19 -0
  125. data/test/test_http_parser.rb +73 -0
  126. data/test/test_name_addr.rb +27 -0
  127. data/test/test_name_addr_parser.rb +24 -0
  128. data/test/test_sip_message_parser.rb +168 -0
  129. data/test/test_sip_uri_parser.rb +56 -0
  130. data/test/test_uri.rb +68 -0
  131. data/thirdparty/stud/stud.tar.gz +0 -0
  132. 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,10 @@
1
+ module OverSIP
2
+
3
+ class Error < ::StandardError ; end
4
+
5
+ class ConfigurationError < Error ; end
6
+ class RuntimeError < Error ; end
7
+
8
+ class ParsingError < RuntimeError ; end
9
+
10
+ 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