Handle custom table prefixes on service databases.

Closes #987

Thanks @Ric878
This commit is contained in:
Adarnof 2018-02-28 10:56:30 -05:00
parent 9d9cfebd9e
commit 2fa1d9998d
6 changed files with 81 additions and 63 deletions

View File

@ -4,16 +4,20 @@ import string
import re import re
from django.db import connections from django.db import connections
from passlib.hash import bcrypt from passlib.hash import bcrypt
from django.conf import settings
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
TABLE_PREFIX = getattr(settings, 'IPS4_TABLE_PREFIX', '')
class Ips4Manager: class Ips4Manager:
SQL_ADD_USER = r"INSERT INTO core_members (name, email, members_pass_hash, members_pass_salt, " \ SQL_ADD_USER = r"INSERT INTO %score_members (name, email, members_pass_hash, members_pass_salt, " \
r"member_group_id) VALUES (%s, %s, %s, %s, %s)" r"member_group_id) VALUES (%%s, %%s, %%s, %%s, %%s)" % TABLE_PREFIX
SQL_GET_ID = r"SELECT member_id FROM core_members WHERE name = %s" SQL_GET_ID = r"SELECT member_id FROM %score_members WHERE name = %%s" % TABLE_PREFIX
SQL_UPDATE_PASSWORD = r"UPDATE core_members SET members_pass_hash = %s, members_pass_salt = %s WHERE name = %s" SQL_UPDATE_PASSWORD = r"UPDATE %score_members SET members_pass_hash = %%s, members_pass_salt = %%s WHERE name = %%s" % TABLE_PREFIX
SQL_DEL_USER = r"DELETE FROM core_members WHERE member_id = %s" SQL_DEL_USER = r"DELETE FROM %score_members WHERE member_id = %%s" % TABLE_PREFIX
MEMBER_GROUP_ID = 3 MEMBER_GROUP_ID = 3

View File

@ -5,26 +5,30 @@ import re
from django.db import connections from django.db import connections
from passlib.hash import bcrypt from passlib.hash import bcrypt
from django.conf import settings
# requires yum install libffi-devel and pip install bcrypt # requires yum install libffi-devel and pip install bcrypt
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
TABLE_PREFIX = getattr(settings, 'MARKET_TABLE_PREFIX', 'fos_')
class MarketManager: class MarketManager:
def __init__(self): def __init__(self):
pass pass
SQL_ADD_USER = r"INSERT INTO fos_user (username, username_canonical, email, email_canonical, enabled, salt," \ SQL_ADD_USER = r"INSERT INTO %suser (username, username_canonical, email, email_canonical, enabled, salt," \
r"password, locked, expired, roles, credentials_expired, characterid, characterName)" \ r"password, locked, expired, roles, credentials_expired, characterid, characterName)" \
r"VALUES (%s, %s, %s, %s, 1,%s, %s, 0, 0, 'a:0:{}', 0, %s, %s) " r"VALUES (%%s, %%s, %%s, %%s, 1,%%s, %%s, 0, 0, 'a:0:{}', 0, %%s, %%s) " % TABLE_PREFIX
SQL_GET_USER_ID = r"SELECT id FROM fos_user WHERE username = %s" SQL_GET_USER_ID = r"SELECT id FROM %suser WHERE username = %%s" % TABLE_PREFIX
SQL_DISABLE_USER = r"UPDATE fos_user SET enabled = '0' WHERE username = %s" SQL_DISABLE_USER = r"UPDATE %suser SET enabled = '0' WHERE username = %%s" % TABLE_PREFIX
SQL_ENABLE_USER = r"UPDATE fos_user SET enabled = '1' WHERE username = %s" SQL_ENABLE_USER = r"UPDATE %suser SET enabled = '1' WHERE username = %%s" % TABLE_PREFIX
SQL_UPDATE_PASSWORD = r"UPDATE fos_user SET password = %s, salt = %s WHERE username = %s" SQL_UPDATE_PASSWORD = r"UPDATE %suser SET password = %%s, salt = %%s WHERE username = %%s" % TABLE_PREFIX
SQL_CHECK_EMAIL = r"SELECT email FROM fos_user WHERE email = %s" SQL_CHECK_EMAIL = r"SELECT email FROM %suser WHERE email = %%s" % TABLE_PREFIX
SQL_CHECK_USERNAME = r"SELECT username FROM fos_user WHERE username = %s" SQL_CHECK_USERNAME = r"SELECT username FROM %suser WHERE username = %%s" % TABLE_PREFIX
SQL_UPDATE_USER = r"UPDATE fos_user SET password = %s, salt = %s, enabled = '1' WHERE username = %s" SQL_UPDATE_USER = r"UPDATE %suser SET password = %%s, salt = %%s, enabled = '1' WHERE username = %%s" % TABLE_PREFIX
@staticmethod @staticmethod
def __santatize_username(username): def __santatize_username(username):
@ -47,31 +51,31 @@ class MarketManager:
@classmethod @classmethod
def check_username(cls, username): def check_username(cls, username):
logger.debug("Checking alliance market username %s" % username) logger.debug("Checking alliance market username %%s" % username)
cursor = connections['market'].cursor() cursor = connections['market'].cursor()
cursor.execute(cls.SQL_CHECK_USERNAME, [cls.__santatize_username(username)]) cursor.execute(cls.SQL_CHECK_USERNAME, [cls.__santatize_username(username)])
row = cursor.fetchone() row = cursor.fetchone()
if row: if row:
logger.debug("Found user %s on alliance market" % username) logger.debug("Found user %%s on alliance market" % username)
return True return True
logger.debug("User %s not found on alliance market" % username) logger.debug("User %%s not found on alliance market" % username)
return False return False
@classmethod @classmethod
def check_user_email(cls, username, email): def check_user_email(cls, username, email):
logger.debug("Checking if alliance market email exists for user %s" % username) logger.debug("Checking if alliance market email exists for user %%s" % username)
cursor = connections['market'].cursor() cursor = connections['market'].cursor()
cursor.execute(cls.SQL_CHECK_EMAIL, [email]) cursor.execute(cls.SQL_CHECK_EMAIL, [email])
row = cursor.fetchone() row = cursor.fetchone()
if row: if row:
logger.debug("Found user %s email address on alliance market" % username) logger.debug("Found user %%s email address on alliance market" % username)
return True return True
logger.debug("User %s email address not found on alliance market" % username) logger.debug("User %%s email address not found on alliance market" % username)
return False return False
@classmethod @classmethod
def add_user(cls, username, email, characterid, charactername): def add_user(cls, username, email, characterid, charactername):
logger.debug("Adding new market user %s" % username) logger.debug("Adding new market user %%s" % username)
plain_password = cls.__generate_random_pass() plain_password = cls.__generate_random_pass()
hash = cls._gen_pwhash(plain_password) hash = cls._gen_pwhash(plain_password)
salt = cls._get_salt(hash) salt = cls._get_salt(hash)
@ -79,33 +83,33 @@ class MarketManager:
if not cls.check_username(username): if not cls.check_username(username):
if not cls.check_user_email(username, email): if not cls.check_user_email(username, email):
try: try:
logger.debug("Adding user %s to alliance market" % username) logger.debug("Adding user %%s to alliance market" % username)
cursor = connections['market'].cursor() cursor = connections['market'].cursor()
cursor.execute(cls.SQL_ADD_USER, [username_clean, username_clean, email, email, salt, cursor.execute(cls.SQL_ADD_USER, [username_clean, username_clean, email, email, salt,
hash, characterid, charactername]) hash, characterid, charactername])
return username_clean, plain_password return username_clean, plain_password
except: except:
logger.debug("Unsuccessful attempt to add market user %s" % username) logger.debug("Unsuccessful attempt to add market user %%s" % username)
return "", "" return "", ""
else: else:
logger.debug("Alliance market email %s already exists Updating instead" % email) logger.debug("Alliance market email %%s already exists Updating instead" % email)
username_clean, password = cls.update_user_info(username) username_clean, password = cls.update_user_info(username)
return username_clean, password return username_clean, password
else: else:
logger.debug("Alliance market username %s already exists Updating instead" % username) logger.debug("Alliance market username %%s already exists Updating instead" % username)
username_clean, password = cls.update_user_info(username) username_clean, password = cls.update_user_info(username)
return username_clean, password return username_clean, password
@classmethod @classmethod
def disable_user(cls, username): def disable_user(cls, username):
logger.debug("Disabling alliance market user %s " % username) logger.debug("Disabling alliance market user %%s " % username)
cursor = connections['market'].cursor() cursor = connections['market'].cursor()
cursor.execute(cls.SQL_DISABLE_USER, [username]) cursor.execute(cls.SQL_DISABLE_USER, [username])
return True return True
@classmethod @classmethod
def update_custom_password(cls, username, plain_password): def update_custom_password(cls, username, plain_password):
logger.debug("Updating alliance market user %s password" % username) logger.debug("Updating alliance market user %%s password" % username)
if cls.check_username(username): if cls.check_username(username):
username_clean = cls.__santatize_username(username) username_clean = cls.__santatize_username(username)
hash = cls._gen_pwhash(plain_password) hash = cls._gen_pwhash(plain_password)
@ -114,12 +118,12 @@ class MarketManager:
cursor.execute(cls.SQL_UPDATE_PASSWORD, [hash, salt, username_clean]) cursor.execute(cls.SQL_UPDATE_PASSWORD, [hash, salt, username_clean])
return plain_password return plain_password
else: else:
logger.error("Unable to update alliance market user %s password" % username) logger.error("Unable to update alliance market user %%s password" % username)
return "" return ""
@classmethod @classmethod
def update_user_password(cls, username): def update_user_password(cls, username):
logger.debug("Updating alliance market user %s password" % username) logger.debug("Updating alliance market user %%s password" % username)
if cls.check_username(username): if cls.check_username(username):
username_clean = cls.__santatize_username(username) username_clean = cls.__santatize_username(username)
plain_password = cls.__generate_random_pass() plain_password = cls.__generate_random_pass()
@ -129,12 +133,12 @@ class MarketManager:
cursor.execute(cls.SQL_UPDATE_PASSWORD, [hash, salt, username_clean]) cursor.execute(cls.SQL_UPDATE_PASSWORD, [hash, salt, username_clean])
return plain_password return plain_password
else: else:
logger.error("Unable to update alliance market user %s password" % username) logger.error("Unable to update alliance market user %%s password" % username)
return "" return ""
@classmethod @classmethod
def update_user_info(cls, username): def update_user_info(cls, username):
logger.debug("Updating alliance market user %s" % username) logger.debug("Updating alliance market user %%s" % username)
try: try:
username_clean = cls.__santatize_username(username) username_clean = cls.__santatize_username(username)
plain_password = cls.__generate_random_pass() plain_password = cls.__generate_random_pass()
@ -144,5 +148,5 @@ class MarketManager:
cursor.execute(cls.SQL_UPDATE_USER, [hash, salt, username_clean]) cursor.execute(cls.SQL_UPDATE_USER, [hash, salt, username_clean])
return username_clean, plain_password return username_clean, plain_password
except: except:
logger.debug("Alliance market update user failed for %s" % username) logger.debug("Alliance market update user failed for %%s" % username)
return "", "" return "", ""

