attr_encrypted_pgcrypto 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +22 -0
- data/.rspec +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +56 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +6 -0
- data/attr_encrypted_pgcrypto.gemspec +27 -0
- data/lib/attr_encrypted_pgcrypto.rb +4 -0
- data/lib/attr_encrypted_pgcrypto/encryptor.rb +48 -0
- data/lib/attr_encrypted_pgcrypto/log_subscriber/postgres_pgp.rb +31 -0
- data/lib/attr_encrypted_pgcrypto/version.rb +3 -0
- data/spec/default.database.yml +8 -0
- data/spec/lib/encryptor_spec.rb +38 -0
- data/spec/log_subscriber/postgres_pgp_spec.rb +25 -0
- data/spec/spec_helper.rb +35 -0
- data/spec/support/active_record.rb +25 -0
- metadata +164 -0
data/.gitignore
ADDED
@@ -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
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -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)
|
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -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
|
data/Rakefile
ADDED
@@ -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,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,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
|
data/spec/spec_helper.rb
ADDED
@@ -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:
|