// Copyright 2014 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. #ifndef EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_ #define EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_ #include <string> #include "extensions/common/permissions/api_permission.h" #include "extensions/common/permissions/socket_permission_entry.h" #include "ipc/ipc_param_traits.h" namespace ipc_fuzzer { template <class T> struct FuzzTraits; template <class T> struct GenerateTraits; } // namespace ipc_fuzzer namespace extensions { // A pattern that can be used to match socket permission. // <socket-permission-pattern> // := <op> | // <op> ':' <host> | // <op> ':' ':' <port> | // <op> ':' <host> ':' <port> | // 'udp-multicast-membership' // <op> := 'tcp-connect' | // 'tcp-listen' | // 'udp-bind' | // 'udp-send-to' | // 'udp-multicast-membership' | // 'resolve-host' | // 'resolve-proxy' | // 'network-state' // <host> := '*' | // '*.' <anychar except '/' and '*'>+ | // <anychar except '/' and '*'>+ // <port> := '*' | // <port number between 0 and 65535>) // The multicast membership permission implies a permission to any address. class SocketPermissionData { public: SocketPermissionData(); ~SocketPermissionData(); // operators <, == are needed by container std::set and algorithms // std::set_includes and std::set_differences. bool operator<(const SocketPermissionData& rhs) const; bool operator==(const SocketPermissionData& rhs) const; // Check if |param| (which must be a SocketPermissionData::CheckParam) // matches the spec of |this|. bool Check(const APIPermission::CheckParam* param) const; // Convert |this| into a base::Value. scoped_ptr<base::Value> ToValue() const; // Populate |this| from a base::Value. bool FromValue(const base::Value* value); // TODO(bryeung): SocketPermissionData should be encoded as a base::Value // instead of a string. Until that is done, expose these methods for // testing. bool ParseForTest(const std::string& permission) { return Parse(permission); } const std::string& GetAsStringForTest() const { return GetAsString(); } const SocketPermissionEntry& entry() const { return entry_; } private: // Friend so ParamTraits can serialize us. friend struct IPC::ParamTraits<SocketPermissionData>; friend struct ipc_fuzzer::FuzzTraits<SocketPermissionData>; friend struct ipc_fuzzer::GenerateTraits<SocketPermissionData>; SocketPermissionEntry& entry(); bool Parse(const std::string& permission); const std::string& GetAsString() const; void Reset(); SocketPermissionEntry entry_; mutable std::string spec_; }; } // namespace extensions #endif // EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_