| Index: chrome/common/extensions/permissions/permission_set.cc
|
| diff --git a/chrome/common/extensions/permissions/permission_set.cc b/chrome/common/extensions/permissions/permission_set.cc
|
| index 120f2d044179af2d8762c3c6a347eb2ae1e80d68..d11162c69a5f206a4193bce6a38e984be229ed45 100644
|
| --- a/chrome/common/extensions/permissions/permission_set.cc
|
| +++ b/chrome/common/extensions/permissions/permission_set.cc
|
| @@ -94,6 +94,8 @@ std::string GetPermissionName(const std::string& function_name) {
|
| return function_name;
|
| }
|
|
|
| +
|
| +
|
| } // namespace
|
|
|
| namespace extensions {
|
| @@ -263,28 +265,11 @@ PermissionMessages PermissionSet::GetPermissionMessages(
|
| return messages;
|
| }
|
|
|
| - // Since platform apps always use isolated storage, they can't (silently)
|
| - // access user data on other domains, so there's no need to prompt.
|
| - if (extension_type != Manifest::TYPE_PLATFORM_APP) {
|
| - if (HasEffectiveAccessToAllHosts()) {
|
| - messages.push_back(PermissionMessage(
|
| - PermissionMessage::kHostsAll,
|
| - l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS)));
|
| - } else {
|
| - PermissionMessages additional_warnings =
|
| - GetChromeSchemePermissionWarnings(effective_hosts_);
|
| - for (size_t i = 0; i < additional_warnings.size(); ++i)
|
| - messages.push_back(additional_warnings[i]);
|
| -
|
| - std::set<std::string> hosts = GetDistinctHostsForDisplay();
|
| - if (!hosts.empty())
|
| - messages.push_back(PermissionMessage::CreateFromHostList(hosts));
|
| - }
|
| - }
|
| -
|
| - std::set<PermissionMessage> simple_msgs =
|
| - GetSimplePermissionMessages();
|
| - messages.insert(messages.end(), simple_msgs.begin(), simple_msgs.end());
|
| + std::set<PermissionMessage> host_msgs =
|
| + GetHostPermissionMessages(extension_type);
|
| + std::set<PermissionMessage> api_msgs = GetAPIPermissionMessages();
|
| + messages.insert(messages.end(), host_msgs.begin(), host_msgs.end());
|
| + messages.insert(messages.end(), api_msgs.begin(), api_msgs.end());
|
|
|
| return messages;
|
| }
|
| @@ -435,7 +420,8 @@ bool PermissionSet::HasEffectiveFullAccess() const {
|
| }
|
|
|
| bool PermissionSet::HasLessPrivilegesThan(
|
| - const PermissionSet* permissions) const {
|
| + const PermissionSet* permissions,
|
| + Manifest::Type extension_type) const {
|
| // Things can't get worse than native code access.
|
| if (HasEffectiveFullAccess())
|
| return false;
|
| @@ -444,7 +430,7 @@ bool PermissionSet::HasLessPrivilegesThan(
|
| if (permissions->HasEffectiveFullAccess())
|
| return true;
|
|
|
| - if (HasLessHostPrivilegesThan(permissions))
|
| + if (HasLessHostPrivilegesThan(permissions, extension_type))
|
| return true;
|
|
|
| if (HasLessAPIPrivilegesThan(permissions))
|
| @@ -537,8 +523,7 @@ void PermissionSet::InitEffectiveHosts() {
|
| explicit_hosts(), scriptable_hosts(), &effective_hosts_);
|
| }
|
|
|
| -std::set<PermissionMessage>
|
| - PermissionSet::GetSimplePermissionMessages() const {
|
| +std::set<PermissionMessage> PermissionSet::GetAPIPermissionMessages() const {
|
| std::set<PermissionMessage> messages;
|
| for (APIPermissionSet::const_iterator permission_it = apis_.begin();
|
| permission_it != apis_.end(); ++permission_it) {
|
| @@ -552,15 +537,42 @@ std::set<PermissionMessage>
|
| return messages;
|
| }
|
|
|
| +std::set<PermissionMessage> PermissionSet::GetHostPermissionMessages(
|
| + Manifest::Type extension_type) const {
|
| + // Since platform apps always use isolated storage, they can't (silently)
|
| + // access user data on other domains, so there's no need to prompt.
|
| + // Note: this must remain consistent with HasLessHostPrivilegesThan.
|
| + // See crbug.com/255229.
|
| + std::set<PermissionMessage> messages;
|
| + if (extension_type == Manifest::TYPE_PLATFORM_APP)
|
| + return messages;
|
| +
|
| + if (HasEffectiveAccessToAllHosts()) {
|
| + messages.insert(PermissionMessage(
|
| + PermissionMessage::kHostsAll,
|
| + l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS)));
|
| + } else {
|
| + PermissionMessages additional_warnings =
|
| + GetChromeSchemePermissionWarnings(effective_hosts_);
|
| + for (size_t i = 0; i < additional_warnings.size(); ++i)
|
| + messages.insert(additional_warnings[i]);
|
| +
|
| + std::set<std::string> hosts = GetDistinctHostsForDisplay();
|
| + if (!hosts.empty())
|
| + messages.insert(PermissionMessage::CreateFromHostList(hosts));
|
| + }
|
| + return messages;
|
| +}
|
| +
|
| bool PermissionSet::HasLessAPIPrivilegesThan(
|
| const PermissionSet* permissions) const {
|
| if (permissions == NULL)
|
| return false;
|
|
|
| std::set<PermissionMessage> current_warnings =
|
| - GetSimplePermissionMessages();
|
| + GetAPIPermissionMessages();
|
| std::set<PermissionMessage> new_warnings =
|
| - permissions->GetSimplePermissionMessages();
|
| + permissions->GetAPIPermissionMessages();
|
| std::set<PermissionMessage> delta_warnings;
|
| std::set_difference(new_warnings.begin(), new_warnings.end(),
|
| current_warnings.begin(), current_warnings.end(),
|
| @@ -571,7 +583,13 @@ bool PermissionSet::HasLessAPIPrivilegesThan(
|
| }
|
|
|
| bool PermissionSet::HasLessHostPrivilegesThan(
|
| - const PermissionSet* permissions) const {
|
| + const PermissionSet* permissions,
|
| + Manifest::Type extension_type) const {
|
| + // Platform apps host permission changes do not count as privilege increases.
|
| + // Note: this must remain consistent with GetHostPermissionMessages.
|
| + if (extension_type == Manifest::TYPE_PLATFORM_APP)
|
| + return false;
|
| +
|
| // If this permission set can access any host, then it can't be elevated.
|
| if (HasEffectiveAccessToAllHosts())
|
| return false;
|
|
|