Index: extensions/common/api/sockets/sockets_manifest_permission.cc |
diff --git a/extensions/common/api/sockets/sockets_manifest_permission.cc b/extensions/common/api/sockets/sockets_manifest_permission.cc |
index b20285ed9b68d55d09a5bb321dd194e4f0942f0a..52f42058609daef73d0bee02bd9918fc775eddc7 100644 |
--- a/extensions/common/api/sockets/sockets_manifest_permission.cc |
+++ b/extensions/common/api/sockets/sockets_manifest_permission.cc |
@@ -77,16 +77,135 @@ static void SetHostPatterns( |
content::SocketPermissionRequest::OperationType operation_type) { |
host_patterns.reset(new SocketHostPatterns()); |
host_patterns->as_strings.reset(new std::vector<std::string>()); |
- for (SocketsManifestPermission::SocketPermissionEntrySet::const_iterator it = |
+ for (SocketPermissionEntrySet::const_iterator it = |
permission->entries().begin(); |
- it != permission->entries().end(); |
- ++it) { |
+ it != permission->entries().end(); ++it) { |
if (it->pattern().type == operation_type) { |
host_patterns->as_strings->push_back(it->GetHostPatternAsString()); |
} |
} |
} |
+// Helper function for adding the 'any host' permission. Determines if the |
+// message is needed from |sockets|, and adds the permission to |ids| and/or |
+// |messages|, ignoring them if they are NULL. Returns true if it added the |
+// message. |
+bool AddAnyHostMessage(const SocketPermissionEntrySet& sockets, |
+ PermissionIDSet* ids, |
+ PermissionMessages* messages) { |
+ for (const auto& socket : sockets) { |
+ if (socket.IsAddressBoundType() && |
+ socket.GetHostType() == SocketPermissionEntry::ANY_HOST) { |
+ // TODO(sashab): Add a rule to ChromePermissionMessageProvider: |
+ // kSocketAnyHost -> IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST |
+ if (ids) |
+ ids->insert(APIPermission::kSocketAnyHost); |
+ if (messages) { |
+ messages->push_back(PermissionMessage( |
+ PermissionMessage::kSocketAnyHost, |
+ l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST))); |
+ } |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+// Helper function for adding subdomain socket permissions. Determines what |
+// messages are needed from |sockets|, and adds permissions to |ids| and/or |
+// |messages|, ignoring them if they are NULL. |
+void AddSubdomainHostMessage(const SocketPermissionEntrySet& sockets, |
+ PermissionIDSet* ids, |
+ PermissionMessages* messages) { |
+ std::set<base::string16> domains; |
+ for (const auto& socket : sockets) { |
+ if (socket.GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS) |
+ domains.insert(base::UTF8ToUTF16(socket.pattern().host)); |
+ } |
+ if (!domains.empty()) { |
+ // TODO(sashab): This is not correct for all languages - add proper |
+ // internationalization of this string for all plural states. |
+ if (messages) { |
+ int id = (domains.size() == 1) |
+ ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN |
+ : IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS; |
+ messages->push_back(PermissionMessage( |
+ PermissionMessage::kSocketDomainHosts, |
+ l10n_util::GetStringFUTF16( |
+ id, JoinString(std::vector<base::string16>(domains.begin(), |
+ domains.end()), |
+ ' ')))); |
+ } |
+ // TODO(sashab): Add rules to ChromePermissionMessageProvider: |
+ // kSocketDomainHosts -> |
+ // IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN if 1 |
+ // IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS if many |
+ if (ids) { |
+ for (const auto& domain : domains) |
+ ids->insert(APIPermission::kSocketDomainHosts, domain); |
+ } |
+ } |
+} |
+ |
+// Helper function for adding specific host socket permissions. Determines what |
+// messages are needed from |sockets|, and adds permissions to |ids| and/or |
+// |messages|, ignoring them if they are NULL. |
+void AddSpecificHostMessage(const SocketPermissionEntrySet& sockets, |
+ PermissionIDSet* ids, |
+ PermissionMessages* messages) { |
+ std::set<base::string16> hostnames; |
+ for (const auto& socket : sockets) { |
+ if (socket.GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS) |
+ hostnames.insert(base::UTF8ToUTF16(socket.pattern().host)); |
+ } |
+ if (!hostnames.empty()) { |
+ // TODO(sashab): This is not correct for all languages - add proper |
+ // internationalization of this string for all plural states. |
+ if (messages) { |
+ int id = (hostnames.size() == 1) |
+ ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST |
+ : IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS; |
+ messages->push_back(PermissionMessage( |
+ PermissionMessage::kSocketSpecificHosts, |
+ l10n_util::GetStringFUTF16( |
+ id, JoinString(std::vector<base::string16>(hostnames.begin(), |
+ hostnames.end()), |
+ ' ')))); |
+ } |
+ // TODO(sashab): Add rules to ChromePermissionMessageProvider: |
+ // kSocketSpecificHosts -> |
+ // IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST if 1 |
+ // IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS if many |
+ if (ids) { |
+ for (const auto& hostname : hostnames) |
+ ids->insert(APIPermission::kSocketSpecificHosts, hostname); |
+ } |
+ } |
+} |
+ |
+// Helper function for adding the network list socket permission. Determines if |
+// the message is needed from |sockets|, and adds the permission to |ids| and/or |
+// |messages|, ignoring them if they are NULL. |
+void AddNetworkListMessage(const SocketPermissionEntrySet& sockets, |
+ PermissionIDSet* ids, |
+ PermissionMessages* messages) { |
+ for (const auto& socket : sockets) { |
+ if (socket.pattern().type == SocketPermissionRequest::NETWORK_STATE) { |
+ // TODO(sashab): Add a rule to ChromePermissionMessageProvider: |
+ // kNetworkState -> IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE |
+ if (ids) |
+ ids->insert(APIPermission::kNetworkState); |
+ if (messages) { |
+ messages->push_back( |
+ PermissionMessage(PermissionMessage::kNetworkState, |
+ l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE))); |
+ } |
+ } |
+ } |
+} |
+ |
} // namespace |
SocketsManifestPermission::SocketsManifestPermission() {} |
@@ -160,9 +279,8 @@ std::string SocketsManifestPermission::name() const { |
std::string SocketsManifestPermission::id() const { return name(); } |
PermissionIDSet SocketsManifestPermission::GetPermissions() const { |
- PermissionMessages messages; |
PermissionIDSet ids; |
- AddAllHostMessages(messages, ids); |
+ AddSocketHostPermissions(permissions_, &ids, NULL); |
return ids; |
} |
@@ -173,8 +291,7 @@ bool SocketsManifestPermission::HasMessages() const { |
PermissionMessages SocketsManifestPermission::GetMessages() const { |
PermissionMessages messages; |
- PermissionIDSet ids; |
- AddAllHostMessages(messages, ids); |
+ AddSocketHostPermissions(permissions_, NULL, &messages); |
return messages; |
} |
@@ -263,117 +380,16 @@ void SocketsManifestPermission::AddPermission( |
permissions_.insert(entry); |
} |
-void SocketsManifestPermission::AddAllHostMessages(PermissionMessages& messages, |
- PermissionIDSet& ids) const { |
- // TODO(rpaquay): This function and callees is (almost) a copy/paste from |
- // extensions::SocketPermission. |
- if (!AddAnyHostMessage(messages, ids)) { |
- AddSpecificHostMessage(messages, ids); |
- AddSubdomainHostMessage(messages, ids); |
- } |
- AddNetworkListMessage(messages, ids); |
-} |
- |
-bool SocketsManifestPermission::AddAnyHostMessage(PermissionMessages& messages, |
- PermissionIDSet& ids) const { |
- for (SocketPermissionEntrySet::const_iterator it = permissions_.begin(); |
- it != permissions_.end(); |
- ++it) { |
- if (it->IsAddressBoundType() && |
- it->GetHostType() == SocketPermissionEntry::ANY_HOST) { |
- // TODO(sashab): Add a rule to ChromePermissionMessageProvider: |
- // kSocketAnyHost -> IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST |
- ids.insert(APIPermission::kSocketAnyHost); |
- messages.push_back( |
- PermissionMessage(PermissionMessage::kSocketAnyHost, |
- l10n_util::GetStringUTF16( |
- IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST))); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-void SocketsManifestPermission::AddSubdomainHostMessage( |
- PermissionMessages& messages, |
- PermissionIDSet& ids) const { |
- std::set<base::string16> domains; |
- for (SocketPermissionEntrySet::const_iterator it = permissions_.begin(); |
- it != permissions_.end(); |
- ++it) { |
- if (it->GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS) |
- domains.insert(base::UTF8ToUTF16(it->pattern().host)); |
- } |
- if (!domains.empty()) { |
- // TODO(sashab): This is not correct for all languages - add proper |
- // internationalization of this string for all plural states. |
- int id = (domains.size() == 1) |
- ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN |
- : IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS; |
- messages.push_back(PermissionMessage( |
- PermissionMessage::kSocketDomainHosts, |
- l10n_util::GetStringFUTF16( |
- id, |
- JoinString( |
- std::vector<base::string16>(domains.begin(), domains.end()), |
- ' ')))); |
- // TODO(sashab): Add rules to ChromePermissionMessageProvider: |
- // kSocketDomainHosts -> |
- // IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN if 1 |
- // IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS if many |
- for (const auto& domain : domains) |
- ids.insert(APIPermission::kSocketDomainHosts, domain); |
- } |
-} |
- |
-void SocketsManifestPermission::AddSpecificHostMessage( |
- PermissionMessages& messages, |
- PermissionIDSet& ids) const { |
- std::set<base::string16> hostnames; |
- for (SocketPermissionEntrySet::const_iterator it = permissions_.begin(); |
- it != permissions_.end(); |
- ++it) { |
- if (it->GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS) |
- hostnames.insert(base::UTF8ToUTF16(it->pattern().host)); |
- } |
- if (!hostnames.empty()) { |
- // TODO(sashab): This is not correct for all languages - add proper |
- // internationalization of this string for all plural states. |
- int id = (hostnames.size() == 1) |
- ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST |
- : IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS; |
- messages.push_back(PermissionMessage( |
- PermissionMessage::kSocketSpecificHosts, |
- l10n_util::GetStringFUTF16( |
- id, |
- JoinString( |
- std::vector<base::string16>(hostnames.begin(), hostnames.end()), |
- ' ')))); |
- // TODO(sashab): Add rules to ChromePermissionMessageProvider: |
- // kSocketSpecificHosts -> |
- // IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST if 1 |
- // IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS if many |
- for (const auto& hostname : hostnames) |
- ids.insert(APIPermission::kSocketSpecificHosts, hostname); |
- } |
-} |
- |
-void SocketsManifestPermission::AddNetworkListMessage( |
- PermissionMessages& messages, |
- PermissionIDSet& ids) const { |
- for (SocketPermissionEntrySet::const_iterator it = permissions_.begin(); |
- it != permissions_.end(); |
- ++it) { |
- if (it->pattern().type == SocketPermissionRequest::NETWORK_STATE) { |
- // TODO(sashab): Add a rule to ChromePermissionMessageProvider: |
- // kNetworkState -> IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE |
- ids.insert(APIPermission::kNetworkState); |
- messages.push_back( |
- PermissionMessage(PermissionMessage::kNetworkState, |
- l10n_util::GetStringUTF16( |
- IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE))); |
- } |
+// static |
+void SocketsManifestPermission::AddSocketHostPermissions( |
+ const SocketPermissionEntrySet& sockets, |
+ PermissionIDSet* ids, |
+ PermissionMessages* messages) { |
+ if (!AddAnyHostMessage(sockets, ids, messages)) { |
+ AddSpecificHostMessage(sockets, ids, messages); |
+ AddSubdomainHostMessage(sockets, ids, messages); |
} |
+ AddNetworkListMessage(sockets, ids, messages); |
} |
} // namespace extensions |