]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/other/radius/radius.h
80e032a8c90b09c5a64715729744ec2ceb310c51
[stg.git] / projects / stargazer / plugins / other / radius / radius.h
1 #pragma once
2
3 #include "stg/auth.h"
4 #include "stg/plugin.h"
5 #include "stg/module_settings.h"
6 #include "stg/subscriptions.h"
7 #include "stg/logger.h"
8 #include "server.h"
9
10 #include <boost/asio.hpp>
11 #include <string>
12 #include <memory>
13 #include <mutex>
14 #include <jthread.hpp>
15 #include <cstdint> //uint8_t, uint32_t
16
17 namespace STG
18 {
19     struct Settings;
20
21     class Users;
22
23     class RAD_SETTINGS
24     {
25         public:
26             RAD_SETTINGS();
27             virtual ~RAD_SETTINGS() {}
28
29             struct AttrValue
30             {
31                 enum class Type
32                 {
33                     PARAM_NAME,
34                     VALUE
35                 };
36                 std::string value;
37                 Type type;
38             };
39
40             struct ASection
41             {
42                 using Pairs = std::vector<std::pair<std::string, AttrValue>>;
43                 Pairs match;
44                 Pairs send;
45             };
46
47             const std::string& GetStrError() const { return m_errorStr; }
48             int ParseSettings(const ModuleSettings& s);
49
50             uint16_t GetPort() const { return m_port; }
51             const std::string& GetDictionaries() const { return m_dictionaries; }
52             const std::string& GetSecret() const { return m_secret; }
53             const ASection& getAuth() const { return m_auth; }
54             const ASection& getAutz() const { return m_autz; }
55
56         private:
57             std::vector<std::pair<std::string, AttrValue>> ParseRules(const std::string& value, const std::string& paramName);
58             ASection parseASection(const std::vector<ParamValue>& conf);
59
60             std::string m_errorStr;
61             uint16_t m_port;
62             std::string m_dictionaries;
63             std::string m_secret;
64
65             ASection m_auth;
66             ASection m_autz;
67
68             PluginLogger m_logger;
69     };
70
71     class RADIUS : public Auth
72     {
73         public:
74             RADIUS();
75             RADIUS(const RADIUS&) = delete;
76             RADIUS& operator=(const RADIUS&) = delete;
77
78             void SetUsers(Users* u) override { m_users = u; }
79             void SetSettings(const ModuleSettings& s) override { m_settings = s; }
80             int ParseSettings() override;
81
82             int Start() override;
83             int Stop() override;
84             int Reload(const ModuleSettings& /*ms*/) override { return 0; }
85             bool IsRunning() override;
86             void SetRunning(bool val);
87
88             const std::string& GetStrError() const override { return m_errorStr; }
89             std::string GetVersion() const override;
90
91             uint16_t GetStartPosition() const override { return 0; }
92             uint16_t GetStopPosition() const override { return 0; }
93
94             int SendMessage(const Message& /*msg*/, uint32_t /*ip*/) const override { return 0; }
95
96         private:
97             std::mutex m_mutex;
98
99             boost::asio::io_context m_ioContext;
100             int Run(std::stop_token token);
101
102             mutable std::string m_errorStr;
103             RAD_SETTINGS m_radSettings;
104             ModuleSettings m_settings;
105
106             bool m_running;
107
108             std::jthread m_thread;
109             Users* m_users;
110             PluginLogger m_logger;
111
112             std::unique_ptr<Server> m_server;
113     };
114 }