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.");
}
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;
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.");
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++)
{
{
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