Show More
@@ -0,0 +1,106 b'' | |||
|
1 | # -*- coding: utf-8 -*- | |
|
2 | """ | |
|
3 | package.rhodecode.controllers.admin.ldap_settings | |
|
4 | ~~~~~~~~~~~~~~ | |
|
5 | ||
|
6 | ldap controller for RhodeCode | |
|
7 | :created_on: Nov 26, 2010 | |
|
8 | :author: marcink | |
|
9 | :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com> | |
|
10 | :license: GPLv3, see COPYING for more details. | |
|
11 | """ | |
|
12 | # This program is free software; you can redistribute it and/or | |
|
13 | # modify it under the terms of the GNU General Public License | |
|
14 | # as published by the Free Software Foundation; version 2 | |
|
15 | # of the License or (at your opinion) any later version of the license. | |
|
16 | # | |
|
17 | # This program is distributed in the hope that it will be useful, | |
|
18 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
19 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
20 | # GNU General Public License for more details. | |
|
21 | # | |
|
22 | # You should have received a copy of the GNU General Public License | |
|
23 | # along with this program; if not, write to the Free Software | |
|
24 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | |
|
25 | # MA 02110-1301, USA. | |
|
26 | import logging | |
|
27 | import formencode | |
|
28 | import traceback | |
|
29 | ||
|
30 | from formencode import htmlfill | |
|
31 | ||
|
32 | from pylons import request, response, session, tmpl_context as c, url | |
|
33 | from pylons.controllers.util import abort, redirect | |
|
34 | from pylons.i18n.translation import _ | |
|
35 | ||
|
36 | from rhodecode.lib.base import BaseController, render | |
|
37 | from rhodecode.lib import helpers as h | |
|
38 | from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator | |
|
39 | from rhodecode.lib.auth_ldap import LdapImportError | |
|
40 | from rhodecode.model.settings import SettingsModel | |
|
41 | from rhodecode.model.forms import LdapSettingsForm | |
|
42 | from sqlalchemy.exc import DatabaseError | |
|
43 | ||
|
44 | log = logging.getLogger(__name__) | |
|
45 | ||
|
46 | ||
|
47 | ||
|
48 | class LdapSettingsController(BaseController): | |
|
49 | ||
|
50 | @LoginRequired() | |
|
51 | @HasPermissionAllDecorator('hg.admin') | |
|
52 | def __before__(self): | |
|
53 | c.admin_user = session.get('admin_user') | |
|
54 | c.admin_username = session.get('admin_username') | |
|
55 | super(LdapSettingsController, self).__before__() | |
|
56 | ||
|
57 | def index(self): | |
|
58 | defaults = SettingsModel().get_ldap_settings() | |
|
59 | ||
|
60 | return htmlfill.render( | |
|
61 | render('admin/ldap/ldap.html'), | |
|
62 | defaults=defaults, | |
|
63 | encoding="UTF-8", | |
|
64 | force_defaults=True,) | |
|
65 | ||
|
66 | def ldap_settings(self): | |
|
67 | """ | |
|
68 | POST ldap create and store ldap settings | |
|
69 | """ | |
|
70 | ||
|
71 | settings_model = SettingsModel() | |
|
72 | _form = LdapSettingsForm()() | |
|
73 | ||
|
74 | try: | |
|
75 | form_result = _form.to_python(dict(request.POST)) | |
|
76 | try: | |
|
77 | ||
|
78 | for k, v in form_result.items(): | |
|
79 | if k.startswith('ldap_'): | |
|
80 | setting = settings_model.get(k) | |
|
81 | setting.app_settings_value = v | |
|
82 | self.sa.add(setting) | |
|
83 | ||
|
84 | self.sa.commit() | |
|
85 | h.flash(_('Ldap settings updated successfully'), | |
|
86 | category='success') | |
|
87 | except (DatabaseError,): | |
|
88 | raise | |
|
89 | except LdapImportError: | |
|
90 | h.flash(_('Unable to activate ldap. The "ldap-python" library ' | |
|
91 | 'is missing.'), category='warning') | |
|
92 | ||
|
93 | except formencode.Invalid, errors: | |
|
94 | ||
|
95 | return htmlfill.render( | |
|
96 | render('admin/ldap/ldap.html'), | |
|
97 | defaults=errors.value, | |
|
98 | errors=errors.error_dict or {}, | |
|
99 | prefix_error=False, | |
|
100 | encoding="UTF-8") | |
|
101 | except Exception: | |
|
102 | log.error(traceback.format_exc()) | |
|
103 | h.flash(_('error occured during update of ldap settings'), | |
|
104 | category='error') | |
|
105 | ||
|
106 | return redirect(url('ldap_home')) |
@@ -0,0 +1,73 b'' | |||
|
1 | ## -*- coding: utf-8 -*- | |
|
2 | <%inherit file="/base/base.html"/> | |
|
3 | ||
|
4 | <%def name="title()"> | |
|
5 | ${_('LDAP administration')} - ${c.rhodecode_name} | |
|
6 | </%def> | |
|
7 | ||
|
8 | <%def name="breadcrumbs_links()"> | |
|
9 | ${h.link_to(_('Admin'),h.url('admin_home'))} | |
|
10 | » | |
|
11 | ${_('Ldap')} | |
|
12 | </%def> | |
|
13 | ||
|
14 | <%def name="page_nav()"> | |
|
15 | ${self.menu('admin')} | |
|
16 | </%def> | |
|
17 | ||
|
18 | <%def name="main()"> | |
|
19 | <div class="box"> | |
|
20 | <!-- box / title --> | |
|
21 | <div class="title"> | |
|
22 | ${self.breadcrumbs()} | |
|
23 | </div> | |
|
24 | <h3>${_('LDAP administration')}</h3> | |
|
25 | ${h.form(url('ldap_settings'))} | |
|
26 | <div class="form"> | |
|
27 | <div class="fields"> | |
|
28 | ||
|
29 | <div class="field"> | |
|
30 | <div class="label label-checkbox"><label for="ldap_active">${_('Enable ldap')}</label></div> | |
|
31 | <div class="checkboxes"><div class="checkbox">${h.checkbox('ldap_active',True,class_='small')}</div></div> | |
|
32 | </div> | |
|
33 | <div class="field"> | |
|
34 | <div class="label"><label for="ldap_host">${_('Host')}</label></div> | |
|
35 | <div class="input">${h.text('ldap_host',class_='small')}</div> | |
|
36 | </div> | |
|
37 | <div class="field"> | |
|
38 | <div class="label"><label for="ldap_port">${_('Port')}</label></div> | |
|
39 | <div class="input">${h.text('ldap_port',class_='small')}</div> | |
|
40 | </div> | |
|
41 | <div class="field"> | |
|
42 | <div class="label label-checkbox"><label for="ldap_ldaps">${_('Enable LDAPS')}</label></div> | |
|
43 | <div class="checkboxes"><div class="checkbox">${h.checkbox('ldap_ldaps',True,class_='small')}</div></div> | |
|
44 | </div> | |
|
45 | <div class="field"> | |
|
46 | <div class="label"><label for="ldap_dn_user">${_('Account')}</label></div> | |
|
47 | <div class="input">${h.text('ldap_dn_user',class_='small')}</div> | |
|
48 | </div> | |
|
49 | <div class="field"> | |
|
50 | <div class="label"><label for="ldap_dn_pass">${_('Password')}</label></div> | |
|
51 | <div class="input">${h.password('ldap_dn_pass',class_='small')}</div> | |
|
52 | </div> | |
|
53 | <div class="field"> | |
|
54 | <div class="label"><label for="ldap_base_dn">${_('Base DN')}</label></div> | |
|
55 | <div class="input">${h.text('ldap_base_dn',class_='small')}</div> | |
|
56 | </div> | |
|
57 | ||
|
58 | <div class="buttons"> | |
|
59 | ${h.submit('save','Save',class_="ui-button ui-widget ui-state-default ui-corner-all")} | |
|
60 | </div> | |
|
61 | </div> | |
|
62 | </div> | |
|
63 | ${h.end_form()} | |
|
64 | </div> | |
|
65 | </%def> | |
|
66 | ||
|
67 | ||
|
68 | ||
|
69 | ||
|
70 | ||
|
71 | ||
|
72 | ||
|
73 |
@@ -0,0 +1,7 b'' | |||
|
1 | from rhodecode.tests import * | |
|
2 | ||
|
3 | class TestLdapSettingsController(TestController): | |
|
4 | ||
|
5 | def test_index(self): | |
|
6 | response = self.app.get(url(controller='admin/ldap_settings', action='index')) | |
|
7 | # Test response... |
@@ -85,7 +85,13 b' def make_map(config):' | |||
|
85 | 85 | |
|
86 | 86 | #ADMIN PERMISSIONS REST ROUTES |
|
87 | 87 | map.resource('permission', 'permissions', controller='admin/permissions', path_prefix='/_admin') |
|
88 | map.connect('permissions_ldap', '/_admin/permissions_ldap', controller='admin/permissions', action='ldap') | |
|
88 | ||
|
89 | ||
|
90 | ##ADMIN LDAP SETTINGS | |
|
91 | map.connect('ldap_settings', '/_admin/ldap', controller='admin/ldap_settings', | |
|
92 | action='ldap_settings', conditions=dict(method=["POST"])) | |
|
93 | map.connect('ldap_home', '/_admin/ldap', controller='admin/ldap_settings',) | |
|
94 | ||
|
89 | 95 | |
|
90 | 96 | |
|
91 | 97 | #ADMIN SETTINGS REST ROUTES |
@@ -110,7 +110,6 b' class PermissionsController(BaseControll' | |||
|
110 | 110 | c.register_choices = self.register_choices |
|
111 | 111 | c.create_choices = self.create_choices |
|
112 | 112 | defaults = errors.value |
|
113 | defaults.update(SettingsModel().get_ldap_settings()) | |
|
114 | 113 | |
|
115 | 114 | return htmlfill.render( |
|
116 | 115 | render('admin/permissions/permissions.html'), |
@@ -151,7 +150,7 b' class PermissionsController(BaseControll' | |||
|
151 | 150 | default_user = UserModel().get_by_username('default') |
|
152 | 151 | defaults = {'_method':'put', |
|
153 | 152 | 'anonymous':default_user.active} |
|
154 | defaults.update(SettingsModel().get_ldap_settings()) | |
|
153 | ||
|
155 | 154 | for p in default_user.user_perms: |
|
156 | 155 | if p.permission.permission_name.startswith('repository.'): |
|
157 | 156 | defaults['default_perm'] = p.permission.permission_name |
@@ -169,50 +168,3 b' class PermissionsController(BaseControll' | |||
|
169 | 168 | force_defaults=True,) |
|
170 | 169 | else: |
|
171 | 170 | return redirect(url('admin_home')) |
|
172 | ||
|
173 | ||
|
174 | def ldap(self, id_user='default'): | |
|
175 | """ | |
|
176 | POST ldap create and store ldap settings | |
|
177 | """ | |
|
178 | ||
|
179 | settings_model = SettingsModel() | |
|
180 | _form = LdapSettingsForm()() | |
|
181 | ||
|
182 | try: | |
|
183 | form_result = _form.to_python(dict(request.POST)) | |
|
184 | try: | |
|
185 | ||
|
186 | for k, v in form_result.items(): | |
|
187 | if k.startswith('ldap_'): | |
|
188 | setting = settings_model.get(k) | |
|
189 | setting.app_settings_value = v | |
|
190 | self.sa.add(setting) | |
|
191 | ||
|
192 | self.sa.commit() | |
|
193 | h.flash(_('Ldap settings updated successfully'), | |
|
194 | category='success') | |
|
195 | except: | |
|
196 | raise | |
|
197 | except LdapImportError: | |
|
198 | h.flash(_('Unable to activate ldap. The "ldap-python" library ' | |
|
199 | 'is missing.'), | |
|
200 | category='warning') | |
|
201 | ||
|
202 | except formencode.Invalid, errors: | |
|
203 | c.perms_choices = self.perms_choices | |
|
204 | c.register_choices = self.register_choices | |
|
205 | c.create_choices = self.create_choices | |
|
206 | ||
|
207 | return htmlfill.render( | |
|
208 | render('admin/permissions/permissions.html'), | |
|
209 | defaults=errors.value, | |
|
210 | errors=errors.error_dict or {}, | |
|
211 | prefix_error=False, | |
|
212 | encoding="UTF-8") | |
|
213 | except Exception: | |
|
214 | log.error(traceback.format_exc()) | |
|
215 | h.flash(_('error occured during update of ldap settings'), | |
|
216 | category='error') | |
|
217 | ||
|
218 | return redirect(url('edit_permission', id=id_user)) |
@@ -479,6 +479,13 b' margin:0;' | |||
|
479 | 479 | padding:12px 9px 7px 24px; |
|
480 | 480 | } |
|
481 | 481 | |
|
482 | #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover { | |
|
483 | background:#FFF url("../images/icons/server_key.png") no-repeat 4px 9px; | |
|
484 | width:167px; | |
|
485 | margin:0; | |
|
486 | padding:12px 9px 7px 24px; | |
|
487 | } | |
|
488 | ||
|
482 | 489 | #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover { |
|
483 | 490 | background:#FFF url("../images/icons/arrow_divide.png") no-repeat 4px 9px; |
|
484 | 491 | width:167px; |
@@ -73,47 +73,6 b'' | |||
|
73 | 73 | </div> |
|
74 | 74 | </div> |
|
75 | 75 | ${h.end_form()} |
|
76 | ##LDAP | |
|
77 | <h3>${_('LDAP settings')}</h3> | |
|
78 | ${h.form(url('permissions_ldap',id_iser='default'),method='put')} | |
|
79 | <div class="form"> | |
|
80 | <div class="fields"> | |
|
81 | ||
|
82 | <div class="field"> | |
|
83 | <div class="label label-checkbox"><label for="ldap_active">${_('Enable ldap')}</label></div> | |
|
84 | <div class="checkboxes"><div class="checkbox">${h.checkbox('ldap_active',True,class_='small')}</div></div> | |
|
85 | </div> | |
|
86 | <div class="field"> | |
|
87 | <div class="label"><label for="ldap_host">${_('Host')}</label></div> | |
|
88 | <div class="input">${h.text('ldap_host',class_='small')}</div> | |
|
89 | </div> | |
|
90 | <div class="field"> | |
|
91 | <div class="label"><label for="ldap_port">${_('Port')}</label></div> | |
|
92 | <div class="input">${h.text('ldap_port',class_='small')}</div> | |
|
93 | </div> | |
|
94 | <div class="field"> | |
|
95 | <div class="label label-checkbox"><label for="ldap_ldaps">${_('Enable LDAPS')}</label></div> | |
|
96 | <div class="checkboxes"><div class="checkbox">${h.checkbox('ldap_ldaps',True,class_='small')}</div></div> | |
|
97 | </div> | |
|
98 | <div class="field"> | |
|
99 | <div class="label"><label for="ldap_dn_user">${_('Account')}</label></div> | |
|
100 | <div class="input">${h.text('ldap_dn_user',class_='small')}</div> | |
|
101 | </div> | |
|
102 | <div class="field"> | |
|
103 | <div class="label"><label for="ldap_dn_pass">${_('Password')}</label></div> | |
|
104 | <div class="input">${h.password('ldap_dn_pass',class_='small')}</div> | |
|
105 | </div> | |
|
106 | <div class="field"> | |
|
107 | <div class="label"><label for="ldap_base_dn">${_('Base DN')}</label></div> | |
|
108 | <div class="input">${h.text('ldap_base_dn',class_='small')}</div> | |
|
109 | </div> | |
|
110 | ||
|
111 | <div class="buttons"> | |
|
112 | ${h.submit('save','Save',class_="ui-button ui-widget ui-state-default ui-corner-all")} | |
|
113 | </div> | |
|
114 | </div> | |
|
115 | </div> | |
|
116 | ${h.end_form()} | |
|
117 | 76 | </div> |
|
118 | 77 | </%def> |
|
119 | 78 |
@@ -204,13 +204,18 b'' | |||
|
204 | 204 | %if h.HasPermissionAll('hg.admin')('access admin main page'): |
|
205 | 205 | <li> |
|
206 | 206 | ${h.link_to(_('admin'),h.url('admin_home'),class_='admin')} |
|
207 | <%def name="admin_menu()"> | |
|
207 | 208 | <ul> |
|
208 | 209 | <li>${h.link_to(_('journal'),h.url('admin_home'),class_='journal')}</li> |
|
209 | 210 | <li>${h.link_to(_('repositories'),h.url('repos'),class_='repos')}</li> |
|
210 | 211 | <li>${h.link_to(_('users'),h.url('users'),class_='users')}</li> |
|
211 | 212 | <li>${h.link_to(_('permissions'),h.url('edit_permission',id='default'),class_='permissions')}</li> |
|
213 | <li>${h.link_to(_('ldap'),h.url('ldap_home'),class_='ldap')}</li> | |
|
212 | 214 | <li class="last">${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}</li> |
|
213 | 215 | </ul> |
|
216 | </%def> | |
|
217 | ||
|
218 | ${admin_menu()} | |
|
214 | 219 | </li> |
|
215 | 220 | %endif |
|
216 | 221 | |
@@ -274,17 +279,10 b'' | |||
|
274 | 279 | <img src="/images/icons/cog_edit.png" alt="${_('Admin')}" /> |
|
275 | 280 | </span> |
|
276 | 281 | <span>${_('Admin')}</span> |
|
277 |
</a> |
|
|
278 | <ul> | |
|
279 | <li>${h.link_to(_('journal'),h.url('admin_home'),class_='journal')}</li> | |
|
280 | <li>${h.link_to(_('repositories'),h.url('repos'),class_='repos')}</li> | |
|
281 | <li>${h.link_to(_('users'),h.url('users'),class_='users')}</li> | |
|
282 | <li>${h.link_to(_('permissions'),h.url('edit_permission',id='default'),class_='permissions')}</li> | |
|
283 | <li class="last">${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}</li> | |
|
284 | </ul> | |
|
282 | </a> | |
|
283 | ${admin_menu()} | |
|
285 | 284 | </li> |
|
286 | 285 | %endif |
|
287 | ||
|
288 | 286 | </ul> |
|
289 | 287 | %endif |
|
290 | 288 | </%def> |
General Comments 0
You need to be logged in to leave comments.
Login now