1#include "base.h" 2#include "log.h" 3#include "buffer.h" 4 5#include "plugin.h" 6 7#include <ctype.h> 8#include <stdlib.h> 9#include <string.h> 10#include <dlinklist.h> 11#include <dirent.h> 12 13#if EMBEDDED_EANBLE 14#ifndef APP_IPKG 15#include "disk_share.h" 16#endif 17#endif 18 19#define DBE 1 20 21typedef struct { 22 array *alias; 23} plugin_config; 24 25typedef struct { 26 PLUGIN_DATA; 27 28 plugin_config **config_storage; 29 30 plugin_config conf; 31 32 buffer *mnt_path; 33} plugin_data; 34 35INIT_FUNC(mod_aicloud_sharelink_parser_init) { 36 plugin_data *p; 37 38 p = calloc(1, sizeof(*p)); 39 40 p->mnt_path = buffer_init(); 41 42 return p; 43} 44 45FREE_FUNC(mod_aicloud_sharelink_parser_free) { 46 plugin_data *p = p_d; 47 48 UNUSED(srv); 49 50 if (!p) return HANDLER_GO_ON; 51 52 if (p->config_storage) { 53 size_t i; 54 for (i = 0; i < srv->config_context->used; i++) { 55 plugin_config *s = p->config_storage[i]; 56 57 array_free(s->alias); 58 59 free(s); 60 } 61 free(p->config_storage); 62 } 63 64 buffer_free(p->mnt_path); 65 66 free(p); 67 68 return HANDLER_GO_ON; 69} 70 71#if 0 72SETDEFAULTS_FUNC(mod_aicloud_sharelink_parser_set_defaults) { 73 plugin_data *p = p_d; 74 size_t i = 0; 75 76 config_values_t cv[] = { 77 { "alias.url", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION }, 78 { NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET } 79 }; 80 81 p->config_storage = calloc(1, srv->config_context->used * sizeof(specific_config *)); 82 83 for (i = 0; i < srv->config_context->used; i++) { 84 plugin_config *s; 85 86 s = calloc(1, sizeof(plugin_config)); 87 s->alias = array_init(); 88 89 cv[0].destination = s->alias; 90 91 p->config_storage[i] = s; 92 93 if (0 != config_insert_values_global(srv, ((data_config *)srv->config_context->data[i])->value, cv, i == 0 ? T_CONFIG_SCOPE_SERVER : T_CONFIG_SCOPE_CONNECTION)) { 94 return HANDLER_ERROR; 95 } 96 97#if EMBEDDED_EANBLE 98 char *usbdiskname = nvram_get_productid(); 99#else 100 char *usbdiskname = "usbdisk"; 101#endif 102 for (size_t j = 0; j < s->alias->used; j++) { 103 data_string *ds = (data_string *)s->alias->data[j]; 104 if(strstr(ds->key->ptr, usbdiskname)!=NULL){ 105 buffer_copy_buffer(p->mnt_path, ds->value); 106 107 if(strcmp( p->mnt_path->ptr + (p->mnt_path->used -1 ), "/" )!=0) 108 buffer_append_string(p->mnt_path, "/"); 109 } 110 } 111#if EMBEDDED_EANBLE 112#ifdef APP_IPKG 113 free(usbdiskname); 114#endif 115#endif 116 } 117 118 return HANDLER_GO_ON; 119} 120#endif 121SETDEFAULTS_FUNC(mod_aicloud_sharelink_parser_set_defaults) { 122 plugin_data *p = p_d; 123 size_t i = 0; 124 125 config_values_t cv[] = { 126 { "alias.url", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION }, /* 0 */ 127 { NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET } 128 }; 129 130 if (!p) return HANDLER_ERROR; 131 132 p->config_storage = calloc(1, srv->config_context->used * sizeof(plugin_config *)); 133 134 for (i = 0; i < srv->config_context->used; i++) { 135 data_config const* config = (data_config const*)srv->config_context->data[i]; 136 plugin_config *s; 137 138 s = calloc(1, sizeof(plugin_config)); 139 s->alias = array_init(); 140 cv[0].destination = s->alias; 141 142 p->config_storage[i] = s; 143 144 if (0 != config_insert_values_global(srv, config->value, cv, i == 0 ? T_CONFIG_SCOPE_SERVER : T_CONFIG_SCOPE_CONNECTION)) { 145 return HANDLER_ERROR; 146 } 147 148#if EMBEDDED_EANBLE 149 char *usbdiskname = nvram_get_productid(); 150#else 151 char *usbdiskname = "usbdisk"; 152#endif 153 154 #if 1 155 if (s->alias->used >= 2) { 156 const array *a = s->alias; 157 size_t j, k; 158 159 for (j = 0; j < a->used; j ++) { 160 const buffer *prefix = a->data[a->sorted[j]]->key; 161 for (k = j + 1; k < a->used; k ++) { 162 const buffer *key = a->data[a->sorted[k]]->key; 163 data_string *ds = (data_string *)a->data[a->sorted[k]]; 164 165 if(strstr(key->ptr, usbdiskname)!=NULL){ 166 buffer_copy_buffer(p->mnt_path, ds->value); 167 168 if(strcmp( p->mnt_path->ptr + (p->mnt_path->used -1 ), "/" )!=0) 169 buffer_append_string(p->mnt_path, "/"); 170 } 171 172 if (buffer_string_length(key) < buffer_string_length(prefix)) { 173 break; 174 } 175 if (memcmp(key->ptr, prefix->ptr, buffer_string_length(prefix)) != 0) { 176 break; 177 } 178 179 /* ok, they have same prefix. check position */ 180 if (a->sorted[j] < a->sorted[k]) { 181 log_error_write(srv, __FILE__, __LINE__, "SBSBS", 182 "url.alias: `", key, "' will never match as `", prefix, "' matched first"); 183 return HANDLER_ERROR; 184 } 185 } 186 } 187 } 188 #endif 189 190#if EMBEDDED_EANBLE 191#ifdef APP_IPKG 192 free(usbdiskname); 193#endif 194#endif 195 196 } 197 198 return HANDLER_GO_ON; 199} 200 201 202 203//void substr(char *dest, const char* src, unsigned int start, unsigned int cnt) { 204// strncpy(dest, src + start, cnt); 205// dest[cnt] = 0; 206//} 207 208output_folder_list(server *srv, connection *con, char* fullpath, char* filename, buffer *out) { 209 buffer* buffer_filename = buffer_init(); 210 buffer_copy_string(buffer_filename,filename); 211 buffer_urldecode_path(buffer_filename); 212 213 buffer_append_string_len(out, CONST_STR_LEN("<div class='albumDiv' title=''>\n")); 214 buffer_append_string_len(out, CONST_STR_LEN("<table class='thumb-table-parent'>\n")); 215 buffer_append_string_len(out, CONST_STR_LEN("<tbody><tr><td>\n")); 216 buffer_append_string_len(out, CONST_STR_LEN("<div class='picDiv'>")); 217 218 int use_http_connect = 0; 219 220 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='folderDiv bicon'>")); 221 222 buffer_append_string_len(out, CONST_STR_LEN("<div class='selectDiv sicon'></div>")); 223 buffer_append_string_len(out, CONST_STR_LEN("<div class='selectHintDiv sicon'></div>")); 224 buffer_append_string_len(out, CONST_STR_LEN("</div></div></td></tr><tr><td><div class='albuminfo' style='font-size:80%'>")); 225 buffer_append_string_len(out, CONST_STR_LEN("<a id='list_item' qtype='1' isdir='0' playhref='")); 226 227#if EMBEDDED_EANBLE 228 char* webdav_http_port = nvram_get_webdav_http_port(); 229#else 230 char* webdav_http_port = "8082"; 231#endif 232 233 if(use_http_connect==1){ 234 buffer_append_string_len(out, CONST_STR_LEN("http://")); 235 buffer_append_string_buffer(out, con->uri.authority); 236 237 if( !strstr( con->uri.authority->ptr, ":" ) ){ 238 buffer_append_string_len(out, CONST_STR_LEN(":")); 239 buffer_append_string(out, webdav_http_port); 240 } 241 } 242 else{ 243 buffer_append_string_buffer(out, con->uri.scheme); 244 buffer_append_string_len(out, CONST_STR_LEN("://")); 245 buffer_append_string_buffer(out, con->uri.authority); 246 } 247 248 buffer_append_string_len(out, CONST_STR_LEN("/")); 249 buffer_append_string_buffer(out, con->share_link_shortpath); 250 buffer_append_string_len(out, CONST_STR_LEN("/")); 251 buffer_append_string_buffer(out, con->share_link_filename); 252 buffer_append_string_len(out, CONST_STR_LEN("/")); 253 buffer_append_string(out, filename); 254 255 buffer_append_string_len(out, CONST_STR_LEN("' uhref='")); 256 257 buffer_append_string_buffer(out, con->uri.scheme); 258 buffer_append_string_len(out, CONST_STR_LEN("://")); 259 buffer_append_string_buffer(out, con->uri.authority); 260 buffer_append_string_len(out, CONST_STR_LEN("/")); 261 buffer_append_string_buffer(out, con->share_link_shortpath); 262 buffer_append_string_len(out, CONST_STR_LEN("/")); 263 buffer_append_string_buffer(out, con->share_link_filename); 264 buffer_append_string_len(out, CONST_STR_LEN("/")); 265 buffer_append_string(out, filename); 266 267 buffer_append_string_len(out, CONST_STR_LEN("' title='")); 268 buffer_append_string_buffer(out, buffer_filename); 269 270 buffer_append_string_len(out, CONST_STR_LEN("' ext='")); 271 272 buffer_append_string_len(out, CONST_STR_LEN("' freadonly='true' fhidden='false' target='_parent'>")); 273 274 buffer_append_string_buffer( out, buffer_filename ); 275 buffer_append_string_len(out, CONST_STR_LEN("</a></div></td></tr>")); 276 277 buffer_append_string_len(out, CONST_STR_LEN("</tbody></table></div>")); 278 279 buffer_free(buffer_filename); 280} 281 282output_file_list(server *srv, connection *con, char* fullpath, char* filename, buffer *out) { 283 284 buffer* buffer_filename = buffer_init(); 285 buffer_copy_string(buffer_filename,filename); 286 buffer_urldecode_path(buffer_filename); 287 288 buffer_append_string_len(out, CONST_STR_LEN("<div class='albumDiv' title=''>\n")); 289 buffer_append_string_len(out, CONST_STR_LEN("<table class='thumb-table-parent'>\n")); 290 buffer_append_string_len(out, CONST_STR_LEN("<tbody><tr><td>\n")); 291 buffer_append_string_len(out, CONST_STR_LEN("<div class='picDiv'>")); 292 293 int use_http_connect = 0; 294 295 char* aa = get_filename_ext(fullpath); 296 int len = strlen(aa)+1; 297 char* file_ext = (char*)malloc(len); 298 memset(file_ext,'\0', len); 299 strcpy(file_ext, aa); 300 for (int i = 0; file_ext[i]; i++) 301 file_ext[i] = tolower(file_ext[i]); 302 303 if( strcmp(file_ext,"jpg")==0 || 304 strcmp(file_ext,"jpeg")==0|| 305 strcmp(file_ext,"png")==0 || 306 strcmp(file_ext,"gif")==0 || 307 strcmp(file_ext,"bmp")==0 ){ 308 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='imgfileDiv bicon'>")); 309 } 310 else if( strcmp(file_ext,"mp3")==0 || 311 strcmp(file_ext,"m4a")==0 || 312 strcmp(file_ext,"m4r")==0 || 313 strcmp(file_ext,"wav")==0 ){ 314 use_http_connect = 1; 315 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='audiofileDiv bicon'>")); 316 } 317 else if( strcmp(file_ext,"mp4")==0 || 318 strcmp(file_ext,"rmvb")==0 || 319 strcmp(file_ext,"m4v")==0 || 320 strcmp(file_ext,"wmv")==0 || 321 strcmp(file_ext,"avi")==0 || 322 strcmp(file_ext,"mpg")==0 || 323 strcmp(file_ext,"mpeg")==0 || 324 strcmp(file_ext,"mkv")==0 || 325 strcmp(file_ext,"mov")==0 || 326 strcmp(file_ext,"flv")==0 || 327 strcmp(file_ext,"3gp")==0 || 328 strcmp(file_ext,"m2v")==0 || 329 strcmp(file_ext,"rm")==0 ){ 330 use_http_connect = 1; 331 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='videofileDiv bicon'>")); 332 } 333 else if(strcmp(file_ext,"doc")==0||strcmp(file_ext,"docx")==0) 334 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='docfileDiv bicon'>")); 335 else if(strcmp(file_ext,"ppt")==0||strcmp(file_ext,"pptx")==0) 336 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='pptfileDiv bicon'>")); 337 else if(strcmp(file_ext,"xls")==0||strcmp(file_ext,"xlsx")==0) 338 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='xlsfileDiv bicon'>")); 339 else if(strcmp(file_ext,"pdf")==0) 340 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='pdffileDiv bicon'>")); 341 else 342 buffer_append_string_len(out, CONST_STR_LEN("<div id='fileviewicon' class='fileDiv bicon'>")); 343 344 buffer_append_string_len(out, CONST_STR_LEN("<div class='selectDiv sicon'></div>")); 345 buffer_append_string_len(out, CONST_STR_LEN("<div class='selectHintDiv sicon'></div>")); 346 buffer_append_string_len(out, CONST_STR_LEN("</div></div></td></tr><tr><td><div class='albuminfo' style='font-size:80%'>")); 347 buffer_append_string_len(out, CONST_STR_LEN("<a id='list_item' qtype='1' isdir='0' playhref='")); 348 349#if EMBEDDED_EANBLE 350 char* webdav_http_port = nvram_get_webdav_http_port(); 351#else 352 char* webdav_http_port = "8082"; 353#endif 354 355 if(use_http_connect==1){ 356 buffer_append_string_len(out, CONST_STR_LEN("http://")); 357 buffer_append_string_buffer(out, con->uri.authority); 358 359 if( !strstr( con->uri.authority->ptr, ":" ) ){ 360 buffer_append_string_len(out, CONST_STR_LEN(":")); 361 buffer_append_string(out, webdav_http_port); 362#if EMBEDDED_EANBLE 363#ifdef APP_IPKG 364 free(webdav_http_port); 365#endif 366#endif 367 } 368 } 369 else{ 370 buffer_append_string_buffer(out, con->uri.scheme); 371 buffer_append_string_len(out, CONST_STR_LEN("://")); 372 buffer_append_string_buffer(out, con->uri.authority); 373 } 374 375 buffer_append_string_len(out, CONST_STR_LEN("/")); 376 buffer_append_string_buffer(out, con->share_link_shortpath); 377 buffer_append_string_len(out, CONST_STR_LEN("/")); 378 buffer_append_string_buffer(out, con->share_link_filename); 379 buffer_append_string_len(out, CONST_STR_LEN("/")); 380 buffer_append_string(out, filename); 381 382 buffer_append_string_len(out, CONST_STR_LEN("' uhref='")); 383 384 buffer_append_string_buffer(out, con->uri.scheme); 385 buffer_append_string_len(out, CONST_STR_LEN("://")); 386 buffer_append_string_buffer(out, con->uri.authority); 387 buffer_append_string_len(out, CONST_STR_LEN("/")); 388 buffer_append_string_buffer(out, con->share_link_shortpath); 389 buffer_append_string_len(out, CONST_STR_LEN("/")); 390 buffer_append_string_buffer(out, con->share_link_filename); 391 buffer_append_string_len(out, CONST_STR_LEN("/")); 392 buffer_append_string(out, filename); 393 394 buffer_append_string_len(out, CONST_STR_LEN("' title='")); 395 buffer_append_string_buffer(out, buffer_filename); 396 397 buffer_append_string_len(out, CONST_STR_LEN("' ext='")); 398 399 buffer_append_string(out, file_ext); 400 free(file_ext); 401 402 buffer_append_string_len(out, CONST_STR_LEN("' freadonly='true' fhidden='false'>")); 403 404 buffer_append_string_buffer( out, buffer_filename ); 405 buffer_append_string_len(out, CONST_STR_LEN("</a></div></td></tr>")); 406 407 buffer_append_string_len(out, CONST_STR_LEN("<tr><td>")); 408 buffer_append_string_len(out, CONST_STR_LEN("<input type='button' class='btnDownload' value='Downloads!'>")); 409 buffer_append_string_len(out, CONST_STR_LEN("</td></tr>")); 410 411 buffer_append_string_len(out, CONST_STR_LEN("</tbody></table></div>")); 412 413 buffer_free(buffer_filename); 414 415} 416 417 418int parser_share_link(server *srv, connection *con){ 419 int result=0; 420 421 if(strncmp(con->request.uri->ptr, "/ASUSHARE", 9)==0){ 422 423 char mac[20]="\0"; 424 char* decode_str=NULL; 425 int bExpired=0; 426 427#if EMBEDDED_EANBLE 428 #ifdef APP_IPKG 429 char *router_mac=nvram_get_router_mac(); 430 sprintf(mac,"%s",router_mac); 431 free(router_mac); 432 #else 433 char *router_mac=nvram_get_router_mac(); 434 strcpy(mac, (router_mac==NULL) ? "00:12:34:56:78:90" : router_mac); 435 #endif 436#else 437 get_mac_address("eth0", &mac); 438#endif 439 440 Cdbg(DBE, "mac=%s", mac); 441 442 char* key = ldb_base64_encode(mac, strlen(mac)); 443 int y = strstr (con->request.uri->ptr+1, "/") - (con->request.uri->ptr); 444 445 if(y<=9){ 446 if(key){ 447 free(key); 448 key=NULL; 449 } 450 return -1; 451 } 452 453 buffer* filename = buffer_init(); 454 buffer_copy_string_len(filename, con->request.uri->ptr+1+y, con->request.uri->used-2-y); 455 456 buffer* substrencode = buffer_init(); 457 buffer_copy_string_len(substrencode,con->request.uri->ptr+9,y-9); 458 459 decode_str = x123_decode(substrencode->ptr, key, &decode_str); 460 Cdbg(DBE, "decode_str=%s", decode_str); 461 462 if(decode_str){ 463 int x = strstr (decode_str,"?") - decode_str; 464 465 int param_len = strlen(decode_str) - x; 466 buffer* param = buffer_init(); 467 buffer* user = buffer_init(); 468 buffer* pass = buffer_init(); 469 buffer* expire = buffer_init(); 470 buffer_copy_string_len(param, decode_str + x + 1, param_len); 471 //Cdbg(DBE, "123param=[%s]", param->ptr); 472 473 char * pch; 474 pch = strtok(param->ptr, "&"); 475 while(pch!=NULL){ 476 477 if(strncmp(pch, "auth=", 5)==0){ 478 479 int len = strlen(pch)-5; 480 char* temp = (char*)malloc(len+1); 481 memset(temp,'\0', len); 482 strncpy(temp, pch+5, len); 483 temp[len]='\0'; 484 485 buffer_copy_string( con->share_link_basic_auth, "Basic " ); 486 buffer_append_string( con->share_link_basic_auth, temp ); 487 488 if(temp){ 489 free(temp); 490 temp=NULL; 491 } 492 } 493 else if(strncmp(pch, "expire=", 7)==0){ 494 int len = strlen(pch)-7; 495 char* temp2 = (char*)malloc(len+1); 496 memset(temp2,'\0', len); 497 strncpy(temp2, pch+7, len); 498 temp2[len]='\0'; 499 Cdbg(DBE, "expire(temp2) = %s", temp2); 500 501 unsigned long expire_time = atol(temp2); 502 time_t cur_time = time(NULL); 503 unsigned long cur_time2 = cur_time; 504 505 //double offset = difftime((time_t)expire_time, cur_time); 506 unsigned long offset = expire_time - cur_time; 507 Cdbg(DBE, "expire_time=%lu, cur_time2=%lu, offset = %lu", expire_time, cur_time2, offset); 508 if( offset < 0.0 ){ 509 buffer_reset(con->share_link_basic_auth); 510 bExpired = 1; 511 } 512 513 if(temp2){ 514 free(temp2); 515 temp2=NULL; 516 } 517 } 518 519 pch = strtok( NULL, "&" ); 520 } 521 522 buffer_free(param); 523 buffer_free(user); 524 buffer_free(pass); 525 buffer_free(expire); 526 527 buffer_copy_string( con->share_link_shortpath, "ASUSHARE"); 528 buffer_append_string_buffer( con->share_link_shortpath, substrencode ); 529 buffer_append_slash(con->share_link_shortpath); 530 531 buffer_copy_string_len( con->share_link_realpath, decode_str, x ); 532 buffer_append_slash(con->share_link_realpath); 533 534 buffer_urldecode_path(filename); 535 buffer_copy_buffer( con->share_link_filename, filename ); 536 537 buffer_reset(con->request.uri); 538 buffer_copy_buffer(con->request.uri, con->share_link_realpath); 539 buffer_append_string_buffer(con->request.uri, filename); 540 541 con->share_link_type = 0; 542 543 if(decode_str){ 544 free(decode_str); 545 decode_str = NULL; 546 } 547 548 } 549 550 buffer_free(substrencode); 551 buffer_free(filename); 552 553 if(key){ 554 free(key); 555 key=NULL; 556 } 557 558 Cdbg(DBE, "con->share_link_basic_auth=%s", con->share_link_basic_auth->ptr); 559 Cdbg(DBE, "con->share_link_shortpath=%s", con->share_link_shortpath->ptr); 560 Cdbg(DBE, "con->share_link_realpath=%s", con->share_link_realpath->ptr); 561 Cdbg(DBE, "con->share_link_filename=%s", con->share_link_filename->ptr); 562 Cdbg(DBE, "con->request.uri=%s", con->request.uri->ptr); 563 564 if(bExpired==0) 565 result = 1; 566 else if(bExpired==1) 567 result = -1; 568 569 } 570 else if(strncmp(con->request.uri->ptr, "/AICLOUD", 8)==0){ 571 int is_illegal = 0; 572 int y = strstr (con->request.uri->ptr+1,"/") - (con->request.uri->ptr); 573 574 //- Not valid share link 575 if( y <= 8 ) 576 return -1; 577 578 Cdbg(DBE, "AICLOUD sharelink, con->request.uri=%s", con->request.uri->ptr); 579 580 buffer* filename = buffer_init(); 581 buffer_copy_string_len(filename, con->request.uri->ptr+y+1, con->request.uri->used-y); 582 buffer_urldecode_path(filename); 583 Cdbg(DBE, "filename=%s", filename->ptr); 584 585 buffer* sharepath = buffer_init(); 586 buffer_copy_string_len(sharepath, con->request.uri->ptr+1, y-1); 587 Cdbg(DBE, "sharepath=%s", sharepath->ptr ); 588 589 share_link_info_t* c=NULL; 590 591 for (c = share_link_info_list; c; c = c->next) { 592 if(buffer_is_equal(c->shortpath, sharepath)){ 593 594 buffer_reset(con->share_link_basic_auth); 595 596 time_t cur_time = time(NULL); 597 double offset = difftime(c->expiretime, cur_time); 598 599 if( c->expiretime!=0 && offset < 0.0 ){ 600 is_illegal = 1; 601 free_share_link_info(c); 602 DLIST_REMOVE(share_link_info_list, c); 603 break; 604 } 605 606 buffer* filename2 = buffer_init(); 607 buffer_copy_buffer(filename2,c->filename); 608 609 int com_result = strncmp( filename->ptr, filename2->ptr, filename2->used-1) ; 610 611 buffer_free(filename2); 612 613 if( com_result!= 0 ){ 614 is_illegal = 1; 615 break; 616 } 617 618 buffer_copy_string( con->share_link_basic_auth, "Basic " ); 619 buffer_append_string_buffer( con->share_link_basic_auth, c->auth ); 620 621 buffer_copy_buffer( con->share_link_shortpath, c->shortpath ); 622 buffer_append_slash(con->share_link_shortpath); 623 624 buffer_copy_buffer( con->share_link_realpath, c->realpath ); 625 buffer_append_slash(con->share_link_realpath); 626 627 buffer_copy_buffer( con->share_link_filename, c->filename ); 628 629 //- share_link_type: 0: none, 1: sharelink for general use, 2: sharelink for router sync 630 con->share_link_type = c->toshare; 631 632 Cdbg(DBE, "realpath=%s, con->request.uri=%s, toShare=%d", c->realpath->ptr, con->request.uri->ptr, c->toshare); 633 634 break; 635 } 636 } 637 638 if(c==NULL||is_illegal==1){ 639 buffer_free(sharepath); 640 buffer_free(filename); 641 return -1; 642 } 643 644 buffer_reset(con->request.uri); 645 646#if 0 647 buffer_copy_string_buffer(con->request.uri, c->realpath); 648 buffer_append_string(con->request.uri, "/"); 649 buffer_append_string_buffer(con->request.uri, filename); 650 //buffer_append_string_buffer(con->request.uri, c->filename); 651#else 652 buffer_copy_string(con->request.uri, ""); 653 buffer_append_string_encoded(con->request.uri, CONST_BUF_LEN(c->realpath), ENCODING_REL_URI); 654 buffer_append_string(con->request.uri, "/"); 655 buffer_append_string_encoded(con->request.uri, CONST_BUF_LEN(filename), ENCODING_REL_URI); 656#endif 657 658 buffer_free(sharepath); 659 buffer_free(filename); 660 661 Cdbg(DBE, "con->share_link_basic_auth=%s", con->share_link_basic_auth->ptr); 662 Cdbg(DBE, "con->share_link_shortpath=%s", con->share_link_shortpath->ptr); 663 Cdbg(DBE, "con->share_link_realpath=%s", con->share_link_realpath->ptr); 664 Cdbg(DBE, "con->share_link_filename=%s", con->share_link_filename->ptr); 665 Cdbg(DBE, "con->request.uri=%s", con->request.uri->ptr); 666 667 if(con->share_link_type==1) 668 log_sys_write(srv, "sbss", "Download file", c->filename, "from ip", con->dst_addr_buf->ptr); 669 670 return 1; 671 } 672 673 return result; 674} 675 676int redirect_mobile_share_link(server *srv, connection *con){ 677 data_string *ds_userAgent = (data_string *)array_get_element(con->request.headers, "user-Agent"); 678 char* aa = get_filename_ext(con->request.uri->ptr); 679 int len = strlen(aa)+1; 680 char* file_ext = (char*)malloc(len); 681 memset(file_ext,'\0', len); 682 strcpy(file_ext, aa); 683 for (int i = 0; file_ext[i]; i++) 684 file_ext[i] = tolower(file_ext[i]); 685 686 if( con->share_link_basic_auth->used && 687 ds_userAgent && 688 con->conf.ssl_enabled && 689 ( //strstr( ds_userAgent->value->ptr, "Chrome" ) || 690 strstr( ds_userAgent->value->ptr, "Android" ) ) ){ 691 692 buffer *out = buffer_init(); 693 response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/html; charset=UTF-8")); 694 695 #if EMBEDDED_EANBLE 696 char* webdav_http_port = nvram_get_webdav_http_port(); 697 #else 698 char* webdav_http_port = "8082"; 699 #endif 700 701 //- https -> http url 702 buffer* redirect_url = buffer_init(); 703 buffer_copy_string_len(redirect_url, CONST_STR_LEN("http://")); 704 705 char* b = strstr(con->request.http_host->ptr, ":"); 706 if(b!=NULL) 707 buffer_append_string_len(redirect_url, con->request.http_host->ptr, b-con->request.http_host->ptr); 708 else 709 buffer_append_string_buffer(redirect_url, con->request.http_host); 710 711 buffer_append_string_len(redirect_url, CONST_STR_LEN(":")); 712 buffer_append_string(redirect_url, webdav_http_port); 713 buffer_append_string_len(redirect_url, CONST_STR_LEN("/")); 714 buffer_append_string_buffer(redirect_url, con->share_link_shortpath); 715 buffer_append_string_encoded(redirect_url, con->share_link_filename->ptr, strlen(con->share_link_filename->ptr), ENCODING_REL_URI); 716 717 Cdbg(DBE, "redirect_url = %s", redirect_url->ptr); 718 719 buffer_append_string_len(out, CONST_STR_LEN("<html>")); 720 buffer_append_string_len(out, CONST_STR_LEN("<head>")); 721 buffer_append_string_len(out, CONST_STR_LEN("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">")); 722 buffer_append_string_len(out, CONST_STR_LEN("<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">")); 723 buffer_append_string_len(out, CONST_STR_LEN("<meta http-equiv=\"refresh\" content=\"0;url=")); 724 buffer_append_string_buffer(out, redirect_url); 725 buffer_append_string_len(out, CONST_STR_LEN("\">")); 726 buffer_append_string_len(out, CONST_STR_LEN("</head>")); 727 buffer_append_string_len(out, CONST_STR_LEN("</html>")); 728 729 buffer_free(redirect_url); 730 731 chunkqueue_append_buffer(con->write_queue, out); 732 buffer_free(out); 733 734 con->file_finished = 1; 735 con->http_status = 200; 736 737 return 1; 738 } 739 else if( con->share_link_basic_auth->used && 740 ds_userAgent && 741 con->conf.ssl_enabled && 742 ( strncmp(file_ext, "mp3", 3) == 0 || 743 strncmp(file_ext, "mp4", 3) == 0 || 744 strncmp(file_ext, "m4v", 3) == 0 ) && 745 ( //strstr( ds_userAgent->value->ptr, "Chrome" ) || 746 //strstr( ds_userAgent->value->ptr, "Android" ) || 747 strstr( ds_userAgent->value->ptr, "iPhone" ) || 748 strstr( ds_userAgent->value->ptr, "iPad" ) || 749 strstr( ds_userAgent->value->ptr, "iPod" ) ) ){ 750 751 buffer *out = buffer_init(); 752 response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/html; charset=UTF-8")); 753 754 #if EMBEDDED_EANBLE 755 char* webdav_http_port = nvram_get_webdav_http_port(); 756 #else 757 char* webdav_http_port = "8082"; 758 #endif 759 760 buffer_append_string_len(out, CONST_STR_LEN("<div id=\"http_port\" content=\"")); 761 buffer_append_string(out, webdav_http_port); 762 buffer_append_string_len(out, CONST_STR_LEN("\"></div>\n")); 763#ifdef APP_IPKG 764#if EMBEDDED_EANBLE 765 free(webdav_http_port); 766#endif 767#endif 768 stat_cache_entry *sce = NULL; 769 770 buffer* html_file = buffer_init(); 771 772#if EMBEDDED_EANBLE 773#ifndef APP_IPKG 774 if( strncmp(file_ext, "mp3", 3) == 0 ) 775 buffer_copy_string(html_file, "/usr/lighttpd/css/iaudio.html"); 776 else if( strncmp(file_ext, "mp4", 3) == 0 || 777 strncmp(file_ext, "m4v", 3) == 0 ) 778 buffer_copy_string(html_file, "/usr/lighttpd/css/ivideo.html"); 779#else 780 if( strncmp(file_ext, "mp3", 3) == 0 ) 781 buffer_copy_string(html_file, "/opt/etc/aicloud_UI/css/iaudio.html"); 782 else if( strncmp(file_ext, "mp4", 3) == 0 || 783 strncmp(file_ext, "m4v", 3) == 0 ) 784 buffer_copy_string(html_file, "/opt/etc/aicloud_UI/css/ivideo.html"); 785#endif 786#else 787 if( strncmp(file_ext, "mp3", 3) == 0 ) 788 buffer_copy_string(html_file, "/usr/css/iaudio.html"); 789 else if( strncmp(file_ext, "mp4", 3) == 0 || 790 strncmp(file_ext, "m4v", 3) == 0 ) 791 buffer_copy_string(html_file, "/usr/css/ivideo.html"); 792#endif 793 794 con->mode = DIRECT; 795 796 chunkqueue_append_buffer(con->write_queue, out); 797 buffer_free(out); 798 799 if (HANDLER_ERROR != stat_cache_get_entry(srv, con, html_file, &sce)) { 800 http_chunk_append_file(srv, con, html_file, 0, sce->st.st_size); 801 response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(sce->content_type)); 802 con->file_finished = 1; 803 con->http_status = 200; 804 } 805 else{ 806 con->file_finished = 1; 807 con->http_status = 404; 808 } 809 810 Cdbg(DBE, "ds_userAgent->value=%s, file_ext=%s, html_file=%s", ds_userAgent->value->ptr, file_ext, html_file->ptr); 811 812 free(file_ext); 813 buffer_free(html_file); 814 815 return 1; 816 } 817 818 free(file_ext); 819 820 return 0; 821} 822 823#define PATCH(x) \ 824 p->conf.x = s->x; 825static int mod_aicloud_sharelink_parser_patch_connection(server *srv, connection *con, plugin_data *p) { 826 size_t i, j; 827 plugin_config *s = p->config_storage[0]; 828 829 PATCH(alias); 830 //Cdbg(1, "mod_aicloud_sharelink_parser_patch_connection.........."); 831#if EMBEDDED_EANBLE 832 char *usbdiskname = nvram_get_productid(); 833#else 834 char *usbdiskname = "usbdisk"; 835#endif 836 837 //Cdbg(1, "2, srv->config_context->used=%d", srv->config_context->used); 838 839 /* skip the first, the global context */ 840 for (i = 1; i < srv->config_context->used; i++) { 841 data_config *dc = (data_config *)srv->config_context->data[i]; 842 s = p->config_storage[i]; 843 844 //Cdbg(1, "1, dc->string->ptr=%s", dc->string->ptr); 845 846 /* condition didn't match */ 847 //if (!config_check_cond(srv, con, dc)) continue; 848 //Cdbg(1, "2, dc->string->ptr=%s, usbdiskname=%s", dc->string->ptr, usbdiskname); 849 if(strstr(dc->string->ptr, usbdiskname)==NULL) 850 continue; 851 //Cdbg(1, "3"); 852 /* merge config */ 853 for (j = 0; j < dc->value->used; j++) { 854 data_unset *du = dc->value->data[j]; 855 856 if (buffer_is_equal_string(du->key, CONST_STR_LEN("alias.url"))) { 857 //Cdbg(1, "du->key=%s", du->key->ptr); 858 PATCH(alias); 859 } 860 } 861 } 862 863#if EMBEDDED_EANBLE 864#ifdef APP_IPKG 865 free(usbdiskname); 866#endif 867#endif 868 869 return 0; 870} 871#undef PATCH 872 873//URIHANDLER_FUNC(mod_aicloud_sharelink_parser_physical_handler){ 874PHYSICALPATH_FUNC(mod_aicloud_sharelink_parser_physical_handler) { 875 876 plugin_data *p = p_d; 877 int s_len; 878 size_t k; 879 int uri_len, basedir_len; 880 char *uri_ptr; 881 882 if (con->mode != SMB_BASIC&&con->mode != DIRECT) return HANDLER_GO_ON; 883 884 if (con->uri.path->used == 0) return HANDLER_GO_ON; 885 886 //- If url is encrypted share link, then use basic auth 887 int result = parser_share_link(srv, con); 888 if( result == -1 ){ 889 con->http_status = 404; 890 return HANDLER_FINISHED; 891 } 892 else if( result == 0 ) 893 return HANDLER_GO_ON; 894 895 /* not found */ 896 return HANDLER_GO_ON; 897} 898#ifndef APP_IPKG 899int mod_aicloud_sharelink_parser_plugin_init(plugin *p); 900int mod_aicloud_sharelink_parser_plugin_init(plugin *p) { 901 p->version = LIGHTTPD_VERSION_ID; 902 p->name = buffer_init_string("mod_aicloud_sharelink_parser"); 903 904 p->init = mod_aicloud_sharelink_parser_init; 905 p->set_defaults = mod_aicloud_sharelink_parser_set_defaults; 906 p->handle_physical = mod_aicloud_sharelink_parser_physical_handler; 907 p->cleanup = mod_aicloud_sharelink_parser_free; 908 909 p->data = NULL; 910 911 return 0; 912} 913#else 914int aicloud_mod_aicloud_sharelink_parser_plugin_init(plugin *p); 915int aicloud_mod_aicloud_sharelink_parser_plugin_init(plugin *p) { 916 p->version = LIGHTTPD_VERSION_ID; 917 p->name = buffer_init_string("mod_aicloud_sharelink_parser"); 918 919 p->init = mod_aicloud_sharelink_parser_init; 920 p->set_defaults = mod_aicloud_sharelink_parser_set_defaults; 921 p->handle_physical = mod_aicloud_sharelink_parser_physical_handler; 922 p->cleanup = mod_aicloud_sharelink_parser_free; 923 924 p->data = NULL; 925 926 return 0; 927} 928#endif 929