12 #include <appsvc/appsvc.h>
15 #include <pkgmgr-info.h>
16 #include <security-server.h>
18 #include "data-control-sql.h"
19 #include "data-control-internal.h"
21 #define REQUEST_PATH_MAX 512
22 #define MAX_REQUEST_ARGUMENT_SIZE 1048576 // 1MB
23 #define MAX_ROW_COUNT 1024
25 struct datacontrol_s {
37 datacontrol_sql_response_cb *sql_response_cb;
41 static void *datacontrol_sql_tree_root = NULL;
44 datacontrol_sql_call_cb(const char *provider_id, int request_id, datacontrol_request_type type
45 , const char *data_id, bool provider_result, const char *error, long long insert_rowid, resultset_cursor* cursor, void* data)
47 SECURE_LOGI("datacontrol_sql_call_cb, dataID: %s", data_id);
49 datacontrol_sql_response_cb *callback = NULL;
51 sql_response_cb_s *sql_dc = NULL;
52 sql_dc = (sql_response_cb_s *)data;
53 callback = sql_dc->sql_response_cb;
56 LOGE("no listener set");
60 datacontrol_h provider;
61 datacontrol_sql_create(&provider);
63 datacontrol_sql_set_provider_id(provider, provider_id);
64 datacontrol_sql_set_data_id(provider, data_id);
68 case DATACONTROL_TYPE_SQL_SELECT:
71 if (callback != NULL && callback->select != NULL)
73 callback->select(request_id, provider, cursor, provider_result, error, sql_dc->user_data);
77 LOGI("No registered callback function");
82 case DATACONTROL_TYPE_SQL_INSERT:
84 SECURE_LOGI("INSERT row_id: %lld", insert_rowid);
85 if (callback != NULL && callback->insert != NULL)
87 callback->insert(request_id, provider, insert_rowid, provider_result, error, sql_dc->user_data);
91 LOGI("No registered callback function");
96 case DATACONTROL_TYPE_SQL_UPDATE:
99 if (callback != NULL && callback->update != NULL)
101 callback->update(request_id, provider, provider_result, error, sql_dc->user_data);
105 LOGI("No registered callback function");
110 case DATACONTROL_TYPE_SQL_DELETE:
113 if (callback != NULL && callback->delete != NULL)
115 callback->delete(request_id, provider, provider_result, error, sql_dc->user_data);
119 LOGI("No registered callback function");
127 datacontrol_sql_destroy(provider);
131 datacontrol_sql_instance_free(void *datacontrol_sql_instance)
133 sql_response_cb_s *dc = (sql_response_cb_s *)datacontrol_sql_instance;
136 free(dc->provider_id);
139 free(dc->access_info);
140 free(datacontrol_sql_instance);
147 datacontrol_sql_instance_compare(const void *l_datacontrol_sql_instance, const void *r_datacontrol_sql_instance)
149 sql_response_cb_s *dc_left = (sql_response_cb_s *)l_datacontrol_sql_instance;
150 sql_response_cb_s *dc_right = (sql_response_cb_s *)r_datacontrol_sql_instance;
151 return strcmp(dc_left->provider_id, dc_right->provider_id);
156 datacontrol_sql_handle_cb(bundle* b, int request_code, appsvc_result_val res, void* data)
158 SECURE_LOGI("datacontrol_sql_handle_cb, request_code: %d, result: %d", request_code, res);
161 const char** result_list = NULL;
162 resultset_cursor *cursor = NULL;
163 const char* provider_id = NULL;
164 const char* data_id = NULL;
165 const char* error_message = NULL;
166 long long insert_rowid = -1;
167 datacontrol_request_type request_type = 0;
169 int result_list_len = 0;
170 int provider_result = 0;
171 const char* resultset_path = NULL;
172 const char* p = NULL;
176 p = appsvc_get_data(b, OSP_K_REQUEST_ID);
179 LOGE("Invalid Bundle: request_id is null");
180 return DATACONTROL_ERROR_INVALID_PARAMETER;
184 request_id = atoi(p);
187 SECURE_LOGI("Request ID: %d", request_id);
190 result_list = appsvc_get_data_array(b, OSP_K_ARG, &result_list_len);
193 LOGE("Invalid Bundle: arguement list is null");
194 return DATACONTROL_ERROR_INVALID_PARAMETER;
197 p = result_list[0]; // result list[0] = provider_result
200 LOGE("Invalid Bundle: provider_result is null");
201 return DATACONTROL_ERROR_INVALID_PARAMETER;
204 LOGI("Provider result: %s", p);
206 provider_result = atoi(p);
208 error_message = result_list[1]; // result list[1] = error
211 LOGE("Invalid Bundle: error_message is null");
212 return DATACONTROL_ERROR_INVALID_PARAMETER;
215 LOGI("Error message: %s", error_message);
217 p = appsvc_get_data(b, OSP_K_DATACONTROL_REQUEST_TYPE);
220 LOGE("Invalid Bundle: data-control request type is null");
221 return DATACONTROL_ERROR_INVALID_PARAMETER;
224 request_type = (datacontrol_request_type)atoi(p);
226 provider_id = appsvc_get_data(b, OSP_K_DATACONTROL_PROVIDER);
229 LOGE("Invalid Bundle: provider_id is null");
230 return DATACONTROL_ERROR_INVALID_PARAMETER;
233 data_id = appsvc_get_data(b, OSP_K_DATACONTROL_DATA);
236 LOGE("Invalid Bundle: data_id is null");
237 return DATACONTROL_ERROR_INVALID_PARAMETER;
240 SECURE_LOGI("Provider ID: %s, Data ID: %s, Operation type: %d", provider_id, data_id, request_type);
242 switch (request_type)
244 case DATACONTROL_TYPE_SQL_SELECT:
246 LOGI("SELECT RESPONSE");
249 resultset_path = result_list[2]; // result list[2]
252 LOGE("sql query result path is null");
253 return DATACONTROL_ERROR_INVALID_PARAMETER;
256 SECURE_LOGI("resultset_path: %s", resultset_path);
258 if (strcmp(resultset_path, "NoResultSet") != 0) // Result set exists
260 cursor = datacontrol_sql_get_cursor(resultset_path);
263 LOGE("failed to get cursor on sql query resultset");
264 return DATACONTROL_ERROR_INVALID_PARAMETER;
270 case DATACONTROL_TYPE_SQL_INSERT:
272 LOGI("INSERT RESPONSE");
275 p = result_list[2]; // result list[2]
278 LOGE("Invalid Bundle: insert row_id is null");
279 return DATACONTROL_ERROR_INVALID_PARAMETER;
282 insert_rowid = atoll(p);
286 case DATACONTROL_TYPE_SQL_UPDATE:
287 case DATACONTROL_TYPE_SQL_DELETE:
289 LOGI("UPDATE or DELETE RESPONSE");
300 LOGE("the bundle returned from datacontrol-provider-service is null");
301 return DATACONTROL_ERROR_INVALID_PARAMETER;
304 if (request_type >= DATACONTROL_TYPE_SQL_SELECT && request_type <= DATACONTROL_TYPE_SQL_DELETE)
306 datacontrol_sql_call_cb(provider_id, request_id, request_type, data_id, provider_result, error_message, insert_rowid, cursor, data);
307 if ((request_type == DATACONTROL_TYPE_SQL_SELECT) && (cursor))
309 datacontrol_sql_remove_cursor(cursor);
312 ret = DATACONTROL_ERROR_NONE;
316 ret = DATACONTROL_ERROR_INVALID_PARAMETER;
323 app_svc_res_cb_sql(bundle* b, int request_code, appsvc_result_val res, void* data)
325 LOGI("app_svc_res_cb_sql, request_code: %d, result: %d", request_code, res);
329 datacontrol_sql_handle_cb(b, request_code, res, data);
333 LOGE("error: listener information is null");
339 datacontrol_sql_request_provider(datacontrol_h provider, datacontrol_request_type type, bundle *arg_list, int request_id)
341 SECURE_LOGI("SQL Data control request, type: %d, request id: %d", type, request_id);
346 if ((int)type <= (int)DATACONTROL_TYPE_SQL_DELETE)
348 if ((int)type < (int)DATACONTROL_TYPE_SQL_SELECT)
350 LOGE("invalid request type: %d", (int)type);
351 return DATACONTROL_ERROR_INVALID_PARAMETER;
354 if (!datacontrol_sql_tree_root)
356 LOGE("the listener tree is empty");
357 return DATACONTROL_ERROR_INVALID_PARAMETER;
360 sql_response_cb_s *sql_dc_temp = (sql_response_cb_s *)calloc(sizeof(sql_response_cb_s),1);
363 LOGE("failed to create sql datacontrol");
364 return DATACONTROL_ERROR_OUT_OF_MEMORY;
367 sql_dc_temp->provider_id = strdup(provider->provider_id);
368 if (!sql_dc_temp->provider_id)
370 LOGE("failed to assign provider id to sql data control: %d", errno);
372 return DATACONTROL_ERROR_OUT_OF_MEMORY;
375 sql_dc_temp->data_id = strdup(provider->data_id);
376 if (!sql_dc_temp->data_id)
378 LOGE("failed to assign data id to sql data control: %d", errno);
379 free(sql_dc_temp->provider_id);
381 return DATACONTROL_ERROR_OUT_OF_MEMORY;
384 sql_dc_temp->app_id = NULL;
385 sql_dc_temp->access_info = NULL;
386 sql_dc_temp->user_data = NULL;
387 sql_dc_temp->sql_response_cb = NULL;
389 void *sql_dc_returned = NULL;
390 sql_dc_returned = tfind(sql_dc_temp, &datacontrol_sql_tree_root, datacontrol_sql_instance_compare);
392 datacontrol_sql_instance_free(sql_dc_temp);
394 if (!sql_dc_returned)
396 LOGE("sql datacontrol returned after tfind is null");
397 return DATACONTROL_ERROR_IO_ERROR;
400 sql_response_cb_s *sql_dc = *(sql_response_cb_s **)sql_dc_returned;
401 app_id = sql_dc->app_id;
404 SECURE_LOGI("SQL datacontrol appid: %s", sql_dc->app_id);
407 char caller_app_id[255];
408 pid_t pid = getpid();
409 if (aul_app_get_appid_bypid(pid, caller_app_id, sizeof(caller_app_id)) != 0)
411 SECURE_LOGE("Failed to get appid by pid(%d).", pid);
412 return DATACONTROL_ERROR_INVALID_PARAMETER;
415 appsvc_set_operation(arg_list, APPSVC_OPERATION_DEFAULT);
416 appsvc_set_appid(arg_list, app_id);
417 bundle_add_str(arg_list, OSP_K_CALLER_TYPE, OSP_V_CALLER_TYPE_OSP);
418 bundle_add_str(arg_list, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_DATACONTROL);
419 bundle_add_str(arg_list, OSP_K_DATACONTROL_PROTOCOL_VERSION, OSP_V_VERSION_2_1_0_3);
420 bundle_add_str(arg_list, AUL_K_CALLER_APPID, caller_app_id);
421 bundle_add_str(arg_list, AUL_K_NO_CANCEL, "1");
424 char datacontrol_request_operation[MAX_LEN_DATACONTROL_REQ_TYPE] = {0, };
425 snprintf(datacontrol_request_operation, MAX_LEN_DATACONTROL_REQ_TYPE, "%d", (int)(type));
426 bundle_add_str(arg_list, OSP_K_DATACONTROL_REQUEST_TYPE, datacontrol_request_operation);
428 char req_id[32] = {0, };
429 snprintf(req_id, 32, "%d", request_id);
430 bundle_add_str(arg_list, OSP_K_REQUEST_ID, req_id);
432 // For DataControl CAPI
433 bundle_add_str(arg_list, AUL_K_DATA_CONTROL_TYPE, "CORE");
435 SECURE_LOGI("SQL data control request - provider id: %s, data id: %s, provider appid: %s, request ID: %s", provider->provider_id, provider->data_id, app_id, req_id);
439 const int TRY_COUNT = 4;
440 const struct timespec TRY_SLEEP_TIME = { 0, 1000 * 1000 * 1000 };
444 pid = appsvc_run_service(arg_list, request_id, app_svc_res_cb_sql, data);
447 SECURE_LOGI("Launch the provider app successfully: %d", pid);
448 return DATACONTROL_ERROR_NONE;
450 else if (pid == APPSVC_RET_EINVAL)
452 SECURE_LOGE("not able to launch service: %d", pid);
453 return DATACONTROL_ERROR_INVALID_PARAMETER;
458 nanosleep(&TRY_SLEEP_TIME, 0);
460 while (count < TRY_COUNT);
462 SECURE_LOGE("unable to launch service: %d", pid);
463 return DATACONTROL_ERROR_IO_ERROR;
467 datacontrol_sql_create(datacontrol_h *provider)
469 struct datacontrol_s *request;
471 if (provider == NULL)
473 return DATACONTROL_ERROR_INVALID_PARAMETER;
476 request = malloc(sizeof(struct datacontrol_s));
479 return DATACONTROL_ERROR_OUT_OF_MEMORY;
482 request->provider_id = NULL;
483 request->data_id = NULL;
491 datacontrol_sql_destroy(datacontrol_h provider)
493 if (provider == NULL)
495 return DATACONTROL_ERROR_INVALID_PARAMETER;
498 if (provider->provider_id != NULL)
500 free(provider->provider_id);
503 if (provider->data_id != NULL)
505 free(provider->data_id);
513 datacontrol_sql_set_provider_id(datacontrol_h provider, const char *provider_id)
515 if (provider == NULL || provider_id == NULL)
517 return DATACONTROL_ERROR_INVALID_PARAMETER;
520 if (provider->provider_id != NULL)
522 free(provider->provider_id);
525 provider->provider_id = strdup(provider_id);
526 if (provider->provider_id == NULL)
528 return DATACONTROL_ERROR_OUT_OF_MEMORY;
535 datacontrol_sql_get_provider_id(datacontrol_h provider, char **provider_id)
537 if (provider == NULL || provider_id == NULL)
539 return DATACONTROL_ERROR_INVALID_PARAMETER;
542 if (provider->provider_id != NULL)
544 *provider_id = strdup(provider->provider_id);
545 if (*provider_id == NULL)
547 return DATACONTROL_ERROR_OUT_OF_MEMORY;
559 datacontrol_sql_set_data_id(datacontrol_h provider, const char *data_id)
561 if (provider == NULL || data_id == NULL)
563 return DATACONTROL_ERROR_INVALID_PARAMETER;
566 if (provider->data_id != NULL)
568 free(provider->data_id);
571 provider->data_id = strdup(data_id);
572 if (provider->data_id == NULL)
574 return DATACONTROL_ERROR_OUT_OF_MEMORY;
581 datacontrol_sql_get_data_id(datacontrol_h provider, char **data_id)
583 if (provider == NULL || data_id == NULL)
585 return DATACONTROL_ERROR_INVALID_PARAMETER;
588 if (provider->data_id != NULL)
590 *data_id = strdup(provider->data_id);
591 if (*data_id == NULL)
593 return DATACONTROL_ERROR_OUT_OF_MEMORY;
604 datacontrol_sql_register_response_cb(datacontrol_h provider, datacontrol_sql_response_cb* callback, void *user_data)
610 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &app_id, &access);
611 if (ret != PMINFO_R_OK)
613 LOGE("unable to get sql data control information: %d", ret);
614 return DATACONTROL_ERROR_IO_ERROR;
617 SECURE_LOGI("data control provider appid = %s", app_id);
619 sql_response_cb_s *sql_dc_temp = (sql_response_cb_s *)calloc(sizeof(sql_response_cb_s),1);
622 LOGE("unable to create a temporary sql data control");
623 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
627 sql_dc_temp->provider_id = strdup(provider->provider_id);
628 if (!sql_dc_temp->provider_id)
630 LOGE("unable to assign provider_id to sql data control: %d", errno);
631 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
635 sql_dc_temp->data_id = strdup(provider->data_id);
636 if (!sql_dc_temp->data_id)
638 LOGE("unable to assign data_id to sql data control: %d", errno);
639 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
643 sql_dc_temp->app_id = app_id;
644 sql_dc_temp->access_info = access;
645 sql_dc_temp->user_data = user_data;
646 sql_dc_temp->sql_response_cb = callback;
648 void *sql_dc_returned = NULL;
649 sql_dc_returned = tsearch(sql_dc_temp, &datacontrol_sql_tree_root, datacontrol_sql_instance_compare);
651 sql_response_cb_s *sql_dc = *(sql_response_cb_s **)sql_dc_returned;
652 if (sql_dc != sql_dc_temp)
654 sql_dc->sql_response_cb = callback;
655 sql_dc->user_data = user_data;
656 LOGI("the data control is already set");
657 datacontrol_sql_instance_free(sql_dc_temp);
660 return DATACONTROL_ERROR_NONE;
669 if (sql_dc_temp->provider_id)
670 free(sql_dc_temp->provider_id);
671 if (sql_dc_temp->data_id)
672 free(sql_dc_temp->data_id);
680 datacontrol_sql_unregister_response_cb(datacontrol_h provider)
682 int ret = DATACONTROL_ERROR_NONE;
684 sql_response_cb_s *sql_dc_temp = (sql_response_cb_s *)calloc(sizeof(sql_response_cb_s),1);
688 LOGE("unable to create a temporary sql data control");
689 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
693 sql_dc_temp->provider_id = strdup(provider->provider_id);
694 if (!sql_dc_temp->provider_id)
696 LOGE("unable to assign provider_id to sql data control: %d", errno);
697 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
702 void *sql_dc_returned = NULL;
704 sql_dc_returned = tdelete(sql_dc_temp, &datacontrol_sql_tree_root, datacontrol_sql_instance_compare);
705 if (sql_dc_returned == NULL)
707 LOGE("invalid parameter");
708 ret = DATACONTROL_ERROR_INVALID_PARAMETER;
716 if (sql_dc_temp->provider_id)
717 free(sql_dc_temp->provider_id);
726 bundle_foreach_check_arg_size_cb(const char *key, const int type, const bundle_keyval_t *kv, void *arg_size)
729 size_t value_len = 0;
730 bundle_keyval_get_basic_val((bundle_keyval_t*)kv, (void**)&value, &value_len);
732 arg_size += (strlen(key) + value_len) * sizeof(wchar_t);
737 bundle_foreach_cb(const char *key, const int type, const bundle_keyval_t *kv, void *user_data)
739 if (!key || !kv || !user_data)
744 int fd = *(int *)user_data;
746 int key_len = strlen(key);
748 size_t value_len = 0;
749 bundle_keyval_get_basic_val((bundle_keyval_t*)kv, (void**)&value, &value_len);
752 if (write(fd, &key_len, sizeof(int)) == -1)
754 LOGE("Writing a key_len to a file descriptor is failed. errno = %d", errno);
756 if (write(fd, key, key_len) == -1)
758 LOGE("Writing a key to a file descriptor is failed. errno = %d", errno);
761 if (write(fd, &value_len, sizeof(int)) == -1)
763 LOGE("Writing a value_len to a file descriptor is failed. errno = %d", errno);
765 if (write(fd, value, value_len) == -1)
767 LOGE("Writing a value to a file descriptor is failed. errno = %d", errno);
774 __get_provider_pkgid(char* provider_id)
777 char *pkgid_dup = NULL;
778 char *provider_appid = NULL;
779 char *provider_pkgid = NULL;
780 pkgmgrinfo_appinfo_h app_info_handle = NULL;
782 int ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider_id, "Sql", &provider_appid, &access);
783 if (ret != PMINFO_R_OK)
785 LOGE("unable to get sql data control information: %d", ret);
788 if (provider_appid == NULL) {
789 LOGE("provider_appid is NULL");
795 if (pkgmgrinfo_appinfo_get_appinfo(provider_appid, &app_info_handle) != PMINFO_R_OK) {
796 SECURE_LOGE("unable to get appinfo of provider_appid: %s", provider_appid);
798 if (pkgmgrinfo_appinfo_get_pkgname(app_info_handle, &provider_pkgid) != PMINFO_R_OK) {
799 SECURE_LOGE("unable to get pkgname of provider_appid: %s", provider_appid);
801 SECURE_LOGI("provider pkg id : %s", provider_pkgid);
802 pkgid_dup = strdup(provider_pkgid);
803 if (pkgid_dup == NULL)
804 SECURE_LOGE("OOM error");
806 pkgmgrinfo_appinfo_destroy_appinfo(app_info_handle);
811 free(provider_appid);
816 datacontrol_sql_insert(datacontrol_h provider, const bundle* insert_data, int *request_id)
820 char *provider_appid = NULL;
822 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || insert_data == NULL)
824 LOGE("Invalid parameter");
825 return DATACONTROL_ERROR_INVALID_PARAMETER;
828 SECURE_LOGI("SQL data control, insert to provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
830 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
831 if (ret != PMINFO_R_OK)
833 LOGE("unable to get sql data control information: %d", ret);
834 return DATACONTROL_ERROR_IO_ERROR;
837 free(provider_appid);
839 if (NULL != access && !strcmp(access, READ_ONLY)) {
840 LOGE("Provider has given [%s] permission only", access);
842 return DATACONTROL_ERROR_PERMISSION_DENIED;
847 char caller_app_id[256] = {0, };
848 pid_t pid = getpid();
850 if (aul_app_get_appid_bypid(pid, caller_app_id, sizeof(caller_app_id)) != 0)
852 SECURE_LOGE("Failed to get appid by pid(%d).", pid);
853 return DATACONTROL_ERROR_INVALID_PARAMETER;
856 // Check size of arguments
857 long long arg_size = 0;
858 bundle_foreach((bundle*)insert_data, bundle_foreach_check_arg_size_cb, &arg_size);
859 arg_size += strlen(provider->data_id) * sizeof(wchar_t);
860 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE)
862 LOGE("The size of the request argument exceeds the limit, 1M.");
863 return DATACONTROL_ERROR_MAX_EXCEEDED;
866 int reqId = _datacontrol_create_request_id();
867 SECURE_LOGI("request id: %d", reqId);
868 char insert_map_file[REQUEST_PATH_MAX] = {0, };
869 ret = snprintf(insert_map_file, REQUEST_PATH_MAX, "%s%s%d", DATACONTROL_REQUEST_FILE_PREFIX, caller_app_id, reqId);
872 LOGE("unable to write formatted output to insert_map_file: %d", errno);
873 return DATACONTROL_ERROR_IO_ERROR;
876 SECURE_LOGI("insert_map_file : %s", insert_map_file);
879 char *provider_pkgid = __get_provider_pkgid(provider->provider_id);
880 if (provider_pkgid == NULL) {
881 LOGE("Unable to get the provider pkgid");
882 return DATACONTROL_ERROR_IO_ERROR;
885 ret = security_server_shared_file_open(insert_map_file, provider_pkgid, &fd);
886 if (ret == SECURITY_SERVER_API_ERROR_FILE_EXIST) {
887 SECURE_LOGE("The file(%s) already exist, delete and retry to open", insert_map_file);
888 int ret_temp = security_server_shared_file_delete(insert_map_file);
889 if (ret_temp != SECURITY_SERVER_API_SUCCESS) {
890 SECURE_LOGE("Delete the file(%s) is failed : %d", insert_map_file, ret_temp);
892 ret = security_server_shared_file_open(insert_map_file, provider_pkgid, &fd);
896 if (ret != SECURITY_SERVER_API_SUCCESS)
898 SECURE_LOGE("unable to open insert_map_file: %d", ret);
899 free(provider_pkgid);
900 return DATACONTROL_ERROR_IO_ERROR;
903 free(provider_pkgid);
905 int count = bundle_get_count((bundle*)insert_data);
906 SECURE_LOGI("Insert column counts: %d", count);
908 bundle_foreach((bundle*)insert_data, bundle_foreach_cb, &fd);
913 bundle *b = bundle_create();
916 LOGE("unable to create bundle: %d", errno);
917 return DATACONTROL_ERROR_IO_ERROR;
920 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
921 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
923 char insert_column_count[MAX_LEN_DATACONTROL_COLUMN_COUNT] = {0, };
924 ret = snprintf(insert_column_count, MAX_LEN_DATACONTROL_COLUMN_COUNT, "%d", count);
927 LOGE("unable to convert insert column count to string: %d", errno);
929 return DATACONTROL_ERROR_IO_ERROR;
932 const char* arg_list[3];
933 arg_list[0] = provider->data_id;
934 arg_list[1] = insert_column_count;
935 arg_list[2] = insert_map_file;
937 bundle_add_str_array(b, OSP_K_ARG, arg_list, 3);
939 // Set the request id
942 ret = datacontrol_sql_request_provider(provider, DATACONTROL_TYPE_SQL_INSERT, b, reqId);
943 if (ret != DATACONTROL_ERROR_NONE)
945 ret = security_server_shared_file_delete(insert_map_file);
946 if (ret != SECURITY_SERVER_API_SUCCESS)
948 SECURE_LOGE("unable to remove the insert_map_file: %d", ret);
956 datacontrol_sql_delete(datacontrol_h provider, const char *where, int *request_id)
960 char *provider_appid = NULL;
962 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL)
964 LOGE("Invalid parameter");
965 return DATACONTROL_ERROR_INVALID_PARAMETER;
968 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
969 if (ret != PMINFO_R_OK)
971 LOGE("unable to get sql data control information: %d", ret);
972 return DATACONTROL_ERROR_IO_ERROR;
975 free(provider_appid);
977 if (NULL != access && !strcmp(access, READ_ONLY)) {
978 LOGE("Provider has given [%s] permission only", access);
980 return DATACONTROL_ERROR_PERMISSION_DENIED;
985 bundle *b = bundle_create();
988 LOGE("unable to create bundle: %d", errno);
989 return DATACONTROL_ERROR_IO_ERROR;
992 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
993 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
995 const char* arg_list[2];
996 arg_list[0] = provider->data_id;
1000 arg_list[1] = where;
1004 arg_list[1] = DATACONTROL_EMPTY;
1007 bundle_add_str_array(b, OSP_K_ARG, arg_list, 2);
1009 // Set the request id
1010 int reqId = _datacontrol_create_request_id();
1011 *request_id = reqId;
1013 ret = datacontrol_sql_request_provider(provider, DATACONTROL_TYPE_SQL_DELETE, b, reqId);
1019 datacontrol_sql_select(datacontrol_h provider, char **column_list, int column_count, const char *where, const char *order, int *request_id)
1021 return datacontrol_sql_select_with_page(provider, column_list, column_count, where, order, 1, 20, request_id);
1025 datacontrol_sql_select_with_page(datacontrol_h provider, char **column_list, int column_count, const char *where, const char *order, int page_number, int count_per_page, int *request_id)
1028 char* access = NULL;
1029 char *provider_appid = NULL;
1031 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || page_number <= 0 || count_per_page <= 0)
1033 LOGE("Invalid parameter");
1034 return DATACONTROL_ERROR_INVALID_PARAMETER;
1037 SECURE_LOGI("SQL data control, select to provider_id: %s, data_id: %s, col_count: %d, where: %s, order: %s, page_number: %d, per_page: %d", provider->provider_id, provider->data_id, column_count, where, order, page_number, count_per_page);
1039 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
1040 if (ret != PMINFO_R_OK)
1042 LOGE("unable to get sql data control information: %d", ret);
1043 return DATACONTROL_ERROR_IO_ERROR;
1046 free(provider_appid);
1048 if (NULL != access && !strcmp(access, WRITE_ONLY)) {
1049 LOGE("Provider has given [%s] permission only", access);
1051 return DATACONTROL_ERROR_PERMISSION_DENIED;
1056 if (count_per_page > MAX_ROW_COUNT)
1058 LOGE("Exceeds max row count per page.");
1059 return DATACONTROL_ERROR_INVALID_PARAMETER;
1062 LOGI("SQL data control, select to provider_id: %s, data_id: %s, col_count: %d, where: %s, order: %s, page_number: %d, per_page: %d", provider->provider_id, provider->data_id, column_count, where, order, page_number, count_per_page);
1064 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
1065 if (ret != PMINFO_R_OK)
1067 LOGE("unable to get sql data control information: %d", ret);
1068 return DATACONTROL_ERROR_IO_ERROR;
1071 free(provider_appid);
1073 if (NULL != access && !strcmp(access, WRITE_ONLY)) {
1074 LOGE("Provider has given [%s] permission only", access);
1076 return DATACONTROL_ERROR_PERMISSION_DENIED;
1081 if (column_list == NULL)
1083 LOGE("Invalid parameter");
1084 return DATACONTROL_ERROR_INVALID_PARAMETER;
1087 int total_arg_count = -1;
1089 bundle *b = bundle_create();
1092 LOGE("unable to create bundle: %d", errno);
1093 return DATACONTROL_ERROR_IO_ERROR;
1096 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
1097 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
1099 char page[32] = {0, };
1100 ret = snprintf(page, 32, "%d", page_number);
1103 LOGE("unable to convert page no to string: %d", errno);
1105 return DATACONTROL_ERROR_IO_ERROR;
1108 char count_per_page_no[32] = {0, };
1109 ret = snprintf(count_per_page_no, 32, "%d", count_per_page);
1112 LOGE("unable to convert count per page no to string: %d", errno);
1114 return DATACONTROL_ERROR_IO_ERROR;
1117 total_arg_count = column_count + DATACONTROL_SELECT_EXTRA_COUNT;
1118 const char** arg_list = (const char**)malloc(total_arg_count * (sizeof(char *)));
1119 if(arg_list == NULL) {
1122 return DATACONTROL_ERROR_OUT_OF_MEMORY;
1125 SECURE_LOGI("total arg count %d", total_arg_count);
1127 arg_list[0] = provider->data_id; // arg[0]: data ID
1130 char select_column_count[MAX_LEN_DATACONTROL_COLUMN_COUNT] = {0, };
1131 ret = snprintf(select_column_count, MAX_LEN_DATACONTROL_COLUMN_COUNT, "%d", column_count);
1134 LOGE("unable to convert select col count to string: %d", errno);
1137 return DATACONTROL_ERROR_IO_ERROR;
1140 arg_list[i] = select_column_count; // arg[1]: selected column count
1144 while (select_col < column_count)
1146 arg_list[i++] = column_list[select_col++];
1149 if (where) // arg: where clause
1151 arg_list[i++] = where;
1155 arg_list[i++] = DATACONTROL_EMPTY;
1158 if (order) // arg: order clause
1160 arg_list[i++] = order;
1164 arg_list[i++] = DATACONTROL_EMPTY;
1168 arg_list[i++] = page; // arg: page number
1170 arg_list[i] = count_per_page_no; // arg: count per page
1172 bundle_add_str_array(b, OSP_K_ARG, arg_list, total_arg_count);
1175 int reqId = _datacontrol_create_request_id();
1176 *request_id = reqId;
1178 ret = datacontrol_sql_request_provider(provider, DATACONTROL_TYPE_SQL_SELECT, b, reqId);
1185 datacontrol_sql_update(datacontrol_h provider, const bundle* update_data, const char *where, int *request_id)
1188 char* access = NULL;
1189 char *provider_appid = NULL;
1191 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || update_data == NULL || where == NULL)
1193 LOGE("Invalid parameter");
1194 return DATACONTROL_ERROR_INVALID_PARAMETER;
1197 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
1198 if (ret != PMINFO_R_OK)
1200 LOGE("unable to get sql data control information: %d", ret);
1201 return DATACONTROL_ERROR_IO_ERROR;
1204 free(provider_appid);
1206 if (NULL != access && !strcmp(access, READ_ONLY)) {
1207 LOGE("Provider has given [%s] permission only", access);
1209 return DATACONTROL_ERROR_PERMISSION_DENIED;
1214 char caller_app_id[256] = {0, };
1215 pid_t pid = getpid();
1217 if (aul_app_get_appid_bypid(pid, caller_app_id, sizeof(caller_app_id)) != 0)
1219 SECURE_LOGE("Failed to get appid by pid(%d).", pid);
1220 return DATACONTROL_ERROR_INVALID_PARAMETER;
1223 // Check size of arguments
1224 long long arg_size = 0;
1225 bundle_foreach((bundle*)update_data, bundle_foreach_check_arg_size_cb, &arg_size);
1226 arg_size += strlen(provider->data_id) * sizeof(wchar_t);
1227 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE)
1229 LOGE("The size of the request argument exceeds the limit, 1M.");
1230 return DATACONTROL_ERROR_MAX_EXCEEDED;
1233 int reqId = _datacontrol_create_request_id();
1235 char update_map_file[REQUEST_PATH_MAX] = {0, };
1236 ret = snprintf(update_map_file, REQUEST_PATH_MAX, "%s%s%d", DATACONTROL_REQUEST_FILE_PREFIX, caller_app_id, reqId);
1239 LOGE("unable to write formatted output to update_map_file: %d", errno);
1240 return DATACONTROL_ERROR_IO_ERROR;
1243 SECURE_LOGI("update_map_file : %s", update_map_file);
1246 char *provider_pkgid = __get_provider_pkgid(provider->provider_id);
1247 if (provider_pkgid == NULL) {
1248 LOGE("Unable to get the provider pkgid");
1249 return DATACONTROL_ERROR_IO_ERROR;
1252 ret = security_server_shared_file_open(update_map_file, provider_pkgid, &fd);
1253 if (ret == SECURITY_SERVER_API_ERROR_FILE_EXIST) {
1254 SECURE_LOGE("The file(%s) already exist, delete and retry to open", update_map_file);
1255 int ret_temp = security_server_shared_file_delete(update_map_file);
1256 if (ret_temp != SECURITY_SERVER_API_SUCCESS) {
1257 SECURE_LOGE("Delete the file(%s) is failed : %d", update_map_file, ret_temp);
1259 ret = security_server_shared_file_open(update_map_file, provider_pkgid, &fd);
1263 if (ret != SECURITY_SERVER_API_SUCCESS)
1265 SECURE_LOGE("unable to open update_map file: %d", ret);
1266 free(provider_pkgid);
1267 return DATACONTROL_ERROR_IO_ERROR;
1270 free(provider_pkgid);
1272 int count = bundle_get_count((bundle*)update_data);
1273 bundle_foreach((bundle*)update_data, bundle_foreach_cb, &fd);
1278 bundle *b = bundle_create();
1281 LOGE("unable to create bundle: %d", errno);
1282 return DATACONTROL_ERROR_IO_ERROR;
1285 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
1286 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
1288 char update_column_count[MAX_LEN_DATACONTROL_COLUMN_COUNT] = {0, };
1289 ret = snprintf(update_column_count, MAX_LEN_DATACONTROL_COLUMN_COUNT, "%d", count);
1292 LOGE("unable to convert update col count to string: %d", errno);
1294 return DATACONTROL_ERROR_IO_ERROR;
1297 const char* arg_list[4];
1298 arg_list[0] = provider->data_id; // list(0): data ID
1299 arg_list[1] = update_column_count;
1300 arg_list[2] = update_map_file;
1301 arg_list[3] = where;
1303 bundle_add_str_array(b, OSP_K_ARG, arg_list, 4);
1305 *request_id = reqId;
1307 ret = datacontrol_sql_request_provider(provider, DATACONTROL_TYPE_SQL_UPDATE, b, reqId);
1308 if (ret != DATACONTROL_ERROR_NONE)
1310 ret = security_server_shared_file_delete(update_map_file);
1311 if (ret != SECURITY_SERVER_API_SUCCESS)
1313 SECURE_LOGE("unable to remove the update_map file: %d", ret);