##// END OF EJS Templates
Implemented permissions into hg app, secured admin controllers, templates and repository specific controllers
marcink -
r318:fdf9f6ee default
parent child Browse files
Show More
@@ -22,17 +22,17 b' Created on April 21, 2010'
22 22 branches controller for pylons
23 23 @author: marcink
24 24 """
25 from pylons import tmpl_context as c
26 from pylons_app.lib.auth import LoginRequired
25 from pylons import tmpl_context as c, request
26 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
27 27 from pylons_app.lib.base import BaseController, render
28 28 from pylons_app.model.hg_model import HgModel
29 29 import logging
30
31 30 log = logging.getLogger(__name__)
32 31
33 32 class BranchesController(BaseController):
34 33
35 34 @LoginRequired()
35 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 'repository.admin')
36 36 def __before__(self):
37 37 super(BranchesController, self).__before__()
38 38
@@ -40,7 +40,7 b' class BranchesController(BaseController)'
40 40 hg_model = HgModel()
41 41 c.repo_info = hg_model.get_repo(c.repo_name)
42 42 c.repo_branches = {}
43 for name, hash in c.repo_info.branches.items():
44 c.repo_branches[name] = c.repo_info.get_changeset(hash)
43 for name, hash_ in c.repo_info.branches.items():
44 c.repo_branches[name] = c.repo_info.get_changeset(hash_)
45 45
46 46 return render('branches/branches.html')
@@ -2,14 +2,6 b''
2 2 # encoding: utf-8
3 3 # changelog controller for pylons
4 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 from json import dumps
6 from mercurial.graphmod import colored, CHANGESET, revisions as graph_rev
7 from pylons import request, session, tmpl_context as c
8 from pylons_app.lib.auth import LoginRequired
9 from pylons_app.lib.base import BaseController, render
10 from pylons_app.model.hg_model import HgModel
11 from webhelpers.paginate import Page
12 import logging
13 5
14 6 # This program is free software; you can redistribute it and/or
15 7 # modify it under the terms of the GNU General Public License
@@ -30,11 +22,21 b' Created on April 21, 2010'
30 22 changelog controller for pylons
31 23 @author: marcink
32 24 """
33 log = logging.getLogger(__name__)
25 from json import dumps
26 from mercurial.graphmod import colored, CHANGESET, revisions as graph_rev
27 from pylons import request, session, tmpl_context as c
28 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
29 from pylons_app.lib.base import BaseController, render
30 from pylons_app.model.hg_model import HgModel
31 from webhelpers.paginate import Page
32 import logging
33 log = logging.getLogger(__name__)
34 34
35 35 class ChangelogController(BaseController):
36 36
37 37 @LoginRequired()
38 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
39 'repository.admin')
38 40 def __before__(self):
39 41 super(ChangelogController, self).__before__()
40 42
@@ -2,16 +2,6 b''
2 2 # encoding: utf-8
3 3 # changeset controller for pylons
4 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 from pylons import tmpl_context as c, url
6 from pylons.controllers.util import redirect
7 from pylons_app.lib.auth import LoginRequired
8 from pylons_app.lib.base import BaseController, render
9 from pylons_app.model.hg_model import HgModel
10 from vcs.exceptions import RepositoryError
11 from vcs.nodes import FileNode
12 from vcs.utils import diffs as differ
13 import logging
14 import traceback
15 5
16 6 # This program is free software; you can redistribute it and/or
17 7 # modify it under the terms of the GNU General Public License
@@ -32,13 +22,24 b' Created on April 25, 2010'
32 22 changeset controller for pylons
33 23 @author: marcink
34 24 """
35
25 from pylons import tmpl_context as c, url, request
26 from pylons.controllers.util import redirect
27 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
28 from pylons_app.lib.base import BaseController, render
29 from pylons_app.model.hg_model import HgModel
30 from vcs.exceptions import RepositoryError
31 from vcs.nodes import FileNode
32 from vcs.utils import diffs as differ
33 import logging
34 import traceback
36 35
37 36 log = logging.getLogger(__name__)
38 37
39 38 class ChangesetController(BaseController):
40 39
41 40 @LoginRequired()
41 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
42 'repository.admin')
42 43 def __before__(self):
43 44 super(ChangesetController, self).__before__()
44 45
@@ -2,20 +2,7 b''
2 2 # encoding: utf-8
3 3 # files controller for pylons
4 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 from mercurial import archival
6 from pylons import request, response, session, tmpl_context as c, url
7 from pylons.controllers.util import redirect
8 from pylons_app.lib.auth import LoginRequired
9 from pylons_app.lib.base import BaseController, render
10 from pylons_app.lib.utils import EmptyChangeset
11 from pylons_app.model.hg_model import HgModel
12 from vcs.exceptions import RepositoryError, ChangesetError
13 from vcs.nodes import FileNode
14 from vcs.utils import diffs as differ
15 import logging
16 import pylons_app.lib.helpers as h
17 import tempfile
18
5
19 6 # This program is free software; you can redistribute it and/or
20 7 # modify it under the terms of the GNU General Public License
21 8 # as published by the Free Software Foundation; version 2
@@ -35,13 +22,27 b' Created on April 21, 2010'
35 22 files controller for pylons
36 23 @author: marcink
37 24 """
38
25 from mercurial import archival
26 from pylons import request, response, session, tmpl_context as c, url
27 from pylons.controllers.util import redirect
28 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
29 from pylons_app.lib.base import BaseController, render
30 from pylons_app.lib.utils import EmptyChangeset, get_repo_slug
31 from pylons_app.model.hg_model import HgModel
32 from vcs.exceptions import RepositoryError, ChangesetError
33 from vcs.nodes import FileNode
34 from vcs.utils import diffs as differ
35 import logging
36 import pylons_app.lib.helpers as h
37 import tempfile
39 38
40 39 log = logging.getLogger(__name__)
41 40
42 41 class FilesController(BaseController):
43 42
44 43 @LoginRequired()
44 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
45 'repository.admin')
45 46 def __before__(self):
46 47 super(FilesController, self).__before__()
47 48
@@ -44,7 +44,7 b' class PermissionsController(BaseControll'
44 44 # map.resource('permission', 'permissions')
45 45
46 46 @LoginRequired()
47 @HasPermissionAllDecorator('hg.admin')
47 #@HasPermissionAllDecorator('hg.admin')
48 48 def __before__(self):
49 49 c.admin_user = session.get('admin_user')
50 50 c.admin_username = session.get('admin_username')
@@ -21,21 +21,19 b' Created on April 7, 2010'
21 21 admin controller for pylons
22 22 @author: marcink
23 23 """
24 from formencode import htmlfill
24 25 from operator import itemgetter
25 from pylons import request, response, session, tmpl_context as c, url, \
26 app_globals as g
26 from pylons import request, response, session, tmpl_context as c, url
27 27 from pylons.controllers.util import abort, redirect
28 28 from pylons.i18n.translation import _
29 29 from pylons_app.lib import helpers as h
30 from pylons_app.lib.auth import LoginRequired
30 from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator
31 31 from pylons_app.lib.base import BaseController, render
32 32 from pylons_app.lib.utils import invalidate_cache
33 from pylons_app.model.repo_model import RepoModel
33 from pylons_app.model.forms import RepoForm
34 34 from pylons_app.model.hg_model import HgModel
35 from pylons_app.model.forms import RepoForm
36 from pylons_app.model.meta import Session
35 from pylons_app.model.repo_model import RepoModel
37 36 import formencode
38 from formencode import htmlfill
39 37 import logging
40 38 log = logging.getLogger(__name__)
41 39
@@ -44,7 +42,9 b' class ReposController(BaseController):'
44 42 # To properly map this controller, ensure your config/routing.py
45 43 # file has a resource setup:
46 44 # map.resource('repo', 'repos')
45
47 46 @LoginRequired()
47 @HasPermissionAllDecorator('hg.admin')
48 48 def __before__(self):
49 49 c.admin_user = session.get('admin_user')
50 50 c.admin_username = session.get('admin_username')
@@ -104,7 +104,8 b' class ReposController(BaseController):'
104 104 form_result = _form.to_python(dict(request.POST))
105 105 repo_model.update(repo_name, form_result)
106 106 invalidate_cache('cached_repo_list')
107 h.flash(_('Repository %s updated succesfully' % repo_name), category='success')
107 h.flash(_('Repository %s updated succesfully' % repo_name),
108 category='success')
108 109
109 110 except formencode.Invalid as errors:
110 111 c.repo_info = repo_model.get(repo_name)
@@ -135,7 +136,8 b' class ReposController(BaseController):'
135 136 h.flash(_('%s repository is not mapped to db perhaps'
136 137 ' it was moved or renamed from the filesystem'
137 138 ' please run the application again'
138 ' in order to rescan repositories') % repo_name, category='error')
139 ' in order to rescan repositories') % repo_name,
140 category='error')
139 141
140 142 return redirect(url('repos'))
141 143 try:
@@ -175,7 +177,8 b' class ReposController(BaseController):'
175 177 h.flash(_('%s repository is not mapped to db perhaps'
176 178 ' it was created or renamed from the filesystem'
177 179 ' please run the application again'
178 ' in order to rescan repositories') % repo_name, category='error')
180 ' in order to rescan repositories') % repo_name,
181 category='error')
179 182
180 183 return redirect(url('repos'))
181 184 defaults = c.repo_info.__dict__
@@ -23,17 +23,18 b' shortlog controller for pylons'
23 23 @author: marcink
24 24 """
25 25 from pylons import tmpl_context as c, request
26 from pylons_app.lib.auth import LoginRequired
26 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
27 27 from pylons_app.lib.base import BaseController, render
28 28 from pylons_app.model.hg_model import HgModel
29 29 from webhelpers.paginate import Page
30 30 import logging
31
32 31 log = logging.getLogger(__name__)
33 32
34 33 class ShortlogController(BaseController):
35 34
36 35 @LoginRequired()
36 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
37 'repository.admin')
37 38 def __before__(self):
38 39 super(ShortlogController, self).__before__()
39 40
@@ -23,20 +23,21 b' summary controller for pylons'
23 23 @author: marcink
24 24 """
25 25 from pylons import tmpl_context as c, request
26 from pylons_app.lib.auth import LoginRequired
26 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
27 27 from pylons_app.lib.base import BaseController, render
28 28 from pylons_app.model.hg_model import HgModel
29 29 from webhelpers.paginate import Page
30 30 import logging
31
32 31 log = logging.getLogger(__name__)
33 32
34 33 class SummaryController(BaseController):
35 34
36 35 @LoginRequired()
36 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
37 'repository.admin')
37 38 def __before__(self):
38 39 super(SummaryController, self).__before__()
39
40
40 41 def index(self):
41 42 hg_model = HgModel()
42 43 c.repo_info = hg_model.get_repo(c.repo_name)
@@ -22,17 +22,17 b' Created on April 21, 2010'
22 22 tags controller for pylons
23 23 @author: marcink
24 24 """
25 from pylons import tmpl_context as c
26 from pylons_app.lib.auth import LoginRequired
25 from pylons import tmpl_context as c, request
26 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
27 27 from pylons_app.lib.base import BaseController, render
28 28 from pylons_app.model.hg_model import HgModel
29 29 import logging
30
31 30 log = logging.getLogger(__name__)
32 31
33 32 class TagsController(BaseController):
34 33
35 34 @LoginRequired()
35 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 'repository.admin')
36 36 def __before__(self):
37 37 super(TagsController, self).__before__()
38 38
@@ -31,7 +31,7 b' from pylons_app.lib.auth import LoginReq'
31 31 from pylons_app.lib.base import BaseController, render
32 32 from pylons_app.model.db import User, UserLog
33 33 from pylons_app.model.forms import UserForm
34 from pylons_app.model.user_model import UserModel
34 from pylons_app.model.user_model import UserModel, DefaultUserException
35 35 import formencode
36 36 import logging
37 37
@@ -125,10 +125,11 b' class UsersController(BaseController):'
125 125 try:
126 126 user_model.delete(id)
127 127 h.flash(_('sucessfully deleted user'), category='success')
128 except DefaultUserException as e:
129 h.flash(str(e), category='warning')
128 130 except Exception:
129 131 h.flash(_('An error occured during deletion of user'),
130 category='error')
131
132 category='error')
132 133 return redirect(url('users'))
133 134
134 135 def show(self, id, format='html'):
@@ -140,6 +141,11 b' class UsersController(BaseController):'
140 141 """GET /users/id/edit: Form to edit an existing item"""
141 142 # url('edit_user', id=ID)
142 143 c.user = self.sa.query(User).get(id)
144 if c.user.username == 'default':
145 h.flash(_("You can't edit this user since it's"
146 " crucial for entire application"), category='warning')
147 return redirect(url('users'))
148
143 149 defaults = c.user.__dict__
144 150 return htmlfill.render(
145 151 render('admin/users/user_edit.html'),
@@ -106,13 +106,17 b' def is_current(selected):'
106 106 <li ${is_current('branches')}>${h.link_to(_('branches'),h.url('branches_home',repo_name=c.repo_name))}</li>
107 107 <li ${is_current('tags')}>${h.link_to(_('tags'),h.url('tags_home',repo_name=c.repo_name))}</li>
108 108 <li ${is_current('files')}>${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name))}</li>
109 <li>${h.link_to(_('settings'),h.url('edit_repo',repo_name=c.repo_name))}</li>
109 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
110 <li>${h.link_to(_('settings'),h.url('edit_repo',repo_name=c.repo_name))}</li>
111 %endif
110 112 </ul>
111 113 %else:
112 114 ##Root menu
113 115 <ul class="page-nav">
114 116 <li ${is_current('home')}>${h.link_to(_('Home'),h.url('/'))}</li>
115 <li ${is_current('admin')}>${h.link_to(_('Admin'),h.url('admin_home'))}</li>
117 %if h.HasPermissionAll('hg.admin')('access admin main page'):
118 <li ${is_current('admin')}>${h.link_to(_('Admin'),h.url('admin_home'))}</li>
119 %endif
116 120 <li class="logout">${h.link_to(u'Logout',h.url('logout_home'))}</li>
117 121 </ul>
118 122 %endif
@@ -129,7 +133,7 b' def is_current(selected):'
129 133 <ul class="submenu">
130 134 <li ${is_current('repos')}>${h.link_to(u'repos',h.url('repos'),class_='repos')}</li>
131 135 <li ${is_current('users')}>${h.link_to(u'users',h.url('users'),class_='users')}</li>
132 <li ${is_current('permissions')}>${h.link_to(u'permissions',h.url('permissions'),class_='permissions')}</li>
136 ##comented for now<li ${is_current('permissions')}>${h.link_to(u'permissions',h.url('permissions'),class_='permissions')}</li>
133 137 </ul>
134 138 </div>
135 139 %endif
@@ -31,6 +31,7 b''
31 31 <td>${_('Atom')}</td>
32 32 </tr>
33 33 %for cnt,repo in enumerate(c.repos_list):
34 %if h.HasRepoPermissionAny('repository.write','repository.read','repository.admin')(repo['name'],'main page check'):
34 35 <tr class="parity${cnt%2}">
35 36 <td>${h.link_to(repo['name'],
36 37 h.url('summary_home',repo_name=repo['name']))}</td>
@@ -48,6 +49,7 b''
48 49 <a title="${_('Subscribe to %s atom feed')%repo['name']}" class="atom_logo" href="${h.url('atom_feed_home',repo_name=repo['name'])}"></a>
49 50 </td>
50 51 </tr>
52 %endif
51 53 %endfor
52 54 </table>
53 55 </%def>
General Comments 0
You need to be logged in to leave comments. Login now