oversip 0.9.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/AUTHORS.txt +11 -0
- data/LICENSE.txt +22 -0
- data/README.md +16 -0
- data/Rakefile +55 -0
- data/bin/oversip +182 -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 +209 -0
- data/ext/sip_parser/ext_help.h +18 -0
- data/ext/sip_parser/extconf.rb +3 -0
- data/ext/sip_parser/sip_parser.c +29649 -0
- data/ext/sip_parser/sip_parser.h +227 -0
- data/ext/sip_parser/sip_parser_ruby.c +1292 -0
- data/ext/stud/extconf.rb +27 -0
- data/ext/stud/stud.tar.gz +0 -0
- data/ext/stun/ext_help.h +16 -0
- data/ext/stun/extconf.rb +3 -0
- data/ext/stun/stun_ruby.c +391 -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 +61 -0
- data/ext/utils/outbound_utils.c +3227 -0
- data/ext/utils/outbound_utils.h +27 -0
- data/ext/utils/utils_ruby.c +384 -0
- data/ext/utils/utils_ruby.h +75 -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 +46 -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 +2598 -0
- data/ext/websocket_http_parser/ws_http_parser.h +86 -0
- data/ext/websocket_http_parser/ws_http_parser_ruby.c +630 -0
- data/lib/oversip/config.rb +541 -0
- data/lib/oversip/config_validators.rb +126 -0
- data/lib/oversip/errors.rb +7 -0
- data/lib/oversip/fiber_pool.rb +56 -0
- data/lib/oversip/launcher.rb +507 -0
- data/lib/oversip/logger.rb +170 -0
- data/lib/oversip/master_process.rb +67 -0
- data/lib/oversip/posix_mq.rb +121 -0
- data/lib/oversip/proxies_config.rb +169 -0
- data/lib/oversip/ruby_ext/eventmachine.rb +38 -0
- data/lib/oversip/sip/client_transaction.rb +587 -0
- data/lib/oversip/sip/constants.rb +87 -0
- data/lib/oversip/sip/grammar/name_addr.rb +27 -0
- data/lib/oversip/sip/grammar/uri.rb +116 -0
- data/lib/oversip/sip/launcher.rb +180 -0
- data/lib/oversip/sip/listeners/ipv4_tcp_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_tcp_server.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_tls_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_tls_server.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_tls_tunnel_server.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_udp_server.rb +20 -0
- data/lib/oversip/sip/listeners/ipv6_tcp_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tcp_server.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tls_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tls_server.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tls_tunnel_server.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_udp_server.rb +20 -0
- data/lib/oversip/sip/listeners/reactor.rb +39 -0
- data/lib/oversip/sip/listeners/tcp_client.rb +73 -0
- data/lib/oversip/sip/listeners/tcp_reactor.rb +185 -0
- data/lib/oversip/sip/listeners/tcp_server.rb +71 -0
- data/lib/oversip/sip/listeners/tls_client.rb +117 -0
- data/lib/oversip/sip/listeners/tls_server.rb +70 -0
- data/lib/oversip/sip/listeners/tls_tunnel_reactor.rb +113 -0
- data/lib/oversip/sip/listeners/tls_tunnel_server.rb +61 -0
- data/lib/oversip/sip/listeners/udp_reactor.rb +213 -0
- data/lib/oversip/sip/listeners.rb +28 -0
- data/lib/oversip/sip/logic.rb +14 -0
- data/lib/oversip/sip/message.rb +168 -0
- data/lib/oversip/sip/message_processor.rb +202 -0
- data/lib/oversip/sip/modules/core.rb +200 -0
- data/lib/oversip/sip/modules/registrar_without_path.rb +75 -0
- data/lib/oversip/sip/modules/user_assertion.rb +123 -0
- data/lib/oversip/sip/proxy.rb +460 -0
- data/lib/oversip/sip/request.rb +128 -0
- data/lib/oversip/sip/response.rb +30 -0
- data/lib/oversip/sip/rfc3263.rb +646 -0
- data/lib/oversip/sip/server_transaction.rb +295 -0
- data/lib/oversip/sip/sip.rb +74 -0
- data/lib/oversip/sip/tags.rb +39 -0
- data/lib/oversip/sip/timers.rb +55 -0
- data/lib/oversip/sip/transport_manager.rb +129 -0
- data/lib/oversip/syslogger_process.rb +119 -0
- data/lib/oversip/tls.rb +179 -0
- data/lib/oversip/utils.rb +25 -0
- data/lib/oversip/version.rb +23 -0
- data/lib/oversip/websocket/constants.rb +56 -0
- data/lib/oversip/websocket/default_policy.rb +19 -0
- data/lib/oversip/websocket/http_request.rb +63 -0
- data/lib/oversip/websocket/launcher.rb +207 -0
- data/lib/oversip/websocket/listeners/ipv4_tcp_server.rb +15 -0
- data/lib/oversip/websocket/listeners/ipv4_tls_server.rb +15 -0
- data/lib/oversip/websocket/listeners/ipv4_tls_tunnel_server.rb +15 -0
- data/lib/oversip/websocket/listeners/ipv6_tcp_server.rb +15 -0
- data/lib/oversip/websocket/listeners/ipv6_tls_server.rb +15 -0
- data/lib/oversip/websocket/listeners/ipv6_tls_tunnel_server.rb +15 -0
- data/lib/oversip/websocket/listeners/tcp_server.rb +265 -0
- data/lib/oversip/websocket/listeners/tls_server.rb +69 -0
- data/lib/oversip/websocket/listeners/tls_tunnel_server.rb +100 -0
- data/lib/oversip/websocket/listeners.rb +12 -0
- data/lib/oversip/websocket/ws_app.rb +75 -0
- data/lib/oversip/websocket/ws_apps/ipv4_ws_sip_app.rb +21 -0
- data/lib/oversip/websocket/ws_apps/ipv4_wss_sip_app.rb +21 -0
- data/lib/oversip/websocket/ws_apps/ipv6_ws_sip_app.rb +21 -0
- data/lib/oversip/websocket/ws_apps/ipv6_wss_sip_app.rb +22 -0
- data/lib/oversip/websocket/ws_apps/ws_autobahn_app.rb +23 -0
- data/lib/oversip/websocket/ws_apps/ws_sip_app.rb +156 -0
- data/lib/oversip/websocket/ws_apps.rb +9 -0
- data/lib/oversip/websocket/ws_framing.rb +597 -0
- data/lib/oversip.rb +59 -0
- data/test/oversip_test_helper.rb +20 -0
- data/test/test_http_parser.rb +73 -0
- data/test/test_sip_parser.rb +139 -0
- metadata +256 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
module Modules
|
|
4
|
+
module Core
|
|
5
|
+
|
|
6
|
+
# Create a server transaction for the incoming request.
|
|
7
|
+
def create_transaction
|
|
8
|
+
case @sip_method
|
|
9
|
+
when :INVITE
|
|
10
|
+
::OverSIP::SIP::InviteServerTransaction.new self
|
|
11
|
+
when :ACK
|
|
12
|
+
when :CANCEL
|
|
13
|
+
else
|
|
14
|
+
::OverSIP::SIP::NonInviteServerTransaction.new self
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def check_max_forwards max_forwards
|
|
20
|
+
if @max_forwards
|
|
21
|
+
unless @max_forwards.zero?
|
|
22
|
+
@new_max_forwards = ( @max_forwards > max_forwards ? max_forwards : @max_forwards - 1 )
|
|
23
|
+
return true
|
|
24
|
+
else
|
|
25
|
+
log_system_notice "Max-Forwards is 0 => 483"
|
|
26
|
+
reply 483
|
|
27
|
+
return false
|
|
28
|
+
end
|
|
29
|
+
else
|
|
30
|
+
@new_max_forwards = max_forwards
|
|
31
|
+
return true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# Returns a Proxy instance. The user MUST call route() and optionally set the callbacks
|
|
37
|
+
# before calling route().
|
|
38
|
+
def proxy proxy_name=:default_proxy
|
|
39
|
+
if (proxy_conf = ::OverSIP.proxies[proxy_name.to_sym])
|
|
40
|
+
::OverSIP::SIP::Proxy.new self, proxy_conf
|
|
41
|
+
else
|
|
42
|
+
raise ::OverSIP::LogicError, "proxy '#{proxy_name}' is not defined"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def loose_route
|
|
48
|
+
num_removes = 0
|
|
49
|
+
has_preloaded_route_with_ob_param = false
|
|
50
|
+
|
|
51
|
+
# Remove all the Route's pointing to the proxy until a Route not pointing to us is found.
|
|
52
|
+
if @routes
|
|
53
|
+
@routes.each do |route|
|
|
54
|
+
if ::OverSIP::SIP::Tags.check_value_for_route_ovid(route.ovid_param)
|
|
55
|
+
num_removes += 1
|
|
56
|
+
else
|
|
57
|
+
if local_uri? route
|
|
58
|
+
log_system_debug "removing pre-loaded Route pointing to this server" if $oversip_debug
|
|
59
|
+
has_preloaded_route_with_ob_param = true if route.ob_param?
|
|
60
|
+
num_removes += 1
|
|
61
|
+
else
|
|
62
|
+
break
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
### Outbound stuf. RFC 5626 section 5.3.
|
|
69
|
+
|
|
70
|
+
# Outgoing initial request asking for Outbound. Just valid when:
|
|
71
|
+
# - It's an initial request.
|
|
72
|
+
# - Single Via (so there is no a proxy in front of us).
|
|
73
|
+
# - It's an INVITE, REGISTER, SUBSCRIBE or REFER request.
|
|
74
|
+
# - Has a preloaded top Route with ;ob param pointing to us, or has Contact with ;ob, or
|
|
75
|
+
# it's a REGISTER with ;+sip.instance.
|
|
76
|
+
#
|
|
77
|
+
# TODO: and (has_preloaded_route_with_ob_param or @request.contact.ob_param?).
|
|
78
|
+
# TODO: For REGISTER check also ;+sip.instance Contact param.
|
|
79
|
+
if (
|
|
80
|
+
@force_outgoing_outbound or (
|
|
81
|
+
initial? and
|
|
82
|
+
@num_vias == 1 and
|
|
83
|
+
outbound_aware? and
|
|
84
|
+
has_preloaded_route_with_ob_param
|
|
85
|
+
)
|
|
86
|
+
)
|
|
87
|
+
@outgoing_outbound_requested = true
|
|
88
|
+
log_system_debug "applying outgoing Outbound support" if $oversip_debug
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Incoming initial request or in-dialog incoming/outgoing request. Must only perform
|
|
92
|
+
# Outbound for the incoming case and just when:
|
|
93
|
+
# - There are 2 Route headers.
|
|
94
|
+
# - All the Route headers point to us.
|
|
95
|
+
# - The latest Route has a flow token and a valid ;ovid param (so has been generated
|
|
96
|
+
# previously by us).
|
|
97
|
+
# NOTE: But don't check its value so it still would work in case of server reboot.
|
|
98
|
+
# - It's an incoming Outbound request (so flow token in the Route does not match the
|
|
99
|
+
# flow token of the incoming connection).
|
|
100
|
+
if (
|
|
101
|
+
num_removes == 2 and
|
|
102
|
+
@routes.size == 2 and
|
|
103
|
+
(outbound_route = @routes.last) and
|
|
104
|
+
outbound_route.ovid_param and
|
|
105
|
+
(@route_outbound_flow_token = outbound_route.user) != @connection_outbound_flow_token
|
|
106
|
+
)
|
|
107
|
+
@incoming_outbound_requested = true
|
|
108
|
+
log_system_debug "destination is an incoming Outbound connection" if $oversip_debug
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# If there are not Route headers return false.
|
|
112
|
+
return false unless @routes
|
|
113
|
+
|
|
114
|
+
# Remove the Route values pointintg to us.
|
|
115
|
+
unless num_removes == 0
|
|
116
|
+
@headers["Route"].shift num_removes
|
|
117
|
+
@routes.shift num_removes
|
|
118
|
+
end
|
|
119
|
+
@routes.empty? and @routes = nil
|
|
120
|
+
|
|
121
|
+
# Return true if it is an in-dialog request and at least one top Route pointed to us.
|
|
122
|
+
# False otherwise as we shouldn't receive an in-dialog request with a top Route non
|
|
123
|
+
# pointing to us.
|
|
124
|
+
if in_dialog?
|
|
125
|
+
return ( num_removes > 0 ? true : false )
|
|
126
|
+
# Return true if it was an initial request and more Route headers remain after inspection.
|
|
127
|
+
elsif @routes
|
|
128
|
+
return true
|
|
129
|
+
# Return false if it was an initial request and all its Route headers pointed to the proxy.
|
|
130
|
+
else
|
|
131
|
+
return false
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# Mira si el RURI es local. Se supone que antes se ha validado el Route y que el script
|
|
137
|
+
# no permite pre-loaded Route a otro destino..
|
|
138
|
+
def destination_myself?
|
|
139
|
+
return true if @destination_myself
|
|
140
|
+
return false if @destination_myself == false
|
|
141
|
+
|
|
142
|
+
if local_uri? @ruri
|
|
143
|
+
log_system_debug "RURI destination is myself" if $oversip_debug
|
|
144
|
+
return @destination_myself = true
|
|
145
|
+
else
|
|
146
|
+
log_system_debug "RURI destination is not myself" if $oversip_debug
|
|
147
|
+
return @destination_myself = false
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def fix_nat
|
|
153
|
+
# Force rport usage for UDP clients.
|
|
154
|
+
@via_rport = @source_port
|
|
155
|
+
|
|
156
|
+
# Force outgoing Outbound.
|
|
157
|
+
if initial? and @num_vias == 1 and outbound_aware?
|
|
158
|
+
@force_outgoing_outbound = true
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# TODO: It must be true if top Route or Contact has ;ob param, or also if the Contact
|
|
164
|
+
# has +sip.instance.
|
|
165
|
+
def outgoing_outbound_requested? ; @outgoing_outbound_requested end
|
|
166
|
+
|
|
167
|
+
def incoming_outbound_requested? ; @incoming_outbound_requested end
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def connection_outbound_flow_token
|
|
171
|
+
@connection_outbound_flow_token ||= if @transport == :udp
|
|
172
|
+
# NOTE: Add "_" so later we can figure that this is for UDP.
|
|
173
|
+
# NOTE: Replace "=" with "-" so it can be added as a SIP URI param (when Contact mangling is used
|
|
174
|
+
# if the registrar does not support Path).
|
|
175
|
+
"_" << ::Base64.strict_encode64("#{@source_ip}_#{@source_port}").gsub(/=/,"-")
|
|
176
|
+
else
|
|
177
|
+
@connection.outbound_flow_token
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
private
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def local_uri? uri
|
|
186
|
+
# NOTE: uri.host has been normalized during parsing in case it's an IPv6 and it's
|
|
187
|
+
# an :ipv6_reference.
|
|
188
|
+
( uri.port and ::OverSIP::SIP.local_aliases["#{uri.host}:#{uri.port}"] ) or
|
|
189
|
+
( not uri.port and ::OverSIP::SIP.local_aliases[uri.host] )
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
end # module Core
|
|
193
|
+
end # module Modules
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class Request
|
|
197
|
+
include ::OverSIP::SIP::Modules::Core
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
module Modules
|
|
4
|
+
module RegistrarWithoutPath
|
|
5
|
+
|
|
6
|
+
extend ::OverSIP::Logger
|
|
7
|
+
|
|
8
|
+
def self.log_id
|
|
9
|
+
@@log_id ||= "RegistrarWithoutPath module"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.add_outbound_to_contact request
|
|
13
|
+
unless request.sip_method == :REGISTER
|
|
14
|
+
raise ::OverSIP::LogicError, "request must be a REGISTER"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if request.contact and request.connection_outbound_flow_token
|
|
18
|
+
log_system_debug "performing Contact mangling (adding ;ov-ob Outbound param) for #{request.log_id}" if $oversip_debug
|
|
19
|
+
|
|
20
|
+
# Add the ;ov-ob param to the Contact URI.
|
|
21
|
+
request.contact.set_param "ov-ob", request.connection_outbound_flow_token
|
|
22
|
+
# TODO: This should be done automatically, right?
|
|
23
|
+
request.set_header "Contact", "#{request.contact.to_s}#{request.contact_params}"
|
|
24
|
+
|
|
25
|
+
return true
|
|
26
|
+
|
|
27
|
+
else
|
|
28
|
+
return false
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.extract_outbound_from_ruri request
|
|
33
|
+
# Do nothing if the request already contains a Route header with the Outbound flow token (so
|
|
34
|
+
# the registrar *does* support Path.
|
|
35
|
+
unless request.incoming_outbound_requested?
|
|
36
|
+
if ov_ob = request.ruri.del_param("ov-ob")
|
|
37
|
+
log_system_debug "incoming Outbound flow token extracted from ;ov-ob param in RURI for #{request.log_id}" if $oversip_debug
|
|
38
|
+
request.route_outbound_flow_token = ov_ob
|
|
39
|
+
request.incoming_outbound_requested = true
|
|
40
|
+
return true
|
|
41
|
+
else
|
|
42
|
+
return false
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
else
|
|
46
|
+
# If the request already contains a proper Outbound Route header, then at least try to remove
|
|
47
|
+
# the ;ov-ob param from the RURI.
|
|
48
|
+
request.ruri.del_param("ov-ob")
|
|
49
|
+
return false
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.remove_outbound_from_contact message
|
|
54
|
+
unless message.is_a? ::OverSIP::SIP::Message
|
|
55
|
+
raise ::OverSIP::LogicError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
if (contacts = message.headers["Contact"])
|
|
59
|
+
log_system_debug "reverting original Contact value (removing ;ov-ob Outbound param) for response" if $oversip_debug
|
|
60
|
+
|
|
61
|
+
contacts.each do |contact|
|
|
62
|
+
contact.gsub! /;ov-ob=[_\-0-9A-Za-z]+/, ""
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
return true
|
|
66
|
+
|
|
67
|
+
else
|
|
68
|
+
return false
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end # module RegistrarWithoutPath
|
|
73
|
+
end # module Modules
|
|
74
|
+
|
|
75
|
+
end # module OverSIP::SIP
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
module OverSIP::SIP
|
|
2
|
+
|
|
3
|
+
module Modules
|
|
4
|
+
module UserAssertion
|
|
5
|
+
|
|
6
|
+
extend ::OverSIP::Logger
|
|
7
|
+
|
|
8
|
+
def self.log_id
|
|
9
|
+
@@log_id ||= "UserAssertion module"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.assert_connection message
|
|
13
|
+
case message
|
|
14
|
+
when ::OverSIP::SIP::Request
|
|
15
|
+
request = message
|
|
16
|
+
when ::OverSIP::SIP::Response
|
|
17
|
+
request = message.request
|
|
18
|
+
else
|
|
19
|
+
raise ::OverSIP::LogicError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Don't do this stuf for UDP or for outbound connections.
|
|
23
|
+
return false unless request.connection.class.reliable_transport_listener?
|
|
24
|
+
# Return if already set.
|
|
25
|
+
return request.connection.asserted_user if request.connection.asserted_user
|
|
26
|
+
# Don't do this stuf in case of P-Preferred-Identity header is present.
|
|
27
|
+
return false if request.headers["P-Preferred-Identity"]
|
|
28
|
+
|
|
29
|
+
log_system_debug "user #{request.from.uri} asserted to connection" if $oversip_debug
|
|
30
|
+
# Store the request From URI as "asserted_user" for this connection.
|
|
31
|
+
request.connection.asserted_user = request.from.uri
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.revoke_assertion message
|
|
35
|
+
case message
|
|
36
|
+
when ::OverSIP::SIP::Request
|
|
37
|
+
request = message
|
|
38
|
+
when ::OverSIP::SIP::Response
|
|
39
|
+
request = message.request
|
|
40
|
+
else
|
|
41
|
+
raise ::OverSIP::LogicError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
request.connection.asserted_user = false
|
|
45
|
+
true
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.add_pai request
|
|
49
|
+
# Add P-Asserted-Identity if the user has previously been asserted but JUST
|
|
50
|
+
# in case it matches request From URI !
|
|
51
|
+
# NOTE: If the connection is not asserted (it's null) then it will not match this
|
|
52
|
+
# comparisson, so OK.
|
|
53
|
+
if request.connection.asserted_user == request.from.uri
|
|
54
|
+
# Don't add P-Asserted-Identity if the request contains P-Preferred-Identity header.
|
|
55
|
+
unless request.headers["P-Preferred-Identity"]
|
|
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.connection.asserted_user << ">"
|
|
58
|
+
return true
|
|
59
|
+
else
|
|
60
|
+
# Remove posible P-Asserted-Identity header!
|
|
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
|
+
request.headers.delete "P-Asserted-Identity"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Otherwise ensure the request has no spoofed P-Asserted-Identity headers!
|
|
66
|
+
else
|
|
67
|
+
request.headers.delete "P-Asserted-Identity"
|
|
68
|
+
return false
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end # module UserAssertion
|
|
74
|
+
end # module Modules
|
|
75
|
+
|
|
76
|
+
end # module OverSIP::SIP
|
|
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
|