From 01bc8ab9c6d8ec5752aaf0be1468ddcd41ddb3f6 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 24 Apr 2020 12:49:10 +0200 Subject: [PATCH 2/7] models: add SessionIndex model (#41949) --- mellon/migrations/0002_sessionindex.py | 28 +++++++++++++++++++++++++ mellon/models.py | 29 ++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 mellon/migrations/0002_sessionindex.py diff --git mellon/migrations/0002_sessionindex.py mellon/migrations/0002_sessionindex.py new file mode 100644 index 0000000..20886c3 --- /dev/null +++ mellon/migrations/0002_sessionindex.py @@ -0,0 +1,28 @@ +# Generated by Django 2.2.12 on 2020-04-24 05:14 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mellon', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='SessionIndex', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('session_index', models.TextField(verbose_name='SAML SessionIndex')), + ('session_key', models.CharField(max_length=40, verbose_name='Django session key')), + ('saml_identifier', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mellon.UserSAMLIdentifier', verbose_name='SAML identifier')), + ], + options={ + 'verbose_name': 'SAML SessionIndex', + 'verbose_name_plural': 'SAML SessionIndexes', + 'unique_together': {('saml_identifier', 'session_index', 'session_key')}, + }, + ), + ] diff --git mellon/models.py mellon/models.py index 8e52c13..950f741 100644 --- mellon/models.py +++ mellon/models.py @@ -15,6 +15,8 @@ from __future__ import unicode_literals +from importlib import import_module + from django.db import models from django.utils.translation import ugettext_lazy as _ from django.conf import settings @@ -38,3 +40,30 @@ class UserSAMLIdentifier(models.Model): verbose_name = _('user SAML identifier') verbose_name_plural = _('users SAML identifiers') unique_together = (('issuer', 'name_id'),) + + +class SessionIndex(models.Model): + session_index = models.TextField(_('SAML SessionIndex')) + session_key = models.CharField(_('Django session key'), max_length=40) + saml_identifier = models.ForeignKey( + verbose_name=_('SAML identifier'), + to=UserSAMLIdentifier, + on_delete=models.CASCADE) + + @staticmethod + def cleanup(cls): + session_engine = import_module(settings.SESSION_ENGINE) + store = session_engine.SessionStore() + + ids = [] + for si in cls.objects.all(): + if not store.exists(si.session_key): + ids.append(si.id) + cls.objects.filter(id__in=ids).delete() + + class Meta: + verbose_name = _('SAML SessionIndex') + verbose_name_plural = _('SAML SessionIndexes') + unique_together = ( + ('saml_identifier', 'session_index', 'session_key'), + ) -- 2.26.0