oversip 1.1.2 → 1.2.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.
@@ -0,0 +1,73 @@
1
+ module OverSIP::Modules
2
+
3
+ module UserAssertion
4
+
5
+ extend ::OverSIP::Logger
6
+
7
+ @log_id = "UserAssertion module"
8
+
9
+ def self.assert_connection message
10
+ case message
11
+ when ::OverSIP::SIP::Request
12
+ request = message
13
+ when ::OverSIP::SIP::Response
14
+ request = message.request
15
+ else
16
+ raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
17
+ end
18
+
19
+ # Don't do this stuf for UDP or for outbound connections.
20
+ return false unless request.connection.class.reliable_transport_listener?
21
+ # Return if already set.
22
+ return request.cvars[:asserted_user] if request.cvars[:asserted_user]
23
+ # Don't do this stuf in case of P-Preferred-Identity header is present.
24
+ return false if request.headers["P-Preferred-Identity"]
25
+
26
+ log_system_debug "user #{request.from.uri} asserted to connection" if $oversip_debug
27
+ # Store the request From URI as "asserted_user" for this connection.
28
+ request.cvars[:asserted_user] = request.from.uri
29
+ end
30
+
31
+ def self.revoke_assertion message
32
+ case message
33
+ when ::OverSIP::SIP::Request
34
+ request = message
35
+ when ::OverSIP::SIP::Response
36
+ request = message.request
37
+ else
38
+ raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
39
+ end
40
+
41
+ request.cvars.delete :asserted_user
42
+ true
43
+ end
44
+
45
+ def self.add_pai request
46
+ # Add P-Asserted-Identity if the user has previously been asserted but JUST
47
+ # in case it matches request From URI !
48
+ # NOTE: If the connection is not asserted (it's null) then it will not match this
49
+ # comparisson, so OK.
50
+ if request.cvars[:asserted_user] == request.from.uri
51
+ # Don't add P-Asserted-Identity if the request contains P-Preferred-Identity header.
52
+ unless request.headers["P-Preferred-Identity"]
53
+ log_system_debug "user asserted, adding P-Asserted-Identity for #{request.log_id}" if $oversip_debug
54
+ request.set_header "P-Asserted-Identity", "<" << request.cvars[:asserted_user] << ">"
55
+ return true
56
+ else
57
+ # Remove posible P-Asserted-Identity header!
58
+ log_system_debug "user asserted but P-Preferred-Identity header present, P-Asserted-Identity not added for #{request.log_id}" if $oversip_debug
59
+ request.headers.delete "P-Asserted-Identity"
60
+ return nil
61
+ end
62
+
63
+ # Otherwise ensure the request has no spoofed P-Asserted-Identity headers!
64
+ else
65
+ request.headers.delete "P-Asserted-Identity"
66
+ return false
67
+
68
+ end
69
+ end
70
+
71
+ end # module UserAssertion
72
+
73
+ end
@@ -27,10 +27,10 @@ module OverSIP
27
27
  ::POSIX_MQ.unlink mq_name
28
28
  rescue ::Errno::ENOENT
29
29
  rescue ::Errno::EACCES => e
30
- fatal "queue already exists and cannot remove it due file permissions"
30
+ ::OverSIP::Launcher.fatal "queue already exists and cannot remove it due file permissions"
31
31
  # Kernel has no support for posix message queues.
32
32
  rescue ::Errno::ENOSYS => e
33
- fatal "the kernel has no support for posix messages queues, enable it (#{e.class}: #{e.message})"
33
+ ::OverSIP::Launcher.fatal "the kernel has no support for posix messages queues, enable it (#{e.class}: #{e.message})"
34
34
  end
35
35
 
36
36
  # Set the UMASK in a way that the group has permission to delete the queue.
@@ -61,7 +61,7 @@ module OverSIP
61
61
  begin
62
62
  ::Process.setrlimit(12, mq_size)
