class Slosilo::Adapters::SequelAdapter

Public Instance Methods

create_model() click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 14
def create_model
  model = Sequel::Model(:slosilo_keystore)
  model.unrestrict_primary_key
  model.attr_encrypted(:key, aad: :id) if secure?
  model
end
each() { |id, key| ... } click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 46
def each
  model.each do |m|
    yield m.id, Slosilo::Key.new(m.key)
  end
end
get_by_fingerprint(fp) click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 35
def get_by_fingerprint fp
  if fingerprint_in_db?
    stored = model[fingerprint: fp]
    return nil unless stored
    [Slosilo::Key.new(stored.key), stored.id]
  else
    warn "Please migrate to a new database schema using rake slosilo:migrate for efficient fingerprint lookups"
    find_by_fingerprint fp
  end
end
get_key(id) click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 29
def get_key id
  stored = model[id]
  return nil unless stored
  Slosilo::Key.new stored.key
end
migrate!() click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 63
def migrate!
  unless fingerprint_in_db?
    model.db.transaction do
      model.db.alter_table :slosilo_keystore do
        add_column :fingerprint, String
      end

      # reload the schema
      model.set_dataset model.dataset

      recalculate_fingerprints

      model.db.alter_table :slosilo_keystore do
        set_column_not_null :fingerprint
        add_unique_constraint :fingerprint
      end
    end
  end
end
model() click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 6
def model
  @model ||= create_model
end
put_key(id, value) click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 21
def put_key id, value
  fail Error::InsecureKeyStorage unless secure? || !value.private?

  attrs = { id: id, key: value.to_der }
  attrs[:fingerprint] = value.fingerprint if fingerprint_in_db?
  model.create attrs
end
recalculate_fingerprints() click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 52
def recalculate_fingerprints
  # Use a transaction to ensure that all fingerprints are updated together. If any update fails,
  # we want to rollback all updates.
  model.db.transaction do
    model.each do |m|
      m.update fingerprint: Slosilo::Key.new(m.key).fingerprint
    end
  end
end
secure?() click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 10
def secure?
  !Slosilo.encryption_key.nil?
end

Private Instance Methods

find_by_fingerprint(fp) click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 89
def find_by_fingerprint fp
  each do |id, k|
    return [k, id] if k.fingerprint == fp
  end
end
fingerprint_in_db?() click to toggle source
# File lib/slosilo/adapters/sequel_adapter.rb, line 85
def fingerprint_in_db?
  model.columns.include? :fingerprint
end