relishable 0.9 → 0.10
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.
- data/lib/relish.rb +37 -37
- data/lib/relish/dynamo_helper.rb +11 -11
- data/lib/relish/encryption_helper.rb +23 -38
- metadata +1 -1
    
        data/lib/relish.rb
    CHANGED
    
    | @@ -9,72 +9,72 @@ class Relish | |
| 9 9 | 
             
              end
         | 
| 10 10 |  | 
| 11 11 | 
             
              def copy(id, version, data)
         | 
| 12 | 
            -
                 | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 12 | 
            +
                Release.new.tap do |release|
         | 
| 13 | 
            +
                  release.item = {}
         | 
| 14 | 
            +
                  release.id = id
         | 
| 15 | 
            +
                  release.version = version
         | 
| 16 | 
            +
                  data.each do |k, v|
         | 
| 17 | 
            +
                    release.send("#{k}=", v.to_s) unless v.nil?
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                  @db.put(release.item)
         | 
| 18 20 | 
             
                end
         | 
| 19 | 
            -
                @db.put(release.item)
         | 
| 20 | 
            -
                release
         | 
| 21 21 | 
             
              end
         | 
| 22 22 |  | 
| 23 23 | 
             
              def create(id, data)
         | 
| 24 24 | 
             
                item = @db.query_current_version(id)
         | 
| 25 | 
            -
                 | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 25 | 
            +
                Release.new.tap do |release|
         | 
| 26 | 
            +
                  if item.nil?
         | 
| 27 | 
            +
                    release.item = {}
         | 
| 28 | 
            +
                    release.id = id
         | 
| 29 | 
            +
                    release.version = "1"
         | 
| 30 | 
            +
                  else
         | 
| 31 | 
            +
                    release.item = item
         | 
| 32 | 
            +
                    release.version = (release.version.to_i + 1).to_s
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                  data.each do |k, v|
         | 
| 35 | 
            +
                    release.send("#{k}=", v.to_s) unless v.nil?
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                  @db.put_current_version(release.item)
         | 
| 36 38 | 
             
                end
         | 
| 37 | 
            -
                @db.put_current_version(release.item)
         | 
| 38 | 
            -
                release
         | 
| 39 39 | 
             
              end
         | 
| 40 40 |  | 
| 41 41 | 
             
              def current(id, *attrs)
         | 
| 42 42 | 
             
                item = @db.query_current_version(id, *attrs)
         | 
| 43 43 | 
             
                unless item.nil?
         | 
| 44 | 
            -
                   | 
| 45 | 
            -
             | 
| 46 | 
            -
                   | 
| 44 | 
            +
                  Release.new.tap do |release|
         | 
| 45 | 
            +
                    release.item = item
         | 
| 46 | 
            +
                  end
         | 
| 47 47 | 
             
                end
         | 
| 48 48 | 
             
              end
         | 
| 49 49 |  | 
| 50 50 | 
             
              def read(id, version, *attrs)
         | 
| 51 51 | 
             
                item = @db.get_version(id, version, *attrs)
         | 
| 52 52 | 
             
                unless item.nil?
         | 
| 53 | 
            -
                   | 
| 54 | 
            -
             | 
| 55 | 
            -
                   | 
| 53 | 
            +
                  Release.new.tap do |release|
         | 
| 54 | 
            +
                    release.item = item
         | 
| 55 | 
            +
                  end
         | 
| 56 56 | 
             
                end
         | 
| 57 57 | 
             
              end
         | 
| 58 58 |  | 
| 59 59 | 
             
              def dump(id, consistent=nil, limit=nil)
         | 
| 60 | 
            -
                items = @db.query(id, limit)
         | 
| 60 | 
            +
                items = @db.query(id, consistent, limit)
         | 
| 61 61 | 
             
                items.map do |item|
         | 
| 62 | 
            -
                   | 
| 63 | 
            -
             | 
| 64 | 
            -
                   | 
| 62 | 
            +
                  Release.new.tap do |release|
         | 
| 63 | 
            +
                    release.item = item
         | 
| 64 | 
            +
                  end
         | 
| 65 65 | 
             
                end
         | 
| 66 66 | 
             
              end
         | 
| 67 67 |  | 
| 68 68 | 
             
              def update(id, version, data)
         | 
