Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e612154

Browse files
authored
Issue1431 (yhirose#1926)
* Renamed enable_server_host_verification to enable_server_hostname_verification and added Error::SSLServerHostnameVerification * Add some Open SSL function calls * Code cleanup * Fix yhirose#1431
1 parent 82fcbe3 commit e612154

File tree

1 file changed

+37
-18
lines changed

1 file changed

+37
-18
lines changed

‎httplib.h

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,6 +1452,7 @@ class ClientImpl {
14521452
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
14531453
void enable_server_certificate_verification(bool enabled);
14541454
void enable_server_hostname_verification(bool enabled);
1455+
void set_server_certificate_verifier(std::function<bool(SSL *ssl)> verifier);
14551456
#endif
14561457

14571458
void set_logger(Logger logger);
@@ -1567,6 +1568,7 @@ class ClientImpl {
15671568
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
15681569
bool server_certificate_verification_ = true;
15691570
bool server_hostname_verification_ = true;
1571+
std::function<bool(SSL *ssl)> server_certificate_verifier_;
15701572
#endif
15711573

15721574
Logger logger_;
@@ -1873,6 +1875,7 @@ class Client {
18731875
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
18741876
void enable_server_certificate_verification(bool enabled);
18751877
void enable_server_hostname_verification(bool enabled);
1878+
void set_server_certificate_verifier(std::function<bool(SSL *ssl)> verifier);
18761879
#endif
18771880

18781881
void set_logger(Logger logger);
@@ -7219,6 +7222,7 @@ inline void ClientImpl::copy_settings(const ClientImpl &rhs) {
72197222
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
72207223
server_certificate_verification_ = rhs.server_certificate_verification_;
72217224
server_hostname_verification_ = rhs.server_hostname_verification_;
7225+
server_certificate_verifier_ = rhs.server_certificate_verifier_;
72227226
#endif
72237227
logger_ = rhs.logger_;
72247228
}
@@ -8700,9 +8704,7 @@ inline X509_STORE *ClientImpl::create_ca_cert_store(const char *ca_cert,
87008704
if (!mem) { return nullptr; }
87018705

87028706
auto inf = PEM_X509_INFO_read_bio(mem, nullptr, nullptr, nullptr);
8703-
if (!inf) {
8704-
return nullptr;
8705-
}
8707+
if (!inf) { return nullptr; }
87068708

87078709
auto cts = X509_STORE_new();
87088710
if (cts) {
@@ -8726,6 +8728,11 @@ inline void ClientImpl::enable_server_certificate_verification(bool enabled) {
87268728
inline void ClientImpl::enable_server_hostname_verification(bool enabled) {
87278729
server_hostname_verification_ = enabled;
87288730
}
8731+
8732+
inline void ClientImpl::set_server_certificate_verifier(
8733+
std::function<bool(SSL *ssl)> verifier) {
8734+
server_certificate_verifier_ = verifier;
8735+
}
87298736
#endif
87308737

87318738
inline void ClientImpl::set_logger(Logger logger) {
@@ -9311,26 +9318,33 @@ inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) {
93119318
}
93129319

93139320
if (server_certificate_verification_) {
9314-
verify_result_ = SSL_get_verify_result(ssl2);
9315-
9316-
if (verify_result_ != X509_V_OK) {
9317-
error = Error::SSLServerVerification;
9318-
return false;
9319-
}
9321+
if (server_certificate_verifier_) {
9322+
if (!server_certificate_verifier_(ssl2)) {
9323+
error = Error::SSLServerVerification;
9324+
return false;
9325+
}
9326+
} else {
9327+
verify_result_ = SSL_get_verify_result(ssl2);
93209328

9321-
auto server_cert = SSL_get1_peer_certificate(ssl2);
9322-
auto se = detail::scope_exit([&] { X509_free(server_cert); });
9329+
if (verify_result_ != X509_V_OK) {
9330+
error = Error::SSLServerVerification;
9331+
return false;
9332+
}
93239333

9324-
if (server_cert == nullptr) {
9325-
error = Error::SSLServerVerification;
9326-
return false;
9327-
}
9334+
auto server_cert = SSL_get1_peer_certificate(ssl2);
9335+
auto se = detail::scope_exit([&] { X509_free(server_cert); });
93289336

9329-
if (server_hostname_verification_) {
9330-
if (!verify_host(server_cert)) {
9331-
error = Error::SSLServerHostnameVerification;
9337+
if (server_cert == nullptr) {
9338+
error = Error::SSLServerVerification;
93329339
return false;
93339340
}
9341+
9342+
if (server_hostname_verification_) {
9343+
if (!verify_host(server_cert)) {
9344+
error = Error::SSLServerHostnameVerification;
9345+
return false;
9346+
}
9347+
}
93349348
}
93359349
}
93369350

@@ -10066,6 +10080,11 @@ inline void Client::enable_server_certificate_verification(bool enabled) {
1006610080
inline void Client::enable_server_hostname_verification(bool enabled) {
1006710081
cli_->enable_server_hostname_verification(enabled);
1006810082
}
10083+
10084+
inline void Client::set_server_certificate_verifier(
10085+
std::function<bool(SSL *ssl)> verifier) {
10086+
cli_->set_server_certificate_verifier(verifier);
10087+
}
1006910088
#endif
1007010089

1007110090
inline void Client::set_logger(Logger logger) {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /