2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #ifndef _SRC_ACCESS_CONTROL_COMMON_POLICY_RESULT_H_
18 #define _SRC_ACCESS_CONTROL_COMMON_POLICY_RESULT_H_
20 #include <dpl/assert.h>
21 #include <dpl/optional_typedefs.h>
22 #include <boost/optional.hpp>
23 #include <ace/PolicyEffect.h>
25 typedef boost::optional<PolicyEffect> OptionalPolicyEffect;
30 enum Value { NOT_APPLICABLE = -1 };
32 PolicyDecision(PolicyEffect effect)
33 : m_isPolicyEffect(true)
37 PolicyDecision(const PolicyDecision &decision)
38 : m_isPolicyEffect(decision.m_isPolicyEffect)
39 , m_effect(decision.m_effect)
43 : m_isPolicyEffect(false)
46 PolicyDecision& operator=(const PolicyDecision &second) {
50 m_isPolicyEffect = second.m_isPolicyEffect;
51 m_effect = second.m_effect;
56 bool operator==(const PolicyDecision &decision) const {
57 return (m_isPolicyEffect
58 && decision.m_isPolicyEffect
59 && m_effect == decision.m_effect)
60 || (!m_isPolicyEffect && !decision.m_isPolicyEffect);
63 bool operator==(Value) const {
64 return !m_isPolicyEffect;
67 bool operator!=(const PolicyDecision &decision) const {
68 return !(*this == decision);
71 bool operator!=(Value value) const {
72 return !(*this == value);
75 OptionalPolicyEffect getEffect() const
77 if (!m_isPolicyEffect) {
78 return OptionalPolicyEffect();
80 return OptionalPolicyEffect(m_effect);
83 std::ostream & toStream(std::ostream& stream) {
87 stream << "NOT-APPLICABLE";
92 bool m_isPolicyEffect;
93 PolicyEffect m_effect;
96 inline static bool operator==(PolicyEffect e, const PolicyDecision &d) {
97 return d.operator==(e);
100 inline static bool operator!=(PolicyEffect e, const PolicyDecision &d) {
104 inline static std::ostream & operator<<(std::ostream& stream,
105 PolicyDecision decision)
107 return decision.toStream(stream);
112 enum Value { UNDETERMINED = -2 };
114 // This constructor is required by dpl controller and by dpl optional
116 : m_isDecision(false)
117 , m_decision(PolicyDecision::Value::NOT_APPLICABLE) // don't care
120 PolicyResult(PolicyEffect effect)
125 PolicyResult(const PolicyDecision &decision)
127 , m_decision(decision)
130 PolicyResult(const PolicyResult &result)
131 : m_isDecision(result.m_isDecision)
132 , m_decision(result.m_decision)
135 PolicyResult(PolicyDecision::Value value)
141 : m_isDecision(false)
142 , m_decision(PolicyDecision::Value::NOT_APPLICABLE) // don't care
145 PolicyResult& operator=(const PolicyResult &second) {
149 m_isDecision = second.m_isDecision;
150 m_decision = second.m_decision;
155 bool operator==(const PolicyResult &result) const {
157 && result.m_isDecision
158 && m_decision == result.m_decision)
159 || (!m_isDecision && !result.m_isDecision);
162 bool operator==(Value) const {
163 return !m_isDecision;
166 bool operator!=(const PolicyResult &result) const {
167 return !(*this == result);
170 bool operator!=(Value value) const {
171 return !(*this == value);
174 OptionalPolicyEffect getEffect() const
177 return OptionalPolicyEffect();
179 return m_decision.getEffect();
182 static int serialize(const PolicyResult &policyResult)
184 if (!policyResult.m_isDecision) {
185 return BD_UNDETERMINED;
186 } else if (policyResult.m_decision ==
187 PolicyDecision::Value::NOT_APPLICABLE)
189 return BD_NOT_APPLICABLE;
190 } else if (policyResult.m_decision == PolicyEffect::PROMPT_BLANKET) {
191 return BD_PROMPT_BLANKET;
192 } else if (policyResult.m_decision == PolicyEffect::PROMPT_SESSION) {
193 return BD_PROMPT_SESSION;
194 } else if (policyResult.m_decision == PolicyEffect::PROMPT_ONESHOT) {
195 return BD_PROMPT_ONESHOT;
196 } else if (policyResult.m_decision == PolicyEffect::PERMIT) {
198 } else if (policyResult.m_decision == PolicyEffect::DENY) {
201 Assert(false && "Unknown value of policyResult.");
204 static PolicyResult deserialize(int dec){
207 return PolicyEffect::DENY;
209 return PolicyEffect::PERMIT;
210 case BD_PROMPT_ONESHOT:
211 return PolicyEffect::PROMPT_ONESHOT;
212 case BD_PROMPT_SESSION:
213 return PolicyEffect::PROMPT_SESSION;
214 case BD_PROMPT_BLANKET:
215 return PolicyEffect::PROMPT_BLANKET;
216 case BD_NOT_APPLICABLE:
217 return PolicyDecision::Value::NOT_APPLICABLE;
218 case BD_UNDETERMINED:
219 return Value::UNDETERMINED;
221 Assert(false && "Broken database");
224 std::ostream & toStream(std::ostream& stream) {
226 stream << m_decision;
228 stream << "UNDETERMINED";
233 static const int BD_UNDETERMINED = 6;
234 static const int BD_NOT_APPLICABLE = 5;
235 static const int BD_PROMPT_BLANKET = 4;
236 static const int BD_PROMPT_SESSION = 3;
237 static const int BD_PROMPT_ONESHOT = 2;
238 static const int BD_PERMIT = 1;
239 static const int BD_DENY = 0;
242 PolicyDecision m_decision;
245 inline static bool operator==(const PolicyDecision &d, const PolicyResult &r) {
249 inline static bool operator!=(const PolicyDecision &d, const PolicyResult &r) {
253 inline static bool operator==(const PolicyEffect &e, const PolicyResult &r) {
257 inline static bool operator!=(const PolicyEffect &e, const PolicyResult &r) {
261 inline static std::ostream & operator<<(std::ostream& stream,
264 return result.toStream(stream);
267 struct ExtendedPolicyResult {
268 ExtendedPolicyResult(const PolicyResult pr = PolicyEffect::DENY, int rule = -1)
272 PolicyResult policyResult;
276 typedef boost::optional<ExtendedPolicyResult> OptionalExtendedPolicyResult;
278 #endif // _SRC_ACCESS_CONTROL_COMMON_POLICY_RESULT_H_