don't propose to add certificate to cacerts.pem file if it's useless, and don't add it if it is already in. fixes #720
This commit is contained in:
		
							parent
							
								
									298d33a2c2
								
							
						
					
					
						commit
						6247de33da
					
				
					 3 changed files with 52 additions and 24 deletions
				
			
		| 
						 | 
					@ -318,7 +318,7 @@ class Connection(ConnectionHandlers):
 | 
				
			||||||
						ssl_fingerprint = \
 | 
											ssl_fingerprint = \
 | 
				
			||||||
							self.connection.Connection.ssl_fingerprint_sha1
 | 
												self.connection.Connection.ssl_fingerprint_sha1
 | 
				
			||||||
					self.dispatch('NEW_ACC_CONNECTED', (conf, is_form, ssl_msg,
 | 
										self.dispatch('NEW_ACC_CONNECTED', (conf, is_form, ssl_msg,
 | 
				
			||||||
						ssl_cert, ssl_fingerprint))
 | 
											errnum, ssl_cert, ssl_fingerprint))
 | 
				
			||||||
					self.connection.UnregisterDisconnectHandler(
 | 
										self.connection.UnregisterDisconnectHandler(
 | 
				
			||||||
						self._on_new_account)
 | 
											self._on_new_account)
 | 
				
			||||||
					self.disconnect(on_purpose=True)
 | 
										self.disconnect(on_purpose=True)
 | 
				
			||||||
| 
						 | 
					@ -589,7 +589,7 @@ class Connection(ConnectionHandlers):
 | 
				
			||||||
				text += _('\nSSL Error: %s') % ssl_error[errnum]
 | 
									text += _('\nSSL Error: %s') % ssl_error[errnum]
 | 
				
			||||||
			else:
 | 
								else:
 | 
				
			||||||
				text += _('\nUnknown SSL error: %d') % errnum
 | 
									text += _('\nUnknown SSL error: %d') % errnum
 | 
				
			||||||
			self.dispatch('SSL_ERROR', (text, con.Connection.ssl_cert_pem,
 | 
								self.dispatch('SSL_ERROR', (text, errnum, con.Connection.ssl_cert_pem,
 | 
				
			||||||
				con.Connection.ssl_fingerprint_sha1))
 | 
									con.Connection.ssl_fingerprint_sha1))
 | 
				
			||||||
			return True
 | 
								return True
 | 
				
			||||||
		if hasattr(con.Connection, 'ssl_fingerprint_sha1'):
 | 
							if hasattr(con.Connection, 'ssl_fingerprint_sha1'):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3225,12 +3225,22 @@ class AccountCreationWizardWindow:
 | 
				
			||||||
			if checked:
 | 
								if checked:
 | 
				
			||||||
				hostname = gajim.connections[self.account].new_account_info[
 | 
									hostname = gajim.connections[self.account].new_account_info[
 | 
				
			||||||
					'hostname']
 | 
										'hostname']
 | 
				
			||||||
				f = open(gajim.MY_CACERTS, 'a')
 | 
									# Check if cert is already in file
 | 
				
			||||||
				f.write(hostname + '\n')
 | 
									certs = ''
 | 
				
			||||||
				f.write(self.ssl_cert + '\n\n')
 | 
									if os.path.isfile(gajim.MY_CACERTS):
 | 
				
			||||||
				f.close()
 | 
										f = open(gajim.MY_CACERTS)
 | 
				
			||||||
				gajim.connections[self.account].new_account_info[
 | 
										certs = f.read()
 | 
				
			||||||
					'ssl_fingerprint_sha1'] = self.ssl_fingerprint
 | 
										f.close()
 | 
				
			||||||
 | 
									if self.ssl_cert in certs:
 | 
				
			||||||
 | 
										dialogs.ErrorDialog(_('Certificate Already in File'),
 | 
				
			||||||
 | 
											_('This certificate is already in file %s, so it\'s not added again.') % gajim.MY_CACERTS)
 | 
				
			||||||
 | 
									else:
 | 
				
			||||||
 | 
										f = open(gajim.MY_CACERTS, 'a')
 | 
				
			||||||
 | 
										f.write(hostname + '\n')
 | 
				
			||||||
 | 
										f.write(self.ssl_cert + '\n\n')
 | 
				
			||||||
 | 
										f.close()
 | 
				
			||||||
 | 
										gajim.connections[self.account].new_account_info[
 | 
				
			||||||
 | 
											'ssl_fingerprint_sha1'] = self.ssl_fingerprint
 | 
				
			||||||
			self.notebook.set_current_page(4) # show fom page
 | 
								self.notebook.set_current_page(4) # show fom page
 | 
				
			||||||
		elif cur_page == 4:
 | 
							elif cur_page == 4:
 | 
				
			||||||
			if self.is_form:
 | 
								if self.is_form:
 | 
				
			||||||
