More auth/ownership stuff
This commit is contained in:
parent
ecd41bfd95
commit
144ea2daba
|
@ -33,48 +33,56 @@ defmodule Farmbot.Bootstrap.Authorization do
|
||||||
@doc "Authorizes with the farmbot api."
|
@doc "Authorizes with the farmbot api."
|
||||||
def authorize(email, pw_or_secret, server) do
|
def authorize(email, pw_or_secret, server) do
|
||||||
case get_config_value(:bool, "settings", "first_boot") do
|
case get_config_value(:bool, "settings", "first_boot") do
|
||||||
true ->
|
false -> authorize_with_secret(email, pw_or_secret, server)
|
||||||
with {:ok, {:RSAPublicKey, _, _} = rsa_key} <- fetch_rsa_key(server),
|
true -> authorize_with_password(email, pw_or_secret, server)
|
||||||
{:ok, payload} <- build_payload(email, pw_or_secret, rsa_key),
|
end
|
||||||
{:ok, resp} <- request_token(server, payload),
|
end
|
||||||
{:ok, body} <- Poison.decode(resp),
|
|
||||||
{:ok, map} <- Map.fetch(body, "token") do
|
def authorize_with_secret(email, secret, server) do
|
||||||
update_config_value(:bool, "settings", "first_boot", false)
|
with {:ok, payload} <- build_payload(secret),
|
||||||
Leds.led_status_ok()
|
{:ok, resp} <- request_token(server, payload),
|
||||||
Map.fetch(map, "encoded")
|
{:ok, body} <- Poison.decode(resp),
|
||||||
else
|
{:ok, map} <- Map.fetch(body, "token") do
|
||||||
:error -> {:error, "unknown error."}
|
Leds.led_status_ok()
|
||||||
{:error, :invalid, _} -> authorize(email, pw_or_secret, server)
|
last_reset_reason_file = Path.join(@data_path, "last_shutdown_reason")
|
||||||
# If we got maintance mode, a 5xx error etc,
|
File.rm(last_reset_reason_file)
|
||||||
# just sleep for a few seconds
|
Map.fetch(map, "encoded")
|
||||||
# and try again.
|
else
|
||||||
{:ok, {{_, code, _}, _, _}} ->
|
:error -> {:error, "unknown error."}
|
||||||
Logger.error 1, "Failed to authorize due to server error: #{code}"
|
{:error, :invalid, _} -> authorize(email, secret, server)
|
||||||
Process.sleep(5000)
|
# If we got maintance mode, a 5xx error etc,
|
||||||
authorize(email, pw_or_secret, server)
|
# just sleep for a few seconds
|
||||||
err -> err
|
# and try again.
|
||||||
end
|
{:ok, {{_, code, _}, _, _}} ->
|
||||||
false ->
|
Logger.error 1, "Failed to authorize due to server error: #{code}"
|
||||||
with {:ok, payload} <- build_payload(pw_or_secret),
|
Process.sleep(5000)
|
||||||
{:ok, resp} <- request_token(server, payload),
|
authorize(email, secret, server)
|
||||||
{:ok, body} <- Poison.decode(resp),
|
err -> err
|
||||||
{:ok, map} <- Map.fetch(body, "token") do
|
end
|
||||||
Leds.led_status_ok()
|
end
|
||||||
last_reset_reason_file = Path.join(@data_path, "last_shutdown_reason")
|
|
||||||
File.rm(last_reset_reason_file)
|
def authorize_with_password(email, password, server) do
|
||||||
Map.fetch(map, "encoded")
|
with {:ok, {:RSAPublicKey, _, _} = rsa_key} <- fetch_rsa_key(server),
|
||||||
else
|
{:ok, payload} <- build_payload(email, password, rsa_key),
|
||||||
:error -> {:error, "unknown error."}
|
{:ok, resp} <- request_token(server, payload),
|
||||||
{:error, :invalid, _} -> authorize(email, pw_or_secret, server)
|
{:ok, body} <- Poison.decode(resp),
|
||||||
# If we got maintance mode, a 5xx error etc,
|
{:ok, map} <- Map.fetch(body, "token") do
|
||||||
# just sleep for a few seconds
|
update_config_value(:bool, "settings", "first_boot", false)
|
||||||
# and try again.
|
last_reset_reason_file = Path.join(@data_path, "last_shutdown_reason")
|
||||||
{:ok, {{_, code, _}, _, _}} ->
|
File.rm(last_reset_reason_file)
|
||||||
Logger.error 1, "Failed to authorize due to server error: #{code}"
|
Leds.led_status_ok()
|
||||||
Process.sleep(5000)
|
Map.fetch(map, "encoded")
|
||||||
authorize(email, pw_or_secret, server)
|
else
|
||||||
err -> err
|
:error -> {:error, "unknown error."}
|
||||||
end
|
{: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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -86,7 +94,7 @@ defmodule Farmbot.Bootstrap.Authorization do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp build_payload(email, password, rsa_key) do
|
def build_payload(email, password, rsa_key) do
|
||||||
secret =
|
secret =
|
||||||
%{email: email, password: password, id: UUID.uuid1(), version: 1}
|
%{email: email, password: password, id: UUID.uuid1(), version: 1}
|
||||||
|> Poison.encode!()
|
|> Poison.encode!()
|
||||||
|
|
|
@ -7,7 +7,8 @@ defmodule Farmbot.CeleryScript.AST.Node.ChangeOwnership do
|
||||||
|
|
||||||
def execute(_, pairs, env) do
|
def execute(_, pairs, env) do
|
||||||
env = mutate_env(env)
|
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"]
|
email = pair_map["email"]
|
||||||
secret = pair_map["secret"]
|
secret = pair_map["secret"]
|
||||||
server = pair_map["server"]
|
server = pair_map["server"]
|
||||||
|
@ -39,7 +40,7 @@ defmodule Farmbot.CeleryScript.AST.Node.ChangeOwnership do
|
||||||
Farmbot.BotState.unregister_farmware(fw)
|
Farmbot.BotState.unregister_farmware(fw)
|
||||||
Farmbot.Farmware.Installer.uninstall(fw)
|
Farmbot.Farmware.Installer.uninstall(fw)
|
||||||
end
|
end
|
||||||
Farmbot.System.reboot()
|
Farmbot.System.reboot("Change ownership")
|
||||||
{:ok, env}
|
{:ok, env}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue