Removing data of deleted application during lock state 34/28834/1
authorDongsun Lee <ds73.lee@samsung.com>
Fri, 12 Sep 2014 05:52:22 +0000 (14:52 +0900)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Thu, 16 Oct 2014 13:44:10 +0000 (15:44 +0200)
Change-Id: Id465b2dfd2ed37d8b54b1c191da8785a4dbc42cb

src/manager/service/ckm-logic.cpp
src/manager/service/file-system.cpp
src/manager/service/file-system.h

index e2309a6..331536c 100644 (file)
@@ -77,6 +77,13 @@ RawBuffer CKMLogic::unlockUserKey(uid_t user, const Password &password) {
             RawBuffer key = handle.keyProvider.getPureDEK(wrappedDatabaseDEK);
             handle.database = DBCrypto(fs.getDBPath(), key);
             handle.crypto = CryptoLogic();
+
+            // remove data of removed apps during locked state
+            AppLabelVector removedApps = fs.clearRemovedsApps();
+            for(auto& appSmackLabel : removedApps) {
+                handle.database.deleteKey(appSmackLabel);
+            }
+
             // TODO wipe key
         }
     } catch (const KeyProvider::Exception::PassWordError &e) {
@@ -185,8 +192,15 @@ RawBuffer CKMLogic::removeApplicationData(const std::string &smackLabel) {
         if (smackLabel.empty()) {
             retCode = CKM_API_ERROR_INPUT_PARAM;
         } else {
-            for(auto &handler: m_userDataMap) {
-                handler.second.database.deleteKey(smackLabel);
+            UidVector uids = FileSystem::getUIDsFromDBFile();
+            for (auto userId : uids) {
+                if (0 == m_userDataMap.count(userId)) {
+                    FileSystem fs(userId);
+                    fs.addRemovedApp(smackLabel);
+                } else {
+                    auto &handle = m_userDataMap[userId];
+                    handle.database.deleteKey(smackLabel);
+                }
             }
         }
 
index 10301ea..f714a89 100644 (file)
@@ -23,7 +23,9 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <dirent.h>
 
+#include <cstdlib>
 #include <string>
 #include <sstream>
 #include <fstream>
@@ -38,6 +40,7 @@ static const std::string CKM_DATA_PATH = "/opt/data/ckm/";
 static const std::string CKM_KEY_PREFIX = "key-";
 static const std::string CKM_DB_KEY_PREFIX = "db-key-";
 static const std::string CKM_DB_PREFIX = "db-";
+static const std::string CKM_REMOVED_APP_PREFIX = "removed-app-";
 
 } // namespace anonymous
 
@@ -66,6 +69,12 @@ std::string FileSystem::getDBDEKPath() const {
     return ss.str();
 }
 
+std::string FileSystem::getRemovedAppsPath() const {
+    std::stringstream ss;
+    ss << CKM_DATA_PATH << CKM_REMOVED_APP_PREFIX << m_uid;
+    return ss.str();
+}
+
 RawBuffer FileSystem::loadFile(const std::string &path) const {
     std::ifstream is(path);
 
@@ -104,6 +113,36 @@ bool FileSystem::saveDBDEK(const RawBuffer &buffer) const {
     return saveFile(getDBDEKPath(), buffer);
 }
 
+bool FileSystem::addRemovedApp(const std::string &smackLabel) const
+{
+    std::ofstream outfile;
+    outfile.open(getRemovedAppsPath(), std::ios_base::app);
+    outfile << smackLabel << std::endl;
+    outfile.close();
+    return !outfile.fail();
+}
+
+AppLabelVector FileSystem::clearRemovedsApps() const
+{
+    // read the contents
+    AppLabelVector removedApps;
+    std::string line;
+    std::ifstream removedAppsFile(getRemovedAppsPath());
+    if (removedAppsFile.is_open()) {
+        while (! removedAppsFile.eof() ) {
+            getline (removedAppsFile,line);
+            if(line.size() > 0)
+                removedApps.push_back(line);
+        }
+        removedAppsFile.close();
+    }
+    // truncate the contents
+    std::ofstream truncateFile;
+    truncateFile.open(getRemovedAppsPath(), std::ofstream::out | std::ofstream::trunc);
+    truncateFile.close();
+    return removedApps;
+}
+
 int FileSystem::init() {
     errno = 0;
     if ((mkdir(CKM_DATA_PATH.c_str(), 0700)) && (errno != EEXIST)) {
@@ -115,6 +154,44 @@ int FileSystem::init() {
     return 0;
 }
 
+UidVector FileSystem::getUIDsFromDBFile() {
+    UidVector uids;
+    DIR *dirp = NULL;
+    errno = 0;
+
+    if((dirp = opendir(CKM_DATA_PATH.c_str())) == NULL) {
+        int err = errno;
+        LogError("Error in opendir. Data directory could not be read. Errno: "
+                << err << " (" << strerror(err) << ")");
+        return UidVector();
+    }
+
+    struct dirent pPrevDirEntry;
+    struct dirent* pDirEntry = NULL;
+
+    while ((!readdir_r(dirp, &pPrevDirEntry, &pDirEntry)) && pDirEntry && (pDirEntry->d_name)) {
+
+        // Ignore files with diffrent prefix
+        if (strncmp(pDirEntry->d_name, CKM_KEY_PREFIX.c_str(), CKM_KEY_PREFIX.size())) {
+            continue;
+        }
+
+        // We find database. Let's extract user id.
+        try {
+            uids.push_back(static_cast<uid_t>(std::stoi((pDirEntry->d_name)+CKM_KEY_PREFIX.size())));
+        } catch (const std::invalid_argument) {
+            LogError("Error in extracting uid from db file. Error=std::invalid_argument."
+                "This will be ignored.File=" << pDirEntry->d_name << "");
+        } catch(const std::out_of_range) {
+            LogError("Error in extracting uid from db file. Error=std::out_of_range."
+                "This will be ignored. File="<< pDirEntry->d_name << "");
+        }
+    }
+
+    closedir(dirp);
+    return uids;
+}
+
 int FileSystem::removeUserData() const {
     int err, retCode = 0;
 
@@ -139,6 +216,13 @@ int FileSystem::removeUserData() const {
             << "Errno: " << errno << " " << strerror(err));
     }
 
+    if (unlink(getRemovedAppsPath().c_str())) {
+        retCode = -1;
+        err = errno;
+        LogError("Error in unlink user's Removed Apps File: " << getRemovedAppsPath()
+            << "Errno: " << errno << " " << strerror(err));
+    }
+
     return retCode;
 }
 
index 5e1c06a..53561d6 100644 (file)
@@ -26,6 +26,9 @@
 
 namespace CKM {
 
+typedef std::vector<std::string> AppLabelVector;
+typedef std::vector<uid_t> UidVector;
+
 class FileSystem {
 public:
     FileSystem(uid_t uid);
@@ -40,9 +43,14 @@ public:
     RawBuffer getDBDEK() const;
     bool saveDBDEK(const RawBuffer &buffer) const;
 
+    // Remove all ckm data related to user
     int removeUserData() const;
 
+    bool addRemovedApp(const std::string &smackLabel) const;
+    AppLabelVector clearRemovedsApps() const;
+
     static int init();
+    static UidVector getUIDsFromDBFile();
 
     virtual ~FileSystem(){}
 protected:
@@ -50,6 +58,7 @@ protected:
     std::string getDBDEKPath() const;
     RawBuffer loadFile(const std::string &path) const;
     bool saveFile(const std::string &path, const RawBuffer &buffer) const;
+    std::string getRemovedAppsPath() const;
 
     uid_t m_uid;
 };