Use new Log class everywhere
[cascardo/ipsilon.git] / ipsilon / util / user.py
1 #!/usr/bin/python
2 #
3 # Copyright (C) 2013  Simo Sorce <simo@redhat.com>
4 #
5 # see file 'COPYING' for use and warranty information
6 #
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
20 from ipsilon.util.data import Store
21 from ipsilon.util.log import Log
22 import cherrypy
23
24
25 class Site(object):
26     def __init__(self, value):
27         # implement lookup of sites id for link/name
28         self.link = value
29         self.name = value
30
31
32 class User(object):
33     def __init__(self, username):
34         if username is None:
35             self.name = None
36             self._userdata = dict()
37         else:
38             self._userdata = self._get_user_data(username)
39             self.name = username
40
41     def _get_user_data(self, username):
42         store = Store()
43         return store.get_user_preferences(username)
44
45     def reset(self):
46         self.name = None
47         self._userdata = dict()
48
49     @property
50     def is_anonymous(self):
51         if self.name:
52             return False
53         return True
54
55     @property
56     def is_admin(self):
57         if 'is_admin' in self._userdata:
58             if self._userdata['is_admin'] == '1':
59                 return True
60         return False
61
62     @is_admin.setter
63     def is_admin(self, value):
64         if value is True:
65             self._userdata['is_admin'] = '1'
66         else:
67             self._userdata['is_admin'] = '0'
68
69     @property
70     def fullname(self):
71         if 'fullname' in self._userdata:
72             return self._userdata['fullname']
73         else:
74             return self.name
75
76     @fullname.setter
77     def fullname(self, value):
78         self._userdata['fullname'] = value
79
80     @property
81     def email(self):
82         if 'email' in self._userdata:
83             return self._userdata['email']
84         else:
85             return None
86
87     @property
88     def sites(self):
89         if 'sites' in self._userdata:
90             d = []
91             for site in self._userdata['sites']:
92                 d.append(Site(site))
93         else:
94             return []
95
96     @sites.setter
97     def sites(self):
98         # TODO: implement setting sites via the user object ?
99         raise AttributeError
100
101
102 class UserSession(Log):
103     def __init__(self):
104         self.user = self.get_data('user', 'name')
105
106     def get_user(self):
107         return User(self.user)
108
109     def remote_login(self):
110         if cherrypy.request.login:
111             self.login(cherrypy.request.login)
112         else:
113             self.nuke_data('user')
114
115     def login(self, username):
116         if self.user == username:
117             return
118
119         # REMOTE_USER changed, replace user
120         self.nuke_data('user')
121         self.save_data('user', 'name', username)
122         self.user = username
123
124         cherrypy.log('LOGIN SUCCESSFUL: %s' % username)
125
126     def logout(self, user):
127         if user is not None:
128             if not type(user) is User:
129                 raise TypeError
130             # Completely reset user data
131             cherrypy.log.error('%s %s' % (user.name, user.fullname))
132             user.reset()
133
134         # Destroy current session in all cases
135         cherrypy.lib.sessions.expire()
136
137     def save_data(self, facility, name, data):
138         """ Save named data in the session so it can be retrieved later """
139         if facility not in cherrypy.session:
140             cherrypy.session[facility] = dict()
141         cherrypy.session[facility][name] = data
142         cherrypy.session.save()
143         self._debug('Saved session data named [%s:%s]' % (facility, name))
144
145     def get_data(self, facility, name):
146         """ Get named data in the session if available """
147         if facility not in cherrypy.session:
148             return None
149         if name not in cherrypy.session[facility]:
150             return None
151         return cherrypy.session[facility][name]
152
153     def nuke_data(self, facility, name=None):
154         if facility not in cherrypy.session:
155             return
156         if name:
157             if name not in cherrypy.session[facility]:
158                 return
159             cherrypy.session[facility][name] = None
160             del cherrypy.session[facility][name]
161             self._debug('Nuked session data named [%s:%s]' % (facility, name))
162         else:
163             del cherrypy.session[facility]
164             self._debug('Nuked session facility [%s]' % (facility,))
165         cherrypy.session.save()