Add implementation of API function add_shared_dir_readers.
authorJan Cybulski <j.cybulski@samsung.com>
Tue, 2 Apr 2013 10:55:22 +0000 (12:55 +0200)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Thu, 18 Apr 2013 10:02:42 +0000 (12:02 +0200)
[Issue#] SSDWSSP-154
[Feature] API function add_shared_dir_readers adds rx rules to an subject with shared_label for a list of applications with labels listed as a second parameter
[Cause] New API feature
[Solution] adds SMACK rx rules for listed application identifiers to shared_label.
[Verification]

Change-Id: I7eda467fe4738f9cff4f00b24156ac21c444294f

src/privilege-control.c

index 5e7002e..4a1afd9 100644 (file)
@@ -1339,9 +1339,55 @@ out:
 
 API int add_shared_dir_readers(const char* shared_label, const char** app_list)
 {
-       // TODO this needs to be fully implemented
        C_LOGD("Enter function: %s", __func__);
-       return PC_OPERATION_SUCCESS;
+#ifdef SMACK_ENABLED
+       int ret = PC_ERR_INVALID_PARAM;
+       int i;
+       int fd = -1;
+       for (i = 0; *app_list[i]; i++) {
+               char *smack_path = NULL;
+               struct smack_accesses *smack = NULL;
+
+
+               if (!smack_label_is_valid(shared_label))
+                               return PC_ERR_INVALID_PARAM;
+
+               ret = load_smack_from_file(
+                               app_list[i], &smack, &fd, &smack_path);
+               if (ret != PC_OPERATION_SUCCESS) {
+                       C_LOGE("load_smack_from_file failed");
+                       goto out;
+               }
+               if (smack_accesses_add_modify(smack, app_list[i], shared_label,
+                               "rx", "") == -1) {
+                       C_LOGE("smack_accesses_add failed");
+                       goto out;
+               }
+               if (have_smack() && smack_accesses_apply(smack)) {
+                       C_LOGE("smack_accesses_apply failed");
+                       ret =  PC_ERR_INVALID_OPERATION;
+                       goto out;
+               }
+               if (smack_accesses_save(smack, fd)) {
+                       C_LOGE("smack_accesses_save failed");
+                       ret =  PC_ERR_INVALID_OPERATION;
+                       goto out;
+               }
+               ret = PC_OPERATION_SUCCESS;
+out:
+               if (fd != -1)
+                       close(fd);
+               smack_accesses_free(smack);
+               free(smack_path);
+
+               if (ret != PC_OPERATION_SUCCESS)
+                       return ret;
+       }
+       return ret;
+#else
+               return PC_OPERATION_SUCCESS;
+#endif
+
 }
 
 API int app_add_friend(const char* app_id1, const char* app_id2)