hybrid privilege and prevent
authorDongeup Ham <dongeup.ham@samsung.com>
Fri, 19 Apr 2013 07:58:02 +0000 (16:58 +0900)
committerDongeup Ham <dongeup.ham@samsung.com>
Fri, 19 Apr 2013 07:58:02 +0000 (16:58 +0900)
Change-Id: I8d801088929c8e6a55ce61f69dd35ccd82e70aeb
Signed-off-by: Dongeup Ham <dongeup.ham@samsung.com>
inc/InstallerDefs.h
src/Manager/ConfigurationManager.cpp
src/Manager/ConfigurationManager.h
src/Manager/SmackManager.cpp

index a376e3f..77d2d42 100755 (executable)
@@ -23,7 +23,7 @@
 
 #include "InstallerUtil.h"
 
-#define OSP_INSTALLER_VERSION "version=[20130418.1]"
+#define OSP_INSTALLER_VERSION "version=[20130419.1]"
 
 #define DIR_BIN                                L"/bin"
 #define DIR_INFO                       L"/info"
index 776ddba..f5aca41 100755 (executable)
@@ -522,6 +522,16 @@ ConfigurationManager::MergeToSystemXmlFile(const String& systemXmlPath, const St
 
        int fileSize = pManifestEndTag - pMergedBuf.get() + strlen("\n</manifest>");
 
+       if (strcasestr(pServiceBuf.get(), "</privileges>") != null)
+       {
+               AppLog("Privileges are detected in service app.");
+               MergePrivileges(pMergedBuf.get(), pServiceBuf.get(), fileSize);
+       }
+       else
+       {
+               AppLog("No privileges are detected in service app.");
+       }
+
        File systemXml;
        r = systemXml.Construct(systemXmlPath, L"w");
        TryReturn(!IsFailed(r), false, "systemXmlPath.Construct() is failed.");
@@ -536,6 +546,111 @@ ConfigurationManager::MergeToSystemXmlFile(const String& systemXmlPath, const St
 }
 
 bool
+ConfigurationManager::MergePrivileges(char* pMergedBuf, char* pServiceBuf, int& fileSize)
+{
+       char* pMergedPrivilegeDetected = strcasestr(pMergedBuf, "</privileges>");
+       char* pMergedPoint = null;
+       char* pServicePrivilegeStart = null;
+       char* pServicePrivilegeEnd = null;
+       int privilegeLen = 0;
+       int serviceBufLen = strlen(pServiceBuf);
+       std::unique_ptr<char[]> pSelectedPrivBuf(new char[serviceBufLen + 1]);
+       memset(pSelectedPrivBuf.get(), 0, serviceBufLen + 1);
+
+       if (pMergedPrivilegeDetected == null)
+       {
+               AppLog("No privileges are detected in web app.");
+
+               pServicePrivilegeStart = strcasestr(pServiceBuf, "<privileges>");
+               pServicePrivilegeEnd = strcasestr(pServiceBuf, "</privileges>");
+
+               privilegeLen = pServicePrivilegeEnd - pServicePrivilegeStart + strlen("</privileges>");
+               pMergedPoint = strcasestr(pMergedBuf, "<ui-application");
+
+               AppLog("Inserted privileges of service app");
+               InstallerUtil::DumpLogData(pServicePrivilegeStart, privilegeLen);
+       }
+       else
+       {
+               AppLog("Privileges are detected in web app.");
+
+               pServicePrivilegeStart = strcasestr(pServiceBuf, "<privilege>");
+               pServicePrivilegeEnd = strcasestr(pServiceBuf, "</privileges>");
+
+               privilegeLen = pServicePrivilegeEnd - pServicePrivilegeStart;
+               pMergedPoint = strcasestr(pMergedBuf, "</privileges>");
+
+               AppLog("Original privileges of service app");
+               InstallerUtil::DumpLogData(pServicePrivilegeStart, privilegeLen);
+
+               std::unique_ptr<char[]> pPrivBuf(new char[privilegeLen + 1]);
+               memset(pPrivBuf.get(), 0, privilegeLen + 1);
+               strncpy(pPrivBuf.get(), pServicePrivilegeStart, privilegeLen);
+
+               char* pEachPrivStart = pPrivBuf.get();
+               char* pEachPrivEnd = null;
+               int eachPrivLen = 0;
+               char eachPrivBuf[512] = {0};
+
+               while (pEachPrivStart && (pEachPrivStart < pPrivBuf.get() + privilegeLen))
+               {
+                       pEachPrivEnd = strcasestr(pEachPrivStart, "</privilege>");
+                       eachPrivLen = pEachPrivEnd - pEachPrivStart + strlen("</privilege>");
+                       if ((pEachPrivEnd > 0) && (eachPrivLen > 0))
+                       {
+                               memset(eachPrivBuf, 0, sizeof(eachPrivBuf));
+                               memcpy(eachPrivBuf, pEachPrivStart, eachPrivLen);
+                               AppLog("[%s]", eachPrivBuf);
+
+                               if (strcasestr(pMergedBuf, eachPrivBuf) == 0)
+                               {
+                                       strncat(pSelectedPrivBuf.get(), eachPrivBuf, serviceBufLen);
+                               }
+                               else
+                               {
+                                       AppLog("This privilege is discarded, [%s]", eachPrivBuf);
+                               }
+                       }
+                       else
+                       {
+                               AppLog("End of privileges merging.");
+                               break;
+                       }
+
+                       pEachPrivStart = strcasestr(pEachPrivEnd, "<privilege>");
+               }
+
+               pServicePrivilegeStart = pSelectedPrivBuf.get();
+               privilegeLen = strlen(pServicePrivilegeStart);
+
+               AppLog("Filtered privileges of service app");
+               InstallerUtil::DumpLogData(pServicePrivilegeStart, privilegeLen);
+       }
+
+       if ((pMergedPoint > 0) && (pServicePrivilegeStart > 0) && (privilegeLen > 0))
+       {
+               int lastPartLen = fileSize - (pMergedPoint - pMergedBuf);
+               std::unique_ptr<char[]> pLastPartBuf(new (std::nothrow) char[fileSize + 1]);
+               memset(pLastPartBuf.get(), 0, fileSize + 1);
+
+               if (lastPartLen > 0)
+               {
+                       memcpy(pLastPartBuf.get(), pMergedPoint, lastPartLen);
+
+                       AppLog("Last part of merged xml for backup");
+                       InstallerUtil::DumpLogData(pLastPartBuf.get(), lastPartLen);
+
+                       memcpy(pMergedPoint, pServicePrivilegeStart, privilegeLen);
+
+                       memcpy(pMergedPoint + privilegeLen, pLastPartBuf.get(), lastPartLen);
+                       fileSize += privilegeLen;
+               }
+       }
+
+       return true;
+}
+
+bool
 ConfigurationManager::CreateImeSymlink(const String& binaryPath, const String& appId)
 {
        bool res = true;
index ddc24aa..38e1eee 100755 (executable)
@@ -49,6 +49,7 @@ private:
        bool CreateCoreXmlFile(InstallationContext* pContext);
        // bool CreateHybridServiceDesktopFile(InstallationContext* pContext);
        bool MergeToSystemXmlFile(const Tizen::Base::String& systemXmlPath, const Tizen::Base::String& webXmlPath,const Tizen::Base::String& serviceXmlPath);
+       bool MergePrivileges(char* pMergeBuf, char* pServiceBuf, int& length);
 
        bool CreateImeSymlink(const Tizen::Base::String& binaryPath, const Tizen::Base::String& packageName);
        bool FindPrivilege(InstallationContext* pContext, const Tizen::Base::String& privilege) const;
index 5244d03..392db59 100755 (executable)
@@ -239,7 +239,8 @@ SmackManager::AddSharedDirReaders(const Tizen::Base::String& label)
 
        TryReturn(__pContext, false, "__pContext is null");
 
-       int res = 0;
+       int error = 0;
+       bool res = true;
 
        std::unique_ptr<char[]> pLabel(_StringConverter::CopyToCharArrayN(label));
        TryReturn(pLabel, false, "pLabel is null.");
@@ -251,6 +252,9 @@ SmackManager::AddSharedDirReaders(const Tizen::Base::String& label)
 
        const char** pList = new (std::nothrow) const char*[count+1];
        TryReturn(pList, false, "pList is null.");
+       int len = sizeof(const char*) * (count+1);
+       memset(pList, 0, len);
+       AppLog("pList : init: size=%d", len);
 
        for (int i = 0; i < count; i++)
        {
@@ -259,25 +263,27 @@ SmackManager::AddSharedDirReaders(const Tizen::Base::String& label)
                {
                        PackageId packageId = pPackageInfo->GetId();
 
-                       char* pPackageId = _StringConverter::CopyToCharArrayN(packageId);
-                       TryReturn(pPackageId, false, "pPackageId is null.");
+                       std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
+                       TryCatch(pPackageId, res = false, "pPackageId is null.");
 
-                       pList[i] = pPackageId;
+                       pList[i] = pPackageId.release();
                }
         }
 
        pList[count] = null;
 
-       res = AddSharedDirReaders(pLabel.get(), pList);
+       error = AddSharedDirReaders(pLabel.get(), pList);
+       res = true;
 
+CATCH:
        for (int i = 0; pList[i] != null; i++)
        {
-               //AppLog("delete Package - [%s]", pList[i]);
+               // AppLog("delete Package - [%s]", pList[i]);
                delete[] pList[i];
         }
        delete[] pList;
 
-       return true;
+       return res;
 }
 
 bool