gauthd
 
Loading...
Searching...
No Matches
D:/pwsrc2.0/docs/gauthd/accountingrequest.hpp
Go to the documentation of this file.
1
5
6 #ifndef __GNET_ACCOUNTINGREQUEST_HPP
7 #define __GNET_ACCOUNTINGREQUEST_HPP
8
9 #include "rpcdefs.h"
10 #include "callid.hxx"
11 #include "state.hxx"
12 #include "accntparam"
13 #include "security.h"
14 #include "kickoutuser.hpp"
15 #include "accountingresponse.hpp"
16 #include "gauthserver.hpp"
17
18 namespace GNET
19 {
20
27 class AccountingRequest : public GNET::Protocol
28 {
29 #include "accountingrequest"
30
31 private:
32 bool need_response;
33
39 bool VerifyAuth()
40 {
41 return (MD5Hash(MD5HASH).Digest(OctetsStream()<<stamp<<userid<<(unsigned int)attributes.size()<<GAuthServer::GetInstance()->shared_key) == authenticator;
42 }
43
50 bool SendResponse(Manager::Session::ID sid)
51 {
52 OctetsStream buf;
53 buf<<stamp<<userid<<authenticator<<GAuthServer::GetInstance()->shared_key;
54 return GAuthServer::GetInstance()->Send(sid,AccountingResponse(stamp,userid,MD5Hash(MD5HASH).Digest(buf));
55 }
56
62 bool Write2DB()
63 {
64 return 1;
65 }
66
76 void GenerateFee(AccntParam& attribute)
77 {
79 Thread::Mutex::Scoped (aum->locker_accntmap);
80 need_response=false;
81 switch (attribute.type)
82 {
83 case _ACCOUNT_START:
84 aum->accntmap[userid]=attribute.value;
85 need_response=true;
86 DEBUG_PRINT("\tgauthd::start accounting user %d,time=%d.\n",userid,attribute.value);
87 break;
88 case _ACCOUNT_STOP:
89 if (aum->accntmap.find(userid)!=aum->accntmap.end())
90 {
91 unsigned int elapse=attribute.value - aum->accntmap[userid];
92 DEBUG_PRINT("\tgauthd::stop accounting user %d. He plays %d hours %d min %d second\n",userid,elapse / 3600,(elapse % 3600) / 60,elapse % 60);
93 aum->accntmap.erase(userid);
94 }
95 need_response=true;
96 break;
97 case _ACCOUNT_ELAPSE_TIME:
98 if (aum->accntmap.find(userid)!=aum->accntmap.end())
99 {
100 unsigned int elapse=attribute.value - aum->accntmap[userid];
101 DEBUG_PRINT("\tgauthd::continue accounting user %d. He plays %d hours %d min %d second\n",userid,elapse / 3600,(elapse % 3600) / 60,elapse % 60);
102 }
103 else
104 {
105 DEBUG_PRINT("\tgauthd::warning:: _ACCOUNT_ELAPSE_TIME cannot find start. Fee leaks.\n");
106 aum->accntmap[userid]=attribute.value;
107 }
108 break;
109 case _ACCOUNT_IN_OCTETS:
110 break;
111 case _ACCOUNT_OUT_OCTETS:
112 break;
113 case _ACCOUNT_IN_PACKETS:
114 break;
115 case _ACCOUNT_OUT_PACKETS:
116 break;
117 }
118 }
119
120 public:
131 void Process(Manager *manager, Manager::Session::ID sid)
132 {
133 if (!VerifyAuth()) return; // Тихий сброс при неверной аутентификации
134 for (size_t i=0;i<attributes.size();GenerateFee(attributes[i]),i++);
135 if (need_response && Write2DB()) SendResponse(sid);
136 if (!GAuthServer::GetInstance()->ValidUser(sid,userid))
137 GAuthServer::GetInstance()->Send(sid,KickoutUser(userid,_SID_INVALID));
138 }
139 };
140
141 };
142
143 #endif
Заголовочный файл, содержащий объявление класса AccountingResponse для обработки ответов учётных запи...
Класс для обработки учётных запросов (например, старт/стоп сессии, учёт трафика).
void Process(Manager *manager, Manager::Session::ID sid)
Основной метод обработки запроса.
Класс для обработки ответов от сервиса учётных записей.
Main authentication server class handling sessions and user validation.
static GAuthServer * GetInstance()
Получить экземпляр синглтона.
Thread::Mutex locker_accntmap
Блокировка для доступа к accntmap.
AccountingMap accntmap
Контейнер с данными о времени онлайн.
Octets shared_key
Общий ключ для шифрования.
Протокол для принудительного отключения пользователя от сервера
Заголовочный файл, содержащий определения классов для аутентификации и управления сессиями.
Заголовочный файл класса протокола для принудительного отключения пользователя
Основное пространство имен для сетевых компонентов системы.