pgcrypto 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +2 -0
- data/.simplecov +4 -0
- data/CHANGES +5 -0
- data/Gemfile +16 -1
- data/VERSION +1 -1
- data/autotest/discover.rb +14 -0
- data/lib/generators/pgcrypto/install/templates/migration.rb +2 -1
- data/lib/pgcrypto/active_record.rb +43 -0
- data/lib/pgcrypto/column.rb +6 -0
- data/lib/pgcrypto/key.rb +2 -2
- data/pgcrypto.gemspec +8 -2
- data/spec/lib/pgcrypto_spec.rb +50 -0
- data/spec/spec_helper.rb +79 -0
- data/spec/support/private.key +34 -0
- data/spec/support/public.key +20 -0
- metadata +9 -3
data/.rspec
CHANGED
data/.simplecov
ADDED
data/CHANGES
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
0.1.1
|
2
|
+
* Rebuilt the WHERE clause stuff to make sure finders AND setters
|
3
|
+
both worked. It's fragile and hackish at this time, but we'll get
|
4
|
+
there, folks!
|
5
|
+
|
1
6
|
0.1.0
|
2
7
|
* Overhauled the underpinnings to rely on a separate column. Adds
|
3
8
|
on-demand loading of encrypted attributes from a central table
|
data/Gemfile
CHANGED
@@ -1 +1,16 @@
|
|
1
|
-
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
gem 'activerecord', '>= 3.2', :require => 'active_record'
|
4
|
+
|
5
|
+
group :test do
|
6
|
+
gem 'autotest'
|
7
|
+
gem 'database_cleaner', '>= 0.7'
|
8
|
+
gem 'fuubar'
|
9
|
+
gem 'pg', '>= 0.11'
|
10
|
+
gem 'rspec', rspec_version = '>= 2.6'
|
11
|
+
gem 'simplecov', :require => false
|
12
|
+
if RUBY_PLATFORM =~ /darwin/
|
13
|
+
gem 'autotest-fsevent', '>= 0.2'
|
14
|
+
gem 'autotest-growl', '>= 0.2'
|
15
|
+
end
|
16
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'autotest/fsevent'
|
2
|
+
require 'autotest/growl'
|
3
|
+
|
4
|
+
Autotest.add_discovery { "rspec2" }
|
5
|
+
|
6
|
+
Autotest.add_hook :initialize do |autotest|
|
7
|
+
autotest.add_mapping %r(^lib/**/*\.rb$) do |file, _|
|
8
|
+
Dir['spec/**/*.rb']
|
9
|
+
end
|
10
|
+
|
11
|
+
autotest.add_mapping %r(^spec/support/*\.rb$) do |file, _|
|
12
|
+
Dir['spec/**/*.rb']
|
13
|
+
end
|
14
|
+
end
|
@@ -2,7 +2,8 @@ class InstallPgcrypto < ActiveRecord::Migration
|
|
2
2
|
def up
|
3
3
|
create_table :pgcrypto_columns do |t|
|
4
4
|
t.belongs_to :owner, :polymorphic => true
|
5
|
-
t.string :
|
5
|
+
t.string :owner_table, :limit => 32
|
6
|
+
t.string :name, :limit => 32
|
6
7
|
t.binary :value
|
7
8
|
end
|
8
9
|
add_index :pgcrypto_columns, [:owner_id, :owner_type, :name], :name => :pgcrypto_column_finder
|
@@ -9,6 +9,8 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
9
9
|
case arel
|
10
10
|
when Arel::InsertManager
|
11
11
|
pgcrypto_tweak_insert(arel, *args)
|
12
|
+
when Arel::SelectManager
|
13
|
+
pgcrypto_tweak_select(arel)
|
12
14
|
when Arel::UpdateManager
|
13
15
|
pgcrypto_tweak_update(arel)
|
14
16
|
end
|
@@ -35,6 +37,47 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
40
|
+
def pgcrypto_tweak_select(arel)
|
41
|
+
# We start by looping through each "core," which is just
|
42
|
+
# a SelectStatement and correcting plain-text queries
|
43
|
+
# against an encrypted column...
|
44
|
+
joins = {}
|
45
|
+
table_name = nil
|
46
|
+
arel.ast.cores.each do |core|
|
47
|
+
# Yeah, I'm lazy. Whatevs.
|
48
|
+
next unless core.is_a?(Arel::Nodes::SelectCore) && !(columns = PGCrypto[table_name = core.source.left.name]).empty?
|
49
|
+
|
50
|
+
# We loop through each WHERE specification to determine whether or not the
|
51
|
+
# PGCrypto column should be JOIN'd upon; in which case, we, like, do it.
|
52
|
+
core.wheres.each do |where|
|
53
|
+
# Now loop through the children to encrypt them for the SELECT
|
54
|
+
where.children.each do |child|
|
55
|
+
if options = columns[child.left.name]
|
56
|
+
if key = PGCrypto.keys[options[:private_key] || :private]
|
57
|
+
join_name = "pgcrypto_column_#{child.left.name}"
|
58
|
+
joins[join_name] ||= {:column => child.left.name, :key => "#{key.dearmored} AS #{key.name}_key"}
|
59
|
+
child.left = Arel::Nodes::SqlLiteral.new(%[pgp_pub_decrypt("#{join_name}"."value", keys.#{key.name}_key)])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end if where.respond_to?(:children)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
unless joins.empty?
|
66
|
+
key_joins = []
|
67
|
+
joins.each do |key_name, join|
|
68
|
+
key_joins.push(join[:key])
|
69
|
+
column = quote_string(join[:column].to_s)
|
70
|
+
arel.join(Arel::Nodes::SqlLiteral.new(%[
|
71
|
+
JOIN "pgcrypto_columns" AS "pgcrypto_column_#{column}" ON
|
72
|
+
"pgcrypto_column_#{column}"."owner_id" = "#{table_name}"."id"
|
73
|
+
AND "pgcrypto_column_#{column}"."owner_table" = '#{quote_string(table_name)}'
|
74
|
+
AND "pgcrypto_column_#{column}"."name" = '#{column}'
|
75
|
+
]))
|
76
|
+
end
|
77
|
+
arel.join(Arel::Nodes::SqlLiteral.new("CROSS JOIN (SELECT #{key_joins.join(', ')}) AS keys"))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
38
81
|
def pgcrypto_tweak_update(arel)
|
39
82
|
if arel.ast.relation.name == PGCrypto::Column.table_name
|
40
83
|
# Loop through the assignments and make sure we take care of that whole
|
data/lib/pgcrypto/column.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
module PGCrypto
|
2
2
|
class Column < ActiveRecord::Base
|
3
3
|
self.table_name = 'pgcrypto_columns'
|
4
|
+
before_save :set_owner_table
|
4
5
|
belongs_to :owner, :autosave => false, :inverse_of => :pgcrypto_columns, :polymorphic => true
|
6
|
+
|
7
|
+
protected
|
8
|
+
def set_owner_table
|
9
|
+
self.owner_table = self.owner.class.table_name
|
10
|
+
end
|
5
11
|
end
|
6
12
|
end
|
data/lib/pgcrypto/key.rb
CHANGED
@@ -24,7 +24,7 @@ module PGCrypto
|
|
24
24
|
|
25
25
|
def initialize(options = {})
|
26
26
|
if options.is_a?(String)
|
27
|
-
self.value =
|
27
|
+
self.value = options
|
28
28
|
elsif options.is_a?(Hash)
|
29
29
|
options.each do |key, value|
|
30
30
|
send("#{key}=", value)
|
@@ -34,7 +34,7 @@ module PGCrypto
|
|
34
34
|
|
35
35
|
def path=(keyfile)
|
36
36
|
keyfile = File.expand_path(keyfile)
|
37
|
-
raise PGCrypto::Error, "
|
37
|
+
raise PGCrypto::Error, "#{keyfile} does not exist!" unless File.file?(keyfile)
|
38
38
|
@path = keyfile
|
39
39
|
self.value = File.read(keyfile)
|
40
40
|
end
|
data/pgcrypto.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "pgcrypto"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Flip Sasser"]
|
@@ -18,12 +18,14 @@ Gem::Specification.new do |s|
|
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".rspec",
|
21
|
+
".simplecov",
|
21
22
|
"CHANGES",
|
22
23
|
"Gemfile",
|
23
24
|
"LICENSE",
|
24
25
|
"README.markdown",
|
25
26
|
"Rakefile",
|
26
27
|
"VERSION",
|
28
|
+
"autotest/discover.rb",
|
27
29
|
"lib/generators/pgcrypto/install/USAGE",
|
28
30
|
"lib/generators/pgcrypto/install/install_generator.rb",
|
29
31
|
"lib/generators/pgcrypto/install/templates/initializer.rb",
|
@@ -34,7 +36,11 @@ Gem::Specification.new do |s|
|
|
34
36
|
"lib/pgcrypto/column.rb",
|
35
37
|
"lib/pgcrypto/key.rb",
|
36
38
|
"lib/pgcrypto/table_manager.rb",
|
37
|
-
"pgcrypto.gemspec"
|
39
|
+
"pgcrypto.gemspec",
|
40
|
+
"spec/lib/pgcrypto_spec.rb",
|
41
|
+
"spec/spec_helper.rb",
|
42
|
+
"spec/support/private.key",
|
43
|
+
"spec/support/public.key"
|
38
44
|
]
|
39
45
|
s.homepage = "http://github.com/Plinq/pgcrypto"
|
40
46
|
s.require_paths = ["lib"]
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PGCrypto do
|
4
|
+
it "should extend ActiveRecord::Base" do
|
5
|
+
PGCryptoTestModel.should respond_to(:pgcrypto)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "attributes" do
|
9
|
+
before :each do
|
10
|
+
PGCryptoTestModel.pgcrypto :test_column
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have readers and writers" do
|
14
|
+
model = PGCryptoTestModel.new
|
15
|
+
model.should respond_to(:test_column)
|
16
|
+
model.should respond_to(:test_column=)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "be settable on create" do
|
20
|
+
model = PGCryptoTestModel.new(:test_column => 'this is a test')
|
21
|
+
model.save!.should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "be settable on update" do
|
25
|
+
model = PGCryptoTestModel.create!
|
26
|
+
model.test_column = 'this is another test'
|
27
|
+
model.save!.should be_true
|
28
|
+
end
|
29
|
+
|
30
|
+
it "be update-able" do
|
31
|
+
model = PGCryptoTestModel.create!(:test_column => 'i am test column')
|
32
|
+
model.update_attributes!(:test_column => 'but now i am a different column, son').should be_true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "be retrievable at create" do
|
36
|
+
model = PGCryptoTestModel.create!(:test_column => 'i am test column')
|
37
|
+
model.test_column.should == 'i am test column'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "be retrievable after create" do
|
41
|
+
model = PGCryptoTestModel.create!(:test_column => 'i should return to you')
|
42
|
+
PGCryptoTestModel.find(model.id).test_column.should == 'i should return to you'
|
43
|
+
end
|
44
|
+
|
45
|
+
it "be searchable" do
|
46
|
+
model = PGCryptoTestModel.create!(:test_column => 'i am findable!')
|
47
|
+
PGCryptoTestModel.where(:test_column => model.test_column).count.should == 1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# Add lib/ to the load path
|
2
|
+
$LOAD_PATH.unshift(File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
# Load up our Gemfile
|
5
|
+
require 'rubygems'
|
6
|
+
require 'bundler/setup'
|
7
|
+
Bundler.require(:default, :test)
|
8
|
+
|
9
|
+
# Enable coverage reporting
|
10
|
+
require 'simplecov'
|
11
|
+
|
12
|
+
# Requier and configure PGCrypto
|
13
|
+
require 'pgcrypto'
|
14
|
+
PGCrypto.keys[:private] = {:path => File.join(File.dirname(__FILE__), 'support', 'private.key')}
|
15
|
+
PGCrypto.keys[:public] = {:path => File.join(File.dirname(__FILE__), 'support', 'public.key')}
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
database_config = {:adapter => 'postgresql', :database => 'pgcrypto_test', :encoding => 'utf8', :host => 'localhost'}
|
19
|
+
postgres_config = database_config.merge(:database => 'postgres', :schema_search_path => 'public')
|
20
|
+
|
21
|
+
# Set up the database to handle pgcrypto functions and the schema for
|
22
|
+
# our tests
|
23
|
+
config.before :all do
|
24
|
+
# Connect to the local postgres schema database
|
25
|
+
ActiveRecord::Base.establish_connection(postgres_config)
|
26
|
+
|
27
|
+
# Create the test database if we can
|
28
|
+
ActiveRecord::Base.connection.create_database(database_config[:database]) rescue nil
|
29
|
+
|
30
|
+
# Now connect to the newly created database
|
31
|
+
ActiveRecord::Base.establish_connection(database_config)
|
32
|
+
|
33
|
+
|
34
|
+
silence_stream(STDOUT) do
|
35
|
+
# ...and load in the pgcrypto extension
|
36
|
+
ActiveRecord::Base.connection.execute(%[CREATE EXTENSION pgcrypto])
|
37
|
+
|
38
|
+
# ...and then set up the pgcrypto_columns and pgcrypto_test_models fun
|
39
|
+
ActiveRecord::Schema.define do
|
40
|
+
create_table :pgcrypto_columns, :force => true do |t|
|
41
|
+
t.belongs_to :owner, :polymorphic => true
|
42
|
+
t.string :owner_table, :limit => 32
|
43
|
+
t.string :name, :limit => 64
|
44
|
+
t.binary :value
|
45
|
+
end
|
46
|
+
|
47
|
+
create_table :pgcrypto_test_models, :force => true do |t|
|
48
|
+
t.string :name, :limit => 32
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
config.before :each do
|
55
|
+
if example.metadata[:transaction] == false
|
56
|
+
DatabaseCleaner.strategy = :truncation
|
57
|
+
DatabaseCleaner.clean_with :truncation
|
58
|
+
else
|
59
|
+
DatabaseCleaner.strategy = :transaction
|
60
|
+
end
|
61
|
+
DatabaseCleaner.start
|
62
|
+
|
63
|
+
ActiveRecord::Base.establish_connection(database_config)
|
64
|
+
|
65
|
+
class PGCryptoTestModel < ActiveRecord::Base
|
66
|
+
self.table_name = :pgcrypto_test_models
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
config.after :all do
|
71
|
+
# Drop the database when we exist
|
72
|
+
ActiveRecord::Base.establish_connection(postgres_config)
|
73
|
+
ActiveRecord::Base.connection.drop_database(database_config[:database]) rescue nil
|
74
|
+
end
|
75
|
+
|
76
|
+
config.after :each do
|
77
|
+
DatabaseCleaner.clean
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
2
|
+
Version: GnuPG v1.4.12 (Darwin)
|
3
|
+
|
4
|
+
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
|
32
|
+
QNXpHhBr6g==
|
33
|
+
=sN2M
|
34
|
+
-----END PGP PRIVATE KEY BLOCK-----
|
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
2
|
+
Version: GnuPG v1.4.12 (Darwin)
|
3
|
+
|
4
|
+
mI0ET3J1UAEEAN9OYtT4bX1XPyK6BNl+7FgbYpYjn5QS9bQA8TRcX1H1tFxrzib5
|
5
|
+
NsyaGzSEda8f7nGY+AE3xq3HU8AmPrktm58tCKldvhktg6LY5Y+Hu6aUxqhKvBhQ
|
6
|
+
jtIfEv/OpGR3AeKuJzFOV+q/iU9zuTEOPB+R53ycNZxWQKt5lUtPDBR/ABEBAAG0
|
7
|
+
NEZsaXAgU2Fzc2VyIChEZWxpZ2h0ZnVsIFdpZGdldHMpIDxmbGlwQGdldHBsaW5x
|
8
|
+
LmNvbT6IuAQTAQIAIgUCT3J1UAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA
|
9
|
+
CgkQSOpAHKUTK5++NQQAk9PY+UxBu2J4xX/XqF34eSaWFr/sXZwCWYzHZfnDGeQs
|
10
|
+
WQfr8czYTl9jsAlruXxIdsCm20bi1h52uknm0Yxc2Oti3dIo6lckT878/7+1Z/KQ
|
11
|
+
arE7yT4F1JqzJivTgDAADOuDcET4gMUpELXN6htrmnA8ghCNdLivTE/8zZguiEi4
|
12
|
+
jQRPcnVQAQQA9MEq2zMJtfWLZ2HfkTYkHemesc4XB+xCLfldNdmUwQ4o+GXfxe6V
|
13
|
+
XYCcKPpyx+qXSP6q7OxR8QKk8wbIord2/w6iIkn+ULvHQw1KMaCQW3JuQPB+IMWA
|
14
|
+
3kY8eQ3uibc2vk3ZFMtlU9HCxcRBPnMsCaBXYH1EkQ0+JVyuAotFOksAEQEAAYif
|
15
|
+
BBgBAgAJBQJPcnVQAhsMAAoJEEjqQBylEyuf/DoEAM3THz28/QsZGmfArZnwBUhe
|
16
|
+
KVw83F7xySrHHRchTlfXd3oO280KWEi7Y3Z8DQzb89Hv8wbz7MahktlS8LQP5ZQ2
|
17
|
+
rdjmFBvYrskgBU81hUf5HTn/W1Yawf/yH94f0++V1Dy2NBXiOAsmrHn882tJvpZ1
|
18
|
+
JSagpCuA5EFA1ekeEGvq
|
19
|
+
=XKvD
|
20
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pgcrypto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-03-28 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &70275631246800 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '3.2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70275631246800
|
25
25
|
description: ! "\n PGCrypto is an ActiveRecord::Base extension that allows you
|
26
26
|
to asymmetrically\n encrypt PostgreSQL columns with as little trouble as possible.
|
27
27
|
It's totally\n freaking rad.\n "
|
@@ -33,12 +33,14 @@ extra_rdoc_files:
|
|
33
33
|
- README.markdown
|
34
34
|
files:
|
35
35
|
- .rspec
|
36
|
+
- .simplecov
|
36
37
|
- CHANGES
|
37
38
|
- Gemfile
|
38
39
|
- LICENSE
|
39
40
|
- README.markdown
|
40
41
|
- Rakefile
|
41
42
|
- VERSION
|
43
|
+
- autotest/discover.rb
|
42
44
|
- lib/generators/pgcrypto/install/USAGE
|
43
45
|
- lib/generators/pgcrypto/install/install_generator.rb
|
44
46
|
- lib/generators/pgcrypto/install/templates/initializer.rb
|
@@ -50,6 +52,10 @@ files:
|
|
50
52
|
- lib/pgcrypto/key.rb
|
51
53
|
- lib/pgcrypto/table_manager.rb
|
52
54
|
- pgcrypto.gemspec
|
55
|
+
- spec/lib/pgcrypto_spec.rb
|
56
|
+
- spec/spec_helper.rb
|
57
|
+
- spec/support/private.key
|
58
|
+
- spec/support/public.key
|
53
59
|
homepage: http://github.com/Plinq/pgcrypto
|
54
60
|
licenses: []
|
55
61
|
post_install_message:
|