2 * Copyright (c) 2014-2016 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::revokeRules() const {
158 0 == smack_revoke_subject(generateAppLabel().c_str()),
159 "Revoking smack subject failed");
162 std::string AppInstallHelper::generateAppLabel() const {
163 return generateProcessLabel(getAppId(), getPkgId(), getIsHybrid());
166 std::string AppInstallHelper::generatePkgLabel() const {
167 return generatePathRWLabel(getPkgId());
170 const AppInstallHelper::TypePathsMap& AppInstallHelper::getDirsMap() const {
174 const AppInstallHelper::TypePathsMap& AppInstallHelper::getFilesMap() const {
175 return m_fileTypeMap;
178 void AppInstallHelper::removePaths() {
179 for (const auto &oneTypePaths : m_dirTypeMap)
180 for (const auto& path : oneTypePaths.second)
183 m_dirTypeMap.clear();
185 for (const auto &oneTypePaths : m_fileTypeMap)
186 for (const auto& path : oneTypePaths.second)
187 unlink(path.c_str());
189 m_fileTypeMap.clear();
191 rmdir(getInstallDir().c_str());
192 m_isInstallDirCreated = false;
195 void AppInstallHelper::setInstallPath() {
197 m_installDir = TzPlatformConfig::appDirPath(getUID());
199 m_installDir = TzPlatformConfig::globalAppDir() + "/";
202 bool AppInstallHelper::create(std::function<int(const char*, mode_t)> &&creatFun, const std::string &path) {
203 if (!m_isInstallDirCreated && path != getInstallDir())
205 if (creatFun(path.c_str(), 0751) == 0) {
206 // Local paths need user change
207 if (!m_isLocal || chown(path.c_str(), m_uidGid, m_uidGid) == 0)
213 void AppInstallHelper::setAuthor(const std::string &author) {
216 std::string AppInstallHelper::getAuthor() const {
220 void AppInstallHelper::setInstallType(app_install_type type) {
221 m_installType = type;
223 app_install_type AppInstallHelper::getInstallType() const {
224 return m_installType;