Rework input validation to more closely match what we require in the UI

This commit is contained in:
Rob Crittenden
2007-12-07 17:07:03 -05:00
parent 5e4a162954
commit 00489597d8
5 changed files with 102 additions and 77 deletions

View File

@@ -62,28 +62,28 @@ def main():
if (len(args) != 2): if (len(args) != 2):
while (cont != True): while (cont != True):
cn = raw_input("Group name: ") cn = raw_input("Group name: ")
if (ipavalidate.plain(cn, notEmpty=True)): if (ipavalidate.String(cn, notEmpty=True)):
print "Field is required and must be letters or '." print "Please enter a value"
else: else:
cont = True cont = True
else: else:
cn = args[1] cn = args[1]
if (ipavalidate.plain(cn, notEmpty=True)): if (ipavalidate.ipastsring(cn, notEmpty=True)):
print "Group name is required and must be letters or '." print "Please enter a value"
return 1 return 1
cont = False cont = False
if not options.desc: if not options.desc:
while (cont != True): while (cont != True):
desc = raw_input("Description: ") desc = raw_input("Description: ")
if (ipavalidate.plain(desc, notEmpty=True)): if (ipavalidate.String(desc, notEmpty=True)):
print "Field is required and must be letters or '." print "Please enter a value"
else: else:
cont = True cont = True
else: else:
desc = options.desc desc = options.desc
if (ipavalidate.plain(desc, notEmpty=True)): if (ipavalidate.String(desc, notEmpty=True)):
print "First name is required and must be letters or '." print "Please enter a value"
return 1 return 1
if options.gid: if options.gid:

View File

@@ -92,42 +92,42 @@ def main():
if not options.gn: if not options.gn:
while (cont != True): while (cont != True):
givenname = raw_input("First name: ") givenname = raw_input("First name: ")
if (ipavalidate.plain(givenname, notEmpty=True)): if (ipavalidate.String(givenname, notEmpty=True)):
print "Field is required and must be letters or '" print "Please enter a value"
else: else:
cont = True cont = True
else: else:
givenname = options.gn givenname = options.gn
if (ipavalidate.plain(givenname, notEmpty=True)): if (ipavalidate.String(givenname, notEmpty=True)):
print "First name is required and must be letters or '" print "Please enter a value"
return 1 return 1
cont = False cont = False
if not options.sn: if not options.sn:
while (cont != True): while (cont != True):
lastname = raw_input("Last name: ") lastname = raw_input("Last name: ")
if (ipavalidate.plain(lastname, notEmpty=True)): if (ipavalidate.String(lastname, notEmpty=True)):
print "Field is required and must be letters or '" print "Please enter a value"
else: else:
cont = True cont = True
else: else:
lastname = options.sn lastname = options.sn
if (ipavalidate.plain(lastname, notEmpty=True)): if (ipavalidate.String(lastname, notEmpty=True)):
print "Last name is required and must be letters or '" print "Please enter a value"
return 1 return 1
cont = False cont = False
if (len(args) != 2): if (len(args) != 2):
while (cont != True): while (cont != True):
username = raw_input("Login name: ") username = raw_input("Login name: ")
if (ipavalidate.plain(username, notEmpty=True)): if (ipavalidate.Plain(username, notEmpty=True, allowSpaces=False)):
print "Field is required and must be letters or '" print "Please enter a value"
else: else:
cont = True cont = True
else: else:
username = args[1] username = args[1]
if (ipavalidate.plain(username, notEmpty=True)): if (ipavalidate.Plain(username, notEmpty=True, allowSpaces=False)):
print "Username is required and must be letters or '" print "Username is required and may only include letters and numbers"
return 1 return 1
if not options.password: if not options.password:
@@ -147,7 +147,7 @@ def main():
if options.mail: if options.mail:
mail = options.mail mail = options.mail
if (ipavalidate.email(mail)): if (ipavalidate.Email(mail)):
print "The email provided seem not a valid email." print "The email provided seem not a valid email."
return 1 return 1
@@ -158,8 +158,8 @@ def main():
if not options.gecos: if not options.gecos:
while (cont != True): while (cont != True):
gecos = raw_input("gecos []: ") gecos = raw_input("gecos []: ")
if (ipavalidate.plain(gecos, notEmpty=False)): if (ipavalidate.String(gecos, notEmpty=False)):
print "Must be letters, numbers, spaces or '" print "Please enter a value"
else: else:
cont = True cont = True
cont = False cont = False
@@ -168,8 +168,8 @@ def main():
directory = raw_input("home directory [/home/"+username+"]: ") directory = raw_input("home directory [/home/"+username+"]: ")
if directory == "": if directory == "":
directory = "/home/"+username directory = "/home/"+username
if (ipavalidate.path(directory, notEmpty=False)): if (ipavalidate.Path(directory, notEmpty=False)):
print "Must be letters, numbers, spaces or '" print "Please enter a value"
else: else:
cont = True cont = True
cont = False cont = False