| 69 69 | 
             
                item = @db.get_version(id, version)
         | 
| 70 70 | 
             
                unless item.nil?
         | 
| 71 | 
            -
                   | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 71 | 
            +
                  Release.new.tap do |release|
         | 
| 72 | 
            +
                    release.item = item
         | 
| 73 | 
            +
                    data.each do |k, v|
         | 
| 74 | 
            +
                      release.send("#{k}=", v.to_s) unless v.nil?
         | 
| 75 | 
            +
                    end
         | 
| 76 | 
            +
                    @db.put_version(id, version, release.item)
         | 
| 75 77 | 
             
                  end
         | 
| 76 | 
            -
                  @db.put_version(id, version, release.item)
         | 
| 77 | 
            -
                  release
         | 
| 78 78 | 
             
                end
         | 
| 79 79 | 
             
              end
         | 
| 80 80 | 
             
            end
         | 
    
        data/lib/relish/dynamo_helper.rb
    CHANGED
    
    | @@ -14,29 +14,27 @@ class Relish | |
| 14 14 | 
             
                end
         | 
| 15 15 |  | 
| 16 16 | 
             
                def query_current_version(id, *attrs)
         | 
| 17 | 
            -
                   | 
| 18 | 
            -
                  response = db.query(@table_name, {:S => id}, opts)
         | 
| 17 | 
            +
                  response = db.query(@table_name, {:S => id}, attrs_to_get(attrs).merge(:ConsistentRead => true, :Limit => 1, :ScanIndexForward => false))
         | 
| 19 18 | 
             
                  if response.body['Count'] == 1
         | 
| 20 19 | 
             
                    response.body['Items'].first
         | 
| 21 20 | 
             
                  end
         | 
| 22 21 | 
             
                end
         | 
| 23 22 |  | 
| 24 23 | 
             
                def put_current_version(item)
         | 
| 25 | 
            -
                   | 
| 24 | 
            +
                  db.put_item(@table_name, item, {:Expected => {:id => {:Exists => false}, :version => {:Exists => false}}})
         | 
| 26 25 | 
             
                end
         | 
| 27 26 |  | 
| 28 27 | 
             
                def get_version(id, version, *attrs)
         | 
| 29 | 
            -
                   | 
| 30 | 
            -
                  response = db.get_item(@table_name, {:HashKeyElement => {:S => id}, :RangeKeyElement => {:N => version}}, opts)
         | 
| 28 | 
            +
                  response = db.get_item(@table_name, {:HashKeyElement => {:S => id}, :RangeKeyElement => {:N => version}}, attrs_to_get(attrs).merge(:ConsistentRead => true))
         | 
| 31 29 | 
             
                  response.body['Item']
         | 
| 32 30 | 
             
                end
         | 
| 33 31 |  | 
| 34 32 | 
             
                def put_version(id, version, item)
         | 
| 35 | 
            -
                   | 
| 33 | 
            +
                  db.put_item(@table_name, item, {:Expected => {:id => {:Value => {:S => id}}, :version => {:Value => {:N => version}}}})
         | 
| 36 34 | 
             
                end
         | 
| 37 35 |  | 
| 38 36 | 
             
                def put(item)
         | 
| 39 | 
            -
                   | 
| 37 | 
            +
                  db.put_item(@table_name, item)
         | 
| 40 38 | 
             
                end
         | 
| 41 39 |  | 
| 42 40 | 
             
                def query(id, consistent, limit)
         | 
| @@ -44,12 +42,14 @@ class Relish | |
| 44 42 | 
             
                  response.body['Items']
         | 
| 45 43 | 
             
                end
         | 
| 46 44 |  | 
| 45 | 
            +
                def to_s
         | 
| 46 | 
            +
                  "#<Relish::DynamoHelper>"
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 47 49 | 
             
                private
         | 
| 48 50 |  | 
| 49 | 
            -
                def  | 
| 50 | 
            -
                  attrs  | 
| 51 | 
            -
                  opts[:AttributesToGet] = attrs unless attrs.empty?
         | 
| 52 | 
            -
                  opts
         | 
| 51 | 
            +
                def attrs_to_get(attrs)
         | 
| 52 | 
            +
                  attrs.empty? ? {} : {:AttributesToGet => attrs}
         | 