63
63
  rescue ::Errno::EPERM
64
- fatal "current user has no permissions to increase rlimits to #{mq_size} bytes (ulimit -q)"
64
+ ::OverSIP::Launcher.fatal "current user has no permissions to increase rlimits to #{mq_size} bytes (ulimit -q)"
65
65
  end
66
66
  else
67
67
  log_system_info "rlimits for Posix Message Queues is #{current_rlimit} bytes (>= #{mq_size}), no need to increase it"
@@ -79,7 +79,7 @@ module OverSIP
79
79
 
80
80
  # Kernel has no support for posix message queues.
81
81
  rescue ::Errno::ENOSYS => e
82
- fatal "the kernel has no support for posix messages queues, enable it (#{e.class}: #{e.message})"
82
+ ::OverSIP::Launcher.fatal "the kernel has no support for posix messages queues, enable it (#{e.class}: #{e.message})"
83
83
 
84
84
  # http://linux.die.net/man/3/mq_open
85
85
  #
@@ -93,13 +93,13 @@ module OverSIP
93
93
  log_system_warn "cannot set queue attributes due to user permissions, using system default values"
94
94
  mq = ::POSIX_MQ.new mq_name, mq_mode | ::IO::CREAT | ::IO::NONBLOCK, 00660
95
95
  rescue ::Errno::ENOMEM => e
96
- fatal "insufficient memory (#{e.class}: #{e.message})"
96
+ ::OverSIP::Launcher.fatal "insufficient memory (#{e.class}: #{e.message})"
97
97
  rescue ::Errno::EMFILE => e
98
- fatal "the process already has the maximum number of files and message queues open (#{e.class}: #{e.message})"
98
+ ::OverSIP::Launcher.fatal "the process already has the maximum number of files and message queues open (#{e.class}: #{e.message})"
99
99
  rescue Errno::ENFILE => e
100
- fatal "the system limit on the total number of open files and message queues has been reached (#{e.class}: #{e.message})"
100
+ ::OverSIP::Launcher.fatal "the system limit on the total number of open files and message queues has been reached (#{e.class}: #{e.message})"
101
101
  rescue ::Errno::ENOSPC => e
102
- fatal "insufficient space for the creation of a new message queue, probably occurred because the queues_max limit was encountered (#{e.class}: #{e.message})"
102
+ ::OverSIP::Launcher.fatal "insufficient space for the creation of a new message queue, probably occurred because the queues_max limit was encountered (#{e.class}: #{e.message})"
103
103
 
104
104
  end
105
105
 
@@ -109,7 +109,7 @@ module OverSIP
109
109
 
110
110
  rescue ::Exception => e
111
111
  unless reload
112
- fatal e.message
112
+ ::OverSIP::Launcher.fatal e.message
113
113
  else
114
114
  raise ::OverSIP::ConfigurationError, e.message
115
115
  end
