| 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 |