audit(major): AuditEntry -> Event
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
"""passbook URL Configuration"""
|
"""passbook URL Configuration"""
|
||||||
from django.urls import include, path
|
from django.urls import path
|
||||||
|
|
||||||
from passbook.admin.views import (applications, audit, debug, factors, groups,
|
from passbook.admin.views import (applications, audit, debug, factors, groups,
|
||||||
invitations, overview, policy,
|
invitations, overview, policy,
|
||||||
@ -74,7 +74,7 @@ urlpatterns = [
|
|||||||
path('group/<uuid:pk>/update/', groups.GroupUpdateView.as_view(), name='group-update'),
|
path('group/<uuid:pk>/update/', groups.GroupUpdateView.as_view(), name='group-update'),
|
||||||
path('group/<uuid:pk>/delete/', groups.GroupDeleteView.as_view(), name='group-delete'),
|
path('group/<uuid:pk>/delete/', groups.GroupDeleteView.as_view(), name='group-delete'),
|
||||||
# Audit Log
|
# Audit Log
|
||||||
path('audit/', audit.AuditEntryListView.as_view(), name='audit-log'),
|
path('audit/', audit.EventListView.as_view(), name='audit-log'),
|
||||||
# Groups
|
# Groups
|
||||||
path('groups/', groups.GroupListView.as_view(), name='groups'),
|
path('groups/', groups.GroupListView.as_view(), name='groups'),
|
||||||
# Debug
|
# Debug
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
"""passbook AuditEntry administration"""
|
"""passbook Event administration"""
|
||||||
from django.views.generic import ListView
|
from django.views.generic import ListView
|
||||||
from guardian.mixins import PermissionListMixin
|
from guardian.mixins import PermissionListMixin
|
||||||
|
|
||||||
from passbook.audit.models import AuditEntry
|
from passbook.audit.models import Event
|
||||||
|
|
||||||
|
|
||||||
class AuditEntryListView(PermissionListMixin, ListView):
|
class EventListView(PermissionListMixin, ListView):
|
||||||
"""Show list of all invitations"""
|
"""Show list of all invitations"""
|
||||||
|
|
||||||
model = AuditEntry
|
model = Event
|
||||||
template_name = 'administration/audit/list.html'
|
template_name = 'administration/audit/list.html'
|
||||||
permission_required = 'passbook_audit.view_auditentry'
|
permission_required = 'passbook_audit.view_event'
|
||||||
ordering = '-created'
|
ordering = '-created'
|
||||||
paginate_by = 10
|
paginate_by = 10
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return AuditEntry.objects.all().order_by('-created')
|
return Event.objects.all().order_by('-created')
|
||||||
|
19
passbook/audit/migrations/0002_auto_20191028_0829.py
Normal file
19
passbook/audit/migrations/0002_auto_20191028_0829.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 2.2.6 on 2019-10-28 08:29
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('passbook_audit', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='AuditEntry',
|
||||||
|
new_name='Event',
|
||||||
|
),
|
||||||
|
]
|
@ -12,8 +12,8 @@ from passbook.lib.models import UUIDModel
|
|||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
|
||||||
class AuditEntry(UUIDModel):
|
class Event(UUIDModel):
|
||||||
"""An individual audit log entry"""
|
"""An individual audit log event"""
|
||||||
|
|
||||||
ACTION_LOGIN = 'login'
|
ACTION_LOGIN = 'login'
|
||||||
ACTION_LOGIN_FAILED = 'login_failed'
|
ACTION_LOGIN_FAILED = 'login_failed'
|
||||||
@ -46,7 +46,7 @@ class AuditEntry(UUIDModel):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create(action, request, **kwargs):
|
def create(action, request, **kwargs):
|
||||||
"""Create AuditEntry from arguments"""
|
"""Create Event from arguments"""
|
||||||
client_ip, _ = get_client_ip(request)
|
client_ip, _ = get_client_ip(request)
|
||||||
if not hasattr(request, 'user'):
|
if not hasattr(request, 'user'):
|
||||||
user = None
|
user = None
|
||||||
@ -54,7 +54,7 @@ class AuditEntry(UUIDModel):
|
|||||||
user = request.user
|
user = request.user
|
||||||
if isinstance(user, AnonymousUser):
|
if isinstance(user, AnonymousUser):
|
||||||
user = kwargs.get('user', None)
|
user = kwargs.get('user', None)
|
||||||
entry = AuditEntry.objects.create(
|
entry = Event.objects.create(
|
||||||
action=action,
|
action=action,
|
||||||
user=user,
|
user=user,
|
||||||
# User 255.255.255.255 as fallback if IP cannot be determined
|
# User 255.255.255.255 as fallback if IP cannot be determined
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
from django.contrib.auth.signals import user_logged_in, user_logged_out
|
from django.contrib.auth.signals import user_logged_in, user_logged_out
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
|
|
||||||
from passbook.audit.models import AuditEntry
|
from passbook.audit.models import Event
|
||||||
from passbook.core.signals import (invitation_created, invitation_used,
|
from passbook.core.signals import (invitation_created, invitation_used,
|
||||||
user_signed_up)
|
user_signed_up)
|
||||||
|
|
||||||
@ -10,26 +10,26 @@ from passbook.core.signals import (invitation_created, invitation_used,
|
|||||||
@receiver(user_logged_in)
|
@receiver(user_logged_in)
|
||||||
def on_user_logged_in(sender, request, user, **kwargs):
|
def on_user_logged_in(sender, request, user, **kwargs):
|
||||||
"""Log successful login"""
|
"""Log successful login"""
|
||||||
AuditEntry.create(AuditEntry.ACTION_LOGIN, request)
|
Event.create(Event.ACTION_LOGIN, request)
|
||||||
|
|
||||||
@receiver(user_logged_out)
|
@receiver(user_logged_out)
|
||||||
def on_user_logged_out(sender, request, user, **kwargs):
|
def on_user_logged_out(sender, request, user, **kwargs):
|
||||||
"""Log successfully logout"""
|
"""Log successfully logout"""
|
||||||
AuditEntry.create(AuditEntry.ACTION_LOGOUT, request)
|
Event.create(Event.ACTION_LOGOUT, request)
|
||||||
|
|
||||||
@receiver(user_signed_up)
|
@receiver(user_signed_up)
|
||||||
def on_user_signed_up(sender, request, user, **kwargs):
|
def on_user_signed_up(sender, request, user, **kwargs):
|
||||||
"""Log successfully signed up"""
|
"""Log successfully signed up"""
|
||||||
AuditEntry.create(AuditEntry.ACTION_SIGN_UP, request)
|
Event.create(Event.ACTION_SIGN_UP, request)
|
||||||
|
|
||||||
@receiver(invitation_created)
|
@receiver(invitation_created)
|
||||||
def on_invitation_created(sender, request, invitation, **kwargs):
|
def on_invitation_created(sender, request, invitation, **kwargs):
|
||||||
"""Log Invitation creation"""
|
"""Log Invitation creation"""
|
||||||
AuditEntry.create(AuditEntry.ACTION_INVITE_CREATED, request,
|
Event.create(Event.ACTION_INVITE_CREATED, request,
|
||||||
invitation_uuid=invitation.uuid.hex)
|
invitation_uuid=invitation.uuid.hex)
|
||||||
|
|
||||||
@receiver(invitation_used)
|
@receiver(invitation_used)
|
||||||
def on_invitation_used(sender, request, invitation, **kwargs):
|
def on_invitation_used(sender, request, invitation, **kwargs):
|
||||||
"""Log Invitation usage"""
|
"""Log Invitation usage"""
|
||||||
AuditEntry.create(AuditEntry.ACTION_INVITE_USED, request,
|
Event.create(Event.ACTION_INVITE_USED, request,
|
||||||
invitation_uuid=invitation.uuid.hex)
|
invitation_uuid=invitation.uuid.hex)
|
||||||
|
@ -8,7 +8,7 @@ from django.utils.translation import ugettext as _
|
|||||||
from oauth2_provider.views.base import AuthorizationView
|
from oauth2_provider.views.base import AuthorizationView
|
||||||
from structlog import get_logger
|
from structlog import get_logger
|
||||||
|
|
||||||
from passbook.audit.models import AuditEntry
|
from passbook.audit.models import Event
|
||||||
from passbook.core.models import Application
|
from passbook.core.models import Application
|
||||||
from passbook.core.views.access import AccessMixin
|
from passbook.core.views.access import AccessMixin
|
||||||
from passbook.core.views.utils import LoadingView, PermissionDeniedView
|
from passbook.core.views.utils import LoadingView, PermissionDeniedView
|
||||||
@ -77,8 +77,8 @@ class PassbookAuthorizationView(AccessMixin, AuthorizationView):
|
|||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
# User has clicked on "Authorize"
|
# User has clicked on "Authorize"
|
||||||
AuditEntry.create(
|
Event.create(
|
||||||
action=AuditEntry.ACTION_AUTHORIZE_APPLICATION,
|
action=Event.ACTION_AUTHORIZE_APPLICATION,
|
||||||
request=self.request,
|
request=self.request,
|
||||||
app=str(self._application))
|
app=str(self._application))
|
||||||
LOGGER.debug('user %s authorized %s', self.request.user, self._application)
|
LOGGER.debug('user %s authorized %s', self.request.user, self._application)
|
||||||
|
@ -3,7 +3,7 @@ from django.contrib import messages
|
|||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
from structlog import get_logger
|
from structlog import get_logger
|
||||||
|
|
||||||
from passbook.audit.models import AuditEntry
|
from passbook.audit.models import Event
|
||||||
from passbook.core.models import Application
|
from passbook.core.models import Application
|
||||||
from passbook.policies.engine import PolicyEngine
|
from passbook.policies.engine import PolicyEngine
|
||||||
|
|
||||||
@ -28,8 +28,8 @@ def check_permissions(request, user, client):
|
|||||||
messages.error(request, policy_message)
|
messages.error(request, policy_message)
|
||||||
return redirect('passbook_providers_oauth:oauth2-permission-denied')
|
return redirect('passbook_providers_oauth:oauth2-permission-denied')
|
||||||
|
|
||||||
AuditEntry.create(
|
Event.create(
|
||||||
action=AuditEntry.ACTION_AUTHORIZE_APPLICATION,
|
action=Event.ACTION_AUTHORIZE_APPLICATION,
|
||||||
request=request,
|
request=request,
|
||||||
app=application.name,
|
app=application.name,
|
||||||
skipped_authorization=False)
|
skipped_authorization=False)
|
||||||
|
@ -13,7 +13,7 @@ from django.views.decorators.csrf import csrf_exempt
|
|||||||
from signxml.util import strip_pem_header
|
from signxml.util import strip_pem_header
|
||||||
from structlog import get_logger
|
from structlog import get_logger
|
||||||
|
|
||||||
from passbook.audit.models import AuditEntry
|
from passbook.audit.models import Event
|
||||||
from passbook.core.models import Application
|
from passbook.core.models import Application
|
||||||
from passbook.lib.mixins import CSRFExemptMixin
|
from passbook.lib.mixins import CSRFExemptMixin
|
||||||
from passbook.lib.utils.template import render_to_string
|
from passbook.lib.utils.template import render_to_string
|
||||||
@ -123,8 +123,8 @@ class LoginProcessView(AccessRequiredView):
|
|||||||
if self.provider.application.skip_authorization:
|
if self.provider.application.skip_authorization:
|
||||||
ctx = self.provider.processor.generate_response()
|
ctx = self.provider.processor.generate_response()
|
||||||
# Log Application Authorization
|
# Log Application Authorization
|
||||||
AuditEntry.create(
|
Event.create(
|
||||||
action=AuditEntry.ACTION_AUTHORIZE_APPLICATION,
|
action=Event.ACTION_AUTHORIZE_APPLICATION,
|
||||||
request=request,
|
request=request,
|
||||||
app=self.provider.application.name,
|
app=self.provider.application.name,
|
||||||
skipped_authorization=True)
|
skipped_authorization=True)
|
||||||
@ -145,8 +145,8 @@ class LoginProcessView(AccessRequiredView):
|
|||||||
# Check if user has access
|
# Check if user has access
|
||||||
if request.POST.get('ACSUrl', None):
|
if request.POST.get('ACSUrl', None):
|
||||||
# User accepted request
|
# User accepted request
|
||||||
AuditEntry.create(
|
Event.create(
|
||||||
action=AuditEntry.ACTION_AUTHORIZE_APPLICATION,
|
action=Event.ACTION_AUTHORIZE_APPLICATION,
|
||||||
request=request,
|
request=request,
|
||||||
app=self.provider.application.name,
|
app=self.provider.application.name,
|
||||||
skipped_authorization=False)
|
skipped_authorization=False)
|
||||||
|
Reference in New Issue
Block a user