#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix.hpp>
+#include "common/debug.h"
#include "MDSAuthCaps.h"
+#define dout_subsys ceph_subsys_mds
+
+#undef dout_prefix
+#define dout_prefix *_dout << "nish-debug "
+
using std::ostream;
using std::string;
namespace qi = boost::spirit::qi;
grants.push_back(MDSCapGrant(MDSCapSpec(true, true, true), MDSCapMatch()));
}
-bool MDSAuthCaps::parse(const std::string& str, ostream *err)
+bool MDSAuthCaps::parse(CephContext *c, const std::string& str, ostream *err)
{
// Special case for legacy caps
if (str == "allow") {
std::string::const_iterator end = str.end();
bool r = qi::phrase_parse(iter, end, g, ascii::space, *this);
+ cct = c; // set after parser self-assignment
if (r && iter == end) {
return true;
} else {
#include <string>
#include <sstream>
#include "include/types.h"
+#include "common/debug.h"
// unix-style capabilities
enum {
MAY_EXECUTE = 4,
};
+class CephContext;
+
// what we can do
struct MDSCapSpec {
bool read, write, any;
class MDSAuthCaps
{
+ CephContext *cct;
std::vector<MDSCapGrant> grants;
public:
- MDSAuthCaps() {}
- MDSAuthCaps(const std::vector<MDSCapGrant> &grants_) : grants(grants_) {}
+ MDSAuthCaps(CephContext *cct_=NULL)
+ : cct(cct_) { }
+
+ // this ctor is used by spirit/phoenix; doesn't need cct.
+ MDSAuthCaps(const std::vector<MDSCapGrant> &grants_)
+ : cct(NULL), grants(grants_) { }
void set_allow_all();
- bool parse(const std::string &str, std::ostream *err);
+ bool parse(CephContext *cct, const std::string &str, std::ostream *err);
bool allow_all() const;
bool is_capable(const std::string &inode_path,
string str = parse_good[i];
MDSAuthCaps cap;
std::cout << "Testing good input: '" << str << "'" << std::endl;
- ASSERT_TRUE(cap.parse(str, &cout));
+ ASSERT_TRUE(cap.parse(g_ceph_context, str, &cout));
}
}
string str = parse_bad[i];
MDSAuthCaps cap;
std::cout << "Testing bad input: '" << str << "'" << std::endl;
- ASSERT_FALSE(cap.parse(str, &cout));
+ ASSERT_FALSE(cap.parse(g_ceph_context, str, &cout));
}
}
MDSAuthCaps cap;
ASSERT_FALSE(cap.allow_all());
- ASSERT_TRUE(cap.parse("allow r", NULL));
+ ASSERT_TRUE(cap.parse(g_ceph_context, "allow r", NULL));
ASSERT_FALSE(cap.allow_all());
cap = MDSAuthCaps();
- ASSERT_TRUE(cap.parse("allow rw", NULL));
+ ASSERT_TRUE(cap.parse(g_ceph_context, "allow rw", NULL));
ASSERT_FALSE(cap.allow_all());
cap = MDSAuthCaps();
- ASSERT_TRUE(cap.parse("allow", NULL));
+ ASSERT_TRUE(cap.parse(g_ceph_context, "allow", NULL));
ASSERT_FALSE(cap.allow_all());
cap = MDSAuthCaps();
- ASSERT_TRUE(cap.parse("allow *", NULL));
+ ASSERT_TRUE(cap.parse(g_ceph_context, "allow *", NULL));
ASSERT_TRUE(cap.allow_all());
ASSERT_TRUE(cap.is_capable("/foo/bar", 0, 0, 0777, 0, MAY_READ | MAY_WRITE));
}
TEST(MDSAuthCaps, AllowUid) {
MDSAuthCaps cap;
- ASSERT_TRUE(cap.parse("allow * uid=10", NULL));
+ ASSERT_TRUE(cap.parse(g_ceph_context, "allow * uid=10", NULL));
ASSERT_FALSE(cap.allow_all());
ASSERT_TRUE(cap.is_capable("/foo", 0, 0, 0777, 10, MAY_READ | MAY_WRITE));
ASSERT_FALSE(cap.is_capable("/foo", 0, 0, 0777, -1, MAY_READ | MAY_WRITE));
TEST(MDSAuthCaps, AllowPath) {
MDSAuthCaps cap;
- ASSERT_TRUE(cap.parse("allow * path=/sandbox", NULL));
+ ASSERT_TRUE(cap.parse(g_ceph_context, "allow * path=/sandbox", NULL));
ASSERT_FALSE(cap.allow_all());
ASSERT_TRUE(cap.is_capable("/sandbox/foo", 0, 0, 0777, 0, MAY_READ | MAY_WRITE));
ASSERT_TRUE(cap.is_capable("/sandbox", 0, 0, 0777, 0, MAY_READ | MAY_WRITE));
for (size_t i = 0; i < num_tests; ++i) {
MDSAuthCaps cap;
std::cout << "Testing input '" << test_values[i].input << "'" << std::endl;
- ASSERT_TRUE(cap.parse(test_values[i].input, &cout));
+ ASSERT_TRUE(cap.parse(g_ceph_context, test_values[i].input, &cout));
ASSERT_EQ(test_values[i].output, stringify(cap));
}
}