handlerlogin: use std::atomic for counter and lockguard in ban check

This commit is contained in:
Albert S. 2019-05-12 21:14:26 +02:00
parent 93aea9ed7b
commit d7db1fbe39

View File

@ -18,12 +18,15 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#include <atomic>
#include <mutex>
#include <openssl/evp.h> #include <openssl/evp.h>
#include "handlerlogin.h" #include "handlerlogin.h"
#include "../logger.h" #include "../logger.h"
struct LoginFail struct LoginFail
{ {
unsigned int count; std::mutex mutex;
std::atomic<unsigned int> count;
time_t lastfail; time_t lastfail;
}; };
static std::map<std::string, LoginFail> loginFails; static std::map<std::string, LoginFail> loginFails;
@ -34,6 +37,7 @@ bool HandlerLogin::isBanned(std::string ip)
if(utils::hasKey(loginFails, ip)) if(utils::hasKey(loginFails, ip))
{ {
LoginFail &fl = loginFails[ip]; LoginFail &fl = loginFails[ip];
std::lock_guard<std::mutex> lock(fl.mutex);
return fl.count > 5 && (time(nullptr) - fl.lastfail) < 1200; return fl.count > 5 && (time(nullptr) - fl.lastfail) < 1200;
} }
return false; return false;