Revision e6d6603a

b/invitations/invitations.py
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):
b/settings.py.dist
241 241
AUTH_TOKEN_DURATION = 30 * 24
242 242

  
243 243
#Max number of invitations allowed per user
244
MAX_INVITATIONS = 20
244
MAX_INVITATIONS = 20
245

  
246
#Key to encrypt X-Auth-Token with when sending invitations
247
INVITATION_ENCR_KEY = '8d342f6e7a0366c632978a80257019af'
248

  
249
#Days during which an invitation is active
250
INVITATION_VALID_DAYS = 30
251

  
252
#SMTP server for the system
253
SMTP_SERVER="127.0.0.1"
254

  
255

  

Also available in: Unified diff