| 
						 | 
					@ -3271,7 +3281,7 @@ class AccountCreationWizardWindow:
 | 
				
			||||||
		self.progressbar.pulse()
 | 
							self.progressbar.pulse()
 | 
				
			||||||
		return True # loop forever
 | 
							return True # loop forever
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def new_acc_connected(self, form, is_form, ssl_msg, ssl_cert,
 | 
						def new_acc_connected(self, form, is_form, ssl_msg, ssl_err, ssl_cert,
 | 
				
			||||||
	ssl_fingerprint):
 | 
						ssl_fingerprint):
 | 
				
			||||||
		'''connection to server succeded, present the form to the user.'''
 | 
							'''connection to server succeded, present the form to the user.'''
 | 
				
			||||||
		if self.update_progressbar_timeout_id is not None:
 | 
							if self.update_progressbar_timeout_id is not None:
 | 
				
			||||||
| 
						 | 
					@ -3296,8 +3306,12 @@ class AccountCreationWizardWindow:
 | 
				
			||||||
				'SSL Error: %s\n'
 | 
									'SSL Error: %s\n'
 | 
				
			||||||
				'Do you still want to connect to this server?') % (hostname,
 | 
									'Do you still want to connect to this server?') % (hostname,
 | 
				
			||||||
				ssl_msg))
 | 
									ssl_msg))
 | 
				
			||||||
			text = _('Add this certificate to the list of trusted certificates.\nSHA1 fingerprint of the certificate:\n%s') % ssl_fingerprint
 | 
								if ssl_err in (18, 27):
 | 
				
			||||||
			self.xml.get_widget('ssl_checkbutton').set_label(text)
 | 
									text = _('Add this certificate to the list of trusted certificates.\nSHA1 fingerprint of the certificate:\n%s') % ssl_fingerprint
 | 
				
			||||||
 | 
									self.xml.get_widget('ssl_checkbutton').set_label(text)
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									self.xml.get_widget('ssl_checkbutton').set_no_show_all(True)
 | 
				
			||||||
 | 
									self.xml.get_widget('ssl_checkbutton').hide()
 | 
				
			||||||
			self.notebook.set_current_page(3) # show SSL page
 | 
								self.notebook.set_current_page(3) # show SSL page
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			self.notebook.set_current_page(4) # show form page
 | 
								self.notebook.set_current_page(4) # show form page
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										40
									
								
								src/gajim.py
									
										
									
									
									
								
							
							
						
						
									
										40
									
								
								src/gajim.py
									
										
									
									
									
								
							| 
						 | 
					@ -1019,11 +1019,11 @@ class Interface:
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def handle_event_new_acc_connected(self, account, array):
 | 
						def handle_event_new_acc_connected(self, account, array):
 | 
				
			||||||
		#('NEW_ACC_CONNECTED', account, (infos, is_form, ssl_msg, ssl_cert,
 | 
							#('NEW_ACC_CONNECTED', account, (infos, is_form, ssl_msg, ssl_err,
 | 
				
			||||||
		# ssl_fingerprint))
 | 
							# ssl_cert, ssl_fingerprint))
 | 
				
			||||||
		if self.instances.has_key('account_creation_wizard'):
 | 
							if self.instances.has_key('account_creation_wizard'):
 | 
				
			||||||
			self.instances['account_creation_wizard'].new_acc_connected(array[0],
 | 
								self.instances['account_creation_wizard'].new_acc_connected(array[0],
 | 
				
			||||||
				array[1], array[2], array[3], array[4])
 | 
									array[1], array[2], array[3], array[4], array[5])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def handle_event_new_acc_not_connected(self, account, array):
 | 
						def handle_event_new_acc_not_connected(self, account, array):
 | 
				
			||||||
		#('NEW_ACC_NOT_CONNECTED', account, (reason))
 | 
							#('NEW_ACC_NOT_CONNECTED', account, (reason))
 | 
				
			||||||
