2 * Copyright (c) 2014-2017 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <sys/types.h>
22 #include <sys/smack.h>
26 #include <security-manager-types.h>
28 #include <dpl/test/test_runner.h>
29 #include <sm_commons.h>
30 #include <tzplatform.h>
32 #include "app_install_helper.h"
34 AppInstallHelper::AppInstallHelper(AppInstallHelper &&other)
35 : m_appName(std::move(other.m_appName)), m_pkgName(std::move(other.m_pkgName)),
36 m_isLocal(other.m_isLocal), m_uidGid(other.m_uidGid),
37 m_version(std::move(other.m_version)), m_installType(other.m_installType),
38 m_isHybrid(other.m_isHybrid), m_installDir(std::move(other.m_installDir)),
39 m_dirTypeMap(std::move(other.m_dirTypeMap)), m_fileTypeMap(std::move(other.m_fileTypeMap)),
40 m_privileges(std::move(other.m_privileges)), m_author(std::move(other.m_author)),
41 m_creatorPid(other.m_creatorPid)
43 other.m_creatorPid = -1;
46 std::string AppInstallHelper::getInstallDir() const {
47 return m_installDir + getPkgId();
50 std::string AppInstallHelper::getTrustedDir(int i) const {
51 return getInstallDir() + "/trustedDir" + std::to_string(i);
54 std::string AppInstallHelper::getPrivateDir(int i) const {
55 return getInstallDir() + "/app_dir" + std::to_string(i) +"/";
58 std::string AppInstallHelper::getPrivateRODir(int i) const {
59 return getInstallDir() + "/app_dir_ro" + std::to_string(i) +"/";
62 std::string AppInstallHelper::getPublicDir() const {
63 return getInstallDir() + "/app_public_ro/";
66 std::string AppInstallHelper::getPrivatePath(int i) const {
67 return getPrivateDir() + "shareme" + std::to_string(i);
70 std::string AppInstallHelper::getSharedRODir(int i) const {
71 return getInstallDir() + "/app_dir_rw_others_ro" + std::to_string(i) +"/";
74 std::string AppInstallHelper::getAppId() const {
75 return m_appName + "_app_id";
78 std::string AppInstallHelper::getPkgId() const {
79 return m_pkgName + "_pkg_id";
82 void AppInstallHelper::setVersion(const std::string &version) {
86 std::string AppInstallHelper::getVersion() const {
90 int AppInstallHelper::getUID() const {
94 int AppInstallHelper::getGID() const {
98 void AppInstallHelper::createInstallDir() {
99 create(mkdir, getInstallDir());
100 m_isInstallDirCreated = true;
103 void AppInstallHelper::createTrustedDir(int i) {
104 if (create(mkdir, getTrustedDir(i)))
105 m_dirTypeMap[SECURITY_MANAGER_PATH_TRUSTED_RW].emplace_back(getTrustedDir(i));
108 void AppInstallHelper::createPrivateDir(int i) {
109 if (create(mkdir, getPrivateDir(i)))
110 m_dirTypeMap[SECURITY_MANAGER_PATH_RW].emplace_back(getPrivateDir(i));
113 void AppInstallHelper::createPublicDir() {
114 if (mkdir(getPublicDir().c_str(), 0777) == 0) {
115 m_dirTypeMap[SECURITY_MANAGER_PATH_PUBLIC_RO].emplace_back(getPublicDir());
119 void AppInstallHelper::createPrivateFile(int i) {
120 // This is intentional, let all private file be in one directory
122 if (create(creat, getPrivatePath(i)))
123 m_fileTypeMap[SECURITY_MANAGER_PATH_RW].emplace_back(getPrivatePath(i));
126 void AppInstallHelper::createSharedRODir(int i) {
127 if (create(mkdir, getSharedRODir(i)))
128 m_dirTypeMap[SECURITY_MANAGER_PATH_OWNER_RW_OTHER_RO].emplace_back(getSharedRODir(i));
131 void AppInstallHelper::createPrivateRODir(int i) {
132 if (create(mkdir, getPrivateRODir(i)))
133 m_dirTypeMap[SECURITY_MANAGER_PATH_RO].emplace_back(getPrivateRODir(i));
136 void AppInstallHelper::setHybrid() {
140 bool AppInstallHelper::getIsHybrid() const {
144 void AppInstallHelper::addPrivilege(const std::string &privilege) {
145 m_privileges.push_back(privilege);
148 void AppInstallHelper::addPrivileges(const std::vector<std::string> &privileges) {
149 std::copy(privileges.begin(), privileges.end(), std::back_inserter(m_privileges));
152 std::vector<std::string> AppInstallHelper::getPrivileges() const {
156 void AppInstallHelper::addAppDefinedPrivilege(const AppDefPrivilege &privilege) {
157 m_appDefinedPrivileges.push_back(privilege);
160 AppDefPrivilegeVector AppInstallHelper::getAppDefinedPrivileges() const {
161 return m_appDefinedPrivileges;
164 void AppInstallHelper::revokeRules() const {
166 0 == smack_revoke_subject(generateAppLabel().c_str()),
167 "Revoking smack subject failed");
170 std::string AppInstallHelper::generateAppLabel() const {
171 return generateProcessLabel(getAppId(), getPkgId(), getIsHybrid());
174 std::string AppInstallHelper::generatePkgLabel() const {
175 return generatePathRWLabel(getPkgId());
178 const AppInstallHelper::TypePathsMap& AppInstallHelper::getDirsMap() const {
182 const AppInstallHelper::TypePathsMap& AppInstallHelper::getFilesMap() const {
183 return m_fileTypeMap;
186 void AppInstallHelper::removePaths() {
187 for (const auto &oneTypePaths : m_dirTypeMap)
188 for (const auto& path : oneTypePaths.second)
191 m_dirTypeMap.clear();
193 for (const auto &oneTypePaths : m_fileTypeMap)
194 for (const auto& path : oneTypePaths.second)
195 unlink(path.c_str());
197 m_fileTypeMap.clear();
199 rmdir(getInstallDir().c_str());
200 m_isInstallDirCreated = false;
203 void AppInstallHelper::setInstallPath() {
205 m_installDir = TzPlatformConfig::appDirPath(getUID());
207 m_installDir = TzPlatformConfig::globalAppDir() + "/";
210 bool AppInstallHelper::create(std::function<int(const char*, mode_t)> &&creatFun, const std::string &path) {
211 if (!m_isInstallDirCreated && path != getInstallDir())
213 if (creatFun(path.c_str(), 0751) == 0) {
214 // Local paths need user change
215 if (!m_isLocal || chown(path.c_str(), m_uidGid, m_uidGid) == 0)
221 void AppInstallHelper::setAuthor(const std::string &author) {
224 std::string AppInstallHelper::getAuthor() const {
228 void AppInstallHelper::setInstallType(app_install_type type) {
229 m_installType = type;
231 app_install_type AppInstallHelper::getInstallType() const {
232 return m_installType;