Skip to content

Commit cadbb9e

Browse files
committed
added csrf token module
modified: uploader/CMakeLists.txt modified: uploader/include/wiki.hpp modified: uploader/lib/libwiki.cpp new file: uploader/test/csrf.cpp modified: uploader/test/login.cpp modified: uploader/test/token.cpp
1 parent adb2822 commit cadbb9e

File tree

6 files changed

+59
-21
lines changed

6 files changed

+59
-21
lines changed

uploader/CMakeLists.txt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ file(GLOB_RECURSE HeaderFileList "include/*")
1010
file(GLOB_RECURSE LibraryFileList "lib/*")
1111
include_directories(include /usr/include /usr/local/include)
1212
link_directories(lib /usr/lib /usr/local/lib)
13-
add_library(wikibot ${HeaderFileList} ${LibraryFileList})
13+
add_library(wiki ${HeaderFileList} ${LibraryFileList})
1414
find_package(curlpp NAMES curlpp curl)
1515
find_package(nlohmann_json 3.11.3 REQUIRED)
16-
target_link_libraries(wikibot PUBLIC nlohmann_json::nlohmann_json curlpp curl)
16+
target_link_libraries(wiki PUBLIC nlohmann_json::nlohmann_json curlpp curl)
1717
add_executable(.token test/token.cpp)
18-
target_link_libraries(.token wikibot)
18+
target_link_libraries(.token wiki)
1919
add_test(NAME token COMMAND .token)
2020
add_executable(.login test/login.cpp)
21-
target_link_libraries(.login wikibot)
21+
target_link_libraries(.login wiki)
2222
add_test(NAME login COMMAND .login)
23+
add_executable(.csrf test/csrf.cpp)
24+
target_link_libraries(.csrf wiki)
25+
add_test(NAME csrf COMMAND .csrf)

uploader/include/wiki.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace wiki{
77
std::string get(curlpp::Easy &request);
88
std::string get(const std::string &url,const std::list<std::string> &header={});
9-
std::string get(const std::string &url,const std::string &cookiejar_path,const std::list<std::string> &header={});
10-
std::string get_token(const std::string &url,const std::string &cookiejar_path,const std::list<std::string> &header={});
11-
std::string login(const std::string &url,const std::string &cookie_path,const std::string &username,const std::string &password,const std::string &login_token,const std::list<std::string> &header={});
9+
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={});
11+
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={});
1212
}

uploader/lib/libwiki.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,27 @@ std::string wiki::get(const std::string &url,const std::list<std::string> &heade
2020
request.setOpt<curlpp::Options::HttpHeader>(header);
2121
return get(request);
2222
}
23-
std::string wiki::get(const std::string &url,const std::string &cookiejar_path,const std::list<std::string> &header){
23+
std::string wiki::get_login_token(const std::string &api,const std::string &cookiejar_path,const std::list<std::string> &header){
2424
curlpp::Easy request;
25-
request.setOpt<curlpp::Options::Url>(url);
25+
request.setOpt<curlpp::Options::Url>(api+"?format=json&action=query&meta=tokens&type=login");
2626
request.setOpt<curlpp::Options::CookieJar>(cookiejar_path);
2727
request.setOpt<curlpp::Options::HttpHeader>(header);
28-
return get(request);
29-
}
30-
std::string wiki::get_token(const std::string &url,const std::string &cookiejar_path,const std::list<std::string> &header){
31-
nlohmann::json response=nlohmann::json::parse(wiki::get(url,cookiejar_path,header));
28+
nlohmann::json response=nlohmann::json::parse(wiki::get(request));
3229
const std::string token=response["query"]["tokens"]["logintoken"];
3330
return token;
3431
}
35-
std::string wiki::login(const std::string &url,const std::string &cookie_path,const std::string &username,const std::string &password,const std::string &login_token,const std::list<std::string> &header){
32+
std::string wiki::get_csrf_token(const std::string &api,const std::string &cookie_path,const std::list<std::string> &header){
3633
curlpp::Easy request;
37-
request.setOpt<curlpp::Options::Url>(url);
34+
request.setOpt<curlpp::Options::Url>(api+"?format=json&action=query&meta=tokens&type=csrf");
35+
request.setOpt<curlpp::Options::CookieFile>(cookie_path);
36+
request.setOpt<curlpp::Options::HttpHeader>(header);
37+
nlohmann::json response=nlohmann::json::parse(wiki::get(request));
38+
const std::string token=response["query"]["tokens"]["csrftoken"];
39+
return token;
40+
}
41+
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){
42+
curlpp::Easy request;
43+
request.setOpt<curlpp::Options::Url>(api+"?format=json&action=login");
3844
request.setOpt<curlpp::Options::CookieFile>(cookie_path);
3945
request.setOpt<curlpp::Options::CookieJar>(cookie_path);
4046
curlpp::Forms form;

uploader/test/csrf.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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+
int main(){
9+
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");
14+
std::clog<<csrf_token<<std::endl;
15+
assert(csrf_token.length()==42);
16+
assert(csrf_token.ends_with("+\\"));
17+
}catch(const curlpp::RuntimeError &e){
18+
std::cerr<<e.what()<<std::endl;
19+
assert(false);
20+
}catch(const curlpp::LogicError &e){
21+
std::cerr<<e.what()<<std::endl;
22+
assert(false);
23+
}catch(const std::exception &e){
24+
std::cerr<<e.what()<<std::endl;
25+
assert(false);
26+
}
27+
}

uploader/test/login.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
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_token(api+"format=json&action=query&meta=tokens&type=login","/tmp/wiki_login_token");
12-
const nlohmann::json result=nlohmann::json::parse(wiki::login(api+"format=json&action=login","/tmp/wiki_login_token","CppHusky@uploader",std::getenv("WIKIPASS_UPLOADER"),login_token));
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+
std::clog<<result<<std::endl;
1314
assert(result["login"]["result"]=="Success");
1415
}catch(const curlpp::RuntimeError &e){
1516
std::cerr<<e.what()<<std::endl;

uploader/test/token.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1+
#include<cstdlib>
12
#include<exception>
23
#include<format>
34
#include<iostream>
4-
#include<list>
55
#include<string>
66
#include<nlohmann/json.hpp>
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_token(api+"format=json&action=query&meta=tokens&type=*","/tmp/wiki_login_token");
10+
const std::string api="https://wiki.byrdocs.org/api.php";
11+
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);
1213
std::clog<<login_token<<std::endl;
1314
assert(login_token.length()==42);
1415
assert(login_token.ends_with("+\\"));

0 commit comments

Comments
 (0)