8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-12-27 17:33:45 +00:00

Merge branch 'machine_anonymize' into 'dev'

Machine anonymize

See merge request federez/re2o!389
This commit is contained in:
chirac 2019-01-09 19:29:03 +01:00
commit 7da4021a7b

View file

@ -1,71 +1,98 @@
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from users.models import User, School, Adherent, Club from users.models import User, School, Adherent, Club
from machines.models import Domain, Machine
from reversion.models import Revision
from django.db.models import F, Value from django.db.models import F, Value
from django.db.models import Q
from django.db.models.functions import Concat from django.db.models.functions import Concat
from re2o.login import hashNT, makeSecret from re2o.login import hashNT, makeSecret
import os, random, string import os, random, string
from random import randint
class Command(BaseCommand): class Command(BaseCommand):
help="Anonymize the data in the database in order to use them on critical servers (dev, personnal...). Every information will be overwritten using non-personnal informations. This script must follow any modification of the database." help="Anonymize the data in the database in order to use them on critical servers (dev, personnal...). Every information will be overwritten using non-personnal informations. This script must follow any modification of the database.\nOptionnal argument: {id|id|id|...} to exclude users from anonymisation"
def add_arguments(self, parser):
parser.add_argument('user_id', nargs='+', type=int, help='User ID')
def handle(self, *args, **kwargs): def handle(self, *args, **kwargs):
users_ids = kwargs['user_id']
for user_id in users_ids:
self.stdout.write("User: {} will not be anonymised".format(User.objects.filter(id=user_id).get().name))
total = Adherent.objects.count() self.stdout.write(self.style.WARNING('\nDISCLAIMER\nThis function will make your database unusable for production. Are you sure you want to run this ?(doit): '))
self.stdout.write("Starting anonymizing the {} users data.".format(total)) if(input()=="doit"):
u = User.objects.all() total = Adherent.objects.count()
a = Adherent.objects.all() self.stdout.write("Starting anonymizing the {} users data.".format(total))
c = Club.objects.all()
self.stdout.write('Supression de l\'école...') u = User.objects.filter(~Q(id__in=users_ids))
# Create a fake School to put everyone in it. a = Adherent.objects.filter(~Q(id__in=users_ids))
ecole = School(name="Ecole des Ninja") c = Club.objects.filter(~Q(id__in=users_ids))
ecole.save() d = Domain.objects.all()
u.update(school=ecole) m = Machine.objects.filter(~Q(user_id__in=users_ids))
self.stdout.write(self.style.SUCCESS('done ...'))
self.stdout.write('Supression des chambres...') self.stdout.write('Supression de l\'école...')
a.update(room=None) # Create a fake School to put everyone in it.
c.update(room=None) ecole = School(name="Ecole des Ninja")
self.stdout.write(self.style.SUCCESS('done ...')) ecole.save()
u.update(school=ecole)
self.stdout.write(self.style.SUCCESS('done ...'))
self.stdout.write('Supression des mails...') self.stdout.write('Supression des chambres...')
u.update(email='example@example.org', a.update(room=None)
local_email_redirect = False, c.update(room=None)
local_email_enabled=False) self.stdout.write(self.style.SUCCESS('done ...'))
self.stdout.write(self.style.SUCCESS('done ...'))
self.stdout.write('Supression des noms, prenoms, pseudo, telephone, commentaire...') self.stdout.write('Supression des mails...')
a.update(name=Concat(Value('name of '), 'id')) u.update(email='example@example.org',
self.stdout.write(self.style.SUCCESS('done name')) local_email_redirect = False,
local_email_enabled=False)
self.stdout.write(self.style.SUCCESS('done ...'))
a.update(surname=Concat(Value('surname of '), 'id')) self.stdout.write('Supression des noms, prenoms, pseudo, telephone, commentaire...')
self.stdout.write(self.style.SUCCESS('done surname')) a.update(name=Concat(Value('name of '), 'id'))
self.stdout.write(self.style.SUCCESS('done name'))
u.update(pseudo=F('id')) a.update(surname=Concat(Value('surname of '), 'id'))
self.stdout.write(self.style.SUCCESS('done pseudo')) self.stdout.write(self.style.SUCCESS('done surname'))
a.update(telephone=Concat(Value('phone of '), 'id')) u.update(pseudo=F('id'))
self.stdout.write(self.style.SUCCESS('done phone')) self.stdout.write(self.style.SUCCESS('done pseudo'))
a.update(comment=Concat(Value('commentaire of '), 'id')) a.update(telephone=Concat(Value('phone of '), 'id'))
self.stdout.write(self.style.SUCCESS('done ...')) self.stdout.write(self.style.SUCCESS('done phone'))
self.stdout.write('Unification du mot de passe...') a.update(comment=Concat(Value('commentaire of '), 'id'))
# Define the password self.stdout.write(self.style.SUCCESS('done ...'))
chars = string.ascii_letters + string.digits + '!@#$%^&*()'
taille = 20
random.seed = (os.urandom(1024))
password = ""
for i in range(taille):
password+=random.choice(chars)
self.stdout.write(self.style.HTTP_NOT_MODIFIED('The password will be: {}'.format(password))) self.stdout.write('Renommage des machines...')
m.update(name=Concat(Value('Machine '),F('id'),Value(' of '),F('user_id')))
d.update(name=Concat(Value('Domaine id '),F('id')))
self.stdout.write(self.style.SUCCESS('done ...'))
u.update(pwd_ntlm = hashNT(password)) self.stdout.write('Unification du mot de passe...')
u.update(password = makeSecret(password)) # Define the password
self.stdout.write(self.style.SUCCESS('done...')) chars = string.ascii_letters + string.digits + '!@#$%^&*()'
taille = 20
random.seed = (os.urandom(1024))
password = ""
for i in range(taille):
password+=random.choice(chars)
self.stdout.write("Data anonymized!") self.stdout.write(self.style.HTTP_NOT_MODIFIED('The password will be: {}'.format(password)))
u.update(pwd_ntlm = hashNT(password))
u.update(password = makeSecret(password))
self.stdout.write(self.style.SUCCESS('done...'))
self.stdout.write('Suppression de l\'historique (This may take some time)')
Revision.objects.all().delete()
self.stdout.write(self.style.SUCCESS('done...'))
self.stdout.write("Data anonymized!")
else:
self.stdout.write("Anonymisation aborted")