Motorcortex Core  version: 2.7.6
cm_authorization.h
1 /*
2  * Developer : Alexey Zakharov (alexey.zakharov@vectioneer.com)
3  * All rights reserved. Copyright (c) 2016 VECTIONEER.
4  */
5 
6 #ifndef CM_AUTHORIZATION_H
7 #define CM_AUTHORIZATION_H
8 
9 #include "cm_rpcprocessor.h"
10 
11 #include "motorcortex.pb.h"
12 #include "motorcortex_hash.h"
13 #include "ps_types.h"
14 
15 #include <cstdint>
16 #include <mutex>
17 #include <set>
18 #include <map>
19 
20 namespace mcx::comm {
21 
22 struct RequestData;
23 struct RequestMsg;
24 struct ReplyMsg;
25 
26 class GroupManager;
27 
28 
30 public:
31 
32  explicit AuthorizationBase(GroupManager* group_manager);
33 
34  void init(uint32_t system_param_hash);
35 
36  virtual bool check(RequestMsg& request_data);
37 
38  [[nodiscard]] MsgHashSet getHashList() const override;
39 
40  virtual bool initLogin(const char* filename);
41 
42  virtual motorcortex_StatusCode logout(uint32_t client_id);
43 
44  bool noAccessMsg(ReplyMsg& reply) const;
45 
46 protected:
47 
48  static bool decodeRestoreSessionMsg(const RequestMsg& request, motorcortex_RestoreSessionMsg& restore_session);
49 
50  static bool encodeStatusMsg(const motorcortex_StatusMsg& status_msg, ReplyMsg& output_msg);
51 
52  static bool encodeSessionTokenMsg(const motorcortex_SessionTokenMsg& session_token, ReplyMsg& output_msg);
53 
54  static bool generateToken(char* token, uint32_t length);
55 
56 private:
57 
58  bool processRequest(const RequestMsg& request, ReplyMsg& reply) override;
59 
60  //GroupManager* group_manager_;
61 
62  motorcortex_SessionTokenMsg session_toke_{};
63  bool has_token_{false};
64 
65 };
66 
68 
69  enum class LoginRequest {
70  NOT_A_LOGIN_REQUEST,
71  SUCCESSFUL,
72  LOGGED_IN_NO_CONTROL,
73  WRONG_PASSWORD,
74  UNDEFINED_USER_LEVEL,
75  DECODE_FAILED
76  };
77 
78  struct LoginData {
79  std::string user;
80  std::string password;
81  parameter_server::UserGroup group;
82  };
83  using SystemLoginList = std::map<std::string, LoginData>;
84 
85 public:
86  Authorization(GroupManager* group_manager, uint32_t max_number_users_in_control);
87 
88  Authorization(const Authorization& orig) = delete;
89 
90  ~Authorization() override;
91 
92  bool initLogin(const char* filename) override;
93 
94  bool check(RequestMsg& request_data) override;
95 
96  motorcortex_StatusCode logout(uint32_t client_id) override;
97 
98 private:
99 
100  static parameter_server::UserGroup getUserLevel(const motorcortex_LoginMsg& login_msg);
101 
102  static parameter_server::UserGroup getUserLevel(const char* login_msg);
103 
104  static parameter_server::UserGroup checkUserLevel(int level);
105 
106  bool processRequest(const RequestMsg& request, ReplyMsg& reply) override;
107 
108  static bool decodeLoginMsg(uint8_t* msg, size_t msg_size, motorcortex_LoginMsg& login_msg);
109 
110  static bool checkPassword(const LoginData& login_data, const motorcortex_LoginMsg& login_msg);
111 
112  static bool checkLogin(const SystemLoginList& system_login, const motorcortex_LoginMsg& login_msg);
113 
114  std::map<uint32_t, parameter_server::UserGroup> logged_in_users_;
115  std::mutex login_users_mutex_;
116  std::set<uint32_t> users_in_control_;
117  std::mutex users_in_control_mutex_;
118  const uint32_t max_number_operators_in_control_;
119 
120  SystemLoginList login_list_;
121 };
122 
123 } // namespace mcx::comm
124 
125 #endif /* CM_AUTHORIZATION_H */
126 
mcx::comm::GroupManager
Definition: cm_groupmanager.h:55
mcx::comm::Authorization
Definition: cm_authorization.h:67
_motorcortex_LoginMsg
Definition: motorcortex.pb.h:232
mcx::comm::ReplyMsg
Definition: cm_rpctypes.h:33
mcx::comm::RPCProcessor
Definition: cm_rpcprocessor.h:13
mcx::comm::AuthorizationBase
Definition: cm_authorization.h:29
_motorcortex_StatusMsg
Definition: motorcortex.pb.h:332
_motorcortex_SessionTokenMsg
Definition: motorcortex.pb.h:310
_motorcortex_RestoreSessionMsg
Definition: motorcortex.pb.h:297
mcx::comm::RequestMsg
Definition: cm_rpctypes.h:24