summaryrefslogtreecommitdiff
path: root/lib/powerdnsx/validations/zone_validation.ex
blob: a2abc6e5ffbb40de23e6978007b146ed8622bf08 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
defmodule PowerDNSx.ZoneValidator do
  alias PowerDNSx.Models.Zone

  @valid_zone_name_reg ~r/^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$/

  def check(%Zone{} = zone) do
    verify_attr = fn({attr, value}, errors)->
                    validate_attr_value(attr, value)
                  end

    errors = Enum.reduce(zone, nil, verify_attr)
    if errors, do: {:error, errors}, else: :ok
  end

  ###
  # Private
  ###

  defp validate_attr_value(:name, zone_name) do
    case validate_zone_name(zone_name) do
      {true, true} -> nil
      {false, _} -> {:error, %{name: "#{zone_name} is invalid."}}
      {_, false} -> {:error, %{name: "#{zone_name} is invalid. Max lenght is 64."}}
      {:format_error} -> {:error, %{name: "Name MUST be a string."}}
    end
  end

  defp validate_zone_name(zone_name) when is_bitstring(zone_name) do
    {String.match?(zone_name, @valid_zone_name_reg), correct_length?(zone_name)}
  end

  defp validate_zone_name(_), do: {:format_error}

  defp correct_length?(zone_name) do
    name = zone_name |> String.split(".") |> hd
    name |> String.length <= 63
  end
end