| OLD | NEW | 
|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "extensions/common/permissions/permissions_data.h" | 5 #include "extensions/common/permissions/permissions_data.h" | 
| 6 | 6 | 
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" | 
| 8 #include "content/public/common/url_constants.h" | 8 #include "content/public/common/url_constants.h" | 
| 9 #include "extensions/common/constants.h" | 9 #include "extensions/common/constants.h" | 
| 10 #include "extensions/common/error_utils.h" | 10 #include "extensions/common/error_utils.h" | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 76 } | 76 } | 
| 77 | 77 | 
| 78 bool PermissionsData::ShouldSkipPermissionWarnings( | 78 bool PermissionsData::ShouldSkipPermissionWarnings( | 
| 79     const std::string& extension_id) { | 79     const std::string& extension_id) { | 
| 80   // See http://b/4946060 for more details. | 80   // See http://b/4946060 for more details. | 
| 81   return extension_id == std::string("nckgahadagoaajjgafhacjanaoiihapd"); | 81   return extension_id == std::string("nckgahadagoaajjgafhacjanaoiihapd"); | 
| 82 } | 82 } | 
| 83 | 83 | 
| 84 // static | 84 // static | 
| 85 bool PermissionsData::IsRestrictedUrl(const GURL& document_url, | 85 bool PermissionsData::IsRestrictedUrl(const GURL& document_url, | 
| 86                                       const GURL& top_frame_url, |  | 
| 87                                       const Extension* extension, | 86                                       const Extension* extension, | 
| 88                                       std::string* error) { | 87                                       std::string* error) { | 
| 89   if (extension && CanExecuteScriptEverywhere(extension)) | 88   if (extension && CanExecuteScriptEverywhere(extension)) | 
| 90     return false; | 89     return false; | 
| 91 | 90 | 
| 92   // Check if the scheme is valid for extensions. If not, return. | 91   // Check if the scheme is valid for extensions. If not, return. | 
| 93   if (!URLPattern::IsValidSchemeForExtensions(document_url.scheme()) && | 92   if (!URLPattern::IsValidSchemeForExtensions(document_url.scheme()) && | 
| 94       document_url.spec() != url::kAboutBlankURL) { | 93       document_url.spec() != url::kAboutBlankURL) { | 
| 95     if (error) { | 94     if (error) { | 
| 96       *error = ErrorUtils::FormatErrorMessage( | 95       *error = ErrorUtils::FormatErrorMessage( | 
| 97                    manifest_errors::kCannotAccessPage, | 96                    manifest_errors::kCannotAccessPage, | 
| 98                    document_url.spec()); | 97                    document_url.spec()); | 
| 99     } | 98     } | 
| 100     return true; | 99     return true; | 
| 101   } | 100   } | 
| 102 | 101 | 
| 103   if (!ExtensionsClient::Get()->IsScriptableURL(document_url, error)) | 102   if (!ExtensionsClient::Get()->IsScriptableURL(document_url, error)) | 
| 104     return true; | 103     return true; | 
| 105 | 104 | 
| 106   bool allow_on_chrome_urls = base::CommandLine::ForCurrentProcess()->HasSwitch( | 105   bool allow_on_chrome_urls = base::CommandLine::ForCurrentProcess()->HasSwitch( | 
| 107                                   switches::kExtensionsOnChromeURLs); | 106                                   switches::kExtensionsOnChromeURLs); | 
| 108   if (document_url.SchemeIs(content::kChromeUIScheme) && | 107   if (document_url.SchemeIs(content::kChromeUIScheme) && | 
| 109       !allow_on_chrome_urls) { | 108       !allow_on_chrome_urls) { | 
| 110     if (error) | 109     if (error) | 
| 111       *error = manifest_errors::kCannotAccessChromeUrl; | 110       *error = manifest_errors::kCannotAccessChromeUrl; | 
| 112     return true; | 111     return true; | 
| 113   } | 112   } | 
| 114 | 113 | 
| 115   if (extension && top_frame_url.SchemeIs(kExtensionScheme) && | 114   if (extension && document_url.SchemeIs(kExtensionScheme) && | 
| 116       top_frame_url.host() != extension->id() && !allow_on_chrome_urls) { | 115       document_url.host() != extension->id() && !allow_on_chrome_urls) { | 
| 117     if (error) | 116     if (error) | 
| 118       *error = manifest_errors::kCannotAccessExtensionUrl; | 117       *error = manifest_errors::kCannotAccessExtensionUrl; | 
| 119     return true; | 118     return true; | 
| 120   } | 119   } | 
| 121 | 120 | 
| 122   return false; | 121   return false; | 
| 123 } | 122 } | 
| 124 | 123 | 
| 125 void PermissionsData::SetPermissions( | 124 void PermissionsData::SetPermissions( | 
| 126     const scoped_refptr<const PermissionSet>& active, | 125     const scoped_refptr<const PermissionSet>& active, | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 220 | 219 | 
| 221 bool PermissionsData::HasWithheldImpliedAllHosts() const { | 220 bool PermissionsData::HasWithheldImpliedAllHosts() const { | 
| 222   // Since we currently only withhold all_hosts, it's sufficient to check | 221   // Since we currently only withhold all_hosts, it's sufficient to check | 
| 223   // that either set is not empty. | 222   // that either set is not empty. | 
| 224   return !withheld_permissions()->explicit_hosts().is_empty() || | 223   return !withheld_permissions()->explicit_hosts().is_empty() || | 
| 225          !withheld_permissions()->scriptable_hosts().is_empty(); | 224          !withheld_permissions()->scriptable_hosts().is_empty(); | 
| 226 } | 225 } | 
| 227 | 226 | 
| 228 bool PermissionsData::CanAccessPage(const Extension* extension, | 227 bool PermissionsData::CanAccessPage(const Extension* extension, | 
| 229                                     const GURL& document_url, | 228                                     const GURL& document_url, | 
| 230                                     const GURL& top_frame_url, |  | 
| 231                                     int tab_id, | 229                                     int tab_id, | 
| 232                                     int process_id, | 230                                     int process_id, | 
| 233                                     std::string* error) const { | 231                                     std::string* error) const { | 
| 234   AccessType result = CanRunOnPage(extension, | 232   AccessType result = CanRunOnPage(extension, | 
| 235                                    document_url, | 233                                    document_url, | 
| 236                                    top_frame_url, |  | 
| 237                                    tab_id, | 234                                    tab_id, | 
| 238                                    process_id, | 235                                    process_id, | 
| 239                                    active_permissions()->explicit_hosts(), | 236                                    active_permissions()->explicit_hosts(), | 
| 240                                    withheld_permissions()->explicit_hosts(), | 237                                    withheld_permissions()->explicit_hosts(), | 
| 241                                    error); | 238                                    error); | 
| 242   // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. | 239   // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. | 
| 243   return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD; | 240   return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD; | 
| 244 } | 241 } | 
| 245 | 242 | 
| 246 PermissionsData::AccessType PermissionsData::GetPageAccess( | 243 PermissionsData::AccessType PermissionsData::GetPageAccess( | 
| 247     const Extension* extension, | 244     const Extension* extension, | 
| 248     const GURL& document_url, | 245     const GURL& document_url, | 
| 249     const GURL& top_frame_url, |  | 
| 250     int tab_id, | 246     int tab_id, | 
| 251     int process_id, | 247     int process_id, | 
| 252     std::string* error) const { | 248     std::string* error) const { | 
| 253   return CanRunOnPage(extension, | 249   return CanRunOnPage(extension, | 
| 254                       document_url, | 250                       document_url, | 
| 255                       top_frame_url, |  | 
| 256                       tab_id, | 251                       tab_id, | 
| 257                       process_id, | 252                       process_id, | 
| 258                       active_permissions()->explicit_hosts(), | 253                       active_permissions()->explicit_hosts(), | 
| 259                       withheld_permissions()->explicit_hosts(), | 254                       withheld_permissions()->explicit_hosts(), | 
| 260                       error); | 255                       error); | 
| 261 } | 256 } | 
| 262 | 257 | 
| 263 bool PermissionsData::CanRunContentScriptOnPage(const Extension* extension, | 258 bool PermissionsData::CanRunContentScriptOnPage(const Extension* extension, | 
| 264                                                 const GURL& document_url, | 259                                                 const GURL& document_url, | 
| 265                                                 const GURL& top_frame_url, |  | 
| 266                                                 int tab_id, | 260                                                 int tab_id, | 
| 267                                                 int process_id, | 261                                                 int process_id, | 
| 268                                                 std::string* error) const { | 262                                                 std::string* error) const { | 
| 269   AccessType result = CanRunOnPage(extension, | 263   AccessType result = CanRunOnPage(extension, | 
| 270                                    document_url, | 264                                    document_url, | 
| 271                                    top_frame_url, |  | 
| 272                                    tab_id, | 265                                    tab_id, | 
| 273                                    process_id, | 266                                    process_id, | 
| 274                                    active_permissions()->scriptable_hosts(), | 267                                    active_permissions()->scriptable_hosts(), | 
| 275                                    withheld_permissions()->scriptable_hosts(), | 268                                    withheld_permissions()->scriptable_hosts(), | 
| 276                                    error); | 269                                    error); | 
| 277   // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. | 270   // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. | 
| 278   return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD; | 271   return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD; | 
| 279 } | 272 } | 
| 280 | 273 | 
| 281 PermissionsData::AccessType PermissionsData::GetContentScriptAccess( | 274 PermissionsData::AccessType PermissionsData::GetContentScriptAccess( | 
| 282     const Extension* extension, | 275     const Extension* extension, | 
| 283     const GURL& document_url, | 276     const GURL& document_url, | 
| 284     const GURL& top_frame_url, |  | 
| 285     int tab_id, | 277     int tab_id, | 
| 286     int process_id, | 278     int process_id, | 
| 287     std::string* error) const { | 279     std::string* error) const { | 
| 288   return CanRunOnPage(extension, | 280   return CanRunOnPage(extension, | 
| 289                       document_url, | 281                       document_url, | 
| 290                       top_frame_url, |  | 
| 291                       tab_id, | 282                       tab_id, | 
| 292                       process_id, | 283                       process_id, | 
| 293                       active_permissions()->scriptable_hosts(), | 284                       active_permissions()->scriptable_hosts(), | 
| 294                       withheld_permissions()->scriptable_hosts(), | 285                       withheld_permissions()->scriptable_hosts(), | 
| 295                       error); | 286                       error); | 
| 296 } | 287 } | 
| 297 | 288 | 
| 298 bool PermissionsData::CanCaptureVisiblePage(int tab_id, | 289 bool PermissionsData::CanCaptureVisiblePage(int tab_id, | 
| 299                                             std::string* error) const { | 290                                             std::string* error) const { | 
| 300   const URLPattern all_urls(URLPattern::SCHEME_ALL, | 291   const URLPattern all_urls(URLPattern::SCHEME_ALL, | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 345         tab_permissions->explicit_hosts().MatchesSecurityOrigin(url)) { | 336         tab_permissions->explicit_hosts().MatchesSecurityOrigin(url)) { | 
| 346       return true; | 337       return true; | 
| 347     } | 338     } | 
| 348   } | 339   } | 
| 349   return false; | 340   return false; | 
| 350 } | 341 } | 
| 351 | 342 | 
| 352 PermissionsData::AccessType PermissionsData::CanRunOnPage( | 343 PermissionsData::AccessType PermissionsData::CanRunOnPage( | 
| 353     const Extension* extension, | 344     const Extension* extension, | 
| 354     const GURL& document_url, | 345     const GURL& document_url, | 
| 355     const GURL& top_frame_url, |  | 
| 356     int tab_id, | 346     int tab_id, | 
| 357     int process_id, | 347     int process_id, | 
| 358     const URLPatternSet& permitted_url_patterns, | 348     const URLPatternSet& permitted_url_patterns, | 
| 359     const URLPatternSet& withheld_url_patterns, | 349     const URLPatternSet& withheld_url_patterns, | 
| 360     std::string* error) const { | 350     std::string* error) const { | 
| 361   if (g_policy_delegate && | 351   if (g_policy_delegate && | 
| 362       !g_policy_delegate->CanExecuteScriptOnPage( | 352       !g_policy_delegate->CanExecuteScriptOnPage( | 
| 363           extension, document_url, top_frame_url, tab_id, process_id, error)) { | 353           extension, document_url, tab_id, process_id, error)) { | 
| 364     return ACCESS_DENIED; | 354     return ACCESS_DENIED; | 
| 365   } | 355   } | 
| 366 | 356 | 
| 367   if (IsRestrictedUrl(document_url, top_frame_url, extension, error)) | 357   if (IsRestrictedUrl(document_url, extension, error)) | 
| 368     return ACCESS_DENIED; | 358     return ACCESS_DENIED; | 
| 369 | 359 | 
| 370   if (HasTabSpecificPermissionToExecuteScript(tab_id, top_frame_url)) | 360   if (HasTabSpecificPermissionToExecuteScript(tab_id, document_url)) | 
| 371     return ACCESS_ALLOWED; | 361     return ACCESS_ALLOWED; | 
| 372 | 362 | 
| 373   if (permitted_url_patterns.MatchesURL(document_url)) | 363   if (permitted_url_patterns.MatchesURL(document_url)) | 
| 374     return ACCESS_ALLOWED; | 364     return ACCESS_ALLOWED; | 
| 375 | 365 | 
| 376   if (withheld_url_patterns.MatchesURL(document_url)) | 366   if (withheld_url_patterns.MatchesURL(document_url)) | 
| 377     return ACCESS_WITHHELD; | 367     return ACCESS_WITHHELD; | 
| 378 | 368 | 
| 379   if (error) { | 369   if (error) { | 
| 380     *error = ErrorUtils::FormatErrorMessage(manifest_errors::kCannotAccessPage, | 370     *error = ErrorUtils::FormatErrorMessage(manifest_errors::kCannotAccessPage, | 
| 381                                             document_url.spec()); | 371                                             document_url.spec()); | 
| 382   } | 372   } | 
| 383   return ACCESS_DENIED; | 373   return ACCESS_DENIED; | 
| 384 } | 374 } | 
| 385 | 375 | 
| 386 }  // namespace extensions | 376 }  // namespace extensions | 
| OLD | NEW | 
|---|