diff options
Diffstat (limited to 'lib/validator.lua')
-rwxr-xr-x | lib/validator.lua | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/lib/validator.lua b/lib/validator.lua new file mode 100755 index 0000000..951d716 --- /dev/null +++ b/lib/validator.lua @@ -0,0 +1,156 @@ +-------------------------------------------------- +-- Validation Functions for Alpine Linux' Webconf +-------------------------------------------------- + +-- setup the 'language' table +lang = {} +lang.English = 1 +lang.German = 2 +lang.French = 3 +lang.Current = lang.English + +-- setup the 'validator' tables +validator = {} +validator.msg = {} +validator.msg.err = {} + +-- setup error messages +validator.msg.err.Success = {} +validator.msg.err.Success[lang.English] = "Ok." +validator.msg.err.Success[lang.German] = "Ok." +validator.msg.err.InvalidChars = {} +validator.msg.err.InvalidChars[lang.English] = "Invalid characters!" +validator.msg.err.InvalidChars[lang.German] = "Ungültige Zeichen!" +validator.msg.err.InvalidLength = {} +validator.msg.err.InvalidLength[lang.English] = "Invalid length!" +validator.msg.err.InvalidLength[lang.German] = "Ungültige Länge!" +validator.msg.err.InvalidFormat = {} +validator.msg.err.InvalidFormat[lang.English] = "Invalid format!" +validator.msg.err.InvalidFormat[lang.German] = "Ungültiges Format!" +validator.msg.err.InvalidValue = {} +validator.msg.err.InvalidValue[lang.English] = "Invalid Value!" +validator.msg.err.InvalidValue[lang.German] = "Ungültiger Wert!" +validator.msg.err.OutOfRange = {} +validator.msg.err.OutOfRange[lang.English] = "Value out of range!" +validator.msg.err.OutOfRange[lang.German] = "Wert ausserhalb des Bereichs!" + +-- +-- This function validates an ipv4 address. +-- On success it returns 1 otherwise a negative value +-- +function validator.is_ipv4(ipv4) + local retval = false; + local nums = { "", "", "", ""}; + local iplen = string.len(ipv4); + + -- check the ipv4's length + if (iplen < 7 or iplen > 15) then + return false, validator.msg.err.InvalidLength[lang.Current] + end + + -- NC: Split the string into an array. separate with '.' (dots) + -- ^ beginning of string + -- () capture + -- \. litteral '.' The \ neutralizes the . character class. + -- %d+ one or more digits + -- $ end of string + nums = { ipv4:match ("^(%d+)\.(%d+)\.(%d+)\.(%d+)$" ) } + + -- check if all nums are filled + if ( nums[1] == nil or + nums[2] == nil or + nums[3] == nil or + nums[4] == nil) then + -- we have an empty number + return false, validator.msg.err.InvalidFormat[lang.Current] + end + + -- too big? + if (tonumber(nums[1]) > 255 or + tonumber(nums[2]) > 255 or + tonumber(nums[3]) > 255 or + tonumber(nums[4]) > 255) then + -- at least one number is too big + return false, validator.msg.err.InvalidValue[lang.Current] + end + + return true, validator.msg.err.Success[lang.Current] +end + +function validator.is_mac(mac) + + local tmpmac = string.upper(mac) + + if (string.len(tmpmac) ~= 17) then + return false, validator.msg.err.InvalidLength[lang.Current] + end + + -- check for valid characters + local step = 1; + while (step <= 17) do + if (string.sub(tmpmac, step, step) ~= ":") and + (string.sub(tmpmac, step, step) < "0" or string.sub(tmpmac, step, step) > "9") and + (string.sub(tmpmac, step, step) < "A" or string.sub(tmpmac, step, step) > "F") then + -- we have found an invalid character! + return false, validator.msg.err.InvalidChars[lang.Current] + end + step = step + 1; + end + + -- check for valid colon positions + if (string.sub(tmpmac, 3, 3) ~= ":" or + string.sub(tmpmac, 6, 6) ~= ":" or + string.sub(tmpmac, 9, 9) ~= ":" or + string.sub(tmpmac, 12, 12) ~= ":" or + string.sub(tmpmac, 15, 15) ~= ":") then + return false, validator.msg.err.InvalidFormat[lang.Current] + end + + -- check for valid non colon positions + step = 1; + while (step <= 17) do + if ((string.sub(tmpmac, step, step) == ":") and + ((step ~= 3) and (step ~= 6) and (step ~= 9) and (step ~= 12) and + (step ~= 15))) then + return false, validator.msg.err.InvalidValue[lang.Current] + end + step = step + 1; + end + + return true, validator.msg.err.Success[lang.Current] +end + +-- +-- This function checks if the given input +-- consists of number-chars between 0..9 only +-- and eventually a leading '-' +-- +function validator.is_integer(numstr) + -- ^ beginning of string + -- -? one or zero ot the char '-' + -- %d+ one or more digits + -- $ end of string + return string.find(numstr, "^-?%d+$") ~= nil +end + + +-- +-- This function checks if the given input +-- consists of number-chars between 0..9 only +-- and if it is within a given range. +-- +function validator.is_integer_in_range(numstr, min, max) + return validator.is_integer(numstr) + and numstr >= min + and numstr <= max + +end + +-- +-- This function checks if the given number is an integer +-- and wheter it is between 1 .. 65535 +-- +function validator.is_port(numstr) + return validator.is_integer_in_range(numstr, 1, 65535) +end + |