##// END OF EJS Templates
extended user logs to create/delete/fork repositories for auditing...
marcink -
r537:48be9538 default
parent child Browse files
Show More
@@ -32,7 +32,7 from pylons_app.lib import helpers as h
32 from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator, \
32 from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator, \
33 HasPermissionAnyDecorator
33 HasPermissionAnyDecorator
34 from pylons_app.lib.base import BaseController, render
34 from pylons_app.lib.base import BaseController, render
35 from pylons_app.lib.utils import invalidate_cache
35 from pylons_app.lib.utils import invalidate_cache, action_logger
36 from pylons_app.model.db import User
36 from pylons_app.model.db import User
37 from pylons_app.model.forms import RepoForm
37 from pylons_app.model.forms import RepoForm
38 from pylons_app.model.hg_model import HgModel
38 from pylons_app.model.hg_model import HgModel
@@ -78,6 +78,13 class ReposController(BaseController):
78 h.flash(_('created repository %s') % form_result['repo_name'],
78 h.flash(_('created repository %s') % form_result['repo_name'],
79 category='success')
79 category='success')
80
80
81 if request.POST.get('user_created'):
82 action_logger(self.hg_app_user, 'user_created_repo',
83 form_result['repo_name'], '', self.sa)
84 else:
85 action_logger(self.hg_app_user, 'admin_created_repo',
86 form_result['repo_name'], '', self.sa)
87
81 except formencode.Invalid as errors:
88 except formencode.Invalid as errors:
82 c.new_repo = errors.value['repo_name']
89 c.new_repo = errors.value['repo_name']
83
90
@@ -169,10 +176,14 class ReposController(BaseController):
169
176
170 return redirect(url('repos'))
177 return redirect(url('repos'))
171 try:
178 try:
179 action_logger(self.hg_app_user, 'admin_deleted_repo',
180 repo_name, '', self.sa)
172 repo_model.delete(repo)
181 repo_model.delete(repo)
173 invalidate_cache('cached_repo_list')
182 invalidate_cache('cached_repo_list')
174 h.flash(_('deleted repository %s') % repo_name, category='success')
183 h.flash(_('deleted repository %s') % repo_name, category='success')
175 except Exception:
184
185 except Exception, e:
186 log.error(traceback.format_exc())
176 h.flash(_('An error occured during deletion of %s') % repo_name,
187 h.flash(_('An error occured during deletion of %s') % repo_name,
177 category='error')
188 category='error')
178
189
@@ -101,7 +101,7 class SettingsController(BaseController)
101 initial = HgModel.repo_scan(g.paths[0][0], g.paths[0][1], g.baseui)
101 initial = HgModel.repo_scan(g.paths[0][0], g.paths[0][1], g.baseui)
102 repo2db_mapper(initial, rm_obsolete)
102 repo2db_mapper(initial, rm_obsolete)
103 invalidate_cache('cached_repo_list')
103 invalidate_cache('cached_repo_list')
104 h.flash(_('Repositories sucessfully rescanned'), category='success')
104 h.flash(_('Repositories successfully rescanned'), category='success')
105
105
106 if setting_id == 'whoosh':
106 if setting_id == 'whoosh':
107 repo_location = get_hg_ui_settings()['paths_root_path']
107 repo_location = get_hg_ui_settings()['paths_root_path']
@@ -134,7 +134,7 class SettingsController(BaseController)
134
134
135 except:
135 except:
136 log.error(traceback.format_exc())
136 log.error(traceback.format_exc())
137 h.flash(_('error occured during updating application settings'),
137 h.flash(_('error occurred during updating application settings'),
138 category='error')
138 category='error')
139
139
140 self.sa.rollback()
140 self.sa.rollback()
@@ -187,7 +187,7 class SettingsController(BaseController)
187
187
188 except:
188 except:
189 log.error(traceback.format_exc())
189 log.error(traceback.format_exc())
190 h.flash(_('error occured during updating application settings'),
190 h.flash(_('error occurred during updating application settings'),
191 category='error')
191 category='error')
192
192
193 self.sa.rollback()
193 self.sa.rollback()
@@ -17,6 +17,7
17 # along with this program; if not, write to the Free Software
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 # MA 02110-1301, USA.
19 # MA 02110-1301, USA.
20 from pylons_app.lib.utils import action_logger
20 """
21 """
21 Created on April 4, 2010
22 Created on April 4, 2010
22 users controller for pylons
23 users controller for pylons
@@ -71,6 +72,7 class UsersController(BaseController):
71 user_model.create(form_result)
72 user_model.create(form_result)
72 h.flash(_('created user %s') % form_result['username'],
73 h.flash(_('created user %s') % form_result['username'],
73 category='success')
74 category='success')
75 #action_logger(self.hg_app_user, 'new_user', '', '', self.sa)
74 except formencode.Invalid as errors:
76 except formencode.Invalid as errors:
75 return htmlfill.render(
77 return htmlfill.render(
76 render('admin/users/user_add.html'),
78 render('admin/users/user_add.html'),
@@ -28,7 +28,7 from pylons.controllers.util import redi
28 from pylons.i18n.translation import _
28 from pylons.i18n.translation import _
29 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAllDecorator
29 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAllDecorator
30 from pylons_app.lib.base import BaseController, render
30 from pylons_app.lib.base import BaseController, render
31 from pylons_app.lib.utils import invalidate_cache
31 from pylons_app.lib.utils import invalidate_cache, action_logger
32 from pylons_app.model.forms import RepoSettingsForm, RepoForkForm
32 from pylons_app.model.forms import RepoSettingsForm, RepoForkForm
33 from pylons_app.model.repo_model import RepoModel
33 from pylons_app.model.repo_model import RepoModel
34 import formencode
34 import formencode
@@ -79,7 +79,7 class SettingsController(BaseController)
79 form_result = _form.to_python(dict(request.POST))
79 form_result = _form.to_python(dict(request.POST))
80 repo_model.update(repo_name, form_result)
80 repo_model.update(repo_name, form_result)
81 invalidate_cache('cached_repo_list')
81 invalidate_cache('cached_repo_list')
82 h.flash(_('Repository %s updated succesfully' % repo_name),
82 h.flash(_('Repository %s updated successfully' % repo_name),
83 category='success')
83 category='success')
84 changed_name = form_result['repo_name']
84 changed_name = form_result['repo_name']
85 except formencode.Invalid as errors:
85 except formencode.Invalid as errors:
@@ -121,11 +121,13 class SettingsController(BaseController)
121
121
122 return redirect(url('hg_home'))
122 return redirect(url('hg_home'))
123 try:
123 try:
124 action_logger(self.hg_app_user, 'user_deleted_repo',
125 repo_name, '', self.sa)
124 repo_model.delete(repo)
126 repo_model.delete(repo)
125 invalidate_cache('cached_repo_list')
127 invalidate_cache('cached_repo_list')
126 h.flash(_('deleted repository %s') % repo_name, category='success')
128 h.flash(_('deleted repository %s') % repo_name, category='success')
127 except Exception:
129 except Exception:
128 h.flash(_('An error occured during deletion of %s') % repo_name,
130 h.flash(_('An error occurred during deletion of %s') % repo_name,
129 category='error')
131 category='error')
130
132
131 return redirect(url('hg_home'))
133 return redirect(url('hg_home'))
@@ -158,7 +160,8 class SettingsController(BaseController)
158 h.flash(_('fork %s repository as %s task added') \
160 h.flash(_('fork %s repository as %s task added') \
159 % (repo_name, form_result['fork_name']),
161 % (repo_name, form_result['fork_name']),
160 category='success')
162 category='success')
161
163 action_logger(self.hg_app_user, 'user_forked_repo',
164 repo_name, '', self.sa)
162 except formencode.Invalid as errors:
165 except formencode.Invalid as errors:
163 c.new_repo = errors.value['fork_name']
166 c.new_repo = errors.value['fork_name']
164 r = render('settings/repo_fork.html')
167 r = render('settings/repo_fork.html')
@@ -40,7 +40,7 class BaseController(WSGIController):
40 # available in environ['pylons.routes_dict']
40 # available in environ['pylons.routes_dict']
41 try:
41 try:
42 #putting this here makes sure that we update permissions every time
42 #putting this here makes sure that we update permissions every time
43 c.hg_app_user = auth.get_user(session)
43 self.hg_app_user = c.hg_app_user = auth.get_user(session)
44 return WSGIController.__call__(self, environ, start_response)
44 return WSGIController.__call__(self, environ, start_response)
45 finally:
45 finally:
46 meta.Session.remove()
46 meta.Session.remove()
@@ -57,21 +57,21 def action_logger(user, action, repo, ip
57 if not sa:
57 if not sa:
58 sa = meta.Session
58 sa = meta.Session
59
59
60
60 try:
61 if hasattr(user, 'user_id'):
61 if hasattr(user, 'user_id'):
62 user_id = user.user_id
62 user_id = user.user_id
63 elif isinstance(user, basestring):
63 elif isinstance(user, basestring):
64
64 user_id = sa.query(User).filter(User.username == user).one()
65 user_id = sa.Query(User).filter(User.username == user).one()
66 else:
65 else:
67 raise Exception('You have to provide user object or username')
66 raise Exception('You have to provide user object or username')
68
67
69 try:
68 repo_name = repo.lstrip('/')
70 user_log = UserLog()
69 user_log = UserLog()
71 user_log.user_id = user_id
70 user_log.user_id = user_id
72 user_log.action = action
71 user_log.action = action
72 user_log.repository_name = repo_name
73 user_log.repository = sa.query(Repository)\
73 user_log.repository = sa.query(Repository)\
74 .filter(Repository.repo_name==repo.lstrip('/')).one()
74 .filter(Repository.repo_name == repo_name).one()
75 user_log.action_date = datetime.datetime.now()
75 user_log.action_date = datetime.datetime.now()
76 user_log.user_ip = ipaddr
76 user_log.user_ip = ipaddr
77 sa.add(user_log)
77 sa.add(user_log)
@@ -66,7 +66,8 class UserLog(Base):
66 __table_args__ = {'useexisting':True}
66 __table_args__ = {'useexisting':True}
67 user_log_id = Column("user_log_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
67 user_log_id = Column("user_log_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
68 user_id = Column("user_id", INTEGER(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
68 user_id = Column("user_id", INTEGER(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
69 repository_id = Column("repository", TEXT(length=None, convert_unicode=False, assert_unicode=None), ForeignKey(u'repositories.repo_id'), nullable=False, unique=None, default=None)
69 repository_id = Column("repository_id", INTEGER(length=None, convert_unicode=False, assert_unicode=None), ForeignKey(u'repositories.repo_id'), nullable=False, unique=None, default=None)
70 repository_name = Column("repository_name", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
70 user_ip = Column("user_ip", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
71 user_ip = Column("user_ip", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
71 action = Column("action", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
72 action = Column("action", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
72 action_date = Column("action_date", DATETIME(timezone=False), nullable=True, unique=None, default=None)
73 action_date = Column("action_date", DATETIME(timezone=False), nullable=True, unique=None, default=None)
@@ -12,7 +12,13
12 %for cnt,l in enumerate(c.users_log):
12 %for cnt,l in enumerate(c.users_log):
13 <tr class="parity${cnt%2}">
13 <tr class="parity${cnt%2}">
14 <td>${h.link_to(l.user.username,h.url('edit_user', id=l.user.user_id))}</td>
14 <td>${h.link_to(l.user.username,h.url('edit_user', id=l.user.user_id))}</td>
15 <td>${h.link_to(l.repository.repo_name,h.url('summary_home',repo_name=l.repository.repo_name))}</td>
15 <td>
16 %if l.repository:
17 ${h.link_to(l.repository.repo_name,h.url('summary_home',repo_name=l.repository.repo_name))}
18 %else:
19 ${l.repository_name}
20 %endif
21 </td>
16 <td>
22 <td>
17 % if l.action == 'push' and l.revision:
23 % if l.action == 'push' and l.revision:
18 ${h.link_to('%s - %s' % (l.action,l.revision),
24 ${h.link_to('%s - %s' % (l.action,l.revision),
General Comments 0
You need to be logged in to leave comments. Login now