@@ -0,0 +1,189 @@
1
+ module OverSIP::SIP
2
+
3
+ # This module is included by OverSIP::SIP::Request class.
4
+ module Core
5
+
6
+ # Create a server transaction for the incoming request.
7
+ def create_transaction
8
+ return false if @server_transaction
9
+
10
+ case @sip_method
11
+ when :INVITE
12
+ ::OverSIP::SIP::InviteServerTransaction.new self
13
+ return true
14
+ when :ACK
15
+ return nil
16
+ when :CANCEL
17
+ return nil
18
+ else
19
+ ::OverSIP::SIP::NonInviteServerTransaction.new self
20
+ return true
21
+ end
22
+ end
23
+
24
+
25
+ def check_max_forwards max_forwards
26
+ if @max_forwards
27
+ unless @max_forwards.zero?
28
+ @new_max_forwards = ( @max_forwards > max_forwards ? max_forwards : @max_forwards - 1 )
29
+ return true
30
+ else
31
+ log_system_notice "Max-Forwards is 0 => 483"
32
+ reply 483
33
+ return false
34
+ end
35
+ else
36
+ @new_max_forwards = max_forwards
37
+ return true
38
+ end
39
+ end
40
+
41
+
42
+ def loose_route
43
+ num_removes = 0
44
+ has_preloaded_route_with_ob_param = false
45
+
46
+ # Remove all the Route's pointing to the proxy until a Route not pointing to us is found.
47
+ if @routes
48
+ @routes.each do |route|
49
+ if ::OverSIP::SIP::Tags.check_value_for_route_ovid(route.ovid_param)
50
+ num_removes += 1
51
+ else
52
+ if local_uri? route
53
+ has_preloaded_route_with_ob_param = true if route.ob_param?
54
+ num_removes += 1
55
+ else
56
+ break
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ ### Outbound stuf. RFC 5626 section 5.3.
63
+
64
+ # Outgoing initial request asking for Outbound. Just valid when:
65
+ # - It's an initial request.
66
+ # - Single Via (so there is no a proxy in front of us).
67
+ # - It's an INVITE, REGISTER, SUBSCRIBE or REFER request.
68
+ # - Has a preloaded top Route with ;ob param pointing to us, or has Contact with ;ob, or
69
+ # it's a REGISTER with ;+sip.instance.
70
+ #
71
+ if (
72
+ initial? and (
73
+ @force_outgoing_outbound or (
74
+ @num_vias == 1 and
75
+ outbound_aware? and (
76
+ ( has_preloaded_route_with_ob_param or (@contact and @contact.ob_param?) ) or
77
+ ( @sip_method == :REGISTER and contact_reg_id?)
78
+ )
79
+ )
80
+ )
81
+ )
82
+ @outgoing_outbound_requested = true
83
+ log_system_debug "applying outgoing Outbound support" if $oversip_debug
84
+ end
85
+
86
+ # Incoming initial request or in-dialog incoming/outgoing request. Must only perform
87
+ # Outbound for the incoming case and just when:
88
+ # - There are 2 Route headers.
89
+ # - All the Route headers point to us.
90
+ # - The latest Route has a flow token and a valid ;ovid param (so has been generated
91
+ # previously by us).
92
+ # NOTE: But don't check its value so it still would work in case of server reboot.
93
+ # - It's an incoming Outbound request (so flow token in the Route does not match the
94
+ # flow token of the incoming connection).
95
+ if (
96
+ num_removes == 2 and
97
+ @routes.size == 2 and
98
+ (outbound_route = @routes.last) and
99
+ outbound_route.ovid_param and
100
+ (@route_outbound_flow_token = outbound_route.user) != @connection_outbound_flow_token
101
+ )
102
+ @incoming_outbound_requested = true
103
+ log_system_debug "destination is an incoming Outbound connection" if $oversip_debug
104
+ end
105
+
106
+ # If there are not Route headers return false.
107
+ return false unless @routes
108
+
109
+ # Remove the Route values pointintg to us.
110
+ unless num_removes == 0
111
+ @headers["Route"].shift num_removes
112
+ @routes.shift num_removes
113
+ end
114
+ @routes.empty? and @routes = nil
115
+
116
+ # Return true if it is an in-dialog request and the top Route pointed to us.
117
+ # False otherwise as we shouldn't receive an in-dialog request with a top Route non
118
+ # pointing to us.
119
+ if in_dialog?
120
+ return ( num_removes > 0 ? true : false )
121
+ # Return true if it was an initial request and more Route headers remain after inspection.
122
+ elsif @routes
123
+ return true
124
+ # Return false if it was an initial request and all its Route headers pointed to the proxy.
125
+ else
126
+ return false
127
+ end
128
+ end
129
+
130
+
131
+ # Checks whether the RURI points to a local domain or address.
132
+ # Typically, prior to using this method the user has verified the return value of loose_route()
133
+ # in case it's an initial request (if it's _true_ then the request has pre-loaded Route).
134
+ def destination_myself?
135
+ return true if @destination_myself
136
+ return false if @destination_myself == false
137
+
138
+ if local_uri? @ruri
139
+ log_system_debug "RURI destination is myself" if $oversip_debug
140
+ return @destination_myself = true
141
+ else
142
+ log_system_debug "RURI destination is not myself" if $oversip_debug
143
+ return @destination_myself = false
144
+ end
145
+ end
146
+
147
+
148
+ def fix_nat
149
+ # Force rport usage for UDP clients.
150
+ @via_rport = @source_port
151
+
152
+ # Force outgoing Outbound.
153
+ if initial? and @num_vias == 1 and outbound_aware?
154
+ @force_outgoing_outbound = true
155
+ end
156
+ end
157
+
158
+
159
+ def outgoing_outbound_requested? ; @outgoing_outbound_requested end
160
+
161
+ def incoming_outbound_requested? ; @incoming_outbound_requested end
162
+
163
+
164
+ def connection_outbound_flow_token
165
+ @connection_outbound_flow_token ||= if @transport == :udp
166
+ # NOTE: Add "_" so later we can figure that this is for UDP.
167
+ # NOTE: Replace "=" with "-" so it can be added as a SIP URI param (when Contact mangling is used
168
+ # if the registrar does not support Path).
169
+ "_" << ::Base64.strict_encode64("#{@source_ip}_#{@source_port}").gsub(/=/,"-")
170
+ else
171
+ @connection.outbound_flow_token
172
+ end
173
+ end
174
+
175
+
176
+ private
177
+
178
+
179
+ def local_uri? uri
180
+ return false unless uri.scheme == :sip or uri.scheme == :sips
181
+ # NOTE: uri.host has been normalized during parsing in case it's an IPv6 and it's
182
+ # an :ipv6_reference.
183
+ ( uri.port and ::OverSIP::SIP.local_aliases["#{uri.host}:#{uri.port}"] ) or
184
+ ( not uri.port and ::OverSIP::SIP.local_aliases[uri.host] )
185
+ end
186
+
187
+ end # module Core
188
+
189
+ end
@@ -22,6 +22,10 @@ module OverSIP::SIP
22
22
  end
