I want to share it with you.
It migrates usernames with md5 hash passwords (nonsalted), paths/folders with aliases and their permissions. Simple.
Use at your own risk.
update: added permission migration
update2: some beauty fixes and undefined user group
Code: Select all
import os
users_ini_path = "somewhere\\over_the_rainbow\\users"
output_text = " "
raw_files = os.listdir(users_ini_path)
for raw_file in raw_files:
user_name = raw_file.replace(".ini", "")
raw_acl = []
passwd = ""
user_conf = ""
perm_conf = ""
user_conf_end = ""
file_data = open(users_ini_path + "\\" + raw_file, "r")
for line in file_data:
if "AccessList" in line:
raw_acl.append(line)
if "Password=MD5:" in line:
passwd = line.replace("Password=MD5:", "")
passwd = passwd.lower()
user_conf += """<User Name=""" + "\"" + user_name + """">
<Option Name="Pass">""" + passwd.rstrip() + """</Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">2</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">2</Option>
<Option Name="Comments"></Option>
<Option Name="ForceSsl">2</Option>
<Option Name="8plus3">0</Option>
<IpFilter>
<Disallowed />
<Allowed />
</IpFilter>
<Permissions>"""
for acl_item in raw_acl:
acl_item_part1 = acl_item.split("=")
acl_item_part2 = acl_item_part1[1].split(",")
alias = acl_item_part2[0]
path = acl_item_part2[1]
file_perm_bits = list(acl_item_part2[2])
dir_perm_bits = list(acl_item_part2[3])
perm_conf += """
<Permission Dir=""" + "\"" + path + "\"" + """>"""
if alias != "/":
perm_conf += """
<Aliases>
<Alias>""" + alias + """</Alias>
</Aliases>"""
perm_conf += """
<Option Name="FileRead">""" + str([0,1][file_perm_bits[0] != "-"]) + """</Option>
<Option Name="FileWrite">""" + str([0,1][file_perm_bits[1] != "-"]) + """</Option>
<Option Name="FileDelete">""" + str([0,1][file_perm_bits[2] != "-"]) + """</Option>
<Option Name="FileAppend">""" + str([0,1][file_perm_bits[3] != "-"]) + """</Option>
<Option Name="DirCreate">""" + str([0,1][dir_perm_bits[2] != "-"]) + """</Option>
<Option Name="DirDelete">""" + str([0,1][dir_perm_bits[3] != "-"]) + """</Option>
<Option Name="DirList">""" + str([0,1][dir_perm_bits[0] != "-"]) + """</Option>
<Option Name="DirSubdirs">""" + str([0,1][dir_perm_bits[1] != "-"]) + """</Option>
<Option Name="IsHome">""" + str([0,1][alias == "/"]) + """</Option>
<Option Name="AutoCreate">0</Option>
</Permission>"""
user_conf_end = """
</Permissions>
<SpeedLimits DlType="0" DlLimit="10" ServerDlLimitBypass="2" UlType="0" UlLimit="10" ServerUlLimitBypass="2">
<Download />
<Upload />
</SpeedLimits>
</User>
"""
output_text += user_conf + perm_conf + user_conf_end
conf_file = open("users.xml", "w")
conf_file.write(output_text)