attr_encrypted_pgcrypto 1.2.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.
@@ -0,0 +1,22 @@
1
+ .DS_Store
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ coverage
7
+ InstalledFiles
8
+ lib/bundler/man
9
+ pkg
10
+ rdoc
11
+ spec/reports
12
+ test/tmp
13
+ test/version_tmp
14
+ tmp
15
+
16
+ # YARD artifacts
17
+ .yardoc
18
+ _yardoc
19
+ doc/
20
+
21
+ spec/database.yml
22
+ spec/debug.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format progress
3
+ --tag focus
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in attr_encrypted_pgcrypto.gemspec
4
+ gemspec
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ attr_encrypted_pgcrypto (0.0.1)
5
+ activerecord (>= 3.0)
6
+ activesupport (>= 3.0)
7
+ attr_encrypted (~> 1.2.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activemodel (3.2.11)
13
+ activesupport (= 3.2.11)
14
+ builder (~> 3.0.0)
15
+ activerecord (3.2.11)
16
+ activemodel (= 3.2.11)
17
+ activesupport (= 3.2.11)
18
+ arel (~> 3.0.2)
19
+ tzinfo (~> 0.3.29)
20
+ activesupport (3.2.11)
21
+ i18n (~> 0.6)
22
+ multi_json (~> 1.0)
23
+ arel (3.0.2)
24
+ attr_encrypted (1.2.1)
25
+ encryptor (>= 1.1.1)
26
+ builder (3.0.4)
27
+ coderay (1.0.8)
28
+ diff-lcs (1.1.3)
29
+ encryptor (1.1.3)
30
+ i18n (0.6.1)
31
+ method_source (0.8.1)
32
+ multi_json (1.5.0)
33
+ pg (0.14.1)
34
+ pry (0.9.10)
35
+ coderay (~> 1.0.5)
36
+ method_source (~> 0.8)
37
+ slop (~> 3.3.1)
38
+ rspec (2.12.0)
39
+ rspec-core (~> 2.12.0)
40
+ rspec-expectations (~> 2.12.0)
41
+ rspec-mocks (~> 2.12.0)
42
+ rspec-core (2.12.2)
43
+ rspec-expectations (2.12.1)
44
+ diff-lcs (~> 1.1.3)
45
+ rspec-mocks (2.12.1)
46
+ slop (3.3.3)
47
+ tzinfo (0.3.35)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ attr_encrypted_pgcrypto!
54
+ pg (~> 0.14.0)
55
+ pry
56
+ rspec (~> 2.12.0)
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Gabe Martin-Dempesy
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,80 @@
1
+ # attr_encrypted_pgcrypto
2
+
3
+ A [pgcrypto](http://www.postgresql.org/docs/9.1/static/pgcrypto.html)-based [Encryptor](https://github.com/shuber/encryptor) implementation for [attr_encrypted](https://github.com/shuber/attr_encrypted). It delegates to `pgp_sym_encrypt()` and `pgp_sym_decrypt()` to provide symmetric-key encryption. It's useful if you need to:
4
+
5
+ - Access the plain text values directly from SQL without bringing the data into Ruby
6
+ - Integrate databases managed by other applications
7
+
8
+ Is this library a bad idea? _Potentially!_ Please open an issue to discuss and help document any caveats.
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'attr_encrypted_pgcrypto'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Your platform may not ship with the pgcrypto extensions by default. On Ubuntu, run:
21
+
22
+ `apt-get install postgresql-contrib-9.1`
23
+
24
+ Generate a migration to load the pgcrypto extension into your database. Your user will need [superuser privileges](http://www.postgresql.org/docs/9.1/static/sql-createextension.html) to run this query, so you may need to manually run this via `psql` as the `postgres` user if your Rails database user does not have access.
25
+
26
+ ```ruby
27
+ execute("CREATE EXTENSION IF NOT EXISTS pgcrypto")
28
+ ```
29
+
30
+ Extensions are database specific. To ensure that the extension is also enabled for your test database, rails needs to use the [sql schema format](http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-schema_format). Edit `config/application.rb` to set:
31
+
32
+ ```ruby
33
+ config.active_record.schema_format = :sql
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ See [attr_encrypted's Custom encryptor documentation](https://github.com/shuber/attr_encrypted#custom-encryptor).
39
+
40
+ ```ruby
41
+ class User
42
+ attr_encrypted :ssn, :key => 'a secret key', :encryptor => AttrEncryptedPgcrypto::Encryptor, :encode => false
43
+ end
44
+ ```
45
+
46
+ If you do not disable `:encode`, attr_encrypted will base64 encode the output, defeating the purpose of being able to query the data directly from SQL.
47
+
48
+ This is an example - please don't actually embed your keys directly in your model as literal strings, or even commit them in your repository. I recommend storing your key in a .gitignored config/pgcrypto_key.txt file, having capistrano (or your preferred deployment utility) copy this from a local 'shared/' folder, and reading the value into `Rails.application.config.pgcrypto` via an initializer.
49
+
50
+ ## Caveats
51
+
52
+ - Your key is embedded into any SQL queries. The key itself will be automatically filtered from your Rails logs. However, make sure you are using a secured or private connection between your Rails server and your database.
53
+ - Unlike the OpenSSL algorithms used in the default Encryptor, `pgp_sym_encrypt()` uses an IV and will generate different cipher text every call. While this is more secure, you will not be able to use attr_encrypted's [find_by_ methods](https://github.com/shuber/attr_encrypted#dynamic-find_by_-and-scoped_by_-methods).
54
+
55
+ ## Compatability
56
+
57
+ Tested against:
58
+
59
+ - MRI Ruby 1.9.3
60
+ - Rails 3.2.11
61
+ - attr_encrypted 1.2.1
62
+ - PostgreSQL 9.1
63
+
64
+ ## Credits
65
+
66
+ The bulk of this code is a humble verbatim copy and paste job from [jmazzi's crypt_keeper gem](https://github.com/jmazzi/crypt_keeper). Thanks, Justin!
67
+
68
+ Why not just use crypt_keeper? crypt_keeper uses ActiveRecord callbacks to encrypt and decrypt, while attr\_encrypted uses accessor methods. This means:
69
+
70
+ - Your model is always dirty after a fetch
71
+ - Data is eagerly encrypted and decrypted, causing unnecessary extra queries
72
+ - If you have other callback based dependencies (e.g. papertrail) they may receive either the encrytped or plaintext version of the columns.
73
+
74
+ ## Contributing
75
+
76
+ 1. Fork it
77
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
78
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
79
+ 4. Push to the branch (`git push origin my-new-feature`)
80
+ 5. Create new Pull Request
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new('spec')
4
+
5
+ # If you want to make this the default task
6
+ task default: :spec
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'attr_encrypted_pgcrypto/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "attr_encrypted_pgcrypto"
8
+ gem.version = AttrEncryptedPgcrypto::VERSION
9
+ gem.authors = ["Gabe Martin-Dempesy"]
10
+ gem.email = ["gabe@mudbugmedia.com"]
11
+ gem.description = %q{A pgcrypto based Encryptor implementation for attr_encrypted}
12
+ gem.summary = %q{A pgcrypto based Encryptor implementation for attr_encrypted}
13
+ gem.homepage = "https://github.com/gabetax/attr_encrypted_pgcrypto"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_runtime_dependency 'attr_encrypted', '~> 1.2.0'
21
+ gem.add_runtime_dependency 'activerecord', '>= 3.0'
22
+ gem.add_runtime_dependency 'activesupport', '>= 3.0'
23
+
24
+ gem.add_development_dependency 'pry'
25
+ gem.add_development_dependency 'rspec', '~> 2.12.0'
26
+ gem.add_development_dependency 'pg', '~> 0.14.0'
27
+ end
@@ -0,0 +1,4 @@
1
+ require 'attr_encrypted'
2
+ require 'attr_encrypted_pgcrypto/version'
3
+ require 'attr_encrypted_pgcrypto/log_subscriber/postgres_pgp'
4
+ require 'attr_encrypted_pgcrypto/encryptor'
@@ -0,0 +1,48 @@
1
+ module AttrEncryptedPgcrypto
2
+ module Encryptor
3
+
4
+ extend self
5
+ ActiveSupport.run_load_hooks(:attr_encrypted_pgcrypto_posgres_pgp_log, self)
6
+
7
+ # Encrypts a <tt>:value</tt> with a specified <tt>:key</tt>
8
+ #
9
+ # Example
10
+ #
11
+ # encrypted_value = AttrEncryptedPgcrypto::Encryptor.encrypt(:value => 'some string to encrypt', :key => 'some secret key')
12
+ # # or
13
+ # encrypted_value = AttrEncryptedPgcrypto::Encryptor.encrypt('some string to encrypt', :key => 'some secret key')
14
+ def encrypt(*args, &block)
15
+ escape_and_execute_sql(["SELECT pgp_sym_encrypt(?, ?)", value(args), key(args)])['pgp_sym_encrypt']
16
+ end
17
+
18
+ # Decrypts a <tt>:value</tt> with a specified <tt>:key</tt>
19
+ #
20
+ # Example
21
+ #
22
+ # decrypted_value = AttrEncryptedPgcrypto::Encryptor.decrypt(:value => 'some encrypted string', :key => 'some secret key')
23
+ # # or
24
+ # decrypted_value = AttrEncryptedPgcrypto::Encryptor.decrypt('some encrypted string', :key => 'some secret key')
25
+ def decrypt(*args, &block)
26
+ escape_and_execute_sql(["SELECT pgp_sym_decrypt(?, ?)", value(args), key(args)])['pgp_sym_decrypt']
27
+ end
28
+
29
+ protected
30
+
31
+ def value(args)
32
+ if args.first.is_a?(String)
33
+ args.first
34
+ else
35
+ args.last[:value]
36
+ end
37
+ end
38
+
39
+ def key(args)
40
+ args.last.is_a?(Hash) && args.last[:key] || (raise ArgumentError.new('must specify a :key'))
41
+ end
42
+
43
+ def escape_and_execute_sql(query)
44
+ query = ::ActiveRecord::Base.send :sanitize_sql_array, query
45
+ ::ActiveRecord::Base.connection.execute(query).first
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,31 @@
1
+ require 'active_record'
2
+ require 'active_record/log_subscriber'
3
+ require 'active_support/concern'
4
+ require 'active_support/lazy_load_hooks'
5
+
6
+ module AttrEncryptedPgcrypto
7
+ module LogSubscriber
8
+ module PostgresPgp
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ alias_method_chain :sql, :postgres_pgp
13
+ end
14
+
15
+ # Public: Prevents sensitive data from being logged
16
+ def sql_with_postgres_pgp(event)
17
+ filter = /(pgp_sym_(encrypt|decrypt))\(((.|\n)*?)\)/i
18
+
19
+ event.payload[:sql] = event.payload[:sql].gsub(filter) do |_|
20
+ "#{$1}([FILTERED])"
21
+ end
22
+
23
+ sql_without_postgres_pgp(event)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ ActiveSupport.on_load :attr_encrypted_pgcrypto_posgres_pgp_log do
30
+ ActiveRecord::LogSubscriber.send :include, AttrEncryptedPgcrypto::LogSubscriber::PostgresPgp
31
+ end
@@ -0,0 +1,3 @@
1
+ module AttrEncryptedPgcrypto
2
+ VERSION = "1.2.1"
3
+ end
@@ -0,0 +1,8 @@
1
+ postgres:
2
+ adapter: postgresql
3
+ encoding: utf8
4
+ reconnect: false
5
+ database: attr_encrytped_pgcrypto
6
+ pool: 5
7
+ username: postgres
8
+ password:
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe AttrEncryptedPgcrypto::Encryptor do
4
+ use_postgres
5
+
6
+ subject { AttrEncryptedPgcrypto::Encryptor }
7
+ let(:plaintext) { "Hello, World!" }
8
+ let(:cipher) { "\\xc30d040703027a5b637f1c6654686cd23e01bb477e90e6483b9f270ce2a5a2a1694e1d0df4ebf95aaca80e0825a42c8ec3c70dff19a421f54ae785a2d35b6c48d0f9e5108a34fbf6b681f92f739e0f" }
9
+ let(:key) { "What do you want? I'm a test key!" }
10
+ describe "#encrypt" do
11
+ context "without key" do
12
+ it do
13
+ expect { subject.encrypt "plaintext" }.to raise_exception(ArgumentError)
14
+ end
15
+ end
16
+
17
+ context "valid" do
18
+ it "returns cipher text" do
19
+ AttrEncryptedPgcrypto::Encryptor.encrypt(plaintext, key: key).should be_a(String)
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "#decrypt" do
25
+ context "valid" do
26
+ it "returns plaintext" do
27
+ AttrEncryptedPgcrypto::Encryptor.decrypt(cipher, key: key).should == plaintext
28
+ end
29
+ end
30
+
31
+ context "invalid" do
32
+ let(:key) { "This is not the key you're looking for." }
33
+ specify do
34
+ expect { AttrEncryptedPgcrypto::Encryptor.decrypt(cipher, key: key) }.to raise_exception(ActiveRecord::StatementInvalid)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ module AttrEncryptedPgcrypto::LogSubscriber
4
+ describe PostgresPgp do
5
+ use_postgres
6
+
7
+ subject { ::ActiveRecord::LogSubscriber.new }
8
+
9
+ let(:input_query) do
10
+ "SELECT pgp_sym_encrypt('encrypt_value', 'encrypt_key'), pgp_sym_decrypt('decrypt_value', 'decrypt_key') FROM DUAL;"
11
+ end
12
+
13
+ let(:output_query) do
14
+ "SELECT pgp_sym_encrypt([FILTERED]), pgp_sym_decrypt([FILTERED]) FROM DUAL;"
15
+ end
16
+
17
+ it "filters pgp functions" do
18
+ subject.should_receive(:sql_without_postgres_pgp) do |event|
19
+ event.payload[:sql].should == output_query
20
+ end
21
+
22
+ subject.sql(ActiveSupport::Notifications::Event.new(:sql, 1, 1, 1, { sql: output_query }))
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ require 'pry'
2
+ require 'attr_encrypted_pgcrypto'
3
+
4
+ SPEC_ROOT = Pathname.new File.expand_path File.dirname __FILE__
5
+ Dir[SPEC_ROOT.join('support/*.rb')].each{|f| require f }
6
+
7
+ # This file was generated by the `rspec --init` command. Conventionally, all
8
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
9
+ # Require this file using `require "spec_helper"` to ensure that it is only
10
+ # loaded once.
11
+ #
12
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
13
+ RSpec.configure do |config|
14
+ config.treat_symbols_as_metadata_keys_with_true_values = true
15
+ config.run_all_when_everything_filtered = true
16
+ config.filter_run :focus
17
+
18
+ # Run specs in random order to surface order dependencies. If you find an
19
+ # order dependency and want to debug it, you can fix the order by providing
20
+ # the seed, which is printed after each run.
21
+ # --seed 1234
22
+ config.order = 'random'
23
+
24
+ # When setting boolean tags/metadata, allow an array shorthand instead of hash
25
+ #
26
+ # Example
27
+ #
28
+ # it "wants my attention", :focus do
29
+ #
30
+ # https://www.relishapp.com/rspec/rspec-core/docs/metadata/user-defined-metadata
31
+ config.treat_symbols_as_metadata_keys_with_true_values = true
32
+
33
+ # https://www.relishapp.com/rspec/rspec-core/docs/filtering/run-all-when-everything-filtered
34
+ config.run_all_when_everything_filtered = true
35
+ end
@@ -0,0 +1,25 @@
1
+ require 'active_record'
2
+ require 'logger'
3
+
4
+ ::ActiveRecord::Base.logger = Logger.new SPEC_ROOT.join('debug.log').to_s
5
+ ::ActiveRecord::Migration.verbose = false
6
+
7
+ module AttrEncryptedPgcrypto
8
+ class SensitiveData < ActiveRecord::Base; end
9
+
10
+ module ConnectionHelpers
11
+ def use_postgres
12
+ before :all do
13
+ ::ActiveRecord::Base.clear_active_connections!
14
+ config = YAML.load_file SPEC_ROOT.join('database.yml')
15
+ ::ActiveRecord::Base.establish_connection(config['postgres'])
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+
22
+
23
+ RSpec.configure do |config|
24
+ config.extend AttrEncryptedPgcrypto::ConnectionHelpers
25
+ end
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attr_encrypted_pgcrypto
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.2.1
6
+ platform: ruby
7
+ authors:
8
+ - Gabe Martin-Dempesy
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ type: :runtime
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.2.0
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ version: 1.2.0
29
+ name: attr_encrypted
30
+ - !ruby/object:Gem::Dependency
31
+ type: :runtime
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '3.0'
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '3.0'
45
+ name: activerecord
46
+ - !ruby/object:Gem::Dependency
47
+ type: :runtime
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ name: activesupport
62
+ - !ruby/object:Gem::Dependency
63
+ type: :development
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ name: pry
78
+ - !ruby/object:Gem::Dependency
79
+ type: :development
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 2.12.0
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ~>
91
+ - !ruby/object:Gem::Version
92
+ version: 2.12.0
93
+ name: rspec
94
+ - !ruby/object:Gem::Dependency
95
+ type: :development
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 0.14.0
102
+ prerelease: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ version: 0.14.0
109
+ name: pg
110
+ description: A pgcrypto based Encryptor implementation for attr_encrypted
111
+ email:
112
+ - gabe@mudbugmedia.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .rspec
119
+ - Gemfile
120
+ - Gemfile.lock
121
+ - LICENSE.txt
122
+ - README.md
123
+ - Rakefile
124
+ - attr_encrypted_pgcrypto.gemspec
125
+ - lib/attr_encrypted_pgcrypto.rb
126
+ - lib/attr_encrypted_pgcrypto/encryptor.rb
127
+ - lib/attr_encrypted_pgcrypto/log_subscriber/postgres_pgp.rb
128
+ - lib/attr_encrypted_pgcrypto/version.rb
129
+ - spec/default.database.yml
130
+ - spec/lib/encryptor_spec.rb
131
+ - spec/log_subscriber/postgres_pgp_spec.rb
132
+ - spec/spec_helper.rb
133
+ - spec/support/active_record.rb
134
+ homepage: https://github.com/gabetax/attr_encrypted_pgcrypto
135
+ licenses: []
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 1.8.24
155
+ signing_key:
156
+ specification_version: 3
157
+ summary: A pgcrypto based Encryptor implementation for attr_encrypted
158
+ test_files:
159
+ - spec/default.database.yml
160
+ - spec/lib/encryptor_spec.rb
161
+ - spec/log_subscriber/postgres_pgp_spec.rb
162
+ - spec/spec_helper.rb
163
+ - spec/support/active_record.rb
164
+ has_rdoc: