1 // Copyright 2018 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 
5 #include "chromecast/common/cast_extensions_client.h"
6 
7 #include <memory>
8 #include <string>
9 
10 #include "base/check.h"
11 #include "base/macros.h"
12 #include "base/no_destructor.h"
13 #include "base/notreached.h"
14 #include "chromecast/common/cast_extensions_api_provider.h"
15 #include "extensions/common/api/api_features.h"
16 #include "extensions/common/api/behavior_features.h"
17 #include "extensions/common/api/generated_schemas.h"
18 #include "extensions/common/api/manifest_features.h"
19 #include "extensions/common/api/permission_features.h"
20 #include "extensions/common/core_extensions_api_provider.h"
21 #include "extensions/common/extension_urls.h"
22 #include "extensions/common/features/feature_provider.h"
23 #include "extensions/common/features/manifest_feature.h"
24 #include "extensions/common/features/simple_feature.h"
25 #include "extensions/common/permissions/permission_message_provider.h"
26 #include "extensions/common/url_pattern_set.h"
27 
28 namespace extensions {
29 
30 namespace {
31 
32 // TODO(jamescook): Refactor ChromePermissionsMessageProvider so we can share
33 // code. For now, this implementation does nothing.
34 class ShellPermissionMessageProvider : public PermissionMessageProvider {
35  public:
ShellPermissionMessageProvider()36   ShellPermissionMessageProvider() {}
~ShellPermissionMessageProvider()37   ~ShellPermissionMessageProvider() override {}
38 
39   // PermissionMessageProvider implementation.
GetPermissionMessages(const PermissionIDSet & permissions) const40   PermissionMessages GetPermissionMessages(
41       const PermissionIDSet& permissions) const override {
42     return PermissionMessages();
43   }
44 
IsPrivilegeIncrease(const PermissionSet & granted_permissions,const PermissionSet & requested_permissions,Manifest::Type extension_type) const45   bool IsPrivilegeIncrease(const PermissionSet& granted_permissions,
46                            const PermissionSet& requested_permissions,
47                            Manifest::Type extension_type) const override {
48     // Ensure we implement this before shipping.
49     CHECK(false);
50     return false;
51   }
52 
GetAllPermissionIDs(const PermissionSet & permissions,Manifest::Type extension_type) const53   PermissionIDSet GetAllPermissionIDs(
54       const PermissionSet& permissions,
55       Manifest::Type extension_type) const override {
56     return PermissionIDSet();
57   }
58 
59  private:
60   DISALLOW_COPY_AND_ASSIGN(ShellPermissionMessageProvider);
61 };
62 
63 }  // namespace
64 
CastExtensionsClient()65 CastExtensionsClient::CastExtensionsClient()
66     : webstore_base_url_(extension_urls::kChromeWebstoreBaseURL),
67       webstore_update_url_(extension_urls::kChromeWebstoreUpdateURL) {
68   AddAPIProvider(std::make_unique<CoreExtensionsAPIProvider>());
69   AddAPIProvider(std::make_unique<CastExtensionsAPIProvider>());
70 }
71 
~CastExtensionsClient()72 CastExtensionsClient::~CastExtensionsClient() {}
73 
Initialize()74 void CastExtensionsClient::Initialize() {
75   // TODO(jamescook): Do we need to whitelist any extensions?
76 }
77 
InitializeWebStoreUrls(base::CommandLine * command_line)78 void CastExtensionsClient::InitializeWebStoreUrls(
79     base::CommandLine* command_line) {}
80 
81 const PermissionMessageProvider&
GetPermissionMessageProvider() const82 CastExtensionsClient::GetPermissionMessageProvider() const {
83   NOTIMPLEMENTED();
84   static base::NoDestructor<ShellPermissionMessageProvider>
85       g_permission_message_provider;
86   return *g_permission_message_provider;
87 }
88 
GetProductName()89 const std::string CastExtensionsClient::GetProductName() {
90   return "cast_shell";
91 }
92 
FilterHostPermissions(const URLPatternSet & hosts,URLPatternSet * new_hosts,PermissionIDSet * permissions) const93 void CastExtensionsClient::FilterHostPermissions(
94     const URLPatternSet& hosts,
95     URLPatternSet* new_hosts,
96     PermissionIDSet* permissions) const {
97   NOTIMPLEMENTED();
98 }
99 
SetScriptingAllowlist(const ScriptingAllowlist & allowlist)100 void CastExtensionsClient::SetScriptingAllowlist(
101     const ScriptingAllowlist& allowlist) {
102   scripting_allowlist_ = allowlist;
103 }
104 
105 const ExtensionsClient::ScriptingAllowlist&
GetScriptingAllowlist() const106 CastExtensionsClient::GetScriptingAllowlist() const {
107   // TODO(jamescook): Real allowlist.
108   return scripting_allowlist_;
109 }
110 
GetPermittedChromeSchemeHosts(const Extension * extension,const APIPermissionSet & api_permissions) const111 URLPatternSet CastExtensionsClient::GetPermittedChromeSchemeHosts(
112     const Extension* extension,
113     const APIPermissionSet& api_permissions) const {
114   NOTIMPLEMENTED();
115   return URLPatternSet();
116 }
117 
IsScriptableURL(const GURL & url,std::string * error) const118 bool CastExtensionsClient::IsScriptableURL(const GURL& url,
119                                            std::string* error) const {
120   NOTIMPLEMENTED();
121   return true;
122 }
123 
GetWebstoreBaseURL() const124 const GURL& CastExtensionsClient::GetWebstoreBaseURL() const {
125   return webstore_base_url_;
126 }
127 
GetWebstoreUpdateURL() const128 const GURL& CastExtensionsClient::GetWebstoreUpdateURL() const {
129   return webstore_update_url_;
130 }
131 
IsBlacklistUpdateURL(const GURL & url) const132 bool CastExtensionsClient::IsBlacklistUpdateURL(const GURL& url) const {
133   return true;
134 }
135 
136 }  // namespace extensions
137