View File

@ -14,40 +14,43 @@ from django.conf import settings
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
TABLE_PREFIX = getattr(settings, 'PHPBB3_TABLE_PREFIX', 'phpbb_')
class Phpbb3Manager: class Phpbb3Manager:
SQL_ADD_USER = r"INSERT INTO phpbb_users (username, username_clean, " \ SQL_ADD_USER = r"INSERT INTO %susers (username, username_clean, " \
r"user_password, user_email, group_id, user_regdate, user_permissions, " \ r"user_password, user_email, group_id, user_regdate, user_permissions, " \
r"user_sig, user_lang) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, 'en')" r"user_sig, user_lang) VALUES (%%s, %%s, %%s, %%s, %%s, %%s, %%s, %%s, 'en')" % TABLE_PREFIX
SQL_DEL_USER = r"DELETE FROM phpbb_users where username = %s" SQL_DEL_USER = r"DELETE FROM %susers where username = %%s" % TABLE_PREFIX
SQL_DIS_USER = r"UPDATE phpbb_users SET user_email= %s, user_password=%s WHERE username = %s" SQL_DIS_USER = r"UPDATE %susers SET user_email= %%s, user_password=%%s WHERE username = %%s" % TABLE_PREFIX
SQL_USER_ID_FROM_USERNAME = r"SELECT user_id from phpbb_users WHERE username = %s" SQL_USER_ID_FROM_USERNAME = r"SELECT user_id from %susers WHERE username = %%s" % TABLE_PREFIX
SQL_ADD_USER_GROUP = r"INSERT INTO phpbb_user_group (group_id, user_id, user_pending) VALUES (%s, %s, %s)" SQL_ADD_USER_GROUP = r"INSERT INTO %suser_group (group_id, user_id, user_pending) VALUES (%%s, %%s, %%s)" % TABLE_PREFIX
SQL_GET_GROUP_ID = r"SELECT group_id from phpbb_groups WHERE group_name = %s" SQL_GET_GROUP_ID = r"SELECT group_id from %sgroups WHERE group_name = %%s" % TABLE_PREFIX
SQL_ADD_GROUP = r"INSERT INTO phpbb_groups (group_name,group_desc,group_legend) VALUES (%s,%s,0)" SQL_ADD_GROUP = r"INSERT INTO %sgroups (group_name,group_desc,group_legend) VALUES (%%s,%%s,0)" % TABLE_PREFIX
SQL_UPDATE_USER_PASSWORD = r"UPDATE phpbb_users SET user_password = %s WHERE username = %s" SQL_UPDATE_USER_PASSWORD = r"UPDATE %susers SET user_password = %%s WHERE username = %%s" % TABLE_PREFIX
SQL_REMOVE_USER_GROUP = r"DELETE FROM phpbb_user_group WHERE user_id=%s AND group_id=%s " SQL_REMOVE_USER_GROUP = r"DELETE FROM %suser_group WHERE user_id=%%s AND group_id=%%s " % TABLE_PREFIX
SQL_GET_ALL_GROUPS = r"SELECT group_id, group_name FROM phpbb_groups" SQL_GET_ALL_GROUPS = r"SELECT group_id, group_name FROM %sgroups" % TABLE_PREFIX
SQL_GET_USER_GROUPS = r"SELECT phpbb_groups.group_name FROM phpbb_groups , phpbb_user_group WHERE " \ SQL_GET_USER_GROUPS = r"SELECT %(prefix)sgroups.group_name FROM %(prefix)sgroups , %(prefix)suser_group WHERE " \
r"phpbb_user_group.group_id = phpbb_groups.group_id AND user_id=%s" r"%(prefix)suser_group.group_id = %(prefix)sgroups.group_id AND user_id=%%s" % {'prefix': TABLE_PREFIX}
SQL_ADD_USER_AVATAR = r"UPDATE phpbb_users SET user_avatar_type=2, user_avatar_width=64, user_avatar_height=64, " \ SQL_ADD_USER_AVATAR = r"UPDATE %susers SET user_avatar_type=2, user_avatar_width=64, user_avatar_height=64, " \
"user_avatar=%s WHERE user_id = %s" "user_avatar=%%s WHERE user_id = %%s" % TABLE_PREFIX
SQL_CLEAR_USER_PERMISSIONS = r"UPDATE phpbb_users SET user_permissions = '' WHERE user_Id = %s" SQL_CLEAR_USER_PERMISSIONS = r"UPDATE %susers SET user_permissions = '' WHERE user_id = %%s" % TABLE_PREFIX
SQL_DEL_SESSION = r"DELETE FROM phpbb_sessions where session_user_id = %s" SQL_DEL_SESSION = r"DELETE FROM %ssessions where session_user_id = %%s" % TABLE_PREFIX
SQL_DEL_AUTOLOGIN = r"DELETE FROM phpbb_sessions_keys where user_id = %s" SQL_DEL_AUTOLOGIN = r"DELETE FROM %ssessions_keys where user_id = %%s" % TABLE_PREFIX
def __init__(self): def __init__(self):
pass pass

