Revision c9fdfa27

b/aai/fixtures/auth_test_data.json
8 8
            "uniq" :"test@synnefo.gr",
9 9
            "credit": 10,
10 10
            "auth_token": "46e427d657b20defe352804f0eb6f8a2",
11
            "auth_token_created": "2009-04-07 09:17:14",
11
            "auth_token_created": "2011-04-07 09:17:14",
12
            "auth_token_expires": "2015-04-07 09:17:14",
12 13
            "type": "STUDENT",
13 14
            "created": "2011-02-06"
14 15
   	    }
b/aai/middleware.py
15 15
        if request.path.startswith('/api/') :
16 16
            return
17 17

  
18
        if request.path.startswith('/invitations/login') :
19
            return
20

  
21 18
        # Special case for testing purposes, delivers the cookie for the
22 19
        # test user on first access
23 20
        # TODO: REMOVE THE FOLLOWING BEFORE DEPLOYMENT
24 21
        if request.GET.get('test') is not None:
25
            usr = SynnefoUser.objects.get(auth_token='46e427d657b20defe352804f0eb6f8a2')
26
            return self._redirect_shib_auth_user(user = usr)
22
            u = SynnefoUser.objects.get(auth_token='46e427d657b20defe352804f0eb6f8a2')
23
            return self._redirect_shib_auth_user(user = u)
27 24

  
28 25
        token = None
29 26
        #Try to find token in a cookie
......
46 43

  
47 44
            #Check user's auth token
48 45
            if (time.time() -
49
                time.mktime(user.auth_token_created.timetuple()) -
50
                settings.AUTH_TOKEN_DURATION * 3600) > 0:
46
                time.mktime(user.auth_token_expires.timetuple())) > 0:
51 47
                #The user's token has expired, re-login
52 48
                return HttpResponseRedirect(settings.APP_INSTALL_URL + settings.LOGIN_PATH)
53 49

  
......
95 91
        return response
96 92

  
97 93
    def _redirect_shib_auth_user(self, user):
98
        expire = user.auth_token_created + datetime.timedelta(hours=settings.AUTH_TOKEN_DURATION)
99
        expire_fmt = expire.strftime('%a, %d-%b-%Y %H:%M:%S %Z')
94
        expire_fmt = user.auth_token_expires.strftime('%a, %d-%b-%Y %H:%M:%S %Z')
100 95

  
101 96
        response = HttpResponse()
102 97

  
b/aai/tests.py
58 58
        """ test request from expired token
59 59
        """
60 60
        user = SynnefoUser.objects.get(uniq="test@synnefo.gr")
61
        self.assertNotEqual(user.auth_token_created, None)
62
        _update_user_ts(user)
61
        self.assertNotEqual(user.auth_token_expires, None)
62
        user.auth_token_expires = datetime.now()
63
        user.save()
63 64
        response = self.client.get('/index.html', {},
64 65
                               **{'X-Auth-Token': user.auth_token,
65 66
                                  'TEST-AAI': 'true'})
......
82 83
        self.assertTrue('Vary' in response)
83 84
        self.assertTrue('X-Auth-Token' in response['Vary'])
84 85

  
86
    def test_auth_cookie(self):
87
        user = SynnefoUser.objects.get(uniq = "test@synnefo.gr")
88
        self.client.cookies['X-Auth-Token'] = user.auth_token
89
        response = self.client.get('/', {},
90
                                   **{'X-Auth-Token': user.auth_token,
91
                                      'TEST-AAI' : 'true'})
92
        self.assertTrue(response.status_code, 200)
93
        self.assertTrue('Vary' in response)
94
        self.assertTrue('X-Auth-Token' in response['Vary'])
95

  
85 96
    def _test_redirect(self, response):
86 97
        self.assertEquals(response.status_code, 302)
87 98
        self.assertTrue('Location' in response)
88 99
        self.assertTrue(response['Location'].endswith(settings.LOGIN_PATH))
89 100

  
90
def _update_user_ts(user):
91
    user.auth_token_created = (datetime.now() -
92
                               timedelta(hours = settings.AUTH_TOKEN_DURATION))
93
    user.save()
b/api/middleware.py
37 37

  
38 38
            #Check user's auth token
39 39
            if (time.time() -
40
                time.mktime(user.auth_token_created.timetuple()) -
41
                settings.AUTH_TOKEN_DURATION * 3600) > 0:
40
                time.mktime(user.auth_token_expires.timetuple())) > 0:
