| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef CHROME_COMMON_EXTENSIONS_PERMISSIONS_SET_DISJUNCTION_PERMISSION_H_ | 5 #ifndef EXTENSIONS_COMMON_PERMISSIONS_SET_DISJUNCTION_PERMISSION_H_ | 
| 6 #define CHROME_COMMON_EXTENSIONS_PERMISSIONS_SET_DISJUNCTION_PERMISSION_H_ | 6 #define EXTENSIONS_COMMON_PERMISSIONS_SET_DISJUNCTION_PERMISSION_H_ | 
| 7 | 7 | 
| 8 #include <algorithm> | 8 #include <algorithm> | 
| 9 #include <set> | 9 #include <set> | 
| 10 #include <string> | 10 #include <string> | 
| 11 | 11 | 
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" | 
| 13 #include "base/values.h" | 13 #include "base/values.h" | 
| 14 #include "extensions/common/extension_messages.h" | 14 #include "extensions/common/extension_messages.h" | 
| 15 #include "extensions/common/permissions/api_permission.h" | 15 #include "extensions/common/permissions/api_permission.h" | 
| 16 #include "ipc/ipc_message.h" | 16 #include "ipc/ipc_message.h" | 
| 17 #include "ipc/ipc_message_utils.h" | 17 #include "ipc/ipc_message_utils.h" | 
| 18 | 18 | 
| 19 namespace extensions { | 19 namespace extensions { | 
| 20 | 20 | 
| 21 // An abstract base class for permissions that are represented by the | 21 // An abstract base class for permissions that are represented by the | 
| 22 // disjunction of a set of conditions.  Each condition is represented by a | 22 // disjunction of a set of conditions.  Each condition is represented by a | 
| 23 // |PermissionDataType| (e.g. SocketPermissionData).  If an | 23 // |PermissionDataType| (e.g. SocketPermissionData).  If an | 
| 24 // APIPermission::CheckParam matches any of the conditions in the set, the | 24 // APIPermission::CheckParam matches any of the conditions in the set, the | 
| 25 // permission is granted. | 25 // permission is granted. | 
| 26 // | 26 // | 
| 27 // For an example of how to use this class, see SocketPermission. | 27 // For an example of how to use this class, see SocketPermission. | 
| 28 template <class PermissionDataType, class DerivedType> | 28 template <class PermissionDataType, class DerivedType> | 
| 29 class SetDisjunctionPermission : public APIPermission { | 29 class SetDisjunctionPermission : public APIPermission { | 
| 30  public: | 30  public: | 
| 31   explicit SetDisjunctionPermission(const APIPermissionInfo* info) | 31   explicit SetDisjunctionPermission(const APIPermissionInfo* info) | 
| 32     : APIPermission(info) { | 32       : APIPermission(info) {} | 
| 33   } |  | 
| 34 | 33 | 
| 35   ~SetDisjunctionPermission() { | 34   ~SetDisjunctionPermission() {} | 
| 36   } |  | 
| 37 | 35 | 
| 38   // APIPermission overrides | 36   // APIPermission overrides | 
| 39   virtual bool HasMessages() const OVERRIDE { | 37   virtual bool HasMessages() const OVERRIDE { return !data_set_.empty(); } | 
| 40     return !data_set_.empty(); |  | 
| 41   } |  | 
| 42 | 38 | 
| 43   virtual bool Check(const APIPermission::CheckParam* param) const OVERRIDE { | 39   virtual bool Check(const APIPermission::CheckParam* param) const OVERRIDE { | 
| 44     for (typename std::set<PermissionDataType>::const_iterator i = | 40     for (typename std::set<PermissionDataType>::const_iterator i = | 
| 45         data_set_.begin(); i != data_set_.end(); ++i) { | 41              data_set_.begin(); | 
|  | 42          i != data_set_.end(); | 
|  | 43          ++i) { | 
| 46       if (i->Check(param)) | 44       if (i->Check(param)) | 
| 47         return true; | 45         return true; | 
| 48     } | 46     } | 
| 49     return false; | 47     return false; | 
| 50   } | 48   } | 
| 51 | 49 | 
| 52   virtual bool Contains(const APIPermission* rhs) const OVERRIDE { | 50   virtual bool Contains(const APIPermission* rhs) const OVERRIDE { | 
| 53     CHECK(rhs->info() == info()); | 51     CHECK(rhs->info() == info()); | 
| 54     const SetDisjunctionPermission* perm = | 52     const SetDisjunctionPermission* perm = | 
| 55         static_cast<const SetDisjunctionPermission*>(rhs); | 53         static_cast<const SetDisjunctionPermission*>(rhs); | 
| 56     return std::includes( | 54     return std::includes(data_set_.begin(), | 
| 57         data_set_.begin(), data_set_.end(), | 55                          data_set_.end(), | 
| 58         perm->data_set_.begin(), perm->data_set_.end()); | 56                          perm->data_set_.begin(), | 
|  | 57                          perm->data_set_.end()); | 
| 59   } | 58   } | 
| 60 | 59 | 
| 61   virtual bool Equal(const APIPermission* rhs) const OVERRIDE { | 60   virtual bool Equal(const APIPermission* rhs) const OVERRIDE { | 
| 62     CHECK(rhs->info() == info()); | 61     CHECK(rhs->info() == info()); | 
| 63     const SetDisjunctionPermission* perm = | 62     const SetDisjunctionPermission* perm = | 
| 64         static_cast<const SetDisjunctionPermission*>(rhs); | 63         static_cast<const SetDisjunctionPermission*>(rhs); | 
| 65     return data_set_ == perm->data_set_; | 64     return data_set_ == perm->data_set_; | 
| 66   } | 65   } | 
| 67 | 66 | 
| 68   virtual APIPermission* Clone() const OVERRIDE { | 67   virtual APIPermission* Clone() const OVERRIDE { | 
| 69     SetDisjunctionPermission* result = new DerivedType(info()); | 68     SetDisjunctionPermission* result = new DerivedType(info()); | 
| 70     result->data_set_ = data_set_; | 69     result->data_set_ = data_set_; | 
| 71     return result; | 70     return result; | 
| 72   } | 71   } | 
| 73 | 72 | 
| 74   virtual APIPermission* Diff(const APIPermission* rhs) const OVERRIDE { | 73   virtual APIPermission* Diff(const APIPermission* rhs) const OVERRIDE { | 
| 75     CHECK(rhs->info() == info()); | 74     CHECK(rhs->info() == info()); | 
| 76     const SetDisjunctionPermission* perm = | 75     const SetDisjunctionPermission* perm = | 
| 77         static_cast<const SetDisjunctionPermission*>(rhs); | 76         static_cast<const SetDisjunctionPermission*>(rhs); | 
| 78     scoped_ptr<SetDisjunctionPermission> result(new DerivedType(info())); | 77     scoped_ptr<SetDisjunctionPermission> result(new DerivedType(info())); | 
| 79     std::set_difference( | 78     std::set_difference(data_set_.begin(), | 
| 80         data_set_.begin(), data_set_.end(), | 79                         data_set_.end(), | 
| 81         perm->data_set_.begin(), perm->data_set_.end(), | 80                         perm->data_set_.begin(), | 
| 82         std::inserter<std::set<PermissionDataType> >( | 81                         perm->data_set_.end(), | 
| 83             result->data_set_, result->data_set_.begin())); | 82                         std::inserter<std::set<PermissionDataType> >( | 
|  | 83                             result->data_set_, result->data_set_.begin())); | 
| 84     return result->data_set_.empty() ? NULL : result.release(); | 84     return result->data_set_.empty() ? NULL : result.release(); | 
| 85   } | 85   } | 
| 86 | 86 | 
| 87   virtual APIPermission* Union(const APIPermission* rhs) const OVERRIDE { | 87   virtual APIPermission* Union(const APIPermission* rhs) const OVERRIDE { | 
| 88     CHECK(rhs->info() == info()); | 88     CHECK(rhs->info() == info()); | 
| 89     const SetDisjunctionPermission* perm = | 89     const SetDisjunctionPermission* perm = | 
| 90         static_cast<const SetDisjunctionPermission*>(rhs); | 90         static_cast<const SetDisjunctionPermission*>(rhs); | 
| 91     scoped_ptr<SetDisjunctionPermission> result(new DerivedType(info())); | 91     scoped_ptr<SetDisjunctionPermission> result(new DerivedType(info())); | 
| 92     std::set_union( | 92     std::set_union(data_set_.begin(), | 
| 93         data_set_.begin(), data_set_.end(), | 93                    data_set_.end(), | 
| 94         perm->data_set_.begin(), perm->data_set_.end(), | 94                    perm->data_set_.begin(), | 
| 95         std::inserter<std::set<PermissionDataType> >( | 95                    perm->data_set_.end(), | 
| 96             result->data_set_, result->data_set_.begin())); | 96                    std::inserter<std::set<PermissionDataType> >( | 
|  | 97                        result->data_set_, result->data_set_.begin())); | 
| 97     return result.release(); | 98     return result.release(); | 
| 98   } | 99   } | 
| 99 | 100 | 
| 100   virtual APIPermission* Intersect(const APIPermission* rhs) const OVERRIDE { | 101   virtual APIPermission* Intersect(const APIPermission* rhs) const OVERRIDE { | 
| 101     CHECK(rhs->info() == info()); | 102     CHECK(rhs->info() == info()); | 
| 102     const SetDisjunctionPermission* perm = | 103     const SetDisjunctionPermission* perm = | 
| 103         static_cast<const SetDisjunctionPermission*>(rhs); | 104         static_cast<const SetDisjunctionPermission*>(rhs); | 
| 104     scoped_ptr<SetDisjunctionPermission> result(new DerivedType(info())); | 105     scoped_ptr<SetDisjunctionPermission> result(new DerivedType(info())); | 
| 105     std::set_intersection( | 106     std::set_intersection(data_set_.begin(), | 
| 106         data_set_.begin(), data_set_.end(), | 107                           data_set_.end(), | 
| 107         perm->data_set_.begin(), perm->data_set_.end(), | 108                           perm->data_set_.begin(), | 
| 108         std::inserter<std::set<PermissionDataType> >( | 109                           perm->data_set_.end(), | 
| 109             result->data_set_, result->data_set_.begin())); | 110                           std::inserter<std::set<PermissionDataType> >( | 
|  | 111                               result->data_set_, result->data_set_.begin())); | 
| 110     return result->data_set_.empty() ? NULL : result.release(); | 112     return result->data_set_.empty() ? NULL : result.release(); | 
| 111   } | 113   } | 
| 112 | 114 | 
| 113   virtual bool FromValue(const base::Value* value, | 115   virtual bool FromValue(const base::Value* value, | 
| 114                          std::string* error) OVERRIDE { | 116                          std::string* error) OVERRIDE { | 
| 115     data_set_.clear(); | 117     data_set_.clear(); | 
| 116     const base::ListValue* list = NULL; | 118     const base::ListValue* list = NULL; | 
| 117 | 119 | 
| 118     if (!value || !value->GetAsList(&list) || list->GetSize() == 0) { | 120     if (!value || !value->GetAsList(&list) || list->GetSize() == 0) { | 
| 119       if (error) | 121       if (error) | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 160   virtual void Log(std::string* log) const OVERRIDE { | 162   virtual void Log(std::string* log) const OVERRIDE { | 
| 161     IPC::LogParam(data_set_, log); | 163     IPC::LogParam(data_set_, log); | 
| 162   } | 164   } | 
| 163 | 165 | 
| 164  protected: | 166  protected: | 
| 165   std::set<PermissionDataType> data_set_; | 167   std::set<PermissionDataType> data_set_; | 
| 166 }; | 168 }; | 
| 167 | 169 | 
| 168 }  // namespace extensions | 170 }  // namespace extensions | 
| 169 | 171 | 
| 170 #endif  // CHROME_COMMON_EXTENSIONS_PERMISSIONS_SET_DISJUNCTION_PERMISSION_H_ | 172 #endif  // EXTENSIONS_COMMON_PERMISSIONS_SET_DISJUNCTION_PERMISSION_H_ | 
| OLD | NEW | 
|---|