Skip to content

Commit a314773

Browse files
fix jwt encode bug, add upload/get picture
1 parent f7bb928 commit a314773

File tree

7 files changed

+100
-77
lines changed

7 files changed

+100
-77
lines changed

file_controller.cc

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,31 @@
88
#include <stdexcept>
99
#include <string>
1010

11-
std::string shell_commons(const char *cmd) {
11+
std::string shell_commons(const char *cmd)
12+
{
1213
char buffer[128];
1314
std::string result = "";
1415
FILE *pipe = popen(cmd, "r");
15-
if (!pipe) throw std::runtime_error("popen() failed!");
16-
try {
17-
while (fgets(buffer, sizeof buffer, pipe) != NULL) {
16+
if (!pipe)
17+
throw std::runtime_error("popen() failed!");
18+
try
19+
{
20+
while (fgets(buffer, sizeof buffer, pipe) != NULL)
21+
{
1822
result += buffer;
1923
}
20-
} catch (...) {
24+
}
25+
catch (...)
26+
{
2127
pclose(pipe);
2228
throw;
2329
}
2430
pclose(pipe);
2531
return result;
2632
}
2733

28-
void genTree(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
34+
void genTree(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
35+
{
2936
char *pathvar;
3037
pathvar = getenv("PWD");
3138
std::string result = shell_commons(("cd " + std::string(pathvar) + "/.. " + "&&" + "tree -J root").c_str());
@@ -34,7 +41,8 @@ void genTree(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr
3441
res->setBody(result);
3542
callback(res);
3643
}
37-
void catFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
44+
void catFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
45+
{
3846
char *pathvar;
3947
pathvar = getenv("PWD");
4048
std::string path = req->getParameter("path");
@@ -44,12 +52,14 @@ void catFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr
4452
res->setBody(result);
4553
callback(res);
4654
}
47-
void saveFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
55+
void saveFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
56+
{
4857
auto body = req->getBody();
4958
Json::Value req_json;
5059
Json::Reader reader;
5160
std::string bodyStr(body);
52-
if (!reader.parse(bodyStr, req_json)) {
61+
if (!reader.parse(bodyStr, req_json))
62+
{
5363
std::cout << "parse failed" << std::endl;
5464
callback(HttpResponse::newHttpResponse());
5565
return;
@@ -64,21 +74,28 @@ void saveFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePt
6474
res->setBody("success");
6575
callback(res);
6676
}
67-
void imageUpload(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
77+
78+
void imageUpload(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
79+
{
6880
MultiPartParser fileUpload;
69-
if (fileUpload.parse(req) != 0 || fileUpload.getFiles().size() != 1) {
81+
if (fileUpload.parse(req) != 0 || fileUpload.getFiles().size() != 1)
82+
{
7083
auto resp = HttpResponse::newHttpResponse();
7184
resp->setBody("Must only be one file");
7285
resp->setStatusCode(k403Forbidden);
7386
callback(resp);
7487
return;
7588
}
7689
auto &file = fileUpload.getFiles()[0];
77-
auto md5 = file.getMd5();
90+
auto now = std::chrono::system_clock::now();
91+
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
92+
std::string timestamp = std::to_string(ms) + '.' + std::string(file.getFileExtension());
7893
auto resp = HttpResponse::newHttpResponse();
79-
resp->setBody(
80-
"The server has calculated the file's MD5 hash to be " + md5);
94+
resp->addHeader("Access-Control-Allow-Origin", "*");
95+
resp->setBody(timestamp);
8196
file.save();
97+
shell_commons(("mv ./uploads/" + file.getFileName() + " ./uploads/" + timestamp).c_str());
98+
8299
LOG_INFO << "The uploaded file has been saved to the ./uploads "
83100
"directory";
84101
callback(resp);
@@ -97,4 +114,11 @@ void imageUpload(const HttpRequestPtr &req, std::function<void(const HttpRespons
97114
// Json::Value resp;
98115
// resp["filename"] = fileName;
99116
// callback(HttpResponse::newHttpJsonResponse(resp));
117+
}
118+
void getPicture(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
119+
{
120+
std::string filename = req->getParameter("filename");
121+
auto resp = HttpResponse::newFileResponse("./uploads/" + filename);
122+
resp->addHeader("Access-Control-Allow-Origin", "*");
123+
callback(resp);
100124
}

file_controller.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
#include <string>
44
#include <drogon/drogon.h>
55
using namespace drogon;
6-
std::string shell_commons(const char* cmd);
6+
std::string shell_commons(const char *cmd);
77
void genTree(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
88
void catFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
99
void saveFile(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
1010
void imageUpload(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
11-
//std::string
11+
void getPicture(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback);
12+
// std::string
1213
#endif

jwt_controller.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <drogon/drogon.h>
33
#include <jwt-cpp/jwt.h>
44
#include <cstring>
5+
#include <iomanip>
56
#include <chrono>
67
#include "jwt_controller.h"
78

main.cc

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,40 @@
44
#include "user_controller.h"
55
#include "file_controller.h"
66
#include <drogon/WebSocketController.h>
7+
78
using namespace drogon;
89
std::unordered_map<std::string, WebSocketConnectionPtr> clientTable;
9-
int main() {
10+
int main()
11+
{
1012
drogon::app().addListener("0.0.0.0", 8081);
1113
std::cout << "ready" << std::endl;
12-
drogon::app().registerHandler("/api/signup", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
13-
Handle(req, std::move(callback),registerUser);
14-
});
15-
drogon::app().registerHandler("/api/login", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
16-
Handle(req, std::move(callback),loginUser);
17-
});
18-
drogon::app().registerHandler("/api/chat", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
19-
chat(req, std::move(callback));
20-
});
21-
drogon::app().registerHandler("/api/check", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
22-
check(req, std::move(callback));
23-
});
24-
drogon::app().registerHandler("/api/nfmgr", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
25-
request_processing(req, std::move(callback));
26-
});
27-
drogon::app().registerHandler("/api/newfriends", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
28-
friend_operation(req, std::move(callback));
29-
});
30-
drogon::app().registerHandler("/api/info", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
31-
info(req, std::move(callback));
32-
});
14+
drogon::app().registerHandler("/api/signup", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
15+
{ Handle(req, std::move(callback), registerUser); });
16+
drogon::app().registerHandler("/api/login", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
17+
{ Handle(req, std::move(callback), loginUser); });
18+
drogon::app().registerHandler("/api/chat", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
19+
{ chat(req, std::move(callback)); });
20+
drogon::app().registerHandler("/api/check", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
21+
{ check(req, std::move(callback)); });
22+
drogon::app().registerHandler("/api/nfmgr", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
23+
{ request_processing(req, std::move(callback)); });
24+
drogon::app().registerHandler("/api/newfriends", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
25+
{ friend_operation(req, std::move(callback)); });
26+
drogon::app().registerHandler("/api/info", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
27+
{ info(req, std::move(callback)); });
3328

34-
drogon::app().registerHandler("/api/file/tree", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
35-
genTree(req, std::move(callback));
36-
});
37-
drogon::app().registerHandler("/api/file/cat", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
38-
catFile(req, std::move(callback));
39-
});
40-
drogon::app().registerHandler("/api/file/save", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
41-
saveFile(req, std::move(callback));
42-
});
43-
drogon::app().registerHandler("/api/avatar", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
44-
avatar(req, std::move(callback));
45-
});
46-
drogon::app().registerHandler("/api/upload", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) {
47-
imageUpload(req, std::move(callback));
48-
});
29+
drogon::app().registerHandler("/api/file/tree", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
30+
{ genTree(req, std::move(callback)); });
31+
drogon::app().registerHandler("/api/file/cat", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
32+
{ catFile(req, std::move(callback)); });
33+
drogon::app().registerHandler("/api/file/save", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
34+
{ saveFile(req, std::move(callback)); });
35+
drogon::app().registerHandler("/api/avatar", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
36+
{ avatar(req, std::move(callback)); });
37+
drogon::app().registerHandler("/api/upload", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
38+
{ imageUpload(req, std::move(callback)); });
39+
drogon::app().registerHandler("/api/file/get", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
40+
{ getPicture(req, std::move(callback)); }, {Get});
4941
drogon::app().setUploadPath("./uploads").run();
5042
return 0;
5143
}
52-

mysql.cc

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,41 @@
44
#include "jdbc/mysql_driver.h"
55
#include "json/json.h"
66
// relate to chat
7-
void process(sql::PreparedStatement *readdatament ,std::vector<std::string> s,sql::Connection *con){
8-
for(int i=0;i<2;i++){
9-
readdatament->setString(1, s[i]);
10-
sql::ResultSet *resultSet = readdatament->executeQuery();
11-
std::string friendlist;
12-
if (resultSet->next())
7+
void process(sql::PreparedStatement *readdatament, std::vector<std::string> s, sql::Connection *con)
8+
{
9+
for (int i = 0; i < 2; i++)
1310
{
14-
friendlist = resultSet->getString("friends");
15-
}
16-
int pos = friendlist.find(s[i+1]);
17-
if (pos != std::string::npos && pos != 0)
18-
friendlist.erase(pos - 1, s[i+1].length() + 1);
19-
else if (pos == 0)
20-
friendlist.erase(pos, s[i+1].length() + 1);
21-
std::string changedata = "UPDATE users SET friends=? WHERE username =?";
22-
sql::PreparedStatement *updateStatement = con->prepareStatement(changedata);
23-
updateStatement->setString(1, friendlist);
24-
updateStatement->setString(2, s[i]);
25-
updateStatement->execute();
11+
readdatament->setString(1, s[i]);
12+
sql::ResultSet *resultSet = readdatament->executeQuery();
13+
std::string friendlist;
14+
if (resultSet->next())
15+
{
16+
friendlist = resultSet->getString("friends");
17+
}
18+
int pos = friendlist.find(s[i + 1]);
19+
if (pos != std::string::npos && pos != 0)
20+
friendlist.erase(pos - 1, s[i + 1].length() + 1);
21+
else if (pos == 0)
22+
friendlist.erase(pos, s[i + 1].length() + 1);
23+
std::string changedata = "UPDATE users SET friends=? WHERE username =?";
24+
sql::PreparedStatement *updateStatement = con->prepareStatement(changedata);
25+
updateStatement->setString(1, friendlist);
26+
updateStatement->setString(2, s[i]);
27+
updateStatement->execute();
2628
}
2729
}
2830
void sql_delete_operation(std::string sender, std::string receiver)
29-
{
31+
{
3032
sql::mysql::MySQL_Driver *driver = sql::mysql::get_mysql_driver_instance();
3133
sql::Connection *con = driver->connect("tcp://8.130.48.157:3306", "root", "abc.123");
3234
con->setSchema("flypen");
3335
std::vector<std::string> s;
3436
s.push_back(sender);
3537
s.push_back(receiver);
3638
std::string readdata = "SELECT friends FROM users WHERE username = ?";
37-
39+
3840
sql::PreparedStatement *readdatament = con->prepareStatement(readdata);
39-
process(readdatament ,s,con);
41+
process(readdatament, s, con);
4042
}
4143
void sql_process_request(std::string sender, std::string receiver, std::string attitude)
4244
{
@@ -442,7 +444,7 @@ bool sql_check(std::string user, std::string passwd)
442444
Json::Value sql_find_my_msg(std::string me)
443445

444446
{
445-
std::cout << "login user: " << me << std::endl;
447+
// std::cout << "login user: " << me << std::endl;
446448
try
447449
{
448450
sql::mysql::MySQL_Driver *driver = sql::mysql::get_mysql_driver_instance();

root/lgy

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
123
1+
ok![](http://127.0.0.1:8081/api/file/get?filename=1695257143488.png)
2+
3+
4+

user_controller.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <drogon/drogon.h>
22
#include <json/json.h>
33
#include "mysql.h"
4+
#include <iomanip>
45
#include <openssl/sha.h>
56
#include "jwt_controller.h"
67
#include "msg_controller.h"

0 commit comments

Comments
 (0)