Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-django-axes for openSUSE:Factory checked in at 2023-12-28 23:01:12 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-django-axes (Old) and /work/SRC/openSUSE:Factory/.python-django-axes.new.28375 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-django-axes" Thu Dec 28 23:01:12 2023 rev:6 rq:1135244 version:6.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-django-axes/python-django-axes.changes 2023-12-03 20:49:37.603568816 +0100 +++ /work/SRC/openSUSE:Factory/.python-django-axes.new.28375/python-django-axes.changes 2023-12-28 23:02:51.361496270 +0100 @@ -1,0 +2,9 @@ +Wed Dec 27 09:32:48 UTC 2023 - Dirk Müller <dmuel...@suse.com> + +- update to 6.2.0: + * Update documentation. + * Add new management command ``axes_reset_ip_username``. + * Add French translations. + * Avoid running data migration on incorrect databases. + +------------------------------------------------------------------- Old: ---- django-axes-6.1.1.tar.gz New: ---- django-axes-6.2.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-django-axes.spec ++++++ --- /var/tmp/diff_new_pack.SWnj4o/_old 2023-12-28 23:02:51.921516737 +0100 +++ /var/tmp/diff_new_pack.SWnj4o/_new 2023-12-28 23:02:51.921516737 +0100 @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-django-axes -Version: 6.1.1 +Version: 6.2.0 Release: 0 License: MIT Summary: Keep track of failed login attempts in Django-powered sites ++++++ django-axes-6.1.1.tar.gz -> django-axes-6.2.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/.github/workflows/codeql.yml new/django-axes-6.2.0/.github/workflows/codeql.yml --- old/django-axes-6.1.1/.github/workflows/codeql.yml 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/.github/workflows/codeql.yml 2023-12-08 18:59:34.000000000 +0100 @@ -14,7 +14,7 @@ steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/.github/workflows/release.yml new/django-axes-6.2.0/.github/workflows/release.yml --- old/django-axes-6.1.1/.github/workflows/release.yml 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/.github/workflows/release.yml 2023-12-08 18:59:34.000000000 +0100 @@ -14,12 +14,12 @@ runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/.github/workflows/test.yml new/django-axes-6.2.0/.github/workflows/test.yml --- old/django-axes-6.1.1/.github/workflows/test.yml 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/.github/workflows/test.yml 2023-12-08 18:59:34.000000000 +0100 @@ -40,10 +40,10 @@ steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/CHANGES.rst new/django-axes-6.2.0/CHANGES.rst --- old/django-axes-6.1.1/CHANGES.rst 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/CHANGES.rst 2023-12-08 18:59:34.000000000 +0100 @@ -3,6 +3,19 @@ ======= +6.2.0 (2023-12-08) +------------------ + +- Update documentation. + [funkybob] +- Add new management command ``axes_reset_ip_username``. + [p-l-] +- Add French translations. + [laulaz] +- Avoid running data migration on incorrect databases. + [christianbundy] + + 6.1.1 (2023-08-01) ------------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/PKG-INFO new/django-axes-6.2.0/PKG-INFO --- old/django-axes-6.1.1/PKG-INFO 2023-09-01 09:55:55.328319500 +0200 +++ new/django-axes-6.2.0/PKG-INFO 2023-12-08 18:59:48.553557400 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: django-axes -Version: 6.1.1 +Version: 6.2.0 Summary: Keep track of failed login attempts in Django-powered sites. Home-page: https://github.com/jazzband/django-axes Author: Josh VanderLinden, Philip Neustrom, Michael Blume, Alex Clark, Camilo Nova, Aleksi Hakli @@ -35,8 +35,11 @@ Classifier: Topic :: Security Classifier: Topic :: System :: Logging Requires-Python: >=3.7 -Provides-Extra: ipware License-File: LICENSE +Requires-Dist: django>=3.2 +Requires-Dist: setuptools +Provides-Extra: ipware +Requires-Dist: django-ipware>=3; extra == "ipware" django-axes @@ -127,6 +130,19 @@ ======= +6.2.0 (2023-12-08) +------------------ + +- Update documentation. + [funkybob] +- Add new management command ``axes_reset_ip_username``. + [p-l-] +- Add French translations. + [laulaz] +- Avoid running data migration on incorrect databases. + [christianbundy] + + 6.1.1 (2023-08-01) ------------------ Binary files old/django-axes-6.1.1/axes/locale/fr/LC_MESSAGES/django.mo and new/django-axes-6.2.0/axes/locale/fr/LC_MESSAGES/django.mo differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/axes/locale/fr/LC_MESSAGES/django.po new/django-axes-6.2.0/axes/locale/fr/LC_MESSAGES/django.po --- old/django-axes-6.1.1/axes/locale/fr/LC_MESSAGES/django.po 1970-01-01 01:00:00.000000000 +0100 +++ new/django-axes-6.2.0/axes/locale/fr/LC_MESSAGES/django.po 2023-12-08 18:59:34.000000000 +0100 @@ -0,0 +1,109 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-11-06 05:21-0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <l...@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin.py:27 +msgid "Form Data" +msgstr "Données de formulaire" + +#: admin.py:28 admin.py:65 admin.py:100 +msgid "Meta Data" +msgstr "Métadonnées" + +#: conf.py:108 +msgid "Account locked: too many login attempts. Please try again later." +msgstr "" +"Compte verrouillé: trop de tentatives de connexion. Veuillez réessayer plus " +"tard." + +#: conf.py:116 +msgid "" +"Account locked: too many login attempts. Contact an admin to unlock your " +"account." +msgstr "" +"Compte verrouillé: trop de tentatives de connexion. Contactez un " +"administrateur pour déverrouiller votre compte." + +#: models.py:6 +msgid "User Agent" +msgstr "User Agent" + +#: models.py:8 +msgid "IP Address" +msgstr "Adresse IP" + +#: models.py:10 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: models.py:12 +msgid "HTTP Accept" +msgstr "HTTP Accept" + +#: models.py:14 +msgid "Path" +msgstr "Chemin" + +#: models.py:16 +msgid "Attempt Time" +msgstr "Date de la tentative" + +#: models.py:26 +msgid "Access lock out" +msgstr "Verrouillage de l'accès" + +#: models.py:34 +msgid "access failure" +msgstr "échec de connexion" + +#: models.py:35 +msgid "access failures" +msgstr "échecs de connexion" + +#: models.py:39 +msgid "GET Data" +msgstr "Données GET" + +#: models.py:41 +msgid "POST Data" +msgstr "Données POST" + +#: models.py:43 +msgid "Failed Logins" +msgstr "Nombre d'échecs" + +#: models.py:49 +msgid "access attempt" +msgstr "tentative de connexion" + +#: models.py:50 +msgid "access attempts" +msgstr "tentatives de connexion" + +#: models.py:55 +msgid "Logout Time" +msgstr "Date de la déconnexion" + +#: models.py:61 +msgid "access log" +msgstr "connexion" + +#: models.py:62 +msgid "access logs" +msgstr "connexions" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/axes/management/commands/axes_reset_ip_username.py new/django-axes-6.2.0/axes/management/commands/axes_reset_ip_username.py --- old/django-axes-6.1.1/axes/management/commands/axes_reset_ip_username.py 1970-01-01 01:00:00.000000000 +0100 +++ new/django-axes-6.2.0/axes/management/commands/axes_reset_ip_username.py 2023-12-08 18:59:34.000000000 +0100 @@ -0,0 +1,19 @@ +from django.core.management.base import BaseCommand + +from axes.utils import reset + + +class Command(BaseCommand): + help = "Reset all access attempts and lockouts for a given IP address and username" + + def add_arguments(self, parser): + parser.add_argument("ip", type=str) + parser.add_argument("username", type=str) + + def handle(self, *args, **options): + count = reset(ip=options["ip"], username=options["username"]) + + if count: + self.stdout.write(f"{count} attempts removed.") + else: + self.stdout.write("No attempts found.") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/axes/migrations/0007_alter_accessattempt_unique_together.py new/django-axes-6.2.0/axes/migrations/0007_alter_accessattempt_unique_together.py --- old/django-axes-6.1.1/axes/migrations/0007_alter_accessattempt_unique_together.py 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/axes/migrations/0007_alter_accessattempt_unique_together.py 2023-12-08 18:59:34.000000000 +0100 @@ -1,12 +1,16 @@ # Generated by Django 3.2.7 on 2021-09-13 15:16 -from django.db import migrations +from django.db import migrations, router from django.db.models import Count def deduplicate_attempts(apps, schema_editor): AccessAttempt = apps.get_model("axes", "AccessAttempt") db_alias = schema_editor.connection.alias + + if db_alias != router.db_for_write(AccessAttempt): + return + duplicated_attempts = ( AccessAttempt.objects.using(db_alias) .values("username", "user_agent", "ip_address") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/django_axes.egg-info/PKG-INFO new/django-axes-6.2.0/django_axes.egg-info/PKG-INFO --- old/django-axes-6.1.1/django_axes.egg-info/PKG-INFO 2023-09-01 09:55:55.000000000 +0200 +++ new/django-axes-6.2.0/django_axes.egg-info/PKG-INFO 2023-12-08 18:59:48.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: django-axes -Version: 6.1.1 +Version: 6.2.0 Summary: Keep track of failed login attempts in Django-powered sites. Home-page: https://github.com/jazzband/django-axes Author: Josh VanderLinden, Philip Neustrom, Michael Blume, Alex Clark, Camilo Nova, Aleksi Hakli @@ -35,8 +35,11 @@ Classifier: Topic :: Security Classifier: Topic :: System :: Logging Requires-Python: >=3.7 -Provides-Extra: ipware License-File: LICENSE +Requires-Dist: django>=3.2 +Requires-Dist: setuptools +Provides-Extra: ipware +Requires-Dist: django-ipware>=3; extra == "ipware" django-axes @@ -127,6 +130,19 @@ ======= +6.2.0 (2023-12-08) +------------------ + +- Update documentation. + [funkybob] +- Add new management command ``axes_reset_ip_username``. + [p-l-] +- Add French translations. + [laulaz] +- Avoid running data migration on incorrect databases. + [christianbundy] + + 6.1.1 (2023-08-01) ------------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/django_axes.egg-info/SOURCES.txt new/django-axes-6.2.0/django_axes.egg-info/SOURCES.txt --- old/django-axes-6.1.1/django_axes.egg-info/SOURCES.txt 2023-09-01 09:55:55.000000000 +0200 +++ new/django-axes-6.2.0/django_axes.egg-info/SOURCES.txt 2023-12-08 18:59:48.000000000 +0100 @@ -47,6 +47,8 @@ axes/locale/ar/LC_MESSAGES/django.po axes/locale/de/LC_MESSAGES/django.mo axes/locale/de/LC_MESSAGES/django.po +axes/locale/fr/LC_MESSAGES/django.mo +axes/locale/fr/LC_MESSAGES/django.po axes/locale/id/LC_MESSAGES/django.mo axes/locale/id/LC_MESSAGES/django.po axes/locale/pl/LC_MESSAGES/django.mo @@ -61,6 +63,7 @@ axes/management/commands/axes_reset.py axes/management/commands/axes_reset_failure_logs.py axes/management/commands/axes_reset_ip.py +axes/management/commands/axes_reset_ip_username.py axes/management/commands/axes_reset_logs.py axes/management/commands/axes_reset_username.py axes/migrations/0001_initial.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/docs/2_installation.rst new/django-axes-6.2.0/docs/2_installation.rst --- old/django-axes-6.1.1/docs/2_installation.rst 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/docs/2_installation.rst 2023-12-08 18:59:34.000000000 +0100 @@ -34,10 +34,10 @@ 'django.contrib.auth.backends.ModelBackend', ] - For backwards compatibility, ``AxesBackend`` can be used in place of ``AxesStandaloneBackend``. - The only difference is that ``AxesBackend`` also provides the permissions-checking functionality - of Django's ``ModelBackend`` behind the scenes. We recommend using ``AxesStandaloneBackend`` - if you have any custom logic to override Django's standard permissions checks. +For backwards compatibility, ``AxesBackend`` can be used in place of ``AxesStandaloneBackend``. +The only difference is that ``AxesBackend`` also provides the permissions-checking functionality +of Django's ``ModelBackend`` behind the scenes. We recommend using ``AxesStandaloneBackend`` +if you have any custom logic to override Django's standard permissions checks. **3.** Add ``axes.middleware.AxesMiddleware`` to your list of ``MIDDLEWARE``:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/docs/3_usage.rst new/django-axes-6.2.0/docs/3_usage.rst --- old/django-axes-6.1.1/docs/3_usage.rst 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/docs/3_usage.rst 2023-12-08 18:59:34.000000000 +0100 @@ -80,7 +80,7 @@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Axes offers a command line interface with -``axes_reset``, ``axes_reset_ip``, and ``axes_reset_username`` +``axes_reset``, ``axes_reset_ip``, ``axes_reset_username``, and ``axes_reset_ip_username`` management commands with the Django ``manage.py`` or ``django-admin`` command helpers: - ``python manage.py axes_reset`` @@ -89,6 +89,8 @@ will clear lockouts and records for the given IP addresses. - ``python manage.py axes_reset_username [username ...]`` will clear lockouts and records for the given usernames. +- ``python manage.py axes_reset_ip_username [ip] [username]`` + will clear lockouts and records for the given IP address and username. - ``python manage.py axes_reset_logs (age)`` will reset (i.e. delete) AccessLog records that are older than the given age where the default is 30 days. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/requirements-qa.txt new/django-axes-6.2.0/requirements-qa.txt --- old/django-axes-6.1.1/requirements-qa.txt 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/requirements-qa.txt 2023-12-08 18:59:34.000000000 +0100 @@ -1,4 +1,4 @@ -black==23.7.0 -mypy==1.5.1 -prospector==1.10.2 +black==23.11.0 +mypy==1.7.1 +prospector==1.10.3 types-pkg_resources # Type stub diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/requirements-test.txt new/django-axes-6.2.0/requirements-test.txt --- old/django-axes-6.1.1/requirements-test.txt 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/requirements-test.txt 2023-12-08 18:59:34.000000000 +0100 @@ -1,7 +1,7 @@ -e . django-ipware>=3 -coverage==7.3.0 -pytest==7.4.0 +coverage==7.3.2 +pytest==7.4.3 pytest-cov==4.1.0 -pytest-django==4.5.2 +pytest-django==4.7.0 pytest-subtests==0.11.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/requirements.txt new/django-axes-6.2.0/requirements.txt --- old/django-axes-6.1.1/requirements.txt 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/requirements.txt 2023-12-08 18:59:34.000000000 +0100 @@ -1,5 +1,5 @@ -e . -r requirements-qa.txt -r requirements-test.txt -sphinx_rtd_theme==1.3.0 -tox==4.11.0 +sphinx_rtd_theme==2.0.0 +tox==4.11.4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-axes-6.1.1/tests/test_management.py new/django-axes-6.2.0/tests/test_management.py --- old/django-axes-6.1.1/tests/test_management.py 2023-09-01 09:55:38.000000000 +0200 +++ new/django-axes-6.2.0/tests/test_management.py 2023-12-08 18:59:34.000000000 +0100 @@ -56,18 +56,22 @@ username="john.doe", ip_address="10.0.0.2", failures_since_start="15" ) + AccessAttempt.objects.create( + username="richard.doe", ip_address="10.0.0.4", failures_since_start="12" + ) + def test_axes_list_attempts(self): out = StringIO() call_command("axes_list_attempts", stdout=out) - expected = "10.0.0.1\tjane.doe\t4\n10.0.0.2\tjohn.doe\t15\n" + expected = "10.0.0.1\tjane.doe\t4\n10.0.0.2\tjohn.doe\t15\n10.0.0.4\trichard.doe\t12\n" self.assertEqual(expected, out.getvalue()) def test_axes_reset(self): out = StringIO() call_command("axes_reset", stdout=out) - expected = "2 attempts removed.\n" + expected = "3 attempts removed.\n" self.assertEqual(expected, out.getvalue()) def test_axes_reset_not_found(self): @@ -86,6 +90,13 @@ expected = "1 attempts removed.\n" self.assertEqual(expected, out.getvalue()) + + def test_axes_reset_ip_username(self): + out = StringIO() + call_command("axes_reset_ip_username", "10.0.0.4", "richard.doe", stdout=out) + + expected = "1 attempts removed.\n" + self.assertEqual(expected, out.getvalue()) def test_axes_reset_ip_not_found(self): out = StringIO()