Skip to content

Commit 1e9b17a

Browse files
committed
added uploader library
modified: uploader/CMakeLists.txt modified: uploader/include/wiki.hpp modified: uploader/lib/libwiki.cpp modified: uploader/test/csrf.cpp modified: uploader/test/login.cpp modified: uploader/test/token.cpp new file: uploader/test/upload_existing.cpp
1 parent 388e206 commit 1e9b17a

File tree

7 files changed

+118
-31
lines changed

7 files changed

+118
-31
lines changed

uploader/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@ add_test(NAME login COMMAND .login)
2323
add_executable(.csrf test/csrf.cpp)
2424
target_link_libraries(.csrf wiki)
2525
add_test(NAME csrf COMMAND .csrf)
26+
add_executable(.upload_existing test/upload_existing.cpp)
27+
target_link_libraries(.upload_existing wiki)
28+
add_test(NAME upload_existing COMMAND .upload_existing)

uploader/include/wiki.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
#include<nlohmann/json.hpp>
66
namespace wiki{
77
std::string get(curlpp::Easy &request);
8-
std::string get(const std::string &url,const std::list<std::string> &header={});
8+
void init_request(curlpp::Easy &request,const std::string &url,const std::vector<std::pair<std::string,std::string>> &formstr,const std::list<std::string> &header={});
99
std::string get_login_token(const std::string &api,const std::string &cookiejar_path,const std::list<std::string> &header={});
10-
std::string get_csrf_token(const std::string &api,const std::string &cookie_path,const std::list<std::string> &header={});
10+
std::string get_csrf_token(const std::string &api,const std::string &login_cookie_path,const std::string &csrf_cookie_path,const std::list<std::string> &header={});
1111
std::string login(const std::string &api,const std::string &cookie_path,const std::string &username,const std::string &password,const std::string &login_token,const std::list<std::string> &header={});
12+
nlohmann::json upload(const std::string &api,const std::string &cookie_path,const std::string &file_name,const std::string &file_path,const std::string &csrf_token,const std::list<std::string> &header={});
1213
}

