in src/qpid/acl/AclReader.cpp [664:754]
bool AclReader::processAclLine(tokList& toks) {
const unsigned toksSize = toks.size();
if (toksSize < 4) {
errorStream << ACL_FORMAT_ERR_LOG_PREFIX << "Line : " << lineNumber
<< ", Insufficient tokens for acl definition.";
return false;
}
AclResult res;
try {
res = AclHelper::getAclResult(toks[1]);
} catch (...) {
errorStream << ACL_FORMAT_ERR_LOG_PREFIX << "Line : " << lineNumber
<< ", Unknown ACL permission \"" << toks[1] << "\".";
return false;
}
bool actionAllFlag = toks[3].compare(AclData::ACL_KEYWORD_ALL) == 0;
bool userAllFlag = toks[2].compare(AclData::ACL_KEYWORD_ALL) == 0;
Action action;
if (actionAllFlag) {
if (userAllFlag && toksSize > 4) {
errorStream << ACL_FORMAT_ERR_LOG_PREFIX << "Line : " << lineNumber
<< ", Tokens found after action \"all\".";
return false;
}
action = ACT_CONSUME; // dummy; compiler must initialize action for this code path
} else {
try {
action = AclHelper::getAction(toks[3]);
} catch (...) {
errorStream << ACL_FORMAT_ERR_LOG_PREFIX << "Line : " << lineNumber
<< ", Unknown action \"" << toks[3] << "\".";
return false;
}
}
// Create rule obj; then add object (if any) and properties (if any)
aclRulePtr rule;
if (actionAllFlag) {
rule.reset(new aclRule(res, toks[2], groups));
} else {
rule.reset(new aclRule(res, toks[2], groups, action));
}
if (toksSize >= 5) { // object name-value pair
if (toks[4].compare(AclData::ACL_KEYWORD_ALL) == 0) {
rule->setObjectTypeAll();
} else {
try {
rule->setObjectType(AclHelper::getObjectType(toks[4]));
} catch (...) {
errorStream << ACL_FORMAT_ERR_LOG_PREFIX << "Line : " << lineNumber
<< ", Unknown object \"" << toks[4] << "\".";
return false;
}
}
}
if (toksSize >= 6) { // property name-value pair(s)
for (unsigned i=5; i<toksSize; i++) {
nvPair propNvp = splitNameValuePair(toks[i]);
if (propNvp.second.size() == 0) {
errorStream << ACL_FORMAT_ERR_LOG_PREFIX << "Line : " << lineNumber
<<", Badly formed property name-value pair \""
<< propNvp.first << "\". (Must be name=value)";
return false;
}
SpecProperty prop;
try {
prop = AclHelper::getSpecProperty(propNvp.first);
} catch (...) {
errorStream << ACL_FORMAT_ERR_LOG_PREFIX << "Line : " << lineNumber
<< ", Unknown property \"" << propNvp.first << "\".";
return false;
}
rule->addProperty(prop, propNvp.second);
}
}
// Check if name (toks[2]) is group; if not, add as name of individual
if (toks[2].compare(AclData::ACL_KEYWORD_ALL) != 0) {
if (groups.find(toks[2]) == groups.end()) {
addName(toks[2]);
}
}
rules.push_back(rule);
return true;
}