View File

@@ -124,8 +124,8 @@ def main():
if not options.gn: if not options.gn:
while (cont != True): while (cont != True):
givenname = raw_input("First name: [%s] " % user.getValue('givenname')) givenname = raw_input("First name: [%s] " % user.getValue('givenname'))
if (ipavalidate.plain(givenname, notEmpty=False)): if (ipavalidate.String(givenname, notEmpty=False)):
print "Must be letters or '" print "Please enter a value"
else: else:
cont = True cont = True
if len(givenname) < 1: if len(givenname) < 1:
@@ -133,16 +133,16 @@ def main():
cont = True cont = True
else: else:
givenname = options.gn givenname = options.gn
if (ipavalidate.plain(givenname, notEmpty=True)): if (ipavalidate.String(givenname, notEmpty=True)):
print "First name must be letters or '" print "Please enter a value"
return 1 return 1
cont = False cont = False
if not options.sn: if not options.sn:
while (cont != True): while (cont != True):
lastname = raw_input(" Last name: [%s] " % user.getValue('sn')) lastname = raw_input(" Last name: [%s] " % user.getValue('sn'))
if (ipavalidate.plain(lastname, notEmpty=False)): if (ipavalidate.String(lastname, notEmpty=False)):
print "Must be letters or '" print "Please enter a value"
else: else:
cont = True cont = True
if len(lastname) < 1: if len(lastname) < 1:
@@ -150,21 +150,21 @@ def main():
cont = True cont = True
else: else:
lastname = options.sn lastname = options.sn
if (ipavalidate.plain(lastname, notEmpty=True)): if (ipavalidate.String(lastname, notEmpty=True)):
print "Last name must be letters or '" print "Please enter a value"
return 1 return 1
cont = False cont = False
if not options.mail: if not options.mail:
while (cont != True): while (cont != True):
mail = raw_input("E-mail addr: [%s]" % user.getValue('mail')) mail = raw_input("E-mail addr: [%s]" % user.getValue('mail'))
if (ipavalidate.email(mail, notEmpty=False)): if (ipavalidate.Email(mail, notEmpty=False)):
print "Must include a user and domain name" print "E-mail must include a user and domain name"
else: else:
cont = True cont = True
else: else:
mail = options.mail mail = options.mail
if (ipavalidate.email(mail)): if (ipavalidate.Email(mail)):
print "E-mail must include a user and domain name" print "E-mail must include a user and domain name"
return 1 return 1
@@ -174,8 +174,8 @@ def main():
if not options.gecos: if not options.gecos:
while (cont != True): while (cont != True):
gecos = raw_input("gecos: [%s] " % user.getValue('gecos')) gecos = raw_input("gecos: [%s] " % user.getValue('gecos'))
if (ipavalidate.plain(gecos, notEmpty=False)): if (ipavalidate.String(gecos, notEmpty=False)):
print "Must be letters, numbers, spaces or '" print "Please enter a value"
else: else:
cont = True cont = True
@@ -183,8 +183,8 @@ def main():
if not options.directory: if not options.directory:
while (cont != True): while (cont != True):
directory = raw_input("home directory: [%s] " % user.getValue('homeDirectory')) directory = raw_input("home directory: [%s] " % user.getValue('homeDirectory'))
if (ipavalidate.path(gecos, notEmpty=False)): if (ipavalidate.Path(gecos, notEmpty=False)):
print "Must be letters, numbers, spaces or '" print "Valid path is required"
else: else:
cont = True cont = True
cont = False cont = False

View File

@@ -19,7 +19,7 @@
import re import re
def email(mail, notEmpty=True): def Email(mail, notEmpty=True):
"""Do some basic validation of an e-mail address. """Do some basic validation of an e-mail address.
Return 0 if ok Return 0 if ok
Return 1 if not Return 1 if not
@@ -49,7 +49,7 @@ def email(mail, notEmpty=True):
return 0 return 0
def plain(text, notEmpty=False): def Plain(text, notEmpty=False, allowSpaces=True):
"""Do some basic validation of a plain text field """Do some basic validation of a plain text field
Return 0 if ok Return 0 if ok
Return 1 if not Return 1 if not
@@ -57,23 +57,33 @@ def plain(text, notEmpty=False):
If notEmpty is True the this will return an error if the field If notEmpty is True the this will return an error if the field
is "" or None. is "" or None.
""" """
textRE = re.compile(r"^[a-zA-Z_\-0-9\'\ ]*$") if (text is None) or (not text.strip()):
if not text and notEmpty is True:
return 1
if text is None:
if notEmpty is True: if notEmpty is True:
return 1 return 1
else: else:
return 0 return 0
if allowSpaces:
textRE = re.compile(r"^[a-zA-Z_\-0-9\'\ ]*$")
else:
textRE = re.compile(r"^[a-zA-Z_\-0-9\']*$")
if not textRE.search(text): if not textRE.search(text):
return 1 return 1
return 0 return 0
def path(text, notEmpty=False): def String(text, notEmpty=False):
"""A string type. This is much looser in what it allows than plain"""
if text is None or not text.strip():
if notEmpty is True:
return 1
else:
return 0
return 0
def Path(text, notEmpty=False):
"""Do some basic validation of a path """Do some basic validation of a path
Return 0 if ok Return 0 if ok
Return 1 if not Return 1 if not