uploader/lib/libwiki.cpp

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,42 +14,67 @@ std::string wiki::get(curlpp::Easy &request){
1414
request.perform();
1515
return response.str();
1616
}
17-
std::string wiki::get(const std::string &url,const std::list<std::string> &header){
18-
curlpp::Easy request;
17+
void wiki::init_request(curlpp::Easy &request,const std::string &url,const std::vector<std::pair<std::string,std::string>> &formstr,const std::list<std::string> &header){
1918
request.setOpt<curlpp::Options::Url>(url);
2019
request.setOpt<curlpp::Options::HttpHeader>(header);
21-
return get(request);
20+
curlpp::Forms form;
21+
for(const std::pair<std::string,std::string> &it:formstr)
22+
form.push_back(new curlpp::FormParts::Content(it.first,it.second));
23+
request.setOpt<curlpp::Options::HttpPost>(form);
2224
}
2325
std::string wiki::get_login_token(const std::string &api,const std::string &cookiejar_path,const std::list<std::string> &header){
2426
curlpp::Easy request;
25-
request.setOpt<curlpp::Options::Url>(api+"?format=json&action=query&meta=tokens&type=login");
2627
request.setOpt<curlpp::Options::CookieJar>(cookiejar_path);
2728
request.setOpt<curlpp::Options::HttpHeader>(header);
29+
init_request(
30+
request,
31+
api+"?format=json",
32+
{{"action","query"},{"meta","tokens"},{"type","login"}},
33+
header
34+
);
2835
nlohmann::json response=nlohmann::json::parse(wiki::get(request));
29-
const std::string token=response["query"]["tokens"]["logintoken"];
30-
return token;
36+
return response["query"]["tokens"]["logintoken"];
3137
}
32-
std::string wiki::get_csrf_token(const std::string &api,const std::string &cookie_path,const std::list<std::string> &header){
38+
std::string wiki::get_csrf_token(const std::string &api,const std::string &login_cookie_path,const std::string &csrf_cookie_path,const std::list<std::string> &header){
3339
curlpp::Easy request;
34-
request.setOpt<curlpp::Options::Url>(api+"?format=json&action=query&meta=tokens&type=csrf");
35-
request.setOpt<curlpp::Options::CookieFile>(cookie_path);
40+
request.setOpt<curlpp::Options::CookieFile>(login_cookie_path);
41+
request.setOpt<curlpp::Options::CookieJar>(csrf_cookie_path);
3642
request.setOpt<curlpp::Options::HttpHeader>(header);
43+
init_request(
44+
request,
45+
api+"?format=json",
46+
{{"action","query"},{"meta","tokens"},{"type","csrf"}},
47+
header
48+
);
3749
nlohmann::json response=nlohmann::json::parse(wiki::get(request));
38-
const std::string token=response["query"]["tokens"]["csrftoken"];
39-
return token;
50+
return response["query"]["tokens"]["csrftoken"];
4051
}
4152
std::string wiki::login(const std::string &api,const std::string &cookie_path,const std::string &username,const std::string &password,const std::string &login_token,const std::list<std::string> &header){
4253
curlpp::Easy request;
43-
request.setOpt<curlpp::Options::Url>(api+"?format=json&action=login");
4454
request.setOpt<curlpp::Options::CookieFile>(cookie_path);
4555
request.setOpt<curlpp::Options::CookieJar>(cookie_path);
46-
curlpp::Forms form;
47-
form.push_back(new curlpp::FormParts::Content("format","json"));
48-
form.push_back(new curlpp::FormParts::Content("action","login"));
49-
form.push_back(new curlpp::FormParts::Content("lgname",username));
50-
form.push_back(new curlpp::FormParts::Content("lgpassword",password));
51-
form.push_back(new curlpp::FormParts::Content("lgtoken",login_token));
52-
request.setOpt<curlpp::Options::HttpPost>(form);
53-
request.setOpt<curlpp::Options::HttpHeader>(header);
56+
init_request(
57+
request,
58+
api+"?format=json&action=login",
59+
{{"format","json"},{"action","login"},{"lgname",username},{"lgpassword",password},{"lgtoken",login_token}},
60+
header
61+
);
5462
return wiki::get(request);
5563
}
64+
nlohmann::json wiki::upload(const std::string &api,const std::string &cookie_path,const std::string &file_name,const std::string &file_path,const std::string &csrf_token,const std::list<std::string> &header){
65+
curlpp::Easy request;
66+
request.setOpt<curlpp::Options::CookieFile>(cookie_path);
67+
init_request(
68+
request,
69+
api+"?format=json",
70+
{
71+
{"action","upload"},
72+
{"filename",file_name},
73+
{"file",std::string{"@"}+file_path},
74+
{"token",csrf_token}
75+
},
76+
header
77+
);
78+
nlohmann::json response=nlohmann::json::parse(wiki::get(request));
79+
return response;
80+
}

uploader/test/csrf.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,16 @@
77
#include"wiki.hpp"
88
int main(){
99
try{
10-
const std::string api="http://localhost/api.php";
11-
const std::string login_token=wiki::get_login_token(api,"/tmp/wiki_login_cookies");
12-
const nlohmann::json result=nlohmann::json::parse(wiki::login(api,"/tmp/wiki_login_cookies","CppHusky@uploader",std::getenv("WIKIPASS_UPLOADER"),login_token));
13-
const std::string csrf_token=wiki::get_csrf_token(api,"/tmp/wiki_login_cookies");
10+
const std::string API="http://localhost:8080/api.php";
11+
const std::string login_token=wiki::get_login_token(API,"/tmp/wiki_login_cookies");
12+
wiki::login(
13+
API,
14+
"/tmp/wiki_login_cookies",
15+
"CppHusky@uploader",
16+
std::getenv("WIKIPASS_UPLOADER"),
17+
login_token
18+
);
19+
const std::string csrf_token=wiki::get_csrf_token(API,"/tmp/wiki_login_cookies","/tmp/wiki_csrf_cookies");
1420
std::clog<<csrf_token<<std::endl;
1521
assert(csrf_token.length()==42);
1622
assert(csrf_token.ends_with("+\\"));

uploader/test/login.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@
55
#include<string>
66
#include<nlohmann/json.hpp>
77
#include"wiki.hpp"
8+
const std::string API="http://localhost:8080/api.php";
89
int main(){
910
try{
10-
const std::string api="http://localhost/api.php";
11-
const std::string login_token=wiki::get_login_token(api,"/tmp/wiki_login_cookies");
12-
const nlohmann::json result=nlohmann::json::parse(wiki::login(api,"/tmp/wiki_login_cookies","CppHusky@uploader",std::getenv("WIKIPASS_UPLOADER"),login_token));
11+
const std::string login_token=wiki::get_login_token(API,"/tmp/wiki_login_cookies");
12+
const nlohmann::json result=nlohmann::json::parse(wiki::login(
13+
API,
14+
"/tmp/wiki_login_cookies",
15+
"CppHusky@uploader",
16+
std::getenv("WIKIPASS_UPLOADER"),
17+
login_token
18+
));
1319
std::clog<<result<<std::endl;
1420
assert(result["login"]["result"]=="Success");
1521
}catch(const curlpp::RuntimeError &e){

uploader/test/token.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@
77
#include"wiki.hpp"
88
int main(){
99
try{
10-
const std::string api="https://wiki.byrdocs.org/api.php";
10+
const std::string API="http://localhost:8080/api.php";
1111
const std::list<std::string> header{std::format("X-Byrdocs-Token:{}",std::getenv("WIKITOKEN"))};
12-
const std::string login_token=wiki::get_login_token(api,"/tmp/wiki_login_cookies",header);
12+
const std::string login_token=wiki::get_login_token(
13+
API,
14+
"/tmp/wiki_login_cookies",
15+
header
16+
);
1317
std::clog<<login_token<<std::endl;
1418
assert(login_token.length()==42);
1519
assert(login_token.ends_with("+\\"));

uploader/test/upload_existing.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include<cstdlib>
2+
#include<exception>
3+
#include<format>
4+
#include<iostream>
5+
#include<string>
6+
#include<nlohmann/json.hpp>
7+
#include"wiki.hpp"
8+
const std::string API="http://localhost:8080/api.php";
9+
const std::string LOGIN="/tmp/wiki_login_cookies";
10+
const std::string CSRF="/tmp/wiki_csrf_cookies";
11+
int main(){
12+
try{
13+
const std::string login_token=wiki::get_login_token(API,LOGIN);
14+
wiki::login(
15+
API,
16+
LOGIN,
17+
"CppHusky@uploader",
18+
std::getenv("WIKIPASS_UPLOADER"),
19+
login_token
20+
);
21+
const std::string csrf_token=wiki::get_csrf_token(API,LOGIN,CSRF);
22+
const nlohmann::json result=wiki::upload(
23+
API,
24+
CSRF,
25+
"24-25-大学物理(下)-期中-第一题图.svg",
26+
"24-25-大学物理(下)-期中-第一题图.svg",
27+
csrf_token
28+
);
29+
std::clog<<result<<std::endl;
30+
//if(result["upload"]["result"]!="Success")
31+
// std::clog<<result<<std::endl;
32+
}catch(const curlpp::RuntimeError &e){
33+
std::cerr<<e.what()<<std::endl;
34+
assert(false);
35+
}catch(const curlpp::LogicError &e){
36+
std::cerr<<e.what()<<std::endl;
37+
assert(false);
38+
}catch(const std::exception &e){
39+
std::cerr<<e.what()<<std::endl;
40+
assert(false);
41+
}
42+
}

0 commit comments

Comments
 (0)