|
1 |
from datetime import timedelta
|
|
2 |
import base64
|
|
3 |
|
1 |
4 |
from django.conf import settings
|
2 |
5 |
from django.core.exceptions import ValidationError
|
3 |
6 |
from django.db import transaction
|
... | ... | |
10 |
13 |
from synnefo.api.common import method_not_allowed
|
11 |
14 |
from synnefo.db.models import Invitations, SynnefoUser
|
12 |
15 |
from synnefo.logic import users
|
|
16 |
from synnefo.logic import email
|
|
17 |
|
|
18 |
from Crypto.Cipher import AES
|
13 |
19 |
|
14 |
|
def send_emails(request):
|
|
20 |
def process_form(request):
|
15 |
21 |
errors = []
|
16 |
22 |
valid_inv = filter(lambda x: x.startswith("name_"), request.POST.keys())
|
17 |
23 |
|
... | ... | |
25 |
31 |
validate_name(name)
|
26 |
32 |
validate_email(email)
|
27 |
33 |
|
28 |
|
add_invitation(request.user, name, email)
|
|
34 |
inv = add_invitation(request.user, name, email)
|
|
35 |
queue_email(inv)
|
29 |
36 |
|
30 |
37 |
except Exception as e:
|
31 |
38 |
errors += ["Invitation to %s <%s> not sent. Reason: %s"%(name, email, e.messages[0])]
|
... | ... | |
55 |
62 |
invitations = []
|
56 |
63 |
|
57 |
64 |
for inv in Invitations.objects.filter(source = request.user):
|
58 |
|
invitations.append(invitation_to_dict(inv))
|
59 |
|
|
60 |
|
return invitations
|
|
65 |
invitation = {}
|
61 |
66 |
|
62 |
|
def invitation_to_dict(inv):
|
63 |
|
invitation = {}
|
|
67 |
invitation['sourcename'] = inv.source.realname
|
|
68 |
invitation['source'] = inv.source.uniq
|
|
69 |
invitation['targetname'] = inv.target.realname
|
|
70 |
invitation['target'] = inv.target.uniq
|
|
71 |
invitation['accepted'] = inv.accepted
|
|
72 |
invitation['sent'] = inv.created
|
64 |
73 |
|
65 |
|
invitation['sourcename'] = inv.source.realname
|
66 |
|
invitation['source'] = inv.source.uniq
|
67 |
|
invitation['targetname'] = inv.target.realname
|
68 |
|
invitation['target'] = inv.target.uniq
|
69 |
|
invitation['accepted'] = inv.accepted
|
70 |
|
invitation['sent'] = inv.created
|
|
74 |
invitations.append(invitation)
|
71 |
75 |
|
72 |
|
return invitation
|
|
76 |
return invitations
|
73 |
77 |
|
74 |
78 |
@csrf_protect
|
75 |
79 |
def inv_demux(request):
|
... | ... | |
79 |
83 |
context_instance=RequestContext(request))
|
80 |
84 |
return HttpResponse(data)
|
81 |
85 |
elif request.method == 'POST':
|
82 |
|
return send_emails(request)
|
|
86 |
return process_form(request)
|
83 |
87 |
else:
|
84 |
88 |
method_not_allowed(request)
|
85 |
89 |
|
|
90 |
def queue_email(invitation):
|
|
91 |
email = {}
|
|
92 |
email['invitee'] = invitation.target.realname
|
|
93 |
email['inviter'] = invitation.source.realname
|
|
94 |
|
|
95 |
valid = timedelta(days = settings.INVITATION_VALID_DAYS)
|
|
96 |
valid_until = invitation.created + valid
|
|
97 |
email['valid_until'] = valid_until.strftime('%A, %d %B %Y')
|
|
98 |
|
|
99 |
PADDING = '{'
|
|
100 |
pad = lambda s: s + (32 - len(s) % 32) * PADDING
|
|
101 |
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
|
|
102 |
|
|
103 |
cipher = AES.new(settings.INVITATION_ENCR_KEY)
|
|
104 |
encoded = EncodeAES(cipher, invitation.target.auth_token)
|
|
105 |
|
|
106 |
email['url'] = settings.APP_INSTALL_URL + "/invitations/login?key=" + encoded
|
|
107 |
|
|
108 |
data = render_to_string('invitation.txt', {'email': email})
|
|
109 |
email.send_async()
|
|
110 |
|
86 |
111 |
@transaction.commit_on_success
|
87 |
112 |
def add_invitation(source, name, email):
|
88 |
113 |
"""
|
... | ... | |
111 |
136 |
inv.source = source
|
112 |
137 |
inv.target = target[0]
|
113 |
138 |
inv.save()
|
|
139 |
return inv
|
114 |
140 |
|
115 |
141 |
@transaction.commit_on_success
|
116 |
142 |
def invitation_accepted(invitation):
|