42 41
                #The user's token has expired, re-login
43 42
                user = None
44 43

  
b/api/tests.py
812 812
    def setUp(self):
813 813
        self.client = Client()
814 814

  
815
    def test_auth_cookie(self):
816
        user = SynnefoUser.objects.get(uniq = "test@synnefo.gr")
817
        self.client.cookies['X-Auth-Token'] = user.auth_token
818
        response = self.client.get('/index.html', {},
819
                                   **{'X-Auth-Token': user.auth_token,
820
                                      'TEST-AAI' : 'true'})
821
        self.assertTrue(response.status_code, 200)
822
        self.assertTrue('Vary' in response)
823
        self.assertTrue('X-Auth-Token' in response['Vary'])
824

  
825 815
    def test_fail_oapi_auth(self):
826 816
        """ test authentication from not registered user using OpenAPI
827 817
        """
b/db/fixtures/db_test_data.json
9 9
            "credit": 10,
10 10
            "auth_token": "46e427d657b20defe352804f0eb6f8a2",
11 11
            "auth_token_created": "2009-04-07 09:17:14",
12
            "auth_token_expires": "2015-04-07 09:17:14",
12 13
            "type": "STUDENT",
13 14
            "created": "2011-02-06"
14 15
   	    }
b/db/fixtures/initial_data.json
9 9
            "credit": 10,
10 10
            "auth_token": "46e427d657b20defe352804f0eb6f8a2",
11 11
            "auth_token_created": "2011-05-10",
12
            "auth_token_expires": "2015-05-10",
12 13
            "type": "STUDENT",
13 14
            "created": "2011-05-10"
14 15
   	    }
b/db/migrations/0005_auto__add_field_synnefouser_auth_token_expires__chg_field_synnefouser_.py
1
# encoding: utf-8
2
import datetime
3
from south.db import db
4
from south.v2 import SchemaMigration
5
from django.db import models
6

  
7
class Migration(SchemaMigration):
8

  
9
    def forwards(self, orm):
10
        
11
        # Adding field 'SynnefoUser.auth_token_expires'
12
        db.add_column('db_synnefouser', 'auth_token_expires', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, null=True, blank=True), keep_default=False)
13

  
14
        # Changing field 'SynnefoUser.auth_token_created'
15
        db.alter_column('db_synnefouser', 'auth_token_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, null=True, blank=True))
16

  
17

  
18
    def backwards(self, orm):
19
        
20
        # Deleting field 'SynnefoUser.auth_token_expires'
21
        db.delete_column('db_synnefouser', 'auth_token_expires')
22

  
23
        # Changing field 'SynnefoUser.auth_token_created'
24
        db.alter_column('db_synnefouser', 'auth_token_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True))
25

  
26

  
27
    models = {
28
        'db.debit': {
29
            'Meta': {'object_name': 'Debit'},
30
            'description': ('django.db.models.fields.TextField', [], {}),
31
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
32
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.SynnefoUser']"}),
33
            'vm': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.VirtualMachine']"}),
34
            'when': ('django.db.models.fields.DateTimeField', [], {})
35
        },
36
        'db.disk': {
37
            'Meta': {'object_name': 'Disk'},
38
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
39
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
40
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
41
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.SynnefoUser']", 'null': 'True', 'blank': 'True'}),
42
            'size': ('django.db.models.fields.PositiveIntegerField', [], {}),
43
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
44
            'vm': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.VirtualMachine']", 'null': 'True', 'blank': 'True'})
45
        },
46
        'db.flavor': {
47
            'Meta': {'unique_together': "(('cpu', 'ram', 'disk'),)", 'object_name': 'Flavor'},
48
            'cpu': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
49
            'disk': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
50
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
51
            'ram': ('django.db.models.fields.IntegerField', [], {'default': '0'})
52
        },
53
        'db.flavorcost': {
54
            'Meta': {'object_name': 'FlavorCost'},
55
            'cost_active': ('django.db.models.fields.PositiveIntegerField', [], {}),
56
            'cost_inactive': ('django.db.models.fields.PositiveIntegerField', [], {}),
57
            'effective_from': ('django.db.models.fields.DateTimeField', [], {}),
58
            'flavor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.Flavor']"}),
59
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
60
        },
61
        'db.image': {
62
            'Meta': {'object_name': 'Image'},
63
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
64
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
65
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
66
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.SynnefoUser']", 'null': 'True', 'blank': 'True'}),
67
            'sourcevm': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.VirtualMachine']", 'null': 'True'}),
68
            'state': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
69
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
70
        },
71
        'db.imagemetadata': {
72
            'Meta': {'object_name': 'ImageMetadata'},
73
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
74
            'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.Image']"}),
75
            'meta_key': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
76
            'meta_value': ('django.db.models.fields.CharField', [], {'max_length': '500'})
77
        },
78
        'db.invitations': {
79
            'Meta': {'object_name': 'Invitations'},
80
            'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
81
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
82
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
83
            'source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'source'", 'to': "orm['db.SynnefoUser']"}),
84
            'target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'target'", 'to': "orm['db.SynnefoUser']"}),
85
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
86
        },
87
        'db.limit': {
88
            'Meta': {'object_name': 'Limit'},
89
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
90
            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
91
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.SynnefoUser']"}),
92
            'value': ('django.db.models.fields.IntegerField', [], {})
93
        },
94
        'db.network': {
95
            'Meta': {'object_name': 'Network'},
96
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
97
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
98
            'machines': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['db.VirtualMachine']", 'symmetrical': 'False'}),
99
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
100
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.SynnefoUser']"}),
101
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
102
        },
103
        'db.synnefouser': {
104
            'Meta': {'object_name': 'SynnefoUser'},
105
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
106
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
107
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
108
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
109
            'credit': ('django.db.models.fields.IntegerField', [], {}),
110
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
111
            'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
112
            'realname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
113
            'type': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
114
            'uniq': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
115
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
116
        },
117
        'db.virtualmachine': {
118
            'Meta': {'object_name': 'VirtualMachine'},
119
            'action': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
120
            'backendjobid': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
121
            'backendjobstatus': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
122
            'backendlogmsg': ('django.db.models.fields.TextField', [], {'null': 'True'}),
123
            'backendopcode': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
124
            'charged': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 5, 20, 8, 2, 25, 55390)'}),
125
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
126
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
127
            'flavor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.Flavor']"}),