| 
						 | 
					@ -2191,25 +2191,39 @@ class Interface:
 | 
				
			||||||
		instance.unique_room_id_error(data[0])
 | 
							instance.unique_room_id_error(data[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def handle_event_ssl_error(self, account, data):
 | 
						def handle_event_ssl_error(self, account, data):
 | 
				
			||||||
		# ('SSL_ERROR', account, (text, cert, sha1_fingerprint))
 | 
							# ('SSL_ERROR', account, (text, errnum, cert, sha1_fingerprint))
 | 
				
			||||||
		server = gajim.config.get_per('accounts', account, 'hostname')
 | 
							server = gajim.config.get_per('accounts', account, 'hostname')
 | 
				
			||||||
		def on_ok(is_checked):
 | 
							def on_ok(is_checked=False):
 | 
				
			||||||
			if is_checked:
 | 
								if is_checked:
 | 
				
			||||||
				f = open(gajim.MY_CACERTS, 'a')
 | 
									# Check if cert is already in file
 | 
				
			||||||
				f.write(server + '\n')
 | 
									certs = ''
 | 
				
			||||||
				f.write(data[1] + '\n\n')
 | 
									if os.path.isfile(gajim.MY_CACERTS):
 | 
				
			||||||
				f.close()
 | 
										f = open(gajim.MY_CACERTS)
 | 
				
			||||||
 | 
										certs = f.read()
 | 
				
			||||||
 | 
										f.close()
 | 
				
			||||||
 | 
									if data[2] in certs:
 | 
				
			||||||
 | 
										dialogs.ErrorDialog(_('Certificate Already in File'),
 | 
				
			||||||
 | 
											_('This certificate is already in file %s, so it\'s not added again.') % gajim.MY_CACERTS)
 | 
				
			||||||
 | 
									else:
 | 
				
			||||||
 | 
										f = open(gajim.MY_CACERTS, 'a')
 | 
				
			||||||
 | 
										f.write(server + '\n')
 | 
				
			||||||
 | 
										f.write(data[2] + '\n\n')
 | 
				
			||||||
 | 
										f.close()
 | 
				
			||||||
				gajim.config.set_per('accounts', account, 'ssl_fingerprint_sha1',
 | 
									gajim.config.set_per('accounts', account, 'ssl_fingerprint_sha1',
 | 
				
			||||||
					data[2])
 | 
										data[3])
 | 
				
			||||||
			gajim.connections[account].ssl_certificate_accepted()
 | 
								gajim.connections[account].ssl_certificate_accepted()
 | 
				
			||||||
		def on_cancel():
 | 
							def on_cancel():
 | 
				
			||||||
			gajim.connections[account].disconnect(on_purpose=True)
 | 
								gajim.connections[account].disconnect(on_purpose=True)
 | 
				
			||||||
			self.handle_event_status(account, 'offline')
 | 
								self.handle_event_status(account, 'offline')
 | 
				
			||||||
		pritext = _('Error verifying SSL certificate')
 | 
							pritext = _('Error verifying SSL certificate')
 | 
				
			||||||
		sectext = _('There was an error verifying the SSL certificate of your jabber server: %(error)s\nDo you still want to connect to this server?') % {'error': data[0]}
 | 
							sectext = _('There was an error verifying the SSL certificate of your jabber server: %(error)s\nDo you still want to connect to this server?') % {'error': data[0]}
 | 
				
			||||||
		checktext = _('Add this certificate to the list of trusted certificates.\nSHA1 fingerprint of the certificate:\n%s') % data[2]
 | 
							if data[1] in (18, 27):
 | 
				
			||||||
		dialogs.ConfirmationDialogCheck(pritext, sectext, checktext,
 | 
								checktext = _('Add this certificate to the list of trusted certificates.\nSHA1 fingerprint of the certificate:\n%s') % data[3]
 | 
				
			||||||
			on_response_ok=on_ok, on_response_cancel=on_cancel)
 | 
								dialogs.ConfirmationDialogCheck(pritext, sectext, checktext,
 | 
				
			||||||
 | 
									on_response_ok=on_ok, on_response_cancel=on_cancel)
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								dialogs.ConfirmationDialog(pritext, sectext,
 | 
				
			||||||
 | 
									on_response_ok=on_ok, on_response_cancel=on_cancel)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def handle_event_fingerprint_error(self, account, data):
 | 
						def handle_event_fingerprint_error(self, account, data):
 | 
				
			||||||
		# ('FINGERPRINT_ERROR', account, (fingerprint,))
 | 
							# ('FINGERPRINT_ERROR', account, (fingerprint,))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue