// 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_ENTRY_H_ #define EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_ENTRY_H_ #include <string> #include <vector> #include "content/public/common/socket_permission_request.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 { // Internal representation of a socket permission for a specific operation, such // as UDP "bind", host 127.0.0.1, port *. class SocketPermissionEntry { public: enum HostType { ANY_HOST, HOSTS_IN_DOMAINS, SPECIFIC_HOSTS, }; SocketPermissionEntry(); ~SocketPermissionEntry(); // operators <, == are needed by container std::set and algorithms // std::set_includes and std::set_differences. bool operator<(const SocketPermissionEntry& rhs) const; bool operator==(const SocketPermissionEntry& rhs) const; bool Check(const content::SocketPermissionRequest& request) const; // Parse a host:port pattern for a given operation type. // <pattern> := '' | // <host> | // ':' <port> | // <host> ':' <port> | // // <host> := '*' | // '*.' <anychar except '/' and '*'>+ | // <anychar except '/' and '*'>+ // // <port> := '*' | // <port number between 0 and 65535>) static bool ParseHostPattern( content::SocketPermissionRequest::OperationType type, const std::string& pattern, SocketPermissionEntry* entry); static bool ParseHostPattern( content::SocketPermissionRequest::OperationType type, const std::vector<std::string>& pattern_tokens, SocketPermissionEntry* entry); // Returns true if the permission type can be bound to a host or port. bool IsAddressBoundType() const; std::string GetHostPatternAsString() const; HostType GetHostType() const; const content::SocketPermissionRequest& pattern() const { return pattern_; } bool match_subdomains() const { return match_subdomains_; } private: // Friend so ParamTraits can serialize us. friend struct IPC::ParamTraits<SocketPermissionEntry>; friend struct ipc_fuzzer::FuzzTraits<SocketPermissionEntry>; friend struct ipc_fuzzer::GenerateTraits<SocketPermissionEntry>; // The permission type, host and port. content::SocketPermissionRequest pattern_; // True if there was a wildcard in the host name. bool match_subdomains_; }; } // namespace extensions #endif // EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_ENTRY_H_