From b2bea677efba67522452cf0ce395c47d6ab909c1 Mon Sep 17 00:00:00 2001 From: MOIS3Y Date: Thu, 14 Sep 2023 21:36:41 +0900 Subject: [PATCH] Add: http custom error pages, more checks js possible error, check if file delete from storage by cli --- logs_collector/collector/api/views.py | 16 +++++++++---- logs_collector/collector/middleware.py | 24 +++++++++++++++++++ .../static/collector/js/jq.upload.progress.js | 17 +++++++------ logs_collector/collector/views.py | 6 ++++- logs_collector/logs_collector/settings.py | 1 + logs_collector/templates/403_csrf.html | 10 ++++++++ logs_collector/templates/404.html | 10 ++++++++ logs_collector/templates/405.html | 14 +++++++++++ logs_collector/templates/500.html | 10 ++++++++ logs_collector/templates/base.html | 2 ++ logs_collector/templates/errors.html | 20 ++++++++++++++++ logs_collector/templates/includes/footer.html | 19 +++++++++++---- 12 files changed, 129 insertions(+), 20 deletions(-) create mode 100644 logs_collector/collector/middleware.py create mode 100644 logs_collector/templates/403_csrf.html create mode 100644 logs_collector/templates/404.html create mode 100644 logs_collector/templates/405.html create mode 100644 logs_collector/templates/500.html create mode 100644 logs_collector/templates/errors.html diff --git a/logs_collector/collector/api/views.py b/logs_collector/collector/api/views.py index 4667a33..cca3588 100644 --- a/logs_collector/collector/api/views.py +++ b/logs_collector/collector/api/views.py @@ -83,29 +83,35 @@ class ArchiveViewSet(viewsets.ModelViewSet): bound_ticket = Ticket.objects.get(token=upload_token) if bound_ticket.resolved: return Response( - {'error': f'ticket {bound_ticket} already resolved'}, + {'detail': f'ticket {bound_ticket} already resolved'}, status=status.HTTP_423_LOCKED ) if bound_ticket.attempts <= 0: return Response( - {'error': f'token {upload_token} expired'}, + {'detail': f'token {upload_token} expired'}, status=status.HTTP_423_LOCKED ) bound_ticket.attempts -= 1 bound_ticket.save() # ? mixin bound ticket number to request.data from user - request.data['ticket'] = bound_ticket.number + try: + request.data['ticket'] = bound_ticket.number + except AttributeError: + return Response( + {'detail': 'Bad Request'}, + status=status.HTTP_400_BAD_REQUEST + ) # ? change serializer for guest user if not request.user.is_authenticated: self.serializer_class = PublicArchiveUploadSerializer except (ValidationError, ObjectDoesNotExist,): return Response( - {'error': f'token {upload_token} is not valid'}, + {'detail': f'token {upload_token} is not valid'}, status=status.HTTP_403_FORBIDDEN ) else: return Response( - {'error': 'Header Upload-Token is required'}, + {'detail': 'Header Upload-Token is required'}, status=status.HTTP_401_UNAUTHORIZED ) # ! default create method: diff --git a/logs_collector/collector/middleware.py b/logs_collector/collector/middleware.py new file mode 100644 index 0000000..024f84a --- /dev/null +++ b/logs_collector/collector/middleware.py @@ -0,0 +1,24 @@ +from django.http import HttpResponse +from django.template import loader + + +class HttpResponseNotAllowedMiddleware: + def __init__(self, get_response): + self.get_response = get_response + # One-time configuration and initialization. + + def __call__(self, request): + + # Code to be executed for each request before + # the view (and later middleware) are called. + + response = self.get_response(request) + + # Code to be executed for each request/response after + # the view is called. + if response.status_code == 405: + context = {} + template = loader.get_template('405.html') + return HttpResponse(template.render(context, request)) + + return response diff --git a/logs_collector/collector/static/collector/js/jq.upload.progress.js b/logs_collector/collector/static/collector/js/jq.upload.progress.js index 7ccb26e..fb21ba3 100644 --- a/logs_collector/collector/static/collector/js/jq.upload.progress.js +++ b/logs_collector/collector/static/collector/js/jq.upload.progress.js @@ -54,7 +54,6 @@ $(function () { } }, success: function(data, textStatus, jqXHR){ - console.log(jqXHR.status); alertContainer.innerHTML = genAlertMessage( 'The file has been successfully uploaded to the server. Thank you!', 'success', @@ -69,13 +68,15 @@ $(function () { }; }, error: function(jqXHR, textStatus, errorThrown){ - console.log(jqXHR); let errorMessage = "Unexpected error. Try again please" if (jqXHR.status === 423 || jqXHR.status === 403) { - errorMessage = `Error ${jqXHR.status}: ${jqXHR.responseJSON.error}` + errorMessage = `Error ${jqXHR.status}
${jqXHR.responseJSON.detail}` } if (jqXHR.status === 401) { - errorMessage = 'The token field cannot be empty' + errorMessage = `Error ${jqXHR.status}
The token field cannot be empty` + } + if (jqXHR.status === 400) { + errorMessage = `Error ${jqXHR.status}
${jqXHR.responseJSON.detail}` } alertContainer.innerHTML = genAlertMessage( errorMessage, @@ -97,14 +98,14 @@ $(function () { success: function (data, textStatus, jqXHR) { if (data.attempts === 0) { alertContainer.innerHTML = genAlertMessage( - `Token: ${uploadToken} expired`, + `Error 423
Token: ${uploadToken} expired`, 'danger', 'col-lg-6' ); } else if (data.resolved === true) { alertContainer.innerHTML = genAlertMessage( - `Ticket bound with token: ${uploadToken}
already resolved`, + `Error 423
Ticket bound with token: ${uploadToken}
already resolved`, 'danger', 'col-lg-6' ); @@ -118,11 +119,9 @@ $(function () { }; }, error: function(jqXHR){ - console.log(jqXHR) - console.log(jqXHR.responseJSON.detail) if (jqXHR.responseJSON.detail) { alertContainer.innerHTML = genAlertMessage( - `Token: ${uploadToken} is not valid`, + `Error 403
Token: ${uploadToken} is not valid`, 'danger', 'col-lg-6' ) diff --git a/logs_collector/collector/views.py b/logs_collector/collector/views.py index db7dd8d..9ddf6da 100644 --- a/logs_collector/collector/views.py +++ b/logs_collector/collector/views.py @@ -1,5 +1,5 @@ from django.contrib.auth.mixins import LoginRequiredMixin -from django.http import FileResponse +from django.http import FileResponse, Http404 from django.views import generic from django.views.generic.detail import SingleObjectMixin from django.db.models import Q @@ -35,6 +35,10 @@ class ArchiveHandlerView( def get(self, request, path): self.object = self.get_object() + try: + self.object.file.size + except FileNotFoundError: + raise Http404(f'File: {self.object.file} not found') return FileResponse(self.object.file) diff --git a/logs_collector/logs_collector/settings.py b/logs_collector/logs_collector/settings.py index 24abd93..60faab5 100644 --- a/logs_collector/logs_collector/settings.py +++ b/logs_collector/logs_collector/settings.py @@ -89,6 +89,7 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', + 'collector.middleware.HttpResponseNotAllowedMiddleware', ] ROOT_URLCONF = 'logs_collector.urls' diff --git a/logs_collector/templates/403_csrf.html b/logs_collector/templates/403_csrf.html new file mode 100644 index 0000000..8ba4610 --- /dev/null +++ b/logs_collector/templates/403_csrf.html @@ -0,0 +1,10 @@ +{% extends 'errors.html' %} +{% load static %} + +{% block title %} Logs Collector - CSRF error {% endblock title %} + +{% block status_code %}403{% endblock status_code %} +{% block error_message %} +

Opps! CSRF verification failed.

+

Request aborted

+{% endblock error_message %} diff --git a/logs_collector/templates/404.html b/logs_collector/templates/404.html new file mode 100644 index 0000000..4ec69c7 --- /dev/null +++ b/logs_collector/templates/404.html @@ -0,0 +1,10 @@ +{% extends 'errors.html' %} +{% load static %} + +{% block title %} Logs Collector - Not Found {% endblock title %} + +{% block status_code %}404{% endblock status_code %} +{% block error_message %} +

Opps! Page not found.

+

The content you're looking for doesn't exist.

+{% endblock error_message %} diff --git a/logs_collector/templates/405.html b/logs_collector/templates/405.html new file mode 100644 index 0000000..b0d0dc2 --- /dev/null +++ b/logs_collector/templates/405.html @@ -0,0 +1,14 @@ +{% extends 'errors.html' %} +{% load static %} + +{% block title %} Logs Collector - Method not allowed {% endblock title %} + +{% block status_code %}405{% endblock status_code %} +{% block error_message %} +

Opps! Method not allowed

+

+ Request method: + {{ request.method }} + isn't allowed for this URL +

+{% endblock error_message %} diff --git a/logs_collector/templates/500.html b/logs_collector/templates/500.html new file mode 100644 index 0000000..aa07d30 --- /dev/null +++ b/logs_collector/templates/500.html @@ -0,0 +1,10 @@ +{% extends 'errors.html' %} +{% load static %} + +{% block title %} Logs Collector - Server error {% endblock title %} + +{% block status_code %}500{% endblock status_code %} +{% block error_message %} +

Opps! Server error

+

Unexpected error, please try again or contact system admin

+{% endblock error_message %} diff --git a/logs_collector/templates/base.html b/logs_collector/templates/base.html index e1cedcd..07002b1 100644 --- a/logs_collector/templates/base.html +++ b/logs_collector/templates/base.html @@ -34,10 +34,12 @@ rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css" > + {% block errors_head %}{% endblock errors_head %} {% block collector_head %}{% endblock collector_head %} {% block account_head %}{% endblock account_head %} + {% block http_errors %}{% endblock http_errors %} {% block collector_content %}{% endblock collector_content %} {% block account_content %}{% endblock account_content %} diff --git a/logs_collector/templates/errors.html b/logs_collector/templates/errors.html new file mode 100644 index 0000000..e767f39 --- /dev/null +++ b/logs_collector/templates/errors.html @@ -0,0 +1,20 @@ +{% extends 'base.html' %} +{% load static %} + +{% block errors_head %} + {% block title %}{% endblock title %} +{% endblock errors_head %} + +{% block http_errors %} +
+
+

{% block status_code %}{% endblock status_code %}

+ {% block error_message %}{% endblock error_message %} + Go Home +
+ + +
+{% endblock http_errors %} diff --git a/logs_collector/templates/includes/footer.html b/logs_collector/templates/includes/footer.html index e51dd7c..0c579eb 100644 --- a/logs_collector/templates/includes/footer.html +++ b/logs_collector/templates/includes/footer.html @@ -1,21 +1,29 @@