|
29
|
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 |