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 3 // found in the LICENSE file. 4 5 #ifndef EXTENSIONS_COMMON_MANIFEST_HANDLER_H_ 6 #define EXTENSIONS_COMMON_MANIFEST_HANDLER_H_ 7 8 #include <set> 9 #include <string> 10 #include <vector> 11 12 #include "base/lazy_instance.h" 13 #include "base/memory/linked_ptr.h" 14 #include "base/strings/string16.h" 15 #include "extensions/common/manifest.h" 16 17 namespace extensions { 18 class Extension; 19 class ManifestPermission; 20 class ManifestPermissionSet; 21 22 // An interface for clients that recognize and parse keys in extension 23 // manifests. 24 class ManifestHandler { 25 public: 26 ManifestHandler(); 27 virtual ~ManifestHandler(); 28 29 // Attempts to parse the extension's manifest. 30 // Returns true on success or false on failure; if false, |error| will 31 // be set to a failure message. 32 virtual bool Parse(Extension* extension, string16* error) = 0; 33 34 // Validate that files associated with this manifest key exist. 35 // Validation takes place after parsing. May also append a series of 36 // warning messages to |warnings|. 37 // 38 // Otherwise, returns false, and a description of the error is 39 // returned in |error|. 40 // TODO(yoz): Change error to string16. See crbug.com/71980. 41 virtual bool Validate(const Extension* extension, 42 std::string* error, 43 std::vector<InstallWarning>* warnings) const; 44 45 // If false (the default), only parse the manifest if a registered 46 // key is present in the manifest. If true, always attempt to parse 47 // the manifest for this extension type, even if no registered keys 48 // are present. This allows specifying a default parsed value for 49 // extensions that don't declare our key in the manifest. 50 // TODO(yoz): Use Feature availability instead. 51 virtual bool AlwaysParseForType(Manifest::Type type) const; 52 53 // Same as AlwaysParseForType, but for Validate instead of Parse. 54 virtual bool AlwaysValidateForType(Manifest::Type type) const; 55 56 // The list of keys that, if present, should be parsed before calling our 57 // Parse (typically, because our Parse needs to read those keys). 58 // Defaults to empty. 59 virtual const std::vector<std::string> PrerequisiteKeys() const; 60 61 // Associate us with our keys() in the manifest. A handler can register 62 // for multiple keys. The global registry takes ownership of this; 63 // if it has an existing handler for |key|, it replaces it with this. 64 // Manifest handlers must be registered at process startup in 65 // chrome_manifest_handlers.cc: 66 // (new MyManifestHandler)->Register(); 67 void Register(); 68 69 // Creates a |ManifestPermission| instance for the given manifest key |name|. 70 // The returned permission does not contain any permission data, so this 71 // method is usually used before calling |FromValue| or |Read|. Returns 72 // |NULL| if the manifest handler does not support custom permissions. 73 virtual ManifestPermission* CreatePermission(); 74 75 // Creates a |ManifestPermission| instance containing the initial set of 76 // required manifest permissions for the given |extension|. Returns |NULL| if 77 // the manifest handler does not support custom permissions or if there was 78 // no manifest key in the extension manifest for this handler. 79 virtual ManifestPermission* CreateInitialRequiredPermission( 80 const Extension* extension); 81 82 // Calling FinalizeRegistration indicates that there are no more 83 // manifest handlers to be registered. 84 static void FinalizeRegistration(); 85 86 static bool IsRegistrationFinalized(); 87 88 // Call Parse on all registered manifest handlers that should parse 89 // this extension. 90 static bool ParseExtension(Extension* extension, string16* error); 91 92 // Call Validate on all registered manifest handlers for this extension. 93 static bool ValidateExtension(const Extension* extension, 94 std::string* error, 95 std::vector<InstallWarning>* warnings); 96 97 // Calls |CreatePermission| on the manifest handler for |key|. Returns |NULL| 98 // if there is no manifest handler for |key| or if the manifest handler for 99 // |key| does not support custom permissions. 100 static ManifestPermission* CreatePermission(const std::string& key); 101 102 // Calls |CreateInitialRequiredPermission| on all registered manifest handlers 103 // and adds the returned permissions to |permission_set|. Note this should be 104 // called after all manifest data elements have been read, parsed and stored 105 // in the manifest data property of |extension|, as manifest handlers need 106 // access to their manifest data to initialize their required manifest 107 // permission. 108 static void AddExtensionInitialRequiredPermissions( 109 const Extension* extension, ManifestPermissionSet* permission_set); 110 111 protected: 112 // A convenience method for handlers that only register for 1 key, 113 // so that they can define keys() { return SingleKey(kKey); } 114 static const std::vector<std::string> SingleKey(const std::string& key); 115 116 private: 117 // The keys to register us for (in Register). 118 virtual const std::vector<std::string> Keys() const = 0; 119 }; 120 121 // The global registry for manifest handlers. 122 class ManifestHandlerRegistry { 123 private: 124 friend class ManifestHandler; 125 friend class ScopedTestingManifestHandlerRegistry; 126 friend struct base::DefaultLazyInstanceTraits<ManifestHandlerRegistry>; 127 128 ManifestHandlerRegistry(); 129 ~ManifestHandlerRegistry(); 130 131 void Finalize(); 132 133 void RegisterManifestHandler(const std::string& key, 134 linked_ptr<ManifestHandler> handler); 135 bool ParseExtension(Extension* extension, string16* error); 136 bool ValidateExtension(const Extension* extension, 137 std::string* error, 138 std::vector<InstallWarning>* warnings); 139 140 ManifestPermission* CreatePermission(const std::string& key); 141 142 void AddExtensionInitialRequiredPermissions( 143 const Extension* extension, 144 ManifestPermissionSet* permission_set); 145 146 // Overrides the current global ManifestHandlerRegistry with 147 // |registry|, returning the current one. 148 static ManifestHandlerRegistry* SetForTesting( 149 ManifestHandlerRegistry* new_registry); 150 151 typedef std::map<std::string, linked_ptr<ManifestHandler> > 152 ManifestHandlerMap; 153 typedef std::map<ManifestHandler*, int> ManifestHandlerPriorityMap; 154 155 // Puts the manifest handlers in order such that each handler comes after 156 // any handlers for their PrerequisiteKeys. If there is no handler for 157 // a prerequisite key, that dependency is simply ignored. 158 // CHECKs that there are no manifest handlers with circular dependencies. 159 void SortManifestHandlers(); 160 161 // All registered manifest handlers. 162 ManifestHandlerMap handlers_; 163 164 // The priority for each manifest handler. Handlers with lower priority 165 // values are evaluated first. 166 ManifestHandlerPriorityMap priority_map_; 167 168 bool is_finalized_; 169 }; 170 171 } // namespace extensions 172 173 #endif // EXTENSIONS_COMMON_MANIFEST_HANDLER_H_ 174