sessiond: Ensure proper ownership is set for subsession user app dirs 11/281011/1
authorAdam Michalski <a.michalski2@partner.samsung.com>
Wed, 7 Sep 2022 14:32:53 +0000 (16:32 +0200)
committerAdam Michalski <a.michalski2@partner.samsung.com>
Wed, 7 Sep 2022 15:15:50 +0000 (17:15 +0200)
Previously, all [SUBSESSION USER/apps_rw/*] subdirectories had their
UID:GID hardcoded as [subsession_uid]:`users`. Since some of the Tizen
app subdirectories have the group set to `system_share`, the correct
way is to copy the ownership from the corresponding
`/home/SUBSESSION USER/apps_rw/[some.app]/*` subdirectories.

Change-Id: Ie24d55179b8c2216dc57dd35b27a14a449c84642

src/service/src/fs_helpers.cpp

index 69475d2..2fa7a67 100644 (file)
@@ -67,7 +67,7 @@ std::string get_home_dir_by_user_id(const int uid)
 void copy_ownership(std::string_view src_path, std::string_view dest_path)
 {
        struct stat info;
-       int ret = stat(src_path.data(), &info);
+       int ret = lstat(src_path.data(), &info);
 
        if (ret)
                throw std::system_error(errno, std::system_category(),
@@ -205,7 +205,7 @@ void add_user_subsession(const int session_uid, const std::string_view subsessio
 {
        try {
                std::string home_dir = get_home_dir_by_user_id(session_uid);
-               std::string main_dir = std::move(home_dir) + "/" + main_dir_name.data();
+               std::string main_dir = home_dir + "/" + main_dir_name.data();
 
                create_main_subdirectory(session_uid, main_dir);
 
@@ -253,18 +253,19 @@ void add_user_subsession(const int session_uid, const std::string_view subsessio
                        | fs::copy_options::copy_symlinks
                );
 
-               // Copy SMACK attributes for `apps_rw/*` subdirectories & files
-               // but set [user]:[group] to `session_uid`:users
-               int users_gid = get_gid_from_name("users");
-
+               /* Copy SMACK attributes for `apps_rw/*` subdirectories & files
+                * but set [user]:[group] to the corresponding homedir's
+                * `apps_rw/*` subdirectory permissions */
                for (auto const& entry : fs::recursive_directory_iterator(source_dir)) {
                        std::string s_path = entry.path();
 
                        std::string tmp_path = s_path;
                        tmp_path.erase(0, source_dir_len);
+
+                       std::string u_path = home_dir + "/apps_rw" + tmp_path;
                        std::string d_path = apps_rw_dir + std::move(tmp_path);
 
-                       change_owner_and_group(d_path, session_uid, users_gid);
+                       copy_ownership(u_path, d_path);
                        copy_smack_attributes(s_path, d_path);
                }