add special things to variable blacklist

This commit is contained in:
connor rigby 2017-11-17 09:44:33 -08:00
parent 0d20d2a5b9
commit a982c4166b
3 changed files with 35 additions and 5 deletions

View file

@ -3,10 +3,15 @@ defmodule Farmbot.CeleryScript.AST.Node.ReadPin do
use Farmbot.CeleryScript.AST.Node
allow_args [:pin_number, :label, :pin_mode]
def execute(%{pin_number: pin_num, pin_mode: mode}, _, env) do
def execute(%{pin_number: pin_num, pin_mode: mode, label: label}, _, env) do
env = mutate_env(env)
case Farmbot.Firmware.read_pin(pin_num, mode) do
:ok -> {:ok, env}
:ok ->
case Farmbot.BotState.get_pin_value(pin_num) do
{:ok, val} ->
Farmbot.CeleryScript.var(env, label, val)
{:error, reason} -> {:error, reason, env}
end
{:error, reason} -> {:error, reason, env}
end
end

View file

@ -7,7 +7,7 @@ defmodule Farmbot.CeleryScript.AST.Node.SendMessage do
def execute(%{message: m, message_type: type}, channels, env) do
env = mutate_env(env)
{:ok, env, channels} = do_reduce(channels, env, [])
bindings = fetch_bindings()
bindings = fetch_bindings(env)
case sanatize(m) do
{:ok, sanatized} ->
msg = EEx.eval_string(sanatized, bindings)
@ -88,11 +88,11 @@ defmodule Farmbot.CeleryScript.AST.Node.SendMessage do
end
end
defp fetch_bindings do
defp fetch_bindings(env) do
bot_state = Farmbot.BotState.force_state_push()
pins = Enum.map(bot_state.pins, fn({pin, %{value: value}}) -> {:"pin#{pin}", value} end)
location = Enum.map(bot_state.location_data.position, fn({axis, val}) -> {axis, val} end)
pins ++ location
env.vars ++ pins ++ location
end
defp do_reduce([%{args: %{channel_name: channel}} | rest], env, acc) do

View file

@ -37,4 +37,29 @@ defmodule Farmbot.CeleryScript do
Module.split(kind) |> List.last() |> Macro.underscore()
end
def var(env, dirty_label, val) do
case sanitize_var_name(dirty_label) do
{:ok, label} ->
new_vars = Keyword.put(env.vars, String.to_atom(label), val)
new_env = %{env | vars: new_vars}
{:ok, new_env}
{:error, reason} ->
{:error, reason, env}
end
end
defp sanitize_var_name(name) do
cond do
String.contains?(name, " ") ->
{:error, "variables may not contain special characters."}
match?(<<"__", _ :: binary>>, name) ->
{:error, "variables may not replace internal names."}
match?(<<"pin", _ :: binary>>, name) ->
{:error, "variables may not contain pattern: pin<number>."}
name in ["x", "y", "z"] ->
{:error, "variables may not be axis names."}
true -> {:ok, name}
end
end
end