Skip to content

Throw on missing cipher configuration? #117

@cybrox

Description

@cybrox

First of all, thank your for maintaining cloak_ecto!

I was wondering, in terms of usability, wouldn't it make sense for the library to throw an error when no cipher is configured?
As far as I can see, the library is unusable without a suitable configuration.

My reasoning for this is, I just spent an hour attempting to figure out the following error:

** (Ecto.ChangeError) value `"test"` for `MyModel.encrypted_api_token` in `update` does not match type MyApp.Encrypted.Binary
    (ecto 3.5.3) lib/ecto/repo/schema.ex:889: Ecto.Repo.Schema.dump_field!/6
    (ecto 3.5.3) lib/ecto/repo/schema.ex:898: anonymous fn/6 in Ecto.Repo.Schema.dump_fields!/5
    (stdlib 3.12) maps.erl:232: :maps.fold_1/3
    (ecto 3.5.3) lib/ecto/repo/schema.ex:896: Ecto.Repo.Schema.dump_fields!/5
    (ecto 3.5.3) lib/ecto/repo/schema.ex:829: Ecto.Repo.Schema.dump_changes!/6
    (ecto 3.5.3) lib/ecto/repo/schema.ex:334: anonymous fn/15 in Ecto.Repo.Schema.do_update/4
    (ecto 3.5.3) lib/ecto/repo/schema.ex:177: Ecto.Repo.Schema.update!/4
    (elixir 1.11.1) lib/enum.ex:1399: Enum."-map/2-lists^map/1-0-"/2

However, I searched in all the wrong places. I double checked all my database types, checked if my ecto adapter (myxql) supported the correct data type, updated ecto, etc. etc... After a lot of digging, I ended up adding an inspect to lib/cloak_ecto/type.ex in dump/1's error clause and got this helpful message %Cloak.InvalidConfig{message: "could not encrypt due to missing configuration"}}

As it turns out, I had put the following in my vault module:

  @impl GenServer
  def init(config) do
    config =
      Keyword.put(config, :cyphers,
        default: {Cloak.Ciphers.AES.GCM, tag: "AES.GCM.V1", key: decode_env!("CLOAK_KEY")}
      )

    {:ok, config}
  end

After changing :cyphers to :ciphers, as it is spelled in the docs, everything worked fine 🤦

So I was wondering, wouldn't it make sense to throw an error when no cipher configuration is provided at all?

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions