Revision 4b3b8688

b/snf-cyclades-app/synnefo/api/actions.py
296 296
    server_id = args.get('serverRef', None)
297 297
    if not server_id:
298 298
        raise BadRequest('Malformed Request.')
299
    vm = get_vm(server_id, request.user)
299
    vm = get_vm(server_id, request.user_uniq)
300 300
    backend.connect_to_network(vm, net)
301 301
    vm.save()
302 302
    net.save()
......
316 316
    server_id = args.get('serverRef', None)
317 317
    if not server_id:
318 318
        raise BadRequest('Malformed Request.')
319
    vm = get_vm(server_id, request.user)
319
    vm = get_vm(server_id, request.user_uniq)
320 320
    backend.disconnect_from_network(vm, net)
321 321
    vm.save()
322 322
    net.save()
b/snf-cyclades-app/synnefo/api/images.py
114 114
    #                       overLimit (413)
115 115
    
116 116
    log.debug('list_images detail=%s', detail)
117
    backend = ImageBackend(request.user)
117
    backend = ImageBackend(request.user_uniq)
118 118
    
119 119
    since = isoparse(request.GET.get('changes-since'))
120 120
    if since:
......
168 168
    #                       overLimit (413)
169 169
    
170 170
    log.debug('get_image_details %s', image_id)
171
    image = util.get_image(image_id, request.user)
171
    image = util.get_image(image_id, request.user_uniq)
172 172
    reply = image_to_dict(image)
173 173
    
174 174
    if request.serialization == 'xml':
......
189 189
    #                       overLimit (413)
190 190
    
191 191
    log.debug('delete_image %s', image_id)
192
    backend = ImageBackend(request.user)
192
    backend = ImageBackend(request.user_uniq)
193 193
    backend.delete(image_id)
194 194
    backend.close()
195
    log.info('User %s deleted image %s', request.user, image_id)
195
    log.info('User %s deleted image %s', request.user_uniq, image_id)
196 196
    return HttpResponse(status=204)
197 197

  
198 198

  
......
206 206
    #                       overLimit (413)
207 207
    
208 208
    log.debug('list_image_metadata %s', image_id)
209
    image = util.get_image(image_id, request.user)
209
    image = util.get_image(image_id, request.user_uniq)
210 210
    metadata = image['properties']
211 211
    return util.render_metadata(request, metadata, use_values=True, status=200)
212 212

  
......
224 224
    
225 225
    req = util.get_request_dict(request)
226 226
    log.debug('update_image_metadata %s %s', image_id, req)
227
    image = util.get_image(image_id, request.user)
227
    image = util.get_image(image_id, request.user_uniq)
228 228
    try:
229 229
        metadata = req['metadata']
230 230
        assert isinstance(metadata, dict)
......
234 234
    properties = image['properties']
235 235
    properties.update(metadata)
236 236
    
237
    backend = ImageBackend(request.user)
237
    backend = ImageBackend(request.user_uniq)
238 238
    backend.update(image_id, dict(properties=properties))
239 239
    backend.close()
240 240
    
......
252 252
    #                       overLimit (413)
253 253
    
254 254
    log.debug('get_image_metadata_item %s %s', image_id, key)
255
    image = util.get_image(image_id, request.user)
255
    image = util.get_image(image_id, request.user_uniq)
256 256
    val = image['properties'].get(key)
257 257
    if val is None:
258 258
        raise ItemNotFound('Metadata key not found.')
......
282 282
        raise BadRequest('Malformed request.')
283 283

  
284 284
    val = metadict[key]
285
    image = util.get_image(image_id, request.user)
285
    image = util.get_image(image_id, request.user_uniq)
286 286
    properties = image['properties']
287 287
    properties[key] = val
288 288
    
289
    backend = ImageBackend(request.user)
289
    backend = ImageBackend(request.user_uniq)
290 290
    backend.update(image_id, dict(properties=properties))
291 291
    backend.close()
292 292
    
......
306 306
    #                       overLimit (413),
307 307
    
308 308
    log.debug('delete_image_metadata_item %s %s', image_id, key)
309
    image = util.get_image(image_id, request.user)
309
    image = util.get_image(image_id, request.user_uniq)
310 310
    properties = image['properties']
311 311
    properties.pop(key, None)
312 312
    
313
    backend = ImageBackend(request.user)
313
    backend = ImageBackend(request.user_uniq)
314 314
    backend.update(image_id, dict(properties=properties))
315 315
    backend.close()
316 316
    
/dev/null
1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

  
34
import json
35

  
36
from httplib import HTTPConnection, HTTPSConnection
37
from urlparse import urlparse
38

  
39
from django.conf import settings
40
from django.utils.cache import patch_vary_headers
41

  
42

  
43
class ApiAuthMiddleware(object):
44
    def process_request(self, request):
45
        request.user = None
46
        request.username = ''
47

  
48
        if settings.TEST:
49
            request.user = 'test'
50
            request.username = 'test'
51
            return
52
        
53
        token = request.GET.get('X-Auth-Token')
54
        if not token:
55
            token = request.META.get('HTTP_X_AUTH_TOKEN')
56
        if not token:
57
            token = request.COOKIES.get('X-Auth-Token')
58
        
59
        if not token:
60
            return
61
        
62
        p = urlparse(settings.ASTAKOS_URL)
63
        if p.scheme == 'https':
64
            conn = HTTPSConnection(p.netloc)
65
        else:
66
            conn = HTTPConnection(p.netloc)
67
        
68
        headers = {'X-Auth-Token': token}
69
        conn.request('GET', p.path, headers=headers)
70
        resp = conn.getresponse()
71
        if resp.status != 200:
72
            return
73
        
74
        try:
75
            reply = json.loads(resp.read())
76
            assert 'uniq' in reply
77
            assert 'username' in reply
78
        except (ValueError, AssertionError):
79
            return
80
        
81
        request.user = reply['uniq']
82
        request.username = reply['username']
83
    
84
    def process_response(self, request, response):
85
        # Tell proxies and other interested parties that the request varies
86
        # based on X-Auth-Token, to avoid caching of results
87
        patch_vary_headers(response, ('X-Auth-Token',))
88
        return response
b/snf-cyclades-app/synnefo/api/networks.py
110 110
    log.debug('list_networks detail=%s', detail)
111 111
    since = util.isoparse(request.GET.get('changes-since'))
112 112
    user_networks = Network.objects.filter(
113
                                    Q(userid=request.user) | Q(public=True))
113
                                Q(userid=request.user_uniq) | Q(public=True))
114 114
    
115 115
    if since:
116 116
        user_networks = user_networks.filter(updated__gte=since)
......
119 119
    else:
120 120
        user_networks = user_networks.filter(state='ACTIVE')
121 121
    
122
    networks = [network_to_dict(network, request.user, detail)
122
    networks = [network_to_dict(network, request.user_uniq, detail)
123 123
                for network in user_networks]
124 124
    
125 125
    if request.serialization == 'xml':
......
151 151
    except (KeyError, ValueError):
152 152
        raise BadRequest('Malformed request.')
153 153
    
154
    network = backend.create_network(name, request.user)
154
    network = backend.create_network(name, request.user_uniq)
155 155
    if not network:
156 156
        raise OverLimit('Network count limit exceeded for your account.')
157 157
    
158
    networkdict = network_to_dict(network, request.user)
158
    networkdict = network_to_dict(network, request.user_uniq)
159 159
    return render_network(request, networkdict, status=202)
160 160

  
161 161

  
......
170 170
    #                       overLimit (413)
171 171
    
172 172
    log.debug('get_network_details %s', network_id)
173
    net = util.get_network(network_id, request.user)
174
    netdict = network_to_dict(net, request.user)
173
    net = util.get_network(network_id, request.user_uniq)
174
    netdict = network_to_dict(net, request.user_uniq)
175 175
    return render_network(request, netdict)
176 176

  
177 177

  
......
194 194
    except (TypeError, KeyError):
195 195
        raise BadRequest('Malformed request.')
196 196

  
197
    net = util.get_network(network_id, request.user)
197
    net = util.get_network(network_id, request.user_uniq)
198 198
    if net.public:
199 199
        raise Unauthorized('Can not rename the public network.')
200 200
    net.name = name
......
213 213
    #                       overLimit (413)
214 214
    
215 215
    log.debug('delete_network %s', network_id)
216
    net = util.get_network(network_id, request.user)
216
    net = util.get_network(network_id, request.user_uniq)
217 217
    if net.public:
218 218
        raise Unauthorized('Can not delete the public network.')
219 219
    backend.delete_network(net)
......
227 227
    if len(req) != 1:
228 228
        raise BadRequest('Malformed request.')
229 229
    
230
    net = util.get_network(network_id, request.user)
230
    net = util.get_network(network_id, request.user_uniq)
231 231
    if net.public:
232 232
        raise Unauthorized('Can not modify the public network.')
233 233
    
b/snf-cyclades-app/synnefo/api/servers.py
161 161
    #                       overLimit (413)
162 162
    
163 163
    log.debug('list_servers detail=%s', detail)
164
    user_vms = VirtualMachine.objects.filter(userid=request.user)
164
    user_vms = VirtualMachine.objects.filter(userid=request.user_uniq)
165 165
    since = util.isoparse(request.GET.get('changes-since'))
166 166
    
167 167
    if since:
......
230 230
            raise faults.BadRequest("Malformed personality in request")
231 231
    
232 232
    image = {}
233
    img = util.get_image(image_id, request.user)
233
    img = util.get_image(image_id, request.user_uniq)
234 234
    properties = img.get('properties', {})
235 235
    image['backend_id'] = img['location']
236 236
    image['format'] = img['disk_format']
......
240 240
    flavor = util.get_flavor(flavor_id)
241 241
    password = util.random_password()
242 242
    
243
    count = VirtualMachine.objects.filter(userid=request.user,
243
    count = VirtualMachine.objects.filter(userid=request.user_uniq,
244 244
                                          deleted=False).count()
245 245
    if count >= settings.MAX_VMS_PER_USER:
246 246
        raise faults.OverLimit("Server count limit exceeded for your account.")
......
248 248
    # We must save the VM instance now, so that it gets a valid vm.backend_id.
249 249
    vm = VirtualMachine.objects.create(
250 250
        name=name,
251
        userid=request.user,
251
        userid=request.user_uniq,
252 252
        imageid=image_id,
253 253
        flavor=flavor)
254 254
    
......
265 265
            vm=vm)
266 266
    
267 267
    log.info('User %s created vm with %s cpus, %s ram and %s storage',
268
             request.user, flavor.cpu, flavor.ram, flavor.disk)
268
             request.user_uniq, flavor.cpu, flavor.ram, flavor.disk)
269 269
    
270 270
    server = vm_to_dict(vm, detail=True)
271 271
    server['status'] = 'BUILD'
......
284 284
    #                       overLimit (413)
285 285
    
286 286
    log.debug('get_server_details %s', server_id)
287
    vm = util.get_vm(server_id, request.user)
287
    vm = util.get_vm(server_id, request.user_uniq)
288 288
    server = vm_to_dict(vm, detail=True)
289 289
    return render_server(request, server)
290 290

  
......
309 309
    except (TypeError, KeyError):
310 310
        raise faults.BadRequest("Malformed request")
311 311

  
312
    vm = util.get_vm(server_id, request.user)
312
    vm = util.get_vm(server_id, request.user_uniq)
313 313
    vm.name = name
314 314
    vm.save()
315 315

  
......
328 328
    #                       overLimit (413)
329 329
    
330 330
    log.debug('delete_server %s', server_id)
331
    vm = util.get_vm(server_id, request.user)
331
    vm = util.get_vm(server_id, request.user_uniq)
332 332
    delete_instance(vm)
333 333
    return HttpResponse(status=204)
334 334

  
......
337 337
def server_action(request, server_id):
338 338
    req = util.get_request_dict(request)
339 339
    log.debug('server_action %s %s', server_id, req)
340
    vm = util.get_vm(server_id, request.user)
340
    vm = util.get_vm(server_id, request.user_uniq)
341 341
    if len(req) != 1:
342 342
        raise faults.BadRequest("Malformed request")
343 343

  
......
363 363
    #                       overLimit (413)
364 364
    
365 365
    log.debug('list_addresses %s', server_id)
366
    vm = util.get_vm(server_id, request.user)
366
    vm = util.get_vm(server_id, request.user_uniq)
367 367
    addresses = [nic_to_dict(nic) for nic in vm.nics.all()]
368 368
    
369 369
    if request.serialization == 'xml':
......
385 385
    #                       overLimit (413)
386 386
    
387 387
    log.debug('list_addresses_by_network %s %s', server_id, network_id)
388
    machine = util.get_vm(server_id, request.user)
389
    network = util.get_network(network_id, request.user)
388
    machine = util.get_vm(server_id, request.user_uniq)
389
    network = util.get_network(network_id, request.user_uniq)
390 390
    nic = util.get_nic(machine, network)
391 391
    address = nic_to_dict(nic)
392 392
    
......
408 408
    #                       overLimit (413)
409 409
    
410 410
    log.debug('list_server_metadata %s', server_id)
411
    vm = util.get_vm(server_id, request.user)
411
    vm = util.get_vm(server_id, request.user_uniq)
412 412
    metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
413 413
    return util.render_metadata(request, metadata, use_values=True, status=200)
414 414

  
......
426 426
    
427 427
    req = util.get_request_dict(request)
428 428
    log.debug('update_server_metadata %s %s', server_id, req)
429
    vm = util.get_vm(server_id, request.user)
429
    vm = util.get_vm(server_id, request.user_uniq)
430 430
    try:
431 431
        metadata = req['metadata']
432 432
        assert isinstance(metadata, dict)
......
454 454
    #                       overLimit (413)
455 455
    
456 456
    log.debug('get_server_metadata_item %s %s', server_id, key)
457
    vm = util.get_vm(server_id, request.user)
457
    vm = util.get_vm(server_id, request.user_uniq)
458 458
    meta = util.get_vm_meta(vm, key)
459 459
    d = {meta.meta_key: meta.meta_value}
460 460
    return util.render_meta(request, d, status=200)
......
474 474
    
475 475
    req = util.get_request_dict(request)
476 476
    log.debug('create_server_metadata_item %s %s %s', server_id, key, req)
477
    vm = util.get_vm(server_id, request.user)
477
    vm = util.get_vm(server_id, request.user_uniq)
478 478
    try:
479 479
        metadict = req['meta']
480 480
        assert isinstance(metadict, dict)
......
507 507
    #                       overLimit (413),
508 508
    
509 509
    log.debug('delete_server_metadata_item %s %s', server_id, key)
510
    vm = util.get_vm(server_id, request.user)
510
    vm = util.get_vm(server_id, request.user_uniq)
511 511
    meta = util.get_vm_meta(vm, key)
512 512
    meta.delete()
513 513
    vm.save()
......
525 525
    #                       overLimit (413)
526 526
    
527 527
    log.debug('server_stats %s', server_id)
528
    vm = util.get_vm(server_id, request.user)
528
    vm = util.get_vm(server_id, request.user_uniq)
529 529
    #secret = util.encrypt(vm.backend_id)
530 530
    secret = vm.backend_id      # XXX disable backend id encryption
531 531
    
b/snf-cyclades-app/synnefo/api/util.py
58 58
                                ItemNotFound, ServiceUnavailable, Unauthorized)
59 59
from synnefo.db.models import (Flavor, VirtualMachine, VirtualMachineMetadata,
60 60
                               Network, NetworkInterface)
61
from synnefo.lib.astakos import get_user
61 62
from synnefo.plankton.backend import ImageBackend
62 63

  
63 64

  
......
315 316
            try:
316 317
                request.serialization = request_serialization(request,
317 318
                                                              atom_allowed)
318
                if not request.user:
319
                get_user(request, settings.ASTAKOS_URL)
320
                if not request.user_uniq:
319 321
                    raise Unauthorized('No user found.')
320 322
                if http_method and request.method != http_method:
321 323
                    raise BadRequest('Method not allowed.')
b/snf-cyclades-app/synnefo/app_settings/__init__.py
8 8
    'synnefo.ui.userdata',
9 9
]
10 10

  
11
synnefo_web_middleware = [
12
    {'after': 'django.middleware.locale.LocaleMiddleware', 'insert': [
13
        'synnefo.api.middleware.ApiAuthMiddleware'
14
        ]
15
    }
16
]
11
synnefo_web_middleware = []
17 12

  
18 13
synnefo_static_files = {
19 14
    'synnefo.ui': 'ui',
b/snf-cyclades-app/synnefo/plankton/util.py
41 41
from django.http import (HttpResponse, HttpResponseBadRequest,
42 42
                         HttpResponseServerError)
43 43

  
44
from synnefo.lib.astakos import get_user
44 45
from synnefo.plankton.backend import ImageBackend, BackendException
45 46

  
46 47

  
47 48
log = getLogger('synnefo.plankton')
48 49

  
49 50

  
50
def get_user_from_token(token):
51
    return None
52

  
53

  
54
def get_request_user(request):
55
    user = get_user_from_token(request.META.get('HTTP_X_AUTH_TOKEN'))
56
    if not user:
57
        user = get_user_from_token(request.COOKIES.get('X-Auth-Token'))
58
    return user
59

  
60

  
61 51
def plankton_method(method):
62 52
    def decorator(func):
63 53
        @wraps(func)
64 54
        def wrapper(request, *args, **kwargs):
65 55
            try:
56
                get_user(request, settings.ASTAKOS_URL)
57
                if not request.user_uniq:
58
                    raise Unauthorized('No user found.')
66 59
                if request.method != method:
67 60
                    return HttpResponse(status=405)
68
                if not request.user:
61
                if not request.user_uniq:
69 62
                    return HttpResponse(status=401)
70
                request.backend = ImageBackend(request.user)
63
                request.backend = ImageBackend(request.user_uniq)
71 64
                return func(request, *args, **kwargs)
72 65
            except (AssertionError, BackendException) as e:
73 66
                message = e.args[0] if e.args else ''
b/snf-cyclades-app/synnefo/ui/templates/feedback_mail.txt
6 6

  
7 7
User info:
8 8
ID: {{ request.user.id }}
9
Email: {{ request.user.uniq }}
9
Email: {{ request.user_uniq }}
10 10

  
11 11
User application data:
12 12
{{ data|safe }}
b/snf-cyclades-app/synnefo/ui/userdata/rest.py
228 228
    Filter collection queryset for request user entries
229 229
    """
230 230
    def queryset(self):
231
        return super(UserCollectionView, self).queryset().filter(user=self.request.user)
231
        return super(UserCollectionView, self).queryset().filter(user=self.request.user_uniq)
232 232

  
233 233
    def POST(self, request, data, *args, **kwargs):
234 234
        instance = self.model()

Also available in: Unified diff