ant-http/plugins/fileman/fileman.c
2016-10-29 15:02:16 +02:00

215 lines
4.7 KiB
C

#include "../plugin.h"
#define MAXSIZE 500000
#define FRECORD "{\"recid\":%d,\"name\":\"%s\",\"size\":%d,\"changed\":\"%s\",\"type\":%d,\"style\":\"%s\",\"mime\":\"%s\"}"
#define RRECORD "{ \"records\":[%s], \"total\":%d,\"folder\":\"%s\",\"router\":[%s]}"
#define FOLLIST "{ \"name\":\"%s\", \"path\":\"%s\"}"
char* folder_list_from(const char* aPath)
{
if(aPath == NULL || strlen(aPath)==0 || strcmp(aPath,DIR_SEP)==0)
return __s(FOLLIST,"HTDOCS",DIR_SEP);
list path = split(aPath,DIR_SEP);
char* flist=__s(FOLLIST,"HTDOCS",DIR_SEP);
char* route = "";
if(path)
{
for(list np = path; np != NULL; np=np->next)
{
route = __s("%s%s%s", route, DIR_SEP, np->value.s);
if(flist == NULL)
flist = __s(FOLLIST, np->value.s,route);
else
flist = __s("%s,%s", flist,__s(FOLLIST,np->value.s,route));
}
}
free(path);
//free(route);
return flist;
}
void execute(int client,const char* method,dictionary rq)
{
DIR *d;
struct dirent *dir;
struct stat st;
int frec=0,rrec = 0, id =0;
char* flist = "",*dlist = "";
char* tmp= NULL;
char* rpath = R_STR(rq,"path");
if(!rpath || strlen(rpath) == 0) rpath = DIR_SEP;
char* path = __s("%s%s",__plugin__.htdocs,rpath);
d = opendir(path);
if (d)
{
while ((dir = readdir(d)) != NULL)
{
//ignore curent directory, parent directory and hidden files and folders
if(strcmp(dir->d_name,".") == 0 ||
strcmp(dir->d_name,"..")==0|| *(dir->d_name)=='.') continue;
if( stat(__s("%s%s%s",path,DIR_SEP,dir->d_name), &st) == 0 )
{
if(S_ISDIR(st.st_mode))
{
tmp = __s(FRECORD,id,
dir->d_name,
(int)st.st_size,
__time(st.st_mtime),
0,
"font-weight: bold;",
"folder");
if(rrec != 0)
dlist = __s("%s,%s",dlist,tmp);
else
dlist = tmp;
rrec++;
//free(tmp);
} else
{
tmp = __s(FRECORD, id,
dir->d_name,
(int)st.st_size,
__time(st.st_mtime),1,"",
mime(dir->d_name));
if(frec != 0)
flist = __s("%s,%s",flist,tmp);
else
flist = tmp;
frec++;
//free(tmp);
}
id++;
}
}
closedir(d);
if(strlen(dlist) == 0)
dlist = flist;
else if(strlen(flist) > 0)
dlist = __s("%s,%s",dlist,flist);
}
json(client);
__t(client,RRECORD,dlist,frec+rrec,rpath,folder_list_from(rpath));
//if(path) free(path);
//if(rpath) free(rpath);
if(tmp) free(tmp);
}
void add(int c, const char* m, dictionary rq)
{
json(c);
if(IS_GET(m))
{
__t(c,__RESULT__,0,"Bad request:GET");
return;
}
char* rpath = R_STR(rq,"path");
if(!rpath)
{
__t(c,__RESULT__,0,"Unknow path");
return;
}
char * file_name = R_STR(rq,"pfile.file");
if(file_name == NULL)
{
__t(c,__RESULT__,0,"Cannot send file to server");
return;
}
int size = R_INT(rq,"pfile.size");
if(size>MAXSIZE)
{
__t(c,__RESULT__,0,"Cannot accept file more than 500Kb");
return;
}
if(!upload(R_STR(rq,"pfile.tmp"),__s("%s/%s/%s",__plugin__.htdocs,rpath,file_name)))
{
__t(c,__RESULT__,0,"Cannot move file to plugin dir");
return;
}
__t(c,__RESULT__,1,"OK");
return;
}
void mkfolder(int c, const char* m, dictionary rq)
{
json(c);
if(IS_GET(m))
{
__t(c,__RESULT__,0,"Bad request:GET");
return;
}
char* dname = R_STR(rq,"dname");
char* rpath = R_STR(rq, "path");
if(!dname)
{
__t(c,__RESULT__,0,"Folder name is empty");
return;
}
if(!rpath)
{
__t(c,__RESULT__,0,"Unknow path");
return;
}
if(mkdir(__s("%s%s%s%s",__plugin__.htdocs,rpath,DIR_SEP,dname), 0755))
{
__t(c,__RESULT__,0,"Error when create directory.");
return;
}
__t(c,__RESULT__,1,"OK");
}
void rmfolder(int c, const char* m, dictionary rq)
{
json(c);
if(IS_GET(m))
{
__t(c,__RESULT__,0,"Bad request:GET");
return;
}
char* name = R_STR(rq,"name");
char* rpath = R_STR(rq, "path");
if(!name)
{
__t(c,__RESULT__,0,"Folder name is empty");
return;
}
if(!rpath)
{
__t(c,__RESULT__,0,"Unknow path");
return;
}
removeAll(__s("%s%s%s%s",__plugin__.htdocs,rpath,DIR_SEP,name),1);
//LOG("%s\n",name );
//LOG("%s\n",rpath );
__t(c,__RESULT__,1,"OK");
}
void pexit()
{
LOG("Exit file manager,plugins\n");
}
void handler(int client, const char* method, const char* rqpth, dictionary rq)
{
if(EQU(rqpth,"default"))
{
execute(client,method,rq);
}
else if(EQU(rqpth,"add"))
{
add(client,method,rq);
}
else if(EQU(rqpth,"rmfolder"))
{
rmfolder(client,method,rq);
}
else if(EQU(rqpth,"mkfolder"))
{
mkfolder(client,method,rq);
}
else
{
unknow(client);
}
}