*/
PrivilegeDb(const std::string &path = std::string(PRIVILEGE_DB_PATH));
+ /**
+ * Wrapper for prepared statement, it will reset statement at destruction.
+ */
+ class StatementWrapper {
+ public:
+ StatementWrapper(DB::SqlConnection::DataCommandAutoPtr &ref);
+ ~StatementWrapper();
+ DB::SqlConnection::DataCommand* operator->();
+ private:
+ DB::SqlConnection::DataCommandAutoPtr &m_ref;
+ };
+
SecurityManager::DB::SqlConnection *mSqlConnection;
const std::map<StmtType, const char * const > Queries = {
{ StmtType::EGetPkgPrivileges, "SELECT DISTINCT privilege_name FROM app_privilege_view WHERE pkg_name=? AND uid=? ORDER BY privilege_name"},
void initDataCommands();
/**
- * Return prepared query for given query type.
- * The query will be reset before returning.
+ * Return wrapped prepared query for given query type.
+ * The query will be reset after wrapper destruction.
*
* @param queryType query identifier
- * @return reference to prepared, reset query
+ * @return wrapped prepared query
*/
- DB::SqlConnection::DataCommandAutoPtr & getStatement(StmtType queryType);
+ StatementWrapper getStatement(StmtType queryType);
/**
* Check if pkgId is already registered in database
}
}
-DB::SqlConnection::DataCommandAutoPtr & PrivilegeDb::getStatement(StmtType queryType)
+PrivilegeDb::StatementWrapper::StatementWrapper(DB::SqlConnection::DataCommandAutoPtr &ref)
+ : m_ref(ref) {}
+
+PrivilegeDb::StatementWrapper::~StatementWrapper()
+{
+ m_ref->Reset();
+}
+
+DB::SqlConnection::DataCommand* PrivilegeDb::StatementWrapper::operator->()
+{
+ return m_ref.get();
+}
+
+PrivilegeDb::StatementWrapper PrivilegeDb::getStatement(StmtType queryType)
{
- auto &command = m_commands.at(static_cast<size_t>(queryType));
- command->Reset();
- return command;
+ return StatementWrapper(m_commands.at(static_cast<size_t>(queryType)));
}
PrivilegeDb::~PrivilegeDb()
bool PrivilegeDb::PkgIdExists(const std::string &pkgId)
{
return try_catch<bool>([&] {
- auto &command = getStatement(StmtType::EPkgIdExists);
+ auto command = getStatement(StmtType::EPkgIdExists);
command->BindString(1, pkgId);
return command->Step();
});
bool PrivilegeDb::GetAppPkgId(const std::string &appId, std::string &pkgId)
{
return try_catch<bool>([&] {
- auto &command = getStatement(StmtType::EGetPkgId);
+ auto command = getStatement(StmtType::EGetPkgId);
command->BindString(1, appId);
if (!command->Step()) {
const std::string &pkgId, uid_t uid)
{
try_catch<void>([&] {
- auto &command = getStatement(StmtType::EAddApplication);
+ auto command = getStatement(StmtType::EAddApplication);
command->BindString(1, appId);
command->BindString(2, pkgId);
command->BindInteger(3, static_cast<unsigned int>(uid));
return;
}
- auto &command = getStatement(StmtType::ERemoveApplication);
+ auto command = getStatement(StmtType::ERemoveApplication);
command->BindString(1, appId);
command->BindInteger(2, static_cast<unsigned int>(uid));
std::vector<std::string> ¤tPrivileges)
{
try_catch<void>([&] {
- auto &command = getStatement(StmtType::EGetPkgPrivileges);
+ auto command = getStatement(StmtType::EGetPkgPrivileges);
command->BindString(1, pkgId);
command->BindInteger(2, static_cast<unsigned int>(uid));
std::vector<std::string> ¤tPrivileges)
{
try_catch<void>([&] {
- DB::SqlConnection::DataCommandAutoPtr &command =
- m_commands.at(static_cast<size_t>(StmtType::EGetAppPrivileges));
+ auto command = getStatement(StmtType::EGetAppPrivileges);
- command->Reset();
command->BindString(1, appId);
command->BindInteger(2, static_cast<unsigned int>(uid));
currentPrivileges.clear();
void PrivilegeDb::RemoveAppPrivileges(const std::string &appId, uid_t uid)
{
try_catch<void>([&] {
- auto &command = getStatement(StmtType::ERemoveAppPrivileges);
+ auto command = getStatement(StmtType::ERemoveAppPrivileges);
command->BindString(1, appId);
command->BindInteger(2, static_cast<unsigned int>(uid));
if (command->Step()) {
const std::vector<std::string> &privileges)
{
try_catch<void>([&] {
- auto &command = getStatement(StmtType::EAddAppPrivileges);
+ auto command = getStatement(StmtType::EAddAppPrivileges);
command->BindString(1, appId);
command->BindInteger(2, static_cast<unsigned int>(uid));
std::vector<std::string> &groups)
{
try_catch<void>([&] {
- auto &command = getStatement(StmtType::EGetPrivilegeGroups);
+ auto command = getStatement(StmtType::EGetPrivilegeGroups);
command->BindString(1, privilege);
while (command->Step()) {
void PrivilegeDb::GetUserApps(uid_t uid, std::vector<std::string> &apps)
{
try_catch<void>([&] {
- auto &command = getStatement(StmtType::EGetUserApps);
+ auto command = getStatement(StmtType::EGetUserApps);
command->BindInteger(1, static_cast<unsigned int>(uid));
apps.clear();
while (command->Step()) {
std::vector<std::string> &appIds)
{
try_catch<void>([&] {
- DB::SqlConnection::DataCommandAutoPtr &command =
- m_commands.at(static_cast<size_t>(StmtType::EGetAppsInPkg));
+ auto command = getStatement(StmtType::EGetAppsInPkg);
- command->Reset();
command->BindString(1, pkgId);
appIds.clear();
std::vector<std::string> &mappings)
{
try_catch<void>([&] {
- auto &command = getStatement(StmtType::EGetDefaultMappings);
+ auto command = getStatement(StmtType::EGetDefaultMappings);
command->BindString(1, version_from);
command->BindString(2, version_to);
std::vector<std::string> &mappings)
{
try_catch<void>([&] {
- auto &command = getStatement(StmtType::EGetPrivilegeMappings);
+ auto command = getStatement(StmtType::EGetPrivilegeMappings);
command->BindString(1, version_from);
command->BindString(2, version_to);
command->BindString(3, privilege);
std::vector<std::string> &mappings)
{
try_catch<void>([&] {
- auto &deleteCmd = getStatement(StmtType::EDeletePrivilegesToMap);
+ auto deleteCmd = getStatement(StmtType::EDeletePrivilegesToMap);
deleteCmd->Step();
- auto & insertCmd = getStatement(StmtType::EInsertPrivilegeToMap);
+ auto insertCmd = getStatement(StmtType::EInsertPrivilegeToMap);
for (auto &privilege : privileges) {
if (privilege.empty())
continue;
insertCmd->BindNull(1);
insertCmd->Step();
- auto &queryCmd = getStatement(StmtType::EGetPrivilegesMappings);
+ auto queryCmd = getStatement(StmtType::EGetPrivilegesMappings);
queryCmd->BindString(1, version_from);
queryCmd->BindString(2, version_to);