source: branches/whiterussian/openwrt/package/webif/files/usr/lib/webif/validate.awk @ 2005

Last change on this file since 2005 was 2005, checked in by nbd, 11 years ago

add more input validation

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.0 KB
Line 
1# $1 = type
2# $2 = variable name
3# $3 = field name
4# $4 = options
5# $5 = value
6BEGIN {
7        FS="|"
8        output=""
9}
10
11{
12        valid_type = 0
13        valid = 1
14        # XXX: weird hack, but it works...
15        n = split($0, param, "|")
16        value = param[5]
17        for (i = 6; i <= n; i++) value = value FS param[i]
18        verr = ""
19}
20
21$1 == "int" {
22        valid_type = 1
23        if (value !~ /^[0-9]*$/) { valid = 0; verr = "Invalid value" }
24}
25
26# FIXME: add proper netmask validation
27($1 == "ip") || ($1 == "netmask") {
28        valid_type = 1
29        if ((value != "") && (value !~ /^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$/)) valid = 0
30        else {
31                split(value, ipaddr, "\\.")
32                for (i = 1; i <= 4; i++) {
33                        if ((ipaddr[i] < 0) || (ipaddr[i] > 255)) valid = 0
34                }
35        }
36        if (valid == 0) verr = "Invalid value"
37}
38
39$1 == "wep" {
40        valid_type = 1
41        if (value !~ /^[0-9A-Fa-f]*$/) {
42                valid = 0
43                verr = "Invalid value"
44        } else if ((length(value) != 0) && (length(value) != 10) && (length(value) != 26)) {
45                valid = 0
46                verr = "Invalid key length"
47        } else if (value ~ /0$/) {
48                valid = 0
49                verr = "key must not end with '0'"
50        }
51}
52
53$1 == "hostname" {
54        valid_type = 1
55        if (value !~ /^[0-9a-zA-z\.\-]*$/) {
56                valid = 0
57                verr = "Invalid value"
58        }
59}
60
61valid_type != 1 { valid = 0 }
62
63valid == 1 {
64        n = split($4, options, " ")
65        for (i = 1; (valid == 1) && (i <= n); i++) {
66                if (options[i] == "required") {
67                        if (value == "") { valid = 0; verr = "No value entered" }
68                } else if (options[i] ~ /^min=/) {
69                        if ($1 == "int") {
70                                min = options[i]
71                                sub(/^min=/, "", min)
72                                if (value < min) { valid = 0; verr = "Value too small" }
73                        }
74                } else if (options[i] ~ /^max=/) {
75                        if ($1 == "int") {
76                                max = options[i]
77                                sub(/^max=/, "", max)
78                                if (value > max) { valid = 0; verr = "Value too large" }
79                        }
80                } else if ((options[i] == "nodots") && ($1 == "hostname")) {
81                        if (value ~ /\./) {
82                                valid = 0
83                                verr = "Invalid value"
84                        }
85                }
86        }
87}
88
89valid_type == 1 {
90        if (valid == 1) output = output $2 "=\"" value "\";\n"
91        else error = error "Error in " $3 ": " verr "<br />"
92}
93
94END {
95        print output "ERROR=\"" error "\";\n"
96}
Note: See TracBrowser for help on using the repository browser.