2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
23 $Date: 2010/09/10 06:39:19 $
40 #include "base_auth.h"
41 #include "base_store.h"
44 #include "../../../user.h"
45 #include "../../../users.h"
46 #include "ia_packets.h"
48 #include "stg_logger.h"
53 extern "C" BASE_PLUGIN * GetPlugin();
55 #define IA_PROTO_VER (6)
57 //#define IA_DEBUG (1)
58 //#define IA_PHASE_DEBUG (1)
61 //-----------------------------------------------------------------------------
87 //-----------------------------------------------------------------------------
102 const UTIME & GetTime() const;
104 #ifdef IA_PHASE_DEBUG
105 void SetUserLogin(const string & login);
106 void SetLogFileName(const string & logFileName);
113 #ifdef IA_PHASE_DEBUG
114 void WritePhaseChange(int newPhase);
120 //-----------------------------------------------------------------------------
130 password = "NO PASSWORD";
131 // +++ Preparing CTX +++
132 unsigned char keyL[PASSWD_LEN]; // ðÁÒÏÌØ ÄÌÑ ÛÉÆÒÏ×ËÉ
133 memset(keyL, 0, PASSWD_LEN);
134 strncpy((char *)keyL, password.c_str(), PASSWD_LEN);
135 Blowfish_Init(&ctx, keyL, PASSWD_LEN);
136 // --- Preparing CTX ---
142 IA_USER(const IA_USER & u)
146 //phaseTime = u.phaseTime;
147 lastSendAlive = u.lastSendAlive;
149 password = u.password;
150 protoVer = u.protoVer;
153 aliveSent = u.aliveSent;
155 memcpy(&ctx, &u.ctx, sizeof(BLOWFISH_CTX));
166 list<STG_MSG> messagesToSend;
173 //-----------------------------------------------------------------------------
174 class AUTH_IA_SETTINGS
178 virtual ~AUTH_IA_SETTINGS() {};
179 const string& GetStrError() const { return errorStr; };
180 int ParseSettings(const MODULE_SETTINGS & s);
181 int GetUserDelay() const { return userDelay; };
182 int GetUserTimeout() const { return userTimeout; };
183 int GetUserPort() const { return port; };
184 FREEMB GetFreeMbShowType() const { return freeMbShowType; };
187 int ParseIntInRange(const string & str, int min, int max, int * val);
192 FREEMB freeMbShowType;
194 //-----------------------------------------------------------------------------
195 class AUTH_IA :public BASE_AUTH
201 void SetUsers(USERS * u) { users = u; };
202 void SetTariffs(TARIFFS *){};
203 void SetAdmins(ADMINS *){};
204 void SetTraffcounter(TRAFFCOUNTER *){};
205 void SetStore(BASE_STORE *){};
206 void SetStgSettings(const SETTINGS * s) { stgSettings = s; };
207 void SetSettings(const MODULE_SETTINGS & s) { settings = s; };
212 int Reload() { return 0; };
213 bool IsRunning() { return isRunningRunTimeouter || isRunningRun; };
215 const string & GetStrError() const { return errorStr; };
216 const string GetVersion() const { return "InetAccess authorization plugin v.1.4"; };
217 uint16_t GetStartPosition() const { return 50; };
218 uint16_t GetStopPosition() const { return 50; };
220 void DelUser(user_iter u);
222 int SendMessage(const STG_MSG & msg, uint32_t ip) const;
225 static void * Run(void *);
226 static void * RunTimeouter(void * d);
229 int RecvData(char * buffer, int bufferSize);
230 int CheckHeader(const char * buffer, int * protoVer);
231 int PacketProcessor(char * buff, int dataLen, uint32_t sip, uint16_t sport, int protoVer, user_iter * user);
233 int Process_CONN_SYN_6(CONN_SYN_6 * connSyn, IA_USER * iaUser, user_iter * user, uint32_t sip);
234 int Process_CONN_SYN_7(CONN_SYN_7 * connSyn, IA_USER * iaUser, user_iter * user, uint32_t sip);
235 int Process_CONN_SYN_8(CONN_SYN_8 * connSyn, IA_USER * iaUser, user_iter * user, uint32_t sip);
237 int Process_CONN_ACK_6(CONN_ACK_6 * connAck, IA_USER * iaUser, user_iter * user, uint32_t sip);
238 int Process_CONN_ACK_7(CONN_ACK_7 * connAck, IA_USER * iaUser, user_iter * user, uint32_t sip);
239 int Process_CONN_ACK_8(CONN_ACK_8 * connAck, IA_USER * iaUser, user_iter * user, uint32_t sip);
241 int Process_ALIVE_ACK_6(ALIVE_ACK_6 * aliveAck, IA_USER * iaUser, user_iter * user, uint32_t sip);
242 int Process_ALIVE_ACK_7(ALIVE_ACK_7 * aliveAck, IA_USER * iaUser, user_iter * user, uint32_t sip);
243 int Process_ALIVE_ACK_8(ALIVE_ACK_8 * aliveAck, IA_USER * iaUser, user_iter * user, uint32_t sip);
245 int Process_DISCONN_SYN_6(DISCONN_SYN_6 * disconnSyn, IA_USER * iaUser, user_iter * user, uint32_t sip);
246 int Process_DISCONN_SYN_7(DISCONN_SYN_7 * disconnSyn, IA_USER * iaUser, user_iter * user, uint32_t sip);
247 int Process_DISCONN_SYN_8(DISCONN_SYN_8 * disconnSyn, IA_USER * iaUser, user_iter * user, uint32_t sip);
249 int Process_DISCONN_ACK_6(DISCONN_ACK_6 * disconnSyn,
253 map<uint32_t, IA_USER>::iterator it);
254 int Process_DISCONN_ACK_7(DISCONN_ACK_7 * disconnSyn,
258 map<uint32_t, IA_USER>::iterator it);
259 int Process_DISCONN_ACK_8(DISCONN_ACK_8 * disconnSyn,
263 map<uint32_t, IA_USER>::iterator it);
265 int Send_CONN_SYN_ACK_6(IA_USER * iaUser, user_iter * user, uint32_t sip);
266 int Send_CONN_SYN_ACK_7(IA_USER * iaUser, user_iter * user, uint32_t sip);
267 int Send_CONN_SYN_ACK_8(IA_USER * iaUser, user_iter * user, uint32_t sip);
269 int Send_ALIVE_SYN_6(IA_USER * iaUser, uint32_t sip);
270 int Send_ALIVE_SYN_7(IA_USER * iaUser, uint32_t sip);
271 int Send_ALIVE_SYN_8(IA_USER * iaUser, uint32_t sip);
273 int Send_DISCONN_SYN_ACK_6(IA_USER * iaUser, uint32_t sip);
274 int Send_DISCONN_SYN_ACK_7(IA_USER * iaUser, uint32_t sip);
275 int Send_DISCONN_SYN_ACK_8(IA_USER * iaUser, uint32_t sip);
277 int Send_FIN_6(IA_USER * iaUser, uint32_t sip, map<uint32_t, IA_USER>::iterator it);
278 int Send_FIN_7(IA_USER * iaUser, uint32_t sip, map<uint32_t, IA_USER>::iterator it);
279 int Send_FIN_8(IA_USER * iaUser, uint32_t sip, map<uint32_t, IA_USER>::iterator it);
283 void InitEncrypt(BLOWFISH_CTX * ctx, const string & password);
284 void Decrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8);
285 void Encrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8);
287 int SendError(uint32_t ip, uint16_t port, int protoVer, const string & text);
288 int Send(uint32_t ip, uint16_t port, const char * buffer, int len);
289 int RealSendMessage6(const STG_MSG & msg, uint32_t ip, IA_USER & user);
290 int RealSendMessage7(const STG_MSG & msg, uint32_t ip, IA_USER & user);
291 int RealSendMessage8(const STG_MSG & msg, uint32_t ip, IA_USER & user);
293 bool WaitPackets(int sd) const;
295 BLOWFISH_CTX ctxS; //for loginS
297 mutable string errorStr;
298 AUTH_IA_SETTINGS iaSettings;
299 MODULE_SETTINGS settings;
304 bool isRunningRunTimeouter;
307 const SETTINGS * stgSettings;
309 mutable map<uint32_t, IA_USER> ip2user;
311 pthread_t recvThread;
312 pthread_t timeouterThread;
313 mutable pthread_mutex_t mutex;
317 CONN_SYN_ACK_6 connSynAck6;
318 CONN_SYN_ACK_8 connSynAck8;
320 DISCONN_SYN_ACK_6 disconnSynAck6;
321 DISCONN_SYN_ACK_8 disconnSynAck8;
323 ALIVE_SYN_6 aliveSyn6;
324 ALIVE_SYN_8 aliveSyn8;
328 map<string, int> packetTypes;
330 STG_LOGGER & WriteServLog;
332 uint32_t enabledDirs;
334 class DEL_USER_NONIFIER: public NOTIFIER_BASE<user_iter>
337 DEL_USER_NONIFIER(AUTH_IA & a) : auth(a) {};
338 virtual ~DEL_USER_NONIFIER(){};
340 void Notify(const user_iter & user)
349 class UnauthorizeUser : std::unary_function<const std::pair<uint32_t, IA_USER> &, void> {
351 UnauthorizeUser(AUTH_IA * a) : auth(a) {};
352 void operator()(const std::pair<uint32_t, IA_USER> & p)
354 p.second.user->Unauthorize(auth);
361 //-----------------------------------------------------------------------------