chrome_api_permissions.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
6
7#include "extensions/common/permissions/api_permission.h"
8#include "extensions/common/permissions/api_permission_set.h"
9#include "extensions/common/permissions/media_galleries_permission.h"
10#include "extensions/common/permissions/permission_message.h"
11#include "extensions/common/permissions/permissions_info.h"
12#include "grit/extensions_strings.h"
13#include "grit/generated_resources.h"
14
15namespace extensions {
16
17namespace {
18
19const char kOldAlwaysOnTopWindowsPermission[] = "alwaysOnTopWindows";
20const char kOldFullscreenPermission[] = "fullscreen";
21const char kOldOverrideEscFullscreenPermission[] = "overrideEscFullscreen";
22const char kOldUnlimitedStoragePermission[] = "unlimited_storage";
23const char kWindowsPermission[] = "windows";
24
25template<typename T> APIPermission* CreateAPIPermission(
26    const APIPermissionInfo* permission) {
27  return new T(permission);
28}
29
30}  // namespace
31
32std::vector<APIPermissionInfo*> ChromeAPIPermissions::GetAllPermissions()
33    const {
34  APIPermissionInfo::InitInfo permissions_to_register[] = {
35      // Register permissions for all extension types.
36      {APIPermission::kAppView, "appview",
37       APIPermissionInfo::kFlagCannotBeOptional},
38      {APIPermission::kBackground, "background"},
39      {APIPermission::kClipboardRead, "clipboardRead",
40       APIPermissionInfo::kFlagNone, IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD,
41       PermissionMessage::kClipboard},
42      {APIPermission::kClipboardWrite, "clipboardWrite"},
43      {APIPermission::kDeclarativeContent, "declarativeContent"},
44      {APIPermission::kDeclarativeWebRequest, "declarativeWebRequest",
45       APIPermissionInfo::kFlagNone,
46       IDS_EXTENSION_PROMPT_WARNING_DECLARATIVE_WEB_REQUEST,
47       PermissionMessage::kDeclarativeWebRequest},
48      {APIPermission::kDesktopCapture, "desktopCapture",
49       APIPermissionInfo::kFlagNone,
50       IDS_EXTENSION_PROMPT_WARNING_DESKTOP_CAPTURE,
51       PermissionMessage::kDesktopCapture},
52      {APIPermission::kDownloads, "downloads", APIPermissionInfo::kFlagNone,
53       IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS, PermissionMessage::kDownloads},
54      {APIPermission::kDownloadsOpen, "downloads.open",
55       APIPermissionInfo::kFlagNone,
56       IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS_OPEN,
57       PermissionMessage::kDownloadsOpen},
58      {APIPermission::kDownloadsShelf, "downloads.shelf"},
59      {APIPermission::kEasyUnlockPrivate, "easyUnlockPrivate"},
60      {APIPermission::kIdentity, "identity"},
61      {APIPermission::kIdentityEmail, "identity.email",
62       APIPermissionInfo::kFlagNone,
63       IDS_EXTENSION_PROMPT_WARNING_IDENTITY_EMAIL,
64       PermissionMessage::kIdentityEmail},
65      {APIPermission::kExperimental, "experimental",
66       APIPermissionInfo::kFlagCannotBeOptional},
67      {APIPermission::kEmbeddedExtensionOptions, "embeddedExtensionOptions",
68       APIPermissionInfo::kFlagCannotBeOptional},
69      // NOTE(kalman): this is provided by a manifest property but needs to
70      // appear in the install permission dialogue, so we need a fake
71      // permission for it. See http://crbug.com/247857.
72      {APIPermission::kWebConnectable, "webConnectable",
73       APIPermissionInfo::kFlagCannotBeOptional |
74           APIPermissionInfo::kFlagInternal,
75       IDS_EXTENSION_PROMPT_WARNING_WEB_CONNECTABLE,
76       PermissionMessage::kWebConnectable},
77      {APIPermission::kGeolocation, "geolocation",
78       APIPermissionInfo::kFlagCannotBeOptional,
79       IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
80       PermissionMessage::kGeolocation},
81      {APIPermission::kNotifications, "notifications"},
82      {APIPermission::kUnlimitedStorage, "unlimitedStorage",
83       APIPermissionInfo::kFlagCannotBeOptional},
84      {APIPermission::kGcdPrivate, "gcdPrivate"},
85      {APIPermission::kGcm, "gcm"},
86      {APIPermission::kNotificationProvider, "notificationProvider"},
87
88      // Register extension permissions.
89      {APIPermission::kAccessibilityFeaturesModify,
90       "accessibilityFeatures.modify", APIPermissionInfo::kFlagNone,
91       IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_MODIFY,
92       PermissionMessage::kAccessibilityFeaturesModify},
93      {APIPermission::kAccessibilityFeaturesRead, "accessibilityFeatures.read",
94       APIPermissionInfo::kFlagNone,
95       IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ,
96       PermissionMessage::kAccessibilityFeaturesRead},
97      {APIPermission::kAccessibilityPrivate, "accessibilityPrivate",
98       APIPermissionInfo::kFlagCannotBeOptional},
99      {APIPermission::kActiveTab, "activeTab"},
100      {APIPermission::kAlarms, "alarms"},
101      {APIPermission::kBookmark, "bookmarks", APIPermissionInfo::kFlagNone,
102       IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS, PermissionMessage::kBookmarks},
103      {APIPermission::kBrailleDisplayPrivate, "brailleDisplayPrivate",
104       APIPermissionInfo::kFlagCannotBeOptional},
105      {APIPermission::kBrowsingData, "browsingData"},
106      {APIPermission::kContentSettings, "contentSettings",
107       APIPermissionInfo::kFlagNone,
108       IDS_EXTENSION_PROMPT_WARNING_CONTENT_SETTINGS,
109       PermissionMessage::kContentSettings},
110      {APIPermission::kContextMenus, "contextMenus"},
111      {APIPermission::kCookie, "cookies"},
112      {APIPermission::kCopresencePrivate, "copresencePrivate"},
113      {APIPermission::kEnterprisePlatformKeys, "enterprise.platformKeys"},
114      {APIPermission::kFileBrowserHandler, "fileBrowserHandler",
115       APIPermissionInfo::kFlagCannotBeOptional},
116      {APIPermission::kFontSettings, "fontSettings",
117       APIPermissionInfo::kFlagCannotBeOptional},
118      {APIPermission::kHistory, "history", APIPermissionInfo::kFlagNone,
119       IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE,
120       PermissionMessage::kBrowsingHistory},
121      {APIPermission::kIdltest, "idltest"},
122      {APIPermission::kIdle, "idle"},
123      {APIPermission::kInfobars, "infobars"},
124      {APIPermission::kInput, "input", APIPermissionInfo::kFlagNone,
125       IDS_EXTENSION_PROMPT_WARNING_INPUT, PermissionMessage::kInput},
126      {APIPermission::kLedger, "ledger"},
127      {APIPermission::kLocation, "location",
128       APIPermissionInfo::kFlagCannotBeOptional,
129       IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
130       PermissionMessage::kGeolocation},
131      {APIPermission::kManagement, "management", APIPermissionInfo::kFlagNone,
132       IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT, PermissionMessage::kManagement},
133      {APIPermission::kNativeMessaging, "nativeMessaging",
134       APIPermissionInfo::kFlagNone,
135       IDS_EXTENSION_PROMPT_WARNING_NATIVE_MESSAGING,
136       PermissionMessage::kNativeMessaging},
137      {APIPermission::kPrivacy, "privacy", APIPermissionInfo::kFlagNone,
138       IDS_EXTENSION_PROMPT_WARNING_PRIVACY, PermissionMessage::kPrivacy},
139      {APIPermission::kProcesses, "processes", APIPermissionInfo::kFlagNone,
140       IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, PermissionMessage::kTabs},
141      {APIPermission::kSessions, "sessions"},
142      {APIPermission::kSignedInDevices, "signedInDevices",
143       APIPermissionInfo::kFlagNone,
144       IDS_EXTENSION_PROMPT_WARNING_SIGNED_IN_DEVICES,
145       PermissionMessage::kSignedInDevices},
146      {APIPermission::kSyncFileSystem, "syncFileSystem",
147       APIPermissionInfo::kFlagNone,
148       IDS_EXTENSION_PROMPT_WARNING_SYNCFILESYSTEM,
149       PermissionMessage::kSyncFileSystem},
150      {APIPermission::kTab, "tabs", APIPermissionInfo::kFlagNone,
151       IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, PermissionMessage::kTabs},
152      {APIPermission::kTopSites, "topSites", APIPermissionInfo::kFlagNone,
153       IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, PermissionMessage::kTabs},
154      {APIPermission::kTts, "tts", 0, APIPermissionInfo::kFlagCannotBeOptional},
155      {APIPermission::kTtsEngine, "ttsEngine",
156       APIPermissionInfo::kFlagCannotBeOptional,
157       IDS_EXTENSION_PROMPT_WARNING_TTS_ENGINE, PermissionMessage::kTtsEngine},
158      {APIPermission::kWallpaper, "wallpaper",
159       APIPermissionInfo::kFlagCannotBeOptional,
160       IDS_EXTENSION_PROMPT_WARNING_WALLPAPER, PermissionMessage::kWallpaper},
161      {APIPermission::kWebNavigation, "webNavigation",
162       APIPermissionInfo::kFlagNone, IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ,
163       PermissionMessage::kTabs},
164      {APIPermission::kWebRequest, "webRequest"},
165      {APIPermission::kWebRequestBlocking, "webRequestBlocking"},
166      {APIPermission::kWebView, "webview",
167       APIPermissionInfo::kFlagCannotBeOptional},
168
169      // Register private permissions.
170      {APIPermission::kScreenlockPrivate, "screenlockPrivate",
171       APIPermissionInfo::kFlagCannotBeOptional,
172       IDS_EXTENSION_PROMPT_WARNING_SCREENLOCK_PRIVATE,
173       PermissionMessage::kScreenlockPrivate},
174      {APIPermission::kActivityLogPrivate, "activityLogPrivate",
175       APIPermissionInfo::kFlagCannotBeOptional,
176       IDS_EXTENSION_PROMPT_WARNING_ACTIVITY_LOG_PRIVATE,
177       PermissionMessage::kActivityLogPrivate},
178      {APIPermission::kAutoTestPrivate, "autotestPrivate",
179       APIPermissionInfo::kFlagCannotBeOptional},
180      {APIPermission::kBookmarkManagerPrivate, "bookmarkManagerPrivate",
181       APIPermissionInfo::kFlagCannotBeOptional},
182      {APIPermission::kCast, "cast", APIPermissionInfo::kFlagCannotBeOptional},
183      {APIPermission::kChromeosInfoPrivate, "chromeosInfoPrivate",
184       APIPermissionInfo::kFlagCannotBeOptional},
185      {APIPermission::kCommandLinePrivate, "commandLinePrivate",
186       APIPermissionInfo::kFlagCannotBeOptional},
187      {APIPermission::kDeveloperPrivate, "developerPrivate",
188       APIPermissionInfo::kFlagCannotBeOptional},
189      {APIPermission::kDiagnostics, "diagnostics",
190       APIPermissionInfo::kFlagCannotBeOptional},
191      {APIPermission::kDial, "dial", APIPermissionInfo::kFlagCannotBeOptional},
192      {APIPermission::kDownloadsInternal, "downloadsInternal"},
193      {APIPermission::kExperienceSamplingPrivate, "experienceSamplingPrivate",
194       APIPermissionInfo::kFlagCannotBeOptional,
195       IDS_EXTENSION_PROMPT_WARNING_EXPERIENCE_SAMPLING_PRIVATE,
196       PermissionMessage::kExperienceSamplingPrivate},
197      {APIPermission::kFileBrowserHandlerInternal, "fileBrowserHandlerInternal",
198       APIPermissionInfo::kFlagCannotBeOptional},
199      {APIPermission::kFileBrowserPrivate, "fileBrowserPrivate",
200       APIPermissionInfo::kFlagCannotBeOptional},
201      {APIPermission::kHotwordPrivate, "hotwordPrivate",
202       APIPermissionInfo::kFlagCannotBeOptional},
203      {APIPermission::kIdentityPrivate, "identityPrivate",
204       APIPermissionInfo::kFlagCannotBeOptional},
205      {APIPermission::kLogPrivate, "logPrivate",
206       APIPermissionInfo::kFlagCannotBeOptional},
207      {APIPermission::kWebcamPrivate, "webcamPrivate"},
208      {APIPermission::kNetworkingPrivate, "networkingPrivate",
209       APIPermissionInfo::kFlagCannotBeOptional,
210       IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE,
211       PermissionMessage::kNetworkingPrivate},
212      {APIPermission::kMediaPlayerPrivate, "mediaPlayerPrivate",
213       APIPermissionInfo::kFlagCannotBeOptional},
214      {APIPermission::kMetricsPrivate, "metricsPrivate",
215       APIPermissionInfo::kFlagCannotBeOptional},
216      {APIPermission::kMDns, "mdns", APIPermissionInfo::kFlagCannotBeOptional},
217      {APIPermission::kMusicManagerPrivate, "musicManagerPrivate",
218       APIPermissionInfo::kFlagCannotBeOptional,
219       IDS_EXTENSION_PROMPT_WARNING_MUSIC_MANAGER_PRIVATE,
220       PermissionMessage::kMusicManagerPrivate},
221      {APIPermission::kPreferencesPrivate, "preferencesPrivate",
222       APIPermissionInfo::kFlagCannotBeOptional},
223      {APIPermission::kSystemPrivate, "systemPrivate",
224       APIPermissionInfo::kFlagCannotBeOptional},
225      {APIPermission::kCloudPrintPrivate, "cloudPrintPrivate",
226       APIPermissionInfo::kFlagCannotBeOptional},
227      {APIPermission::kInputMethodPrivate, "inputMethodPrivate",
228       APIPermissionInfo::kFlagCannotBeOptional},
229      {APIPermission::kEchoPrivate, "echoPrivate",
230       APIPermissionInfo::kFlagCannotBeOptional},
231      {APIPermission::kFeedbackPrivate, "feedbackPrivate",
232       APIPermissionInfo::kFlagCannotBeOptional},
233      {APIPermission::kImageWriterPrivate, "imageWriterPrivate",
234       APIPermissionInfo::kFlagCannotBeOptional},
235      {APIPermission::kReadingListPrivate, "readingListPrivate",
236       APIPermissionInfo::kFlagCannotBeOptional},
237      {APIPermission::kRtcPrivate, "rtcPrivate",
238       APIPermissionInfo::kFlagCannotBeOptional},
239      {APIPermission::kSyncedNotificationsPrivate,
240       "syncedNotificationsPrivate"},
241      {APIPermission::kTerminalPrivate, "terminalPrivate",
242       APIPermissionInfo::kFlagCannotBeOptional},
243      {APIPermission::kVirtualKeyboardPrivate, "virtualKeyboardPrivate",
244       APIPermissionInfo::kFlagCannotBeOptional},
245      {APIPermission::kWallpaperPrivate, "wallpaperPrivate",
246       APIPermissionInfo::kFlagCannotBeOptional},
247      {APIPermission::kWebstorePrivate, "webstorePrivate",
248       APIPermissionInfo::kFlagCannotBeOptional},
249      {APIPermission::kMediaGalleriesPrivate, "mediaGalleriesPrivate",
250       APIPermissionInfo::kFlagCannotBeOptional},
251      {APIPermission::kStreamsPrivate, "streamsPrivate",
252       APIPermissionInfo::kFlagCannotBeOptional},
253      {APIPermission::kEnterprisePlatformKeysPrivate,
254       "enterprise.platformKeysPrivate",
255       APIPermissionInfo::kFlagCannotBeOptional},
256      {APIPermission::kWebrtcAudioPrivate, "webrtcAudioPrivate",
257       APIPermissionInfo::kFlagCannotBeOptional},
258      {APIPermission::kWebrtcLoggingPrivate, "webrtcLoggingPrivate",
259       APIPermissionInfo::kFlagCannotBeOptional},
260      {APIPermission::kPrincipalsPrivate, "principalsPrivate",
261       APIPermissionInfo::kFlagCannotBeOptional},
262      {APIPermission::kFirstRunPrivate, "firstRunPrivate",
263       APIPermissionInfo::kFlagCannotBeOptional},
264      {APIPermission::kBluetoothPrivate, "bluetoothPrivate",
265       APIPermissionInfo::kFlagCannotBeOptional,
266       IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_PRIVATE,
267       PermissionMessage::kBluetoothPrivate},
268
269      // Full url access permissions.
270      {APIPermission::kDebugger, "debugger",
271       APIPermissionInfo::kFlagImpliesFullURLAccess |
272           APIPermissionInfo::kFlagCannotBeOptional,
273       IDS_EXTENSION_PROMPT_WARNING_DEBUGGER, PermissionMessage::kDebugger},
274      {APIPermission::kDevtools, "devtools",
275       APIPermissionInfo::kFlagImpliesFullURLAccess |
276           APIPermissionInfo::kFlagCannotBeOptional |
277           APIPermissionInfo::kFlagInternal},
278      {APIPermission::kPageCapture, "pageCapture",
279       APIPermissionInfo::kFlagImpliesFullURLAccess},
280      {APIPermission::kTabCapture, "tabCapture",
281       APIPermissionInfo::kFlagImpliesFullURLAccess},
282      {APIPermission::kTabCaptureForTab, "tabCaptureForTab",
283       APIPermissionInfo::kFlagInternal},
284      {APIPermission::kPlugin, "plugin",
285       APIPermissionInfo::kFlagImpliesFullURLAccess |
286           APIPermissionInfo::kFlagImpliesFullAccess |
287           APIPermissionInfo::kFlagCannotBeOptional |
288           APIPermissionInfo::kFlagInternal,
289       IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS,
290       PermissionMessage::kFullAccess},
291      {APIPermission::kProxy, "proxy",
292       APIPermissionInfo::kFlagImpliesFullURLAccess |
293           APIPermissionInfo::kFlagCannotBeOptional},
294
295      // Platform-app permissions.
296      {APIPermission::kAlwaysOnTopWindows, "app.window.alwaysOnTop"},
297      {APIPermission::kAudioCapture, "audioCapture",
298       APIPermissionInfo::kFlagNone, IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE,
299       PermissionMessage::kAudioCapture},
300      {APIPermission::kVideoCapture, "videoCapture",
301       APIPermissionInfo::kFlagNone, IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE,
302       PermissionMessage::kVideoCapture},
303      // The permission string for "fileSystem" is only shown when
304      // "write" or "directory" is present. Read-only access is only
305      // granted after the user has been shown a file or directory
306      // chooser dialog and selected a file or directory. Selecting
307      // the file or directory is considered consent to read it.
308      {APIPermission::kFileSystem, "fileSystem"},
309      {APIPermission::kFileSystemDirectory, "fileSystem.directory",
310       APIPermissionInfo::kFlagNone,
311       IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_DIRECTORY,
312       PermissionMessage::kFileSystemDirectory},
313      {APIPermission::kFileSystemProvider, "fileSystemProvider"},
314      {APIPermission::kFileSystemRetainEntries, "fileSystem.retainEntries"},
315      {APIPermission::kFileSystemWrite, "fileSystem.write"},
316      {APIPermission::kFileSystemWriteDirectory, "fileSystem.writeDirectory",
317       APIPermissionInfo::kFlagNone,
318       IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE_DIRECTORY,
319       PermissionMessage::kFileSystemWriteDirectory},
320      // Because warning messages for the "mediaGalleries" permission
321      // vary based on the permissions parameters, no message ID or
322      // message text is specified here.  The message ID and text used
323      // will be determined at run-time in the
324      // |MediaGalleriesPermission| class.
325      {APIPermission::kMediaGalleries, "mediaGalleries",
326       APIPermissionInfo::kFlagNone, 0, PermissionMessage::kNone,
327       &CreateAPIPermission<MediaGalleriesPermission>},
328      {APIPermission::kPushMessaging, "pushMessaging",
329       APIPermissionInfo::kFlagCannotBeOptional},
330      {APIPermission::kSystemCpu, "system.cpu"},
331      {APIPermission::kSystemMemory, "system.memory"},
332      {APIPermission::kSystemNetwork, "system.network"},
333      {APIPermission::kSystemDisplay, "system.display"},
334      {APIPermission::kSystemStorage, "system.storage"},
335      {APIPermission::kPointerLock, "pointerLock"},
336      {APIPermission::kFullscreen, "app.window.fullscreen"},
337      {APIPermission::kAudio, "audio"},
338      {APIPermission::kCastStreaming, "cast.streaming"},
339      {APIPermission::kOverrideEscFullscreen,
340       "app.window.fullscreen.overrideEsc"},
341      {APIPermission::kWindowShape, "app.window.shape"},
342      {APIPermission::kBrowser, "browser"},
343
344      // Settings override permissions.
345      {APIPermission::kHomepage, "homepage",
346       APIPermissionInfo::kFlagCannotBeOptional |
347           APIPermissionInfo::kFlagInternal,
348       IDS_EXTENSION_PROMPT_WARNING_HOME_PAGE_SETTING_OVERRIDE,
349       PermissionMessage::kHomepage},
350      {APIPermission::kSearchProvider, "searchProvider",
351       APIPermissionInfo::kFlagCannotBeOptional |
352           APIPermissionInfo::kFlagInternal,
353       IDS_EXTENSION_PROMPT_WARNING_SEARCH_SETTINGS_OVERRIDE,
354       PermissionMessage::kSearchProvider},
355      {APIPermission::kStartupPages, "startupPages",
356       APIPermissionInfo::kFlagCannotBeOptional |
357           APIPermissionInfo::kFlagInternal,
358       IDS_EXTENSION_PROMPT_WARNING_START_PAGE_SETTING_OVERRIDE,
359       PermissionMessage::kStartupPages},
360  };
361
362  std::vector<APIPermissionInfo*> permissions;
363
364  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(permissions_to_register); ++i)
365    permissions.push_back(new APIPermissionInfo(permissions_to_register[i]));
366  return permissions;
367}
368
369std::vector<PermissionsProvider::AliasInfo>
370ChromeAPIPermissions::GetAllAliases() const {
371  // Register aliases.
372  std::vector<PermissionsProvider::AliasInfo> aliases;
373  aliases.push_back(PermissionsProvider::AliasInfo(
374      "app.window.alwaysOnTop", kOldAlwaysOnTopWindowsPermission));
375  aliases.push_back(PermissionsProvider::AliasInfo("app.window.fullscreen",
376                                                   kOldFullscreenPermission));
377  aliases.push_back(
378      PermissionsProvider::AliasInfo("app.window.fullscreen.overrideEsc",
379                                     kOldOverrideEscFullscreenPermission));
380  aliases.push_back(PermissionsProvider::AliasInfo(
381      "unlimitedStorage", kOldUnlimitedStoragePermission));
382  aliases.push_back(PermissionsProvider::AliasInfo(
383      "tabs", kWindowsPermission));
384  return aliases;
385}
386
387}  // namespace extensions
388