return 0;
}
+bool AuthMonitor::valid_caps(
+ const string& type,
+ const string& caps,
+ ostream *out)
+{
+ if (type == "mon" || type == "mgr") {
+ MonCap tmp;
+ if (!tmp.parse(caps, out)) {
+ return false;
+ }
+ } else if (type == "osd") {
+ OSDCap ocap;
+ if (!ocap.parse(caps, out)) {
+ return false;
+ }
+ } else if (type == "mds") {
+ MDSAuthCaps mdscap;
+ if (!mdscap.parse(g_ceph_context, caps, out)) {
+ return false;
+ }
+ } else {
+ if (out) {
+ *out << "unknown cap type '" << type << "'";
+ }
+ return false;
+ }
+ return true;
+}
+
bool AuthMonitor::valid_caps(const vector<string>& caps, ostream *out)
{
for (vector<string>::const_iterator p = caps.begin();
*out << "cap '" << *p << "' has no value";
return false;
}
- if (*p == "mon" || *p == "mgr") {
- MonCap tmp;
- if (!tmp.parse(*(p+1), out)) {
- return false;
- }
- } else if (*p == "osd") {
- OSDCap ocap;
- if (!ocap.parse(*(p+1), out)) {
- return false;
- }
- } else if (*p == "mds") {
- MDSAuthCaps mdscap;
- if (!mdscap.parse(g_ceph_context, *(p+1), out)) {
- return false;
- }
- } else {
- *out << "unknown cap type '" << *p << "'";
+ if (!valid_caps(*p, *(p+1), out)) {
return false;
}
}
string mds_cap_string, osd_cap_string;
string osd_cap_wanted = "r";
- if (!valid_caps(caps_vec, &ss)) {
- err = -EINVAL;
- goto done;
- }
-
for (auto it = caps_vec.begin();
it != caps_vec.end() && (it + 1) != caps_vec.end();
it += 2) {
{ "mds", _encode_cap(mds_cap_string) }
};
+ if (!valid_caps("osd", osd_cap_string, &ss) ||
+ !valid_caps("mds", mds_cap_string, &ss)) {
+ err = -EINVAL;
+ goto done;
+ }
+
EntityAuth entity_auth;
if (mon->key_server.get_auth(entity, entity_auth)) {
for (const auto &sys_cap : wanted_caps) {
pending_auth.push_back(inc);
}
- /* validate mon/osd/mds caps ; don't care about caps for other services as
- * we don't know how to validate them */
+ /* validate mon/osd/mds caps; fail on unrecognized service/type */
+ bool valid_caps(const string& type, const string& caps, ostream *out);
bool valid_caps(const vector<string>& caps, ostream *out);
void on_active() override;