defmodule Mix.Tasks.Wiki.Upload do use Mix.Task alias Wiki.{Repo, Accounts, Accounts.User, Content.Upload} @shortdoc "Decrypts an upload into the given file" def run(["decrypt", id, output_file]) do email = IO.gets("Email: ") |> String.trim() password = IO.gets("Password: ") |> String.trim() Mix.Task.run("app.start") user = Repo.get_by!(User, email: email) upload = Repo.get!(Upload, String.to_integer(id)) |> Repo.preload(:page) if upload.page.user_id != user.id do raise "upload owner does not match provided user" else key = Accounts.generate_content_encryption_key(user, %{"password" => password}) key = Base.decode16!(key, case: :lower) Upload.decrypt_to_file(upload, key, output_file) end end end