activevalidators 2.0.0 → 2.0.1

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.
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = 'activevalidators'
4
- s.version = '2.0.0'
4
+ s.version = '2.0.1'
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = ['Franck Verrot', 'Paco Guzmán', 'Oriol Gual', 'Garrett Bjerkhoel', 'Renato Riccieri Santos Zannon', 'Brian Moseley']
7
7
  s.email = ['franck@verrot.fr']
@@ -84,7 +84,7 @@ module ActiveModel
84
84
  private
85
85
 
86
86
  def self.regexp_from(format)
87
- Regexp.new "^"+(Regexp.escape format).gsub(/[@#]/, '@' => '[[:alpha:]]', '#' => 'd')+"$"
87
+ Regexp.new '\A' + (Regexp.escape format).gsub(/[@#]/, '@' => '[[:alpha:]]', '#' => 'd') + '\z'
88
88
  end
89
89
  end
90
90
  end
@@ -6,13 +6,13 @@ module ActiveModel
6
6
  raise "Carrier option required" unless carrier
7
7
  method = "valid_#{carrier.to_s}?"
8
8
  raise "Tracking number validation not supported for carrier #{carrier}" unless self.respond_to?(method)
9
- record.errors.add(attribute) if value.blank? || !self.send(method, value)
9
+ record.errors.add(attribute) if value.blank? || !self.send(method, value)
10
10
  end
11
11
 
12
12
  # UPS:
13
13
  # ups tracking codes are validated solely on their format
14
14
  # see https://www.ups.com/content/us/en/tracking/help/tracking/tnh.html
15
- UPS_REGEXES = [ /^1Z[a-zA-Z0-9]{16}$/, /^[a-zA-Z0-9]{12}$/, /^[a-zA-Z0-9]{9}$/, /^T[a-zA-Z0-9]{10}$/ ]
15
+ UPS_REGEXES = [ /\A1Z[a-zA-Z0-9]{16}\z/, /\A[a-zA-Z0-9]{12}\z/, /\A[a-zA-Z0-9]{9}\z/, /\AT[a-zA-Z0-9]{10}\z/ ]
16
16
  def valid_ups?(value)
17
17
  !!UPS_REGEXES.detect { |fmt| value.match(fmt) }
18
18
  end
@@ -28,13 +28,13 @@ module ActiveModel
28
28
  uss228?(value) || uss39?(value)
29
29
  end
30
30
 
31
- USS128_REGEX = /^(\d{19,21})(\d)$/
31
+ USS128_REGEX = /\A(\d{19,21})(\d)\z/
32
32
  def uss228?(value)
33
33
  m = value.match(USS128_REGEX)
34
34
  m.present? && (m[2].to_i == usps_mod10(m[1]))
35
35
  end
36
36
 
37
- USS39_REGEX = /^[a-zA-Z0-9]{2}(\d{8})(\d)US$/
37
+ USS39_REGEX = /\A[a-zA-Z0-9]{2}(\d{8})(\d)US\z/
38
38
  def uss39?(value)
39
39
  m = value.match(USS39_REGEX)
40
40
  # it appears to be valid for a USS39 barcode's checkdigit to be calculated with either the usps mod 10
@@ -2,18 +2,31 @@ module ActiveModel
2
2
  module Validations
3
3
 
4
4
  class TwitterValidator < EachValidator
5
+
6
+ # Basic username regexp
7
+ TWITTER_USERNAME_REGEXP = /([A-Za-z0-9_]{1,15})/i
8
+
9
+ # Regexp used to detect twitter username within the URL.
10
+ TWITTER_URL_REGEXP = %r{\Ahttps?://(?:www\.)?twitter.com/#{TWITTER_USERNAME_REGEXP}\z}i
11
+
12
+ # Regexp to test using twitter username as @sign.
13
+ TWITTER_ATSIGN_REGEXP = /\A@#{TWITTER_USERNAME_REGEXP}\z/i
14
+
15
+ # Regexp to test against usernames without the @sign
16
+ TWITTER_NOATSIGN_REGEXP = /\A#{TWITTER_USERNAME_REGEXP}\z/i
17
+
5
18
  def validate_each(record, attribute, value)
6
19
  format = options[:format].to_sym if options[:format]
7
-
20
+
8
21
  if value.nil?
9
22
  record.errors.add_on_blank(attribute)
10
23
  elsif format == :url
11
- match = value.match(/^https?:\/\/(www\.)?twitter.com\/([A-Za-z0-9_]{1,15})$/i)
12
- record.errors.add(attribute) unless match && !match[2].nil? # www. is first capture
24
+ match = value.match(TWITTER_URL_REGEXP)
25
+ record.errors.add(attribute) unless match && !match[1].nil?
13
26
  elsif format == :username_with_at
14
- record.errors.add(attribute) unless value.match(/^@([A-Za-z0-9_]{1,15})$/i)
27
+ record.errors.add(attribute) unless value =~ TWITTER_ATSIGN_REGEXP
15
28
  else
16
- record.errors.add(attribute) unless value.match(/^([A-Za-z0-9_]{1,15})$/i)
29
+ record.errors.add(attribute) unless value =~ TWITTER_NOATSIGN_REGEXP
17
30
  end
18
31
  end
19
32
  end
@@ -62,7 +62,7 @@ module ActiveModel
62
62
  #
63
63
  # Returns the Regexp.
64
64
  def uri_regexp
65
- @uri_regexp ||= URI.regexp(protocols)
65
+ @uri_regexp ||= /\A#{URI.regexp(protocols)}\z/
66
66
  end
67
67
 
68
68
  # Internal: Tries to convert supplied string into URI,
@@ -49,5 +49,11 @@ describe "Postal Code Validation" do
49
49
  subject.valid?.must_equal false
50
50
  subject.errors[:postal_code].include?(subject.errors.generate_message(:postal_code, :invalid)).must_equal true
51
51
  end
52
+
53
+ it "rejects injected content" do
54
+ subject = build_postal_code_record true, :postal_code => "injected\n11211"
55
+ subject.valid?.must_equal false
56
+ subject.errors.size.must_equal 1
57
+ end
52
58
  end
53
59
  end
@@ -51,6 +51,10 @@ describe "Tracking Number Validation" do
51
51
  it "rejects invalid formats and generates an error message of type invalid" do
52
52
  assert_invalid_tracking_number({:carrier => :ups}, '1Z12345E020_271688')
53
53
  end
54
+
55
+ it "rejects injected content" do
56
+ assert_invalid_tracking_number({:carrier => :ups}, "injected\n1Z12345E0205271688")
57
+ end
54
58
  end
55
59
  end
56
60
 
@@ -109,6 +113,10 @@ describe "Tracking Number Validation" do
109
113
  it 'USS128 tracking number with invalid chars' do
110
114
  assert_invalid_tracking_number({:carrier => :usps}, 'U11234567891234567879')
111
115
  end
116
+
117
+ it 'rejects injected chars in USS39 and others' do
118
+ assert_invalid_tracking_number({:carrier => :usps}, "injected\nEA123456784US")
119
+ end
112
120
  end
113
121
  end
114
122
 
@@ -80,6 +80,13 @@ describe "Twitter Validation" do
80
80
  subject.valid?.must_equal false
81
81
  subject.errors.size.must_equal 1
82
82
  end
83
+
84
+ it "generates error with injected content" do
85
+ subject = build_twitter_record :format => :url
86
+ subject.twitter_username = "javascript:alert('xss');\nhttp://twitter.com/garrettbjerkhoelwashere"
87
+ subject.valid?.must_equal false
88
+ subject.errors.size.must_equal 1
89
+ end
83
90
  end
84
91
 
85
92
  describe "for twitter at sign validator" do
@@ -115,6 +122,13 @@ describe "Twitter Validation" do
115
122
  subject.valid?.must_equal false
116
123
  subject.errors.size.must_equal 1
117
124
  end
125
+
126
+ it "generate error with injected content" do
127
+ subject = build_twitter_record :format => :username_with_at
128
+ subject.twitter_username = "injected\n@erik"
129
+ subject.valid?.must_equal false
130
+ subject.errors.size.must_equal 1
131
+ end
118
132
  end
119
133
 
120
134
  describe "for twitter without at sign validator" do
@@ -157,5 +171,12 @@ describe "Twitter Validation" do
157
171
  subject.valid?.must_equal false
158
172
  subject.errors.size.must_equal 1
159
173
  end
174
+
175
+ it "generate error with at injected data" do
176
+ subject = build_twitter_record true
177
+ subject.twitter_username = "something\ngarrettb\nelse"
178
+ subject.valid?.must_equal false
179
+ subject.errors.size.must_equal 1
180
+ end
160
181
  end
161
182
  end
@@ -58,6 +58,13 @@ describe "Url Validation" do
58
58
  subject.errors.size.must_equal 1
59
59
  end
60
60
 
61
+ it "rejects injected urls" do
62
+ subject = build_url_record
63
+ subject.url = "javascript:alert('xss');\nhttp://google.com"
64
+ subject.valid?.must_equal false
65
+ subject.errors.size.must_equal 1
66
+ end
67
+
61
68
  it "generates an error message of type invalid" do
62
69
  subject = build_url_record
63
70
  subject.url = 'http://^^^^.fr'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activevalidators
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,11 +14,11 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2012-07-06 00:00:00.000000000 Z
17
+ date: 2012-09-15 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: bundler
21
- requirement: &70278581021300 !ruby/object:Gem::Requirement
21
+ requirement: &70131187685580 !ruby/object:Gem::Requirement
22
22
  none: false
23
23
  requirements:
24
24
  - - ! '>='
@@ -26,10 +26,10 @@ dependencies:
26
26
  version: '0'
27
27
  type: :development
28
28
  prerelease: false
29
- version_requirements: *70278581021300
29
+ version_requirements: *70131187685580
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: minitest
32
- requirement: &70278581019760 !ruby/object:Gem::Requirement
32
+ requirement: &70131187684280 !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
35
  - - ! '>='
@@ -37,10 +37,10 @@ dependencies:
37
37
  version: '0'
38
38
  type: :development
39
39
  prerelease: false
40
- version_requirements: *70278581019760
40
+ version_requirements: *70131187684280
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
- requirement: &70278581018660 !ruby/object:Gem::Requirement
43
+ requirement: &70131187683500 !ruby/object:Gem::Requirement
44
44
  none: false
45
45
  requirements:
46
46
  - - ! '>='
@@ -48,10 +48,10 @@ dependencies:
48
48
  version: 0.8.7
49
49
  type: :runtime
50
50
  prerelease: false
51
- version_requirements: *70278581018660
51
+ version_requirements: *70131187683500
52
52
  - !ruby/object:Gem::Dependency
53
53
  name: activemodel
54
- requirement: &70278581017920 !ruby/object:Gem::Requirement
54
+ requirement: &70131187682840 !ruby/object:Gem::Requirement
55
55
  none: false
56
56
  requirements:
57
57
  - - ! '>='
@@ -59,10 +59,10 @@ dependencies:
59
59
  version: 3.0.0
60
60
  type: :runtime
61
61
  prerelease: false
62
- version_requirements: *70278581017920
62
+ version_requirements: *70131187682840
63
63
  - !ruby/object:Gem::Dependency
64
64
  name: phony
65
- requirement: &70278581017380 !ruby/object:Gem::Requirement
65
+ requirement: &70131187682280 !ruby/object:Gem::Requirement
66
66
  none: false
67
67
  requirements:
68
68
  - - ~>
@@ -70,10 +70,10 @@ dependencies:
70
70
  version: 1.7.4
71
71
  type: :runtime
72
72
  prerelease: false
73
- version_requirements: *70278581017380
73
+ version_requirements: *70131187682280
74
74
  - !ruby/object:Gem::Dependency
75
75
  name: countries
76
- requirement: &70278581016540 !ruby/object:Gem::Requirement
76
+ requirement: &70131187681620 !ruby/object:Gem::Requirement
77
77
  none: false
78
78
  requirements:
79
79
  - - ~>
@@ -81,10 +81,10 @@ dependencies:
81
81
  version: 0.8.2
82
82
  type: :runtime
83
83
  prerelease: false
84
- version_requirements: *70278581016540
84
+ version_requirements: *70131187681620
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: mail
87
- requirement: &70278581010060 !ruby/object:Gem::Requirement
87
+ requirement: &70131187681060 !ruby/object:Gem::Requirement
88
88
  none: false
89
89
  requirements:
90
90
  - - ! '>='
@@ -92,10 +92,10 @@ dependencies:
92
92
  version: '0'
93
93
  type: :runtime
94
94
  prerelease: false
95
- version_requirements: *70278581010060
95
+ version_requirements: *70131187681060
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: date_validator
98
- requirement: &70278581008820 !ruby/object:Gem::Requirement
98
+ requirement: &70131187680120 !ruby/object:Gem::Requirement
99
99
  none: false
100
100
  requirements:
101
101
  - - ! '>='
@@ -103,7 +103,7 @@ dependencies:
103
103
  version: '0'
104
104
  type: :runtime
105
105
  prerelease: false
106
- version_requirements: *70278581008820
106
+ version_requirements: *70131187680120
107
107
  description: ActiveValidators is a collection of ActiveModel/ActiveRecord validations
108
108
  email:
109
109
  - franck@verrot.fr