• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/lighttpd-1.4.39/src/
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