| Index: ios/web/net/crw_cert_verification_controller.mm
|
| diff --git a/ios/web/net/crw_cert_verification_controller.mm b/ios/web/net/crw_cert_verification_controller.mm
|
| index b8dba8fa106811aa2c53aeffbe5539587ea8f301..f7bc9a1b41a9c31f2477b05d1025df3b046e858c 100644
|
| --- a/ios/web/net/crw_cert_verification_controller.mm
|
| +++ b/ios/web/net/crw_cert_verification_controller.mm
|
| @@ -11,6 +11,7 @@
|
| #include "ios/web/net/cert_verifier_block_adapter.h"
|
| #include "ios/web/public/browser_state.h"
|
| #include "ios/web/public/web_thread.h"
|
| +#import "ios/web/web_state/wk_web_view_security_util.h"
|
| #include "net/cert/cert_verify_result.h"
|
| #include "net/ssl/ssl_config_service.h"
|
| #include "net/url_request/url_request_context.h"
|
| @@ -106,16 +107,16 @@ class BlockHolder : public base::RefCountedThreadSafe<BlockHolder<T>> {
|
|
|
| - (void)decidePolicyForCert:(const scoped_refptr<net::X509Certificate>&)cert
|
| host:(NSString*)host
|
| - completionHandler:(web::PolicyDecisionHandler)handler {
|
| + completionHandler:(web::PolicyDecisionHandler)completionHandler {
|
| DCHECK_CURRENTLY_ON_WEB_THREAD(web::WebThread::UI);
|
| // completionHandler of |verifyCert:forHost:completionHandler:| is called on
|
| // IO thread and then bounces back to UI thread. As a result all objects
|
| // captured by completionHandler may be released on either UI or IO thread.
|
| - // Since |handler| can potentially capture multiple thread unsafe objects
|
| - // (like Web Controller) |handler| itself should never be released on
|
| - // background thread and |BlockHolder| ensures that.
|
| + // Since |completionHandler| can potentially capture multiple thread unsafe
|
| + // objects (like Web Controller) |completionHandler| itself should never be
|
| + // released on background thread and |BlockHolder| ensures that.
|
| __block scoped_refptr<BlockHolder<web::PolicyDecisionHandler>> handlerHolder(
|
| - new BlockHolder<web::PolicyDecisionHandler>(handler));
|
| + new BlockHolder<web::PolicyDecisionHandler>(completionHandler));
|
| [self verifyCert:cert
|
| forHost:host
|
| completionHandler:^(net::CertVerifyResult result, int error) {
|
| @@ -135,6 +136,36 @@ class BlockHolder : public base::RefCountedThreadSafe<BlockHolder<T>> {
|
| }];
|
| }
|
|
|
| +- (void)querySSLStatusForCertChain:(NSArray*)certChain
|
| + host:(NSString*)host
|
| + completionHandler:(web::StatusQueryHandler)completionHandler {
|
| + DCHECK_CURRENTLY_ON_WEB_THREAD(web::WebThread::UI);
|
| + DCHECK(certChain.count);
|
| +
|
| + // Completion handler of |verifyCert:forHost:completionHandler:| will be
|
| + // deallocated on IO thread. |completionHandler| itself should never be
|
| + // released on background thread and |BlockHolder| ensures that.
|
| + __block scoped_refptr<BlockHolder<web::StatusQueryHandler>> handlerHolder(
|
| + new BlockHolder<web::StatusQueryHandler>(completionHandler));
|
| + scoped_refptr<net::X509Certificate> cert(web::CreateCertFromChain(certChain));
|
| + // Knowing net::CertStatus is necessry even for valid certs in order to
|
| + // support SHA-1 deprecation.
|
| + [self verifyCert:cert
|
| + forHost:host
|
| + completionHandler:^(net::CertVerifyResult certVerifierResult, int) {
|
| + base::ScopedCFTypeRef<SecTrustRef> trust(
|
| + web::CreateServerTrustFromChain(certChain, host));
|
| +
|
| + SecTrustResultType trustResult = kSecTrustResultInvalid;
|
| + SecTrustEvaluate(trust.get(), &trustResult);
|
| +
|
| + dispatch_async(dispatch_get_main_queue(), ^{
|
| + handlerHolder->call(web::GetSecurityStyleFromTrustResult(trustResult),
|
| + certVerifierResult.cert_status);
|
| + });
|
| + }];
|
| +}
|
| +
|
| - (void)shutDown {
|
| DCHECK_CURRENTLY_ON_WEB_THREAD(web::WebThread::UI);
|
| web::WebThread::PostTask(web::WebThread::IO, FROM_HERE, base::BindBlock(^{
|
|
|