web/lib/django/contrib/auth/management/commands/changepassword.py
changeset 29 cc9b7e14412b
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
       
     1 from django.core.management.base import BaseCommand, CommandError
       
     2 from django.contrib.auth.models import User
       
     3 import getpass
       
     4 
       
     5 class Command(BaseCommand):
       
     6     help = "Change a user's password for django.contrib.auth."
       
     7 
       
     8     requires_model_validation = False
       
     9 
       
    10     def _get_pass(self, prompt="Password: "):
       
    11         p = getpass.getpass(prompt=prompt)
       
    12         if not p:
       
    13             raise CommandError("aborted")
       
    14         return p
       
    15 
       
    16     def handle(self, *args, **options):
       
    17         if len(args) > 1:
       
    18             raise CommandError("need exactly one or zero arguments for username")
       
    19 
       
    20         if args:
       
    21             username, = args
       
    22         else:
       
    23             username = getpass.getuser()
       
    24 
       
    25         try:
       
    26             u = User.objects.get(username=username)
       
    27         except User.DoesNotExist:
       
    28             raise CommandError("user '%s' does not exist" % username)
       
    29 
       
    30         print "Changing password for user '%s'" % u.username
       
    31 
       
    32         MAX_TRIES = 3
       
    33         count = 0
       
    34         p1, p2 = 1, 2  # To make them initially mismatch.
       
    35         while p1 != p2 and count < MAX_TRIES:
       
    36             p1 = self._get_pass()
       
    37             p2 = self._get_pass("Password (again): ")
       
    38             if p1 != p2:
       
    39                 print "Passwords do not match. Please try again."
       
    40                 count = count + 1
       
    41 
       
    42         if count == MAX_TRIES:
       
    43             raise CommandError("Aborting password change for user '%s' after %s attempts" % (username, count))
       
    44 
       
    45         u.set_password(p1)
       
    46         u.save()
       
    47 
       
    48         return "Password changed successfully for user '%s'" % u.username