#include "MonCap.h"
#include "include/stringify.h"
+#include "include/ipaddr.h"
#include "common/debug.h"
#include "common/Formatter.h"
// </magic>
+void MonCapGrant::parse_network()
+{
+ network_valid = ::parse_network(network.c_str(), &network_parsed,
+ &network_prefix);
+}
+
void MonCapGrant::expand_profile(int daemon_type, const EntityName& name) const
{
// only generate this list once
<< " addr " << addr
<< " on cap " << *this
<< dendl;
+
mon_rwxa_t allow = 0;
for (vector<MonCapGrant>::const_iterator p = grants.begin();
p != grants.end(); ++p) {
if (cct)
- ldout(cct, 20) << " allow so far " << allow << ", doing grant " << *p << dendl;
+ ldout(cct, 20) << " allow so far " << allow << ", doing grant " << *p
+ << dendl;
+
+ if (p->network.size() &&
+ (!p->network_valid ||
+ !network_contains(p->network_parsed,
+ p->network_prefix,
+ addr))) {
+ continue;
+ }
if (p->is_allow_all()) {
if (cct)
//bool r = qi::phrase_parse(iter, end, g, ascii::space, foo);
if (r && iter == end) {
text = str;
+ for (auto& g : grants) {
+ g.parse_network();
+ }
return true;
}
// restrict by network
std::string network;
+ // these are filled in by parse_network(), called by MonCap::parse()
+ entity_addr_t network_parsed;
+ unsigned network_prefix = 0;
+ bool network_valid = true;
+
+ void parse_network();
+
mon_rwxa_t allow;
// explicit grants that a profile grant expands to; populated as
ASSERT_TRUE(cap2.is_allow_all());
}
+TEST(MonCap, Network) {
+ MonCap cap;
+ bool r = cap.parse("allow * network 192.168.0.0/16, allow * network 10.0.0.0/8", NULL);
+ ASSERT_TRUE(r);
+
+ entity_addr_t a, b, c;
+ a.parse("10.1.2.3");
+ b.parse("192.168.2.3");
+ c.parse("192.167.2.3");
+
+ ASSERT_TRUE(cap.is_capable(NULL, CEPH_ENTITY_TYPE_MON, EntityName(),
+ "foo", "asdf", map<string,string>(),
+ true, true, true,
+ a));
+ ASSERT_TRUE(cap.is_capable(NULL, CEPH_ENTITY_TYPE_MON, EntityName(),
+ "foo", "asdf", map<string,string>(),
+ true, true, true,
+ b));
+ ASSERT_FALSE(cap.is_capable(NULL, CEPH_ENTITY_TYPE_MON, EntityName(),
+ "foo", "asdf", map<string,string>(),
+ true, true, true,
+ c));
+}
+
TEST(MonCap, ProfileOSD) {
MonCap cap;
bool r = cap.parse("allow profile osd", NULL);