Using ssh-keygen to validate public key
This commit is contained in:
		
					parent
					
						
							
								4ce914b178
							
						
					
				
			
			
				commit
				
					
						261615e701
					
				
			
		
					 2 changed files with 24 additions and 19 deletions
				
			
		|  | @ -1,5 +1,8 @@ | |||
| import datetime | ||||
| import logging | ||||
| import subprocess | ||||
| import tempfile | ||||
| import os | ||||
| 
 | ||||
| from django import forms | ||||
| from django.contrib.auth import authenticate | ||||
|  | @ -92,25 +95,22 @@ class UserHostingKeyForm(forms.ModelForm): | |||
|             return self.data.get('public_key') | ||||
|         KEY_ERROR_MESSAGE = _("Please input a proper SSH key") | ||||
|         openssh_pubkey_str = self.data.get('public_key') | ||||
|         try: | ||||
|             ssh_key = SSHKey(openssh_pubkey_str) | ||||
|             ssh_key.parse() | ||||
|         except InvalidKeyException as err: | ||||
|             logger.error( | ||||
|                 "InvalidKeyException while parsing ssh key {0}".format(err)) | ||||
|             raise forms.ValidationError(KEY_ERROR_MESSAGE) | ||||
|         except NotImplementedError as err: | ||||
|             logger.error( | ||||
|                 "NotImplementedError while parsing ssh key {0}".format(err)) | ||||
|             raise forms.ValidationError(KEY_ERROR_MESSAGE) | ||||
|         except UnicodeDecodeError as u: | ||||
|             logger.error( | ||||
|                 "UnicodeDecodeError while parsing ssh key {0}".format(u)) | ||||
|             raise forms.ValidationError(KEY_ERROR_MESSAGE) | ||||
|         except ValueError as v: | ||||
|             logger.error( | ||||
|                 "ValueError while parsing ssh key {0}".format(v)) | ||||
|             raise forms.ValidationError(KEY_ERROR_MESSAGE) | ||||
| 
 | ||||
|         with tempfile.NamedTemporaryFile(delete=True) as tmp_public_key_file: | ||||
|             tmp_public_key_file.writelines(openssh_pubkey_str) | ||||
|             tmp_public_key_file.flush() | ||||
|             try: | ||||
|                 out = subprocess.check_output( | ||||
|                     ['ssh-keygen', '-lf', tmp_public_key_file.name]) | ||||
|             except subprocess.CalledProcessError as cpe: | ||||
|                 logger.debug( | ||||
|                     "Not a correct ssh format {error} {out}".format( | ||||
|                         error=str(cpe), out=out)) | ||||
|                 raise forms.ValidationError(KEY_ERROR_MESSAGE) | ||||
|             try: | ||||
|                 os.remove(tmp_public_key_file.name) | ||||
|             except OSError: | ||||
|                 pass | ||||
|         return openssh_pubkey_str | ||||
| 
 | ||||
|     def clean_name(self): | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| import tempfile | ||||
| import os | ||||
| 
 | ||||
| import cdist | ||||
| from cdist.integration import configure_hosts_simple | ||||
|  | @ -67,6 +68,10 @@ def save_ssh_key(self, hosts, keys): | |||
|         except Exception as cdist_exception: | ||||
|             logger.error(cdist_exception) | ||||
|             return_value = False | ||||
|     try: | ||||
|         os.remove(tmp_manifest.name) | ||||
|     except OSError: | ||||
|         pass | ||||
|     return return_value | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue