forms.py 4.9 KB
Newer Older
Valentin Samir's avatar
Valentin Samir committed
1 2 3 4 5 6 7 8 9
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License version 3 for
# more details.
#
# You should have received a copy of the GNU General Public License version 3
# along with this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
Valentin Samir's avatar
Valentin Samir committed
10
# (c) 2015-2016 Valentin Samir
Valentin Samir's avatar
Valentin Samir committed
11
"""forms for the app"""
12
from .default_settings import settings
Valentin Samir's avatar
Valentin Samir committed
13

Valentin Samir's avatar
Valentin Samir committed
14
from django import forms
Valentin Samir's avatar
Valentin Samir committed
15
from django.utils.translation import ugettext_lazy as _
Valentin Samir's avatar
Valentin Samir committed
16

Valentin Samir's avatar
Valentin Samir committed
17 18
import cas_server.utils as utils
import cas_server.models as models
Valentin Samir's avatar
Valentin Samir committed
19

Valentin Samir's avatar
Valentin Samir committed
20

21
class WarnForm(forms.Form):
22
    """Form used on warn page before emiting a ticket"""
23 24 25 26 27 28
    service = forms.CharField(widget=forms.HiddenInput(), required=False)
    renew = forms.BooleanField(widget=forms.HiddenInput(), required=False)
    gateway = forms.CharField(widget=forms.HiddenInput(), required=False)
    method = forms.CharField(widget=forms.HiddenInput(), required=False)
    warned = forms.BooleanField(widget=forms.HiddenInput(), required=False)
    lt = forms.CharField(widget=forms.HiddenInput(), required=False)
Valentin Samir's avatar
Valentin Samir committed
29

Valentin Samir's avatar
Valentin Samir committed
30

Valentin Samir's avatar
Valentin Samir committed
31
class FederateSelect(forms.Form):
Valentin Samir's avatar
Valentin Samir committed
32 33 34 35
    """
        Form used on the login page when CAS_FEDERATE is True
        allowing the user to choose a identity provider.
    """
Valentin Samir's avatar
Valentin Samir committed
36 37
    provider = forms.ChoiceField(
        label=_('Identity provider'),
38 39
        # with use a lambda abstraction to delay the access to settings.CAS_FEDERATE_PROVIDERS
        # this is usefull to use the override_settings decorator in tests
40 41 42 43 44 45
        choices=[
            (
                p,
                utils.get_tuple(settings.CAS_FEDERATE_PROVIDERS[p], 2, p)
            ) for p in settings.CAS_FEDERATE_PROVIDERS_LIST
        ]
Valentin Samir's avatar
Valentin Samir committed
46 47 48 49 50
    )
    service = forms.CharField(label=_('service'), widget=forms.HiddenInput(), required=False)
    method = forms.CharField(widget=forms.HiddenInput(), required=False)
    remember = forms.BooleanField(label=_('Remember the identity provider'), required=False)
    warn = forms.BooleanField(label=_('warn'), required=False)
51
    renew = forms.BooleanField(widget=forms.HiddenInput(), required=False)
Valentin Samir's avatar
Valentin Samir committed
52 53


Valentin Samir's avatar
Valentin Samir committed
54
class UserCredential(forms.Form):
Valentin Samir's avatar
Valentin Samir committed
55
    """Form used on the login page to retrive user credentials"""
Valentin Samir's avatar
Valentin Samir committed
56
    username = forms.CharField(label=_('login'))
57
    service = forms.CharField(label=_('service'), widget=forms.HiddenInput(), required=False)
Valentin Samir's avatar
Valentin Samir committed
58
    password = forms.CharField(label=_('password'), widget=forms.PasswordInput)
Valentin Samir's avatar
Valentin Samir committed
59
    lt = forms.CharField(widget=forms.HiddenInput(), required=False)
Valentin Samir's avatar
Valentin Samir committed
60
    method = forms.CharField(widget=forms.HiddenInput(), required=False)
Valentin Samir's avatar
Valentin Samir committed
61
    warn = forms.BooleanField(label=_('warn'), required=False)
62
    renew = forms.BooleanField(widget=forms.HiddenInput(), required=False)
Valentin Samir's avatar
Valentin Samir committed
63

64
    def __init__(self, *args, **kwargs):
Valentin Samir's avatar
Valentin Samir committed
65 66 67 68
        super(UserCredential, self).__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super(UserCredential, self).clean()
69
        auth = utils.import_attr(settings.CAS_AUTH_CLASS)(cleaned_data.get("username"))
Valentin Samir's avatar
Valentin Samir committed
70
        if auth.test_password(cleaned_data.get("password")):
71
            cleaned_data["username"] = auth.username
Valentin Samir's avatar
Valentin Samir committed
72
        else:
Valentin Samir's avatar
Valentin Samir committed
73
            raise forms.ValidationError(_(u"Bad user"))
Valentin Samir's avatar
Valentin Samir committed
74 75 76 77 78 79 80 81 82 83 84 85
        return cleaned_data


class FederateUserCredential(UserCredential):
    """Form used on the login page to retrive user credentials"""
    username = forms.CharField(widget=forms.HiddenInput())
    service = forms.CharField(widget=forms.HiddenInput(), required=False)
    password = forms.CharField(widget=forms.HiddenInput())
    ticket = forms.CharField(widget=forms.HiddenInput())
    lt = forms.CharField(widget=forms.HiddenInput(), required=False)
    method = forms.CharField(widget=forms.HiddenInput(), required=False)
    warn = forms.BooleanField(widget=forms.HiddenInput(), required=False)
86
    renew = forms.BooleanField(widget=forms.HiddenInput(), required=False)
Valentin Samir's avatar
Valentin Samir committed
87 88 89 90 91 92 93 94 95 96

    def clean(self):
        cleaned_data = super(FederateUserCredential, self).clean()
        try:
            component = cleaned_data["username"].split('@')
            username = '@'.join(component[:-1])
            provider = component[-1]
            user = models.FederatedUser.objects.get(username=username, provider=provider)
            user.ticket = ""
            user.save()
97 98 99 100 101 102
        # should not happed as is the FederatedUser do not exists, super should
        # raise before a ValidationError("bad user")
        except models.FederatedUser.DoesNotExist:  # pragma: no cover (should not happend)
            raise forms.ValidationError(
                _(u"User not found in the temporary database, please try to reconnect")
            )
Valentin Samir's avatar
Valentin Samir committed
103
        return cleaned_data
Valentin Samir's avatar
Valentin Samir committed
104 105 106


class TicketForm(forms.ModelForm):
Valentin Samir's avatar
Valentin Samir committed
107
    """Form for Tickets in the admin interface"""
Valentin Samir's avatar
Valentin Samir committed
108 109 110
    class Meta:
        model = models.Ticket
        exclude = []
111
    service = forms.CharField(label=_('service'), widget=forms.TextInput)