spf 0.0.3 → 0.0.4
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/lib/spf/eval.rb +2 -0
- data/lib/spf/model.rb +33 -17
- data/lib/spf/request.rb +1 -0
- data/lib/spf/result.rb +2 -0
- data/lib/spf/version.rb +1 -1
- data/spf.gemspec +1 -1
- metadata +1 -1
data/lib/spf/eval.rb
CHANGED
data/lib/spf/model.rb
CHANGED
@@ -400,6 +400,8 @@ class SPF::Mech < SPF::Term
|
|
400
400
|
|
401
401
|
def parse_params
|
402
402
|
self.parse_domain_spec(true)
|
403
|
+
# Other method of denoting "potentially ~infinite" netblocks?
|
404
|
+
@ip_netblocks << nil
|
403
405
|
end
|
404
406
|
|
405
407
|
def params
|
@@ -409,8 +411,6 @@ class SPF::Mech < SPF::Term
|
|
409
411
|
def match(server, request, want_result = true)
|
410
412
|
server.count_dns_interactive_term(request)
|
411
413
|
|
412
|
-
# Other method of denoting "potentially ~infinite" netblocks?
|
413
|
-
@ip_netblocks << nil
|
414
414
|
domain = self.domain(server, request)
|
415
415
|
packet = server.dns_lookup(domain, 'A')
|
416
416
|
rrs = (packet.answer or server.count_void_dns_lookup(request))
|
@@ -429,6 +429,7 @@ class SPF::Mech < SPF::Term
|
|
429
429
|
|
430
430
|
def parse_params
|
431
431
|
self.parse_ipv4_network(true)
|
432
|
+
@ip_netblocks << @ip_network
|
432
433
|
end
|
433
434
|
|
434
435
|
def params
|
@@ -443,7 +444,6 @@ class SPF::Mech < SPF::Term
|
|
443
444
|
ip_network_v6 = IP::V4 === @ip_network ?
|
444
445
|
SPF::Util.ipv4_address_to_ipv6(@ip_network) :
|
445
446
|
@ip_network
|
446
|
-
@ip_netblocks << @ip_network
|
447
447
|
return ip_network_v6.contains?(request.ip_address_v6)
|
448
448
|
end
|
449
449
|
|
@@ -455,6 +455,7 @@ class SPF::Mech < SPF::Term
|
|
455
455
|
|
456
456
|
def parse_params
|
457
457
|
self.parse_ipv6_network(true)
|
458
|
+
@ip_netblocks << @ip_network
|
458
459
|
end
|
459
460
|
|
460
461
|
def params
|
@@ -465,7 +466,6 @@ class SPF::Mech < SPF::Term
|
|
465
466
|
end
|
466
467
|
|
467
468
|
def match(server, request, want_result = true)
|
468
|
-
@ip_netblocks << @ip_network
|
469
469
|
return @ip_network.contains?(request.ip_address_v6)
|
470
470
|
end
|
471
471
|
|
@@ -475,8 +475,6 @@ class SPF::Mech < SPF::Term
|
|
475
475
|
|
476
476
|
NAME = 'include'
|
477
477
|
|
478
|
-
attr_accessor :nested_record
|
479
|
-
|
480
478
|
def intitialize(options = {})
|
481
479
|
super(options)
|
482
480
|
@nested_record = nil
|
@@ -501,8 +499,6 @@ class SPF::Mech < SPF::Term
|
|
501
499
|
# Process sub-request:
|
502
500
|
result = server.process(sub_request)
|
503
501
|
|
504
|
-
@nested_record = sub_request.record
|
505
|
-
|
506
502
|
# Translate result of sub-request (RFC 4408, 5.9):
|
507
503
|
|
508
504
|
return false unless want_result
|
@@ -521,6 +517,14 @@ class SPF::Mech < SPF::Term
|
|
521
517
|
# Propagate any other results (including {Perm,Temp}Error) as-is:
|
522
518
|
raise result
|
523
519
|
end
|
520
|
+
|
521
|
+
def nested_record(server, request)
|
522
|
+
return @nested_record if @nested_record
|
523
|
+
authority_domain = self.domain(server, request)
|
524
|
+
sub_request = request.new_sub_request({:authority_domain => authority_domain})
|
525
|
+
return @nested_record = server.select_record(sub_request)
|
526
|
+
end
|
527
|
+
|
524
528
|
end
|
525
529
|
|
526
530
|
class SPF::Mech::MX < SPF::Mech
|
@@ -705,16 +709,16 @@ class SPF::Mod < SPF::Term
|
|
705
709
|
|
706
710
|
class SPF::Mod::Redirect < SPF::GlobalMod
|
707
711
|
|
708
|
-
attr_reader :domain_spec
|
712
|
+
attr_reader :domain_spec
|
709
713
|
|
710
714
|
NAME = 'redirect'
|
711
715
|
PRECEDENCE = 0.8
|
712
716
|
|
713
|
-
def
|
717
|
+
def init(options = {})
|
714
718
|
super(options)
|
715
719
|
@nested_record = nil
|
716
720
|
end
|
717
|
-
|
721
|
+
|
718
722
|
def parse_params
|
719
723
|
self.parse_domain_spec(true)
|
720
724
|
end
|
@@ -747,12 +751,20 @@ class SPF::Mod < SPF::Term
|
|
747
751
|
# Propagate any other results as-is:
|
748
752
|
result.throw
|
749
753
|
end
|
754
|
+
|
755
|
+
def nested_record(server, request)
|
756
|
+
return @nested_record if @nested_record
|
757
|
+
server.count_dns_interactive_term(request)
|
758
|
+
authority_domain = self.domain(server, request)
|
759
|
+
sub_request = request.new_sub_request({:authority_domain => authority_domain})
|
760
|
+
return @nested_record = server.select_record(sub_request)
|
761
|
+
end
|
750
762
|
end
|
751
763
|
end
|
752
764
|
|
753
765
|
class SPF::Record
|
754
766
|
|
755
|
-
attr_reader :terms, :text, :errors
|
767
|
+
attr_reader :terms, :text, :errors
|
756
768
|
|
757
769
|
RESULTS_BY_QUALIFIER = {
|
758
770
|
'' => :pass,
|
@@ -779,6 +791,10 @@ class SPF::Record
|
|
779
791
|
return record
|
780
792
|
end
|
781
793
|
|
794
|
+
def ip_netblocks
|
795
|
+
@ip_netblocks.flatten!
|
796
|
+
end
|
797
|
+
|
782
798
|
def parse
|
783
799
|
unless self.instance_variable_defined?(:@parse_text) and @parse_text
|
784
800
|
raise SPF::NothingToParseError.new('Nothing to parse for record')
|
@@ -793,9 +809,7 @@ class SPF::Record
|
|
793
809
|
@errors << e
|
794
810
|
raise if @raise_exceptions
|
795
811
|
end
|
796
|
-
@ip_netblocks << term.ip_netblocks if term
|
797
812
|
end
|
798
|
-
@ip_netblocks.flatten!
|
799
813
|
#self.parse_end
|
800
814
|
end
|
801
815
|
|
@@ -830,6 +844,7 @@ class SPF::Record
|
|
830
844
|
raise SPF::InvalidMech.new("Unknown mechanism type '#{mech_name}' in '#{@version_tag}' record")
|
831
845
|
end
|
832
846
|
term = mech = mech_class.new_from_string(mech_text)
|
847
|
+
@ip_netblocks << mech.ip_netblocks
|
833
848
|
@terms << mech
|
834
849
|
elsif (
|
835
850
|
@parse_text.sub!(/
|
@@ -877,7 +892,7 @@ class SPF::Record
|
|
877
892
|
return [version_tag, @terms, @global_mods].join(' ')
|
878
893
|
end
|
879
894
|
|
880
|
-
def eval(server, request)
|
895
|
+
def eval(server, request, want_result = true)
|
881
896
|
raise SPF::OptionRequiredError.new('SPF server object required for record evaluation') unless server
|
882
897
|
raise SPF::OptionRequiredError.new('Request object required for record evaluation') unless request
|
883
898
|
begin
|
@@ -890,7 +905,7 @@ class SPF::Record
|
|
890
905
|
result_class = server.result_class(result_name)
|
891
906
|
result = result_class.new([server, request, "Mechanism '#{term}' matched"])
|
892
907
|
mech.explain(server, request, result)
|
893
|
-
raise result
|
908
|
+
raise result if want_result
|
894
909
|
end
|
895
910
|
elsif SPF::PositionalMod === term
|
896
911
|
# Term is a positional modifier.
|
@@ -908,7 +923,7 @@ class SPF::Record
|
|
908
923
|
@global_mods.each do |global_mod|
|
909
924
|
global_mod.process(server, request, result)
|
910
925
|
end
|
911
|
-
raise result
|
926
|
+
raise result if want_result
|
912
927
|
end
|
913
928
|
end
|
914
929
|
|
@@ -1046,3 +1061,4 @@ class SPF::Record
|
|
1046
1061
|
end
|
1047
1062
|
end
|
1048
1063
|
|
1064
|
+
# vim:sw=2 sts=2
|
data/lib/spf/request.rb
CHANGED
data/lib/spf/result.rb
CHANGED
data/lib/spf/version.rb
CHANGED
data/spf.gemspec
CHANGED