django-cas-server/cas_server/forms.py

112 lines
4.9 KiB
Python
Raw Normal View History

2015-05-27 20:10:06 +00:00
# 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.
#
2016-06-30 22:00:53 +00:00
# (c) 2015-2016 Valentin Samir
2015-05-27 19:56:39 +00:00
"""forms for the app"""
from .default_settings import settings
2015-05-17 21:24:41 +00:00
2015-05-16 21:43:46 +00:00
from django import forms
2015-05-22 15:55:00 +00:00
from django.utils.translation import ugettext_lazy as _
2015-05-16 21:43:46 +00:00
2015-06-21 16:56:16 +00:00
import cas_server.utils as utils
import cas_server.models as models
2015-05-16 21:43:46 +00:00
2016-06-03 12:19:43 +00:00
class WarnForm(forms.Form):
2016-06-28 22:25:09 +00:00
"""Form used on warn page before emiting a ticket"""
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)
2015-06-12 16:10:52 +00:00
2016-06-03 12:19:43 +00:00
2016-06-17 17:28:49 +00:00
class FederateSelect(forms.Form):
2016-07-03 15:54:11 +00:00
"""
Form used on the login page when CAS_FEDERATE is True
allowing the user to choose a identity provider.
"""
2016-06-17 17:28:49 +00:00
provider = forms.ChoiceField(
label=_('Identity provider'),
# 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
choices=[
(
p,
utils.get_tuple(settings.CAS_FEDERATE_PROVIDERS[p], 2, p)
) for p in settings.CAS_FEDERATE_PROVIDERS_LIST
]
2016-06-17 17:28:49 +00:00
)
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)
2016-06-28 13:29:45 +00:00
renew = forms.BooleanField(widget=forms.HiddenInput(), required=False)
2016-06-17 17:28:49 +00:00
2015-05-16 21:43:46 +00:00
class UserCredential(forms.Form):
2015-05-27 19:56:39 +00:00
"""Form used on the login page to retrive user credentials"""
2015-05-22 15:55:00 +00:00
username = forms.CharField(label=_('login'))
service = forms.CharField(label=_('service'), widget=forms.HiddenInput(), required=False)
2015-05-22 15:55:00 +00:00
password = forms.CharField(label=_('password'), widget=forms.PasswordInput)
2015-06-09 20:04:05 +00:00
lt = forms.CharField(widget=forms.HiddenInput(), required=False)
2015-05-16 21:43:46 +00:00
method = forms.CharField(widget=forms.HiddenInput(), required=False)
2015-05-22 15:55:00 +00:00
warn = forms.BooleanField(label=_('warn'), required=False)
2016-06-28 13:24:50 +00:00
renew = forms.BooleanField(widget=forms.HiddenInput(), required=False)
2015-05-16 21:43:46 +00:00
2015-06-12 21:57:11 +00:00
def __init__(self, *args, **kwargs):
2015-05-16 21:43:46 +00:00
super(UserCredential, self).__init__(*args, **kwargs)
def clean(self):
cleaned_data = super(UserCredential, self).clean()
auth = utils.import_attr(settings.CAS_AUTH_CLASS)(cleaned_data.get("username"))
2015-05-16 21:43:46 +00:00
if auth.test_password(cleaned_data.get("password")):
2015-06-12 21:57:11 +00:00
cleaned_data["username"] = auth.username
2015-05-16 21:43:46 +00:00
else:
2015-05-23 17:03:37 +00:00
raise forms.ValidationError(_(u"Bad user"))
2016-06-17 17:28:49 +00:00
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)
2016-06-28 13:29:45 +00:00
renew = forms.BooleanField(widget=forms.HiddenInput(), required=False)
2016-06-17 17:28:49 +00:00
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()
# 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")
)
2016-06-17 17:28:49 +00:00
return cleaned_data
2015-05-16 21:43:46 +00:00
class TicketForm(forms.ModelForm):
2015-05-27 19:56:39 +00:00
"""Form for Tickets in the admin interface"""
2015-05-16 21:43:46 +00:00
class Meta:
model = models.Ticket
exclude = []
service = forms.CharField(label=_('service'), widget=forms.TextInput)