Skip to content

Commit

Permalink
Merge pull request #12445 from pritha-srivastava/wip_glob_func
Browse files Browse the repository at this point in the history
rgw: Added a globbing method for AWS Policies.
  • Loading branch information
adamemerson committed Jan 24, 2017
2 parents 3534595 + ff18f84 commit 5ce4036
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 0 deletions.
83 changes: 83 additions & 0 deletions src/rgw/rgw_common.cc
Expand Up @@ -2,6 +2,10 @@
// vim: ts=8 sw=2 smarttab

#include <errno.h>
#include <vector>
#include <algorithm>
#include <string>
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>

#include "json_spirit/json_spirit.h"
Expand All @@ -26,6 +30,11 @@
#define dout_context g_ceph_context
#define dout_subsys ceph_subsys_rgw

#define POLICY_ACTION 0x01
#define POLICY_RESOURCE 0x02
#define POLICY_ARN 0x04
#define POLICY_STRING 0x08

PerfCounters *perfcounter = NULL;

const uint32_t RGWBucketInfo::NUM_SHARDS_BLIND_BUCKET(UINT32_MAX);
Expand Down Expand Up @@ -1468,3 +1477,77 @@ int rgw_parse_op_type_list(const string& str, uint32_t *perm)
return parse_list_of_flags(op_type_mapping, str, perm);
}

static int match_internal(boost::string_ref pattern, boost::string_ref input, int (*function)(const char&, const char&))
{
boost::string_ref::iterator it1 = pattern.begin();
boost::string_ref::iterator it2 = input.begin();
while(true) {
if (it1 == pattern.end() && it2 == input.end())
return 1;
if (it1 == pattern.end() || it2 == input.end())
return 0;
if (*it1 == '*' && (it1 + 1) == pattern.end() && it2 != input.end())
return 1;
if (*it1 == '*' && (it1 + 1) == pattern.end() && it2 == input.end())
return 0;
if (function(*it1, *it2) || *it1 == '?') {
it1++;
it2++;
continue;
}
if (*it1 == '*') {
if (function(*(it1 + 1), *it2))
it1++;
else
it2++;
continue;
}
return 0;
}
return 0;
}

static int matchcase(const char& c1, const char& c2)
{
if (c1 == c2)
return 1;
return 0;
}

static int matchignorecase(const char& c1, const char& c2)
{
if (tolower(c1) == tolower(c2))
return 1;
return 0;
}

int match(const string& pattern, const string& input, int flag)
{
auto last_pos_input = 0, last_pos_pattern = 0;

while(true) {
auto cur_pos_input = input.find(":", last_pos_input);
auto cur_pos_pattern = pattern.find(":", last_pos_pattern);

string substr_input = input.substr(last_pos_input, cur_pos_input);
string substr_pattern = pattern.substr(last_pos_pattern, cur_pos_pattern);

int res;
if (flag & POLICY_ACTION || flag & POLICY_ARN) {
res = match_internal(substr_pattern, substr_input, &matchignorecase);
} else {
res = match_internal(substr_pattern, substr_input, &matchcase);
}
if (res == 0)
return 0;

if (cur_pos_pattern == string::npos && cur_pos_input == string::npos)
return 1;
else if ((cur_pos_pattern == string::npos && cur_pos_input != string::npos) ||
(cur_pos_pattern != string::npos && cur_pos_input == string::npos))
return 0;

last_pos_pattern = cur_pos_pattern + 1;
last_pos_input = cur_pos_input + 1;
}
}
1 change: 1 addition & 0 deletions src/rgw/rgw_common.h
Expand Up @@ -1974,4 +1974,5 @@ extern string calc_hash_sha256_close_stream(SHA256 **hash);

extern int rgw_parse_op_type_list(const string& str, uint32_t *perm);

int match(const string& pattern, const string& input, int flag);
#endif

0 comments on commit 5ce4036

Please sign in to comment.