More auth/ownership stuff

pull/446/head
Connor Rigby 2018-02-02 13:32:10 -08:00 committed by Connor Rigby
parent ecd41bfd95
commit 144ea2daba
2 changed files with 54 additions and 45 deletions

View File

@ -33,48 +33,56 @@ defmodule Farmbot.Bootstrap.Authorization do
@doc "Authorizes with the farmbot api."
def authorize(email, pw_or_secret, server) do
case get_config_value(:bool, "settings", "first_boot") do
true ->
with {:ok, {:RSAPublicKey, _, _} = rsa_key} <- fetch_rsa_key(server),
{:ok, payload} <- build_payload(email, pw_or_secret, rsa_key),
{:ok, resp} <- request_token(server, payload),
{:ok, body} <- Poison.decode(resp),
{:ok, map} <- Map.fetch(body, "token") do
update_config_value(:bool, "settings", "first_boot", false)
Leds.led_status_ok()
Map.fetch(map, "encoded")
else
:error -> {:error, "unknown error."}
{:error, :invalid, _} -> authorize(email, pw_or_secret, server)
# If we got maintance mode, a 5xx error etc,
# just sleep for a few seconds
# and try again.
{:ok, {{_, code, _}, _, _}} ->
Logger.error 1, "Failed to authorize due to server error: #{code}"
Process.sleep(5000)
authorize(email, pw_or_secret, server)
err -> err
end
false ->
with {:ok, payload} <- build_payload(pw_or_secret),
{:ok, resp} <- request_token(server, payload),
{:ok, body} <- Poison.decode(resp),
{:ok, map} <- Map.fetch(body, "token") do
Leds.led_status_ok()
last_reset_reason_file = Path.join(@data_path, "last_shutdown_reason")
File.rm(last_reset_reason_file)
Map.fetch(map, "encoded")
else
:error -> {:error, "unknown error."}
{:error, :invalid, _} -> authorize(email, pw_or_secret, server)
# If we got maintance mode, a 5xx error etc,
# just sleep for a few seconds
# and try again.
{:ok, {{_, code, _}, _, _}} ->
Logger.error 1, "Failed to authorize due to server error: #{code}"
Process.sleep(5000)
authorize(email, pw_or_secret, server)
err -> err
end
false -> authorize_with_secret(email, pw_or_secret, server)
true -> authorize_with_password(email, pw_or_secret, server)
end
end
def authorize_with_secret(email, secret, server) do
with {:ok, payload} <- build_payload(secret),
{:ok, resp} <- request_token(server, payload),
{:ok, body} <- Poison.decode(resp),
{:ok, map} <- Map.fetch(body, "token") do
Leds.led_status_ok()
last_reset_reason_file = Path.join(@data_path, "last_shutdown_reason")
File.rm(last_reset_reason_file)
Map.fetch(map, "encoded")
else
:error -> {:error, "unknown error."}
{:error, :invalid, _} -> authorize(email, secret, server)
# If we got maintance mode, a 5xx error etc,
# just sleep for a few seconds
# and try again.
{:ok, {{_, code, _}, _, _}} ->
Logger.error 1, "Failed to authorize due to server error: #{code}"
Process.sleep(5000)
authorize(email, secret, server)
err -> err
end
end
def authorize_with_password(email, password, server) do
with {:ok, {:RSAPublicKey, _, _} = rsa_key} <- fetch_rsa_key(server),
{:ok, payload} <- build_payload(email, password, rsa_key),
{:ok, resp} <- request_token(server, payload),
{:ok, body} <- Poison.decode(resp),
{:ok, map} <- Map.fetch(body, "token") do
update_config_value(:bool, "settings", "first_boot", false)
last_reset_reason_file = Path.join(@data_path, "last_shutdown_reason")
File.rm(last_reset_reason_file)
Leds.led_status_ok()
Map.fetch(map, "encoded")
else
:error -> {:error, "unknown error."}
{:error, :invalid, _} -> authorize(email, password, server)
# If we got maintance mode, a 5xx error etc,
# just sleep for a few seconds
# and try again.
{:ok, {{_, code, _}, _, _}} ->
Logger.error 1, "Failed to authorize due to server error: #{code}"
Process.sleep(5000)
authorize(email, password, server)
err -> err
end
end
@ -86,7 +94,7 @@ defmodule Farmbot.Bootstrap.Authorization do
end
end
defp build_payload(email, password, rsa_key) do
def build_payload(email, password, rsa_key) do
secret =
%{email: email, password: password, id: UUID.uuid1(), version: 1}
|> Poison.encode!()

View File

@ -7,7 +7,8 @@ defmodule Farmbot.CeleryScript.AST.Node.ChangeOwnership do
def execute(_, pairs, env) do
env = mutate_env(env)
pair_map = Map.new(pairs, fn(%{args: %{label: label, value: value}}) -> {label, value} end)
pair_map = Map.new(pairs,
fn(%{args: %{label: label, value: value}}) -> {label, value} end)
email = pair_map["email"]
secret = pair_map["secret"]
server = pair_map["server"]
@ -39,7 +40,7 @@ defmodule Farmbot.CeleryScript.AST.Node.ChangeOwnership do
Farmbot.BotState.unregister_farmware(fw)
Farmbot.Farmware.Installer.uninstall(fw)
end
Farmbot.System.reboot()
Farmbot.System.reboot("Change ownership")
{:ok, env}
end