| 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 = "Clone of the UNIX program ``passwd'', 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", u.username |
| 31 | p1, p2 = 1, 2 # To make them mismatch. |
| 32 | while p1 != p2: |
| 33 | p1 = self._get_pass() |
| 34 | p2 = self._get_pass("Password (again): ") |
| 35 | if p1 != p2: |
| 36 | print "Passwords do not match, try again" |
| 37 | |
| 38 | u.set_password(p1) |
| 39 | u.save() |
| 40 | |
| 41 | return "Password changed successfully for user " + u.username |