socket_permission_data.h revision effb81e5f8246d0db0270817048dc992db66e9fb
1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/common/permissions/api_permission.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/common/permissions/socket_permission_entry.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ipc/ipc_param_traits.h"
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ipc_fuzzer {
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtemplate <class T>
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstruct FuzzTraits;
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtemplate <class T>
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstruct GenerateTraits;
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace ipc_fuzzer
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A pattern that can be used to match socket permission.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   <socket-permission-pattern>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//          := <op> |
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             <op> ':' <host> |
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             <op> ':' ':' <port> |
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//             <op> ':' <host> ':' <port> |
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//             'udp-multicast-membership'
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   <op>   := 'tcp-connect' |
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             'tcp-listen' |
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             'udp-bind' |
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)//             'udp-send-to' |
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)//             'udp-multicast-membership' |
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)//             'resolve-host' |
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)//             'resolve-proxy' |
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)//             'network-state'
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   <host> := '*' |
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             '*.' <anychar except '/' and '*'>+ |
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             <anychar except '/' and '*'>+
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   <port> := '*' |
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             <port number between 0 and 65535>)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The multicast membership permission implies a permission to any address.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketPermissionData {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketPermissionData();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SocketPermissionData();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // operators <, == are needed by container std::set and algorithms
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // std::set_includes and std::set_differences.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<(const SocketPermissionData& rhs) const;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const SocketPermissionData& rhs) const;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check if |param| (which must be a SocketPermissionData::CheckParam)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // matches the spec of |this|.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Check(const APIPermission::CheckParam* param) const;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Convert |this| into a base::Value.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> ToValue() const;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Populate |this| from a base::Value.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool FromValue(const base::Value* value);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(bryeung): SocketPermissionData should be encoded as a base::Value
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // instead of a string.  Until that is done, expose these methods for
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // testing.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ParseForTest(const std::string& permission) { return Parse(permission); }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& GetAsStringForTest() const { return GetAsString(); }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const SocketPermissionEntry& entry() const { return entry_; }
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Friend so ParamTraits can serialize us.
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  friend struct IPC::ParamTraits<SocketPermissionData>;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend struct ipc_fuzzer::FuzzTraits<SocketPermissionData>;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend struct ipc_fuzzer::GenerateTraits<SocketPermissionData>;
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SocketPermissionEntry& entry();
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Parse(const std::string& permission);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& GetAsString() const;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SocketPermissionEntry entry_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable std::string spec_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // EXTENSIONS_COMMON_PERMISSIONS_SOCKET_PERMISSION_DATA_H_
90