Module: Clavis::Security::RedirectUriValidator

Defined in:
lib/clavis/security/redirect_uri_validator.rb

Class Method Summary collapse

Class Method Details

.valid_provider_uri?(provider_name, uri) ⇒ Boolean

Validates a URI for a specific provider

Parameters:

  • provider_name (Symbol)

    The provider name

  • uri (String)

    The URI to validate

Returns:

  • (Boolean)

    Whether the URI is valid for the provider



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/clavis/security/redirect_uri_validator.rb', line 34

def valid_provider_uri?(provider_name, uri)
  return false if uri.nil? || uri.empty?

  begin
    # First check if the URI is valid against allowed hosts
    return false unless valid_uri?(uri)

    # Get the configured redirect URI for the provider
    provider_config = Clavis.configuration.provider_config(provider_name)
    configured_uri = provider_config[:redirect_uri]

    return true if configured_uri.nil? # No specific URI configured

    parsed_uri = URI.parse(uri)
    parsed_configured_uri = URI.parse(configured_uri)

    # Check if exact matching is required
    return uri == configured_uri if Clavis.configuration.exact_redirect_uri_matching

    # Check if the host and path match
    parsed_uri.host == parsed_configured_uri.host &&
      parsed_uri.path == parsed_configured_uri.path
  rescue URI::InvalidURIError, Clavis::ProviderNotConfigured
    false
  end
end

.valid_uri?(uri) ⇒ Boolean

Validates a URI against the configured allowed hosts

Parameters:

  • uri (String)

    The URI to validate

Returns:

  • (Boolean)

    Whether the URI is valid



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/clavis/security/redirect_uri_validator.rb', line 12

def valid_uri?(uri)
  return false if uri.nil? || uri.empty?

  begin
    parsed_uri = URI.parse(uri)

    # Check if localhost is allowed in development
    return allow_localhost_in_development? if localhost?(parsed_uri.host)

    # Check against allowed hosts
    return true if host_allowed?(parsed_uri.host)

    false
  rescue URI::InvalidURIError
    false
  end
end

.validate_provider_uri!(provider_name, uri) ⇒ Boolean

Validates a URI for a specific provider and raises an exception if invalid

Parameters:

  • provider_name (Symbol)

    The provider name

  • uri (String)

    The URI to validate

Returns:

  • (Boolean)

    Whether the URI is valid for the provider

Raises:



78
79
80
81
82
83
84
# File 'lib/clavis/security/redirect_uri_validator.rb', line 78

def validate_provider_uri!(provider_name, uri)
  is_valid = valid_provider_uri?(provider_name, uri)

  raise Clavis::InvalidRedirectUri, uri if !is_valid && Clavis.configuration.raise_on_invalid_redirect

  is_valid
end

.validate_uri!(uri) ⇒ Boolean

Validates a URI and raises an exception if invalid

Parameters:

  • uri (String)

    The URI to validate

Returns:

  • (Boolean)

    Whether the URI is valid

Raises:



65
66
67
68
69
70
71
# File 'lib/clavis/security/redirect_uri_validator.rb', line 65

def validate_uri!(uri)
  is_valid = valid_uri?(uri)

  raise Clavis::InvalidRedirectUri, uri if !is_valid && Clavis.configuration.raise_on_invalid_redirect

  is_valid
end