View File

@ -12,35 +12,38 @@ from django.conf import settings
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
TABLE_PREFIX = getattr(settings, 'SMF_TABLE_PREFIX', 'smf_')
class SmfManager: class SmfManager:
def __init__(self): def __init__(self):
pass pass
SQL_ADD_USER = r"INSERT INTO smf_members (member_name, passwd, email_address, date_registered, real_name," \ SQL_ADD_USER = r"INSERT INTO %smembers (member_name, passwd, email_address, date_registered, real_name," \
r" buddy_list, message_labels, openid_uri, signature, ignore_boards) " \ r" buddy_list, message_labels, openid_uri, signature, ignore_boards) " \
r"VALUES (%s, %s, %s, %s, %s, 0, 0, 0, 0, 0)" r"VALUES (%%s, %%s, %%s, %%s, %%s, 0, 0, 0, 0, 0)" % TABLE_PREFIX
SQL_DEL_USER = r"DELETE FROM smf_members where member_name = %s" SQL_DEL_USER = r"DELETE FROM %smembers where member_name = %%s" % TABLE_PREFIX
SQL_DIS_USER = r"UPDATE smf_members SET email_address = %s, passwd = %s WHERE member_name = %s" SQL_DIS_USER = r"UPDATE %smembers SET email_address = %%s, passwd = %%s WHERE member_name = %%s" % TABLE_PREFIX
SQL_USER_ID_FROM_USERNAME = r"SELECT id_member from smf_members WHERE member_name = %s" SQL_USER_ID_FROM_USERNAME = r"SELECT id_member from %smembers WHERE member_name = %%s" % TABLE_PREFIX
SQL_ADD_USER_GROUP = r"UPDATE smf_members SET additional_groups = %s WHERE id_member = %s" SQL_ADD_USER_GROUP = r"UPDATE %smembers SET additional_groups = %%s WHERE id_member = %%s" % TABLE_PREFIX
SQL_GET_GROUP_ID = r"SELECT id_group from smf_membergroups WHERE group_name = %s" SQL_GET_GROUP_ID = r"SELECT id_group from %smembergroups WHERE group_name = %%s" % TABLE_PREFIX
SQL_ADD_GROUP = r"INSERT INTO smf_membergroups (group_name,description) VALUES (%s,%s)" SQL_ADD_GROUP = r"INSERT INTO %smembergroups (group_name,description) VALUES (%%s,%%s)" % TABLE_PREFIX
SQL_UPDATE_USER_PASSWORD = r"UPDATE smf_members SET passwd = %s WHERE member_name = %s" SQL_UPDATE_USER_PASSWORD = r"UPDATE %smembers SET passwd = %%s WHERE member_name = %%s" % TABLE_PREFIX
SQL_REMOVE_USER_GROUP = r"UPDATE smf_members SET additional_groups = %s WHERE id_member = %s" SQL_REMOVE_USER_GROUP = r"UPDATE %smembers SET additional_groups = %%s WHERE id_member = %%s" % TABLE_PREFIX
SQL_GET_ALL_GROUPS = r"SELECT id_group, group_name FROM smf_membergroups" SQL_GET_ALL_GROUPS = r"SELECT id_group, group_name FROM %smembergroups" % TABLE_PREFIX
SQL_GET_USER_GROUPS = r"SELECT additional_groups FROM smf_members WHERE id_member = %s" SQL_GET_USER_GROUPS = r"SELECT additional_groups FROM %smembers WHERE id_member = %%s" % TABLE_PREFIX
SQL_ADD_USER_AVATAR = r"UPDATE smf_members SET avatar = %s WHERE id_member = %s" SQL_ADD_USER_AVATAR = r"UPDATE %smembers SET avatar = %%s WHERE id_member = %%s" % TABLE_PREFIX
@staticmethod @staticmethod
def _sanitize_groupname(name): def _sanitize_groupname(name):

View File

@ -115,6 +115,8 @@ Under Database Settings, set the following:
- Database Username is your auth MySQL user, usually `allianceserver` - Database Username is your auth MySQL user, usually `allianceserver`
- Database Password is this users password - Database Password is this users password
If you use a table prefix other than the standard `phpbb_` you need to add an additional setting to your auth project's settings file, `PHPBB3_TABLE_PREFIX = ''`, and enter the prefix.
You should see `Succesful Connection` and proceed. You should see `Succesful Connection` and proceed.
Enter administrator credentials on the next page. Enter administrator credentials on the next page.

View File

@ -104,4 +104,6 @@ Under Database Settings, set the following:
- Database Username is your auth MySQL user, usually `allianceserver` - Database Username is your auth MySQL user, usually `allianceserver`
- Database Password is this users password - Database Password is this users password
If you use a table prefix other than the standard `smf_` you need to add an additional setting to your auth project's settings file, `SMF_TABLE_PREFIX = ''`, and enter the prefix.
Follow the directions in the installer. Follow the directions in the installer.