23
23
  alias :inspect :to_s
24
24
 
25
+ def modified?
26
+ @uri_modified or @name_addr_modified
27
+ end
28
+
25
29
  end
26
30
 
27
31
  end
@@ -2,7 +2,6 @@ module OverSIP::SIP
2
2
 
3
3
  class Uri
4
4
  attr_reader :scheme, :user, :host, :host_type, :port, :params, :transport_param, :phone_context_param, :ovid_param, :headers
5
- attr_accessor :uri_modified
6
5
 
7
6
  def scheme= value
8
7
  return nil if unknown_scheme?
@@ -133,6 +132,31 @@ module OverSIP::SIP
133
132
  alias :to_s :uri
134
133
  alias :inspect :uri
135
134
 
135
+ # Returns a String with the AoR of the URI:
136
+ # - SIP URI: sip:user@domain.
137
+ # - TEL URI: tel:number
138
+ # - Others: nil
139
+ #
140
+ def aor
141
+ case @scheme
142
+ when :sip, :sips
143
+ aor = "sip:"
144
+ ( aor << ::EscapeUtils.escape_uri(@user) << "@" ) if @user
145
+ aor << @host
146
+
147
+ when :tel
148
+ aor = "tel:"
149
+ aor << @user
150
+
151
+ end
152
+
153
+ aor
154
+ end
155
+
156
+ def modified?
157
+ @uri_modified
158
+ end
159
+
136
160
  end # class Uri
137
161
 
138
162
  end
@@ -9,10 +9,7 @@ module OverSIP::SIP
9
9
  :ipv6 => "IPv6"
10
10
  }
11
11
 
