aboutsummaryrefslogtreecommitdiff
path: root/server/src/forum/forum.cpp
blob: e79f5e8df24e4d3a4f70785e450c1360b8f0f26b (plain) (blame)
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;
}