now doing file uploads for ssh key and much better error handling

This commit is contained in:
Michael McGrath 2008-03-06 16:19:07 -06:00
parent d41acad677
commit d9305694e9
2 changed files with 25 additions and 3 deletions

View file

@ -8,7 +8,7 @@
</head>
<body>
<h2>${_('Edit Account (%s)') % target.username}</h2>
<form action="${tg.url('/user/save/%s' % target.username)}" method="post">
<form action="${tg.url('/user/save/%s' % target.username)}" method="post" enctype="multipart/form-data">
<div class="field">
<label for="human_name">${_('Human Name')}:</label>
<input type="text" id="human_name" name="human_name" value="${target.human_name}" />
@ -41,7 +41,8 @@
</div>
<div class="field">
<label for="ssh_key">${_('Public SSH Key')}:</label>
<textarea id="ssh_key" name="ssh_key">${target.ssh_key}</textarea>
<!--<textarea id="ssh_key" rows='3' cols='50' name="ssh_key">${target.ssh_key}</textarea>-->
<input type="file" name="ssh_key" id="ssh_key"/>
<script type="text/javascript">var hb19 = new HelpBalloon({dataURL: '${tg.url('/help/get_help/user_ssh_key')}'});</script>
</div>
<div class="field">

View file

@ -54,6 +54,25 @@ class UnknownUser(validators.FancyValidator):
raise validators.Invalid(_("'%s' already exists.") % value, value, state)
class ValidSSHKey(validators.FancyValidator):
''' Make sure the ssh key uploaded is valid '''
def _to_python(self, value, state):
return value.file.read()
def validate_python(self, value, state):
# value = value.file.read()
print dir(value)
email_pattern = "[a-zA-Z0-9\.\+\-_]+@[a-zA-Z0-9\.\-]+"
keylines = value.split('\n')
print "KEYLINES: %s" % keylines
for keyline in keylines:
if not keyline:
continue
keyline = keyline.strip()
m = re.match('ssh-[dr]s[as] [^ ]+ ' + email_pattern, keyline)
if not m or m.end() < len(keyline):
raise validators.Invalid(_('Error - Not a valid ssh key: %s') % keyline, value, state)
class ValidUsername(validators.FancyValidator):
'''Make sure that a username isn't blacklisted'''
def _to_python(self, value, state):
@ -69,6 +88,7 @@ class UserSave(validators.Schema):
validators.String(not_empty=True, max=42),
validators.Regex(regex='^[^\n:<>]+$'),
)
ssh_key = ValidSSHKey(max=5000)
#mail = validators.All(
# validators.Email(not_empty=True, strip=True, max=128),
# NonFedoraEmail(not_empty=True, strip=True, max=128),
@ -230,7 +250,8 @@ class User(controllers.Controller):
target.ircnick = ircnick
target.gpg_keyid = gpg_keyid
target.telephone = telephone
target.ssh_key = ssh_key
if ssh_key:
target.ssh_key = ssh_key
target.postal_address = postal_address
target.comments = comments
target.locale = locale