Show More
@@ -53,6 +53,29 b' CREATE_REPO_HOOK = _crrepohook' | |||||
53 |
|
53 | |||
54 |
|
54 | |||
55 | #============================================================================== |
|
55 | #============================================================================== | |
|
56 | # PRE CREATE USER HOOK | |||
|
57 | #============================================================================== | |||
|
58 | # this function will be executed before each user is created | |||
|
59 | def _pre_cruserhook(*args, **kwargs): | |||
|
60 | """ | |||
|
61 | Pre create user HOOK, it returns a tuple of bool, reason. | |||
|
62 | If bool is False the user creation will be stopped and reason | |||
|
63 | will be displayed to the user. | |||
|
64 | kwargs available: | |||
|
65 | :param username: | |||
|
66 | :param password: | |||
|
67 | :param email: | |||
|
68 | :param firstname: | |||
|
69 | :param lastname: | |||
|
70 | :param active: | |||
|
71 | :param admin: | |||
|
72 | :param created_by: | |||
|
73 | """ | |||
|
74 | reason = 'allowed' | |||
|
75 | return True, reason | |||
|
76 | PRE_CREATE_USER_HOOK = _pre_cruserhook | |||
|
77 | ||||
|
78 | #============================================================================== | |||
56 | # POST CREATE USER HOOK |
|
79 | # POST CREATE USER HOOK | |
57 | #============================================================================== |
|
80 | #============================================================================== | |
58 | # this function will be executed after each user is created |
|
81 | # this function will be executed after each user is created |
@@ -35,7 +35,7 b' from pylons.i18n.translation import _' | |||||
35 |
|
35 | |||
36 | import rhodecode |
|
36 | import rhodecode | |
37 | from rhodecode.lib.exceptions import DefaultUserException, \ |
|
37 | from rhodecode.lib.exceptions import DefaultUserException, \ | |
38 | UserOwnsReposException |
|
38 | UserOwnsReposException, UserCreationError | |
39 | from rhodecode.lib import helpers as h |
|
39 | from rhodecode.lib import helpers as h | |
40 | from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \ |
|
40 | from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \ | |
41 | AuthUser |
|
41 | AuthUser | |
@@ -137,6 +137,8 b' class UsersController(BaseController):' | |||||
137 | errors=errors.error_dict or {}, |
|
137 | errors=errors.error_dict or {}, | |
138 | prefix_error=False, |
|
138 | prefix_error=False, | |
139 | encoding="UTF-8") |
|
139 | encoding="UTF-8") | |
|
140 | except UserCreationError, e: | |||
|
141 | h.flash(e, 'error') | |||
140 | except Exception: |
|
142 | except Exception: | |
141 | log.error(traceback.format_exc()) |
|
143 | log.error(traceback.format_exc()) | |
142 | h.flash(_('Error occurred during creation of user %s') \ |
|
144 | h.flash(_('Error occurred during creation of user %s') \ |
@@ -37,6 +37,7 b' from pylons import request, response, se' | |||||
37 | import rhodecode.lib.helpers as h |
|
37 | import rhodecode.lib.helpers as h | |
38 | from rhodecode.lib.auth import AuthUser, HasPermissionAnyDecorator |
|
38 | from rhodecode.lib.auth import AuthUser, HasPermissionAnyDecorator | |
39 | from rhodecode.lib.base import BaseController, render |
|
39 | from rhodecode.lib.base import BaseController, render | |
|
40 | from rhodecode.lib.exceptions import UserCreationError | |||
40 | from rhodecode.model.db import User |
|
41 | from rhodecode.model.db import User | |
41 | from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm |
|
42 | from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm | |
42 | from rhodecode.model.user import UserModel |
|
43 | from rhodecode.model.user import UserModel | |
@@ -120,6 +121,12 b' class LoginController(BaseController):' | |||||
120 | errors=errors.error_dict or {}, |
|
121 | errors=errors.error_dict or {}, | |
121 | prefix_error=False, |
|
122 | prefix_error=False, | |
122 | encoding="UTF-8") |
|
123 | encoding="UTF-8") | |
|
124 | except UserCreationError, e: | |||
|
125 | # container auth or other auth functions that create users on | |||
|
126 | # the fly can throw this exception signaling that there's issue | |||
|
127 | # with user creation, explanation should be provided in | |||
|
128 | # Exception itself | |||
|
129 | h.flash(e, 'error') | |||
123 |
|
130 | |||
124 | return render('/login.html') |
|
131 | return render('/login.html') | |
125 |
|
132 | |||
@@ -147,6 +154,12 b' class LoginController(BaseController):' | |||||
147 | errors=errors.error_dict or {}, |
|
154 | errors=errors.error_dict or {}, | |
148 | prefix_error=False, |
|
155 | prefix_error=False, | |
149 | encoding="UTF-8") |
|
156 | encoding="UTF-8") | |
|
157 | except UserCreationError, e: | |||
|
158 | # container auth or other auth functions that create users on | |||
|
159 | # the fly can throw this exception signaling that there's issue | |||
|
160 | # with user creation, explanation should be provided in | |||
|
161 | # Exception itself | |||
|
162 | h.flash(e, 'error') | |||
150 |
|
163 | |||
151 | return render('/register.html') |
|
164 | return render('/register.html') | |
152 |
|
165 |
@@ -22,6 +22,7 b' from rhodecode.lib.utils2 import str2boo' | |||||
22 | from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\ |
|
22 | from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\ | |
23 | HasPermissionAnyMiddleware, CookieStoreWrapper |
|
23 | HasPermissionAnyMiddleware, CookieStoreWrapper | |
24 | from rhodecode.lib.utils import get_repo_slug |
|
24 | from rhodecode.lib.utils import get_repo_slug | |
|
25 | from rhodecode.lib.exceptions import UserCreationError | |||
25 | from rhodecode.model import meta |
|
26 | from rhodecode.model import meta | |
26 |
|
27 | |||
27 | from rhodecode.model.db import Repository, RhodeCodeUi, User, RhodeCodeSetting |
|
28 | from rhodecode.model.db import Repository, RhodeCodeUi, User, RhodeCodeSetting | |
@@ -300,7 +301,17 b' class BaseController(WSGIController):' | |||||
300 | cookie_store = CookieStoreWrapper(session.get('rhodecode_user')) |
|
301 | cookie_store = CookieStoreWrapper(session.get('rhodecode_user')) | |
301 | user_id = cookie_store.get('user_id', None) |
|
302 | user_id = cookie_store.get('user_id', None) | |
302 | username = get_container_username(environ, config) |
|
303 | username = get_container_username(environ, config) | |
303 | auth_user = AuthUser(user_id, api_key, username, self.ip_addr) |
|
304 | try: | |
|
305 | auth_user = AuthUser(user_id, api_key, username, self.ip_addr) | |||
|
306 | except UserCreationError, e: | |||
|
307 | from rhodecode.lib import helpers as h | |||
|
308 | h.flash(e, 'error') | |||
|
309 | # container auth or other auth functions that create users on | |||
|
310 | # the fly can throw this exception signaling that there's issue | |||
|
311 | # with user creation, explanation should be provided in | |||
|
312 | # Exception itself | |||
|
313 | auth_user = AuthUser(ip_addr=self.ip_addr) | |||
|
314 | ||||
304 | request.user = auth_user |
|
315 | request.user = auth_user | |
305 | self.rhodecode_user = c.rhodecode_user = auth_user |
|
316 | self.rhodecode_user = c.rhodecode_user = auth_user | |
306 | if not self.rhodecode_user.is_authenticated and \ |
|
317 | if not self.rhodecode_user.is_authenticated and \ |
@@ -90,3 +90,11 b' class HTTPLockedRC(HTTPClientError):' | |||||
90 |
|
90 | |||
91 | class IMCCommitError(Exception): |
|
91 | class IMCCommitError(Exception): | |
92 | pass |
|
92 | pass | |
|
93 | ||||
|
94 | ||||
|
95 | class UserCreationError(Exception): | |||
|
96 | pass | |||
|
97 | ||||
|
98 | ||||
|
99 | class RepositoryCreationError(Exception): | |||
|
100 | pass |
@@ -34,7 +34,7 b' from rhodecode.lib import helpers as h' | |||||
34 | from rhodecode.lib.utils import action_logger |
|
34 | from rhodecode.lib.utils import action_logger | |
35 | from rhodecode.lib.vcs.backends.base import EmptyChangeset |
|
35 | from rhodecode.lib.vcs.backends.base import EmptyChangeset | |
36 | from rhodecode.lib.compat import json |
|
36 | from rhodecode.lib.compat import json | |
37 | from rhodecode.lib.exceptions import HTTPLockedRC |
|
37 | from rhodecode.lib.exceptions import HTTPLockedRC, UserCreationError | |
38 | from rhodecode.lib.utils2 import safe_str, _extract_extras |
|
38 | from rhodecode.lib.utils2 import safe_str, _extract_extras | |
39 | from rhodecode.model.db import Repository, User |
|
39 | from rhodecode.model.db import Repository, User | |
40 |
|
40 | |||
@@ -252,6 +252,15 b' def log_create_repository(repository_dic' | |||||
252 | return 0 |
|
252 | return 0 | |
253 |
|
253 | |||
254 |
|
254 | |||
|
255 | def check_allowed_create_user(user_dict, created_by, **kwargs): | |||
|
256 | from rhodecode import EXTENSIONS | |||
|
257 | callback = getattr(EXTENSIONS, 'PRE_CREATE_USER_HOOK', None) | |||
|
258 | if isfunction(callback): | |||
|
259 | allowed, reason = callback(created_by=created_by, **user_dict) | |||
|
260 | if not allowed: | |||
|
261 | raise UserCreationError(reason) | |||
|
262 | ||||
|
263 | ||||
255 | def log_create_user(user_dict, created_by, **kwargs): |
|
264 | def log_create_user(user_dict, created_by, **kwargs): | |
256 | """ |
|
265 | """ | |
257 | Post create user Hook. This is a dummy function for admins to re-use |
|
266 | Post create user Hook. This is a dummy function for admins to re-use |
@@ -36,9 +36,9 b' from sqlalchemy.orm import joinedload' | |||||
36 | from rhodecode.lib.utils2 import safe_unicode, generate_api_key, get_current_rhodecode_user |
|
36 | from rhodecode.lib.utils2 import safe_unicode, generate_api_key, get_current_rhodecode_user | |
37 | from rhodecode.lib.caching_query import FromCache |
|
37 | from rhodecode.lib.caching_query import FromCache | |
38 | from rhodecode.model import BaseModel |
|
38 | from rhodecode.model import BaseModel | |
39 |
from rhodecode.model.db import User, |
|
39 | from rhodecode.model.db import User, Repository, Permission, \ | |
40 | UserToPerm, UserGroupRepoToPerm, UserGroupToPerm, UserGroupMember, \ |
|
40 | UserToPerm, UserGroupRepoToPerm, UserGroupToPerm, UserGroupMember, \ | |
41 |
Notification, RepoGroup, |
|
41 | Notification, RepoGroup, UserGroupRepoGroupToPerm, \ | |
42 | UserEmailMap, UserIpMap, UserGroupUserGroupToPerm, UserGroup |
|
42 | UserEmailMap, UserIpMap, UserGroupUserGroupToPerm, UserGroup | |
43 | from rhodecode.lib.exceptions import DefaultUserException, \ |
|
43 | from rhodecode.lib.exceptions import DefaultUserException, \ | |
44 | UserOwnsReposException |
|
44 | UserOwnsReposException | |
@@ -83,6 +83,17 b' class UserModel(BaseModel):' | |||||
83 | def create(self, form_data, cur_user=None): |
|
83 | def create(self, form_data, cur_user=None): | |
84 | if not cur_user: |
|
84 | if not cur_user: | |
85 | cur_user = getattr(get_current_rhodecode_user(), 'username', None) |
|
85 | cur_user = getattr(get_current_rhodecode_user(), 'username', None) | |
|
86 | ||||
|
87 | from rhodecode.lib.hooks import log_create_user, check_allowed_create_user | |||
|
88 | _fd = form_data | |||
|
89 | form_data = { | |||
|
90 | 'username': _fd['username'], 'password': _fd['password'], | |||
|
91 | 'email': _fd['email'], 'firstname': _fd['firstname'], 'lastname': _fd['lastname'], | |||
|
92 | 'active': _fd['active'], 'admin': False | |||
|
93 | } | |||
|
94 | # raises UserCreationError if it's not allowed | |||
|
95 | check_allowed_create_user(form_data, cur_user) | |||
|
96 | ||||
86 | from rhodecode.lib.auth import get_crypt_password |
|
97 | from rhodecode.lib.auth import get_crypt_password | |
87 | try: |
|
98 | try: | |
88 | new_user = User() |
|
99 | new_user = User() | |
@@ -96,7 +107,6 b' class UserModel(BaseModel):' | |||||
96 | new_user.api_key = generate_api_key(form_data['username']) |
|
107 | new_user.api_key = generate_api_key(form_data['username']) | |
97 | self.sa.add(new_user) |
|
108 | self.sa.add(new_user) | |
98 |
|
109 | |||
99 | from rhodecode.lib.hooks import log_create_user |
|
|||
100 | log_create_user(new_user.get_dict(), cur_user) |
|
110 | log_create_user(new_user.get_dict(), cur_user) | |
101 | return new_user |
|
111 | return new_user | |
102 | except Exception: |
|
112 | except Exception: | |
@@ -124,6 +134,14 b' class UserModel(BaseModel):' | |||||
124 | cur_user = getattr(get_current_rhodecode_user(), 'username', None) |
|
134 | cur_user = getattr(get_current_rhodecode_user(), 'username', None) | |
125 |
|
135 | |||
126 | from rhodecode.lib.auth import get_crypt_password |
|
136 | from rhodecode.lib.auth import get_crypt_password | |
|
137 | from rhodecode.lib.hooks import log_create_user, check_allowed_create_user | |||
|
138 | form_data = { | |||
|
139 | 'username': username, 'password': password, | |||
|
140 | 'email': email, 'firstname': firstname, 'lastname': lastname, | |||
|
141 | 'active': active, 'admin': admin | |||
|
142 | } | |||
|
143 | # raises UserCreationError if it's not allowed | |||
|
144 | check_allowed_create_user(form_data, cur_user) | |||
127 |
|
145 | |||
128 | log.debug('Checking for %s account in RhodeCode database' % username) |
|
146 | log.debug('Checking for %s account in RhodeCode database' % username) | |
129 | user = User.get_by_username(username, case_insensitive=True) |
|
147 | user = User.get_by_username(username, case_insensitive=True) | |
@@ -151,7 +169,6 b' class UserModel(BaseModel):' | |||||
151 | self.sa.add(new_user) |
|
169 | self.sa.add(new_user) | |
152 |
|
170 | |||
153 | if not edit: |
|
171 | if not edit: | |
154 | from rhodecode.lib.hooks import log_create_user |
|
|||
155 | log_create_user(new_user.get_dict(), cur_user) |
|
172 | log_create_user(new_user.get_dict(), cur_user) | |
156 | return new_user |
|
173 | return new_user | |
157 | except (DatabaseError,): |
|
174 | except (DatabaseError,): | |
@@ -169,23 +186,33 b' class UserModel(BaseModel):' | |||||
169 | if not cur_user: |
|
186 | if not cur_user: | |
170 | cur_user = getattr(get_current_rhodecode_user(), 'username', None) |
|
187 | cur_user = getattr(get_current_rhodecode_user(), 'username', None) | |
171 | if self.get_by_username(username, case_insensitive=True) is None: |
|
188 | if self.get_by_username(username, case_insensitive=True) is None: | |
172 |
|
||||
173 | # autogenerate email for container account without one |
|
189 | # autogenerate email for container account without one | |
174 | generate_email = lambda usr: '%s@container_auth.account' % usr |
|
190 | generate_email = lambda usr: '%s@container_auth.account' % usr | |
|
191 | firstname = attrs['name'] | |||
|
192 | lastname = attrs['lastname'] | |||
|
193 | active = attrs.get('active', True) | |||
|
194 | email = attrs['email'] or generate_email(username) | |||
|
195 | ||||
|
196 | from rhodecode.lib.hooks import log_create_user, check_allowed_create_user | |||
|
197 | form_data = { | |||
|
198 | 'username': username, 'password': None, | |||
|
199 | 'email': email, 'firstname': firstname, 'lastname': lastname, | |||
|
200 | 'active': attrs.get('active', True), 'admin': False | |||
|
201 | } | |||
|
202 | # raises UserCreationError if it's not allowed | |||
|
203 | check_allowed_create_user(form_data, cur_user) | |||
175 |
|
204 | |||
176 | try: |
|
205 | try: | |
177 | new_user = User() |
|
206 | new_user = User() | |
178 | new_user.username = username |
|
207 | new_user.username = username | |
179 | new_user.password = None |
|
208 | new_user.password = None | |
180 | new_user.api_key = generate_api_key(username) |
|
209 | new_user.api_key = generate_api_key(username) | |
181 |
new_user.email = |
|
210 | new_user.email = email | |
182 |
new_user.active = |
|
211 | new_user.active = active | |
183 |
new_user.name = |
|
212 | new_user.name = firstname | |
184 |
new_user.lastname = |
|
213 | new_user.lastname = lastname | |
185 |
|
214 | |||
186 | self.sa.add(new_user) |
|
215 | self.sa.add(new_user) | |
187 |
|
||||
188 | from rhodecode.lib.hooks import log_create_user |
|
|||
189 | log_create_user(new_user.get_dict(), cur_user) |
|
216 | log_create_user(new_user.get_dict(), cur_user) | |
190 | return new_user |
|
217 | return new_user | |
191 | except (DatabaseError,): |
|
218 | except (DatabaseError,): | |
@@ -212,26 +239,37 b' class UserModel(BaseModel):' | |||||
212 | from rhodecode.lib.auth import get_crypt_password |
|
239 | from rhodecode.lib.auth import get_crypt_password | |
213 | log.debug('Checking for such ldap account in RhodeCode database') |
|
240 | log.debug('Checking for such ldap account in RhodeCode database') | |
214 | if self.get_by_username(username, case_insensitive=True) is None: |
|
241 | if self.get_by_username(username, case_insensitive=True) is None: | |
|
242 | # autogenerate email for container account without one | |||
|
243 | generate_email = lambda usr: '%s@ldap.account' % usr | |||
|
244 | password = get_crypt_password(password) | |||
|
245 | firstname = attrs['name'] | |||
|
246 | lastname = attrs['lastname'] | |||
|
247 | active = attrs.get('active', True) | |||
|
248 | email = attrs['email'] or generate_email(username) | |||
215 |
|
249 | |||
216 | # autogenerate email for ldap account without one |
|
250 | from rhodecode.lib.hooks import log_create_user, check_allowed_create_user | |
217 | generate_email = lambda usr: '%s@ldap.account' % usr |
|
251 | form_data = { | |
|
252 | 'username': username, 'password': password, | |||
|
253 | 'email': email, 'firstname': firstname, 'lastname': lastname, | |||
|
254 | 'active': attrs.get('active', True), 'admin': False | |||
|
255 | } | |||
|
256 | # raises UserCreationError if it's not allowed | |||
|
257 | check_allowed_create_user(form_data, cur_user) | |||
218 |
|
258 | |||
219 | try: |
|
259 | try: | |
220 | new_user = User() |
|
260 | new_user = User() | |
221 | username = username.lower() |
|
261 | username = username.lower() | |
222 | # add ldap account always lowercase |
|
262 | # add ldap account always lowercase | |
223 | new_user.username = username |
|
263 | new_user.username = username | |
224 |
new_user.password = |
|
264 | new_user.password = password | |
225 | new_user.api_key = generate_api_key(username) |
|
265 | new_user.api_key = generate_api_key(username) | |
226 |
new_user.email = |
|
266 | new_user.email = email | |
227 |
new_user.active = |
|
267 | new_user.active = active | |
228 | new_user.ldap_dn = safe_unicode(user_dn) |
|
268 | new_user.ldap_dn = safe_unicode(user_dn) | |
229 |
new_user.name = |
|
269 | new_user.name = firstname | |
230 |
new_user.lastname = |
|
270 | new_user.lastname = lastname | |
231 |
|
||||
232 | self.sa.add(new_user) |
|
271 | self.sa.add(new_user) | |
233 |
|
272 | |||
234 | from rhodecode.lib.hooks import log_create_user |
|
|||
235 | log_create_user(new_user.get_dict(), cur_user) |
|
273 | log_create_user(new_user.get_dict(), cur_user) | |
236 | return new_user |
|
274 | return new_user | |
237 | except (DatabaseError,): |
|
275 | except (DatabaseError,): |
@@ -6,7 +6,16 b'' | |||||
6 | </%def> |
|
6 | </%def> | |
7 |
|
7 | |||
8 | <div id="register"> |
|
8 | <div id="register"> | |
9 |
|
9 | <div class="flash_msg"> | ||
|
10 | <% messages = h.flash.pop_messages() %> | |||
|
11 | % if messages: | |||
|
12 | <ul id="flash-messages"> | |||
|
13 | % for message in messages: | |||
|
14 | <li class="${message.category}_msg">${message}</li> | |||
|
15 | % endfor | |||
|
16 | </ul> | |||
|
17 | % endif | |||
|
18 | </div> | |||
10 | <div class="title top-left-rounded-corner top-right-rounded-corner"> |
|
19 | <div class="title top-left-rounded-corner top-right-rounded-corner"> | |
11 | <h5>${_('Sign Up to')} ${c.rhodecode_name}</h5> |
|
20 | <h5>${_('Sign Up to')} ${c.rhodecode_name}</h5> | |
12 | </div> |
|
21 | </div> |
General Comments 0
You need to be logged in to leave comments.
Login now