3a4962d29b4846d9aa07212af4b8576c24d06676
[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 UserStore
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 = UserStore()
43         return store.load_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 str(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     def save_plugin_data(self, plugin, data):
102         store = UserStore()
103         store.save_plugin_data(plugin, self.name, data)
104
105     def load_plugin_data(self, plugin):
106         store = UserStore()
107         return store.load_plugin_data(plugin, self.name)
108
109
110 class UserSession(Log):
111     def __init__(self):
112         self.user = self.get_data('user', 'name')
113         self.userattrs = self.get_user_attrs()
114
115     def get_user(self):
116         return User(self.user)
117
118     def remote_login(self):
119         if cherrypy.request.login:
120             self.login(cherrypy.request.login)
121         else:
122             self.nuke_data('user')
123
124     def login(self, username, userattrs=None):
125         if self.user == username:
126             return
127
128         # REMOTE_USER changed, replace user
129         self.nuke_data('user')
130         self.save_data('user', 'name', username)
131         self.user = username
132
133         # Save additional data provided by the login manager
134         self.nuke_data('userattrs')
135         if userattrs:
136             self.save_user_attrs(userattrs)
137
138         cherrypy.log('LOGIN SUCCESSFUL: %s' % username)
139
140     def logout(self, user):
141         if user is not None:
142             if not type(user) is User:
143                 raise TypeError
144             # Completely reset user data
145             cherrypy.log.error('%s %s' % (user.name, user.fullname))
146             user.reset()
147
148         # Destroy current session in all cases
149         cherrypy.lib.sessions.expire()
150
151     def get_user_attrs(self):
152         userattrs = dict()
153         if 'userattrs' in cherrypy.session:
154             userattrs = cherrypy.session['userattrs']
155         return userattrs
156
157     def save_user_attrs(self, userattrs):
158         cherrypy.session['userattrs'] = userattrs
159         cherrypy.session.save()
160         self._debug('Saved user attrs')
161         self.userattrs = userattrs
162
163     def save_data(self, facility, name, data):
164         """ Save named data in the session so it can be retrieved later """
165         if facility not in cherrypy.session:
166             cherrypy.session[facility] = dict()
167         cherrypy.session[facility][name] = data
168         cherrypy.session.save()
169         self._debug('Saved session data named [%s:%s]' % (facility, name))
170
171     def get_data(self, facility, name):
172         """ Get named data in the session if available """
173         if facility not in cherrypy.session:
174             return None
175         if name not in cherrypy.session[facility]:
176             return None
177         return cherrypy.session[facility][name]
178
179     def nuke_data(self, facility, name=None):
180         if facility not in cherrypy.session:
181             return
182         if name:
183             if name not in cherrypy.session[facility]:
184                 return
185             cherrypy.session[facility][name] = None
186             del cherrypy.session[facility][name]
187             self._debug('Nuked session data named [%s:%s]' % (facility, name))
188         else:
189             del cherrypy.session[facility]
190             self._debug('Nuked session facility [%s]' % (facility,))
191         cherrypy.session.save()