From 25b5b82a069aa4ea5e9c458e5b5f44f823227aa8 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Sat, 21 Feb 2015 20:54:51 +0100 Subject: [PATCH] fix broken ssh public key handling - make sure that AddSshPublicKeyForm does not try to parse the key if it is None - split the key text into a maximum of 3 parts to allow whitespace in comments - update changelog --- docs/changelog.rst | 1 + gnuviechadmin/osusers/forms.py | 17 +++++++++-------- gnuviechadmin/osusers/models.py | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 3cf93a1..1c226ae 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,6 +1,7 @@ Changelog ========= +* :bug:`-` fix handling of OpenSSH formatted keys with whitespace in comments * :bug:`-` the ssh key list does not show SSH keys of other users anymore * :release:`0.11.2 <2015-02-06>` diff --git a/gnuviechadmin/osusers/forms.py b/gnuviechadmin/osusers/forms.py index ed1a6c1..975f102 100644 --- a/gnuviechadmin/osusers/forms.py +++ b/gnuviechadmin/osusers/forms.py @@ -85,14 +85,15 @@ class AddSshPublicKeyForm(forms.ModelForm): def clean(self): keytext = self.cleaned_data.get('publickeytext') - alg, data, comment = SshPublicKey.objects.parse_keytext(keytext) - if SshPublicKey.objects.filter( - user=self.osuser, algorithm=alg, data=data - ).exists(): - self.add_error( - 'publickeytext', - forms.ValidationError(DUPLICATE_SSH_PUBLIC_KEY_FOR_USER) - ) + if keytext is not None: + alg, data, comment = SshPublicKey.objects.parse_keytext(keytext) + if SshPublicKey.objects.filter( + user=self.osuser, algorithm=alg, data=data + ).exists(): + self.add_error( + 'publickeytext', + forms.ValidationError(DUPLICATE_SSH_PUBLIC_KEY_FOR_USER) + ) def save(self, commit=True): """ diff --git a/gnuviechadmin/osusers/models.py b/gnuviechadmin/osusers/models.py index ddde5e5..28e93a7 100644 --- a/gnuviechadmin/osusers/models.py +++ b/gnuviechadmin/osusers/models.py @@ -528,9 +528,9 @@ class SshPublicKeyManager(models.Manager): if 'comment' in headers: comment = headers['comment'] else: - parts = keytext.split() - if len(parts) > 3: - raise ValueError("unsupported key format") + parts = keytext.split(None, 2) + if len(parts) < 2: + raise ValueError('invalid SSH public key') data = parts[1] comment = len(parts) == 3 and parts[2] or "" keybytes = base64.b64decode(data)