summaryrefslogtreecommitdiff
path: root/lib/python2.7/site-packages/django/contrib/auth/forms.py
diff options
context:
space:
mode:
authorttt2017-05-13 00:29:47 +0530
committerttt2017-05-13 00:29:47 +0530
commitabf599be33b383a6a5baf9493093b2126a622ac8 (patch)
tree4c5ab6e0d935d5e65fabcf0258e4a00dd20a5afa /lib/python2.7/site-packages/django/contrib/auth/forms.py
downloadSBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.tar.gz
SBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.tar.bz2
SBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.zip
added all server files
Diffstat (limited to 'lib/python2.7/site-packages/django/contrib/auth/forms.py')
-rw-r--r--lib/python2.7/site-packages/django/contrib/auth/forms.py367
1 files changed, 367 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/django/contrib/auth/forms.py b/lib/python2.7/site-packages/django/contrib/auth/forms.py
new file mode 100644
index 0000000..081d9e5
--- /dev/null
+++ b/lib/python2.7/site-packages/django/contrib/auth/forms.py
@@ -0,0 +1,367 @@
+from __future__ import unicode_literals
+
+import warnings
+
+from django import forms
+from django.forms.util import flatatt
+from django.template import loader
+from django.utils.datastructures import SortedDict
+from django.utils.encoding import force_bytes
+from django.utils.html import format_html, format_html_join
+from django.utils.http import urlsafe_base64_encode
+from django.utils.safestring import mark_safe
+from django.utils.text import capfirst
+from django.utils.translation import ugettext, ugettext_lazy as _
+
+from django.contrib.auth import authenticate, get_user_model
+from django.contrib.auth.models import User
+from django.contrib.auth.hashers import UNUSABLE_PASSWORD_PREFIX, identify_hasher
+from django.contrib.auth.tokens import default_token_generator
+from django.contrib.sites.models import get_current_site
+
+
+UNMASKED_DIGITS_TO_SHOW = 6
+
+mask_password = lambda p: "%s%s" % (p[:UNMASKED_DIGITS_TO_SHOW], "*" * max(len(p) - UNMASKED_DIGITS_TO_SHOW, 0))
+
+
+class ReadOnlyPasswordHashWidget(forms.Widget):
+ def render(self, name, value, attrs):
+ encoded = value
+ final_attrs = self.build_attrs(attrs)
+
+ if not encoded or encoded.startswith(UNUSABLE_PASSWORD_PREFIX):
+ summary = mark_safe("<strong>%s</strong>" % ugettext("No password set."))
+ else:
+ try:
+ hasher = identify_hasher(encoded)
+ except ValueError:
+ summary = mark_safe("<strong>%s</strong>" % ugettext(
+ "Invalid password format or unknown hashing algorithm."))
+ else:
+ summary = format_html_join('',
+ "<strong>{0}</strong>: {1} ",
+ ((ugettext(key), value)
+ for key, value in hasher.safe_summary(encoded).items())
+ )
+
+ return format_html("<div{0}>{1}</div>", flatatt(final_attrs), summary)
+
+
+class ReadOnlyPasswordHashField(forms.Field):
+ widget = ReadOnlyPasswordHashWidget
+
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault("required", False)
+ super(ReadOnlyPasswordHashField, self).__init__(*args, **kwargs)
+
+ def bound_data(self, data, initial):
+ # Always return initial because the widget doesn't
+ # render an input field.
+ return initial
+
+ def _has_changed(self, initial, data):
+ return False
+
+
+class UserCreationForm(forms.ModelForm):
+ """
+ A form that creates a user, with no privileges, from the given username and
+ password.
+ """
+ error_messages = {
+ 'duplicate_username': _("A user with that username already exists."),
+ 'password_mismatch': _("The two password fields didn't match."),
+ }
+ username = forms.RegexField(label=_("Username"), max_length=30,
+ regex=r'^[\w.@+-]+$',
+ help_text=_("Required. 30 characters or fewer. Letters, digits and "
+ "@/./+/-/_ only."),
+ error_messages={
+ 'invalid': _("This value may contain only letters, numbers and "
+ "@/./+/-/_ characters.")})
+ password1 = forms.CharField(label=_("Password"),
+ widget=forms.PasswordInput)
+ password2 = forms.CharField(label=_("Password confirmation"),
+ widget=forms.PasswordInput,
+ help_text=_("Enter the same password as above, for verification."))
+
+ class Meta:
+ model = User
+ fields = ("username",)
+
+ def clean_username(self):
+ # Since User.username is unique, this check is redundant,
+ # but it sets a nicer error message than the ORM. See #13147.
+ username = self.cleaned_data["username"]
+ try:
+ User._default_manager.get(username=username)
+ except User.DoesNotExist:
+ return username
+ raise forms.ValidationError(
+ self.error_messages['duplicate_username'],
+ code='duplicate_username',
+ )
+
+ def clean_password2(self):
+ password1 = self.cleaned_data.get("password1")
+ password2 = self.cleaned_data.get("password2")
+ if password1 and password2 and password1 != password2:
+ raise forms.ValidationError(
+ self.error_messages['password_mismatch'],
+ code='password_mismatch',
+ )
+ return password2
+
+ def save(self, commit=True):
+ user = super(UserCreationForm, self).save(commit=False)
+ user.set_password(self.cleaned_data["password1"])
+ if commit:
+ user.save()
+ return user
+
+
+class UserChangeForm(forms.ModelForm):
+ username = forms.RegexField(
+ label=_("Username"), max_length=30, regex=r"^[\w.@+-]+$",
+ help_text=_("Required. 30 characters or fewer. Letters, digits and "
+ "@/./+/-/_ only."),
+ error_messages={
+ 'invalid': _("This value may contain only letters, numbers and "
+ "@/./+/-/_ characters.")})
+ password = ReadOnlyPasswordHashField(label=_("Password"),
+ help_text=_("Raw passwords are not stored, so there is no way to see "
+ "this user's password, but you can change the password "
+ "using <a href=\"password/\">this form</a>."))
+
+ class Meta:
+ model = User
+ fields = '__all__'
+
+ def __init__(self, *args, **kwargs):
+ super(UserChangeForm, self).__init__(*args, **kwargs)
+ f = self.fields.get('user_permissions', None)
+ if f is not None:
+ f.queryset = f.queryset.select_related('content_type')
+
+ def clean_password(self):
+ # Regardless of what the user provides, return the initial value.
+ # This is done here, rather than on the field, because the
+ # field does not have access to the initial value
+ return self.initial["password"]
+
+
+class AuthenticationForm(forms.Form):
+ """
+ Base class for authenticating users. Extend this to get a form that accepts
+ username/password logins.
+ """
+ username = forms.CharField(max_length=254)
+ password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
+
+ error_messages = {
+ 'invalid_login': _("Please enter a correct %(username)s and password. "
+ "Note that both fields may be case-sensitive."),
+ 'inactive': _("This account is inactive."),
+ }
+
+ def __init__(self, request=None, *args, **kwargs):
+ """
+ The 'request' parameter is set for custom auth use by subclasses.
+ The form data comes in via the standard 'data' kwarg.
+ """
+ self.request = request
+ self.user_cache = None
+ super(AuthenticationForm, self).__init__(*args, **kwargs)
+
+ # Set the label for the "username" field.
+ UserModel = get_user_model()
+ self.username_field = UserModel._meta.get_field(UserModel.USERNAME_FIELD)
+ if self.fields['username'].label is None:
+ self.fields['username'].label = capfirst(self.username_field.verbose_name)
+
+ def clean(self):
+ username = self.cleaned_data.get('username')
+ password = self.cleaned_data.get('password')
+
+ if username and password:
+ self.user_cache = authenticate(username=username,
+ password=password)
+ if self.user_cache is None:
+ raise forms.ValidationError(
+ self.error_messages['invalid_login'],
+ code='invalid_login',
+ params={'username': self.username_field.verbose_name},
+ )
+ elif not self.user_cache.is_active:
+ raise forms.ValidationError(
+ self.error_messages['inactive'],
+ code='inactive',
+ )
+ return self.cleaned_data
+
+ def check_for_test_cookie(self):
+ warnings.warn("check_for_test_cookie is deprecated; ensure your login "
+ "view is CSRF-protected.", DeprecationWarning)
+
+ def get_user_id(self):
+ if self.user_cache:
+ return self.user_cache.id
+ return None
+
+ def get_user(self):
+ return self.user_cache
+
+
+class PasswordResetForm(forms.Form):
+ email = forms.EmailField(label=_("Email"), max_length=254)
+
+ def save(self, domain_override=None,
+ subject_template_name='registration/password_reset_subject.txt',
+ email_template_name='registration/password_reset_email.html',
+ use_https=False, token_generator=default_token_generator,
+ from_email=None, request=None):
+ """
+ Generates a one-use only link for resetting password and sends to the
+ user.
+ """
+ from django.core.mail import send_mail
+ UserModel = get_user_model()
+ email = self.cleaned_data["email"]
+ active_users = UserModel._default_manager.filter(
+ email__iexact=email, is_active=True)
+ for user in active_users:
+ # Make sure that no email is sent to a user that actually has
+ # a password marked as unusable
+ if not user.has_usable_password():
+ continue
+ if not domain_override:
+ current_site = get_current_site(request)
+ site_name = current_site.name
+ domain = current_site.domain
+ else:
+ site_name = domain = domain_override
+ c = {
+ 'email': user.email,
+ 'domain': domain,
+ 'site_name': site_name,
+ 'uid': urlsafe_base64_encode(force_bytes(user.pk)),
+ 'user': user,
+ 'token': token_generator.make_token(user),
+ 'protocol': 'https' if use_https else 'http',
+ }
+ subject = loader.render_to_string(subject_template_name, c)
+ # Email subject *must not* contain newlines
+ subject = ''.join(subject.splitlines())
+ email = loader.render_to_string(email_template_name, c)
+ send_mail(subject, email, from_email, [user.email])
+
+
+class SetPasswordForm(forms.Form):
+ """
+ A form that lets a user change set his/her password without entering the
+ old password
+ """
+ error_messages = {
+ 'password_mismatch': _("The two password fields didn't match."),
+ }
+ new_password1 = forms.CharField(label=_("New password"),
+ widget=forms.PasswordInput)
+ new_password2 = forms.CharField(label=_("New password confirmation"),
+ widget=forms.PasswordInput)
+
+ def __init__(self, user, *args, **kwargs):
+ self.user = user
+ super(SetPasswordForm, self).__init__(*args, **kwargs)
+
+ def clean_new_password2(self):
+ password1 = self.cleaned_data.get('new_password1')
+ password2 = self.cleaned_data.get('new_password2')
+ if password1 and password2:
+ if password1 != password2:
+ raise forms.ValidationError(
+ self.error_messages['password_mismatch'],
+ code='password_mismatch',
+ )
+ return password2
+
+ def save(self, commit=True):
+ self.user.set_password(self.cleaned_data['new_password1'])
+ if commit:
+ self.user.save()
+ return self.user
+
+
+class PasswordChangeForm(SetPasswordForm):
+ """
+ A form that lets a user change his/her password by entering
+ their old password.
+ """
+ error_messages = dict(SetPasswordForm.error_messages, **{
+ 'password_incorrect': _("Your old password was entered incorrectly. "
+ "Please enter it again."),
+ })
+ old_password = forms.CharField(label=_("Old password"),
+ widget=forms.PasswordInput)
+
+ def clean_old_password(self):
+ """
+ Validates that the old_password field is correct.
+ """
+ old_password = self.cleaned_data["old_password"]
+ if not self.user.check_password(old_password):
+ raise forms.ValidationError(
+ self.error_messages['password_incorrect'],
+ code='password_incorrect',
+ )
+ return old_password
+
+PasswordChangeForm.base_fields = SortedDict([
+ (k, PasswordChangeForm.base_fields[k])
+ for k in ['old_password', 'new_password1', 'new_password2']
+])
+
+
+class AdminPasswordChangeForm(forms.Form):
+ """
+ A form used to change the password of a user in the admin interface.
+ """
+ error_messages = {
+ 'password_mismatch': _("The two password fields didn't match."),
+ }
+ password1 = forms.CharField(label=_("Password"),
+ widget=forms.PasswordInput)
+ password2 = forms.CharField(label=_("Password (again)"),
+ widget=forms.PasswordInput)
+
+ def __init__(self, user, *args, **kwargs):
+ self.user = user
+ super(AdminPasswordChangeForm, self).__init__(*args, **kwargs)
+
+ def clean_password2(self):
+ password1 = self.cleaned_data.get('password1')
+ password2 = self.cleaned_data.get('password2')
+ if password1 and password2:
+ if password1 != password2:
+ raise forms.ValidationError(
+ self.error_messages['password_mismatch'],
+ code='password_mismatch',
+ )
+ return password2
+
+ def save(self, commit=True):
+ """
+ Saves the new password.
+ """
+ self.user.set_password(self.cleaned_data["password1"])
+ if commit:
+ self.user.save()
+ return self.user
+
+ def _get_changed_data(self):
+ data = super(AdminPasswordChangeForm, self).changed_data
+ for name in self.fields.keys():
+ if name not in data:
+ return []
+ return ['password']
+ changed_data = property(_get_changed_data)