Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 102 additions & 34 deletions file_controller.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ void add_lock(const HttpRequestPtr &req, std::function<void(const HttpResponsePt
}
std::string shell_commons(const char *cmd)
{
char buffer[128];
char buffer[1280];
std::string result = "";
FILE *pipe = popen(cmd, "r");
if (!pipe)
Expand All @@ -45,44 +45,110 @@ std::string shell_commons(const char *cmd)
return result;
}

void genTree(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
void commondsCtrl(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{
auto res = HttpResponse::newHttpResponse();
if (jwtVerify(req))

std::cout << "commondsCtrl" << std::endl;
enum Command {
tree,
cp,
mv,
rm,
mkdir,
touch,
cat
}command;
char *pathvar;
pathvar = getenv("PWD");

command = static_cast<Command>(stoi(req->getJsonObject()->get("command","").asString()));
std::string params1 = req->getJsonObject()->get("params","")[0].asString();
std::string params2 = req->getJsonObject()->get("params","")[1].asString();
std::string result;
switch (command)
{
char *pathvar;
pathvar = getenv("PWD");
std::string result = shell_commons(("cd " + std::string(pathvar) + "/.. " + "&&" + "tree -J root").c_str());
res->addHeader("Access-Control-Allow-Origin", "*");
res->setBody(result);
callback(res);
}
else{
res->setBody("No Authorization");
case tree:
result = shell_commons(("cd " + std::string(pathvar) + "/.. " + "&&" + "tree -J root").c_str());
break;
case cp:
result = shell_commons(("cp -v " + std::string(pathvar) + "/../root/" + params1 + " " + std::string(pathvar) + "/../root/" + params2).c_str());
if(result!="")
result = "success";
else
result = "error: in cp" ;
break;
case mv:
result = shell_commons(("mv -v " + std::string(pathvar) + "/../root/" + params1 + " " + std::string(pathvar) + "/../root/" + params2).c_str());
if(result!="")
result = "success";
else
result = "error: in mv" ;
break;
case rm:
if(params1.find("..") != std::string::npos){
result = "error:result in wrong directory";
break;
}
result = shell_commons(("rm -rf -v " + std::string(pathvar) + "/../root/" + params1).c_str());
if(result!="")
result = "success";
else
result = "error: in rm" ;
break;
case mkdir:
result = shell_commons(("mkdir " + std::string(pathvar) + "/../root/" + params1).c_str());
if(result!="")
result = "success";
else
result = "error: in mkdir" ;
break;
case touch:
if("" == shell_commons(("ls -l " + std::string(pathvar) + "/../root/" + params1 + " grep ^- ").c_str()))
{
result = shell_commons(("touch " + std::string(pathvar) + "/../root/" + params1).c_str());
result = "success";
}

else
{
result = "error:file already exists";
}
break;
case cat:
result = shell_commons(("cat " + std::string(pathvar) + "/../root/" + params1).c_str());
break;
default:
result = "error:command not found";
break;
}
}

void catFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{

auto res = HttpResponse::newHttpResponse();
if (jwtVerify(req))
{
char *pathvar;
pathvar = getenv("PWD");
std::string path = req->getParameter("path");
std::string result = shell_commons(("cat " + std::string(pathvar) + "/../root/" + path).c_str());
res->addHeader("Access-Control-Allow-Origin", "*");
res->setBody(result);
callback(res);

res->addHeader("Access-Control-Allow-Origin", "*");
res->setBody(result);

callback(res);
}
else
{
res->setBody("No Authorization");
}
}
// void genTree(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
// {
// char *pathvar;
// pathvar = getenv("PWD");
// std::string result = shell_commons(("cd " + std::string(pathvar) + "/.. " + "&&" + "tree -J root").c_str());
// auto res = HttpResponse::newHttpResponse();
// res->addHeader("Access-Control-Allow-Origin", "*");
// res->setBody(result);
// callback(res);
// }
// void catFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
// {
// char *pathvar;
// pathvar = getenv("PWD");
// std::string path = req->getParameter("path");
// std::string result = shell_commons(("cat " + std::string(pathvar) + "/../root/" + path).c_str());
// auto res = HttpResponse::newHttpResponse();
// res->addHeader("Access-Control-Allow-Origin", "*");
// res->setBody(result);
// callback(res);
// }


void saveFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{
Expand Down Expand Up @@ -155,6 +221,7 @@ void getPicture(const HttpRequestPtr &req, std::function<void(const HttpResponse
{
std::string filename = req->getParameter("filename");
auto resp = HttpResponse::newFileResponse("./uploads/" + filename);

if (jwtVerify(req))
{
resp->addHeader("Access-Control-Allow-Origin", "*");
Expand All @@ -164,4 +231,5 @@ void getPicture(const HttpRequestPtr &req, std::function<void(const HttpResponse
{
resp->setBody("No Authorization");
}
}
}

8 changes: 6 additions & 2 deletions file_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
#include <drogon/drogon.h>
using namespace drogon;
std::string shell_commons(const char *cmd);
void genTree(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
void catFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
// void genTree(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
// void catFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
void saveFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
void imageUpload(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
void getPicture(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);

void commondsCtrl(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);

void add_lock(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);

// std::string
#endif
16 changes: 12 additions & 4 deletions main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,13 @@ int main()
{ friend_operation(req, std::move(callback)); });
drogon::app().registerHandler("/api/info", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{ info(req, std::move(callback)); });
drogon::app().registerHandler("/api/file/tree", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{ genTree(req, std::move(callback)); });
drogon::app().registerHandler("/api/file/cat", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{ catFile(req, std::move(callback)); });


// drogon::app().registerHandler("/api/file/tree", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
// { genTree(req, std::move(callback)); });
// drogon::app().registerHandler("/api/file/cat", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
// { catFile(req, std::move(callback)); });

drogon::app().registerHandler("/api/file/save", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{ saveFile(req, std::move(callback)); });
drogon::app().registerHandler("/api/avatar", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
Expand All @@ -38,8 +41,13 @@ int main()
drogon::app().registerHandler("/api/file/get", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{ getPicture(req, std::move(callback)); },
{Get});

drogon::app().registerHandler("/api/file/commonds", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{ commondsCtrl(req, std::move(callback)); });

drogon::app().registerHandler("/api/file/lock", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
{add_lock(req, std::move(callback));});

drogon::app().setUploadPath("./uploads").run();
return 0;
}