return locked;
}
-void Action::setPrivilege(const std::string &val)
+void Action::setPrivileges(std::list<std::string> privList)
{
- privilege = val;
+ privileges = privList;
}
-std::string Action::getPrivilege()
+const std::list<std::string>& Action::getPrivileges()
{
- return privilege;
+ return privileges;
}
void Action::attachObserver(ActionObserver *obs)
ActionType getType();
void setLife(ActionRuleLife val);
ActionRuleLife getLife();
- void setPrivilege(const std::string &val);
- std::string getPrivilege();
+ void setPrivileges(std::list<std::string> privList);
+ const std::list<std::string>& getPrivileges();
void attachObserver(ActionObserver *obs);
void detachObserver(ActionObserver *obs);
std::string backupUndoInfo();
static void valueChangedCallback(void *userData);
void notifyObservers();
std::string id;
- std::string privilege;
+ std::list<std::string> privileges;
bool locked; //Another action(same rule) is restricted(LOCK), It is assigned by ConflictManager
bool stopOnErr;
bool subscribed;
return plugin;
}
-void ActionRule::setPrivilege(const std::string &priv)
+void ActionRule::addPrivilege(const std::string &priv)
{
- privilege = priv;
+ privileges.push_back(priv);
}
void ActionRule::setLife(Action::ActionRuleLife val)
*/
#pragma once
+#include <list>
#include <string>
#include "mdss.h"
#include "Plugin.h"
std::string getName();
Plugin* getPlugin();
void setPlugin(Plugin *pi);
- void setPrivilege(const std::string &priv);
+ void addPrivilege(const std::string &priv);
void setLife(Action::ActionRuleLife val);
virtual Action* makeAction() = 0;
virtual int addAlias(const std::string &alias, const std::string &value) = 0;
protected:
std::string ruleName;
- std::string privilege;
+ std::list<std::string> privileges;
Plugin *plugin;
Action::ActionRuleLife life;
private:
int ClientPrivilege::check(const Mode &mode)
{
- std::list<std::shared_ptr<Action>>::iterator it;
auto actionList = mode.getActionList();
- for (it = actionList.begin(); it != actionList.end(); it++) {
- std::string priv = (*it)->getPrivilege();
- //No Privilege = Allow All
- if (priv.empty())
- continue;
- int ret = cynara_check(handle, client, clientSession, user, priv.c_str());
- if (CYNARA_API_ACCESS_ALLOWED != ret) {
- ERR("Action(%s) priv.check(%s) Fail(%d)", (*it)->getRuleName().c_str(), (*it)->getPrivilege().c_str(), ret);
- if (ret == CYNARA_API_ACCESS_DENIED)
- return MODES_ERROR_PERMISSION_DENIED;
- else
- return MODES_ERROR_SYSTEM;
+ for (auto it = actionList.begin(); it != actionList.end(); it++) {
+ auto privList = (*it)->getPrivileges();
+ for (auto privIt = privList.begin(); privIt != privList.end(); privIt++) {
+ //No Privilege = Allow All
+ if ((*privIt).empty())
+ continue;
+ int ret = checkCynara((*it)->getRuleName(), *privIt);
+ if (MODES_ERROR_NONE != ret)
+ return ret;
}
}
- DBG("Success!");
return MODES_ERROR_NONE;
}
+
+int ClientPrivilege::checkCynara(const std::string &rule, const std::string &priv)
+{
+ int ret = cynara_check(handle, client, clientSession, user, priv.c_str());
+ if (CYNARA_API_ACCESS_ALLOWED != ret) {
+ ERR("Action(%s) priv.check(%s) Fail(%d)", rule.c_str(), priv.c_str(), ret);
+ if (ret == CYNARA_API_ACCESS_DENIED)
+ return MODES_ERROR_PERMISSION_DENIED;
+ else
+ return MODES_ERROR_SYSTEM;
+ }
+
+ return MODES_ERROR_NONE;
+}
+
+
~ClientPrivilege();
int check(const Mode &mode);
private:
+ int checkCynara(const std::string &rule, const std::string &priv);
cynara *handle;
char *client;
char *user;
ERR("%s : No value", RULE_TAGS[TagElemPrivilege]);
return;
}
- actionRule->setPrivilege(value);
+ actionRule->addPrivilege(value);
} else if (MDS_EQUAL == xmlStrcmp(cur->name, RULE_TAGS[TagElemConflict])) {
// TODO: enhanced feature
DBG("TBD(%s)", cur->name);
try {
TAction<T> *action = new TAction<T>(ruleName, piAction);
action->setValueAliases(valueAliasList);
- action->setPrivilege(privilege);
+ action->setPrivileges(privileges);
action->setLife(life);
return action;