From f52d869b5f2ac6395ee29b86a78959154444ea9c Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Sun, 7 Jan 2018 23:55:27 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Protection=20avanc=C3=A9e=20sur=20les=20uti?= =?UTF-8?q?lisateurs=20dot=C3=A9s=20de=20droits?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/forms.py | 2 +- users/migrations/0068_auto_20180107_2245.py | 37 +++++++++++++++++++++ users/models.py | 16 ++++++++- users/templates/users/aff_listright.html | 2 ++ 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 users/migrations/0068_auto_20180107_2245.py diff --git a/users/forms.py b/users/forms.py index ac8e9923..74d6694e 100644 --- a/users/forms.py +++ b/users/forms.py @@ -450,7 +450,7 @@ class ListRightForm(ModelForm): class Meta: model = ListRight - fields = ['name', 'unix_name', 'permissions', 'details'] + fields = ['name', 'unix_name', 'critical', 'permissions', 'details'] def __init__(self, *args, **kwargs): prefix = kwargs.pop('prefix', self.Meta.model.__name__) diff --git a/users/migrations/0068_auto_20180107_2245.py b/users/migrations/0068_auto_20180107_2245.py new file mode 100644 index 00000000..3ce232dc --- /dev/null +++ b/users/migrations/0068_auto_20180107_2245.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-01-07 21:45 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0067_serveurpermission'), + ] + + def transfer_permissions(apps, schema_editor): + critical_rights = ['adm', 'admin', 'bureau', 'infra', 'tresorier', 'serveur', 'bofh'] + db_alias = schema_editor.connection.alias + rights = apps.get_model("users", "ListRight") + for right in critical_rights: + rg = rights.objects.using(db_alias).filter(unix_name=right).first() + rg.critical=True + rg.save() + + def untransfer_permissions(apps, schema_editor): + return + + operations = [ + migrations.AlterModelOptions( + name='user', + options={'permissions': (('change_user_password', "Peut changer le mot de passe d'un user"), ('change_user_state', "Peut éditer l'etat d'un user"), ('change_user_force', 'Peut forcer un déménagement'), ('change_user_shell', "Peut éditer le shell d'un user"), ('change_user_groups', "Peut éditer les groupes d'un user ! Permission critique"), ('change_all_users', 'Peut éditer tous les users, y compris ceux dotés de droits. Superdroit'), ('view_user', 'Peut voir un objet user quelquonque'))}, + ), + migrations.AddField( + model_name='listright', + name='critical', + field=models.BooleanField(default=False), + ), + migrations.RunPython(transfer_permissions, untransfer_permissions), + ] diff --git a/users/models.py b/users/models.py index 9761cc20..83fb2788 100644 --- a/users/models.py +++ b/users/models.py @@ -233,6 +233,7 @@ class User(FieldPermissionModelMixin, AbstractBaseUser, PermissionsMixin): ("change_user_force", "Peut forcer un déménagement"), ("change_user_shell", "Peut éditer le shell d'un user"), ("change_user_groups", "Peut éditer les groupes d'un user ! Permission critique"), + ("change_all_users", "Peut éditer tous les users, y compris ceux dotés de droits. Superdroit"), ("view_user", "Peut voir un objet user quelquonque"), ) @@ -712,7 +713,19 @@ class User(FieldPermissionModelMixin, AbstractBaseUser, PermissionsMixin): else: return False, u"Vous n'avez pas le droit d'éditer ce club" else: - if self == user_request or user_request.has_perm('users.change_user'): + options, _created = AssoOption.objects.get_or_create() + if self == user_request: + return True, None + elif user_request.has_perm('users.change_all_users'): + return True, None + elif user_request.has_perm('users.change_user'): + if self.groups.filter(listright__critical=True): + return False, u"Utilisateurs avec droits critiques, ne peut etre édité" + elif self == options.utilisateur_asso: + return False, u"Impossible d'éditer l'utilisateur asso sans droit change_all_users" + else: + return True, None + elif user_request.has_perm('users.change_all_users'): return True, None else: return False, u"Vous ne pouvez éditer un autre utilisateur que vous même" @@ -1112,6 +1125,7 @@ class ListRight(Group): )] ) gid = models.PositiveIntegerField(unique=True, null=True) + critical = models.BooleanField(default=False) details = models.CharField( help_text="Description", max_length=255, diff --git a/users/templates/users/aff_listright.html b/users/templates/users/aff_listright.html index 080a7388..b8a8008c 100644 --- a/users/templates/users/aff_listright.html +++ b/users/templates/users/aff_listright.html @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., Droit Gid + Groupe/permission critique Informations Details @@ -38,6 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{ listright.name }} {{ listright.gid }} + {{ listright.critical }}