Revision 6d4190ba snf-astakos-app/astakos/im/models.py

b/snf-astakos-app/astakos/im/models.py
38 38
import math
39 39
import copy
40 40

  
41
import time
42 41
from datetime import datetime, timedelta
43
from base64 import b64encode
42
import base64
44 43
from urllib import quote
45 44
from random import randint
45
import os
46 46

  
47 47
from django.db import models, IntegrityError, transaction
48 48
from django.contrib.auth.models import User, UserManager, Group, Permission
......
93 93
inf = float('inf')
94 94

  
95 95

  
96
def generate_token(*args):
97
    md5 = hashlib.md5()
98
    md5.update(settings.SECRET_KEY)
99
    for arg in args:
100
        md5.update(arg)
101
    md5.update("%.15f" % time.time())
102
    return b64encode(md5.digest())
96
def generate_token():
97
    s = os.urandom(32)
98
    return base64.urlsafe_b64encode(s)
103 99

  
104 100

  
105 101
class Component(models.Model):
......
107 103
                            db_index=True)
108 104
    url = models.CharField(_('Component url'), max_length=1024, null=True,
109 105
                           help_text=_("URL the component is accessible from"))
110
    auth_token = models.CharField(_('Authentication Token'), max_length=32,
106
    auth_token = models.CharField(_('Authentication Token'), max_length=64,
111 107
                                  null=True, blank=True, unique=True)
112 108
    auth_token_created = models.DateTimeField(_('Token creation date'),
113 109
                                              null=True)
......
116 112

  
117 113
    def renew_token(self, expiration_date=None):
118 114
        for i in range(10):
119
            data = (self.name.encode('ascii', 'ignore'),)
120
            if self.url is not None:
121
                data += (self.url.encode('ascii', 'ignore'),)
122
            new_token = generate_token(*data)
115
            new_token = generate_token()
123 116
            count = Component.objects.filter(auth_token=new_token).count()
124 117
            if count == 0:
125 118
                break
......
359 352
        _('Invitations left'), default=astakos_settings.INVITATIONS_PER_LEVEL.get(user_level, 0))
360 353

  
361 354
    auth_token = models.CharField(_('Authentication Token'),
362
                                  max_length=32,
355
                                  max_length=64,
363 356
                                  unique=True,
364 357
                                  null=True,
365 358
                                  blank=True,
......
540 533

  
541 534
    def renew_token(self, flush_sessions=False, current_key=None):
542 535
        for i in range(10):
543
            data = (self.username, self.realname.encode('ascii', 'ignore'))
544
            new_token = generate_token(*data)
536
            new_token = generate_token()
545 537
            count = AstakosUser.objects.filter(auth_token=new_token).count()
546 538
            if count == 0:
547 539
                break

Also available in: Unified diff