return allowed ? Effect::Allow : Effect::Pass;
}
-bool Policy::has_conditional(const string& conditional, bool partial) const {
- for (const auto&s: statements){
- if (std::any_of(s.conditions.begin(), s.conditions.end(),
- [&](const Condition& c) { return c.has_key(conditional, partial);}))
- return true;
- }
- return false;
-}
-
ostream& operator <<(ostream& m, const Policy& p) {
m << "{ Version: "
<< (p.version == Version::v2008_10_17 ? "2008-10-17" : "2012-10-17");
}
};
+ struct ci_starts_with {
+ bool operator()(const std::string& s1,
+ const std::string& s2) const {
+ return boost::istarts_with(s1, s2);
+ }
+ };
+
template<typename F>
static bool orrible(F&& f, const std::string& c,
const std::vector<std::string>& v) {
return false;
}
- bool has_key(const std::string& _key, bool partial=false) const {
- if (partial)
- return boost::algorithm::istarts_with(key, _key);
- else
- return boost::algorithm::iequals(key, _key);
+ template <typename F>
+ bool has_key_p(const std::string& _key, F p) const {
+ return p(key, _key);
}
};
boost::optional<const rgw::auth::Identity&> ida,
std::uint64_t action, const ARN& resource) const;
- bool has_conditional(const string& conditional, bool partial=false) const;
+ template <typename F>
+ bool has_conditional(const string& conditional, F p) const {
+ for (const auto&s: statements){
+ if (std::any_of(s.conditions.begin(), s.conditions.end(),
+ [&](const Condition& c) { return c.has_key_p(conditional, p);}))
+ return true;
+ }
+ return false;
+ }
+
+ bool has_conditional(const string& c) const {
+ return has_conditional(c, Condition::ci_equal_to());
+ }
+
+ bool has_partial_conditional(const string& c) const {
+ return has_conditional(c, Condition::ci_starts_with());
+ }
};
std::ostream& operator <<(ostream& m, const Policy& p);
} else {
action = rgw::IAM::s3GetObjectVersion;
}
- if (s->iam_policy && s->iam_policy->has_conditional(S3_EXISTING_OBJTAG, true))
+ if (s->iam_policy && s->iam_policy->has_partial_conditional(S3_EXISTING_OBJTAG))
rgw_iam_add_existing_objtags(store, s, obj, action);
}
rgw::IAM::s3GetObjectVersionTagging;
// TODO since we are parsing the bl now anyway, we probably change
// the send_response function to accept RGWObjTag instead of a bl
- if (s->iam_policy && s->iam_policy->has_conditional(S3_EXISTING_OBJTAG, true)){
+ if (s->iam_policy && s->iam_policy->has_partial_conditional(S3_EXISTING_OBJTAG)){
rgw_obj obj = rgw_obj(s->bucket, s->object);
rgw_iam_add_existing_objtags(store, s, obj, iam_action);
}
rgw::IAM::s3PutObjectTagging:
rgw::IAM::s3PutObjectVersionTagging;
- if(s->iam_policy && s->iam_policy->has_conditional(S3_EXISTING_OBJTAG, true)){
+ if(s->iam_policy && s->iam_policy->has_partial_conditional(S3_EXISTING_OBJTAG)){
auto obj = rgw_obj(s->bucket, s->object);
rgw_iam_add_existing_objtags(store, s, obj, iam_action);
}
rgw::IAM::s3DeleteObjectTagging:
rgw::IAM::s3DeleteObjectVersionTagging;
- if (s->iam_policy && s->iam_policy->has_conditional(S3_EXISTING_OBJTAG, true)){
+ if (s->iam_policy && s->iam_policy->has_partial_conditional(S3_EXISTING_OBJTAG)){
auto obj = rgw_obj(s->bucket, s->object);
rgw_iam_add_existing_objtags(store, s, obj, iam_action);
}
rgw::IAM::s3GetObjectAcl :
rgw::IAM::s3GetObjectVersionAcl;
- if (s->iam_policy && s->iam_policy->has_conditional(S3_EXISTING_OBJTAG, true)){
+ if (s->iam_policy && s->iam_policy->has_partial_conditional(S3_EXISTING_OBJTAG)){
rgw_obj obj = rgw_obj(s->bucket, s->object);
rgw_iam_add_existing_objtags(store, s, obj, iam_action);
}