| 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 a2980c503d02f7c276b3c19fbd30f77a9d02003a..b711c7f17986ef755fe70183166cb50d4597b03f 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,36 +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 {
|
| - for (URLPatternSet::const_iterator i = effective_hosts_.begin();
|
| - i != effective_hosts_.end(); ++i) {
|
| - if (i->scheme() != chrome::kChromeUIScheme)
|
| - continue;
|
| - // chrome://favicon is the only URL for chrome:// scheme that we
|
| - // want to support. We want to deprecate the "chrome" scheme.
|
| - // We should not add any additional "host" here.
|
| - if (GURL(chrome::kChromeUIFaviconURL).host() != i->host())
|
| - continue;
|
| - messages.push_back(PermissionMessage(
|
| - PermissionMessage::kFavicon,
|
| - l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_FAVICON)));
|
| - }
|
| - 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;
|
| }
|
| @@ -444,7 +421,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;
|
| @@ -453,7 +431,7 @@ bool PermissionSet::HasLessPrivilegesThan(
|
| if (permissions->HasEffectiveFullAccess())
|
| return true;
|
|
|
| - if (HasLessHostPrivilegesThan(permissions))
|
| + if (HasLessHostPrivilegesThan(permissions, extension_type))
|
| return true;
|
|
|
| if (HasLessAPIPrivilegesThan(permissions))
|
| @@ -546,8 +524,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) {
|
| @@ -561,15 +538,50 @@ 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 {
|
| + for (URLPatternSet::const_iterator i = effective_hosts_.begin();
|
| + i != effective_hosts_.end(); ++i) {
|
| + if (i->scheme() != chrome::kChromeUIScheme)
|
| + continue;
|
| + // chrome://favicon is the only URL for chrome:// scheme that we
|
| + // want to support. We want to deprecate the "chrome" scheme.
|
| + // We should not add any additional "host" here.
|
| + if (GURL(chrome::kChromeUIFaviconURL).host() != i->host())
|
| + continue;
|
| + messages.insert(PermissionMessage(
|
| + PermissionMessage::kFavicon,
|
| + l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_FAVICON)));
|
| + }
|
| + 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(),
|
| @@ -580,7 +592,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;
|
|
|