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