mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			63 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			63 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include "Network/NetworkAccessManager.hpp"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <QString>
							 | 
						||
| 
								 | 
							
								#include <QNetworkReply>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "moc_NetworkAccessManager.cpp"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NetworkAccessManager::NetworkAccessManager (QWidget * parent)
							 | 
						||
| 
								 | 
							
								  : QNetworkAccessManager (parent)
							 | 
						||
| 
								 | 
							
								  , parent_widget_ {parent}
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  // handle SSL errors that have not been cached as allowed
							 | 
						||
| 
								 | 
							
								  // exceptions and offer them to the user to add to the ignored
							 | 
						||
| 
								 | 
							
								  // exception cache
							 | 
						||
| 
								 | 
							
								  connect (this, &QNetworkAccessManager::sslErrors, this, &NetworkAccessManager::filter_SSL_errors);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void NetworkAccessManager::filter_SSL_errors (QNetworkReply * reply, QList<QSslError> const& errors)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QString message;
							 | 
						||
| 
								 | 
							
								  QList<QSslError> new_errors;
							 | 
						||
| 
								 | 
							
								  for (auto const& error: errors)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      if (!allowed_ssl_errors_.contains (error))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          new_errors << error;
							 | 
						||
| 
								 | 
							
								          message += '\n' + reply->request ().url ().toDisplayString () + ": " + error.errorString ();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  if (new_errors.size ())
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      QString certs;
							 | 
						||
| 
								 | 
							
								      for (auto const& cert : reply->sslConfiguration ().peerCertificateChain ())
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          certs += cert.toText () + '\n';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      if (MessageBox::Ignore == MessageBox::query_message (parent_widget_
							 | 
						||
| 
								 | 
							
								                                                           , tr ("Network SSL/TLS Errors")
							 | 
						||
| 
								 | 
							
								                                                           , message, certs
							 | 
						||
| 
								 | 
							
								                                                           , MessageBox::Abort | MessageBox::Ignore))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          // accumulate new SSL error exceptions that have been allowed
							 | 
						||
| 
								 | 
							
								          allowed_ssl_errors_.append (new_errors);
							 | 
						||
| 
								 | 
							
								          reply->ignoreSslErrors (allowed_ssl_errors_);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      // no new exceptions so silently ignore the ones already allowed
							 | 
						||
| 
								 | 
							
								      reply->ignoreSslErrors (allowed_ssl_errors_);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								QNetworkReply * NetworkAccessManager::createRequest (Operation operation, QNetworkRequest const& request
							 | 
						||
| 
								 | 
							
								                                                     , QIODevice * outgoing_data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  auto reply = QNetworkAccessManager::createRequest (operation, request, outgoing_data);
							 | 
						||
| 
								 | 
							
								  // errors are usually certificate specific so passing all cached
							 | 
						||
| 
								 | 
							
								  // exceptions here is ok
							 | 
						||
| 
								 | 
							
								  reply->ignoreSslErrors (allowed_ssl_errors_);
							 | 
						||
| 
								 | 
							
								  return reply;
							 | 
						||
| 
								 | 
							
								}
							 |