Statistics
| Branch: | Tag: | Revision:

root / snf-django-lib / snf_django / lib / astakos.py @ f870efe2

History | View | Annotate | Download (4.1 kB)

1 8acb1f97 Kostas Papadimitriou
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 d65af928 Kostas Papadimitriou
#
3 8acb1f97 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 8acb1f97 Kostas Papadimitriou
# without modification, are permitted provided that the following
5 8acb1f97 Kostas Papadimitriou
# conditions are met:
6 d65af928 Kostas Papadimitriou
#
7 8acb1f97 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 8acb1f97 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 8acb1f97 Kostas Papadimitriou
#      disclaimer.
10 d65af928 Kostas Papadimitriou
#
11 8acb1f97 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 8acb1f97 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 8acb1f97 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 8acb1f97 Kostas Papadimitriou
#      provided with the distribution.
15 d65af928 Kostas Papadimitriou
#
16 8acb1f97 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 8acb1f97 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 8acb1f97 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 8acb1f97 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 8acb1f97 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 8acb1f97 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 8acb1f97 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 8acb1f97 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 8acb1f97 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 8acb1f97 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 8acb1f97 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 8acb1f97 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 d65af928 Kostas Papadimitriou
#
29 8acb1f97 Kostas Papadimitriou
# The views and conclusions contained in the software and
30 8acb1f97 Kostas Papadimitriou
# documentation are those of the authors and should not be
31 8acb1f97 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 8acb1f97 Kostas Papadimitriou
# or implied, of GRNET S.A.
33 8acb1f97 Kostas Papadimitriou
34 81a906f8 Ilias Tsitsimpis
from astakosclient import AstakosClient
35 81a906f8 Ilias Tsitsimpis
from astakosclient.errors import Unauthorized
36 83204389 Kostas Papadimitriou
37 8acb1f97 Kostas Papadimitriou
38 81a906f8 Ilias Tsitsimpis
def user_for_token(client, token, usage=False):
39 8acb1f97 Kostas Papadimitriou
    if not token:
40 8acb1f97 Kostas Papadimitriou
        return None
41 d65af928 Kostas Papadimitriou
42 8acb1f97 Kostas Papadimitriou
    try:
43 81a906f8 Ilias Tsitsimpis
        return client.get_user_info(token, usage=True)
44 81a906f8 Ilias Tsitsimpis
    except Unauthorized:
45 81a906f8 Ilias Tsitsimpis
        return None
46 8acb1f97 Kostas Papadimitriou
47 74d988b0 Christos Stavrakakis
48 81a906f8 Ilias Tsitsimpis
def get_user(request, astakos_url, fallback_token=None,
49 81a906f8 Ilias Tsitsimpis
             usage=False, logger=None):
50 8acb1f97 Kostas Papadimitriou
    request.user = None
51 8acb1f97 Kostas Papadimitriou
    request.user_uniq = None
52 d65af928 Kostas Papadimitriou
53 81a906f8 Ilias Tsitsimpis
    client = AstakosClient(astakos_url, retry=2, use_pool=True, logger=logger)
54 8acb1f97 Kostas Papadimitriou
    # Try to find token in a parameter or in a request header.
55 81a906f8 Ilias Tsitsimpis
    user = user_for_token(client, request.GET.get('X-Auth-Token'), usage=usage)
56 8acb1f97 Kostas Papadimitriou
    if not user:
57 81a906f8 Ilias Tsitsimpis
        user = user_for_token(client,
58 81a906f8 Ilias Tsitsimpis
                              request.META.get('HTTP_X_AUTH_TOKEN'),
59 81a906f8 Ilias Tsitsimpis
                              usage=usage)
60 8acb1f97 Kostas Papadimitriou
    if not user:
61 81a906f8 Ilias Tsitsimpis
        user = user_for_token(client, fallback_token, usage=usage)
62 6b5b443b Antony Chazapis
    if not user:
63 7bffb0bd Kostas Papadimitriou
        return None
64 d65af928 Kostas Papadimitriou
65 74d988b0 Christos Stavrakakis
    # use user uuid, instead of email, keep email/displayname reference
66 74d988b0 Christos Stavrakakis
    # to user_id
67 83204389 Kostas Papadimitriou
    request.user_uniq = user['uuid']
68 8acb1f97 Kostas Papadimitriou
    request.user = user
69 890c2065 Sofia Papagiannaki
    request.user_id = user.get('displayname')
70 83204389 Kostas Papadimitriou
    return user
71 d65af928 Kostas Papadimitriou
72 d65af928 Kostas Papadimitriou
73 76a13815 Christos Stavrakakis
class UserCache(object):
74 76a13815 Christos Stavrakakis
    """uuid<->displayname user 'cache'"""
75 76a13815 Christos Stavrakakis
76 81a906f8 Ilias Tsitsimpis
    def __init__(self, astakos_url, astakos_token, split=100, logger=None):
77 81a906f8 Ilias Tsitsimpis
        self.astakos = AstakosClient(astakos_url, retry=2,
78 81a906f8 Ilias Tsitsimpis
                                     use_pool=True, logger=logger)
79 76a13815 Christos Stavrakakis
        self.astakos_token = astakos_token
80 76a13815 Christos Stavrakakis
        self.users = {}
81 76a13815 Christos Stavrakakis
82 76a13815 Christos Stavrakakis
        self.split = split
83 76a13815 Christos Stavrakakis
        assert(self.split > 0), "split must be positive"
84 76a13815 Christos Stavrakakis
85 76a13815 Christos Stavrakakis
    def fetch_names(self, uuid_list):
86 76a13815 Christos Stavrakakis
        total = len(uuid_list)
87 76a13815 Christos Stavrakakis
        split = self.split
88 76a13815 Christos Stavrakakis
89 76a13815 Christos Stavrakakis
        for start in range(0, total, split):
90 76a13815 Christos Stavrakakis
            end = start + split
91 76a13815 Christos Stavrakakis
            try:
92 81a906f8 Ilias Tsitsimpis
                names = self.astakos.service_get_usernames(
93 81a906f8 Ilias Tsitsimpis
                    self.astakos_token, uuid_list[start:end])
94 76a13815 Christos Stavrakakis
                self.users.update(names)
95 81a906f8 Ilias Tsitsimpis
            except:
96 81a906f8 Ilias Tsitsimpis
                pass
97 76a13815 Christos Stavrakakis
98 76a13815 Christos Stavrakakis
    def get_uuid(self, name):
99 76a13815 Christos Stavrakakis
        if not name in self.users:
100 76a13815 Christos Stavrakakis
            try:
101 81a906f8 Ilias Tsitsimpis
                self.users[name] = \
102 81a906f8 Ilias Tsitsimpis
                    self.astakos.service.get_uuid(
103 81a906f8 Ilias Tsitsimpis
                        self.astakos_token, name)
104 81a906f8 Ilias Tsitsimpis
            except:
105 76a13815 Christos Stavrakakis
                self.users[name] = name
106 76a13815 Christos Stavrakakis
107 76a13815 Christos Stavrakakis
        return self.users[name]
108 76a13815 Christos Stavrakakis
109 76a13815 Christos Stavrakakis
    def get_name(self, uuid):
110 76a13815 Christos Stavrakakis
        """Do the uuid-to-email resolving"""
111 76a13815 Christos Stavrakakis
112 76a13815 Christos Stavrakakis
        if not uuid in self.users:
113 76a13815 Christos Stavrakakis
            try:
114 81a906f8 Ilias Tsitsimpis
                self.users[uuid] = \
115 81a906f8 Ilias Tsitsimpis
                    self.astakos.get_username(
116 81a906f8 Ilias Tsitsimpis
                        self.astakos_token, uuid)
117 81a906f8 Ilias Tsitsimpis
            except:
118 76a13815 Christos Stavrakakis
                self.users[uuid] = "-"
119 76a13815 Christos Stavrakakis
120 76a13815 Christos Stavrakakis
        return self.users[uuid]