forked from certsocietegenerale/FIR
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathforms.py
54 lines (47 loc) · 2.14 KB
/
forms.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from django import forms
from django.utils.translation import gettext_lazy as _
from fir_email.utils import check_smime_status
class SMIMECertificateForm(forms.Form):
certificate = forms.CharField(required=False, label=_('Certificate'),
widget=forms.Textarea(attrs={'cols': 60, 'rows': 15}),
help_text=_('Encryption certificate in PEM format.'))
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
if self.user is not None and self.user.email and 'initial' not in kwargs:
kwargs['initial'] = self._get_certificate()
super(SMIMECertificateForm, self).__init__(*args, **kwargs)
def _get_certificate(self):
data = {}
try:
from djembe.models import Identity
except ImportError:
return data
try:
identity = Identity.objects.get(address=self.user.email)
except Identity.DoesNotExist:
return data
except Identity.MultipleObjectsReturned:
identity = Identity.objects.filter(address=self.user.email).first()
data = {'certificate': identity.certificate}
return data
def clean_certificate(self):
if not check_smime_status():
raise forms.ValidationError(_('Improperly configured S/MIME: Email backend is incompatible'))
try:
from M2Crypto import X509
certificate = self.cleaned_data['certificate']
X509.load_cert_string(str(certificate))
except ImportError:
raise forms.ValidationError(_('Improperly configured S/MIME: missing dependencies'))
except X509.X509Error:
raise forms.ValidationError(_('Invalid certificate: unknown format'))
return certificate
def save(self, *args, **kwargs):
if self.user is None or not self.user.email:
return None
try:
from djembe.models import Identity
except ImportError:
return None
config, created = Identity.objects.update_or_create(address=self.user.email, defaults=self.cleaned_data)
return config