[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 1 | // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
[email protected] | 9d45049 | 2013-06-13 23:08:37 | [diff] [blame] | 5 | #include "chrome/common/pepper_permission_util.h" |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 6 | |
| 7 | #include <vector> |
| 8 | |
| 9 | #include "base/command_line.h" |
| 10 | #include "base/sha1.h" |
| 11 | #include "base/strings/string_number_conversions.h" |
| 12 | #include "base/strings/string_tokenizer.h" |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 13 | #include "extensions/common/constants.h" |
[email protected] | e4452d3 | 2013-11-15 23:07:41 | [diff] [blame] | 14 | #include "extensions/common/extension.h" |
[email protected] | 289c44b | 2013-12-17 03:26:57 | [diff] [blame] | 15 | #include "extensions/common/extension_set.h" |
[email protected] | 301116c6 | 2013-11-26 10:37:45 | [diff] [blame] | 16 | #include "extensions/common/manifest_handlers/shared_module_info.h" |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 17 | |
| 18 | using extensions::Extension; |
| 19 | using extensions::Manifest; |
[email protected] | b0b1fbc | 2014-05-10 19:58:29 | [diff] [blame] | 20 | using extensions::SharedModuleInfo; |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 21 | |
| 22 | namespace chrome { |
| 23 | |
| 24 | namespace { |
| 25 | |
| 26 | std::string HashHost(const std::string& host) { |
| 27 | const std::string id_hash = base::SHA1HashString(host); |
| 28 | DCHECK_EQ(id_hash.length(), base::kSHA1Length); |
| 29 | return base::HexEncode(id_hash.c_str(), id_hash.length()); |
| 30 | } |
| 31 | |
| 32 | bool HostIsInSet(const std::string& host, const std::set<std::string>& set) { |
| 33 | return set.count(host) > 0 || set.count(HashHost(host)) > 0; |
| 34 | } |
| 35 | |
| 36 | } // namespace |
| 37 | |
| 38 | bool IsExtensionOrSharedModuleWhitelisted( |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 39 | const GURL& url, |
[email protected] | 289c44b | 2013-12-17 03:26:57 | [diff] [blame] | 40 | const extensions::ExtensionSet* extension_set, |
[email protected] | dda5482 | 2013-06-15 01:26:39 | [diff] [blame] | 41 | const std::set<std::string>& whitelist) { |
| 42 | if (!url.is_valid() || !url.SchemeIs(extensions::kExtensionScheme)) |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 43 | return false; |
| 44 | |
[email protected] | dda5482 | 2013-06-15 01:26:39 | [diff] [blame] | 45 | const std::string host = url.host(); |
| 46 | if (HostIsInSet(host, whitelist)) |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 47 | return true; |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 48 | |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 49 | // Check the modules that are imported by this extension to see if any of them |
| 50 | // is whitelisted. |
[email protected] | 9d45049 | 2013-06-13 23:08:37 | [diff] [blame] | 51 | const Extension* extension = extension_set ? extension_set->GetByID(host) |
| 52 | : NULL; |
[email protected] | b0b1fbc | 2014-05-10 19:58:29 | [diff] [blame] | 53 | if (!extension) |
| 54 | return false; |
| 55 | |
| 56 | typedef std::vector<SharedModuleInfo::ImportInfo> ImportInfoVector; |
| 57 | const ImportInfoVector& imports = SharedModuleInfo::GetImports(extension); |
| 58 | for (ImportInfoVector::const_iterator it = imports.begin(); |
| 59 | it != imports.end(); |
| 60 | ++it) { |
| 61 | const Extension* imported_extension = |
| 62 | extension_set->GetByID(it->extension_id); |
| 63 | if (imported_extension && |
| 64 | SharedModuleInfo::IsSharedModule(imported_extension) && |
[email protected] | b0b1fbc | 2014-05-10 19:58:29 | [diff] [blame] | 65 | HostIsInSet(it->extension_id, whitelist)) { |
| 66 | return true; |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 67 | } |
| 68 | } |
| 69 | |
[email protected] | dda5482 | 2013-06-15 01:26:39 | [diff] [blame] | 70 | return false; |
| 71 | } |
| 72 | |
| 73 | bool IsHostAllowedByCommandLine(const GURL& url, |
[email protected] | 289c44b | 2013-12-17 03:26:57 | [diff] [blame] | 74 | const extensions::ExtensionSet* extension_set, |
[email protected] | dda5482 | 2013-06-15 01:26:39 | [diff] [blame] | 75 | const char* command_line_switch) { |
| 76 | if (!url.is_valid()) |
| 77 | return false; |
| 78 | |
avi | 79bf913 | 2014-12-25 17:48:05 | [diff] [blame] | 79 | const base::CommandLine& command_line = |
| 80 | *base::CommandLine::ForCurrentProcess(); |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 81 | const std::string allowed_list = |
| 82 | command_line.GetSwitchValueASCII(command_line_switch); |
[email protected] | dda5482 | 2013-06-15 01:26:39 | [diff] [blame] | 83 | if (allowed_list.empty()) |
| 84 | return false; |
| 85 | |
| 86 | const std::string host = url.host(); |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 87 | if (allowed_list == "*") { |
[email protected] | 9d45049 | 2013-06-13 23:08:37 | [diff] [blame] | 88 | // For now, we only allow packaged and platform apps in this wildcard. |
[email protected] | dda5482 | 2013-06-15 01:26:39 | [diff] [blame] | 89 | if (!extension_set || !url.SchemeIs(extensions::kExtensionScheme)) |
| 90 | return false; |
| 91 | |
| 92 | const Extension* extension = extension_set->GetByID(host); |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 93 | return extension && |
| 94 | (extension->GetType() == Manifest::TYPE_LEGACY_PACKAGED_APP || |
| 95 | extension->GetType() == Manifest::TYPE_PLATFORM_APP); |
| 96 | } |
| 97 | |
[email protected] | dda5482 | 2013-06-15 01:26:39 | [diff] [blame] | 98 | base::StringTokenizer t(allowed_list, ","); |
| 99 | while (t.GetNext()) { |
| 100 | if (t.token() == host) |
| 101 | return true; |
[email protected] | 93f7206 | 2013-05-29 20:29:40 | [diff] [blame] | 102 | } |
| 103 | |
| 104 | return false; |
| 105 | } |
| 106 | |
| 107 | } // namespace chrome |