'################################################################################
'# NAME: migrate_signature_and_alias.vbs					#
'#										#
'# This script will convert IPSwitch IMail 2006.x (or higher) aliases and	#
'# webmail signature files to Alt-N MDaemon 11.x				#
'# The script loops through all the domains in the IMail computer's registry	#
'# and then it loops through all the aliases of each domain.			#
'# It creates an Alias.TXT file which you can paste to the			#
'# \MDaemon\App\Alias.DAT file and mailing list files (group aliases) which	#
'# should be copied to the \MDaemon\App\ directory.				#
'# It also loops through all user directories to look for a signature and copies#
'# it to the MDaemons User's directory, in the WorldClient (WC) folder.		#
'#										#
'# Author: Roel Broersma	Date: 25 july 2011		Version: 1.1	#
'# Company: Gigaweb B.V.	E-Mail: roel@gigaweb.nl				#
'################################################################################

Option Explicit

Dim migrate_aliases, migrate_signatures, postmaster_alias_for_domains, postmaster_destination, imail_registry_domain_path, imail_domains_folder, imail_domain_filter, mdaemon_users_folder, mdaemon_maillist_folder, mdaemon_alias_dat_file
Dim domain, domain_topdir, alias, alias_destination, ALIASFILE, user, file, logfile
Dim obj_stdout, obj_filesys, obj_reg, domain_folder_obj, user_folder_obj, alias_file_obj
Dim array_domains(), array_aliases()

const HKEY_LOCAL_MACHINE	= &H80000002

migrate_aliases			= True				'##SET TO TRUE TO MIGRATE IMAIL ALIASES TO MDAEMON ALIASES AND MAILINGLISTS.##
migrate_signatures		= True				'##SET TO TRUE TO MIGRATE THE WEBMAIL SIGNATURES TO WORLDCLIENT SIGNATURES.##
postmaster_alias_for_domains	= True				'##SET TO TRUE TO ADD A POSTMASTER@ ALIAS FOR EVERY DOMAIN (SAME AS A NOBODY ALIAS IN IMAIL).##
postmaster_destination		= "info"			'##SET DESTINATION FOR POSTMASTER@ ALIAS OF DOMAIN.##
imail_registry_domain_path	= "SOFTWARE\Wow6432Node\Ipswitch\IMail\Domains"
imail_domains_folder		= "E:\messaging\IMail\Domains\"	'##ENUMERATE THIS DIRECTORY.##
imail_domain_filter		= ""				'##SET A FILTER FOR THE DOMAIN ENUMERATION, IN CASE YOU ONLY WANT TO MIGRATE 1 DOMAIN: "mydomain.com" OR IF YOU WANT TO MIGRATE ONLY ALL ".nl" DOMAINS, ETC.##
mdaemon_users_folder		= "E:\MDaemon\Users\"		'##USED TO WRITE THE SIGNATURE FILES, YOU DON'T HAVE TO INSTALL MDAEMON, JUST CREATE THIS DIRECTORY. YOU CAN LATER COPY THIS DIRECTORY OVER THE MDAEMON DIRECTORY.##
mdaemon_maillist_folder		= "E:\MDaemon\App\"		'##USED TO WRITE THE MAILING LIST FILES, YOU DON'T HAVE TO INSTALL MDAEMON, JUST CREATE THIS DIRECTORY. YOU CAN LATER COPY THIS DIRECTORY OVER THE MDAEMON DIRECTORY.##
mdaemon_alias_dat_file		= "E:\Alias.txt"		'##RECOMMENDED TO USE A TEMP FILE AND MANUALLY COPY THE CONTENT TO THE E:\MDaemon\App\Alias.dat FILE.##

Set obj_stdout			= WScript.StdOut
Set obj_filesys			= CreateObject ("Scripting.FileSystemObject")
Set obj_reg			= GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

logfile = "Starting migration..." &vbNewLine

'###Loop through all the domains.###

obj_reg.EnumKey HKEY_LOCAL_MACHINE, imail_registry_domain_path, array_domains