12
-
13
- def self.log_id
14
- @log_id ||= "SIP launcher"
15
- end
12
+ @log_id = "SIP launcher"
16
13
 
17
14
 
18
15
  def self.run enabled, ip_type, ip, port, transport, virtual_ip=nil, virtual_port=nil
@@ -31,7 +31,7 @@ module OverSIP::SIP
31
31
 
32
32
  buffer_str = @buffer.to_str
33
33
 
34
- # Quikly ignore single CRLF (widely used by SIP UDP clients as keep-alive.
34
+ # Quikly ignore single CRLF (widely used by SIP UDP clients as keep-alive).
35
35
  if buffer_str == CRLF
36
36
  @buffer.clear
37
37
  @state = :init
@@ -57,7 +57,7 @@ module OverSIP::SIP
57
57
  @state = :init
58
58
  return false
59
59
  # A valid STUN Binding Request so we get a response to be sent.
60
- when String
60
+ when ::String
61
61
  log_system_debug "STUN Binding Request received, replying to it" if $oversip_debug
62
62
  send_data stun_res
63
63
  @buffer.clear
@@ -93,7 +93,7 @@ module OverSIP::SIP
93
93
  # Run the callback.
94
94
  ::OverSIP::SipEvents.on_request @msg
95
95
  rescue ::Exception => e
96
- log_system_error "error calling OverSIP::WebSocketEvents.on_request() => 500:"
96
+ log_system_error "error calling OverSIP::SipEvents.on_request() => 500:"
97
97
  log_system_error e
98
98
  @msg.reply 500, "Internal Error", ["Content-Type: text/plain"], "#{e.class}: #{e.message}"
99
99
  end
@@ -35,11 +35,21 @@ module OverSIP::SIP
35
35
  @on_error_block = block
36
36
  end
37
37
 
38
+ def on_target &block
39
+ @on_target_block = block
40
+ end
41
+
38
42
  # If called, current response within the called callback won't be forwarded.
39
43
  def drop_response
40
44
  @drop_response = true
41
45
  end
42
46
 
47
+ # It must only be called within the on_target() callback. By calling this method,
48
+ # the request routing is aborted, no more DNS targets are tryed, a local 403 response
49
+ # is generated and on_error() callback is called with status 403.
50
+ def abort_routing
51
+ @aborted = true
52
+ end
43
53
 
44
54
  def route request, dst_host=nil, dst_port=nil, dst_transport=nil
45
55
  unless (@request = request).is_a? ::OverSIP::SIP::Request
@@ -346,8 +356,6 @@ module OverSIP::SIP
346
356
 
347
357
 
348
358
  def rfc3263_succeeded result
349
- #log_system_debug "RFC3263 result: #{result.class}: #{result.inspect}" if $oversip_debug
350
-
351
359
  # After RFC 3263 (DNS) resolution we get N targets.
352
360
  @num_target = 0 # First target is 0 (rather than 1).
353
361
 
@@ -365,10 +373,6 @@ module OverSIP::SIP
365
373
  log_system_debug "result is MultiTargets => flatting:" if $oversip_debug
366
374
  @targets = result.flatten # Array of Targets.
367
375
 
368
- # NOTE: Should never happen.
369
- else
370
- raise "rfc3263_succeeded returns a #{result.class}: #{result.inspect}"
371
-
372
376
  end
373
377
 
374
378
  try_next_target
@@ -416,6 +420,18 @@ module OverSIP::SIP
416
420
 
417
421
 
418
422
  def use_target target
423
+ # Call the on_target() callback if set by the user.
424
+ @on_target_block && @on_target_block.call(target.ip_type, target.ip, target.port, target.transport)
425
+
426
+ # If the user has called to proxy.abort_routing() then stop next targets
427
+ # and call to on_error() callback.
428
+ if @aborted
429
+ log_system_notice "routing aborted for target #{target}"
430
+ @aborted = @target = @targets = nil
431
+ try_next_target 403, "Destination Not Allowed"
432
+ return
433
+ end
434
+
419
435
  @client_transaction = (::OverSIP::SIP::ClientTransaction.get_class @request).new self, @request, @proxy_conf, target.transport, target.ip, target.ip_type, target.port
