2 * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include "download-agent-debug.h"
23 #include "download-agent-mime-util.h"
24 #include "download-agent-pthread.h"
26 #define IS_PROHIBITED_CHAR(c) ((c) == '/' || (c) == '\\' || (c) == '?' || (c) == '%' || (c) == '*' || (c) == ':' || (c) == '|' || (c) == '"' || (c) == '<' || (c) == '>')
27 #define IS_SPACE_CHARACTER(c) ((c) == '\t')
29 #define MAX_EXT_NAME_LEN 12
30 #define MAX_EXT_TABLE_INDEX 18
31 Ext_translation_table ext_trans_table[MAX_EXT_TABLE_INDEX] = {
37 {"*.jpe", "*.jpg"},//5
42 {"CMakeLists.txt", "*.cmake"},//10
44 {"Makefile", "makefile"},
47 {"*.divx", "*.avi"},//15
51 /* This is samsung mime policy
52 * 1. if the mime is audio/m4a, the extension name is defined as "m4a" for launching music player
54 #ifdef _SAMSUNG_MIME_POLICY
55 #define MAX_SEC_MIME_TABLE_INDEX 1
56 struct sec_mime_table_t {
60 struct sec_mime_table_t sec_mime_table[MAX_SEC_MIME_TABLE_INDEX] = {
65 const char *ambiguous_MIME_Type_list[] = {
67 "application/octet-stream"
70 /* Because xdgmime is not thread safety, this mutex is necessary */
71 pthread_mutex_t mutex_for_xdgmime = PTHREAD_MUTEX_INITIALIZER;
73 da_bool_t is_ambiguous_MIME_Type(const char *in_mime_type)
79 int list_size = sizeof(ambiguous_MIME_Type_list) / sizeof(const char *);
80 for (index = 0 ; index < list_size ; index++) {
81 if (0 == strncmp(in_mime_type, ambiguous_MIME_Type_list[index],
82 strlen(ambiguous_MIME_Type_list[index]))) {
83 //DA_SECURE_LOGD("It is ambiguous! [%s]", ambiguous_MIME_Type_list[index]);
91 da_ret_t da_mime_get_ext_name(char *mime, char **ext)
93 da_ret_t ret = DA_RESULT_OK;
94 const char **extlist = DA_NULL;
95 const char *unaliased_mimetype = DA_NULL;
96 char ext_temp[DA_MAX_STR_LEN] = {0,};
101 if (DA_NULL == mime || DA_NULL == ext) {
102 ret = DA_ERR_INVALID_ARGUMENT;
103 DA_LOGE("Invalid mime type");
106 // DA_SECURE_LOGD("mime str[%s]ptr[%p]len[%d]",mime,mime,strlen(mime));
107 /* unaliased_mimetype means representative mime among similar types */
108 DA_MUTEX_LOCK(&mutex_for_xdgmime);
109 unaliased_mimetype = xdg_mime_unalias_mime_type(mime);
111 if (unaliased_mimetype == DA_NULL) {
112 ret = DA_ERR_INVALID_MIME_TYPE;
113 DA_LOGI("Invalid mime type : No unsaliased mime type");
114 DA_MUTEX_UNLOCK(&mutex_for_xdgmime);
117 DA_SECURE_LOGD("unaliased_mimetype[%s]\n", unaliased_mimetype);
119 /* Get extension name from shared-mime-info */
120 extlist = xdg_mime_get_file_names_from_mime_type(unaliased_mimetype);
121 DA_MUTEX_UNLOCK(&mutex_for_xdgmime);
122 if (extlist == DA_NULL || *extlist == DA_NULL) {
124 ret = DA_ERR_INVALID_MIME_TYPE;
125 DA_LOGV("No extension list");
126 #ifdef _SAMSUNG_MIME_POLICY
127 for (i = 0; i < MAX_SEC_MIME_TABLE_INDEX; i++) {
128 if (strncmp(sec_mime_table[i].mime, mime, strlen(mime)) == 0) {
129 strncpy(ext_temp, sec_mime_table[i].ext, DA_MAX_STR_LEN-1);
135 } else { /* For drm case, this else statement is needed */
136 strncpy(ext_temp, *extlist, DA_MAX_STR_LEN - 1);
137 /* If only one extension name is existed, don't enter here */
138 while (*extlist != NULL) {
140 /* If there are existed many extension names,
141 * try to search common extension name from table
142 * with first mime type at extension list*/
143 for (i = 0; i < MAX_EXT_TABLE_INDEX; i++) {
144 if (strncmp(ext_trans_table[i].standard, *extlist,
145 strlen(*extlist)) == 0) {
146 memset(ext_temp, 0x00, DA_MAX_STR_LEN);
147 strncpy(ext_temp, ext_trans_table[i].normal, DA_MAX_STR_LEN-1);
151 DA_LOGV("index[%d]\n", i);
152 /* If there is a mime at extension transform table */
153 if (i < MAX_EXT_TABLE_INDEX)
159 if (strlen(ext_temp) < 1) {
160 /* If there is no mime string for OMA descriptor mime type */
161 if (strncmp(DD_MIME_STR, mime, strlen(DD_MIME_STR)) == 0) {
162 strncpy(ext_temp, DD_EXT_STR, DA_MAX_STR_LEN - 1);
164 /* If there is no extension name for "applicaion/vnd.oma.drm.messeages"
165 * at shared-mime-info*/
166 } else if (strncmp(DRM_MIME_MSG_STR, mime, strlen(DRM_MIME_MSG_STR)) ==
168 strncpy(ext_temp, DRM_EXT_STR, DA_MAX_STR_LEN - 1);
169 /* If there is extension name at extlist, the return value can have an error.*/
172 ret = DA_ERR_INVALID_MIME_TYPE;
173 DA_LOGI("Invalid mime type : no extension name at list");
176 if (ret != DA_RESULT_OK)
179 temp = strchr(ext_temp, '.');
185 DA_SECURE_LOGD("final extension name:[%s]", temp);
186 *ext = (char*)calloc(1, strlen(temp) + 1);
187 if (*ext != DA_NULL) {
188 strncpy(*ext, temp, strlen(temp));
190 ret = DA_ERR_FAIL_TO_MEMALLOC ;
197 da_bool_t da_get_extension_name_from_url(char *url, char **ext)
199 da_bool_t ret = DA_TRUE;
200 char *buff = DA_NULL;
201 char *temp_str = DA_NULL;
206 if (DA_NULL == url || DA_NULL == ext) {
208 DA_LOGE("Invalid Argument");
212 if ((temp_str = strrchr(url, '/'))) {
213 if ((buff = strrchr(temp_str, '.'))) {
217 /* check extention length refer to https://en.wikipedia.org/wiki/List_of_filename_extensions */
218 if (strlen(buff) > MAX_EXT_NAME_LEN)
221 /* check to exist "?" after extension name */
222 q = strrchr(buff, '?');
224 buf_len = strlen(buff) - strlen(q);
226 buf_len = strlen(buff);
227 *ext = (char*) calloc(1, buf_len + 1) ;
229 if (DA_NULL == *ext) {
231 DA_LOGE("Memory Fail");
234 strncpy(*ext, buff, buf_len);
235 DA_SECURE_LOGD("extention name[%s]", *ext);
247 /* FIXME move this function to another file */
248 da_bool_t da_get_file_name_from_url(char *url, char **name)
250 da_bool_t ret = DA_TRUE;
251 char *buff = DA_NULL;
258 char name_buff[DA_MAX_FILE_NAME_LEN + 1] = {0,};
262 if (DA_NULL == url || DA_NULL == name) {
264 DA_LOGE("Invalid Argument");
268 if (!strstr(url, "http") && !strstr(url, "https")) {
270 DA_LOGE("Invalid Argument");
274 buff = (char*) calloc(1, strlen(url) +1);
275 if (DA_NULL == buff) {
277 DA_LOGE("Memory Fail");
281 while ((c = url[i++]) != 0) {
283 char buffer[3] = {0,};
284 buffer[0] = url[i++];
285 buffer[1] = url[i++];
286 buff[j++] = (char)strtol(buffer, NULL, 16);
291 End = strstr(buff, "?");
292 if (DA_NULL != End) {
294 while (*(Start) != '/')
297 if ((*(Start) == '/') && ((len_name = (End - Start)) > 1)) {
299 if (DA_MAX_FILE_NAME_LEN <= len_name) {
300 strncpy(name_buff, Start, DA_MAX_FILE_NAME_LEN);
301 name_buff[DA_MAX_FILE_NAME_LEN] = '\0';
303 strncpy(name_buff, Start, len_name);
304 name_buff[len_name] = '\0';
308 goto ERR ; /*Name not found*/
311 int urlLen = strlen(buff);
313 Start_pos = urlLen - 1;
315 while (Start_pos > 0) {
316 if (buff[Start_pos] == '/')
321 if (Start_pos == 0 || urlLen - Start_pos <= 0) {
325 while (Start_pos < urlLen) {
326 name_buff[len_name++] = buff[Start_pos++];
327 if (DA_MAX_FILE_NAME_LEN <= len_name) {
328 name_buff[DA_MAX_FILE_NAME_LEN] = '\0';
335 End = strrchr(name_buff, '.');
338 // DA_SECURE_LOGD("file name BEFORE removing prohibited character = %s", name_buff);
339 delete_prohibited_char(name_buff, strlen(name_buff));
340 len_name = strlen(name_buff);
341 *name = (char*) calloc(1, len_name + 1);
343 strncpy(*name, name_buff, len_name);
345 // DA_SECURE_LOGD("Extracted file name : %s", *name);
354 void delete_prohibited_char(char *szTarget, int str_len)
356 char *chk_str = NULL;
361 if (szTarget == NULL || str_len <= 0 || strlen(szTarget) != str_len) {
362 DA_LOGE("Invaild Parameter\n");
366 chk_str = (char *)calloc(1, str_len + 1);
370 while (szTarget[j] != '\0') {
371 if (IS_PROHIBITED_CHAR(szTarget[j]) == DA_FALSE &&
372 IS_SPACE_CHARACTER(szTarget[j]) == DA_FALSE) {
373 chk_str[i] = szTarget[j];
380 tar_len = strlen(chk_str);
385 for (i = 0; i < tar_len; i++)
386 szTarget[i] = chk_str[i];
396 #ifdef _ENABLE_OMA_DRM
397 da_bool_t is_content_drm_dcf(char *content_type)
399 if (content_type == DA_NULL)
402 if (0 == strcmp(content_type, DRM_MIME_CONTENT_STR)) {
403 DA_LOGV("DRM_DM content");
410 da_bool_t is_content_drm_dm(char *content_type)
412 if (content_type == DA_NULL)
415 if (0 == strcmp(content_type, DRM_MIME_MSG_STR)) {
416 DA_LOGV("DRM_DM content");
424 da_ret_t get_extension_from_mime_type(char *mime_type, char **extension)
426 da_ret_t ret = DA_RESULT_OK;
430 if (DA_NULL == mime_type || DA_NULL == extension) {
431 DA_LOGE("received mime_type is null");
432 ret = DA_ERR_INVALID_ARGUMENT;
435 // DA_SECURE_LOGD("input mime type = %s", mime_type);
436 if (DA_RESULT_OK != (ret = da_mime_get_ext_name(mime_type, &ext))) {
437 DA_LOGE("can't find proper extension!");
441 // DA_SECURE_LOGD("found extension = %s", *extension);