For Each domain In array_domains

	obj_reg.GetStringValue HKEY_LOCAL_MACHINE,imail_registry_domain_path&"\"&domain, "TopDir", domain_topdir
	If ( Left(LCase(domain),8)<>"$virtual" AND IsNull(domain_topdir)=False ) Then

		'###Filter the domain directory if needed.###
		If Instr(LCase(domain),LCase(imail_domain_filter))>0 Then
			logfile = logfile & vbNewLine & "=====================================" & vbNewLine & "Migrating for domain: " & domain & vbNewLine & "=====================================" & vbNewLine

			If (migrate_aliases=True) Then
				'###Loop through all aliases of the domain as found in the registry.###
				obj_reg.EnumValues HKEY_LOCAL_MACHINE, imail_registry_domain_path&"\"&domain&"\Users\_aliases", array_aliases
				For Each alias In array_aliases
					obj_reg.GetStringValue HKEY_LOCAL_MACHINE,imail_registry_domain_path&"\"&domain&"\Users\_aliases", alias, alias_destination
					If ( LCase(alias)="postmaster" OR LCase(alias)="nobody") Then
						logfile = logfile & alias& " alias found, do not migrate. We add a postmaster alias later anyway." &vbNewLine
					ElseIf ( Left(LCase(alias),6)="owner-" OR Right(LCase(alias),6)="-owner" OR Left(LCase(alias_destination),11)="| imailsrv " ) Then
						logfile = logfile & alias& " Mailinglist found. Mailinglists will not be migrated!" &vbNewLine
					Else
						If Instr(alias_destination, ",")>0 Then
							logfile = logfile & "Group alias found, migrating to mailinglist: " & alias & "@" & domain &vbNewLine
							Call create_mailinglist (alias &"@" &domain, alias_destination)
						Else
							logfile = logfile & "Migrating alias: " &alias &" - " &alias_destination &vbNewLine
							ALIASFILE = ALIASFILE & alias &"@" &domain & " = " &alias_destination &vbNewLine
						End If
					End If
				Next
			End If

			If (postmaster_alias_for_domains) Then
				ALIASFILE = ALIASFILE & "postmaster@" &domain & " = " &postmaster_destination &"@" &domain &vbNewLine
				logfile = logfile & alias& "Postmaster alias added to domain to: " &postmaster_destination &"@" &domain &vbNewLine
			End If

			'###Loop through all the users in the domain (based on Directories because users can exist in registry or ODBC but are always on disk).###
			Set domain_folder_obj	= obj_filesys.GetFolder(domain_topdir&"\Users")
			For Each user In domain_folder_obj.SubFolders

				logfile = logfile & "Migrating signature of: " &user.name &"@" &domain &vbNewLine

				'###Loop through all files in the users directory.###
				Set user_folder_obj	= obj_filesys.GetFolder(user.path)
				For Each file In user_folder_obj.Files

					'###Do only for signature files###
					If (file.Name="signature.txt" AND migrate_signatures=True) Then
						If (obj_filesys.FolderExists(mdaemon_users_folder & domain)=False) Then
							obj_filesys.CreateFolder mdaemon_users_folder & domain
						End If
						If (obj_filesys.FolderExists(mdaemon_users_folder & domain & "\" & user.name)=False) Then
							obj_filesys.CreateFolder mdaemon_users_folder & domain & "\" & user.name
						End If
						If (obj_filesys.FolderExists(mdaemon_users_folder & domain & "\" & user.name & "\WC")=False) Then
							obj_filesys.CreateFolder mdaemon_users_folder & domain & "\" & user.name & "\WC"
						End If
						obj_filesys.CopyFile file.Path, mdaemon_users_folder & domain & "\" & user.name & "\WC\signature.txt"
						logfile = logfile & Chr(9) & "Copied: " & file.Path & " to " & mdaemon_users_folder & domain & "\" & user.name & "\WC\signature.txt" &vbNewLine
					End If
				Next
				Set user_folder_obj = Nothing
			Next
			Set domain_folder_obj = Nothing

		End If
	End If
Next


Set alias_file_obj = obj_filesys.CreateTextFile(mdaemon_alias_dat_file,True)
alias_file_obj.write ALIASFILE
Set alias_file_obj = Nothing

obj_stdout.Write logfile

Set obj_reg		= Nothing
Set obj_filesys		= Nothing
Set obj_stdout		= Nothing


Sub create_mailinglist (name, distribution_list)
	Dim obj_filesystem, obj_filetext, destination_address

	Set obj_filesystem = CreateObject ("Scripting.FileSystemObject")

	Set obj_filetext = obj_filesystem.CreateTextFile(mdaemon_maillist_folder & name & ".grp", True)

	obj_filetext.WriteLine "# Mailing List file"
	obj_filetext.WriteLine "#"
	obj_filetext.WriteLine "; ListName = " &name
	obj_filetext.WriteLine "; Private = N"
	obj_filetext.WriteLine "; HideFromAddressBook = N"
	obj_filetext.WriteLine "; AllowExpn = N"
	obj_filetext.WriteLine "; ListNameInSubject = N"
	obj_filetext.WriteLine "; ThreadNumbersInSubject = N"
	obj_filetext.WriteLine "; UseMemberNames = N"
	obj_filetext.WriteLine "; UseListName = N"
	obj_filetext.WriteLine "; UseStandardName = Y"
	obj_filetext.WriteLine "; InsertCaption = N"
	obj_filetext.WriteLine "; CrackMessage = Y"
	obj_filetext.WriteLine "; ForceUniqueID = Y"
	obj_filetext.WriteLine "; IgnoreRcptErrors = Y"
	obj_filetext.WriteLine "; SubscribeNote = N"
	obj_filetext.WriteLine "; UnsubscribeNote = N"
	obj_filetext.WriteLine "; MsgTooBigNote = N"
	obj_filetext.WriteLine "; InformNonMember = N"
	obj_filetext.WriteLine "; SendStatusMessages = N"
	obj_filetext.WriteLine "; Moderated = N"
	obj_filetext.WriteLine "; PasswordPost = N"
	obj_filetext.WriteLine "; Subscribe = N"
	obj_filetext.WriteLine "; AuthSubscribe = Y"
	obj_filetext.WriteLine "; AuthAutoSubscribe = Y"
	obj_filetext.WriteLine "; Unsubscribe = N"
	obj_filetext.WriteLine "; AuthUnsubscribe = Y"
	obj_filetext.WriteLine "; AuthAutoUnsubscribe = N"
	obj_filetext.WriteLine "; AutoPrune = N"
	obj_filetext.WriteLine "; EnableDigest = N"
	obj_filetext.WriteLine "; ForceDigestUse = N"
	obj_filetext.WriteLine "; ArchiveDigest = N"
	obj_filetext.WriteLine "; Nine = N"
	obj_filetext.WriteLine "; Twelve = N"
	obj_filetext.WriteLine "; Three = N"
	obj_filetext.WriteLine "; Six = N"
	obj_filetext.WriteLine "; AM = N"
	obj_filetext.WriteLine "; PM = N"
	obj_filetext.WriteLine "; DigestMBF = DIGEST"
	obj_filetext.WriteLine "; Notifications-To = [trash]"
	obj_filetext.WriteLine "; RoutingLimit = 0"
	obj_filetext.WriteLine "; MaxMessageSize = 0"
	obj_filetext.WriteLine "; PrecedenceLevel = 80"
	obj_filetext.WriteLine "; MaxMembers = 0"
	obj_filetext.WriteLine "; MaxMessageCount = 0"
	obj_filetext.WriteLine "; MaxLineCount = 0"
	obj_filetext.WriteLine "; ODBCDSN = "
	obj_filetext.WriteLine "; ODBCUser = "
	obj_filetext.WriteLine "; ODBCPass = "
	obj_filetext.WriteLine "; ODBCTable = "
	obj_filetext.WriteLine "; ODBCEmailFieldMapping = "
	obj_filetext.WriteLine "; ODBCFirstNameFieldMapping = "
	obj_filetext.WriteLine "; ODBCLastNameFieldMapping = "
	obj_filetext.WriteLine "; ODBCReadOnlyQuery = "
	obj_filetext.WriteLine "; ODBCPostOnlyQuery = "
	obj_filetext.WriteLine "; ODBCNormalQuery = "
	obj_filetext.WriteLine "; ODBCDigestQuery = "
	obj_filetext.WriteLine "; ADBASEDN = "
	obj_filetext.WriteLine "; ADSEARCHFILTER = (&(objectClass=user)(objectCategory=person))"
	obj_filetext.WriteLine "; ADATTRIBUTE = mail"
	obj_filetext.WriteLine "; ADUSERNAME = "
	obj_filetext.WriteLine "; ADBINDFLAGS = 1"
	obj_filetext.WriteLine "; ADSEARCHSCOPE = 2"
	obj_filetext.WriteLine "; ADPAGESIZE = 1000"
	obj_filetext.WriteLine "; ADPASSWORD = "
	obj_filetext.WriteLine "; DefaultMode = Normal"
	obj_filetext.WriteLine ""

	For Each destination_address In Split(Trim(distribution_list),",")
		obj_filetext.WriteLine (Trim(destination_address))
	Next

	Set obj_filetext = Nothing
	Set obj_filesystem = Nothing
End Sub