Class: Sentry::DSN

Inherits:
Object
  • Object
show all
Defined in:
lib/sentry/dsn.rb

Constant Summary collapse

PORT_MAP =
{ "http" => 80, "https" => 443 }.freeze
REQUIRED_ATTRIBUTES =
%w[host path public_key project_id].freeze
LOCALHOST_NAMES =
%w[localhost 127.0.0.1 ::1 [::1]].freeze
LOCALHOST_PATTERN =
/\.local(host|domain)?$/i

Instance Method Summary collapse

Constructor Details

#initialize(dsn_string) ⇒ DSN

Returns a new instance of DSN.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/sentry/dsn.rb', line 16

def initialize(dsn_string)
  @raw_value = dsn_string

  uri = URI.parse(dsn_string)
  uri_path = uri.path.split("/")

  if uri.user
    # DSN-style string
    @project_id = uri_path.pop
    @public_key = uri.user
    @secret_key = !(uri.password.nil? || uri.password.empty?) ? uri.password : nil
  end

  @scheme = uri.scheme
  @host = uri.host
  @port = uri.port if uri.port
  @path = uri_path.join("/")
end

Instance Method Details

#csp_report_uriObject



49
50
51
# File 'lib/sentry/dsn.rb', line 49

def csp_report_uri
  "#{server}/api/#{project_id}/security/?sentry_key=#{public_key}"
end

#envelope_endpointObject



53
54
55
# File 'lib/sentry/dsn.rb', line 53

def envelope_endpoint
  "#{path}/api/#{project_id}/envelope/"
end

#local?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/sentry/dsn.rb', line 57

def local?
  @local ||= (localhost? || private_ip? || resolved_ips_private?)
end

#localhost?Boolean

Returns:

  • (Boolean)


61
62
63
# File 'lib/sentry/dsn.rb', line 61

def localhost?
  LOCALHOST_NAMES.include?(host.downcase) || LOCALHOST_PATTERN.match?(host)
end

#private_ip?Boolean

Returns:

  • (Boolean)


65
66
67
68
69
70
71
72
73
# File 'lib/sentry/dsn.rb', line 65

def private_ip?
  @private_ip ||= begin
    begin
      IPAddr.new(host).private?
    rescue IPAddr::InvalidAddressError
      false
    end
  end
end

#resolved_ips_private?Boolean

Returns:

  • (Boolean)


75
76
77
78
79
80
81
82
83
# File 'lib/sentry/dsn.rb', line 75

def resolved_ips_private?
  @resolved_ips_private ||= begin
    begin
      Resolv.getaddresses(host).any? { |ip| IPAddr.new(ip).private? }
    rescue Resolv::ResolvError, IPAddr::InvalidAddressError
      false
    end
  end
end

#serverObject



43
44
45
46
47
# File 'lib/sentry/dsn.rb', line 43

def server
  server = "#{scheme}://#{host}"
  server += ":#{port}" unless port == PORT_MAP[scheme]
  server
end

#to_sObject



39
40
41
# File 'lib/sentry/dsn.rb', line 39

def to_s
  @raw_value
end

#valid?Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/sentry/dsn.rb', line 35

def valid?
  REQUIRED_ATTRIBUTES.all? { |k| public_send(k) }
end