- Strona Główna Belxena 8.4 RPG http://www.belxena.pun.pl/index.php - Skrypty - pozostałe http://www.belxena.pun.pl/viewforum.php?id=15 - [C++]Blokowanie ip tak jak na rl tibi http://www.belxena.pun.pl/viewtopic.php?id=68 |
Macgates - 2009-05-14 18:02:17 |
Domyślnie [C++]Blokowanie ip tak jak na rl tibi Kod:#ifdef UCB_SUSPEND_SYSTEM struct AccSuspensaUCB { unsigned int conta; unsigned int tentativas; std::time_t tempo; bool bloqueado; }; struct IpSuspensoUCB { unsigned long ip; unsigned int tentativas; std::time_t tempo; bool bloqueado; }; std::vector< struct AccSuspensaUCB > ListaAccSuspensas; std::vector< struct IpSuspensoUCB > ListaIpsSuspensos; std::time_t tempo_reciclagem = std::time(NULL) + 3600; #endif // UCB_SUSPEND_SYSTEM Po: Kod:bool isclientBanished(SOCKET s) { sockaddr_in sain; socklen_t salen = sizeof(sockaddr_in); if (getpeername(s, (sockaddr*)&sain, &salen) == 0) { unsigned long clientip = *(unsigned long*)&sain.sin_addr; for (size_t i = 0; i < bannedIPs.size(); ++i) { if ((bannedIPs[i].first & bannedIPs[i].second) == (clientip & bannedIPs[i].second)) return true; } } return false; } Dodaj to: Kod:#ifdef UCB_SUSPEND_SYSTEM // Ulisses (Proglin) - IP/ACC Suspend System // April / 2006 for turion.no-ip.info bool isAccIPSuspend(int acc, SOCKET s) { bool suspensa = false; bool achouip = false; bool achouacc = false; sockaddr_in sain; socklen_t salen = sizeof(sockaddr_in); std::time_t now = std::time(NULL); /* Recycling Lists (to save memory wink ) */ if( now > tempo_reciclagem ){ OTSYS_THREAD_LOCK(g_game.gameLock, "UCB_IP_Seach"); OTSYS_THREAD_LOCK(g_game.gameLock, "UCB_ACC_Seach"); tempo_reciclagem = now + 3600; bool achou = true; std::cout << "Ips suspend before recycling: " << ListaIpsSuspensos.size() << std::endl; std::cout << "Accs suspend before recycling: " << ListaAccSuspensas.size() << std::endl; /* Ips list */ std::vector< struct IpSuspensoUCB >::iterator i = ListaIpsSuspensos.begin(); while( achou ){ achou = false; while(i != ListaIpsSuspensos.end()){ if((*i).tempo < now){ ListaIpsSuspensos.erase(i); achou = true; break; } i++; } } /* Acc list */ achou = true; std::vector< struct AccSuspensaUCB >::iterator ii = ListaAccSuspensas.begin(); while( achou ){ achou = false; while(ii != ListaAccSuspensas.end()){ if((*ii).tempo < now){ ListaAccSuspensas.erase(ii); achou = true; break; } ii++; } } OTSYS_THREAD_UNLOCK(g_game.gameLock, "UCB_ACC_Seach"); OTSYS_THREAD_UNLOCK(g_game.gameLock, "UCB_IP_Seach"); std::cout << "Ips suspend after recycling: " << ListaIpsSuspensos.size() << std::endl; std::cout << "Accs suspend after recycling: " << ListaAccSuspensas.size() << std::endl; } /* Search for IP */ OTSYS_THREAD_LOCK(g_game.gameLock, "UCB_IP_Seach"); if (getpeername(s, (sockaddr*)&sain, &salen) == 0 ){ unsigned long clientip = *(unsigned long*)&sain.sin_addr; for (size_t i = 0; i < ListaIpsSuspensos.size(); ++i) { if( ListaIpsSuspensos[i].ip == clientip ){ achouip = true; if( ListaIpsSuspensos[i].tempo < now ){ ListaIpsSuspensos[i].tentativas = 0; ListaIpsSuspensos[i].bloqueado = false; ListaIpsSuspensos[i].tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); } if( !ListaIpsSuspensos[i].bloqueado ){ if( ListaIpsSuspensos[i].tentativas > g_config.getGlobalNumber("suspend_ip_tries", 4) - 1 ){ ListaIpsSuspensos[i].bloqueado = true; ListaIpsSuspensos[i].tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); } } ListaIpsSuspensos[i].tentativas++; suspensa = ListaIpsSuspensos[i].bloqueado; } } if( !achouip ){ struct IpSuspensoUCB candidatoip; candidatoip.ip = clientip; candidatoip.tentativas = 1; candidatoip.tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); candidatoip.bloqueado = false; ListaIpsSuspensos.push_back(candidatoip); } } OTSYS_THREAD_UNLOCK(g_game.gameLock, "UCB_IP_Seach"); /* Search for Account */ OTSYS_THREAD_LOCK(g_game.gameLock, "UCB_ACC_Seach"); for (size_t i = 0; i < ListaAccSuspensas.size(); ++i) { if( ListaAccSuspensas[i].conta == acc ){ achouacc = true; if( ListaAccSuspensas[i].tempo < now ){ ListaAccSuspensas[i].tentativas = 0; ListaAccSuspensas[i].bloqueado = false; ListaAccSuspensas[i].tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); } if( !ListaAccSuspensas[i].bloqueado ){ if( ListaAccSuspensas[i].tentativas > g_config.getGlobalNumber("suspend_acc_tries", 2) - 1 ){ ListaAccSuspensas[i].bloqueado = true; ListaAccSuspensas[i].tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); } } ListaAccSuspensas[i].tentativas++; if( !suspensa ) suspensa = ListaAccSuspensas[i].bloqueado; } } if( !achouacc ){ struct AccSuspensaUCB candidatoacc; candidatoacc.conta = acc; candidatoacc.tentativas = 1; candidatoacc.tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); candidatoacc.bloqueado = false; ListaAccSuspensas.push_back(candidatoacc); } OTSYS_THREAD_UNLOCK(g_game.gameLock, "UCB_ACC_Seach"); return suspensa; } #endif // UCB_SUSPEND_SYSTEM Zmieniając ten Kod Kod:#ifdef UCB_SUSPEND_SYSTEM bool recebeuban = false; if(isclientBanished(s)) { recebeuban = true; msg.AddByte(0x0A); msg.AddString("Your IP is banished!"); } if( isAccIPSuspend(accnumber, s) || recebeuban ){ if( !recebeuban ){ msg.AddByte(0x0A); msg.AddString(g_config.getGlobalString("suspendmsg","Your IP/ACC has been suspended for some minuts\n\nTry again later.")); } } #else if(isclientBanished(s)) { msg.AddByte(0x0A); msg.AddString("Your IP is banished!"); } #endif // UCB_SUSPEND_SYSTEM W config.lua dodaj: Kod:---- UCB Suspend System (April/2006) -- Suspend time period (in minuts) suspend_time_max = 10 -- Acc tries to be suspended in the period suspend_acc_tries = 2 -- Same IP loggin tries to be suspended in the period suspend_ip_tries = 4 -- Message to user when he got suspended suspendmsg = "Your IP/ACC has been suspended for 10 minuts." Dodać do parametrĂłw: |