mirror of https://github.com/aria2/aria2
				
				
				
			2009-06-21 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
In TLSContext::addClientKeyFile() and addTrustedCACertFile(), handle excepion inside these functions. * src/LibgnutlsTLSContext.cc * src/LibgnutlsTLSContext.h * src/LibsslTLSContext.cc * src/LibsslTLSContext.h * src/MultiUrlRequestInfo.ccpull/1/head
							parent
							
								
									a60ba71f1e
								
							
						
					
					
						commit
						4cfe156aa7
					
				
							
								
								
									
										10
									
								
								ChangeLog
								
								
								
								
							
							
						
						
									
										10
									
								
								ChangeLog
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,13 @@
 | 
			
		|||
2009-06-21  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	In TLSContext::addClientKeyFile() and addTrustedCACertFile(),
 | 
			
		||||
	handle excepion inside these functions.
 | 
			
		||||
	* src/LibgnutlsTLSContext.cc
 | 
			
		||||
	* src/LibgnutlsTLSContext.h
 | 
			
		||||
	* src/LibsslTLSContext.cc
 | 
			
		||||
	* src/LibsslTLSContext.h
 | 
			
		||||
	* src/MultiUrlRequestInfo.cc
 | 
			
		||||
 | 
			
		||||
2009-06-21  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Added comment
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -78,36 +78,39 @@ bool TLSContext::bad() const
 | 
			
		|||
  return !_good;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TLSContext::addClientKeyFile(const std::string& certfile,
 | 
			
		||||
bool TLSContext::addClientKeyFile(const std::string& certfile,
 | 
			
		||||
				  const std::string& keyfile)
 | 
			
		||||
  throw(DlAbortEx)
 | 
			
		||||
{
 | 
			
		||||
  int ret = gnutls_certificate_set_x509_key_file(_certCred,
 | 
			
		||||
						 certfile.c_str(),
 | 
			
		||||
						 keyfile.c_str(),
 | 
			
		||||
						 GNUTLS_X509_FMT_PEM);
 | 
			
		||||
  if(ret != GNUTLS_E_SUCCESS) {
 | 
			
		||||
    throw DL_ABORT_EX
 | 
			
		||||
      (StringFormat("Failed to load client certificate from %s and"
 | 
			
		||||
		    " private key from %s. Cause: %s",
 | 
			
		||||
		    certfile.c_str(), keyfile.c_str(),
 | 
			
		||||
		    gnutls_strerror(ret)).str());
 | 
			
		||||
  if(ret == GNUTLS_E_SUCCESS) {
 | 
			
		||||
    _logger->info("Client Key File(cert=%s, key=%s) were successfully added.",
 | 
			
		||||
		  certfile.c_str(), keyfile.c_str());
 | 
			
		||||
    return true;
 | 
			
		||||
  } else {
 | 
			
		||||
    _logger->error("Failed to load client certificate from %s and"
 | 
			
		||||
		   " private key from %s. Cause: %s",
 | 
			
		||||
		   certfile.c_str(), keyfile.c_str(),
 | 
			
		||||
		   gnutls_strerror(ret));
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TLSContext::addTrustedCACertFile(const std::string& certfile)
 | 
			
		||||
  throw(DlAbortEx)
 | 
			
		||||
bool TLSContext::addTrustedCACertFile(const std::string& certfile)
 | 
			
		||||
{
 | 
			
		||||
  int ret = gnutls_certificate_set_x509_trust_file(_certCred,
 | 
			
		||||
						   certfile.c_str(),
 | 
			
		||||
						   GNUTLS_X509_FMT_PEM);
 | 
			
		||||
  if(ret < 0) {
 | 
			
		||||
    throw DL_ABORT_EX
 | 
			
		||||
      (StringFormat
 | 
			
		||||
       (MSG_LOADING_TRUSTED_CA_CERT_FAILED,
 | 
			
		||||
	certfile.c_str(), gnutls_strerror(ret)).str());
 | 
			
		||||
    _logger->error(MSG_LOADING_TRUSTED_CA_CERT_FAILED,
 | 
			
		||||
		   certfile.c_str(), gnutls_strerror(ret));
 | 
			
		||||
    return false;
 | 
			
		||||
  } else {
 | 
			
		||||
    _logger->info("%d certificate(s) were imported.", ret);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  _logger->info("%d certificate(s) were imported.", ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gnutls_certificate_credentials_t TLSContext::getCertCred() const
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,11 +62,11 @@ public:
 | 
			
		|||
  ~TLSContext();
 | 
			
		||||
 | 
			
		||||
  // private key `keyfile' must be decrypted.
 | 
			
		||||
  void addClientKeyFile(const std::string& certfile,
 | 
			
		||||
			const std::string& keyfile) throw(DlAbortEx);
 | 
			
		||||
  bool addClientKeyFile(const std::string& certfile,
 | 
			
		||||
			const std::string& keyfile);
 | 
			
		||||
 | 
			
		||||
  // certfile can contain multiple certificates.
 | 
			
		||||
  void addTrustedCACertFile(const std::string& certfile) throw(DlAbortEx);
 | 
			
		||||
  bool addTrustedCACertFile(const std::string& certfile);
 | 
			
		||||
 | 
			
		||||
  bool good() const;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,33 +73,34 @@ bool TLSContext::bad() const
 | 
			
		|||
  return !_good;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TLSContext::addClientKeyFile(const std::string& certfile,
 | 
			
		||||
bool TLSContext::addClientKeyFile(const std::string& certfile,
 | 
			
		||||
				  const std::string& keyfile)
 | 
			
		||||
  throw(DlAbortEx)
 | 
			
		||||
{
 | 
			
		||||
  if(SSL_CTX_use_PrivateKey_file(_sslCtx, keyfile.c_str(),
 | 
			
		||||
				 SSL_FILETYPE_PEM) != 1) {
 | 
			
		||||
    throw DL_ABORT_EX
 | 
			
		||||
      (StringFormat
 | 
			
		||||
       ("Failed to load client private key from %s. Cause: %s",
 | 
			
		||||
	keyfile.c_str(), ERR_error_string(ERR_get_error(), 0)).str());
 | 
			
		||||
    _logger->error("Failed to load client private key from %s. Cause: %s",
 | 
			
		||||
		   keyfile.c_str(), ERR_error_string(ERR_get_error(), 0));
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  if(SSL_CTX_use_certificate_chain_file(_sslCtx, certfile.c_str()) != 1) {
 | 
			
		||||
    throw DL_ABORT_EX
 | 
			
		||||
      (StringFormat
 | 
			
		||||
       ("Failed to load client certificate from %s. Cause: %s",
 | 
			
		||||
	certfile.c_str(), ERR_error_string(ERR_get_error(), 0)).str());
 | 
			
		||||
    _logger->error("Failed to load client certificate from %s. Cause: %s",
 | 
			
		||||
		   certfile.c_str(), ERR_error_string(ERR_get_error(), 0));
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  _logger->info("Client Key File(cert=%s, key=%s) were successfully added.",
 | 
			
		||||
		certfile.c_str(), keyfile.c_str());
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TLSContext::addTrustedCACertFile(const std::string& certfile)
 | 
			
		||||
  throw(DlAbortEx)
 | 
			
		||||
bool TLSContext::addTrustedCACertFile(const std::string& certfile)
 | 
			
		||||
{
 | 
			
		||||
  if(SSL_CTX_load_verify_locations(_sslCtx, certfile.c_str(), 0) != 1) {
 | 
			
		||||
    throw DL_ABORT_EX
 | 
			
		||||
      (StringFormat
 | 
			
		||||
       (MSG_LOADING_TRUSTED_CA_CERT_FAILED,
 | 
			
		||||
	certfile.c_str(), ERR_error_string(ERR_get_error(), 0)).str());
 | 
			
		||||
    _logger->error(MSG_LOADING_TRUSTED_CA_CERT_FAILED,
 | 
			
		||||
		   certfile.c_str(), ERR_error_string(ERR_get_error(), 0));
 | 
			
		||||
    return false;
 | 
			
		||||
  } else {
 | 
			
		||||
    _logger->info("Trusted CA certificates were successfully added.");
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,11 +62,11 @@ public:
 | 
			
		|||
  ~TLSContext();
 | 
			
		||||
 | 
			
		||||
  // private key `keyfile' must be decrypted.
 | 
			
		||||
  void addClientKeyFile(const std::string& certfile,
 | 
			
		||||
			const std::string& keyfile) throw(DlAbortEx);
 | 
			
		||||
  bool addClientKeyFile(const std::string& certfile,
 | 
			
		||||
			const std::string& keyfile);
 | 
			
		||||
 | 
			
		||||
  // certfile can contain multiple certificates.
 | 
			
		||||
  void addTrustedCACertFile(const std::string& certfile) throw(DlAbortEx);
 | 
			
		||||
  bool addTrustedCACertFile(const std::string& certfile);
 | 
			
		||||
 | 
			
		||||
  bool good() const;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -140,10 +140,7 @@ DownloadResult::RESULT MultiUrlRequestInfo::execute()
 | 
			
		|||
				   _option->get(PREF_PRIVATE_KEY));
 | 
			
		||||
    }
 | 
			
		||||
    if(!_option->blank(PREF_CA_CERTIFICATE)) {
 | 
			
		||||
      try {
 | 
			
		||||
	tlsContext->addTrustedCACertFile(_option->get(PREF_CA_CERTIFICATE));
 | 
			
		||||
      } catch(RecoverableException& e) {
 | 
			
		||||
	_logger->error(EX_EXCEPTION_CAUGHT, e);
 | 
			
		||||
      if(!tlsContext->addTrustedCACertFile(_option->get(PREF_CA_CERTIFICATE))) {
 | 
			
		||||
	_logger->warn(MSG_WARN_NO_CA_CERT);
 | 
			
		||||
      }
 | 
			
		||||
    } else if(_option->getAsBool(PREF_CHECK_CERTIFICATE)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue