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