Avoid appId and pkgId copying in AppInstallHelper
[platform/core/test/security-tests.git] / src / common / app_install_helper.h
1 /*
2  * Copyright (c) 2014-2019 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 #pragma once
17
18 #include <fcntl.h>
19 #include <functional>
20 #include <sys/types.h>
21 #include <unistd.h>
22
23 #include <map>
24 #include <string>
25 #include <utility>
26 #include <vector>
27
28 #include <security-manager-types.h>
29 #include <app_def_privilege.h>
30
31 struct AppInstallHelper {
32
33     using TypePathsMap = std::map<app_install_path_type, std::vector<std::string>>;
34     using TypePathMap = std::map<app_install_path_type, std::string>;
35
36     AppInstallHelper(const std::string &appNamePrefix,
37                      const std::string &pkgNamePrefix,
38                      bool isLocal,
39                      uid_t uid,
40                      std::string version = std::string())
41       : m_appName(appNamePrefix + "_app_id"), m_pkgName(pkgNamePrefix + "_pkg_id"), m_isLocal(isLocal), m_uidGid(uid), m_version(version),
42         m_installType(SM_APP_INSTALL_NONE), m_isHybrid(false), m_creatorPid(getpid())
43     {}
44
45     AppInstallHelper(const std::string &appNamePrefix,
46                      const std::string &pkgNamePrefix,
47                      uid_t uid)
48       : AppInstallHelper(appNamePrefix, pkgNamePrefix, false, uid)
49     {}
50
51     AppInstallHelper(const std::string &namePrefix)
52       : AppInstallHelper(namePrefix, namePrefix, false, geteuid())
53     {}
54
55     AppInstallHelper(const std::string &appNamePrefix, const std::string &pkgNamePrefix)
56       : AppInstallHelper(appNamePrefix, pkgNamePrefix, false, geteuid())
57     {}
58
59     AppInstallHelper(const std::string &namePrefix, uid_t uid)
60       : AppInstallHelper(namePrefix, namePrefix, true, uid)
61     {}
62
63     AppInstallHelper(const std::string &appNamePrefix, const std::string &pkgNamePrefix, uid_t uid,
64                      const std::string &version)
65       : AppInstallHelper(appNamePrefix, pkgNamePrefix, true, uid, version)
66     {}
67
68     AppInstallHelper(const std::string &namePrefix, uid_t uid, const std::string &version)
69       : AppInstallHelper(namePrefix, namePrefix, true, uid, version)
70     {}
71
72     AppInstallHelper(const AppInstallHelper &other) = default;
73     AppInstallHelper& operator=(const AppInstallHelper &other) = delete;
74     AppInstallHelper(AppInstallHelper &&other);
75
76     // App info getters and setters
77     const std::string& getAppId() const;
78     const std::string& getPkgId() const;
79     int getUID() const;
80     int getGID() const;
81     void setVersion(const std::string &version);
82     std::string getVersion() const;
83     void setAuthor(const std::string &author);
84     std::string getAuthor() const;
85     void setInstallType(app_install_type type);
86     app_install_type getInstallType() const;
87     void setHybrid();
88     bool getIsHybrid() const;
89
90     enum RootType {
91         BASE,
92         SKEL,
93         EXTENDED,
94         SHARED,
95         SHARED_TMP
96     };
97
98     enum PathType {
99         FILE,
100         DIR
101     };
102
103     // Path types creation and removal on file system
104     void createPath(app_install_path_type smType, PathType pType, int i = 0, RootType rType = RootType::BASE);
105
106     // below methods are deprecated
107     void createTrustedDir(int i = 0, RootType type = RootType::BASE);
108     void createPrivateDir(int i = 0, RootType type = RootType::BASE);
109     void createPublicDir(RootType type = RootType::BASE);
110     void createPrivateFile(int i = 0, RootType type = RootType::BASE);
111     void createSharedRODir(int i = 0, RootType type = RootType::BASE);
112     void createSharedROFile(int i = 0, RootType type = RootType::BASE);
113     void createPrivateRODir(int i = 0, RootType type = RootType::BASE);
114     void removePaths();
115
116     // Path getters
117     std::string getPath(app_install_path_type smType, PathType pType, int i = 0, RootType rType = RootType::BASE) const;
118
119     // below methods are deprecated
120     std::string getInstallDir(RootType type) const;
121     std::string getTrustedDir(int i = 0, RootType type = RootType::BASE) const;
122     std::string getPrivateDir(int i = 0, RootType type = RootType::BASE) const;
123     std::string getPrivateRODir(int i = 0, RootType type = RootType::BASE) const;
124     std::string getPublicDir(RootType type = RootType::BASE) const;
125     std::string getPrivatePath(int i = 0, RootType type = RootType::BASE) const;
126     std::string getSharedRODir(int i = 0, RootType type = RootType::BASE) const;
127     std::string getSharedROPath(int i = 0, RootType type = RootType::BASE) const;
128     const TypePathsMap& getDirsMap() const;
129     const TypePathsMap& getFilesMap() const;
130
131     // Privileges
132     std::vector<std::string> getPrivilegesNames() const;             // deprecated
133     void addPrivileges(const std::vector<std::string> &privileges);  // deprecated
134     void addPrivilege(Privilege privilege);
135     void addPrivileges(const PrivilegeVector &privileges);
136     const PrivilegeVector& getPrivileges() const;
137
138     void addAppDefinedPrivilege(Privilege privilege);
139     const PrivilegeVector& getAppDefinedPrivileges() const;
140
141     // Smack
142     std::string generateAppLabel() const;
143     std::string generatePkgLabel() const;
144     void revokeRules() const;
145     virtual ~AppInstallHelper() {
146         if (m_creatorPid == getpid())
147             removePaths();
148     }
149
150 protected:
151     struct RootInfo {
152         RootInfo() : isCreated(false) {}
153         std::string path;
154         int isCreated;
155     };
156     using RootTypeInfoMap = std::map<RootType, RootInfo>;
157
158     void setInstallPath(RootType type) const;
159
160     bool createFile(app_install_path_type smType, const std::string &path);
161     bool createDir(app_install_path_type smType, const std::string &path, bool isBasePath = false);
162     void createDirLink(app_install_path_type smType, const std::string &dest, int i = 0,
163                        RootType rType = RootType::BASE);
164     void createInstallDir(RootType type);
165
166     const std::string m_appName;
167     const std::string m_pkgName;
168     bool m_isLocal;
169     int m_uidGid;
170     std::string m_version;
171     app_install_type m_installType;
172     bool m_isHybrid;
173
174     mutable RootTypeInfoMap m_rootPaths;
175     TypePathsMap m_dirTypeMap;
176     TypePathsMap m_fileTypeMap;
177
178     PrivilegeVector m_privileges;
179     PrivilegeVector m_appDefinedPrivileges;
180
181     std::string m_author;
182
183     pid_t m_creatorPid;
184 };