1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4#ifndef EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_ 5#define EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_ 6 7#include <string> 8 9#include "extensions/common/permissions/api_permission.h" 10#include "extensions/common/permissions/socket_permission_entry.h" 11#include "ipc/ipc_param_traits.h" 12 13namespace ipc_fuzzer { 14template <class T> 15struct FuzzTraits; 16template <class T> 17struct GenerateTraits; 18} // namespace ipc_fuzzer 19 20namespace extensions { 21 22// A pattern that can be used to match socket permission. 23// <socket-permission-pattern> 24// := <op> | 25// <op> ':' <host> | 26// <op> ':' ':' <port> | 27// <op> ':' <host> ':' <port> | 28// 'udp-multicast-membership' 29// <op> := 'tcp-connect' | 30// 'tcp-listen' | 31// 'udp-bind' | 32// 'udp-send-to' | 33// 'udp-multicast-membership' | 34// 'resolve-host' | 35// 'resolve-proxy' | 36// 'network-state' 37// <host> := '*' | 38// '*.' <anychar except '/' and '*'>+ | 39// <anychar except '/' and '*'>+ 40// <port> := '*' | 41// <port number between 0 and 65535>) 42// The multicast membership permission implies a permission to any address. 43class SocketPermissionData { 44 public: 45 SocketPermissionData(); 46 ~SocketPermissionData(); 47 48 // operators <, == are needed by container std::set and algorithms 49 // std::set_includes and std::set_differences. 50 bool operator<(const SocketPermissionData& rhs) const; 51 bool operator==(const SocketPermissionData& rhs) const; 52 53 // Check if |param| (which must be a SocketPermissionData::CheckParam) 54 // matches the spec of |this|. 55 bool Check(const APIPermission::CheckParam* param) const; 56 57 // Convert |this| into a base::Value. 58 scoped_ptr<base::Value> ToValue() const; 59 60 // Populate |this| from a base::Value. 61 bool FromValue(const base::Value* value); 62 63 // TODO(bryeung): SocketPermissionData should be encoded as a base::Value 64 // instead of a string. Until that is done, expose these methods for 65 // testing. 66 bool ParseForTest(const std::string& permission) { return Parse(permission); } 67 const std::string& GetAsStringForTest() const { return GetAsString(); } 68 69 const SocketPermissionEntry& entry() const { return entry_; } 70 71 private: 72 // Friend so ParamTraits can serialize us. 73 friend struct IPC::ParamTraits<SocketPermissionData>; 74 friend struct ipc_fuzzer::FuzzTraits<SocketPermissionData>; 75 friend struct ipc_fuzzer::GenerateTraits<SocketPermissionData>; 76 77 SocketPermissionEntry& entry(); 78 79 bool Parse(const std::string& permission); 80 const std::string& GetAsString() const; 81 void Reset(); 82 83 SocketPermissionEntry entry_; 84 mutable std::string spec_; 85}; 86 87} // namespace extensions 88 89#endif // EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_ 90