Revision 7b0f970f 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
from time import asctime
41
import time
42 42
from datetime import datetime, timedelta
43 43
from base64 import b64encode
44 44
from urllib import quote
......
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())
103

  
104

  
96 105
class Component(models.Model):
97 106
    name = models.CharField(_('Name'), max_length=255, unique=True,
98 107
                            db_index=True)
99 108
    url = models.CharField(_('Component url'), max_length=255, null=True,
100 109
                           help_text=_("URL the component is accessible from"))
101 110
    auth_token = models.CharField(_('Authentication Token'), max_length=32,
102
                                  null=True, blank=True)
111
                                  null=True, blank=True, unique=True)
103 112
    auth_token_created = models.DateTimeField(_('Token creation date'),
104 113
                                              null=True)
105 114
    auth_token_expires = models.DateTimeField(_('Token expiration date'),
106 115
                                              null=True)
107 116

  
108 117
    def renew_token(self, expiration_date=None):
109
        md5 = hashlib.md5()
110
        md5.update(self.name.encode('ascii', 'ignore'))
111
        md5.update(self.url.encode('ascii', 'ignore'))
112
        md5.update(asctime())
118
        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)
123
            count = Component.objects.filter(auth_token=new_token).count()
124
            if count == 0:
125
                break
126
            continue
127
        else:
128
            raise ValueError('Could not generate a token')
113 129

  
114
        self.auth_token = b64encode(md5.digest())
130
        self.auth_token = new_token
115 131
        self.auth_token_created = datetime.now()
116 132
        if expiration_date:
117 133
            self.auth_token_expires = expiration_date
118 134
        else:
119 135
            self.auth_token_expires = None
136
        msg = 'Token renewed for component %s' % self.name
137
        logger.log(astakos_settings.LOGGING_LEVEL, msg)
120 138

  
121 139
    def __str__(self):
122 140
        return self.name
......
342 360

  
343 361
    auth_token = models.CharField(_('Authentication Token'),
344 362
                                  max_length=32,
363
                                  unique=True,
345 364
                                  null=True,
346 365
                                  blank=True,
347 366
                                  help_text = _('Renew your authentication '
......
520 539
        logger.info("Verification code renewed for %s" % self.log_display)
521 540

  
522 541
    def renew_token(self, flush_sessions=False, current_key=None):
523
        md5 = hashlib.md5()
524
        md5.update(settings.SECRET_KEY)
525
        md5.update(self.username)
526
        md5.update(self.realname.encode('ascii', 'ignore'))
527
        md5.update(asctime())
542
        for i in range(10):
543
            data = (self.username, self.realname.encode('ascii', 'ignore'))
544
            new_token = generate_token(*data)
545
            count = AstakosUser.objects.filter(auth_token=new_token).count()
546
            if count == 0:
547
                break
548
            continue
549
        else:
550
            raise ValueError('Could not generate a token')
528 551

  
529
        self.auth_token = b64encode(md5.digest())
552
        self.auth_token = new_token
530 553
        self.auth_token_created = datetime.now()
531 554
        self.auth_token_expires = self.auth_token_created + \
532 555
                                  timedelta(hours=astakos_settings.AUTH_TOKEN_DURATION)

Also available in: Unified diff