# !/bin/bash
# iSetup by Wynd - 3.1 script
# ===========================================
# Terms of Use
# ===========================================
#
# 1. Redistribution of a modified version
# of iSetup is ALLOWED. This means, you can
# change, sell, or use iSetup in another
# program.
#
# ===========================================
# End of Agreement
# ===========================================
#

# === Root Check ===
if [ "$(id -u)" != "0" ]; then
	echo "Please run this as root"
	exit 0
fi

# === Uh-oh, no arguments ===
if [ "$1" = "" ]; then
	echo "No help here, look at the source code."
	exit 0
fi

# === Folder Checks ===
if [ ! -d /var/mobile/Library/Wynd ]; then
	mkdir /var/mobile/Library/Wynd
	chmod 0777 /var/mobile/Library/Wynd
fi

if [ ! -d /var/mobile/Library/Wynd/iSetup ]; then
	mkdir /var/mobile/Library/Wynd/iSetup
	chmod 0777 /var/mobile/Library/Wynd/iSetup
fi


# === Setup ===
if [ "$1" == "-s" ]; then
	name="$2"
	dir="/var/mobile/Library/Wynd/iSetup/${name}/"
	bakdir="/var/mobile/Library/Wynd/iSetup/BackSetup"

	# === Hmm, missing a setup? ===
	if [ ! -d "$dir" ]; then
		echo "Setup not found"
		exit 0
	fi
	
	# === Revert back to the BackSetup ===
	if [ -d /var/mobile/Library/Wynd/iSetup/BackSetup ]; then
		isetup -r
	fi

	# === Cydia is not fun, dpkg lock is not your friend ===
	killall Cydia_

	# === This should be guarentee, if check /might/ be useless ===
	if [ ! -d $bakdir ]; then
		mkdir $bakdir
		chmod 0777 $bakdir
	fi

	# === Swaps user settings ===
	if [ -d "${dir}Preferences" ]; then
		prefdir="${dir}Preferences"
		usrprefdir="/var/mobile/Library/Preferences"
		bakdirp="${bakdir}/Preferences"

		# === really, really, really lame. don't try this at home ===
		rm -rf ${prefdir}/.GlobalPreferences.plist
		
		# === Again, if check might be useless ===
		if [ ! -d $bakdirp ]; then
			mkdir $bakdirp
			chmod 0777 $bakdirp
		fi

		for plist in $(find $prefdir -name '*.plist' -exec basename {} \;); do
		if [ -e "${prefdir}/$plist" ];then
		if [ -e "${usrprefdir}/$plist" ];then
			mv ${usrprefdir}/$plist ${bakdirp}/$plist
		fi
			cp -f ${prefdir}/$plist ${usrprefdir}/$plist
		fi
		done
	fi

	# === Virtually the same as above, I even kept the var names ===
	if [ -d "${dir}SpringBoard" ]; then
		prefdir="${dir}SpringBoard"
		usrprefdir="/var/mobile/Library/SpringBoard"
		bakdirp="${bakdir}/SpringBoard"
		if [ ! -d $bakdirp ]; then
			mkdir $bakdirp
			chmod 0777 $bakdirp
		fi
		for plist in $(find $prefdir -exec basename {} \;); do
		if [ -e "${prefdir}/$plist" ];then
		if [ -e "${usrprefdir}/$plist" ];then
			mv ${usrprefdir}/$plist ${bakdirp}/$plist
		fi
			cp -f ${prefdir}/$plist ${usrprefdir}/$plist
			chmod 777 ${usrprefdir}/$plist
		fi
		done
	fi

	# === Swaps webclips ===
	if [ -d "${dir}WebClips" ]; then
		mv /var/mobile/Library/WebClips $bakdir
		cp -r ${dir}WebClips /var/mobile/Library/
		chmod 777 /var/mobile/Library/WebClips && chown mobile /var/mobile/Library/WebClips
	fi

	# === Swaps Hidden files ===
	if [ -e "${dir}LibHide/hidden.plist" ]; then
		mv /var/mobile/Library/LibHide/hidden.plist $bakdir
		cp -r ${dir}LibHide/hidden.plist /var/mobile/Library/LibHide/

		# === Auto-hide app store apps, uncomment if needed ===
