OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/common/extensions/permissions/api_permission.h" | 5 #include "chrome/common/extensions/permissions/api_permission.h" |
6 | 6 |
7 #include "chrome/common/extensions/permissions/permissions_info.h" | 7 #include "chrome/common/extensions/permissions/permissions_info.h" |
| 8 #include "chrome/common/extensions/permissions/socket_permission.h" |
8 #include "grit/generated_resources.h" | 9 #include "grit/generated_resources.h" |
9 #include "ui/base/l10n/l10n_util.h" | 10 #include "ui/base/l10n/l10n_util.h" |
10 | 11 |
11 namespace { | 12 namespace { |
12 | 13 |
| 14 using extensions::APIPermission; |
| 15 using extensions::APIPermissionDetail; |
| 16 |
13 const char kOldUnlimitedStoragePermission[] = "unlimited_storage"; | 17 const char kOldUnlimitedStoragePermission[] = "unlimited_storage"; |
14 const char kWindowsPermission[] = "windows"; | 18 const char kWindowsPermission[] = "windows"; |
15 | 19 |
| 20 class SimpleDetail : public APIPermissionDetail { |
| 21 public: |
| 22 explicit SimpleDetail(const APIPermission* permission) |
| 23 : APIPermissionDetail(permission) { } |
| 24 |
| 25 virtual bool FromValue(const base::Value* value) OVERRIDE { |
| 26 if (value) |
| 27 return false; |
| 28 return true; |
| 29 } |
| 30 |
| 31 virtual void ToValue(base::Value** value) const OVERRIDE { |
| 32 *value = NULL; |
| 33 } |
| 34 |
| 35 virtual bool Check( |
| 36 const APIPermissionDetail::CheckParam* param) const OVERRIDE { |
| 37 return !param; |
| 38 } |
| 39 |
| 40 virtual bool Equal(const APIPermissionDetail* detail) const OVERRIDE { |
| 41 if (this == detail) |
| 42 return true; |
| 43 CHECK(permission() == detail->permission()); |
| 44 return true; |
| 45 } |
| 46 |
| 47 virtual APIPermissionDetail* Clone() const OVERRIDE { |
| 48 return new SimpleDetail(permission()); |
| 49 } |
| 50 |
| 51 virtual APIPermissionDetail* Diff( |
| 52 const APIPermissionDetail* detail) const OVERRIDE { |
| 53 CHECK(permission() == detail->permission()); |
| 54 return NULL; |
| 55 } |
| 56 |
| 57 virtual APIPermissionDetail* Union( |
| 58 const APIPermissionDetail* detail) const OVERRIDE { |
| 59 CHECK(permission() == detail->permission()); |
| 60 return new SimpleDetail(permission()); |
| 61 } |
| 62 |
| 63 virtual APIPermissionDetail* Intersect( |
| 64 const APIPermissionDetail* detail) const OVERRIDE { |
| 65 CHECK(permission() == detail->permission()); |
| 66 return new SimpleDetail(permission()); |
| 67 } |
| 68 |
| 69 virtual bool Contains(const APIPermissionDetail* detail) const OVERRIDE { |
| 70 CHECK(permission() == detail->permission()); |
| 71 return true; |
| 72 } |
| 73 |
| 74 virtual void Write(IPC::Message* m) const OVERRIDE { } |
| 75 |
| 76 virtual bool Read(const IPC::Message* m, PickleIterator* iter) OVERRIDE { |
| 77 return true; |
| 78 } |
| 79 |
| 80 virtual void Log(std::string* log) const OVERRIDE { } |
| 81 |
| 82 protected: |
| 83 friend class extensions::APIPermissionDetail; |
| 84 virtual ~SimpleDetail() { } |
| 85 }; |
| 86 |
| 87 template<typename T> |
| 88 APIPermissionDetail* CreatePermissionDetail(const APIPermission* permission) { |
| 89 return new T(permission); |
| 90 } |
| 91 |
16 } // namespace | 92 } // namespace |
17 | 93 |
18 namespace extensions { | 94 namespace extensions { |
19 | 95 |
20 // | 96 // |
21 // APIPermission | 97 // APIPermission |
22 // | 98 // |
23 | 99 |
24 APIPermission::~APIPermission() {} | 100 APIPermission::~APIPermission() {} |
25 | 101 |
| 102 scoped_refptr<APIPermissionDetail> APIPermission::CreateDetail() const { |
| 103 scoped_refptr<APIPermissionDetail> p; |
| 104 if (detail_constructor_) |
| 105 p = detail_constructor_(this); |
| 106 if (!p.get()) |
| 107 p = new SimpleDetail(this); |
| 108 return p; |
| 109 } |
| 110 |
26 PermissionMessage APIPermission::GetMessage_() const { | 111 PermissionMessage APIPermission::GetMessage_() const { |
27 return PermissionMessage( | 112 return PermissionMessage( |
28 message_id_, l10n_util::GetStringUTF16(l10n_message_id_)); | 113 message_id_, l10n_util::GetStringUTF16(l10n_message_id_)); |
29 } | 114 } |
30 | 115 |
31 APIPermission::APIPermission( | 116 APIPermission::APIPermission( |
32 ID id, | 117 ID id, |
33 const char* name, | 118 const char* name, |
34 int l10n_message_id, | 119 int l10n_message_id, |
35 PermissionMessage::ID message_id, | 120 PermissionMessage::ID message_id, |
36 int flags) | 121 int flags, |
| 122 DetailConstructor detail_constructor) |
37 : id_(id), | 123 : id_(id), |
38 name_(name), | 124 name_(name), |
39 flags_(flags), | 125 flags_(flags), |
40 l10n_message_id_(l10n_message_id), | 126 l10n_message_id_(l10n_message_id), |
41 message_id_(message_id) {} | 127 message_id_(message_id), |
| 128 detail_constructor_(detail_constructor) { } |
42 | 129 |
43 // static | 130 // static |
44 void APIPermission::RegisterAllPermissions( | 131 void APIPermission::RegisterAllPermissions( |
45 PermissionsInfo* info) { | 132 PermissionsInfo* info) { |
46 | 133 |
47 struct PermissionRegistration { | 134 struct PermissionRegistration { |
48 APIPermission::ID id; | 135 APIPermission::ID id; |
49 const char* name; | 136 const char* name; |
50 int flags; | 137 int flags; |
51 int l10n_message_id; | 138 int l10n_message_id; |
52 PermissionMessage::ID message_id; | 139 PermissionMessage::ID message_id; |
| 140 DetailConstructor detail_constructor; |
53 } PermissionsToRegister[] = { | 141 } PermissionsToRegister[] = { |
54 // Register permissions for all extension types. | 142 // Register permissions for all extension types. |
55 { kBackground, "background" }, | 143 { kBackground, "background" }, |
56 { kClipboardRead, "clipboardRead", kFlagNone, | 144 { kClipboardRead, "clipboardRead", kFlagNone, |
57 IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD, | 145 IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD, |
58 PermissionMessage::kClipboard }, | 146 PermissionMessage::kClipboard }, |
59 { kClipboardWrite, "clipboardWrite" }, | 147 { kClipboardWrite, "clipboardWrite" }, |
60 { kDeclarativeWebRequest, "declarativeWebRequest" }, | 148 { kDeclarativeWebRequest, "declarativeWebRequest" }, |
61 { kDownloads, "downloads", kFlagNone, | 149 { kDownloads, "downloads", kFlagNone, |
62 IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS, | 150 IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS, |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 { kDevtools, "devtools", | 235 { kDevtools, "devtools", |
148 kFlagImpliesFullURLAccess | kFlagCannotBeOptional }, | 236 kFlagImpliesFullURLAccess | kFlagCannotBeOptional }, |
149 { kPlugin, "plugin", | 237 { kPlugin, "plugin", |
150 kFlagImpliesFullURLAccess | kFlagImpliesFullAccess | | 238 kFlagImpliesFullURLAccess | kFlagImpliesFullAccess | |
151 kFlagCannotBeOptional, | 239 kFlagCannotBeOptional, |
152 IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS, | 240 IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS, |
153 PermissionMessage::kFullAccess }, | 241 PermissionMessage::kFullAccess }, |
154 | 242 |
155 // Platform-app permissions. | 243 // Platform-app permissions. |
156 { kSerial, "serial", kFlagCannotBeOptional }, | 244 { kSerial, "serial", kFlagCannotBeOptional }, |
157 { kSocket, "socket", kFlagCannotBeOptional }, | 245 { kSocket, "socket", kFlagCannotBeOptional, 0, PermissionMessage::kNone, |
| 246 &CreatePermissionDetail<SocketPermission> }, |
158 { kAppRuntime, "app.runtime" }, | 247 { kAppRuntime, "app.runtime" }, |
159 { kAppWindow, "app.window" }, | 248 { kAppWindow, "app.window" }, |
160 { kAudioCapture, "audioCapture", kFlagNone, | 249 { kAudioCapture, "audioCapture", kFlagNone, |
161 IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE, | 250 IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE, |
162 PermissionMessage::kAudioCapture }, | 251 PermissionMessage::kAudioCapture }, |
163 { kVideoCapture, "videoCapture", kFlagNone, | 252 { kVideoCapture, "videoCapture", kFlagNone, |
164 IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE, | 253 IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE, |
165 PermissionMessage::kVideoCapture }, | 254 PermissionMessage::kVideoCapture }, |
166 // "fileSystem" has no permission string because read-only access is only | 255 // "fileSystem" has no permission string because read-only access is only |
167 // granted after the user has been shown a file chooser dialog and selected | 256 // granted after the user has been shown a file chooser dialog and selected |
168 // a file. Selecting the file is considered consent to read it. | 257 // a file. Selecting the file is considered consent to read it. |
169 { kFileSystem, "fileSystem" }, | 258 { kFileSystem, "fileSystem" }, |
170 { kFileSystemWrite, "fileSystemWrite", kFlagNone, | 259 { kFileSystemWrite, "fileSystemWrite", kFlagNone, |
171 IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE, | 260 IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE, |
172 PermissionMessage::kFileSystemWrite }, | 261 PermissionMessage::kFileSystemWrite }, |
173 { kMediaGalleriesAllGalleries, "mediaGalleriesAllGalleries", | 262 { kMediaGalleriesAllGalleries, "mediaGalleriesAllGalleries", |
174 kFlagCannotBeOptional, | 263 kFlagCannotBeOptional, |
175 IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_ALL_GALLERIES, | 264 IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_ALL_GALLERIES, |
176 PermissionMessage::kMediaGalleriesAllGalleries }, | 265 PermissionMessage::kMediaGalleriesAllGalleries }, |
177 }; | 266 }; |
178 | 267 |
179 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(PermissionsToRegister); ++i) { | 268 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(PermissionsToRegister); ++i) { |
180 const PermissionRegistration& pr = PermissionsToRegister[i]; | 269 const PermissionRegistration& pr = PermissionsToRegister[i]; |
181 info->RegisterPermission( | 270 info->RegisterPermission( |
182 pr.id, pr.name, pr.l10n_message_id, | 271 pr.id, pr.name, pr.l10n_message_id, |
183 pr.message_id ? pr.message_id : PermissionMessage::kNone, | 272 pr.message_id ? pr.message_id : PermissionMessage::kNone, |
184 pr.flags); | 273 pr.flags, |
| 274 pr.detail_constructor); |
185 } | 275 } |
186 | 276 |
187 // Register aliases. | 277 // Register aliases. |
188 info->RegisterAlias("unlimitedStorage", kOldUnlimitedStoragePermission); | 278 info->RegisterAlias("unlimitedStorage", kOldUnlimitedStoragePermission); |
189 info->RegisterAlias("tabs", kWindowsPermission); | 279 info->RegisterAlias("tabs", kWindowsPermission); |
190 } | 280 } |
191 | 281 |
| 282 APIPermissionDetail::~APIPermissionDetail() { |
| 283 } |
| 284 |
192 } // namespace extensions | 285 } // namespace extensions |
OLD | NEW |