OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/web/net/crw_ssl_status_updater.h" | 5 #import "ios/web/net/crw_ssl_status_updater.h" |
6 | 6 |
7 #import "base/ios/weak_nsobject.h" | |
8 #import "base/mac/scoped_nsobject.h" | 7 #import "base/mac/scoped_nsobject.h" |
9 #import "base/strings/sys_string_conversions.h" | 8 #import "base/strings/sys_string_conversions.h" |
10 #import "ios/web/public/navigation_item.h" | 9 #import "ios/web/public/navigation_item.h" |
11 #import "ios/web/public/navigation_manager.h" | 10 #import "ios/web/public/navigation_manager.h" |
12 #include "ios/web/public/ssl_status.h" | 11 #include "ios/web/public/ssl_status.h" |
13 #import "ios/web/web_state/wk_web_view_security_util.h" | 12 #import "ios/web/web_state/wk_web_view_security_util.h" |
14 #include "net/cert/x509_certificate.h" | 13 #include "net/cert/x509_certificate.h" |
15 #include "url/gurl.h" | 14 #include "url/gurl.h" |
16 | 15 |
17 #if !defined(__has_feature) || !__has_feature(objc_arc) | 16 #if !defined(__has_feature) || !__has_feature(objc_arc) |
18 #error "This file requires ARC support." | 17 #error "This file requires ARC support." |
19 #endif | 18 #endif |
20 | 19 |
21 using base::ScopedCFTypeRef; | 20 using base::ScopedCFTypeRef; |
22 using net::CertStatus; | 21 using net::CertStatus; |
23 using web::SecurityStyle; | 22 using web::SecurityStyle; |
24 | 23 |
25 @interface CRWSSLStatusUpdater () { | 24 @interface CRWSSLStatusUpdater () { |
26 // DataSource for CRWSSLStatusUpdater. | 25 // DataSource for CRWSSLStatusUpdater. |
27 base::WeakNSProtocol<id<CRWSSLStatusUpdaterDataSource>> _dataSource; | 26 __weak id<CRWSSLStatusUpdaterDataSource> _dataSource; |
28 // Backs up property of the same name. | |
29 base::WeakNSProtocol<id<CRWSSLStatusUpdaterDelegate>> _delegate; | |
30 } | 27 } |
31 | 28 |
32 // Unowned pointer to web::NavigationManager. | 29 // Unowned pointer to web::NavigationManager. |
33 @property(nonatomic, readonly) web::NavigationManager* navigationManager; | 30 @property(nonatomic, readonly) web::NavigationManager* navigationManager; |
34 | 31 |
35 // Updates |security_style| and |cert_status| for the NavigationItem with ID | 32 // Updates |security_style| and |cert_status| for the NavigationItem with ID |
36 // |navigationItemID|, if URL and certificate chain still match |host| and | 33 // |navigationItemID|, if URL and certificate chain still match |host| and |
37 // |certChain|. | 34 // |certChain|. |
38 - (void)updateSSLStatusForItemWithID:(int)navigationItemID | 35 - (void)updateSSLStatusForItemWithID:(int)navigationItemID |
39 trust:(ScopedCFTypeRef<SecTrustRef>)trust | 36 trust:(ScopedCFTypeRef<SecTrustRef>)trust |
40 host:(NSString*)host | 37 host:(NSString*)host |
41 withSecurityStyle:(SecurityStyle)style | 38 withSecurityStyle:(SecurityStyle)style |
42 certStatus:(CertStatus)certStatus; | 39 certStatus:(CertStatus)certStatus; |
43 | 40 |
44 // Asynchronously obtains SSL status from given |secTrust| and |host| and | 41 // Asynchronously obtains SSL status from given |secTrust| and |host| and |
45 // updates current navigation item. Before scheduling update changes SSLStatus' | 42 // updates current navigation item. Before scheduling update changes SSLStatus' |
46 // cert_status and security_style to default. | 43 // cert_status and security_style to default. |
47 - (void)scheduleSSLStatusUpdateUsingTrust:(ScopedCFTypeRef<SecTrustRef>)trust | 44 - (void)scheduleSSLStatusUpdateUsingTrust:(ScopedCFTypeRef<SecTrustRef>)trust |
48 host:(NSString*)host; | 45 host:(NSString*)host; |
49 | 46 |
50 // Notifies delegate about SSLStatus change. | 47 // Notifies delegate about SSLStatus change. |
51 - (void)didChangeSSLStatusForNavigationItem:(web::NavigationItem*)navItem; | 48 - (void)didChangeSSLStatusForNavigationItem:(web::NavigationItem*)navItem; |
52 | 49 |
53 @end | 50 @end |
54 | 51 |
55 @implementation CRWSSLStatusUpdater | 52 @implementation CRWSSLStatusUpdater |
56 @synthesize navigationManager = _navigationManager; | 53 @synthesize navigationManager = _navigationManager; |
| 54 @synthesize delegate = _delegate; |
57 | 55 |
58 #pragma mark - Public | 56 #pragma mark - Public |
59 | 57 |
60 - (instancetype)initWithDataSource:(id<CRWSSLStatusUpdaterDataSource>)dataSource | 58 - (instancetype)initWithDataSource:(id<CRWSSLStatusUpdaterDataSource>)dataSource |
61 navigationManager:(web::NavigationManager*)navigationManager { | 59 navigationManager:(web::NavigationManager*)navigationManager { |
62 DCHECK(dataSource); | 60 DCHECK(dataSource); |
63 DCHECK(navigationManager); | 61 DCHECK(navigationManager); |
64 if (self = [super init]) { | 62 if (self = [super init]) { |
65 _dataSource.reset(dataSource); | 63 _dataSource = dataSource; |
66 _navigationManager = navigationManager; | 64 _navigationManager = navigationManager; |
67 } | 65 } |
68 return self; | 66 return self; |
69 } | 67 } |
70 | 68 |
71 - (id<CRWSSLStatusUpdaterDelegate>)delegate { | |
72 return _delegate.get(); | |
73 } | |
74 | |
75 - (void)setDelegate:(id<CRWSSLStatusUpdaterDelegate>)delegate { | |
76 _delegate.reset(delegate); | |
77 } | |
78 | |
79 - (void)updateSSLStatusForNavigationItem:(web::NavigationItem*)item | 69 - (void)updateSSLStatusForNavigationItem:(web::NavigationItem*)item |
80 withCertHost:(NSString*)host | 70 withCertHost:(NSString*)host |
81 trust:(ScopedCFTypeRef<SecTrustRef>)trust | 71 trust:(ScopedCFTypeRef<SecTrustRef>)trust |
82 hasOnlySecureContent:(BOOL)hasOnlySecureContent { | 72 hasOnlySecureContent:(BOOL)hasOnlySecureContent { |
83 web::SSLStatus previousSSLStatus = item->GetSSL(); | 73 web::SSLStatus previousSSLStatus = item->GetSSL(); |
84 | 74 |
85 // Starting from iOS9 WKWebView blocks active mixed content, so if | 75 // Starting from iOS9 WKWebView blocks active mixed content, so if |
86 // |hasOnlySecureContent| returns NO it means passive content. | 76 // |hasOnlySecureContent| returns NO it means passive content. |
87 item->GetSSL().content_status = | 77 item->GetSSL().content_status = |
88 hasOnlySecureContent ? web::SSLStatus::NORMAL_CONTENT | 78 hasOnlySecureContent ? web::SSLStatus::NORMAL_CONTENT |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 } | 151 } |
162 } | 152 } |
163 | 153 |
164 - (void)scheduleSSLStatusUpdateUsingTrust:(ScopedCFTypeRef<SecTrustRef>)trust | 154 - (void)scheduleSSLStatusUpdateUsingTrust:(ScopedCFTypeRef<SecTrustRef>)trust |
165 host:(NSString*)host { | 155 host:(NSString*)host { |
166 // Use Navigation Item's unique ID to locate requested item after | 156 // Use Navigation Item's unique ID to locate requested item after |
167 // obtaining cert status asynchronously. | 157 // obtaining cert status asynchronously. |
168 int itemID = _navigationManager->GetLastCommittedItem()->GetUniqueID(); | 158 int itemID = _navigationManager->GetLastCommittedItem()->GetUniqueID(); |
169 | 159 |
170 DCHECK(_dataSource); | 160 DCHECK(_dataSource); |
171 base::WeakNSObject<CRWSSLStatusUpdater> weakSelf(self); | 161 __weak CRWSSLStatusUpdater* weakSelf = self; |
172 [_dataSource SSLStatusUpdater:self | 162 [_dataSource SSLStatusUpdater:self |
173 querySSLStatusForTrust:trust | 163 querySSLStatusForTrust:trust |
174 host:host | 164 host:host |
175 completionHandler:^(SecurityStyle style, CertStatus certStatus) { | 165 completionHandler:^(SecurityStyle style, CertStatus certStatus) { |
176 [weakSelf updateSSLStatusForItemWithID:itemID | 166 [weakSelf updateSSLStatusForItemWithID:itemID |
177 trust:std::move(trust) | 167 trust:std::move(trust) |
178 host:host | 168 host:host |
179 withSecurityStyle:style | 169 withSecurityStyle:style |
180 certStatus:certStatus]; | 170 certStatus:certStatus]; |
181 }]; | 171 }]; |
182 } | 172 } |
183 | 173 |
184 - (void)didChangeSSLStatusForNavigationItem:(web::NavigationItem*)navItem { | 174 - (void)didChangeSSLStatusForNavigationItem:(web::NavigationItem*)navItem { |
185 if ([_delegate respondsToSelector: | 175 if ([_delegate respondsToSelector: |
186 @selector(SSLStatusUpdater:didChangeSSLStatusForNavigationItem:)]) { | 176 @selector(SSLStatusUpdater:didChangeSSLStatusForNavigationItem:)]) { |
187 [_delegate SSLStatusUpdater:self | 177 [_delegate SSLStatusUpdater:self |
188 didChangeSSLStatusForNavigationItem:navItem]; | 178 didChangeSSLStatusForNavigationItem:navItem]; |
189 } | 179 } |
190 } | 180 } |
191 | 181 |
192 @end | 182 @end |
OLD | NEW |