#		for App in $(find /var/mobile/Applications -maxdepth 3 -type f -name Info.plist); do
#		Appname="$(plutil -key CFBundleIdentifier "$App" 2>&1)"
#		plutil -Hidden -arrayadd -string "$Appname" /var/mobile/Library/LibHide/hidden.plist
#		plutil -items -arrayadd -string "$Appname" /var/mobile/Library/Preferences/com.bigboss.categories.IOS-Games-Action.plist
#		done
	fi

	# === Auto-hide iPhone apps, uncomment if needed ===
#	for bundle in com.apple.mobilephone com.apple.MobileSMS com.apple.mobileslideshow-Camera; do
#		plutil -Hidden -arrayadd -string "$bundle" /var/mobile/Library/LibHide/hidden.plist
#	done

	# === Clear SB cache, I believe this is only useful for 3.x ===
	rm -rf /var/mobile/Library/Caches/SpringBoardIconCache
	rm -rf /var/mobile/Library/Caches/com.apple.IconsCache

	# === Installexec, generally used for MSCheck ===
	if [ -e "${dir}instexec" ]; then
		chmod 0777 ${dir}instexec
		${dir}instexec
	fi

	# === 4.x crap, otherwise icons won't change ===
	killall lsd
fi


# === Remove, no comments for this one ===
if [ "$1" == "-r" ]; then
	name="$2"
	bakdir="/var/mobile/Library/Wynd/iSetup/BackSetup"
	if [ ! -d "$bakdir" ]; then
		echo "BackSetup not found"
		exit 0
	fi
	echo "Removing Setup"
	killall Cydia_
	bakdirp="/var/mobile/Library/Wynd/iSetup/BackSetup/Preferences"
	if [ -d "$bakdirp" ]; then
		usrprefdir="/var/mobile/Library/Preferences"
		chmod 777 ${bakdirp}/*
		for plist in $(find $bakdirp -name '*.plist' -exec basename {} \;); do
		if [ -e ${bakdirp}/$plist ];then
		if [ -e "${usrprefdir}/$plist" ];then
			rm -rf ${usrprefdir}/$plist
		fi
			mv -f "${bakdirp}/$plist" "${usrprefdir}/$plist"
		fi
		done
	fi
	bakdirp="/var/mobile/Library/Wynd/iSetup/BackSetup/SpringBoard"
	if [ -d "$bakdirp" ]; then
		usrprefdir="/var/mobile/Library/SpringBoard"
		for plist in $(find $bakdirp -exec basename {} \;); do
		if [ -e ${bakdirp}/$plist ];then
		if [ -e "${usrprefdir}/$plist" ];then
			rm -rf ${usrprefdir}/$plist
		fi
			mv -f "${bakdirp}/$plist" "${usrprefdir}/$plist"
		fi
		done
	fi
	if [ -d "${bakdir}/WebClips" ]; then
		rm -rf /var/mobile/Library/WebClips
		cp -r "${bakdir}/WebClips" /var/mobile/Library/
		chmod 777 /var/mobile/Library/WebClips && chown mobile /var/mobile/Library/WebClips
	fi
	if [ -e "${bakdir}/hidden.plist" ]; then
		rm -rf /var/mobile/Library/LibHide/hidden.plist
		cp -r "${bakdir}/hidden.plist" /var/mobile/Library/LibHide/
	fi
	if [ -e "${bakdir}/rmexec" ]; then
		chmod 0777 ${bakdir}/rmexec
		${bakdir}/rmexec
	fi
	rm -rf /var/mobile/Library/Caches/SpringBoardIconCache
	rm -rf /var/mobile/Library/Caches/com.apple.IconsCache
	if [ ! -d /var/mobile/Library/Wynd/iSetup/Archives ]; then
		mkdir /var/mobile/Library/Wynd/iSetup/Archives
		chmod 0777 /var/mobile/Library/Wynd/iSetup/Archives
	fi
	bakarchive=BackSetup
	mkdir "/var/mobile/Library/Wynd/iSetup/Archives/${bakarchives}`date`"
	mv -f $bakdir "/var/mobile/Library/Wynd/iSetup/Archives/${bakarchives}`date`"
	killall lsd
fi

if [ "$1" == "-c" ]; then
	name="$2"
	dir="/var/mobile/Library/Wynd/iSetup/${name}/"
	if [ -d $dir ]; then
		echo "setup exists"
		# === Not sure why this is still here ===
		openURL backboardbeta://Setup_Exists
		exit 0
	fi

	# === This is very, very, very important ===
	if [ -e /Applications/BackBoard.app/${name}.png]; then
		# === say hello ===
		echo "hi"
	else
		ln -s /Applications/BackBoard.app/Default-Preview.png /Applications/BackBoard.app/${name}.png
	fi

	mkdir $dir
	chmod 777 /User/Library/Preferences/*
	cp -r /User/Library/Preferences $dir
	if [ -d /User/Library/SpringBoard ]; then
		cp -r /User/Library/SpringBoard $dir
		chmod 666 ${dir}SpringBoard/*
	fi
	cp -r /User/Library/WebClips $dir
	if [ -e /User/Library/LibHide/hidden.plist ]; then
		cp -r /User/Library/LibHide $dir
		chmod 666 ${dir}Libhide/*
		chmod 777 /var/mobile/Library/WebClips && chown mobile /var/mobile/Library/WebClips
	fi
	chmod 777 ${dir}Preferences/*
	if [ -e ${dir}WebClips/* ]; then 
		chmod 777 ${dir}WebClips/*
	fi
	echo "# !/bin/bash" >> ${dir}instexec
	installexec=${dir}instexec
	for dylib in $(find /Library/MobileSubstrate/DynamicLibraries/ -name '*.dylib' -exec basename {} \;); do
		echo "mscheck -c $dylib" >> ${dir}instexec
	done
	for disabled in $(find /Library/MobileSubstrate/DynamicLibraries/ -name '*.disabled' -exec basename {} \;); do
		echo "mscheck ! $disabled" >> ${dir}instexec
	done

	# === I'm sure there's a better way, quite possible even a replaceAll method. Who knows ===
	sed s/".dylib"/""/ $installexec >${installexec}1
	mv ${installexec}1 ${installexec}
	sed s/".disabled"/" "/ $installexec >${installexec}1
	mv ${installexec}1 ${installexec}

	echo "echo '# !/bin/bash' > /var/mobile/Library/Wynd/iSetup/BackSetup/rmexec" >> $installexec
	echo "echo 'mscheck -r' >> /var/mobile/Library/Wynd/iSetup/BackSetup/rmexec" >> $installexec
	plutil -Themes -arrayadd -string "$name" /Applications/BackBoard.app/Themes.plist
fi


# === Deletion ===
if [ "$1" == "-d" ]; then
	name="$2"
	dir="/var/mobile/Library/Wynd/iSetup/${name}/"
	rm -rf $dir

	# === Leaves empty gaps in the plist. plutil does fix it though. ===
	sed s/"<string>${name}<\/string>"/""/ /Applications/BackBoard.app/Themes.plist >> /Applications/BackBoard.app/Themes.plist1
	rm -rf /Applications/BackBoard.app/Themes.plist
	mv /Applications/BackBoard.app/Themes.plist1 /Applications/BackBoard.app/Themes.plist
fi

# === Update ===
if [ "$1" == "-u" ]; then
	
	# === No need to write anything new, this gets the job done ===
	name="$2"
	isetup -d $name
	isetup -c $name
fi

# === Add/Download ===
if [ "$1" == "-a" ]; then

	# === Downlaods and executes code as root ===
	# === Hopefully this isn't abused ===
	url=$2
	rm -rf /tmp/backboardtheme
	rm -rf /tmp/bbt
	wget -O /tmp/backboardtheme $url
	unzip /tmp/backboardtheme -d /tmp/bbt/
	if [ -e /tmp/bbt/installexec ]; then
		chmod 755 /tmp/bbt/installexec
		/tmp/bbt/installexec
	else
		
		# === echo is pretty useful ===
		echo "<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>output</key>
	<string>Unable to download or extract.</string>
</dict>
</plist>
" > /private/var/stash/Applications.pwn/BackBoard.app/temp.plist
		rm -rf /tmp/backboardtheme
		rm -rf /tmp/bbt
	fi
fi