Chromium Code Reviews| 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 #include "platform/feature_policy/FeaturePolicy.h" | 5 #include "platform/feature_policy/FeaturePolicy.h" |
| 6 | 6 |
| 7 #include "platform/RuntimeEnabledFeatures.h" | 7 #include "platform/RuntimeEnabledFeatures.h" |
| 8 #include "platform/json/JSONValues.h" | 8 #include "platform/json/JSONValues.h" |
| 9 #include "platform/network/HTTPParsers.h" | 9 #include "platform/network/HTTPParsers.h" |
| 10 #include "platform/weborigin/SecurityOrigin.h" | 10 #include "platform/weborigin/SecurityOrigin.h" |
| 11 #include "platform/wtf/PtrUtil.h" | 11 #include "platform/wtf/PtrUtil.h" |
| 12 | 12 |
| 13 namespace blink { | 13 namespace blink { |
| 14 | 14 |
| 15 namespace { | |
| 16 | |
| 17 void AddAllowFeatureToList( | |
| 18 WebFeaturePolicyFeature feature, | |
| 19 Vector<WebParsedFeaturePolicyDeclaration>& whitelists) { | |
| 20 WebParsedFeaturePolicyDeclaration whitelist; | |
| 21 whitelist.feature = feature; | |
| 22 whitelist.matches_all_origins = true; | |
| 23 whitelists.push_back(whitelist); | |
| 24 } | |
| 25 | |
| 26 void OverridePolicy(int index, | |
| 27 Vector<WebParsedFeaturePolicyDeclaration>& whitelists, | |
| 28 RefPtr<SecurityOrigin> origin) { | |
| 29 whitelists[index].matches_all_origins = false; | |
| 30 whitelists[index].origins = Vector<WebSecurityOrigin>(1UL, {origin}); | |
| 31 } | |
| 32 | |
| 33 } // namespace | |
| 34 | |
| 15 WebParsedFeaturePolicy ParseFeaturePolicy(const String& policy, | 35 WebParsedFeaturePolicy ParseFeaturePolicy(const String& policy, |
| 16 RefPtr<SecurityOrigin> origin, | 36 RefPtr<SecurityOrigin> origin, |
| 17 Vector<String>* messages) { | 37 Vector<String>* messages) { |
| 18 return ParseFeaturePolicy(policy, origin, messages, | 38 return ParseFeaturePolicy(policy, origin, messages, |
| 19 GetDefaultFeatureNameMap()); | 39 GetDefaultFeatureNameMap()); |
| 20 } | 40 } |
| 21 | 41 |
| 22 WebParsedFeaturePolicy ParseFeaturePolicy(const String& policy, | 42 WebParsedFeaturePolicy ParseFeaturePolicy(const String& policy, |
| 23 RefPtr<SecurityOrigin> origin, | 43 RefPtr<SecurityOrigin> origin, |
| 24 Vector<String>* messages, | 44 Vector<String>* messages, |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 54 messages->push_back("Whitelist is not an array of strings."); | 74 messages->push_back("Whitelist is not an array of strings."); |
| 55 continue; | 75 continue; |
| 56 } | 76 } |
| 57 | 77 |
| 58 WebParsedFeaturePolicyDeclaration whitelist; | 78 WebParsedFeaturePolicyDeclaration whitelist; |
| 59 whitelist.feature = feature; | 79 whitelist.feature = feature; |
| 60 Vector<WebSecurityOrigin> origins; | 80 Vector<WebSecurityOrigin> origins; |
| 61 String target_string; | 81 String target_string; |
| 62 for (size_t j = 0; j < targets->size(); ++j) { | 82 for (size_t j = 0; j < targets->size(); ++j) { |
| 63 if (targets->at(j)->AsString(&target_string)) { | 83 if (targets->at(j)->AsString(&target_string)) { |
| 64 if (DeprecatedEqualIgnoringCase(target_string, "self")) { | 84 if (DeprecatedEqualIgnoringCase(target_string, "self")) { |
|
iclelland
2017/04/25 17:19:54
Is there a simple replacement for the recently-dep
lunalu1
2017/04/25 18:31:42
Replaced by EqualIgnoringASCIICase
| |
| 65 if (!origin->IsUnique()) | 85 if (!origin->IsUnique()) |
| 66 origins.push_back(origin); | 86 origins.push_back(origin); |
| 67 } else if (target_string == "*") { | 87 } else if (target_string == "*") { |
| 68 whitelist.matches_all_origins = true; | 88 whitelist.matches_all_origins = true; |
| 69 } else { | 89 } else { |
| 70 WebSecurityOrigin target_origin = | 90 WebSecurityOrigin target_origin = |
| 71 WebSecurityOrigin::CreateFromString(target_string); | 91 WebSecurityOrigin::CreateFromString(target_string); |
| 72 if (!target_origin.IsNull() && !target_origin.IsUnique()) | 92 if (!target_origin.IsNull() && !target_origin.IsUnique()) |
| 73 origins.push_back(target_origin); | 93 origins.push_back(target_origin); |
| 74 } | 94 } |
| 75 } else { | 95 } else { |
| 76 if (messages) | 96 if (messages) |
| 77 messages->push_back("Whitelist is not an array of strings."); | 97 messages->push_back("Whitelist is not an array of strings."); |
| 78 } | 98 } |
| 79 } | 99 } |
| 80 whitelist.origins = origins; | 100 whitelist.origins = origins; |
| 81 whitelists.push_back(whitelist); | 101 whitelists.push_back(whitelist); |
| 82 } | 102 } |
| 83 } | 103 } |
| 84 return whitelists; | 104 return whitelists; |
| 85 } | 105 } |
| 86 | 106 |
| 87 // TODO(lunalu): also take information of allowfullscreen and | |
| 88 // allowpaymentrequest into account when constructing the whitelist. | |
| 89 WebParsedFeaturePolicy GetContainerPolicyFromAllowedFeatures( | 107 WebParsedFeaturePolicy GetContainerPolicyFromAllowedFeatures( |
| 90 const WebVector<WebFeaturePolicyFeature>& features, | 108 const WebVector<WebFeaturePolicyFeature>& features, |
| 109 bool allowfullscreen, | |
| 110 bool allowpayment, | |
| 91 RefPtr<SecurityOrigin> origin) { | 111 RefPtr<SecurityOrigin> origin) { |
| 92 Vector<WebParsedFeaturePolicyDeclaration> whitelists; | 112 Vector<WebParsedFeaturePolicyDeclaration> whitelists; |
| 113 // If allowfullscreen attribute is present, enable the feature for all | |
|
iclelland
2017/04/25 17:19:55
I still think we could make this simpler -- could
| |
| 114 // origins; similarly for allowpaymentrequest. | |
| 115 if (allowpayment) | |
| 116 AddAllowFeatureToList(WebFeaturePolicyFeature::kPayment, whitelists); | |
| 117 if (allowfullscreen) | |
| 118 AddAllowFeatureToList(WebFeaturePolicyFeature::kFullscreen, whitelists); | |
| 119 bool should_override_payment_policy = false; | |
| 120 bool should_override_fullscreen_policy = false; | |
| 93 for (const WebFeaturePolicyFeature feature : features) { | 121 for (const WebFeaturePolicyFeature feature : features) { |
| 122 // Container policy should override "allowfullscreen" and | |
| 123 // "allowpaymentrequest" policies. | |
| 124 if (allowpayment && feature == WebFeaturePolicyFeature::kPayment) { | |
| 125 should_override_payment_policy = true; | |
| 126 continue; | |
| 127 } | |
| 128 if (allowfullscreen && feature == WebFeaturePolicyFeature::kFullscreen) { | |
| 129 should_override_fullscreen_policy = true; | |
| 130 continue; | |
| 131 } | |
| 94 WebParsedFeaturePolicyDeclaration whitelist; | 132 WebParsedFeaturePolicyDeclaration whitelist; |
| 95 whitelist.feature = feature; | 133 whitelist.feature = feature; |
| 96 whitelist.origins = Vector<WebSecurityOrigin>(1UL, {origin}); | 134 whitelist.origins = Vector<WebSecurityOrigin>(1UL, {origin}); |
| 97 whitelists.push_back(whitelist); | 135 whitelists.push_back(whitelist); |
| 98 } | 136 } |
| 137 if (should_override_payment_policy) { | |
| 138 OverridePolicy(0, whitelists, origin); | |
| 139 } | |
| 140 if (should_override_fullscreen_policy) { | |
| 141 // Index for fullscreen policy is 1 if payment policy exists in the | |
| 142 // whitelists; 0 otherwise. | |
| 143 OverridePolicy(allowpayment ? 1 : 0, whitelists, origin); | |
| 144 } | |
| 145 | |
| 99 return whitelists; | 146 return whitelists; |
| 100 } | 147 } |
| 101 | 148 |
| 102 const FeatureNameMap& GetDefaultFeatureNameMap() { | 149 const FeatureNameMap& GetDefaultFeatureNameMap() { |
| 103 DEFINE_STATIC_LOCAL(FeatureNameMap, default_feature_name_map, ()); | 150 DEFINE_STATIC_LOCAL(FeatureNameMap, default_feature_name_map, ()); |
| 104 if (default_feature_name_map.IsEmpty()) { | 151 if (default_feature_name_map.IsEmpty()) { |
| 105 default_feature_name_map.Set("fullscreen", | 152 default_feature_name_map.Set("fullscreen", |
| 106 WebFeaturePolicyFeature::kFullscreen); | 153 WebFeaturePolicyFeature::kFullscreen); |
| 107 default_feature_name_map.Set("payment", WebFeaturePolicyFeature::kPayment); | 154 default_feature_name_map.Set("payment", WebFeaturePolicyFeature::kPayment); |
| 108 if (RuntimeEnabledFeatures::featurePolicyExperimentalFeaturesEnabled()) { | 155 if (RuntimeEnabledFeatures::featurePolicyExperimentalFeaturesEnabled()) { |
| 109 default_feature_name_map.Set("vibrate", | 156 default_feature_name_map.Set("vibrate", |
| 110 WebFeaturePolicyFeature::kVibrate); | 157 WebFeaturePolicyFeature::kVibrate); |
| 111 default_feature_name_map.Set("camera", WebFeaturePolicyFeature::kCamera); | 158 default_feature_name_map.Set("camera", WebFeaturePolicyFeature::kCamera); |
| 112 default_feature_name_map.Set("eme", WebFeaturePolicyFeature::kEme); | 159 default_feature_name_map.Set("eme", WebFeaturePolicyFeature::kEme); |
|
iclelland
2017/04/25 17:19:55
This one is new with this CL -- ddorwin@ asked for
| |
| 113 default_feature_name_map.Set("microphone", | 160 default_feature_name_map.Set("microphone", |
| 114 WebFeaturePolicyFeature::kMicrophone); | 161 WebFeaturePolicyFeature::kMicrophone); |
| 115 default_feature_name_map.Set("speaker", | 162 default_feature_name_map.Set("speaker", |
| 116 WebFeaturePolicyFeature::kSpeaker); | 163 WebFeaturePolicyFeature::kSpeaker); |
| 117 default_feature_name_map.Set("cookie", | 164 default_feature_name_map.Set("cookie", |
| 118 WebFeaturePolicyFeature::kDocumentCookie); | 165 WebFeaturePolicyFeature::kDocumentCookie); |
| 119 default_feature_name_map.Set("domain", | 166 default_feature_name_map.Set("domain", |
| 120 WebFeaturePolicyFeature::kDocumentDomain); | 167 WebFeaturePolicyFeature::kDocumentDomain); |
| 121 default_feature_name_map.Set("docwrit", | 168 default_feature_name_map.Set("docwrit", |
|
iclelland
2017/04/25 17:19:55
typo: "docwrite"
| |
| 122 WebFeaturePolicyFeature::kDocumentWrite); | 169 WebFeaturePolicyFeature::kDocumentWrite); |
| 123 default_feature_name_map.Set("geolocation", | 170 default_feature_name_map.Set("geolocation", |
| 124 WebFeaturePolicyFeature::kGeolocation); | 171 WebFeaturePolicyFeature::kGeolocation); |
| 125 default_feature_name_map.Set("midi", | 172 default_feature_name_map.Set("midi", |
| 126 WebFeaturePolicyFeature::kMidiFeature); | 173 WebFeaturePolicyFeature::kMidiFeature); |
| 127 default_feature_name_map.Set("notifications", | 174 default_feature_name_map.Set("notifications", |
| 128 WebFeaturePolicyFeature::kNotifications); | 175 WebFeaturePolicyFeature::kNotifications); |
| 129 default_feature_name_map.Set("push", WebFeaturePolicyFeature::kPush); | 176 default_feature_name_map.Set("push", WebFeaturePolicyFeature::kPush); |
| 130 default_feature_name_map.Set("sync-script", | 177 default_feature_name_map.Set("sync-script", |
| 131 WebFeaturePolicyFeature::kSyncScript); | 178 WebFeaturePolicyFeature::kSyncScript); |
| 132 default_feature_name_map.Set("sync-xhr", | 179 default_feature_name_map.Set("sync-xhr", |
| 133 WebFeaturePolicyFeature::kSyncXHR); | 180 WebFeaturePolicyFeature::kSyncXHR); |
| 134 default_feature_name_map.Set("webrtc", WebFeaturePolicyFeature::kWebRTC); | 181 default_feature_name_map.Set("webrtc", WebFeaturePolicyFeature::kWebRTC); |
| 135 } | 182 } |
| 136 } | 183 } |
| 137 return default_feature_name_map; | 184 return default_feature_name_map; |
| 138 } | 185 } |
| 139 | 186 |
| 140 } // namespace blink | 187 } // namespace blink |
| OLD | NEW |