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,179 @@
1
+ module OverSIP::SIP
2
+
3
+ class Request < Message
4
+
5
+ include ::OverSIP::SIP::Core
6
+
7
+ SECURE_TRANSPORTS = { :tls=>true, :wss=>true }
8
+
9
+ attr_accessor :server_transaction
10
+ attr_reader :ruri
11
+ attr_reader :new_max_forwards
12
+ attr_accessor :antiloop_id
13
+ attr_accessor :route_outbound_flow_token
14
+ attr_writer :outgoing_outbound_requested, :incoming_outbound_requested
15
+ attr_accessor :proxied # If true it means that this request has been already proxied.
16
+ attr_reader :from_was_modified, :to_was_modified # Set to true if the From / To has been modified prior to routing the request.
17
+
18
+ # Used for internal purposes when doing proxy and adding the first Record-Route
19
+ # or Path.
20
+ attr_accessor :in_rr
21
+
22
+ attr_accessor :cvars # Connection variables (a hash).
23
+
24
+
25
+ def log_id
26
+ @log_id ||= "SIP Request #{@via_branch_id}"
27
+ end
28
+
29
+ def request? ; true end
30
+ def response? ; false end
31
+
32
+ def initial? ; ! @to_tag end
33
+ def in_dialog? ; @to_tag end
34
+
35
+ def secure?
36
+ SECURE_TRANSPORTS[@transport] || false
37
+ end
38
+
39
+
40
+ def reply status_code, reason_phrase=nil, extra_headers=[], body=nil
41
+ if @sip_method == :ACK
42
+ log_system_error "attemtp to reply to an ACK aborted"
43
+ return false
44
+ end
45
+ return false unless @server_transaction.receive_response(status_code) if @server_transaction
46
+
47
+ reason_phrase ||= REASON_PHRASE[status_code] || REASON_PHRASE_NOT_SET
48
+
49
+ if status_code > 100
50
+ @internal_to_tag ||= @to_tag || ( @server_transaction ? ::SecureRandom.hex(6) : ::OverSIP::SIP::Tags.totag_for_sl_reply )
51
+ end
52
+
53
+ response = "SIP/2.0 #{status_code} #{reason_phrase}\r\n"
54
+
55
+ @hdr_via.each do |hdr|
56
+ response << "Via: " << hdr << CRLF
57
+ end
58
+
59
+ response << "From: " << @hdr_from << CRLF
60
+
61
+ response << "To: " << @hdr_to
62
+ response << ";tag=#{@internal_to_tag}" if @internal_to_tag
63
+ response << CRLF
64
+
65
+ response << "Call-ID: " << @call_id << CRLF
66
+ response << "CSeq: " << @cseq.to_s << " " << @sip_method.to_s << CRLF
67
+ response << "Content-Length: #{body ? body.bytesize : "0"}\r\n"
68
+
69
+ extra_headers.each do |header|
70
+ response << header.to_s << CRLF
71
+ end if extra_headers
72
+
73
+ response << HDR_SERVER << CRLF
74
+ response << CRLF
75
+
76
+ response << body if body
77
+
78
+ @server_transaction.last_response = response if @server_transaction
79
+
80
+ log_system_debug "replying #{status_code} \"#{reason_phrase}\"" if $oversip_debug
81
+
82
+ send_response(response)
83
+ true
84
+ end
85
+
86
+
87
+ def reply_full response
88
+ return false unless @server_transaction.receive_response(response.status_code) if @server_transaction
89
+
90
+ # Ensure the response has Content-Length. Add it otherwise.
91
+ if response.body
92
+ response.headers["Content-Length"] = [ response.body.bytesize.to_s ]
93
+ else
94
+ response.headers["Content-Length"] = HDR_ARRAY_CONTENT_LENGTH_0
95
+ end
96
+
97
+ response_leg_a = response.to_s
98
+ @server_transaction.last_response = response_leg_a if @server_transaction
99
+
100
+ log_system_debug "forwarding response #{response.status_code} \"#{response.reason_phrase}\"" if $oversip_debug
101
+
102
+ send_response(response_leg_a)
103
+ true
104
+ end
105
+
106
+
107
+ # RFC 6228 (199 response).
108
+ def reply_199 response
109
+ # Store the previous internal To-tag (if set).
110
+ internal_to_tag = @internal_to_tag
111
+
112
+ # Set it with the To-tag of the response for which a 199 must eb generated.
113
+ @internal_to_tag = response.to_tag
114
+
115
+ # Send the 199 response.
116
+ reply 199, "Early Dialog Terminated", [ "Reason: SIP ;cause=#{response.status_code} ;text=\"#{response.reason_phrase}\"" ]
117
+
118
+ # Restore the previous internal To-tag.
119
+ @internal_to_tag = internal_to_tag
120
+ true
121
+ end
122
+ private :reply_199
123
+
124
+
125
+ def ruri= ruri
126
+ case ruri
127
+ when ::OverSIP::SIP::Uri, ::OverSIP::SIP::NameAddr
128
+ @ruri = ruri
129
+ when ::String
130
+ @ruri = OverSIP::SIP::Uri.parse ruri
131
+ else
132
+ raise ::OverSIP::RuntimeError, "invalid URI #{ruri.inspect}"
133
+ end
134
+ end
135
+
136
+
137
+ def send_response(response)
138
+ unless (case @transport
139
+ when :udp
140
+ @connection.send_sip_msg response, @source_ip, @via_rport || @via_sent_by_port || 5060
141
+ else
142
+ @connection.send_sip_msg response
143
+ end
144
+ )
145
+ log_system_notice "error sending the SIP response"
146
+ end
147
+ end
148
+
149
+
150
+ def to_s
151
+ msg = "#{@sip_method.to_s} #{@ruri.uri} SIP/2.0\r\n"
152
+
153
+ # Update From/To/Contact headers if modified.
154
+ if @from.modified?
155
+ @headers["From"] = [ @from.to_s << (@from_tag ? ";tag=#{@from_tag}" : "") ]
156
+ @from_was_modified = true
157
+ end
158
+ if @to.modified?
159
+ @headers["To"] = [ @to.to_s << (@to_tag ? ";tag=#{@to_tag}" : "") ]
160
+ @to_was_modified = true
161
+ end
162
+ if @contact and @contact.modified?
163
+ @headers["Contact"] = [ @contact.to_s << (@contact_params ? @contact_params : "") ]
164
+ end
165
+
166
+ @headers.each do |name, values|
167
+ values.each do |value|
168
+ msg << name << ": #{value}\r\n"
169
+ end
170
+ end
171
+
172
+ msg << CRLF
173
+ msg << @body if @body
174
+ msg
175
+ end
176
+
177
+ end # class Request
178
+
179
+ end
@@ -0,0 +1,37 @@
1
+ module OverSIP::SIP
2
+
3
+ class Response < Message
4
+
5
+ attr_accessor :status_code
6
+ attr_accessor :reason_phrase
7
+ attr_accessor :request # The associated request.
8
+
9
+
10
+ def request? ; false end
11
+ def response? ; true end
12
+
13
+
14
+ def to_s
15
+ msg = "SIP/2.0 #{@status_code} #{@reason_phrase}\r\n"
16
+
17
+ # Revert changes to From/To headers if modified during the request processing.
18
+ @headers["From"] = [ request.hdr_from ] if request.from_was_modified
19
+ if request.to_was_modified
20
+ hdr_to = @to_tag ? "#{request.hdr_to};tag=#{@to_tag}" : request.hdr_to
21
+ @headers["To"] = [ hdr_to ]
22
+ end
23
+
24
+ @headers.each do |name, values|
25
+ values.each do |value|
26
+ msg << name << ": #{value}\r\n"
27
+ end
28
+ end
29
+
30
+ msg << CRLF
31
+ msg << @body if @body
32
+ msg
33
+ end
34
+
35
+ end # class Response
36
+
37
+ end