From 09f665d329829fc13798bf588b35becab3d48dfc Mon Sep 17 00:00:00 2001 From: Jaemin Ryu Date: Thu, 24 Nov 2016 15:58:24 +0900 Subject: [PATCH] Add path name based admin indentifier for session daemons Change-Id: Ifa24fbe0336c7cbcdb273416ba6ed2e4213cdc18 Signed-off-by: Jaemin Ryu --- server/client-manager.cpp | 15 +++++++-------- server/server.cpp | 23 ++++++++++++++++++++--- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/server/client-manager.cpp b/server/client-manager.cpp index 6ff7652..46f2813 100644 --- a/server/client-manager.cpp +++ b/server/client-manager.cpp @@ -16,7 +16,6 @@ #include #include -#include #include @@ -32,7 +31,7 @@ DeviceAdministrator::~DeviceAdministrator() } DeviceAdministratorManager::DeviceAdministratorManager(const std::string& path) : - repository(path + "/.client.db") + repository(path + "/.dpm.db") { prepareRepository(); } @@ -41,7 +40,7 @@ DeviceAdministrator DeviceAdministratorManager::enroll(const std::string& name, { database::Connection connection(repository, database::Connection::ReadWrite); - std::string selectQuery = "SELECT * FROM CLIENT WHERE PKG = ? AND UID = ?"; + std::string selectQuery = "SELECT * FROM ADMIN WHERE PKG = ? AND UID = ?"; database::Statement stmt0(connection, selectQuery); stmt0.bind(1, name); stmt0.bind(2, static_cast(uid)); @@ -51,7 +50,7 @@ DeviceAdministrator DeviceAdministratorManager::enroll(const std::string& name, std::string key = generateKey(); - std::string insertQuery = "INSERT INTO CLIENT (PKG, UID, KEY, VALID) VALUES (?, ?, ?, ?)"; + std::string insertQuery = "INSERT INTO ADMIN (PKG, UID, KEY, REMOVABLE) VALUES (?, ?, ?, ?)"; database::Statement stmt(connection, insertQuery); stmt.bind(1, name); stmt.bind(2, static_cast(uid)); @@ -68,7 +67,7 @@ void DeviceAdministratorManager::disenroll(const std::string& name, uid_t uid) { database::Connection connection(repository, database::Connection::ReadWrite); - std::string query = "DELETE FROM CLIENT WHERE PKG = ? AND UID = ?"; + std::string query = "DELETE FROM ADMIN WHERE PKG = ? AND UID = ?"; database::Statement stmt(connection, query); stmt.bind(1, name); stmt.bind(2, static_cast(uid)); @@ -88,16 +87,16 @@ void DeviceAdministratorManager::prepareRepository() database::Connection connection(repository, database::Connection::ReadWrite | database::Connection::Create); - std::string query = "CREATE TABLE IF NOT EXISTS CLIENT (" \ + std::string query = "CREATE TABLE IF NOT EXISTS ADMIN (" \ "ID INTEGER PRIMARY KEY AUTOINCREMENT, " \ "PKG TEXT, " \ "UID INTEGER, " \ "KEY TEXT, " \ - "VALID INTEGER)"; + "REMOVABLE INTEGER)"; connection.exec(query); - database::Statement stmt(connection, "SELECT * FROM CLIENT"); + database::Statement stmt(connection, "SELECT * FROM ADMIN"); while (stmt.step()) { std::string name = stmt.getColumn(1).getText(); uid_t uid = static_cast(stmt.getColumn(2).getInt()); diff --git a/server/server.cpp b/server/server.cpp index 16dee15..eb42a98 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -14,10 +14,10 @@ * limitations under the License */ -#include -#include #include #include +#include +#include #include @@ -47,7 +47,24 @@ std::string GetPackageId(uid_t uid, pid_t pid) char pkgid[PATH_MAX]; if (aul_app_get_pkgid_bypid_for_uid(pid, pkgid, PATH_MAX, uid) != 0) { - throw runtime::Exception("Unknown PID"); + int fd = ::open(std::string("/proc/" + std::to_string(pid) + "/cmdline").c_str(), O_RDONLY); + if (fd == -1) { + throw runtime::Exception("Unknown PID"); + } + + ssize_t ret, bytes = 0; + do { + ret = ::read(fd, &pkgid[bytes], PATH_MAX); + if (ret != -1) { + bytes += ret; + } + } while ((ret == -1) && (errno == EINTR)); + + if (ret == -1) { + throw runtime::Exception("Failed to get admin info"); + } + + pkgid[bytes] = '\0'; } return pkgid; -- 2.7.4