class SPF::Term
Constants
- DOMAIN_END_PATTERN
- DOMAIN_SPEC_PATTERN
- HEXWORD_PATTERN
- IPV4_ADDRESS_PATTERN
- IPV6_ADDRESS_PATTERN
- MACRO_DELIMITER
- MACRO_EXPAND_PATTERN
- MACRO_LITERAL_PATTERN
- MACRO_STRING_PATTERN
- MACRO_TRANSFORMERS_PATTERN
- NAME_PATTERN
- QNUM_PATTERN
- TOPLABEL_PATTERN
- TWO_HEXWORDS_OR_IPV4_ADDRESS_PATTERN
Attributes
domain_spec[R]
errors[R]
ip_address[R]
ip_netblocks[R]
ip_network[R]
ipv4_prefix_length[R]
ipv6_prefix_length[R]
raw_params[R]
record_domain[R]
Public Class Methods
new(options = {})
click to toggle source
# File lib/spf/model.rb, line 91 def initialize(options = {}) @ip_address = nil @ip_network = nil @ipv4_prefix_length = nil @ipv6_prefix_length = nil @raw_params = nil @errors = [] @ip_netblocks = [] @text = options[:text] @record_domain = options[:record_domain] @raise_exceptions = options.has_key?(:raise_exceptions) ? options[:raise_exceptions] : true end
new_from_string(text, options = {})
click to toggle source
# File lib/spf/model.rb, line 109 def self.new_from_string(text, options = {}) options[:text] = text term = self.new(options) term.parse return term end
Public Instance Methods
domain(server, request)
click to toggle source
# File lib/spf/model.rb, line 218 def domain(server, request) if self.instance_variable_defined?(:@domain_spec) and @domain_spec return SPF::MacroString.new({:server => server, :request => request, :text => @domain_spec.text}) end return request.authority_domain end
error(exception)
click to toggle source
# File lib/spf/model.rb, line 104 def error(exception) raise exception if @raise_exceptions @errors << exception end
parse_domain_spec(required = false)
click to toggle source
# File lib/spf/model.rb, line 116 def parse_domain_spec(required = false) if @parse_text.sub!(/^(#{DOMAIN_SPEC_PATTERN})/x, '') domain_spec = $1 domain_spec.sub!(/^(.*?)\.?$/, $1) @domain_spec = SPF::MacroString.new({:text => domain_spec}) elsif record_domain @domain_spec = SPF::MacroString.new({:text => record_domain}) elsif required error(SPF::TermDomainSpecExpectedError.new( "Missing required domain-spec in '#{@text}'")) end end
parse_ipv4_address(required = false)
click to toggle source
# File lib/spf/model.rb, line 129 def parse_ipv4_address(required = false) @raw_params = @parse_text.dup if @parse_text.sub!(/^(#{IPV4_ADDRESS_PATTERN})/x, '') @ip_address = $1 elsif required error(SPF::TermIPv4AddressExpectedError.new( "Missing or invalid required IPv4 address in '#{@text}'")) end @ip_address = @parse_text.dup unless @ip_address end
parse_ipv4_ipv6_prefix_lengths()
click to toggle source
# File lib/spf/model.rb, line 209 def parse_ipv4_ipv6_prefix_lengths self.parse_ipv4_prefix_length if self.instance_variable_defined?(:@ipv4_prefix_length) and # An IPv4 prefix length has been parsed, and @parse_text.sub!(/^\//, '') # another slash is following. # Parse an IPv6 prefix length: self.parse_ipv6_prefix_length(true) end end
parse_ipv4_network(required = false)
click to toggle source
# File lib/spf/model.rb, line 159 def parse_ipv4_network(required = false) @raw_params = @parse_text.dup self.parse_ipv4_address(required) self.parse_ipv4_prefix_length begin @ip_network = IP.new("#{@ip_address}/#{@ipv4_prefix_length}") if @ip_address and @ipv4_prefix_length rescue ArgumentError @ip_network = @ip_address end end
parse_ipv4_prefix_length(required = false)
click to toggle source
# File lib/spf/model.rb, line 141 def parse_ipv4_prefix_length(required = false) if @parse_text.sub!(/^\/(\d+)/, '') bits = $1.to_i unless bits and bits >= 0 and bits <= 32 and $1 !~ /^0./ error(SPF::TermIPv4PrefixLengthExpectedError.new( "Invalid IPv4 prefix length encountered in '#{@text}'")) return end @ipv4_prefix_length = bits elsif required error(SPF::TermIPv4PrefixLengthExpectedError.new( "Missing required IPv4 prefix length in '#{@text}")) return else @ipv4_prefix_length = self.default_ipv4_prefix_length end end
parse_ipv6_address(required = false)
click to toggle source
# File lib/spf/model.rb, line 170 def parse_ipv6_address(required = false) if @parse_text.sub!(/(#{IPV6_ADDRESS_PATTERN})(?=\/|$)/x, '') @ip_address = $1 elsif required error(SPF::TermIPv6AddressExpectedError.new( "Missing or invalid required IPv6 address in '#{@text}'")) end @ip_address = @parse_text.dup unless @ip_address end
parse_ipv6_network(required = false)
click to toggle source
# File lib/spf/model.rb, line 198 def parse_ipv6_network(required = false) @raw_params = @parse_text.dup self.parse_ipv6_address(required) self.parse_ipv6_prefix_length begin @ip_network = IP.new("#{@ip_address}/#{@ipv6_prefix_length}") if @ip_address and @ipv6_prefix_length rescue ArgumentError @ip_network = @ip_address end end
parse_ipv6_prefix_length(required = false)
click to toggle source
# File lib/spf/model.rb, line 180 def parse_ipv6_prefix_length(required = false) if @parse_text.sub!(/^\/(\d+)/, '') bits = $1.to_i unless bits and bits >= 0 and bits <= 128 and $1 !~ /^0./ error(SPF::TermIPv6PrefixLengthExpectedError.new( "Invalid IPv6 prefix length encountered in '#{@text}'")) return end @ipv6_prefix_length = bits elsif required error(SPF::TermIPv6PrefixLengthExpectedError.new( "Missing required IPv6 prefix length in '#{@text}'")) return else @ipv6_prefix_length = self.default_ipv6_prefix_length end end
text()
click to toggle source
# File lib/spf/model.rb, line 225 def text if self.instance_variable_defined?(:@text) return @text else raise SPF::NoUnparsedTextError end end