Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3471)

Unified Diff: chrome/common/extensions/permissions/socket_permission.cc

Issue 10692160: Support socket endpoint permissions for AppsV2 Socket API. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase and fix a unit test Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/permissions/socket_permission.cc
diff --git a/chrome/common/extensions/permissions/socket_permission.cc b/chrome/common/extensions/permissions/socket_permission.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e21eb9faf38a10db4175ae272af12cc8839a4c9c
--- /dev/null
+++ b/chrome/common/extensions/permissions/socket_permission.cc
@@ -0,0 +1,138 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/extensions/permissions/socket_permission.h"
+
+#include <algorithm>
+
+#include "base/logging.h"
+#include "base/values.h"
+#include "chrome/common/extensions/extension_messages.h"
+#include "chrome/common/extensions/permissions/permissions_info.h"
+#include "grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace extensions {
+
+SocketPermission::SocketPermission(const APIPermission* permission)
+ : APIPermissionDetail(permission) {
+}
+
+SocketPermission::~SocketPermission() {
+}
+
+bool SocketPermission::Check(
+ const APIPermissionDetail::CheckParam* param) const {
+ const CheckParam* socket_param = static_cast<const CheckParam*>(param);
+ std::set<SocketPermissionData>::const_iterator it = data_set_.begin();
+ std::set<SocketPermissionData>::const_iterator end = data_set_.end();
+
+ for (; it != end; ++it) {
+ if (it->Match(socket_param->type, socket_param->host, socket_param->port))
+ return true;
+ }
+ return false;
+}
+
+bool SocketPermission::Contains(const APIPermissionDetail* rhs) const {
+ CHECK(rhs->permission() == permission());
+ const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
+ return std::includes(data_set_.begin(), data_set_.end(),
+ perm->data_set_.begin(), perm->data_set_.end());
+}
+
+bool SocketPermission::Equal(const APIPermissionDetail* rhs) const {
+ CHECK(rhs->permission() == permission());
+ const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
+ return data_set_ == perm->data_set_;
+}
+
+bool SocketPermission::FromValue(const base::Value* value) {
+ data_set_.clear();
+ const base::ListValue* list = NULL;
+
+ if (!value)
+ return false;
+
+ if (!value->GetAsList(&list) && list->GetSize() == 0)
+ return false;
+
+ for (size_t i = 0; i < list->GetSize(); ++i) {
+ std::string str;
+ SocketPermissionData data;
+ if (!list->GetString(i, &str) || !data.Parse(str))
+ return false;
+ data_set_.insert(data);
+ }
+ return true;
+}
+
+void SocketPermission::ToValue(base::Value** value) const {
+ base::ListValue* list = new ListValue();
+
+ std::set<SocketPermissionData>::const_iterator it = data_set_.begin();
+ std::set<SocketPermissionData>::const_iterator end = data_set_.end();
+
+ for (;it != end; ++it) {
+ list->Append(base::Value::CreateStringValue(it->GetAsString()));
+ }
+ *value = list;
+}
+
+APIPermissionDetail* SocketPermission::Clone() const {
+ SocketPermission* result = new SocketPermission(permission());
+ result->data_set_ = data_set_;
+ return result;
+}
+
+APIPermissionDetail* SocketPermission::Diff(
+ const APIPermissionDetail* rhs) const {
+ CHECK(rhs->permission() == permission());
+ const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
+ scoped_refptr<SocketPermission> result = new SocketPermission(permission());
+ std::set_difference(data_set_.begin(), data_set_.end(),
+ perm->data_set_.begin(), perm->data_set_.end(),
+ std::inserter<std::set<SocketPermissionData> >(
+ result->data_set_, result->data_set_.begin()));
+ return result->data_set_.empty() ? NULL : result.release();
+}
+
+APIPermissionDetail* SocketPermission::Union(
+ const APIPermissionDetail* rhs) const {
+ CHECK(rhs->permission() == permission());
+ const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
+ scoped_refptr<SocketPermission> result = new SocketPermission(permission());
+ std::set_union(data_set_.begin(), data_set_.end(),
+ perm->data_set_.begin(), perm->data_set_.end(),
+ std::inserter<std::set<SocketPermissionData> >(
+ result->data_set_, result->data_set_.begin()));
+ return result->data_set_.empty() ? NULL : result.release();
+}
+
+APIPermissionDetail* SocketPermission::Intersect(
+ const APIPermissionDetail* rhs) const {
+ CHECK(rhs->permission() == permission());
+ const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
+ scoped_refptr<SocketPermission> result = new SocketPermission(permission());
+ std::set_intersection(data_set_.begin(), data_set_.end(),
+ perm->data_set_.begin(), perm->data_set_.end(),
+ std::inserter<std::set<SocketPermissionData> >(
+ result->data_set_, result->data_set_.begin()));
+ return result->data_set_.empty() ? NULL : result.release();
+}
+
+void SocketPermission::Write(IPC::Message* m) const {
+ IPC::WriteParam(m, data_set_);
+}
+
+bool SocketPermission::Read(const IPC::Message* m, PickleIterator* iter) {
+ return IPC::ReadParam(m, iter, &data_set_);
+}
+
+void SocketPermission::Log(std::string* log) const {
+ IPC::LogParam(data_set_, log);
+}
+
+} // namespace extensions
+

Powered by Google App Engine
This is Rietveld 408576698