spf 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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