1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#include "../include.h"
#include "../util/io.h"
#include "forum.h"
void xenforo_forum::init(const std::string_view link,
const std::string_view key) {
m_link = link;
m_api = key;
m_header = cpr::Header{{"Content-Type", "application/x-www-form-urlencoded"},
{"XF-Api-Key", m_api.data()},
{"XF-Api-User", "1"},
{"api_bypass_permissions", "1"}};
}
int xenforo_forum::check_login(const std::string_view username,
const std::string_view password,
user_data &data) {
auto url = fmt::format("{}{}", m_link, "/auth/");
auto post_data = fmt::format("login={}&password={}", username, password);
auto req = cpr::Post(cpr::Url{url}, cpr::Body{post_data}, cpr::Timeout{10000},
m_header);
if (req.elapsed >= 10) {
io::logger->warn("login request on {} timed out.", username);
return forum_response::api_timeout;
}
int status_code = req.status_code;
auto response = req.text;
if (!nlohmann::json::accept(response)) {
io::logger->error("invalid json response from forum.", username);
return forum_response::api_fail;
}
if (status_code >= 400) {
return forum_response::api_error;
}
auto json = nlohmann::json::parse(response);
if (!json.contains("user")) {
io::logger->error("json response for user {} doesn't contain user field.",
username);
return forum_response::api_fail;
}
auto user = json["user"];
if (!user.contains("custom_fields")) {
io::logger->error(
"json response for user {} doesn't contain custom fields.", username);
return forum_response::api_fail;
}
auto custom_fields = user["custom_fields"];
if(!user.contains("is_banned")) {
io::logger->error(
"json response for user {} doesn't contain is_banned.", username);
return forum_response::api_fail;
}
data.banned = user["is_banned"].get<bool>();
if(!user.contains("user_id")) {
io::logger->error(
"json response for user {} doesn't contain user_id.", username);
return forum_response::api_fail;
}
data.id = user["user_id"].get<int>();
if(!custom_fields.contains("hwid")) {
io::logger->error("custom fields for user {} dont contain hwid.", username);
return forum_response::api_fail;
}
// data.active = check user group
data.hwid = custom_fields["hwid"].get<std::string>();
return forum_response::api_success;
}
bool xenforo_forum::edit(const int uid, const std::string_view field,
const std::string_view val) {
const auto url = fmt::format("{}{}{}/", m_link, "/users/", uid);
const auto post = fmt::format("{}={}", field, val);
auto req =
cpr::Post(cpr::Url{url}, cpr::Body{post}, cpr::Timeout{10000}, m_header);
return req.status_code == 200;
}
|