| 53 53 | 
             
                end
         | 
| 54 54 | 
             
              end
         | 
| 55 55 | 
             
            end
         | 
| @@ -12,20 +12,30 @@ class Relish | |
| 12 12 | 
             
                  @secrets = secrets
         | 
| 13 13 | 
             
                end
         | 
| 14 14 |  | 
| 15 | 
            -
                def  | 
| 16 | 
            -
                   | 
| 15 | 
            +
                def encrypt(key, value)
         | 
| 16 | 
            +
                  Fernet.generate(hmac_secrets.first) do |gen|
         | 
| 17 | 
            +
                    gen.data = {key => value}
         | 
| 18 | 
            +
                  end
         | 
| 17 19 | 
             
                end
         | 
| 18 20 |  | 
| 19 | 
            -
                def  | 
| 20 | 
            -
                   | 
| 21 | 
            +
                def decrypt(key, token)
         | 
| 22 | 
            +
                  hmac_secrets.each do |secret|
         | 
| 23 | 
            +
                    if verifier = verifier(secret, token)
         | 
| 24 | 
            +
                      return verifier.data[key] if verifier.valid?
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                  raise RelishDecryptionFailed
         | 
| 21 28 | 
             
                end
         | 
| 22 29 |  | 
| 23 | 
            -
                def  | 
| 24 | 
            -
                  if  | 
| 25 | 
            -
                    return  | 
| 30 | 
            +
                def upgrade(key, token)
         | 
| 31 | 
            +
                  if verifier = verifier(hmac_secrets.first, token)
         | 
| 32 | 
            +
                    return encrypt(key, verifier.data[key]) if verifier.valid?
         | 
| 26 33 | 
             
                  end
         | 
| 27 | 
            -
                   | 
| 28 | 
            -
             | 
| 34 | 
            +
                  raise RelishDecryptionFailed
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                def to_s
         | 
| 38 | 
            +
                  "#<Relish::EncryptionHelper>"
         | 
| 29 39 | 
             
                end
         | 
| 30 40 |  | 
| 31 41 | 
             
                protected
         | 
| @@ -36,36 +46,11 @@ class Relish | |
| 36 46 | 
             
                  end
         | 
| 37 47 | 
             
                end
         | 
| 38 48 |  | 
| 39 | 
            -
                def  | 
| 40 | 
            -
                   | 
| 41 | 
            -
                     | 
| 42 | 
            -
                    if success
         | 
| 43 | 
            -
                      return env, i
         | 
| 44 | 
            -
                    end
         | 
| 49 | 
            +
                def verifier(secret, token)
         | 
| 50 | 
            +
                  Fernet.verifier(secret, token).tap do |verifier|
         | 
| 51 | 
            +
                    verifier.enforce_ttl = false
         | 
| 45 52 | 
             
                  end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                end
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                def try_decrypt_key(secret, encrypted_token, hash_key)
         | 
| 50 | 
            -
                  verifier = Fernet.verifier(secret, encrypted_token)
         | 
| 51 | 
            -
                  verifier.enforce_ttl = false
         | 
| 52 | 
            -
                  unless verifier.valid?
         | 
| 53 | 
            -
                    return false, nil
         | 
| 54 | 
            -
                  end
         | 
| 55 | 
            -
                  [true, verifier.data[hash_key]]
         | 
| 56 | 
            -
                rescue OpenSSL::Cipher::CipherError => e
         | 
| 57 | 
            -
                  return false, nil
         | 
| 58 | 
            -
                end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                def encrypt_key_with_secret(hash_key, value, secret)
         | 
| 61 | 
            -
                  Fernet.generate(secret) do |gen|
         | 
| 62 | 
            -
                    gen.data = {hash_key => value}
         | 
| 63 | 
            -
                  end
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                def inspect
         | 
| 67 | 
            -
                  "#<Relish::EncryptionHelper @static_secret=[masked] @secrets=[masked]>"
         | 
| 53 | 
            +
                rescue OpenSSL::Cipher::CipherError
         | 
| 68 54 | 
             
                end
         | 
| 69 | 
            -
                alias to_s inspect
         | 
| 70 55 | 
             
              end
         | 
| 71 56 | 
             
            end
         |