420
436
  add_routing_headers
421
437
  @client_transaction.send_request
@@ -2,6 +2,8 @@ module OverSIP::SIP
2
2
 
3
3
  class Request < Message
4
4
 
5
+ include ::OverSIP::SIP::Core
6
+
5
7
  SECURE_TRANSPORTS = { :tls=>true, :wss=>true }
6
8
 
7
9
  attr_accessor :server_transaction
@@ -9,9 +11,9 @@ module OverSIP::SIP
9
11
  attr_reader :new_max_forwards
10
12
  attr_accessor :antiloop_id
11
13
  attr_accessor :route_outbound_flow_token
12
-
13
14
  attr_writer :outgoing_outbound_requested, :incoming_outbound_requested
14
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.
15
17
 
16
18
  # Used for internal purposes when doing proxy and adding the first Record-Route
17
19
  # or Path.
@@ -114,6 +116,19 @@ module OverSIP::SIP
114
116
  def to_s
115
117
  msg = "#{@sip_method.to_s} #{self.ruri.uri} SIP/2.0\r\n"
116
118
 
119
+ # Update From/To/Contact headers if modified.
120
+ if @from.modified?
121
+ @headers["From"] = [ @from.to_s << (@from_tag ? ";tag=#{@from_tag}" : "") ]
122
+ @from_was_modified = true
123
+ end
124
+ if @to.modified?
125
+ @headers["To"] = [ @to.to_s << (@to_tag ? ";tag=#{@to_tag}" : "") ]
126
+ @to_was_modified = true
127
+ end
128
+ if @contact and @contact.modified?
129
+ @headers["Contact"] = [ @contact.to_s << (@contact_params ? @contact_params : "") ]
130
+ end
131
+
117
132
  @headers.each do |key, values|
118
133
  values.each do |value|
119
134
  msg << key << ": #{value}\r\n"
@@ -14,6 +14,13 @@ module OverSIP::SIP
14
14
  def to_s
15
15
  msg = "SIP/2.0 #{@status_code} #{@reason_phrase}\r\n"
16
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 ] if request.to_was_modified
22
+ end
23
+
17
24
  @headers.each do |key, values|
18
25
  values.each do |value|
19
26
  msg << key << ": #{value}\r\n"
@@ -126,6 +126,8 @@ module OverSIP::SIP
126
126
  @uri_port = uri_port
127
127
  @uri_transport = uri_transport
128
128
 
129
+ @log_id ||= ("RFC3263" << " " << @id)
130
+
129
131
  @use_dns = dns_conf[:use_dns]
130
132
  @transport_preference = dns_conf[:transport_preference]
131
133
 
@@ -144,10 +146,6 @@ module OverSIP::SIP
144
146
  end
145
147
  end
146
148
 
147
- def log_id
148
- @log_id ||= ("RFC3263" << " " << @id)
149
- end
150
-
151
149
  def callback &block
152
150
  @on_success_block = block
153
151
  end
@@ -1,7 +1,5 @@
1
1
  # Ruby external gems.
2
2
 
3
- gem "eventmachine-le", ">= 1.1.3"
4
- require "eventmachine-le"
5
3
  gem "em-posixmq", ">= 0.2.3"
6
4
  require "em-posixmq"
7
5
 
