* This is true if any of the 'grant' clauses in the capability match the
* requested path + op.
*/
-bool MDSAuthCaps::is_capable(const std::string &path, int uid,
- bool may_read, bool may_write) const
+bool MDSAuthCaps::is_capable(const std::string &path, int uid, unsigned mask) const
{
for (std::vector<MDSCapGrant>::const_iterator i = grants.begin();
i != grants.end();
++i) {
if (i->match.match(path, uid) &&
- i->spec.allows(may_read, may_write)) {
+ i->spec.allows(mask & (MAY_READ|MAY_EXECUTE), mask & MAY_WRITE)) {
return true;
}
}
#include <string>
#include <sstream>
+// unix-style capabilities
+enum {
+ MAY_READ = 1,
+ MAY_WRITE = 2,
+ MAY_EXECUTE = 4,
+};
+
// what we can do
struct MDSCapSpec {
bool read;
class MDSAuthCaps
{
-protected:
std::vector<MDSCapGrant> grants;
public:
bool parse(const std::string &str, std::ostream *err);
bool allow_all() const;
- bool is_capable(const std::string &path, int uid,
- bool may_read, bool may_write) const;
+ bool is_capable(const std::string &path, int uid, unsigned mask) const;
friend std::ostream &operator<<(std::ostream &out, const MDSAuthCaps &cap);
};
ASSERT_TRUE(cap.parse("allow *", NULL));
ASSERT_TRUE(cap.allow_all());
- ASSERT_TRUE(cap.is_capable("/foo/bar", 0, true, true));
+ ASSERT_TRUE(cap.is_capable("/foo/bar", 0, MAY_READ | MAY_WRITE));
}
TEST(MDSAuthCaps, AllowUid) {
MDSAuthCaps cap;
ASSERT_TRUE(cap.parse("allow * uid=10", NULL));
ASSERT_FALSE(cap.allow_all());
- ASSERT_TRUE(cap.is_capable("/foo", 10, true, true));
- ASSERT_FALSE(cap.is_capable("/foo", -1, true, true));
- ASSERT_FALSE(cap.is_capable("/foo", 0, true, true));
+ ASSERT_TRUE(cap.is_capable("/foo", 10, MAY_READ | MAY_WRITE));
+ ASSERT_FALSE(cap.is_capable("/foo", -1, MAY_READ | MAY_WRITE));
+ ASSERT_FALSE(cap.is_capable("/foo", 0, MAY_READ | MAY_WRITE));
}
TEST(MDSAuthCaps, AllowPath) {
MDSAuthCaps cap;
ASSERT_TRUE(cap.parse("allow * path=/sandbox", NULL));
ASSERT_FALSE(cap.allow_all());
- ASSERT_TRUE(cap.is_capable("/sandbox/foo", 0, true, true));
- ASSERT_TRUE(cap.is_capable("/sandbox", 0, true, true));
- ASSERT_FALSE(cap.is_capable("/sandboxed", 0, true, true));
- ASSERT_FALSE(cap.is_capable("/foo", 0, true, true));
+ ASSERT_TRUE(cap.is_capable("/sandbox/foo", 0, MAY_READ | MAY_WRITE));
+ ASSERT_TRUE(cap.is_capable("/sandbox", 0, MAY_READ | MAY_WRITE));
+ ASSERT_FALSE(cap.is_capable("/sandboxed", 0, MAY_READ | MAY_WRITE));
+ ASSERT_FALSE(cap.is_capable("/foo", 0, MAY_READ | MAY_WRITE));
}
TEST(MDSAuthCaps, OutputParsed) {