validators 2.2.0 → 2.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 712947e2a6947bc19c7da7bba7833e5ba9065d87
4
- data.tar.gz: 10b12a9b882a88024a6d3c86f7344d0804c8979b
3
+ metadata.gz: 2f11819491da6f74f88f456177da2ad932488f72
4
+ data.tar.gz: 544d396ec5a0a9e84990d704334d77efc229e97a
5
5
  SHA512:
6
- metadata.gz: dba5cb7ea24051b776f0d6243be9a86316fafcb0daf21c3f078a56ece3cb74846105105c22f2320b94439d8d62893130fad767e0132af9b8c88245c2b7f7be29
7
- data.tar.gz: 906ac8b658b4424c4bfb25636c5d4cdc088f272463b65e6fd1584e26533fdf20f62ac650975cc251f851cbcf633ab1d8f5602fbc671096d3d0d09187bba628bf
6
+ metadata.gz: e41c830254e68cd62daaac392604151bab5acf4d159925ea300d27a6066f30a4fab00284812de4745126f2d57714fef755a86b79d5e0946cea9f691437d3971e
7
+ data.tar.gz: 3f425a149171a58f09e23b71a9683f6a4253cbf505efaf609d50b4e33a9e89dda7826b8cdad59039a44bbdb86684f2316944fddc2638e98f546ca67b385cfbf5
data/Gemfile.lock CHANGED
@@ -1,19 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- validators (2.2.0)
4
+ validators (2.3.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
- activemodel (4.1.0)
10
- activesupport (= 4.1.0)
9
+ activemodel (4.1.1)
10
+ activesupport (= 4.1.1)
11
11
  builder (~> 3.1)
12
- activerecord (4.1.0)
13
- activemodel (= 4.1.0)
14
- activesupport (= 4.1.0)
12
+ activerecord (4.1.1)
13
+ activemodel (= 4.1.1)
14
+ activesupport (= 4.1.1)
15
15
  arel (~> 5.0.0)
16
- activesupport (4.1.0)
16
+ activesupport (4.1.1)
17
17
  i18n (~> 0.6, >= 0.6.9)
18
18
  json (~> 1.7, >= 1.7.7)
19
19
  minitest (~> 5.1)
@@ -30,7 +30,7 @@ GEM
30
30
  debugger-linecache (~> 1.2.0)
31
31
  debugger-ruby_core_source (~> 1.3.2)
32
32
  debugger-linecache (1.2.0)
33
- debugger-ruby_core_source (1.3.2)
33
+ debugger-ruby_core_source (1.3.4)
34
34
  diff-lcs (1.2.5)
35
35
  i18n (0.6.9)
36
36
  json (1.8.1)
@@ -68,6 +68,7 @@ GEM
68
68
  sqlite3 (1.3.9)
69
69
  sqlite3-ruby (1.3.3)
70
70
  sqlite3 (>= 1.3.3)
71
+ sshkey (1.6.1)
71
72
  thread_safe (0.3.3)
72
73
  tzinfo (1.1.0)
73
74
  thread_safe (~> 0.1)
@@ -82,4 +83,5 @@ DEPENDENCIES
82
83
  rake
83
84
  rspec (= 3.0.0.beta2)
84
85
  sqlite3-ruby
86
+ sshkey
85
87
  validators!
@@ -0,0 +1,55 @@
1
+ module ActiveModel
2
+ module Validations
3
+ class SshPrivateKeyValidator < EachValidator
4
+ def validate_each(record, attribute, value)
5
+ sshkey = SSHKey.new(value.to_s)
6
+ validate_type(record, attribute, sshkey)
7
+ validate_bits(record, attribute, sshkey)
8
+ rescue OpenSSL::PKey::DSAError, OpenSSL::PKey::RSAError
9
+ record.errors.add(attribute, :invalid_ssh_private_key,
10
+ message: options[:message],
11
+ value: value
12
+ )
13
+ end
14
+
15
+ private
16
+
17
+ def validate_type(record, attribute, sshkey)
18
+ return unless options[:type]
19
+
20
+ valid = [options[:type]]
21
+ .flatten.compact.map(&:to_s).include?(sshkey.type)
22
+
23
+ record.errors.add(attribute, :invalid_ssh_private_key_type,
24
+ message: options[:message],
25
+ value: (%w[rsa dsa] - [sshkey.type])[0].upcase
26
+ ) unless valid
27
+ end
28
+
29
+ def validate_bits(record, attribute, sshkey)
30
+ return unless options[:bits]
31
+
32
+ record.errors.add(attribute, :invalid_ssh_private_key_bits,
33
+ message: options[:message],
34
+ value: sshkey.bits,
35
+ required: options[:bits]
36
+ ) unless sshkey.bits >= options[:bits].to_i
37
+ end
38
+ end
39
+
40
+ module ClassMethods
41
+ # Validates whether or not the specified CNPJ is valid.
42
+ #
43
+ # class User < ActiveRecord::Base
44
+ # validates_ssh_private_key :key
45
+ # end
46
+ #
47
+ def validates_ssh_private_key(*attr_names)
48
+ require "sshkey"
49
+ validates_with SshPrivateKeyValidator, _merge_attributes(attr_names)
50
+ rescue LoadError
51
+ fail "sshkey is not part of the bundle. Add it to Gemfile."
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,27 @@
1
+ module ActiveModel
2
+ module Validations
3
+ class SshPublicKeyValidator < EachValidator
4
+ def validate_each(record, attribute, value)
5
+ record.errors.add(attribute, :invalid_ssh_public_key,
6
+ message: options[:message],
7
+ value: value
8
+ ) unless SSHKey.valid_ssh_public_key?(value)
9
+ end
10
+ end
11
+
12
+ module ClassMethods
13
+ # Validates whether or not the specified CNPJ is valid.
14
+ #
15
+ # class User < ActiveRecord::Base
16
+ # validates_ssh_public_key :key
17
+ # end
18
+ #
19
+ def validates_ssh_public_key(*attr_names)
20
+ require "sshkey"
21
+ validates_with SshPublicKeyValidator, _merge_attributes(attr_names)
22
+ rescue LoadError
23
+ fail "sshkey is not part of the bundle. Add it to Gemfile."
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,7 +1,7 @@
1
1
  module Validators
2
2
  module Version
3
3
  MAJOR = 2
4
- MINOR = 2
4
+ MINOR = 3
5
5
  PATCH = 0
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
data/lib/validators.rb CHANGED
@@ -7,6 +7,8 @@ require "validators/validates_url_format_of"
7
7
  require "validators/validates_ownership_of"
8
8
  require "validators/validates_cpf_format_of"
9
9
  require "validators/validates_cnpj_format_of"
10
+ require "validators/validates_ssh_private_key"
11
+ require "validators/validates_ssh_public_key"
10
12
 
11
13
  module Validators
12
14
  end
@@ -28,6 +28,10 @@ pt-BR:
28
28
  invalid_owner: "não está associado ao seu usuário"
29
29
  invalid_cpf: "não é um CPF válido"
30
30
  invalid_cnpj: "não é um CNPJ válido"
31
+ invalid_ssh_public_key: "não é uma chave pública de SSH válida"
32
+ invalid_ssh_private_key: "não é uma chave privada de SSH válida"
33
+ invalid_ssh_private_key_type: "precisa ser uma chave %{value}"
34
+ invalid_ssh_private_key_bits: "precisa ter pelo menos %{required} bits; a sua chave tem %{value} bits"
31
35
 
32
36
  activemodel:
33
37
  <<: *activerecord
@@ -0,0 +1,152 @@
1
+ require "spec_helper"
2
+
3
+ describe ".validates_ssh_private_key" do
4
+ context "common" do
5
+ let(:model) { Class.new {
6
+ def self.name
7
+ "User"
8
+ end
9
+
10
+ include ActiveModel::Model
11
+ validates_ssh_private_key :key
12
+ attr_accessor :key
13
+ } }
14
+
15
+ it "requires valid key" do
16
+ record = model.new(key: "invalid")
17
+ record.valid?
18
+
19
+ expect(record.errors[:key]).not_to be_empty
20
+ end
21
+
22
+ it "accepts valid key" do
23
+ record = model.new(key: SSHKey.generate.private_key)
24
+ record.valid?
25
+
26
+ expect(record.errors[:key]).to be_empty
27
+ end
28
+
29
+ it "sets translated error message" do
30
+ I18n.locale = "pt-BR"
31
+ message = "não é uma chave privada de SSH válida"
32
+
33
+ record = model.new(key: "invalid")
34
+ record.valid?
35
+
36
+ expect(record.errors[:key]).to include(message)
37
+ end
38
+ end
39
+
40
+ context "type validation (RSA)" do
41
+ let(:model) { Class.new {
42
+ def self.name
43
+ "User"
44
+ end
45
+
46
+ include ActiveModel::Model
47
+ validates_ssh_private_key :key, type: 'rsa'
48
+ attr_accessor :key
49
+ } }
50
+
51
+ it "accepts rsa key" do
52
+ record = model.new(key: SSHKey.generate(type: "rsa").private_key)
53
+ record.valid?
54
+
55
+ expect(record.errors[:key]).to be_empty
56
+ end
57
+
58
+ it "rejects dsa key" do
59
+ record = model.new(key: SSHKey.generate(type: "dsa").private_key)
60
+ record.valid?
61
+
62
+ expect(record.errors[:key]).not_to be_empty
63
+ end
64
+
65
+ it "sets translated error message" do
66
+ I18n.locale = "pt-BR"
67
+
68
+ record = model.new(key: SSHKey.generate(type: "dsa").private_key)
69
+ record.valid?
70
+
71
+ expect(record.errors[:key]).to include("precisa ser uma chave RSA")
72
+ end
73
+ end
74
+
75
+ context "type validation (DSA)" do
76
+ let(:model) { Class.new {
77
+ def self.name
78
+ "User"
79
+ end
80
+
81
+ include ActiveModel::Model
82
+ validates_ssh_private_key :key, type: "dsa"
83
+ attr_accessor :key
84
+ } }
85
+
86
+ it "accepts dsa key" do
87
+ record = model.new(key: SSHKey.generate(type: "dsa").private_key)
88
+ record.valid?
89
+
90
+ expect(record.errors[:key]).to be_empty
91
+ end
92
+
93
+ it "rejects rsa key" do
94
+ record = model.new(key: SSHKey.generate(type: 'rsa').private_key)
95
+ record.valid?
96
+
97
+ expect(record.errors[:key]).not_to be_empty
98
+ end
99
+
100
+ it "sets translated error message" do
101
+ I18n.locale = "pt-BR"
102
+
103
+ record = model.new(key: SSHKey.generate(type: 'rsa').private_key)
104
+ record.valid?
105
+
106
+ expect(record.errors[:key]).to include("precisa ser uma chave DSA")
107
+ end
108
+ end
109
+
110
+ context "bits" do
111
+ let(:model) { Class.new {
112
+ def self.name
113
+ "User"
114
+ end
115
+
116
+ include ActiveModel::Model
117
+ validates_ssh_private_key :key, bits: 2048
118
+ attr_accessor :key
119
+ } }
120
+
121
+ it "accepts bits equals to required" do
122
+ record = model.new(key: SSHKey.generate(bits: 2048).private_key)
123
+ record.valid?
124
+
125
+ expect(record.errors[:key]).to be_empty
126
+ end
127
+
128
+ it "accepts bits greater than required" do
129
+ record = model.new(key: SSHKey.generate(bits: 4096).private_key)
130
+ record.valid?
131
+
132
+ expect(record.errors[:key]).to be_empty
133
+ end
134
+
135
+ it "rejects invalid bits" do
136
+ record = model.new(key: SSHKey.generate(bits: 1024).private_key)
137
+ record.valid?
138
+
139
+ expect(record.errors[:key]).not_to be_empty
140
+ end
141
+
142
+ it "sets translated error message" do
143
+ I18n.locale = "pt-BR"
144
+ message = "precisa ter pelo menos 2048 bits; a sua chave tem 1024 bits"
145
+
146
+ record = model.new(key: SSHKey.generate(bits: 1024).private_key)
147
+ record.valid?
148
+
149
+ expect(record.errors[:key]).to include(message)
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ".validates_ssh_public_key" do
4
+ context "common" do
5
+ let(:model) { Class.new {
6
+ def self.name
7
+ "User"
8
+ end
9
+
10
+ include ActiveModel::Model
11
+ validates_ssh_public_key :key
12
+ attr_accessor :key
13
+ } }
14
+
15
+ it "requires valid key" do
16
+ record = model.new(key: nil)
17
+ record.valid?
18
+
19
+ expect(record.errors[:key]).not_to be_empty
20
+ end
21
+
22
+ it "accepts valid key" do
23
+ record = model.new(key: SSHKey.generate.ssh_public_key)
24
+ record.valid?
25
+
26
+ expect(record.errors[:key]).to be_empty
27
+ end
28
+
29
+ it "sets translated error message" do
30
+ I18n.locale = "pt-BR"
31
+ message = "não é uma chave pública de SSH válida"
32
+
33
+ record = model.new(key: "invalid")
34
+ record.valid?
35
+
36
+ expect(record.errors[:key]).to include(message)
37
+ end
38
+ end
39
+ end
data/validators.gemspec CHANGED
@@ -22,4 +22,5 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency "rake"
23
23
  s.add_development_dependency "pry-meta"
24
24
  s.add_development_dependency "cpf_cnpj"
25
+ s.add_development_dependency "sshkey"
25
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validators
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-04 00:00:00.000000000 Z
11
+ date: 2014-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sshkey
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: Add some nice ActiveRecord validators.
98
112
  email:
99
113
  - fnando.vieira@gmail.com
@@ -116,6 +130,8 @@ files:
116
130
  - lib/validators/validates_email_format_of.rb
117
131
  - lib/validators/validates_ip_address.rb
118
132
  - lib/validators/validates_ownership_of.rb
133
+ - lib/validators/validates_ssh_private_key.rb
134
+ - lib/validators/validates_ssh_public_key.rb
119
135
  - lib/validators/validates_url_format_of.rb
120
136
  - lib/validators/version.rb
121
137
  - spec/schema.rb
@@ -133,6 +149,8 @@ files:
133
149
  - spec/validators/validates_email_format_of_spec.rb
134
150
  - spec/validators/validates_ip_address_spec.rb
135
151
  - spec/validators/validates_ownership_of_spec.rb
152
+ - spec/validators/validates_ssh_private_key_spec.rb
153
+ - spec/validators/validates_ssh_public_key_spec.rb
136
154
  - spec/validators/validates_url_format_of_spec.rb
137
155
  - validators.gemspec
138
156
  homepage: http://rubygems.org/gems/validators
@@ -174,4 +192,6 @@ test_files:
174
192
  - spec/validators/validates_email_format_of_spec.rb
175
193
  - spec/validators/validates_ip_address_spec.rb
176
194
  - spec/validators/validates_ownership_of_spec.rb
195
+ - spec/validators/validates_ssh_private_key_spec.rb
196
+ - spec/validators/validates_ssh_public_key_spec.rb
177
197
  - spec/validators/validates_url_format_of_spec.rb