##// END OF EJS Templates
fixed ldap settings creation, we need to fill in some bool defaults properly to make it work fine
marcink -
r1138:9c45e114 beta
parent child Browse files
Show More
@@ -1,536 +1,519 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.lib.db_manage
3 rhodecode.lib.db_manage
4 ~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Database creation, and setup module for RhodeCode. Used for creation
6 Database creation, and setup module for RhodeCode. Used for creation
7 of database as well as for migration operations
7 of database as well as for migration operations
8
8
9 :created_on: Apr 10, 2010
9 :created_on: Apr 10, 2010
10 :author: marcink
10 :author: marcink
11 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
12 :license: GPLv3, see COPYING for more details.
12 :license: GPLv3, see COPYING for more details.
13 """
13 """
14 # This program is free software; you can redistribute it and/or
14 # This program is free software; you can redistribute it and/or
15 # modify it under the terms of the GNU General Public License
15 # modify it under the terms of the GNU General Public License
16 # as published by the Free Software Foundation; version 2
16 # as published by the Free Software Foundation; version 2
17 # of the License or (at your opinion) any later version of the license.
17 # of the License or (at your opinion) any later version of the license.
18 #
18 #
19 # This program is distributed in the hope that it will be useful,
19 # This program is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
22 # GNU General Public License for more details.
23 #
23 #
24 # You should have received a copy of the GNU General Public License
24 # You should have received a copy of the GNU General Public License
25 # along with this program; if not, write to the Free Software
25 # along with this program; if not, write to the Free Software
26 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
26 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
27 # MA 02110-1301, USA.
27 # MA 02110-1301, USA.
28
28
29 import os
29 import os
30 import sys
30 import sys
31 import uuid
31 import uuid
32 import logging
32 import logging
33 from os.path import dirname as dn, join as jn
33 from os.path import dirname as dn, join as jn
34
34
35 from rhodecode import __dbversion__
35 from rhodecode import __dbversion__
36 from rhodecode.model import meta
36 from rhodecode.model import meta
37
37
38 from rhodecode.lib.auth import get_crypt_password, generate_api_key
38 from rhodecode.lib.auth import get_crypt_password, generate_api_key
39 from rhodecode.lib.utils import ask_ok
39 from rhodecode.lib.utils import ask_ok
40 from rhodecode.model import init_model
40 from rhodecode.model import init_model
41 from rhodecode.model.db import User, Permission, RhodeCodeUi, RhodeCodeSettings, \
41 from rhodecode.model.db import User, Permission, RhodeCodeUi, RhodeCodeSettings, \
42 UserToPerm, DbMigrateVersion
42 UserToPerm, DbMigrateVersion
43
43
44 from sqlalchemy.engine import create_engine
44 from sqlalchemy.engine import create_engine
45
45
46 log = logging.getLogger(__name__)
46 log = logging.getLogger(__name__)
47
47
48 class DbManage(object):
48 class DbManage(object):
49 def __init__(self, log_sql, dbconf, root, tests=False):
49 def __init__(self, log_sql, dbconf, root, tests=False):
50 self.dbname = dbconf.split('/')[-1]
50 self.dbname = dbconf.split('/')[-1]
51 self.tests = tests
51 self.tests = tests
52 self.root = root
52 self.root = root
53 self.dburi = dbconf
53 self.dburi = dbconf
54 self.log_sql = log_sql
54 self.log_sql = log_sql
55 self.db_exists = False
55 self.db_exists = False
56 self.init_db()
56 self.init_db()
57
57
58 def init_db(self):
58 def init_db(self):
59 engine = create_engine(self.dburi, echo=self.log_sql)
59 engine = create_engine(self.dburi, echo=self.log_sql)
60 init_model(engine)
60 init_model(engine)
61 self.sa = meta.Session()
61 self.sa = meta.Session()
62
62
63 def check_for_db(self, override):
64 db_path = jn(self.root, self.dbname)
65 if self.dburi.startswith('sqlite'):
66 log.info('checking for existing db in %s', db_path)
67 if os.path.isfile(db_path):
68
69 self.db_exists = True
70 if not override:
71 raise Exception('database already exists')
72 return 'sqlite'
73 if self.dburi.startswith('postgresql'):
74 self.db_exists = True
75 return 'postgresql'
76
77
78 def create_tables(self, override=False):
63 def create_tables(self, override=False):
79 """Create a auth database
64 """Create a auth database
80 """
65 """
81
66
82 db_type = self.check_for_db(override)
67 log.info("Any existing database is going to be destroyed")
83 if self.db_exists:
84 log.info("database exist and it's going to be destroyed")
85 if self.tests:
68 if self.tests:
86 destroy = True
69 destroy = True
87 else:
70 else:
88 destroy = ask_ok('Are you sure to destroy old database ? [y/n]')
71 destroy = ask_ok('Are you sure to destroy old database ? [y/n]')
89 if not destroy:
72 if not destroy:
90 sys.exit()
73 sys.exit()
91 if self.db_exists and destroy:
74 if destroy:
92 if db_type == 'sqlite':
93 os.remove(jn(self.root, self.dbname))
94 if db_type == 'postgresql':
95 meta.Base.metadata.drop_all()
75 meta.Base.metadata.drop_all()
96
76
97 checkfirst = not override
77 checkfirst = not override
98 meta.Base.metadata.create_all(checkfirst=checkfirst)
78 meta.Base.metadata.create_all(checkfirst=checkfirst)
99 log.info('Created tables for %s', self.dbname)
79 log.info('Created tables for %s', self.dbname)
100
80
101
81
102
82
103 def set_db_version(self):
83 def set_db_version(self):
104 try:
84 try:
105 ver = DbMigrateVersion()
85 ver = DbMigrateVersion()
106 ver.version = __dbversion__
86 ver.version = __dbversion__
107 ver.repository_id = 'rhodecode_db_migrations'
87 ver.repository_id = 'rhodecode_db_migrations'
108 ver.repository_path = 'versions'
88 ver.repository_path = 'versions'
109 self.sa.add(ver)
89 self.sa.add(ver)
110 self.sa.commit()
90 self.sa.commit()
111 except:
91 except:
112 self.sa.rollback()
92 self.sa.rollback()
113 raise
93 raise
114 log.info('db version set to: %s', __dbversion__)
94 log.info('db version set to: %s', __dbversion__)
115
95
116
96
117 def upgrade(self):
97 def upgrade(self):
118 """Upgrades given database schema to given revision following
98 """Upgrades given database schema to given revision following
119 all needed steps, to perform the upgrade
99 all needed steps, to perform the upgrade
120
100
121 """
101 """
122
102
123 from rhodecode.lib.dbmigrate.migrate.versioning import api
103 from rhodecode.lib.dbmigrate.migrate.versioning import api
124 from rhodecode.lib.dbmigrate.migrate.exceptions import \
104 from rhodecode.lib.dbmigrate.migrate.exceptions import \
125 DatabaseNotControlledError
105 DatabaseNotControlledError
126
106
127 upgrade = ask_ok('You are about to perform database upgrade, make '
107 upgrade = ask_ok('You are about to perform database upgrade, make '
128 'sure You backed up your database before. '
108 'sure You backed up your database before. '
129 'Continue ? [y/n]')
109 'Continue ? [y/n]')
130 if not upgrade:
110 if not upgrade:
131 sys.exit('Nothing done')
111 sys.exit('Nothing done')
132
112
133 repository_path = jn(dn(dn(dn(os.path.realpath(__file__)))),
113 repository_path = jn(dn(dn(dn(os.path.realpath(__file__)))),
134 'rhodecode/lib/dbmigrate')
114 'rhodecode/lib/dbmigrate')
135 db_uri = self.dburi
115 db_uri = self.dburi
136
116
137 try:
117 try:
138 curr_version = api.db_version(db_uri, repository_path)
118 curr_version = api.db_version(db_uri, repository_path)
139 msg = ('Found current database under version'
119 msg = ('Found current database under version'
140 ' control with version %s' % curr_version)
120 ' control with version %s' % curr_version)
141
121
142 except (RuntimeError, DatabaseNotControlledError), e:
122 except (RuntimeError, DatabaseNotControlledError), e:
143 curr_version = 1
123 curr_version = 1
144 msg = ('Current database is not under version control. Setting'
124 msg = ('Current database is not under version control. Setting'
145 ' as version %s' % curr_version)
125 ' as version %s' % curr_version)
146 api.version_control(db_uri, repository_path, curr_version)
126 api.version_control(db_uri, repository_path, curr_version)
147
127
148 print (msg)
128 print (msg)
149
129
150 if curr_version == __dbversion__:
130 if curr_version == __dbversion__:
151 sys.exit('This database is already at the newest version')
131 sys.exit('This database is already at the newest version')
152
132
153 #======================================================================
133 #======================================================================
154 # UPGRADE STEPS
134 # UPGRADE STEPS
155 #======================================================================
135 #======================================================================
156 class UpgradeSteps(object):
136 class UpgradeSteps(object):
157 """Those steps follow schema versions so for example schema
137 """Those steps follow schema versions so for example schema
158 for example schema with seq 002 == step_2 and so on.
138 for example schema with seq 002 == step_2 and so on.
159 """
139 """
160
140
161 def __init__(self, klass):
141 def __init__(self, klass):
162 self.klass = klass
142 self.klass = klass
163
143
164 def step_0(self):
144 def step_0(self):
165 #step 0 is the schema upgrade, and than follow proper upgrades
145 #step 0 is the schema upgrade, and than follow proper upgrades
166 print ('attempting to do database upgrade to version %s' \
146 print ('attempting to do database upgrade to version %s' \
167 % __dbversion__)
147 % __dbversion__)
168 api.upgrade(db_uri, repository_path, __dbversion__)
148 api.upgrade(db_uri, repository_path, __dbversion__)
169 print ('Schema upgrade completed')
149 print ('Schema upgrade completed')
170
150
171 def step_1(self):
151 def step_1(self):
172 pass
152 pass
173
153
174 def step_2(self):
154 def step_2(self):
175 print ('Patching repo paths for newer version of RhodeCode')
155 print ('Patching repo paths for newer version of RhodeCode')
176 self.klass.fix_repo_paths()
156 self.klass.fix_repo_paths()
177
157
178 print ('Patching default user of RhodeCode')
158 print ('Patching default user of RhodeCode')
179 self.klass.fix_default_user()
159 self.klass.fix_default_user()
180
160
181 log.info('Changing ui settings')
161 log.info('Changing ui settings')
182 self.klass.create_ui_settings()
162 self.klass.create_ui_settings()
183
163
184 def step_3(self):
164 def step_3(self):
185 print ('Adding additional settings into RhodeCode db')
165 print ('Adding additional settings into RhodeCode db')
186 self.klass.fix_settings()
166 self.klass.fix_settings()
187
167
188 upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1)
168 upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1)
189
169
190 #CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE
170 #CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE
191 for step in upgrade_steps:
171 for step in upgrade_steps:
192 print ('performing upgrade step %s' % step)
172 print ('performing upgrade step %s' % step)
193 callable = getattr(UpgradeSteps(self), 'step_%s' % step)()
173 callable = getattr(UpgradeSteps(self), 'step_%s' % step)()
194
174
195
175
196
176
197 def fix_repo_paths(self):
177 def fix_repo_paths(self):
198 """Fixes a old rhodecode version path into new one without a '*'
178 """Fixes a old rhodecode version path into new one without a '*'
199 """
179 """
200
180
201 paths = self.sa.query(RhodeCodeUi)\
181 paths = self.sa.query(RhodeCodeUi)\
202 .filter(RhodeCodeUi.ui_key == '/')\
182 .filter(RhodeCodeUi.ui_key == '/')\
203 .scalar()
183 .scalar()
204
184
205 paths.ui_value = paths.ui_value.replace('*', '')
185 paths.ui_value = paths.ui_value.replace('*', '')
206
186
207 try:
187 try:
208 self.sa.add(paths)
188 self.sa.add(paths)
209 self.sa.commit()
189 self.sa.commit()
210 except:
190 except:
211 self.sa.rollback()
191 self.sa.rollback()
212 raise
192 raise
213
193
214 def fix_default_user(self):
194 def fix_default_user(self):
215 """Fixes a old default user with some 'nicer' default values,
195 """Fixes a old default user with some 'nicer' default values,
216 used mostly for anonymous access
196 used mostly for anonymous access
217 """
197 """
218 def_user = self.sa.query(User)\
198 def_user = self.sa.query(User)\
219 .filter(User.username == 'default')\
199 .filter(User.username == 'default')\
220 .one()
200 .one()
221
201
222 def_user.name = 'Anonymous'
202 def_user.name = 'Anonymous'
223 def_user.lastname = 'User'
203 def_user.lastname = 'User'
224 def_user.email = 'anonymous@rhodecode.org'
204 def_user.email = 'anonymous@rhodecode.org'
225
205
226 try:
206 try:
227 self.sa.add(def_user)
207 self.sa.add(def_user)
228 self.sa.commit()
208 self.sa.commit()
229 except:
209 except:
230 self.sa.rollback()
210 self.sa.rollback()
231 raise
211 raise
232
212
233 def fix_settings(self):
213 def fix_settings(self):
234 """Fixes rhodecode settings adds ga_code key for google analytics
214 """Fixes rhodecode settings adds ga_code key for google analytics
235 """
215 """
236
216
237 hgsettings3 = RhodeCodeSettings('ga_code', '')
217 hgsettings3 = RhodeCodeSettings('ga_code', '')
238
218
239 try:
219 try:
240 self.sa.add(hgsettings3)
220 self.sa.add(hgsettings3)
241 self.sa.commit()
221 self.sa.commit()
242 except:
222 except:
243 self.sa.rollback()
223 self.sa.rollback()
244 raise
224 raise
245
225
246 def admin_prompt(self, second=False):
226 def admin_prompt(self, second=False):
247 if not self.tests:
227 if not self.tests:
248 import getpass
228 import getpass
249
229
250
230
251 def get_password():
231 def get_password():
252 password = getpass.getpass('Specify admin password (min 6 chars):')
232 password = getpass.getpass('Specify admin password (min 6 chars):')
253 confirm = getpass.getpass('Confirm password:')
233 confirm = getpass.getpass('Confirm password:')
254
234
255 if password != confirm:
235 if password != confirm:
256 log.error('passwords mismatch')
236 log.error('passwords mismatch')
257 return False
237 return False
258 if len(password) < 6:
238 if len(password) < 6:
259 log.error('password is to short use at least 6 characters')
239 log.error('password is to short use at least 6 characters')
260 return False
240 return False
261
241
262 return password
242 return password
263
243
264 username = raw_input('Specify admin username:')
244 username = raw_input('Specify admin username:')
265
245
266 password = get_password()
246 password = get_password()
267 if not password:
247 if not password:
268 #second try
248 #second try
269 password = get_password()
249 password = get_password()
270 if not password:
250 if not password:
271 sys.exit()
251 sys.exit()
272
252
273 email = raw_input('Specify admin email:')
253 email = raw_input('Specify admin email:')
274 self.create_user(username, password, email, True)
254 self.create_user(username, password, email, True)
275 else:
255 else:
276 log.info('creating admin and regular test users')
256 log.info('creating admin and regular test users')
277 self.create_user('test_admin', 'test12', 'test_admin@mail.com', True)
257 self.create_user('test_admin', 'test12', 'test_admin@mail.com', True)
278 self.create_user('test_regular', 'test12', 'test_regular@mail.com', False)
258 self.create_user('test_regular', 'test12', 'test_regular@mail.com', False)
279 self.create_user('test_regular2', 'test12', 'test_regular2@mail.com', False)
259 self.create_user('test_regular2', 'test12', 'test_regular2@mail.com', False)
280
260
281 def create_ui_settings(self):
261 def create_ui_settings(self):
282 """Creates ui settings, fills out hooks
262 """Creates ui settings, fills out hooks
283 and disables dotencode
263 and disables dotencode
284
264
285 """
265 """
286 #HOOKS
266 #HOOKS
287 hooks1_key = 'changegroup.update'
267 hooks1_key = 'changegroup.update'
288 hooks1_ = self.sa.query(RhodeCodeUi)\
268 hooks1_ = self.sa.query(RhodeCodeUi)\
289 .filter(RhodeCodeUi.ui_key == hooks1_key).scalar()
269 .filter(RhodeCodeUi.ui_key == hooks1_key).scalar()
290
270
291 hooks1 = RhodeCodeUi() if hooks1_ is None else hooks1_
271 hooks1 = RhodeCodeUi() if hooks1_ is None else hooks1_
292 hooks1.ui_section = 'hooks'
272 hooks1.ui_section = 'hooks'
293 hooks1.ui_key = hooks1_key
273 hooks1.ui_key = hooks1_key
294 hooks1.ui_value = 'hg update >&2'
274 hooks1.ui_value = 'hg update >&2'
295 hooks1.ui_active = False
275 hooks1.ui_active = False
296
276
297 hooks2_key = 'changegroup.repo_size'
277 hooks2_key = 'changegroup.repo_size'
298 hooks2_ = self.sa.query(RhodeCodeUi)\
278 hooks2_ = self.sa.query(RhodeCodeUi)\
299 .filter(RhodeCodeUi.ui_key == hooks2_key).scalar()
279 .filter(RhodeCodeUi.ui_key == hooks2_key).scalar()
300
280
301 hooks2 = RhodeCodeUi() if hooks2_ is None else hooks2_
281 hooks2 = RhodeCodeUi() if hooks2_ is None else hooks2_
302 hooks2.ui_section = 'hooks'
282 hooks2.ui_section = 'hooks'
303 hooks2.ui_key = hooks2_key
283 hooks2.ui_key = hooks2_key
304 hooks2.ui_value = 'python:rhodecode.lib.hooks.repo_size'
284 hooks2.ui_value = 'python:rhodecode.lib.hooks.repo_size'
305
285
306 hooks3 = RhodeCodeUi()
286 hooks3 = RhodeCodeUi()
307 hooks3.ui_section = 'hooks'
287 hooks3.ui_section = 'hooks'
308 hooks3.ui_key = 'pretxnchangegroup.push_logger'
288 hooks3.ui_key = 'pretxnchangegroup.push_logger'
309 hooks3.ui_value = 'python:rhodecode.lib.hooks.log_push_action'
289 hooks3.ui_value = 'python:rhodecode.lib.hooks.log_push_action'
310
290
311 hooks4 = RhodeCodeUi()
291 hooks4 = RhodeCodeUi()
312 hooks4.ui_section = 'hooks'
292 hooks4.ui_section = 'hooks'
313 hooks4.ui_key = 'preoutgoing.pull_logger'
293 hooks4.ui_key = 'preoutgoing.pull_logger'
314 hooks4.ui_value = 'python:rhodecode.lib.hooks.log_pull_action'
294 hooks4.ui_value = 'python:rhodecode.lib.hooks.log_pull_action'
315
295
316 #For mercurial 1.7 set backward comapatibility with format
296 #For mercurial 1.7 set backward comapatibility with format
317 dotencode_disable = RhodeCodeUi()
297 dotencode_disable = RhodeCodeUi()
318 dotencode_disable.ui_section = 'format'
298 dotencode_disable.ui_section = 'format'
319 dotencode_disable.ui_key = 'dotencode'
299 dotencode_disable.ui_key = 'dotencode'
320 dotencode_disable.ui_value = 'false'
300 dotencode_disable.ui_value = 'false'
321
301
322 try:
302 try:
323 self.sa.add(hooks1)
303 self.sa.add(hooks1)
324 self.sa.add(hooks2)
304 self.sa.add(hooks2)
325 self.sa.add(hooks3)
305 self.sa.add(hooks3)
326 self.sa.add(hooks4)
306 self.sa.add(hooks4)
327 self.sa.add(dotencode_disable)
307 self.sa.add(dotencode_disable)
328 self.sa.commit()
308 self.sa.commit()
329 except:
309 except:
330 self.sa.rollback()
310 self.sa.rollback()
331 raise
311 raise
332
312
333
313
334 def create_ldap_options(self):
314 def create_ldap_options(self):
335 """Creates ldap settings"""
315 """Creates ldap settings"""
336
316
337 try:
317 try:
338 for k in ['ldap_active', 'ldap_host', 'ldap_port', 'ldap_ldaps',
318 for k, v in [('ldap_active', 'false'), ('ldap_host', ''),
339 'ldap_tls_reqcert', 'ldap_dn_user', 'ldap_dn_pass',
319 ('ldap_port', '389'), ('ldap_ldaps', 'false'),
340 'ldap_base_dn', 'ldap_filter', 'ldap_search_scope',
320 ('ldap_tls_reqcert', ''), ('ldap_dn_user', ''),
341 'ldap_attr_login', 'ldap_attr_firstname', 'ldap_attr_lastname',
321 ('ldap_dn_pass', ''), ('ldap_base_dn', ''),
342 'ldap_attr_email']:
322 ('ldap_filter', ''), ('ldap_search_scope', ''),
323 ('ldap_attr_login', ''), ('ldap_attr_firstname', ''),
324 ('ldap_attr_lastname', ''), ('ldap_attr_email', '')]:
343
325
344 setting = RhodeCodeSettings(k, '')
326
327 setting = RhodeCodeSettings(k, v)
345 self.sa.add(setting)
328 self.sa.add(setting)
346 self.sa.commit()
329 self.sa.commit()
347 except:
330 except:
348 self.sa.rollback()
331 self.sa.rollback()
349 raise
332 raise
350
333
351 def config_prompt(self, test_repo_path='', retries=3):
334 def config_prompt(self, test_repo_path='', retries=3):
352 if retries == 3:
335 if retries == 3:
353 log.info('Setting up repositories config')
336 log.info('Setting up repositories config')
354
337
355 if not self.tests and not test_repo_path:
338 if not self.tests and not test_repo_path:
356 path = raw_input('Specify valid full path to your repositories'
339 path = raw_input('Specify valid full path to your repositories'
357 ' you can change this later in application settings:')
340 ' you can change this later in application settings:')
358 else:
341 else:
359 path = test_repo_path
342 path = test_repo_path
360 path_ok = True
343 path_ok = True
361
344
362 #check proper dir
345 #check proper dir
363 if not os.path.isdir(path):
346 if not os.path.isdir(path):
364 path_ok = False
347 path_ok = False
365 log.error('Entered path is not a valid directory: %s [%s/3]',
348 log.error('Entered path is not a valid directory: %s [%s/3]',
366 path, retries)
349 path, retries)
367
350
368 #check write access
351 #check write access
369 if not os.access(path, os.W_OK):
352 if not os.access(path, os.W_OK):
370 path_ok = False
353 path_ok = False
371
354
372 log.error('No write permission to given path: %s [%s/3]',
355 log.error('No write permission to given path: %s [%s/3]',
373 path, retries)
356 path, retries)
374
357
375
358
376 if retries == 0:
359 if retries == 0:
377 sys.exit()
360 sys.exit()
378 if path_ok is False:
361 if path_ok is False:
379 retries -= 1
362 retries -= 1
380 return self.config_prompt(test_repo_path, retries)
363 return self.config_prompt(test_repo_path, retries)
381
364
382
365
383 return path
366 return path
384
367
385 def create_settings(self, path):
368 def create_settings(self, path):
386
369
387 self.create_ui_settings()
370 self.create_ui_settings()
388
371
389 #HG UI OPTIONS
372 #HG UI OPTIONS
390 web1 = RhodeCodeUi()
373 web1 = RhodeCodeUi()
391 web1.ui_section = 'web'
374 web1.ui_section = 'web'
392 web1.ui_key = 'push_ssl'
375 web1.ui_key = 'push_ssl'
393 web1.ui_value = 'false'
376 web1.ui_value = 'false'
394
377
395 web2 = RhodeCodeUi()
378 web2 = RhodeCodeUi()
396 web2.ui_section = 'web'
379 web2.ui_section = 'web'
397 web2.ui_key = 'allow_archive'
380 web2.ui_key = 'allow_archive'
398 web2.ui_value = 'gz zip bz2'
381 web2.ui_value = 'gz zip bz2'
399
382
400 web3 = RhodeCodeUi()
383 web3 = RhodeCodeUi()
401 web3.ui_section = 'web'
384 web3.ui_section = 'web'
402 web3.ui_key = 'allow_push'
385 web3.ui_key = 'allow_push'
403 web3.ui_value = '*'
386 web3.ui_value = '*'
404
387
405 web4 = RhodeCodeUi()
388 web4 = RhodeCodeUi()
406 web4.ui_section = 'web'
389 web4.ui_section = 'web'
407 web4.ui_key = 'baseurl'
390 web4.ui_key = 'baseurl'
408 web4.ui_value = '/'
391 web4.ui_value = '/'
409
392
410 paths = RhodeCodeUi()
393 paths = RhodeCodeUi()
411 paths.ui_section = 'paths'
394 paths.ui_section = 'paths'
412 paths.ui_key = '/'
395 paths.ui_key = '/'
413 paths.ui_value = path
396 paths.ui_value = path
414
397
415
398
416 hgsettings1 = RhodeCodeSettings('realm', 'RhodeCode authentication')
399 hgsettings1 = RhodeCodeSettings('realm', 'RhodeCode authentication')
417 hgsettings2 = RhodeCodeSettings('title', 'RhodeCode')
400 hgsettings2 = RhodeCodeSettings('title', 'RhodeCode')
418 hgsettings3 = RhodeCodeSettings('ga_code', '')
401 hgsettings3 = RhodeCodeSettings('ga_code', '')
419
402
420
403
421 try:
404 try:
422 self.sa.add(web1)
405 self.sa.add(web1)
423 self.sa.add(web2)
406 self.sa.add(web2)
424 self.sa.add(web3)
407 self.sa.add(web3)
425 self.sa.add(web4)
408 self.sa.add(web4)
426 self.sa.add(paths)
409 self.sa.add(paths)
427 self.sa.add(hgsettings1)
410 self.sa.add(hgsettings1)
428 self.sa.add(hgsettings2)
411 self.sa.add(hgsettings2)
429 self.sa.add(hgsettings3)
412 self.sa.add(hgsettings3)
430
413
431 self.sa.commit()
414 self.sa.commit()
432 except:
415 except:
433 self.sa.rollback()
416 self.sa.rollback()
434 raise
417 raise
435
418
436 self.create_ldap_options()
419 self.create_ldap_options()
437
420
438 log.info('created ui config')
421 log.info('created ui config')
439
422
440 def create_user(self, username, password, email='', admin=False):
423 def create_user(self, username, password, email='', admin=False):
441 log.info('creating administrator user %s', username)
424 log.info('creating administrator user %s', username)
442 new_user = User()
425 new_user = User()
443 new_user.username = username
426 new_user.username = username
444 new_user.password = get_crypt_password(password)
427 new_user.password = get_crypt_password(password)
445 new_user.api_key = generate_api_key(username)
428 new_user.api_key = generate_api_key(username)
446 new_user.name = 'RhodeCode'
429 new_user.name = 'RhodeCode'
447 new_user.lastname = 'Admin'
430 new_user.lastname = 'Admin'
448 new_user.email = email
431 new_user.email = email
449 new_user.admin = admin
432 new_user.admin = admin
450 new_user.active = True
433 new_user.active = True
451
434
452 try:
435 try:
453 self.sa.add(new_user)
436 self.sa.add(new_user)
454 self.sa.commit()
437 self.sa.commit()
455 except:
438 except:
456 self.sa.rollback()
439 self.sa.rollback()
457 raise
440 raise
458
441
459 def create_default_user(self):
442 def create_default_user(self):
460 log.info('creating default user')
443 log.info('creating default user')
461 #create default user for handling default permissions.
444 #create default user for handling default permissions.
462 def_user = User()
445 def_user = User()
463 def_user.username = 'default'
446 def_user.username = 'default'
464 def_user.password = get_crypt_password(str(uuid.uuid1())[:8])
447 def_user.password = get_crypt_password(str(uuid.uuid1())[:8])
465 def_user.api_key = generate_api_key('default')
448 def_user.api_key = generate_api_key('default')
466 def_user.name = 'Anonymous'
449 def_user.name = 'Anonymous'
467 def_user.lastname = 'User'
450 def_user.lastname = 'User'
468 def_user.email = 'anonymous@rhodecode.org'
451 def_user.email = 'anonymous@rhodecode.org'
469 def_user.admin = False
452 def_user.admin = False
470 def_user.active = False
453 def_user.active = False
471 try:
454 try:
472 self.sa.add(def_user)
455 self.sa.add(def_user)
473 self.sa.commit()
456 self.sa.commit()
474 except:
457 except:
475 self.sa.rollback()
458 self.sa.rollback()
476 raise
459 raise
477
460
478 def create_permissions(self):
461 def create_permissions(self):
479 #module.(access|create|change|delete)_[name]
462 #module.(access|create|change|delete)_[name]
480 #module.(read|write|owner)
463 #module.(read|write|owner)
481 perms = [('repository.none', 'Repository no access'),
464 perms = [('repository.none', 'Repository no access'),
482 ('repository.read', 'Repository read access'),
465 ('repository.read', 'Repository read access'),
483 ('repository.write', 'Repository write access'),
466 ('repository.write', 'Repository write access'),
484 ('repository.admin', 'Repository admin access'),
467 ('repository.admin', 'Repository admin access'),
485 ('hg.admin', 'Hg Administrator'),
468 ('hg.admin', 'Hg Administrator'),
486 ('hg.create.repository', 'Repository create'),
469 ('hg.create.repository', 'Repository create'),
487 ('hg.create.none', 'Repository creation disabled'),
470 ('hg.create.none', 'Repository creation disabled'),
488 ('hg.register.none', 'Register disabled'),
471 ('hg.register.none', 'Register disabled'),
489 ('hg.register.manual_activate', 'Register new user with RhodeCode without manual activation'),
472 ('hg.register.manual_activate', 'Register new user with RhodeCode without manual activation'),
490 ('hg.register.auto_activate', 'Register new user with RhodeCode without auto activation'),
473 ('hg.register.auto_activate', 'Register new user with RhodeCode without auto activation'),
491 ]
474 ]
492
475
493 for p in perms:
476 for p in perms:
494 new_perm = Permission()
477 new_perm = Permission()
495 new_perm.permission_name = p[0]
478 new_perm.permission_name = p[0]
496 new_perm.permission_longname = p[1]
479 new_perm.permission_longname = p[1]
497 try:
480 try:
498 self.sa.add(new_perm)
481 self.sa.add(new_perm)
499 self.sa.commit()
482 self.sa.commit()
500 except:
483 except:
501 self.sa.rollback()
484 self.sa.rollback()
502 raise
485 raise
503
486
504 def populate_default_permissions(self):
487 def populate_default_permissions(self):
505 log.info('creating default user permissions')
488 log.info('creating default user permissions')
506
489
507 default_user = self.sa.query(User)\
490 default_user = self.sa.query(User)\
508 .filter(User.username == 'default').scalar()
491 .filter(User.username == 'default').scalar()
509
492
510 reg_perm = UserToPerm()
493 reg_perm = UserToPerm()
511 reg_perm.user = default_user
494 reg_perm.user = default_user
512 reg_perm.permission = self.sa.query(Permission)\
495 reg_perm.permission = self.sa.query(Permission)\
513 .filter(Permission.permission_name == 'hg.register.manual_activate')\
496 .filter(Permission.permission_name == 'hg.register.manual_activate')\
514 .scalar()
497 .scalar()
515
498
516 create_repo_perm = UserToPerm()
499 create_repo_perm = UserToPerm()
517 create_repo_perm.user = default_user
500 create_repo_perm.user = default_user
518 create_repo_perm.permission = self.sa.query(Permission)\
501 create_repo_perm.permission = self.sa.query(Permission)\
519 .filter(Permission.permission_name == 'hg.create.repository')\
502 .filter(Permission.permission_name == 'hg.create.repository')\
520 .scalar()
503 .scalar()
521
504
522 default_repo_perm = UserToPerm()
505 default_repo_perm = UserToPerm()
523 default_repo_perm.user = default_user
506 default_repo_perm.user = default_user
524 default_repo_perm.permission = self.sa.query(Permission)\
507 default_repo_perm.permission = self.sa.query(Permission)\
525 .filter(Permission.permission_name == 'repository.read')\
508 .filter(Permission.permission_name == 'repository.read')\
526 .scalar()
509 .scalar()
527
510
528 try:
511 try:
529 self.sa.add(reg_perm)
512 self.sa.add(reg_perm)
530 self.sa.add(create_repo_perm)
513 self.sa.add(create_repo_perm)
531 self.sa.add(default_repo_perm)
514 self.sa.add(default_repo_perm)
532 self.sa.commit()
515 self.sa.commit()
533 except:
516 except:
534 self.sa.rollback()
517 self.sa.rollback()
535 raise
518 raise
536
519
General Comments 0
You need to be logged in to leave comments. Login now