# Copyright 1999-2017. Plesk International GmbH. All rights reserved.
""" Utility to strip sensitive user data from reports generated by collect utility """
import os
import sys
import re
from os.path import join, isdir, isfile, exists
from tempfile import mkstemp
from shutil import move

re_aes = r'(.*)\$AES\-\d+\-CBC\$[A-Za-z0-9\+\-\/=\$]+(.*)'
re_sha = r'(.*)\$5\$[A-Za-z0-9\+\-\/=\$\.]+(.*)'
re_passwords = r'(.*)\$(?:AES\-\d+\-CBC|5)\$[A-Za-z0-9\+\-\/=\$\.]+(.*)'
re_mysql_password = r'''(mysql.*?\s\-p)\S+(\s)'''
re_sysuser_password = r'''('System User Password',[^,]*,\s?')[^'\s]*(')'''
re_admin_data = r'''('admin_?address[',\s]+|email[',\s]+|fax[',\s]+|phone[',\s]+|pname[',\s]+).*(')'''

patterns = {
    "db/": (re_passwords, re_sysuser_password),
    "db/misc.sql": re_admin_data,
    "plesk/PMM/": re_passwords,
    "plesk/cp-server/admin/panel.log": re_mysql_password,
}

SUBST_PATTERN = r'\1*****\2'


def replace(file_path, regexps):
    fh, abs_path = mkstemp()
    with os.fdopen(fh, 'w') as new_file:
        with open(file_path) as old_file:
            for line in old_file:
                for regexp in regexps:
                    line = regexp.sub(SUBST_PATTERN, line)
                new_file.write(line)
    move(abs_path, file_path)


def prepare_matcher(regexps):
    if isinstance(regexps, basestring):
        regexps = (regexps,)
    return [re.compile(pat) for pat in regexps]


def sanitize_files():
    for path in patterns:
        regs = prepare_matcher(patterns[path])
        if isfile(path):
            replace(path, regs)
        elif isdir(path):
            for root, dirs, files in os.walk(path):
                for fil in files:
                    replace(join(root, fil), regs)
        elif exists(path):
            sys.stderr.write("Unexpected file type: %s. Skip it." % path)


def main():
    os.chdir(sys.argv[1])
    sanitize_files()

if __name__ == "__main__":
    main()
