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 d02e8d0dce
commit 232ff75ae0

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;
} }