128
            'hostid': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
129
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
130
            'ipfour': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
131
            'ipsix': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
132
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
133
            'operstate': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
134
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.SynnefoUser']"}),
135
            'sourceimage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.Image']"}),
136
            'suspended': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
137
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
138
        },
139
        'db.virtualmachinegroup': {
140
            'Meta': {'object_name': 'VirtualMachineGroup'},
141
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
142
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
143
            'machines': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['db.VirtualMachine']", 'symmetrical': 'False'}),
144
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
145
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.SynnefoUser']"}),
146
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
147
        },
148
        'db.virtualmachinemetadata': {
149
            'Meta': {'object_name': 'VirtualMachineMetadata'},
150
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
151
            'meta_key': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
152
            'meta_value': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
153
            'vm': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.VirtualMachine']"})
154
        }
155
    }
156

  
157
    complete_apps = ['db']
b/db/models.py
19 19
    uniq = models.CharField('External Unique ID', max_length=255,null=True)
20 20
    credit = models.IntegerField('Credit Balance')
21 21
    auth_token = models.CharField('Authentication Token', max_length=32, null=True)
22
    auth_token_created = models.DateTimeField('Time of auth token creation', auto_now_add=True)
22
    auth_token_created = models.DateTimeField('Time of auth token creation', auto_now_add=True, null = True)
23
    auth_token_expires = models.DateTimeField('Time of auth token expiration', auto_now_add=True, null = True)
23 24
    type = models.CharField('Current Image State', choices=ACCOUNT_TYPE, max_length=30)
24 25
    created = models.DateTimeField('Time of creation', auto_now_add=True)
25 26
    updated = models.DateTimeField('Time of last update', auto_now=True)
b/logic/users.py
3 3
#
4 4
# Copyright 2010 Greek Research and Technology Network
5 5
#
6
from django.conf import settings
6 7

  
7 8
from synnefo.db.models import SynnefoUser
8 9
from django.db import transaction
9 10
import hashlib
10 11
import time
11 12
import string
12
from datetime import datetime
13
from datetime import datetime, timedelta
13 14

  
14 15
@transaction.commit_on_success
15 16
def _register_user(f, u, unq, t):
......
59 60

  
60 61
    user.auth_token = md5.hexdigest()
61 62
    user.auth_token_created = datetime.now()
62

  
63
    user.auth_token_expires = user.auth_token_created + \
64
                              timedelta(hours=settings.AUTH_TOKEN_DURATION)
63 65
    user.save()
64 66

  
65 67
#def login(username, password):

Also available in: Unified diff