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 %} +