Sunil Mohan Adapa 35312bd672
first_boot: Allow the next steps page to be revisited
- Currently, after the user arrives the 'next steps' page after completing the
first setup, trying to refresh the page takes us away from the page to the index
page.

- Since this page lists a lot of steps, user can't be expected to memorize the
contents of the page and perform them one after the another. Opening the links
in popups instead of navigating away from page helps but not full solve the
problem.

- If the page is a regular page and not part of the first step wizard, this page
is a simple Django page. It can be refreshed. Back button can be used to view
the page after navigating from it again.

Tests:

- On stable and testing containers, remove the sqlite3 file and start the
service. This will trigger the first setup wizard. As a last step of the wizard,
the 'setup complete! Next steps:' page is shown.

- Refreshing the page works.

- Navigating away from the page and using the back button to return to it works.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
2024-10-10 09:23:36 +03:00

71 lines
2.6 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Django middleware to redirect to firstboot wizard if it has not be run
yet.
"""
import logging
from django.conf import settings
from django.http.response import HttpResponseRedirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
from plinth import setup
from plinth.modules import first_boot
from plinth.utils import is_user_admin
LOGGER = logging.getLogger(__name__)
class FirstBootMiddleware(MiddlewareMixin):
"""Forward to firstboot page if firstboot isn't finished yet."""
@staticmethod
def process_request(request):
"""Handle a request as Django middleware request handler."""
# Don't interfere with login page
user_requests_login = request.path.startswith(
reverse(settings.LOGIN_URL))
if user_requests_login:
return
# Don't interfere with help pages
user_requests_help = request.path.startswith(reverse('help:index'))
if user_requests_help:
return
# Don't interfere with first setup progress page. When first setup is
# still running, no apps may have provided the first boot steps. This
# will result in first boot wizard getting marked as completed
# prematurely.
if setup.is_first_setup_running:
return
firstboot_completed = first_boot.is_completed()
user_requests_firstboot = first_boot.is_firstboot_url(request.path)
# If user requests a step other than the welcome step, verify that they
# indeed completed the secret verification by looking at the session.
if (user_requests_firstboot
and not request.path.startswith(reverse('first_boot:welcome'))
and first_boot.firstboot_wizard_secret_exists()
and not request.session.get('firstboot_secret_provided', False)
and not is_user_admin(request)):
return HttpResponseRedirect(reverse('first_boot:welcome'))
# Redirect to first boot if requesting normal page and first
# boot is not complete.
if not firstboot_completed and not user_requests_firstboot:
next_step = first_boot.next_step_or_none()
if next_step:
return HttpResponseRedirect(reverse(next_step))
else:
# No more steps in first boot
first_boot.set_completed()
# Redirect to 'complete' page if user requested firstboot after it is
# finished.
if firstboot_completed and user_requests_firstboot:
return HttpResponseRedirect(reverse('first_boot:complete'))