View File

@@ -31,39 +31,54 @@ class TestValidate(unittest.TestCase):
def tearDown(self): def tearDown(self):
pass pass
def test_validemail(self): def test_validEmail(self):
self.assertEqual(0, ipavalidate.email("test@freeipa.org")) self.assertEqual(0, ipavalidate.Email("test@freeipa.org"))
self.assertEqual(0, ipavalidate.email("", notEmpty=False)) self.assertEqual(0, ipavalidate.Email("", notEmpty=False))
def test_invalidemail(self): def test_invalidEmail(self):
self.assertEqual(1, ipavalidate.email("test")) self.assertEqual(1, ipavalidate.Email("test"))
self.assertEqual(1, ipavalidate.email("test@freeipa")) self.assertEqual(1, ipavalidate.Email("test@freeipa"))
self.assertEqual(1, ipavalidate.email("test@.com")) self.assertEqual(1, ipavalidate.Email("test@.com"))
self.assertEqual(1, ipavalidate.email("")) self.assertEqual(1, ipavalidate.Email(""))
self.assertEqual(1, ipavalidate.email(None)) self.assertEqual(1, ipavalidate.Email(None))
def test_validplain(self): def test_validPlain(self):
self.assertEqual(0, ipavalidate.plain("Joe User")) self.assertEqual(0, ipavalidate.Plain("Joe User"))
self.assertEqual(0, ipavalidate.plain("Joe O'Malley")) self.assertEqual(0, ipavalidate.Plain("Joe O'Malley"))
self.assertEqual(0, ipavalidate.plain("", notEmpty=False)) self.assertEqual(0, ipavalidate.Plain("", notEmpty=False))
self.assertEqual(0, ipavalidate.plain(None, notEmpty=False)) self.assertEqual(0, ipavalidate.Plain(None, notEmpty=False))
self.assertEqual(0, ipavalidate.Plain("JoeUser", allowSpaces=False))
self.assertEqual(0, ipavalidate.Plain("JoeUser", allowSpaces=True))
def test_invalidplain(self): def test_invalidPlain(self):
self.assertEqual(1, ipavalidate.plain("Joe (User)")) self.assertEqual(1, ipavalidate.Plain("Joe (User)"))
self.assertEqual(1, ipavalidate.plain("", notEmpty=True)) self.assertEqual(1, ipavalidate.Plain("Joe C. User"))
self.assertEqual(1, ipavalidate.plain(None, notEmpty=True)) self.assertEqual(1, ipavalidate.Plain("", notEmpty=True))
self.assertEqual(1, ipavalidate.Plain(None, notEmpty=True))
self.assertEqual(1, ipavalidate.Plain("Joe User", allowSpaces=False))
def test_validpath(self): def test_validString(self):
self.assertEqual(0, ipavalidate.path("/")) self.assertEqual(0, ipavalidate.String("Joe User"))
self.assertEqual(0, ipavalidate.path("/home/user")) self.assertEqual(0, ipavalidate.String("Joe O'Malley"))
self.assertEqual(0, ipavalidate.path("../home/user")) self.assertEqual(1, ipavalidate.Plain("Joe C. User"))
self.assertEqual(0, ipavalidate.path("", notEmpty=False)) self.assertEqual(0, ipavalidate.String("", notEmpty=False))
self.assertEqual(0, ipavalidate.path(None, notEmpty=False)) self.assertEqual(0, ipavalidate.String(None, notEmpty=False))
def test_invalidpath(self): def test_invalidString(self):
self.assertEqual(1, ipavalidate.path("(foo)")) self.assertEqual(1, ipavalidate.String("", notEmpty=True))
self.assertEqual(1, ipavalidate.path("", notEmpty=True)) self.assertEqual(1, ipavalidate.String(None, notEmpty=True))
self.assertEqual(1, ipavalidate.path(None, notEmpty=True))
def test_validPath(self):
self.assertEqual(0, ipavalidate.Path("/"))
self.assertEqual(0, ipavalidate.Path("/home/user"))
self.assertEqual(0, ipavalidate.Path("../home/user"))
self.assertEqual(0, ipavalidate.Path("", notEmpty=False))
self.assertEqual(0, ipavalidate.Path(None, notEmpty=False))
def test_invalidPath(self):
self.assertEqual(1, ipavalidate.Path("(foo)"))
self.assertEqual(1, ipavalidate.Path("", notEmpty=True))
self.assertEqual(1, ipavalidate.Path(None, notEmpty=True))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()