check_hobos: constrain database_name to 63 characters (#22797)

This commit is contained in:
Benjamin Dauvergne 2018-03-26 15:55:00 +02:00 committed by Thomas NOEL
parent 5b582638d5
commit 3c30efe14a
2 changed files with 19 additions and 0 deletions

View File

@ -439,3 +439,12 @@ def test_configure_postgresql():
with mock.patch('psycopg2.connect') as connect:
sql.get_connection(new=True)
assert connect.call_args_list[0][1] == {'user': 'fred', 'database': 'tests_wcs_wcs_example_net'}
pub.cfg['postgresql']['database-template-name'] = 'very_long_'*10 + '%s'
with mock.patch('psycopg2.connect') as connect:
with mock.patch('subprocess.call') as call:
hobo_cmd.configure_sql(service, pub)
assert connect.call_args_list[0][1] == {'user': 'test', 'database': 'postgres'}
assert connect.call_args_list[1][1] == {'user': 'fred',
'database': 'very_long_very_long_very_long_c426_ng_very_long_wcs_example_net'}
assert len(connect.call_args_list[1][1]['database']) == 63

View File

@ -33,6 +33,8 @@ from qommon.storage import atomic_write
from wcs.admin.settings import UserFieldsFormDef
from wcs.fields import StringField, EmailField, DateField
from django.utils.encoding import force_bytes
class NoChange(Exception):
pass
@ -436,6 +438,12 @@ class CmdCheckHobos(Command):
with open(site_options_filepath, 'wb') as site_options:
config.write(site_options)
def normalize_database_name(self, database_name):
if len(database_name) > 63:
digest = hashlib.md5(force_bytes(database_name)).hexdigest()[:4]
database_name = '%s_%s_%s' % (database_name[:29], digest, database_name[-28:])
return database_name
def configure_sql(self, service, pub):
if not pub.cfg.get('postgresql'):
return
@ -460,6 +468,8 @@ class CmdCheckHobos(Command):
if not domain_table_name in database_name:
database_name = '%s_%s' % (database_name.split('_')[0], domain_table_name)
database_name = self.normalize_database_name(database_name)
createdb_cfg = pub.cfg['postgresql'].get('createdb-connection-params')
if not createdb_cfg:
createdb_cfg = {}