2013-04-23 18:51:17 +02:00
from __future__ import absolute_import
2012-08-28 18:44:51 +02:00
from django import forms
2012-09-26 20:08:39 +02:00
from django . core . exceptions import ValidationError
2012-11-21 21:14:55 +01:00
from django . utils . safestring import mark_safe
2014-01-07 19:51:18 +01:00
from django . contrib . auth . forms import SetPasswordForm , AuthenticationForm
2013-11-13 23:23:37 +01:00
from django . conf import settings
2012-11-21 21:14:55 +01:00
2013-08-07 17:59:45 +02:00
from zerver . models import Realm , get_user_profile_by_email , UserProfile , \
2013-11-22 23:48:00 +01:00
completely_open , resolve_email_to_domain , get_realm
2014-01-07 19:13:45 +01:00
from zerver . lib . actions import do_change_password , is_inactive
2013-11-13 23:23:59 +01:00
from zproject . backends import password_auth_enabled
2013-08-12 00:47:28 +02:00
import DNS
2012-09-26 20:08:39 +02:00
2015-08-20 02:38:32 +02:00
SIGNUP_STRING = u ' Use a different e-mail address, or contact %s with questions. ' % ( settings . ZULIP_ADMINISTRATOR , )
2012-11-21 21:14:55 +01:00
def has_valid_realm ( value ) :
2015-08-20 02:38:32 +02:00
# Checks if there is a realm without invite_required
# matching the domain of the input e-mail.
2013-11-16 01:24:42 +01:00
try :
2013-11-22 23:48:00 +01:00
realm = Realm . objects . get ( domain = resolve_email_to_domain ( value ) )
2013-11-16 01:24:42 +01:00
except Realm . DoesNotExist :
return False
2015-08-20 02:38:32 +02:00
return not realm . invite_required
2012-11-21 21:14:55 +01:00
2013-08-12 00:47:28 +02:00
def not_mit_mailing_list ( value ) :
# I don't want ec-discuss signed up for Zulip
if " @mit.edu " in value :
username = value . rsplit ( " @ " , 1 ) [ 0 ]
# Check whether the user exists and can get mail.
try :
DNS . dnslookup ( " %s .pobox.ns.athena.mit.edu " % username , DNS . Type . TXT )
2013-08-12 00:55:24 +02:00
return True
2013-08-12 00:47:28 +02:00
except DNS . Base . ServerError , e :
if e . rcode == DNS . Status . NXDOMAIN :
raise ValidationError ( mark_safe ( u ' That user does not exist at MIT or is a <a href= " https://ist.mit.edu/email-lists " >mailing list</a>. If you want to sign up an alias for Zulip, <a href= " mailto:support@zulip.com " >contact us</a>. ' ) )
else :
raise
2013-08-12 00:55:24 +02:00
return True
2013-08-12 00:47:28 +02:00
2012-08-28 18:44:51 +02:00
class RegistrationForm ( forms . Form ) :
2012-09-11 19:20:01 +02:00
full_name = forms . CharField ( max_length = 100 )
2014-03-28 00:45:03 +01:00
# The required-ness of the password field gets overridden if it isn't
# actually required for a realm
password = forms . CharField ( widget = forms . PasswordInput , max_length = 100 ,
required = False )
2015-08-21 11:24:18 +02:00
if not settings . VOYAGER :
2013-11-13 23:23:37 +01:00
terms = forms . BooleanField ( required = True )
2012-09-28 22:47:05 +02:00
2014-03-28 00:45:03 +01:00
2013-01-08 23:26:40 +01:00
class ToSForm ( forms . Form ) :
full_name = forms . CharField ( max_length = 100 )
terms = forms . BooleanField ( required = True )
2012-09-28 22:47:05 +02:00
class HomepageForm ( forms . Form ) :
2013-08-07 17:59:45 +02:00
# This form is important because it determines whether users can
# register for our product. Be careful when modifying the
# validators.
2013-08-12 00:57:54 +02:00
email = forms . EmailField ( validators = [ is_inactive , ] )
2012-12-13 21:08:07 +01:00
2013-08-07 17:59:45 +02:00
def __init__ ( self , * args , * * kwargs ) :
self . domain = kwargs . get ( " domain " )
if kwargs . has_key ( " domain " ) :
del kwargs [ " domain " ]
super ( HomepageForm , self ) . __init__ ( * args , * * kwargs )
def clean_email ( self ) :
data = self . cleaned_data [ ' email ' ]
2013-08-12 00:55:24 +02:00
if completely_open ( self . domain ) or has_valid_realm ( data ) and not_mit_mailing_list ( data ) :
2013-08-07 17:59:45 +02:00
return data
raise ValidationError ( mark_safe (
2015-08-20 02:38:32 +02:00
u ' Your e-mail does not match any existing open organization. ' \
2013-08-07 17:59:45 +02:00
+ SIGNUP_STRING ) )
2012-12-13 21:08:07 +01:00
class LoggingSetPasswordForm ( SetPasswordForm ) :
def save ( self , commit = True ) :
2013-03-29 17:39:53 +01:00
do_change_password ( self . user , self . cleaned_data [ ' new_password1 ' ] ,
2012-12-13 21:08:07 +01:00
log = True , commit = commit )
return self . user
2013-05-03 00:26:53 +02:00
2013-12-09 22:26:10 +01:00
class CreateUserForm ( forms . Form ) :
2013-05-03 00:26:53 +02:00
full_name = forms . CharField ( max_length = 100 )
email = forms . EmailField ( )
2014-01-07 19:51:18 +01:00
class OurAuthenticationForm ( AuthenticationForm ) :
def clean_username ( self ) :
email = self . cleaned_data [ ' username ' ]
try :
user_profile = get_user_profile_by_email ( email )
except UserProfile . DoesNotExist :
2014-01-09 16:27:01 +01:00
return email
2014-01-07 19:51:18 +01:00
if user_profile . realm . deactivated :
error_msg = u """ Sorry for the trouble, but %s has been deactivated.
Please contact support @zulip.com to reactivate this group . """ % (
user_profile . realm . name , )
raise ValidationError ( mark_safe ( error_msg ) )
return email