11 #include <appsvc/appsvc.h>
14 #include <pkgmgr-info.h>
15 #include <security-server.h>
17 #include "data-control-sql.h"
18 #include "data-control-internal.h"
20 #define REQUEST_PATH_MAX 512
21 #define MAX_REQUEST_ARGUMENT_SIZE 1048576 // 1MB
22 #define MAX_ROW_COUNT 1024
24 struct datacontrol_s {
36 datacontrol_sql_response_cb *sql_response_cb;
40 static void *datacontrol_sql_tree_root = NULL;
43 datacontrol_sql_call_cb(const char *provider_id, int request_id, datacontrol_request_type type
44 , const char *data_id, bool provider_result, const char *error, long long insert_rowid, resultset_cursor* cursor, void* data)
46 SECURE_LOGI("datacontrol_sql_call_cb, dataID: %s", data_id);
48 datacontrol_sql_response_cb *callback = NULL;
50 sql_response_cb_s *sql_dc = NULL;
51 sql_dc = (sql_response_cb_s *)data;
52 callback = sql_dc->sql_response_cb;
55 LOGE("no listener set");
59 datacontrol_h provider;
60 datacontrol_sql_create(&provider);
62 datacontrol_sql_set_provider_id(provider, provider_id);
63 datacontrol_sql_set_data_id(provider, data_id);
67 case DATACONTROL_TYPE_SQL_SELECT:
70 if (callback != NULL && callback->select != NULL)
72 callback->select(request_id, provider, cursor, provider_result, error, sql_dc->user_data);
76 LOGI("No registered callback function");
81 case DATACONTROL_TYPE_SQL_INSERT:
83 SECURE_LOGI("INSERT row_id: %lld", insert_rowid);
84 if (callback != NULL && callback->insert != NULL)
86 callback->insert(request_id, provider, insert_rowid, provider_result, error, sql_dc->user_data);
90 LOGI("No registered callback function");
95 case DATACONTROL_TYPE_SQL_UPDATE:
98 if (callback != NULL && callback->update != NULL)
100 callback->update(request_id, provider, provider_result, error, sql_dc->user_data);
104 LOGI("No registered callback function");
109 case DATACONTROL_TYPE_SQL_DELETE:
112 if (callback != NULL && callback->delete != NULL)
114 callback->delete(request_id, provider, provider_result, error, sql_dc->user_data);
118 LOGI("No registered callback function");
126 datacontrol_sql_destroy(provider);
130 datacontrol_sql_instance_free(void *datacontrol_sql_instance)
132 sql_response_cb_s *dc = (sql_response_cb_s *)datacontrol_sql_instance;
135 free(dc->provider_id);
138 free(dc->access_info);
139 free(datacontrol_sql_instance);
146 datacontrol_sql_instance_compare(const void *l_datacontrol_sql_instance, const void *r_datacontrol_sql_instance)
148 sql_response_cb_s *dc_left = (sql_response_cb_s *)l_datacontrol_sql_instance;
149 sql_response_cb_s *dc_right = (sql_response_cb_s *)r_datacontrol_sql_instance;
150 return strcmp(dc_left->provider_id, dc_right->provider_id);
155 datacontrol_sql_handle_cb(bundle* b, int request_code, appsvc_result_val res, void* data)
157 SECURE_LOGI("datacontrol_sql_handle_cb, request_code: %d, result: %d", request_code, res);
160 const char** result_list = NULL;
161 resultset_cursor *cursor = NULL;
162 const char* provider_id = NULL;
163 const char* data_id = NULL;
164 const char* error_message = NULL;
165 long long insert_rowid = -1;
166 datacontrol_request_type request_type = 0;
168 int result_list_len = 0;
169 int provider_result = 0;
170 const char* resultset_path = NULL;
171 const char* p = NULL;
175 p = appsvc_get_data(b, OSP_K_REQUEST_ID);
178 LOGE("Invalid Bundle: request_id is null");
179 return DATACONTROL_ERROR_INVALID_PARAMETER;
183 request_id = atoi(p);
186 SECURE_LOGI("Request ID: %d", request_id);
189 result_list = appsvc_get_data_array(b, OSP_K_ARG, &result_list_len);
192 LOGE("Invalid Bundle: arguement list is null");
193 return DATACONTROL_ERROR_INVALID_PARAMETER;
196 p = result_list[0]; // result list[0] = provider_result
199 LOGE("Invalid Bundle: provider_result is null");
200 return DATACONTROL_ERROR_INVALID_PARAMETER;
203 LOGI("Provider result: %s", p);
205 provider_result = atoi(p);
207 error_message = result_list[1]; // result list[1] = error
210 LOGE("Invalid Bundle: error_message is null");
211 return DATACONTROL_ERROR_INVALID_PARAMETER;
214 LOGI("Error message: %s", error_message);
216 p = appsvc_get_data(b, OSP_K_DATACONTROL_REQUEST_TYPE);
219 LOGE("Invalid Bundle: data-control request type is null");
220 return DATACONTROL_ERROR_INVALID_PARAMETER;
223 request_type = (datacontrol_request_type)atoi(p);
225 provider_id = appsvc_get_data(b, OSP_K_DATACONTROL_PROVIDER);
228 LOGE("Invalid Bundle: provider_id is null");
229 return DATACONTROL_ERROR_INVALID_PARAMETER;
232 data_id = appsvc_get_data(b, OSP_K_DATACONTROL_DATA);
235 LOGE("Invalid Bundle: data_id is null");
236 return DATACONTROL_ERROR_INVALID_PARAMETER;
239 SECURE_LOGI("Provider ID: %s, Data ID: %s, Operation type: %d", provider_id, data_id, request_type);
241 switch (request_type)
243 case DATACONTROL_TYPE_SQL_SELECT:
245 LOGI("SELECT RESPONSE");
248 resultset_path = result_list[2]; // result list[2]
251 LOGE("sql query result path is null");
252 return DATACONTROL_ERROR_INVALID_PARAMETER;
255 SECURE_LOGI("resultset_path: %s", resultset_path);
257 if (strcmp(resultset_path, "NoResultSet") != 0) // Result set exists
259 cursor = datacontrol_sql_get_cursor(resultset_path);
262 LOGE("failed to get cursor on sql query resultset");
263 return DATACONTROL_ERROR_INVALID_PARAMETER;
269 case DATACONTROL_TYPE_SQL_INSERT:
271 LOGI("INSERT RESPONSE");
274 p = result_list[2]; // result list[2]
277 LOGE("Invalid Bundle: insert row_id is null");
278 return DATACONTROL_ERROR_INVALID_PARAMETER;
281 insert_rowid = atoll(p);
285 case DATACONTROL_TYPE_SQL_UPDATE:
286 case DATACONTROL_TYPE_SQL_DELETE:
288 LOGI("UPDATE or DELETE RESPONSE");
299 LOGE("the bundle returned from datacontrol-provider-service is null");
300 return DATACONTROL_ERROR_INVALID_PARAMETER;
303 if (request_type >= DATACONTROL_TYPE_SQL_SELECT && request_type <= DATACONTROL_TYPE_SQL_DELETE)
305 datacontrol_sql_call_cb(provider_id, request_id, request_type, data_id, provider_result, error_message, insert_rowid, cursor, data);
306 if ((request_type == DATACONTROL_TYPE_SQL_SELECT) && (cursor))
308 datacontrol_sql_remove_cursor(cursor);
311 ret = DATACONTROL_ERROR_NONE;
315 ret = DATACONTROL_ERROR_INVALID_PARAMETER;
322 app_svc_res_cb_sql(bundle* b, int request_code, appsvc_result_val res, void* data)
324 LOGI("app_svc_res_cb_sql, request_code: %d, result: %d", request_code, res);
328 datacontrol_sql_handle_cb(b, request_code, res, data);
332 LOGE("error: listener information is null");
338 datacontrol_sql_request_provider(datacontrol_h provider, datacontrol_request_type type, bundle *arg_list, int request_id)
340 SECURE_LOGI("SQL Data control request, type: %d, request id: %d", type, request_id);
345 if ((int)type <= (int)DATACONTROL_TYPE_SQL_DELETE)
347 if ((int)type < (int)DATACONTROL_TYPE_SQL_SELECT)
349 LOGE("invalid request type: %d", (int)type);
350 return DATACONTROL_ERROR_INVALID_PARAMETER;
353 if (!datacontrol_sql_tree_root)
355 LOGE("the listener tree is empty");
356 return DATACONTROL_ERROR_INVALID_PARAMETER;
359 sql_response_cb_s *sql_dc_temp = (sql_response_cb_s *)calloc(sizeof(sql_response_cb_s),1);
362 LOGE("failed to create sql datacontrol");
363 return DATACONTROL_ERROR_OUT_OF_MEMORY;
366 sql_dc_temp->provider_id = strdup(provider->provider_id);
367 if (!sql_dc_temp->provider_id)
369 LOGE("failed to assign provider id to sql data control: %d", errno);
371 return DATACONTROL_ERROR_OUT_OF_MEMORY;
374 sql_dc_temp->data_id = strdup(provider->data_id);
375 if (!sql_dc_temp->data_id)
377 LOGE("failed to assign data id to sql data control: %d", errno);
378 free(sql_dc_temp->provider_id);
380 return DATACONTROL_ERROR_OUT_OF_MEMORY;
383 sql_dc_temp->app_id = NULL;
384 sql_dc_temp->access_info = NULL;
385 sql_dc_temp->user_data = NULL;
386 sql_dc_temp->sql_response_cb = NULL;
388 void *sql_dc_returned = NULL;
389 sql_dc_returned = tfind(sql_dc_temp, &datacontrol_sql_tree_root, datacontrol_sql_instance_compare);
391 datacontrol_sql_instance_free(sql_dc_temp);
393 if (!sql_dc_returned)
395 LOGE("sql datacontrol returned after tfind is null");
396 return DATACONTROL_ERROR_IO_ERROR;
399 sql_response_cb_s *sql_dc = *(sql_response_cb_s **)sql_dc_returned;
400 app_id = sql_dc->app_id;
403 SECURE_LOGI("SQL datacontrol appid: %s", sql_dc->app_id);
406 char caller_app_id[255];
407 pid_t pid = getpid();
408 if (aul_app_get_appid_bypid(pid, caller_app_id, sizeof(caller_app_id)) != 0)
410 SECURE_LOGE("Failed to get appid by pid(%d).", pid);
411 return DATACONTROL_ERROR_INVALID_PARAMETER;
414 appsvc_set_operation(arg_list, APPSVC_OPERATION_DEFAULT);
415 appsvc_set_appid(arg_list, app_id);
416 bundle_add_str(arg_list, OSP_K_CALLER_TYPE, OSP_V_CALLER_TYPE_OSP);
417 bundle_add_str(arg_list, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_DATACONTROL);
418 bundle_add_str(arg_list, OSP_K_DATACONTROL_PROTOCOL_VERSION, OSP_V_VERSION_2_1_0_3);
419 bundle_add_str(arg_list, AUL_K_CALLER_APPID, caller_app_id);
420 bundle_add_str(arg_list, AUL_K_NO_CANCEL, "1");
423 char datacontrol_request_operation[MAX_LEN_DATACONTROL_REQ_TYPE] = {0, };
424 snprintf(datacontrol_request_operation, MAX_LEN_DATACONTROL_REQ_TYPE, "%d", (int)(type));
425 bundle_add_str(arg_list, OSP_K_DATACONTROL_REQUEST_TYPE, datacontrol_request_operation);
427 char req_id[32] = {0, };
428 snprintf(req_id, 32, "%d", request_id);
429 bundle_add_str(arg_list, OSP_K_REQUEST_ID, req_id);
431 // For DataControl CAPI
432 bundle_add_str(arg_list, AUL_K_DATA_CONTROL_TYPE, "CORE");
434 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);
438 const int TRY_COUNT = 4;
439 const int TRY_SLEEP_TIME = 65000;
442 pid = appsvc_run_service(arg_list, request_id, app_svc_res_cb_sql, data);
445 SECURE_LOGI("Launch the provider app successfully: %d", pid);
446 return DATACONTROL_ERROR_NONE;
448 else if (pid == APPSVC_RET_EINVAL)
450 SECURE_LOGE("not able to launch service: %d", pid);
451 return DATACONTROL_ERROR_INVALID_PARAMETER;
456 usleep(TRY_SLEEP_TIME);
458 while (count < TRY_COUNT);
460 SECURE_LOGE("unable to launch service: %d", pid);
461 return DATACONTROL_ERROR_IO_ERROR;
465 datacontrol_sql_create(datacontrol_h *provider)
467 struct datacontrol_s *request;
469 if (provider == NULL)
471 return DATACONTROL_ERROR_INVALID_PARAMETER;
474 request = malloc(sizeof(struct datacontrol_s));
477 return DATACONTROL_ERROR_OUT_OF_MEMORY;
480 request->provider_id = NULL;
481 request->data_id = NULL;
489 datacontrol_sql_destroy(datacontrol_h provider)
491 if (provider == NULL)
493 return DATACONTROL_ERROR_INVALID_PARAMETER;
496 if (provider->provider_id != NULL)
498 free(provider->provider_id);
501 if (provider->data_id != NULL)
503 free(provider->data_id);
511 datacontrol_sql_set_provider_id(datacontrol_h provider, const char *provider_id)
513 if (provider == NULL || provider_id == NULL)
515 return DATACONTROL_ERROR_INVALID_PARAMETER;
518 if (provider->provider_id != NULL)
520 free(provider->provider_id);
523 provider->provider_id = strdup(provider_id);
524 if (provider->provider_id == NULL)
526 return DATACONTROL_ERROR_OUT_OF_MEMORY;
533 datacontrol_sql_get_provider_id(datacontrol_h provider, char **provider_id)
535 if (provider == NULL || provider_id == NULL)
537 return DATACONTROL_ERROR_INVALID_PARAMETER;
540 if (provider->provider_id != NULL)
542 *provider_id = strdup(provider->provider_id);
543 if (*provider_id == NULL)
545 return DATACONTROL_ERROR_OUT_OF_MEMORY;
557 datacontrol_sql_set_data_id(datacontrol_h provider, const char *data_id)
559 if (provider == NULL || data_id == NULL)
561 return DATACONTROL_ERROR_INVALID_PARAMETER;
564 if (provider->data_id != NULL)
566 free(provider->data_id);
569 provider->data_id = strdup(data_id);
570 if (provider->data_id == NULL)
572 return DATACONTROL_ERROR_OUT_OF_MEMORY;
579 datacontrol_sql_get_data_id(datacontrol_h provider, char **data_id)
581 if (provider == NULL || data_id == NULL)
583 return DATACONTROL_ERROR_INVALID_PARAMETER;
586 if (provider->data_id != NULL)
588 *data_id = strdup(provider->data_id);
589 if (*data_id == NULL)
591 return DATACONTROL_ERROR_OUT_OF_MEMORY;
602 datacontrol_sql_register_response_cb(datacontrol_h provider, datacontrol_sql_response_cb* callback, void *user_data)
608 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &app_id, &access);
609 if (ret != PMINFO_R_OK)
611 LOGE("unable to get sql data control information: %d", ret);
612 return DATACONTROL_ERROR_IO_ERROR;
615 SECURE_LOGI("data control provider appid = %s", app_id);
617 sql_response_cb_s *sql_dc_temp = (sql_response_cb_s *)calloc(sizeof(sql_response_cb_s),1);
620 LOGE("unable to create a temporary sql data control");
621 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
625 sql_dc_temp->provider_id = strdup(provider->provider_id);
626 if (!sql_dc_temp->provider_id)
628 LOGE("unable to assign provider_id to sql data control: %d", errno);
629 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
633 sql_dc_temp->data_id = strdup(provider->data_id);
634 if (!sql_dc_temp->data_id)
636 LOGE("unable to assign data_id to sql data control: %d", errno);
637 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
641 sql_dc_temp->app_id = app_id;
642 sql_dc_temp->access_info = access;
643 sql_dc_temp->user_data = user_data;
644 sql_dc_temp->sql_response_cb = callback;
646 void *sql_dc_returned = NULL;
647 sql_dc_returned = tsearch(sql_dc_temp, &datacontrol_sql_tree_root, datacontrol_sql_instance_compare);
649 sql_response_cb_s *sql_dc = *(sql_response_cb_s **)sql_dc_returned;
650 if (sql_dc != sql_dc_temp)
652 sql_dc->sql_response_cb = callback;
653 sql_dc->user_data = user_data;
654 LOGI("the data control is already set");
655 datacontrol_sql_instance_free(sql_dc_temp);
658 return DATACONTROL_ERROR_NONE;
667 if (sql_dc_temp->provider_id)
668 free(sql_dc_temp->provider_id);
669 if (sql_dc_temp->data_id)
670 free(sql_dc_temp->data_id);
678 datacontrol_sql_unregister_response_cb(datacontrol_h provider)
680 int ret = DATACONTROL_ERROR_NONE;
682 sql_response_cb_s *sql_dc_temp = (sql_response_cb_s *)calloc(sizeof(sql_response_cb_s),1);
686 LOGE("unable to create a temporary sql data control");
687 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
691 sql_dc_temp->provider_id = strdup(provider->provider_id);
692 if (!sql_dc_temp->provider_id)
694 LOGE("unable to assign provider_id to sql data control: %d", errno);
695 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
700 void *sql_dc_returned = NULL;
702 sql_dc_returned = tdelete(sql_dc_temp, &datacontrol_sql_tree_root, datacontrol_sql_instance_compare);
703 if (sql_dc_returned == NULL)
705 LOGE("invalid parameter");
706 ret = DATACONTROL_ERROR_INVALID_PARAMETER;
714 if (sql_dc_temp->provider_id)
715 free(sql_dc_temp->provider_id);
724 bundle_foreach_check_arg_size_cb(const char *key, const int type, const bundle_keyval_t *kv, void *arg_size)
727 size_t value_len = 0;
728 bundle_keyval_get_basic_val((bundle_keyval_t*)kv, (void**)&value, &value_len);
730 arg_size += (strlen(key) + value_len) * sizeof(wchar_t);
735 bundle_foreach_cb(const char *key, const int type, const bundle_keyval_t *kv, void *user_data)
737 if (!key || !kv || !user_data)
742 int fd = *(int *)user_data;
744 int key_len = strlen(key);
746 size_t value_len = 0;
747 bundle_keyval_get_basic_val((bundle_keyval_t*)kv, (void**)&value, &value_len);
750 if (write(fd, &key_len, sizeof(int)) == -1)
752 LOGE("Writing a key_len to a file descriptor is failed. errno = %d", errno);
754 if (write(fd, key, key_len) == -1)
756 LOGE("Writing a key to a file descriptor is failed. errno = %d", errno);
759 if (write(fd, &value_len, sizeof(int)) == -1)
761 LOGE("Writing a value_len to a file descriptor is failed. errno = %d", errno);
763 if (write(fd, value, value_len) == -1)
765 LOGE("Writing a value to a file descriptor is failed. errno = %d", errno);
772 __get_provider_pkgid(char* provider_id)
775 char *provider_appid = NULL;
776 char *provider_pkgid = NULL;
777 pkgmgrinfo_appinfo_h app_info_handle = NULL;
779 int ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider_id, "Sql", &provider_appid, &access);
780 if (ret != PMINFO_R_OK)
782 LOGE("unable to get sql data control information: %d", ret);
786 pkgmgrinfo_appinfo_get_appinfo(provider_appid, &app_info_handle);
787 pkgmgrinfo_appinfo_get_pkgname(app_info_handle, &provider_pkgid);
788 SECURE_LOGI("provider pkg id : %s", provider_pkgid);
796 free(provider_appid);
798 return provider_pkgid ? strdup(provider_pkgid) : NULL;
802 datacontrol_sql_insert(datacontrol_h provider, const bundle* insert_data, int *request_id)
806 char *provider_appid = NULL;
808 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || insert_data == NULL)
810 LOGE("Invalid parameter");
811 return DATACONTROL_ERROR_INVALID_PARAMETER;
814 SECURE_LOGI("SQL data control, insert to provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
816 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
817 if (ret != PMINFO_R_OK)
819 LOGE("unable to get sql data control information: %d", ret);
820 return DATACONTROL_ERROR_IO_ERROR;
823 free(provider_appid);
825 if (NULL != access && !strcmp(access, READ_ONLY)) {
826 LOGE("Provider has given [%s] permission only", access);
828 return DATACONTROL_ERROR_PERMISSION_DENIED;
833 char caller_app_id[256] = {0, };
834 pid_t pid = getpid();
836 if (aul_app_get_appid_bypid(pid, caller_app_id, sizeof(caller_app_id)) != 0)
838 SECURE_LOGE("Failed to get appid by pid(%d).", pid);
839 return DATACONTROL_ERROR_INVALID_PARAMETER;
842 // Check size of arguments
843 long long arg_size = 0;
844 bundle_foreach((bundle*)insert_data, bundle_foreach_check_arg_size_cb, &arg_size);
845 arg_size += strlen(provider->data_id) * sizeof(wchar_t);
846 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE)
848 LOGE("The size of the request argument exceeds the limit, 1M.");
849 return DATACONTROL_ERROR_MAX_EXCEEDED;
852 int reqId = _datacontrol_create_request_id();
853 SECURE_LOGI("request id: %d", reqId);
854 char insert_map_file[REQUEST_PATH_MAX] = {0, };
855 ret = snprintf(insert_map_file, REQUEST_PATH_MAX, "%s%s%d", DATACONTROL_REQUEST_FILE_PREFIX, caller_app_id, reqId);
858 LOGE("unable to write formatted output to insert_map_file: %d", errno);
859 return DATACONTROL_ERROR_IO_ERROR;
862 SECURE_LOGI("insert_map_file : %s", insert_map_file);
865 char *provider_pkgid = __get_provider_pkgid(provider->provider_id);
867 ret = security_server_shared_file_open(insert_map_file, provider_pkgid, &fd);
868 if (ret == SECURITY_SERVER_API_ERROR_FILE_EXIST) {
869 SECURE_LOGE("The file(%s) already exist, delete and retry to open", insert_map_file);
870 int ret_temp = security_server_shared_file_delete(insert_map_file);
871 if (ret_temp != SECURITY_SERVER_API_SUCCESS) {
872 SECURE_LOGE("Delete the file(%s) is failed : %d", insert_map_file, ret_temp);
874 ret = security_server_shared_file_open(insert_map_file, provider_pkgid, &fd);
878 if (ret != SECURITY_SERVER_API_SUCCESS)
880 SECURE_LOGE("unable to open insert_map_file: %d", ret);
881 free(provider_pkgid);
882 return DATACONTROL_ERROR_IO_ERROR;
885 free(provider_pkgid);
887 int count = bundle_get_count((bundle*)insert_data);
888 LOGI("Insert column counts: %d", count);
890 bundle_foreach((bundle*)insert_data, bundle_foreach_cb, &fd);
895 bundle *b = bundle_create();
898 LOGE("unable to create bundle: %d", errno);
899 return DATACONTROL_ERROR_IO_ERROR;
902 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
903 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
905 char insert_column_count[MAX_LEN_DATACONTROL_COLUMN_COUNT] = {0, };
906 ret = snprintf(insert_column_count, MAX_LEN_DATACONTROL_COLUMN_COUNT, "%d", count);
909 LOGE("unable to convert insert column count to string: %d", errno);
911 return DATACONTROL_ERROR_IO_ERROR;
914 const char* arg_list[3];
915 arg_list[0] = provider->data_id;
916 arg_list[1] = insert_column_count;
917 arg_list[2] = insert_map_file;
919 bundle_add_str_array(b, OSP_K_ARG, arg_list, 3);
921 // Set the request id
924 ret = datacontrol_sql_request_provider(provider, DATACONTROL_TYPE_SQL_INSERT, b, reqId);
925 if (ret != DATACONTROL_ERROR_NONE)
927 ret = security_server_shared_file_delete(insert_map_file);
928 if (ret != SECURITY_SERVER_API_SUCCESS)
930 SECURE_LOGE("unable to remove the insert_map_file: %d", ret);
938 datacontrol_sql_delete(datacontrol_h provider, const char *where, int *request_id)
942 char *provider_appid = NULL;
944 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL)
946 LOGE("Invalid parameter");
947 return DATACONTROL_ERROR_INVALID_PARAMETER;
950 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
951 if (ret != PMINFO_R_OK)
953 LOGE("unable to get sql data control information: %d", ret);
954 return DATACONTROL_ERROR_IO_ERROR;
957 free(provider_appid);
959 if (NULL != access && !strcmp(access, READ_ONLY)) {
960 LOGE("Provider has given [%s] permission only", access);
962 return DATACONTROL_ERROR_PERMISSION_DENIED;
967 bundle *b = bundle_create();
970 LOGE("unable to create bundle: %d", errno);
971 return DATACONTROL_ERROR_IO_ERROR;
974 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
975 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
977 const char* arg_list[2];
978 arg_list[0] = provider->data_id;
986 arg_list[1] = DATACONTROL_EMPTY;
989 bundle_add_str_array(b, OSP_K_ARG, arg_list, 2);
991 // Set the request id
992 int reqId = _datacontrol_create_request_id();
995 ret = datacontrol_sql_request_provider(provider, DATACONTROL_TYPE_SQL_DELETE, b, reqId);
1001 datacontrol_sql_select(datacontrol_h provider, char **column_list, int column_count, const char *where, const char *order, int *request_id)
1003 return datacontrol_sql_select_with_page(provider, column_list, column_count, where, order, 1, 20, request_id);
1007 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)
1010 char* access = NULL;
1011 char *provider_appid = NULL;
1013 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL)
1015 LOGE("Invalid parameter");
1016 return DATACONTROL_ERROR_INVALID_PARAMETER;
1019 if (count_per_page > MAX_ROW_COUNT)
1021 LOGE("Exceeds max row count per page.");
1022 return DATACONTROL_ERROR_INVALID_PARAMETER;
1025 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);
1027 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
1028 if (ret != PMINFO_R_OK)
1030 LOGE("unable to get sql data control information: %d", ret);
1031 return DATACONTROL_ERROR_IO_ERROR;
1034 free(provider_appid);
1036 if (NULL != access && !strcmp(access, WRITE_ONLY)) {
1037 LOGE("Provider has given [%s] permission only", access);
1039 return DATACONTROL_ERROR_PERMISSION_DENIED;
1044 if (column_list == NULL)
1046 LOGE("Invalid parameter");
1047 return DATACONTROL_ERROR_INVALID_PARAMETER;
1050 int total_arg_count = -1;
1052 bundle *b = bundle_create();
1055 LOGE("unable to create bundle: %d", errno);
1056 return DATACONTROL_ERROR_IO_ERROR;
1059 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
1060 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
1062 char page[32] = {0, };
1063 ret = snprintf(page, 32, "%d", page_number);
1066 LOGE("unable to convert page no to string: %d", errno);
1068 return DATACONTROL_ERROR_IO_ERROR;
1071 char count_per_page_no[32] = {0, };
1072 ret = snprintf(count_per_page_no, 32, "%d", count_per_page);
1075 LOGE("unable to convert count per page no to string: %d", errno);
1077 return DATACONTROL_ERROR_IO_ERROR;
1080 total_arg_count = column_count + DATACONTROL_SELECT_EXTRA_COUNT;
1081 const char** arg_list = (const char**)malloc(total_arg_count * (sizeof(char *)));
1082 if (arg_list == NULL) {
1083 LOGE("out of memory");
1085 return DATACONTROL_ERROR_OUT_OF_MEMORY;
1088 LOGI("total arg count %d", total_arg_count);
1090 arg_list[0] = provider->data_id; // arg[0]: data ID
1094 char select_column_count[MAX_LEN_DATACONTROL_COLUMN_COUNT] = {0, };
1095 ret = snprintf(select_column_count, MAX_LEN_DATACONTROL_COLUMN_COUNT, "%d", column_count);
1098 LOGE("unable to convert select col count to string: %d", errno);
1101 return DATACONTROL_ERROR_IO_ERROR;
1105 arg_list[i] = select_column_count; // arg[1]: selected column count
1109 while (select_col < column_count)
1111 arg_list[i++] = column_list[select_col++];
1115 if (where) // arg: where clause
1117 arg_list[i++] = where;
1121 arg_list[i++] = DATACONTROL_EMPTY;
1124 if (order) // arg: order clause
1126 arg_list[i++] = order;
1130 arg_list[i++] = DATACONTROL_EMPTY;
1134 arg_list[i++] = page; // arg: page number
1136 arg_list[i] = count_per_page_no; // arg: count per page
1138 bundle_add_str_array(b, OSP_K_ARG, arg_list, total_arg_count);
1141 int reqId = _datacontrol_create_request_id();
1142 *request_id = reqId;
1144 ret = datacontrol_sql_request_provider(provider, DATACONTROL_TYPE_SQL_SELECT, b, reqId);
1151 datacontrol_sql_update(datacontrol_h provider, const bundle* update_data, const char *where, int *request_id)
1154 char* access = NULL;
1155 char *provider_appid = NULL;
1157 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || update_data == NULL || where == NULL)
1159 LOGE("Invalid parameter");
1160 return DATACONTROL_ERROR_INVALID_PARAMETER;
1163 ret = pkgmgrinfo_appinfo_get_datacontrol_info(provider->provider_id, "Sql", &provider_appid, &access);
1164 if (ret != PMINFO_R_OK)
1166 LOGE("unable to get sql data control information: %d", ret);
1167 return DATACONTROL_ERROR_IO_ERROR;
1170 free(provider_appid);
1172 if (NULL != access && !strcmp(access, READ_ONLY)) {
1173 LOGE("Provider has given [%s] permission only", access);
1175 return DATACONTROL_ERROR_PERMISSION_DENIED;
1180 char caller_app_id[256] = {0, };
1181 pid_t pid = getpid();
1183 if (aul_app_get_appid_bypid(pid, caller_app_id, sizeof(caller_app_id)) != 0)
1185 SECURE_LOGE("Failed to get appid by pid(%d).", pid);
1186 return DATACONTROL_ERROR_INVALID_PARAMETER;
1189 // Check size of arguments
1190 long long arg_size = 0;
1191 bundle_foreach((bundle*)update_data, bundle_foreach_check_arg_size_cb, &arg_size);
1192 arg_size += strlen(provider->data_id) * sizeof(wchar_t);
1193 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE)
1195 LOGE("The size of the request argument exceeds the limit, 1M.");
1196 return DATACONTROL_ERROR_MAX_EXCEEDED;
1199 int reqId = _datacontrol_create_request_id();
1201 char update_map_file[REQUEST_PATH_MAX] = {0, };
1202 ret = snprintf(update_map_file, REQUEST_PATH_MAX, "%s%s%d", DATACONTROL_REQUEST_FILE_PREFIX, caller_app_id, reqId);
1205 LOGE("unable to write formatted output to update_map_file: %d", errno);
1206 return DATACONTROL_ERROR_IO_ERROR;
1209 SECURE_LOGI("update_map_file : %s", update_map_file);
1212 char *provider_pkgid = __get_provider_pkgid(provider->provider_id);
1214 ret = security_server_shared_file_open(update_map_file, provider_pkgid, &fd);
1215 if (ret == SECURITY_SERVER_API_ERROR_FILE_EXIST) {
1216 SECURE_LOGE("The file(%s) already exist, delete and retry to open", update_map_file);
1217 int ret_temp = security_server_shared_file_delete(update_map_file);
1218 if (ret_temp != SECURITY_SERVER_API_SUCCESS) {
1219 SECURE_LOGE("Delete the file(%s) is failed : %d", update_map_file, ret_temp);
1221 ret = security_server_shared_file_open(update_map_file, provider_pkgid, &fd);
1225 if (ret != SECURITY_SERVER_API_SUCCESS)
1227 SECURE_LOGE("unable to open update_map file: %d", ret);
1228 free(provider_pkgid);
1229 return DATACONTROL_ERROR_IO_ERROR;
1232 free(provider_pkgid);
1234 int count = bundle_get_count((bundle*)update_data);
1235 bundle_foreach((bundle*)update_data, bundle_foreach_cb, &fd);
1240 bundle *b = bundle_create();
1243 LOGE("unable to create bundle: %d", errno);
1244 return DATACONTROL_ERROR_IO_ERROR;
1247 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
1248 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
1250 char update_column_count[MAX_LEN_DATACONTROL_COLUMN_COUNT] = {0, };
1251 ret = snprintf(update_column_count, MAX_LEN_DATACONTROL_COLUMN_COUNT, "%d", count);
1254 LOGE("unable to convert update col count to string: %d", errno);
1256 return DATACONTROL_ERROR_IO_ERROR;
1259 const char* arg_list[4];
1260 arg_list[0] = provider->data_id; // list(0): data ID
1261 arg_list[1] = update_column_count;
1262 arg_list[2] = update_map_file;
1263 arg_list[3] = where;
1265 bundle_add_str_array(b, OSP_K_ARG, arg_list, 4);
1267 *request_id = reqId;
1269 ret = datacontrol_sql_request_provider(provider, DATACONTROL_TYPE_SQL_UPDATE, b, reqId);
1270 if (ret != DATACONTROL_ERROR_NONE)
1272 ret = security_server_shared_file_delete(update_map_file);
1273 if (ret != SECURITY_SERVER_API_SUCCESS)
1275 SECURE_LOGE("unable to remove the update_map file: %d", ret);