@@ -0,0 +1,45 @@
1
+ module OverSIP
2
+
3
+ # This module is intended for 3rd party modules that need custom code to be
4
+ # executed when OverSIP is started, reloaded or terminated.
5
+ #
6
+ module SystemCallbacks
7
+
8
+ extend ::OverSIP::Logger
9
+
10
+ @log_id = "SystemCallbacks"
11
+
12
+ class << self
13
+ attr_reader :on_started_callbacks
14
+ attr_reader :on_terminated_callbacks
15
+ attr_reader :on_reload_callbacks
16
+ end
17
+
18
+ @on_started_callbacks = []
19
+ @on_terminated_callbacks = []
20
+ @on_reload_callbacks = []
21
+
22
+ def self.on_started pr=nil, &bl
23
+ block = pr || bl
24
+ raise ::ArgumentError, "no block given" unless block.is_a? ::Proc
25
+
26
+ @on_started_callbacks << block
27
+ end
28
+
29
+ def self.on_terminated pr=nil, &bl
30
+ block = pr || bl
31
+ raise ::ArgumentError, "no block given" unless block.is_a? ::Proc
32
+
33
+ @on_terminated_callbacks << block
34
+ end
35
+
36
+ def self.on_reload pr=nil, &bl
37
+ block = pr || bl
38
+ raise ::ArgumentError, "no block given" unless block.is_a? ::Proc
39
+
40
+ @on_reload_callbacks << block
41
+ end
42
+
43
+ end
44
+
45
+ end
data/lib/oversip/tls.rb CHANGED
@@ -6,10 +6,7 @@ module OverSIP
6
6
 
7
7
  TLS_PEM_CHAIN_REGEXP = /-{5}BEGIN CERTIFICATE-{5}\n.*?-{5}END CERTIFICATE-{5}\n/m
8
8
 
9
-
10
- def self.log_id
11
- @log_id ||= "TLS"
12
- end
9
+ @log_id = "TLS"
13
10
 
14
11
 
15
12
  def self.module_init
data/lib/oversip/utils.rb CHANGED
@@ -7,17 +7,22 @@ module OverSIP
7
7
  # For example in Ruby the following returns false:
8
8
  # "iñaki".force_encoding(::Encoding::BINARY) == "iñaki"
9
9
  def self.string_compare string1, string2
10
- string1.force_encoding(::Encoding::BINARY) == string2.force_encoding(::Encoding::BINARY)
10
+ string1.to_s.force_encoding(::Encoding::BINARY) == string2.to_s.force_encoding(::Encoding::BINARY)
11
11
  end
12
12
 
13
13
  # This avoid "invalid byte sequence in UTF-8" when the directly doing:
14
14
  # string =~ /EXPRESSION/
15
15
  # and string has invalid UTF-8 bytes secuence.
16
- # NOTE: expression argument must be a Regexp expression (with / symbols at the
17
- # begining and at the end).
16
+ # Also avoids "incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)"
17
+ # NOTE: expression argument must be a String or a Regexp.
18
18
  def self.regexp_compare string, expression
19
- return false unless string && string.valid_encoding?
20
- string.force_encoding(::Encoding::BINARY) =~ expression
19
+ string = string.to_s.force_encoding(::Encoding::BINARY)
20
+ if expression.is_a? ::Regexp
21
+ expression = /#{expression.source.force_encoding(::Encoding::BINARY)}/
22
+ else
23
+ expression = /#{expression.to_s.force_encoding(::Encoding::BINARY)}/
24
+ end
25
+ string =~ expression
21
26
  end
22
27
 
23
28
  end
@@ -4,8 +4,8 @@ module OverSIP
4
4
 
5
5
  module Version
6
6
  MAJOR = 1
7
- MINOR = 1
8
- TINY = 2
7
+ MINOR = 2
8
+ TINY = 0
9
9
  DEVEL = nil # Set to nil for stable releases.
10
10
  end
11
11
 
@@ -10,9 +10,7 @@ module OverSIP::WebSocket
10
10
  }
11
11
 
12
12
 
13
- def self.log_id
14
- @log_id ||= "WebSocket launcher"
15
- end
13
+ @log_id = "WebSocket launcher"
16
14
 
17
15
 
18
16
  def self.run enabled, ip_type, ip, port, transport, virtual_ip=nil, virtual_port=nil