diff --git a/sshkey/models.py b/sshkey/models.py index 6b73e9b..d171ff2 100644 --- a/sshkey/models.py +++ b/sshkey/models.py @@ -1,7 +1,6 @@ from django.db import models -from django.dispatch import receiver -from django.db.models.signals import pre_save from django.contrib.auth.models import User +from django.core.exceptions import ValidationError from sshkey.util import sshkey_fingerprint class UserKey(models.Model): @@ -18,6 +17,8 @@ class UserKey(models.Model): def __unicode__(self): return unicode(self.user) + u': ' + self.name -@receiver(pre_save, sender=UserKey, dispatch_uid=__name__ + '.set_fingerprint') -def set_fingerprint(sender, instance, **kwargs): - instance.fingerprint = sshkey_fingerprint(instance.key) + def clean(self): + try: + self.fingerprint = sshkey_fingerprint(self.key) + except Exception, e: + raise ValidationError('Not a valid SSH key: ' + str(e)) diff --git a/sshkey/util.py b/sshkey/util.py index c7fc689..8241fee 100644 --- a/sshkey/util.py +++ b/sshkey/util.py @@ -7,7 +7,7 @@ sshkey_re = re.compile(r'\s*(?:(?P<options>.*?)\s+)?(?P<type>ssh-\w+)\s+(?P<key> def sshkey_fingerprint(key_line): match = sshkey_re.match(key_line) if not match: - return None + raise Exception('Key is not in OpenSSH authorized_keys format') key = base64.b64decode(match.group('key')) fp_plain = hashlib.md5(key).hexdigest() return ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))