2018-11-08 19:45:21 +00:00
|
|
|
import re
|
2019-05-02 17:57:55 +00:00
|
|
|
import requests
|
|
|
|
|
2018-11-08 19:45:21 +00:00
|
|
|
from django.contrib.auth import forms as auth_forms
|
|
|
|
from django import forms
|
2019-05-02 17:57:55 +00:00
|
|
|
from django.utils import timezone
|
2018-11-08 19:45:21 +00:00
|
|
|
from django_namespace_perms.constants import *
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2019-05-02 17:57:55 +00:00
|
|
|
from django.conf import settings as dj_settings
|
|
|
|
|
|
|
|
from captcha.fields import CaptchaField
|
|
|
|
from captcha.models import CaptchaStore
|
|
|
|
|
|
|
|
from peeringdb_server.models import User, Organization
|
|
|
|
from peeringdb_server.inet import get_client_ip
|
2018-11-08 19:45:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
class OrgAdminUserPermissionForm(forms.Form):
|
|
|
|
|
|
|
|
entity = forms.CharField()
|
|
|
|
perms = forms.IntegerField()
|
|
|
|
|
|
|
|
def clean_perms(self):
|
|
|
|
perms = self.cleaned_data.get("perms")
|
|
|
|
if not perms & PERM_READ:
|
|
|
|
perms = perms | PERM_READ
|
|
|
|
if perms & PERM_DENY:
|
|
|
|
perms = perms ^ PERM_DENY
|
|
|
|
if perms > PERM_CRUD or perms < PERM_READ:
|
|
|
|
raise forms.ValidationError(_("Invalid permission level"))
|
|
|
|
return perms
|
|
|
|
|
|
|
|
|
|
|
|
class AffiliateToOrgForm(forms.Form):
|
|
|
|
|
|
|
|
asn = forms.CharField(required=False)
|
|
|
|
org = forms.CharField(required=False)
|
|
|
|
|
|
|
|
def clean_org(self):
|
|
|
|
org_id = self.cleaned_data.get("org")
|
|
|
|
if not org_id:
|
|
|
|
return 0
|
|
|
|
|
|
|
|
# if org id can be inted, an existing org id has been submitted
|
|
|
|
# otherwise an org name has been submitted that may or may not exist
|
|
|
|
try:
|
|
|
|
org_id = int(org_id)
|
|
|
|
if not Organization.objects.filter(id=org_id).exists():
|
|
|
|
if self.cleaned_data.get("asn"):
|
|
|
|
return 0
|
|
|
|
except ValueError:
|
|
|
|
try:
|
|
|
|
org = Organization.objects.get(name=org_id)
|
|
|
|
return org.id
|
|
|
|
except Organization.DoesNotExist:
|
|
|
|
self.cleaned_data["org_name"] = org_id
|
|
|
|
return 0
|
|
|
|
|
|
|
|
return org_id
|
|
|
|
|
|
|
|
def clean_asn(self):
|
|
|
|
asn = self.cleaned_data.get("asn")
|
|
|
|
if not asn:
|
|
|
|
return 0
|
|
|
|
try:
|
|
|
|
asn = int(re.sub("\D", "", asn))
|
|
|
|
except ValueError:
|
|
|
|
raise forms.ValidationError(_("ASN needs to be a number"))
|
|
|
|
return asn
|
|
|
|
|
|
|
|
|
|
|
|
class PasswordChangeForm(forms.Form):
|
|
|
|
password = forms.CharField()
|
|
|
|
password_v = forms.CharField()
|
|
|
|
|
|
|
|
def clean_password(self):
|
|
|
|
password = self.cleaned_data.get("password")
|
|
|
|
if len(password) < 10:
|
|
|
|
raise forms.ValidationError(
|
|
|
|
_("Needs to be at least 10 characters long"))
|
|
|
|
return password
|
|
|
|
|
|
|
|
def clean_password_v(self):
|
|
|
|
password = self.cleaned_data.get("password")
|
|
|
|
password_v = self.cleaned_data.get("password_v")
|
|
|
|
|
|
|
|
if password != password_v:
|
|
|
|
raise forms.ValidationError(
|
|
|
|
_("Passwords need to match"), code="password_mismatch")
|
|
|
|
return password_v
|
|
|
|
|
|
|
|
|
|
|
|
class PasswordResetForm(forms.Form):
|
|
|
|
email = forms.EmailField()
|
|
|
|
|
|
|
|
|
|
|
|
class UsernameRetrieveForm(forms.Form):
|
|
|
|
email = forms.EmailField()
|
|
|
|
|
|
|
|
|
|
|
|
class UserCreationForm(auth_forms.UserCreationForm):
|
2019-05-02 17:57:55 +00:00
|
|
|
recaptcha = forms.CharField(required=False)
|
|
|
|
captcha = forms.CharField(required=False)
|
|
|
|
captcha_generator = CaptchaField(required=False)
|
|
|
|
|
2018-11-08 19:45:21 +00:00
|
|
|
class Meta:
|
|
|
|
model = User
|
|
|
|
fields = (
|
|
|
|
"username",
|
|
|
|
"email",
|
|
|
|
"first_name",
|
|
|
|
"last_name",
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2019-05-02 17:57:55 +00:00
|
|
|
def clean(self):
|
|
|
|
super(UserCreationForm, self).clean()
|
|
|
|
recaptcha = self.cleaned_data.get("recaptcha", "")
|
|
|
|
captcha = self.cleaned_data.get("captcha", "")
|
|
|
|
|
|
|
|
if not recaptcha and not captcha:
|
|
|
|
raise forms.ValidationError(_("Please fill out the anti-spam challenge (captcha) field"))
|
|
|
|
|
|
|
|
elif recaptcha:
|
|
|
|
cpt_params = {
|
|
|
|
"secret": dj_settings.RECAPTCHA_SECRET_KEY,
|
|
|
|
"response": recaptcha,
|
|
|
|
"remoteip": get_client_ip(self.request)
|
|
|
|
}
|
|
|
|
cpt_response = requests.post(dj_settings.RECAPTCHA_VERIFY_URL,
|
|
|
|
params=cpt_params).json()
|
|
|
|
if not cpt_response.get("success"):
|
|
|
|
raise forms.ValidationError(_("reCAPTCHA invalid"))
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
hashkey, value = captcha.split(":")
|
|
|
|
self.captcha_object = CaptchaStore.objects.get(response=value,
|
|
|
|
hashkey=hashkey,
|
|
|
|
expiration__gt=timezone.now())
|
|
|
|
except CaptchaStore.DoesNotExist:
|
|
|
|
raise forms.ValidationError(_("captcha invalid"))
|
|
|
|
|
|
|
|
def delete_captcha(self):
|
|
|
|
captcha_object = getattr(self, "captcha_object", None)
|
|
|
|
if captcha_object:
|
|
|
|
captcha_object.delete()
|
|
|
|
|
|
|
|
|
2018-11-08 19:45:21 +00:00
|
|
|
class UserLocaleForm(forms.Form):
|
|
|
|
locale = forms.CharField()
|
|
|
|
|
|
|
|
def clean_locale(self):
|
|
|
|
loc = self.cleaned_data.get("locale")
|
|
|
|
# django.utils.translation.check_for_language() #lang_code
|
|
|
|
if loc:
|
|
|
|
return loc
|
|
|
|
return None
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = User
|
|
|
|
fields = ('locale')
|