2015-03-17 4 views
1

Проблема при попытке создать зашифрованный столбец. OS X 10.9.5postgres 9.4, pgcrypto 0.4.1, rails 4.2.0, ruby ​​2.2.0, цитируя ожидаемую строку, получил Arel :: Nodes :: BindParam

создания общественных/частных ключей с помощью GnuPG 2.0.22:

gpg -a --export > myKey .key.pub 
    gpg -a --export-secret-key myKey > .key.prv 

Любые указатели на то, что может быть здесь происходит? У меня есть модель с полем Ssn миграции добавленной как:

add_column :users, :ssn, :binary 

В пользовательской модели

has_encrypted_column :ssn 

добавил расширение pgcrpyto для разработки баз данных

В конфигурации/инициализаторах/pgcrypto.rb

PGCrypto.keys[.public] = {path: '.key.pub'} 
    PGCrypto.keys[.private] = {path: '.key.prv',armored: true, password: 'myPassword'} 

рельсы с

User.create(username:'x',ssn:'123-45-6789') 

Получить эту ошибку, столбец Ssn, так это выглядит, как он делает правильную вещь

TypeError: wrong argument type Arel::Nodes::BindParam (expected String) 
from ... /vendor/ruby/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/quoting.rb:19:in `escape_string' 
from ... /vendor/ruby/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/quoting.rb:19:in `quote_string' 
from ... /vendor/ruby/2.2.0/gems/pgcrypto-0.4.1/lib/pgcrypto/adapter.rb:51:in `pgcrypto_encrypt_string' 

Следующая ****, где я предполагаю, что ошибка есть, но не уверен, какой метод для вызова здесь: Не удается найти много документации об Arel :: Nodes :: BindParam. Я предполагаю, что это должно установить значение «123-45-6789», а затем зашифровать его вызовом pgcrypto_encrypt_string. Я подтвердил, что ключ правильный.

 57  def pgcrypto_insert(arel) 
    58  if table = PGCrypto[arel.ast.relation.name.to_s] 
    59   arel.ast.columns.each_with_index do |column, i| 
    60   if options = table[column.name.to_sym] 
    61    key = options[:key] || PGCrypto.keys[:public] 
    62    next unless key 
    63    # Encrypt encryptable columns 
    64 *****  value = arel.ast.values.expressions[i] 
    65    arel.ast.values.expressions[i] = pgcrypto_encrypt_string(value, key) 
    66   end 
    67   end 
    68  end 
    69 end 

Любые указатели с оценками. Счастлив вилкой и делать запрос на тяну, когда выясняется.

+0

В настоящее время я работаю над атакой этой точной проблемы. Как вы догадались ниже, это действительно связано с изменениями, внесенными с Rails 4.2 и Arel 6.0. Исправление нетривиально, но я планирую представить его как PR для жемчужины pgcrypto. Я дам вам знать, когда я заработаю! – Jazz

+0

Вы можете найти вилку драгоценного камня pgcrypto, которая работает с Rails 4.2 на странице https://github.com/BlinkerGit/pgcrypto. Он также добавляет поддержку симметричного шифрования (установите 'PGCrypto.mode =: симметричный' и' PGCrypto.keys [: симметричный] = 'ваш_key'' в файле инициализатора). Я очень сильно модифицировал жемчужину, и я уверен, что не охватил все случаи краев, поэтому, пожалуйста, ** рассмотрите этот экспериментальный экспериментальный ** и сообщите мне, если вы видите какие-либо ошибки или ненормальное поведение. Благодаря! – Jazz

ответ

1

Гадания это происходит из-за Arel 6.0 в Rails 4.2.0

В рельсах 4.1.0, Арел 5,0

Arel::Nodes::BindParams < Arel::Nodes::SqlLiteral < String < Object < BasicObject 

В рельсах 4.2.0 Арел 6.0

Arel::Nodes::BindParams < Arel::Nodes::Node < Object < BasicObject 

Любые советы о том, как извлечь значение из Arel :: Nodes :: Node