element of a role's trust and permission policy.
This also includes implementation of ForAnyValue and
ForAllValues to be used in conjunction with
StringLike, StringEquals and StringEqualsIgnoreCase
which are used alongwith aws:TagKeys.
Signed-off-by: Pritha Srivastava <prsrivas@redhat.com>
s->env.emplace(e_key, val);
ldpp_dout(dpp, 10) << "RGW Env Tag Key: " << e_key << " Value: " << val << dendl;
+ s->env.emplace("aws:TagKeys", key);
+ ldpp_dout(dpp, 10) << "aws:TagKeys: " << key << dendl;
+
if (s->principal_tags.size() == 50) {
ldpp_dout(dpp, 0) << "ERROR: Number of tag/value pairs exceeding 50, hence skipping the rest" << dendl;
break;
for (auto& m : token_attrs.principal_tags) {
s->env.emplace(m.first, m.second);
+ ldpp_dout(dpp, 10) << "Principal Tag Key: " << m.first << " Value: " << m.second << dendl;
+ std::size_t pos = m.first.find('/');
+ string key = m.first.substr(pos + 1);
+ s->env.emplace("aws:TagKeys", key);
+ ldpp_dout(dpp, 10) << "aws:TagKeys: " << key << dendl;
}
s->token_claims.emplace_back("sts");
}
if (i == env.end()) {
- return ifexists;
+ if (op == TokenID::ForAllValuesStringEquals ||
+ op == TokenID::ForAllValuesStringEqualsIgnoreCase ||
+ op == TokenID::ForAllValuesStringLike) {
+ return true;
+ } else {
+ return ifexists;
+ }
}
const auto& s = i->second;
switch (op) {
// String!
+ case TokenID::ForAnyValueStringEquals:
case TokenID::StringEquals:
return orrible(std::equal_to<std::string>(), itr, vals);
return orrible(std::not_fn(std::equal_to<std::string>()),
itr, vals);
+ case TokenID::ForAnyValueStringEqualsIgnoreCase:
case TokenID::StringEqualsIgnoreCase:
return orrible(ci_equal_to(), itr, vals);
case TokenID::StringNotEqualsIgnoreCase:
return orrible(std::not_fn(ci_equal_to()), itr, vals);
+ case TokenID::ForAnyValueStringLike:
case TokenID::StringLike:
return orrible(string_like(), itr, vals);
case TokenID::StringNotLike:
return orrible(std::not_fn(string_like()), itr, vals);
+ case TokenID::ForAllValuesStringEquals:
+ return andible(std::equal_to<std::string>(), itr, vals);
+
+ case TokenID::ForAllValuesStringLike:
+ return andible(string_like(), itr, vals);
+
+ case TokenID::ForAllValuesStringEqualsIgnoreCase:
+ return andible(ci_equal_to(), itr, vals);
+
// Numeric
case TokenID::NumericEquals:
return shortible(std::equal_to<double>(), as_number, s, vals);
};
using unordered_multimap_it_pair = std::pair <std::unordered_multimap<std::string,std::string>::const_iterator, std::unordered_multimap<std::string,std::string>::const_iterator>;
+
+ template<typename F>
+ static bool andible(F&& f, const unordered_multimap_it_pair& it,
+ const std::vector<std::string>& v) {
+ for (auto itr = it.first; itr != it.second; itr++) {
+ bool matched = false;
+ for (const auto& d : v) {
+ if (std::forward<F>(f)(itr->second, d)) {
+ matched = true;
+ }
+ }
+ if (!matched)
+ return false;
+ }
+ return true;
+ }
+
template<typename F>
static bool orrible(F&& f, const unordered_multimap_it_pair& it,
const std::vector<std::string>& v) {
StringNotEqualsIgnoreCase, TokenKind::cond_op, TokenID::StringNotEqualsIgnoreCase, (uint64_t) Type::string, true, true
StringLike, TokenKind::cond_op, TokenID::StringLike, (uint64_t) Type::string, true, true,
StringNotLike, TokenKind::cond_op, TokenID::StringNotLike, (uint64_t) Type::string, true, true
+ForAllValues:StringEquals, TokenKind::cond_op, TokenID::ForAllValuesStringEquals, (uint64_t) Type::string, true, true
+ForAnyValue:StringEquals, TokenKind::cond_op, TokenID::ForAnyValueStringEquals, (uint64_t) Type::string, true, true
+ForAllValues:StringLike, TokenKind::cond_op, TokenID::ForAllValuesStringLike, (uint64_t) Type::string, true, true
+ForAnyValue:StringLike, TokenKind::cond_op, TokenID::ForAnyValueStringLike, (uint64_t) Type::string, true, true
+ForAllValues:StringEqualsIgnoreCase, TokenKind::cond_op, TokenID::ForAllValuesStringEqualsIgnoreCase, (uint64_t) Type::string, true, true
+ForAnyValue:StringEqualsIgnoreCase, TokenKind::cond_op, TokenID::ForAnyValueStringEqualsIgnoreCase, (uint64_t) Type::string, true, true
# Numeric
NumericEquals, TokenKind::cond_op, TokenID::NumericEquals, (uint64_t) Type::number, true, true
NumericNotEquals, TokenKind::cond_op, TokenID::NumericNotEquals, (uint64_t) Type::number, true, true
// String!
StringEquals, StringNotEquals, StringEqualsIgnoreCase,
StringNotEqualsIgnoreCase, StringLike, StringNotLike,
+ ForAllValuesStringEquals, ForAnyValueStringEquals,
+ ForAllValuesStringLike, ForAnyValueStringLike,
+ ForAllValuesStringEqualsIgnoreCase, ForAnyValueStringEqualsIgnoreCase,
// Numeric!
NumericEquals, NumericNotEquals, NumericLessThan, NumericLessThanEquals,