2008-11-05 22:52:40 +00:00
|
|
|
from django.db import models
|
2018-07-17 13:14:17 +00:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
2008-11-05 22:52:40 +00:00
|
|
|
|
2016-06-24 14:42:18 +00:00
|
|
|
|
2019-02-12 21:11:13 +00:00
|
|
|
class AccessBase(models.Model):
|
2019-09-28 16:27:50 +00:00
|
|
|
user_agent = models.CharField(_("User Agent"), max_length=255, db_index=True)
|
|
|
|
|
|
|
|
|
|
ip_address = models.GenericIPAddressField(_("IP Address"), null=True, db_index=True)
|
|
|
|
|
|
|
|
|
|
username = models.CharField(_("Username"), max_length=255, null=True, db_index=True)
|
|
|
|
|
|
|
|
|
|
http_accept = models.CharField(_("HTTP Accept"), max_length=1025)
|
|
|
|
|
|
|
|
|
|
path_info = models.CharField(_("Path"), max_length=255)
|
|
|
|
|
|
|
|
|
|
attempt_time = models.DateTimeField(_("Attempt Time"), auto_now_add=True)
|
2008-11-05 22:52:40 +00:00
|
|
|
|
2018-12-08 13:38:00 +00:00
|
|
|
class Meta:
|
2019-09-28 16:27:50 +00:00
|
|
|
app_label = "axes"
|
2012-11-25 20:46:45 +00:00
|
|
|
abstract = True
|
2019-09-28 16:27:50 +00:00
|
|
|
ordering = ["-attempt_time"]
|
2012-11-25 20:46:45 +00:00
|
|
|
|
2013-04-05 00:19:52 +00:00
|
|
|
|
2022-03-15 09:40:02 +00:00
|
|
|
class AccessFailureLog(AccessBase):
|
2022-05-16 07:31:46 +00:00
|
|
|
locked_out = models.BooleanField(
|
|
|
|
|
_("Access lock out"), null=False, blank=True, default=False
|
|
|
|
|
)
|
2022-03-15 09:40:02 +00:00
|
|
|
|
|
|
|
|
def __str__(self):
|
2022-05-16 07:31:46 +00:00
|
|
|
locked_out_str = " locked out" if self.locked_out else ""
|
2022-03-15 09:40:02 +00:00
|
|
|
return f"Failed access: user {self.username}{locked_out_str} on {self.attempt_time} from {self.ip_address}"
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = _("access failure")
|
|
|
|
|
verbose_name_plural = _("access failures")
|
|
|
|
|
|
|
|
|
|
|
2019-02-12 21:11:13 +00:00
|
|
|
class AccessAttempt(AccessBase):
|
2019-09-28 16:27:50 +00:00
|
|
|
get_data = models.TextField(_("GET Data"))
|
2012-11-25 20:46:45 +00:00
|
|
|
|
2019-09-28 16:27:50 +00:00
|
|
|
post_data = models.TextField(_("POST Data"))
|
2013-04-05 00:19:52 +00:00
|
|
|
|
2019-09-28 16:27:50 +00:00
|
|
|
failures_since_start = models.PositiveIntegerField(_("Failed Logins"))
|
2008-11-05 22:52:40 +00:00
|
|
|
|
2017-07-20 14:06:41 +00:00
|
|
|
def __str__(self):
|
2019-09-28 16:27:50 +00:00
|
|
|
return f"Attempted Access: {self.attempt_time}"
|
2013-04-05 00:19:52 +00:00
|
|
|
|
2018-12-08 13:38:00 +00:00
|
|
|
class Meta:
|
2019-09-28 16:27:50 +00:00
|
|
|
verbose_name = _("access attempt")
|
|
|
|
|
verbose_name_plural = _("access attempts")
|
2021-09-13 15:35:56 +00:00
|
|
|
unique_together = [["username", "ip_address", "user_agent"]]
|
2013-04-05 00:19:52 +00:00
|
|
|
|
2018-10-26 12:45:06 +00:00
|
|
|
|
2025-06-07 13:13:14 +00:00
|
|
|
class AccessAttemptExpiration(models.Model):
|
|
|
|
|
access_attempt = models.OneToOneField(
|
|
|
|
|
AccessAttempt,
|
2025-06-08 08:45:17 +00:00
|
|
|
primary_key=True,
|
2025-06-07 13:13:14 +00:00
|
|
|
on_delete=models.CASCADE,
|
|
|
|
|
related_name="expiration",
|
|
|
|
|
verbose_name=_("Access Attempt"),
|
|
|
|
|
)
|
|
|
|
|
expires_at = models.DateTimeField(
|
|
|
|
|
_("Expires At"),
|
|
|
|
|
help_text=_("The time when access attempt expires and is no longer valid."),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = _("access attempt expiration")
|
|
|
|
|
verbose_name_plural = _("access attempt expirations")
|
|
|
|
|
|
2026-02-11 19:54:13 +00:00
|
|
|
|
2019-02-12 21:11:13 +00:00
|
|
|
class AccessLog(AccessBase):
|
2019-09-28 16:27:50 +00:00
|
|
|
logout_time = models.DateTimeField(_("Logout Time"), null=True, blank=True)
|
2026-02-11 19:54:13 +00:00
|
|
|
session_hash = models.CharField(
|
|
|
|
|
_("Session key hash (sha256)"), default="", blank=True, max_length=64
|
|
|
|
|
)
|
2012-11-25 20:46:45 +00:00
|
|
|
|
2017-07-20 14:06:41 +00:00
|
|
|
def __str__(self):
|
2019-09-28 16:27:50 +00:00
|
|
|
return f"Access Log for {self.username} @ {self.attempt_time}"
|
2018-07-17 13:41:06 +00:00
|
|
|
|
2018-12-08 13:38:00 +00:00
|
|
|
class Meta:
|
2019-09-28 16:27:50 +00:00
|
|
|
verbose_name = _("access log")
|
|
|
|
|
verbose_name_plural = _("access logs")
|