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.
5 #include "chrome/common/pepper_permission_util.h"
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"
13 #include "extensions/common/constants.h"
14 #include "extensions/common/extension.h"
15 #include "extensions/common/extension_set.h"
16 #include "extensions/common/manifest_handlers/shared_module_info.h"
18 using extensions::Extension
;
19 using extensions::Manifest
;
20 using extensions::SharedModuleInfo
;
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());
32 bool HostIsInSet(const std::string
& host
, const std::set
<std::string
>& set
) {
33 return set
.count(host
) > 0 || set
.count(HashHost(host
)) > 0;
38 bool IsExtensionOrSharedModuleWhitelisted(
40 const extensions::ExtensionSet
* extension_set
,
41 const std::set
<std::string
>& whitelist
) {
42 if (!url
.is_valid() || !url
.SchemeIs(extensions::kExtensionScheme
))
45 const std::string host
= url
.host();
46 if (HostIsInSet(host
, whitelist
))
49 // Check the modules that are imported by this extension to see if any of them
51 const Extension
* extension
= extension_set
? extension_set
->GetByID(host
)
56 typedef std::vector
<SharedModuleInfo::ImportInfo
> ImportInfoVector
;
57 const ImportInfoVector
& imports
= SharedModuleInfo::GetImports(extension
);
58 for (ImportInfoVector::const_iterator it
= imports
.begin();
61 const Extension
* imported_extension
=
62 extension_set
->GetByID(it
->extension_id
);
63 if (imported_extension
&&
64 SharedModuleInfo::IsSharedModule(imported_extension
) &&
65 HostIsInSet(it
->extension_id
, whitelist
)) {
73 bool IsHostAllowedByCommandLine(const GURL
& url
,
74 const extensions::ExtensionSet
* extension_set
,
75 const char* command_line_switch
) {
79 const base::CommandLine
& command_line
=
80 *base::CommandLine::ForCurrentProcess();
81 const std::string allowed_list
=
82 command_line
.GetSwitchValueASCII(command_line_switch
);
83 if (allowed_list
.empty())
86 const std::string host
= url
.host();
87 if (allowed_list
== "*") {
88 // For now, we only allow packaged and platform apps in this wildcard.
89 if (!extension_set
|| !url
.SchemeIs(extensions::kExtensionScheme
))
92 const Extension
* extension
= extension_set
->GetByID(host
);
94 (extension
->GetType() == Manifest::TYPE_LEGACY_PACKAGED_APP
||
95 extension
->GetType() == Manifest::TYPE_PLATFORM_APP
);
98 base::StringTokenizer
t(allowed_list
, ",");
100 if (t
.token() == host
)
107 } // namespace chrome