mini_defender 0.1.4 → 0.1.8
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.
- checksums.yaml +4 -4
- data/.DS_Store +0 -0
- data/lib/mini_defender/rule.rb +12 -0
- data/lib/mini_defender/rules/credit_card.rb +4 -0
- data/lib/mini_defender/rules/expiry_month.rb +22 -0
- data/lib/mini_defender/rules/expiry_year.rb +33 -0
- data/lib/mini_defender/rules/hostname.rb +24 -0
- data/lib/mini_defender/rules/iban.rb +40 -0
- data/lib/mini_defender/rules/unique.rb +19 -5
- data/lib/mini_defender/validator.rb +1 -1
- data/lib/mini_defender/version.rb +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 47b6afaf1b24a5e5c1eb02e7cdeaea106dffadcd5d74aab23abdc37aa202ad60
|
|
4
|
+
data.tar.gz: afb0f175e312dfe5f9d6f70bd580724bf9494dee46ec67f770c2b5f3f2ddbf6a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: eb1cbaa6543c2b698ced1eaec693b0ef01f887c2e6c2f4754769fba8a56d2682d514286787318fe35235d88c800ebcbeffc8f1edc6fc093ecd7ded77c65ef464
|
|
7
|
+
data.tar.gz: eb521e27acab3793b1ab1ab2c0da613bc7d9674db35df10bf29b631dac1a62acb130d837603af8fc3651ca7fc483887446de4aaa9a36c6560dbd76d6e3880d67
|
data/.DS_Store
ADDED
|
Binary file
|
data/lib/mini_defender/rule.rb
CHANGED
|
@@ -74,4 +74,16 @@ class MiniDefender::Rule
|
|
|
74
74
|
def message(attribute, value, validator)
|
|
75
75
|
raise NotImplementedError, 'Use a concrete implementation.'
|
|
76
76
|
end
|
|
77
|
+
|
|
78
|
+
def with_message(message)
|
|
79
|
+
@message = message
|
|
80
|
+
self
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @param [Object] attribute
|
|
84
|
+
# @param [Object] value
|
|
85
|
+
# @param [MiniDefender::Validator] validator
|
|
86
|
+
def error_message(attribute, value, validator)
|
|
87
|
+
@message || message(attribute, value, validator)
|
|
88
|
+
end
|
|
77
89
|
end
|
|
@@ -7,6 +7,10 @@ class MiniDefender::Rules::CreditCard < MiniDefender::Rules::Luhn
|
|
|
7
7
|
'credit_card'
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
+
def passes?(attribute, value, validator)
|
|
11
|
+
super(attribute, value, validator) && value.length >= 8 && value.length <= 19
|
|
12
|
+
end
|
|
13
|
+
|
|
10
14
|
def message(attribute, value, validator)
|
|
11
15
|
'The value must be a proper credit/debit card number.'
|
|
12
16
|
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class MiniDefender::Rules::ExpiryMonth < MiniDefender::Rule
|
|
4
|
+
def self.signature
|
|
5
|
+
'expiry_month'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def coerce(value)
|
|
9
|
+
value.to_s.rjust(2, '0')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def passes?(attribute, value, validator)
|
|
13
|
+
return false unless value.to_s.match?(/^\d{1,2}$/)
|
|
14
|
+
|
|
15
|
+
value = value.to_i
|
|
16
|
+
value >= 1 && value <= 12
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def message(attribute, value, validator)
|
|
20
|
+
'Invalid expiry month.'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class MiniDefender::Rules::ExpiryYear < MiniDefender::Rule
|
|
4
|
+
def self.signature
|
|
5
|
+
'expiry_year'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def coerce(value)
|
|
9
|
+
value = value.to_i
|
|
10
|
+
value += century if value < 100
|
|
11
|
+
value.to_s
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def passes?(attribute, value, validator)
|
|
15
|
+
return false unless value.to_s.match?(/^(\d{2}|\d{4})$/)
|
|
16
|
+
|
|
17
|
+
value = value.to_i
|
|
18
|
+
value += century if value < 100
|
|
19
|
+
value >= 1900
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def message(attribute, value, validator)
|
|
23
|
+
'Invalid expiry year.'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
# @param [Integer]
|
|
29
|
+
def century
|
|
30
|
+
year = Time.now.year
|
|
31
|
+
year - (year % 100)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class MiniDefender::Rules::Hostname < MiniDefender::Rule
|
|
4
|
+
HOSTNAME_REGEX = /\A[a-zA-Z0-9][a-zA-Z0-9\-]{1,63}(\.[a-zA-Z0-9][a-zA-Z0-9\-]{1,63})+\.?\z/
|
|
5
|
+
|
|
6
|
+
def self.signature
|
|
7
|
+
'hostname'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def coerce(value)
|
|
11
|
+
value.to_s.downcase.strip
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def passes?(attribute, value, validator)
|
|
15
|
+
value = value.to_s.downcase.strip
|
|
16
|
+
return false if value.length > 255
|
|
17
|
+
|
|
18
|
+
value.match?(HOSTNAME_REGEX)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def message(attribute, value, validator)
|
|
22
|
+
'Invalid hostname.'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class MiniDefender::Rules::Iban < MiniDefender::Rule
|
|
4
|
+
LENGTH_MATRIX = {
|
|
5
|
+
'SA' => 24
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
def self.signature
|
|
9
|
+
'iban'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def coerce(value)
|
|
13
|
+
value.to_s.upcase.gsub(/\s/, '')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def passes?(attribute, value, validator)
|
|
17
|
+
value = coerce(value)
|
|
18
|
+
value.match?(/[A-Z]{2}\d+/i) && valid_length?(value) && valid_checksum?(value)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def valid_checksum?(iban)
|
|
22
|
+
iban = "#{iban[4..]}#{letter_code(iban[0])}#{letter_code(iban[1])}#{iban[2..3]}".to_i
|
|
23
|
+
iban % 97 === 1
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def valid_length?(iban)
|
|
27
|
+
iban.length == (LENGTH_MATRIX[iban[0..1]] || iban.length)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def message(attribute, value, validator)
|
|
31
|
+
"The value should be a valid IBAN."
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def letter_code(letter)
|
|
37
|
+
# letter is assumed to be an upcase ASCII alphabet letter (A-Z)
|
|
38
|
+
letter.ord - 55
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class MiniDefender::Rules::Unique < MiniDefender::Rule
|
|
4
|
-
def initialize(model, column)
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
def initialize(model, column = nil)
|
|
5
|
+
unless model.is_a?(String) || model.is_a?(Class) && model.ancestors.include?(ActiveRecord::Base)
|
|
6
|
+
raise ArgumentError, 'model name must be a string or ActiveRecord::Base'
|
|
7
|
+
end
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
raise ArgumentError, 'Column name must be a string' unless column.is_a?(String) || column.nil?
|
|
10
|
+
|
|
11
|
+
@model = model
|
|
12
|
+
@model = @model.camelcase.constantize if model.is_a?(String)
|
|
9
13
|
@column = column
|
|
10
14
|
@ignore = nil
|
|
15
|
+
@additional_scope = nil
|
|
11
16
|
end
|
|
12
17
|
|
|
13
18
|
def self.signature
|
|
@@ -19,6 +24,11 @@ class MiniDefender::Rules::Unique < MiniDefender::Rule
|
|
|
19
24
|
self
|
|
20
25
|
end
|
|
21
26
|
|
|
27
|
+
def scope_by(callback)
|
|
28
|
+
@additional_scope = callback
|
|
29
|
+
self
|
|
30
|
+
end
|
|
31
|
+
|
|
22
32
|
def self.make(args)
|
|
23
33
|
raise ArgumentError, 'Model and column are required.' unless args.length == 2
|
|
24
34
|
|
|
@@ -26,9 +36,13 @@ class MiniDefender::Rules::Unique < MiniDefender::Rule
|
|
|
26
36
|
end
|
|
27
37
|
|
|
28
38
|
def passes?(attribute, value, validator)
|
|
39
|
+
@column = attribute.split('.')[-1] if @column.nil?
|
|
40
|
+
|
|
29
41
|
query = @model.where(@column => value)
|
|
42
|
+
query = @additional_scope.call(query) unless @additional_scope.nil?
|
|
30
43
|
query = query.where.not(@column, @ignore) unless @ignore.nil?
|
|
31
|
-
|
|
44
|
+
|
|
45
|
+
!query.exists?
|
|
32
46
|
end
|
|
33
47
|
|
|
34
48
|
def message(attribute, value, validator)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mini_defender
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ali Alhoshaiyan
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-12-12 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -74,6 +74,7 @@ executables: []
|
|
|
74
74
|
extensions: []
|
|
75
75
|
extra_rdoc_files: []
|
|
76
76
|
files:
|
|
77
|
+
- ".DS_Store"
|
|
77
78
|
- CHANGELOG.md
|
|
78
79
|
- Gemfile
|
|
79
80
|
- LICENSE.md
|
|
@@ -121,11 +122,15 @@ files:
|
|
|
121
122
|
- lib/mini_defender/rules/excluded_without.rb
|
|
122
123
|
- lib/mini_defender/rules/exists.rb
|
|
123
124
|
- lib/mini_defender/rules/expiry_date.rb
|
|
125
|
+
- lib/mini_defender/rules/expiry_month.rb
|
|
126
|
+
- lib/mini_defender/rules/expiry_year.rb
|
|
124
127
|
- lib/mini_defender/rules/file.rb
|
|
125
128
|
- lib/mini_defender/rules/filled.rb
|
|
126
129
|
- lib/mini_defender/rules/greater_than.rb
|
|
127
130
|
- lib/mini_defender/rules/greater_than_or_equal.rb
|
|
128
131
|
- lib/mini_defender/rules/hash.rb
|
|
132
|
+
- lib/mini_defender/rules/hostname.rb
|
|
133
|
+
- lib/mini_defender/rules/iban.rb
|
|
129
134
|
- lib/mini_defender/rules/image.rb
|
|
130
135
|
- lib/mini_defender/rules/in.rb
|
|
131
136
|
- lib/mini_defender/rules/in_field.rb
|
|
@@ -197,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
197
202
|
- !ruby/object:Gem::Version
|
|
198
203
|
version: '0'
|
|
199
204
|
requirements: []
|
|
200
|
-
rubygems_version: 3.3.
|
|
205
|
+
rubygems_version: 3.3.26
|
|
201
206
|
signing_key:
|
|
202
207
|
specification_version: 4
|
|
203
208
|
summary: A small and efficient validation library for Rails and anything that uses
|