MagiskHidePropsConf/common/util_functions.sh
Didgeridoohan d3a5b6c800
v2.1.4
2018-04-29 11:14:35 +02:00

755 lines
19 KiB
Bash

#!/system/bin/sh
# MagiskHide Props Config
# By Didgeridoohan @ XDA Developers
# Variables
MODVERSION=VER_PLACEHOLDER
POSTFILE=$IMGPATH/.core/post-fs-data.d/propsconf_post
LATEFILE=$IMGPATH/.core/service.d/propsconf_late
CACHELOC=CACHE_PLACEHOLDER
RUNFILE=$MODPATH/script_check
LOGFILE=$CACHELOC/propsconf.log
LASTLOGFILE=$CACHELOC/propsconf_last.log
CONFFILE=$CACHELOC/propsconf_conf
RESETFILE=$CACHELOC/reset_mhpc
MAGISKLOC=/data/adb/magisk
BBPATH=$MAGISKLOC/busybox
PRINTSLOC=$MODPATH/prints.sh
PRINTSTMP=$CACHELOC/prints.sh
PRINTSWWW="https://raw.githubusercontent.com/Magisk-Modules-Repo/MagiskHide-Props-Config/master/common/prints.sh"
BIN=BIN_PLACEHOLDER
USNFLIST=USNF_PLACEHOLDER
alias cat="$BBPATH cat"
alias grep="$BBPATH grep"
alias printf="$BBPATH printf"
alias resetprop="$MAGISKLOC/magisk resetprop"
alias sed="$BBPATH sed"
alias sort="$BBPATH sort"
alias tr="$BBPATH tr"
alias wget="$BBPATH wget"
# MagiskHide props
PROPSLIST="
ro.debuggable
ro.secure
ro.build.type
ro.build.tags
ro.build.selinux
"
# Safe values
SAFELIST="
ro.debuggable=0
ro.secure=1
ro.build.type=user
ro.build.tags=release-keys
ro.build.selinux=0
"
# Print props
PRINTPROPS="
ro.build.fingerprint
ro.bootimage.build.fingerprint
ro.vendor.build.fingerprint
"
# Finding file values
get_file_value() {
cat $1 | grep $2 | sed "s@.*${2}@@" | sed 's@\"@@g'
}
# Logs
# Saves the previous log (if available) and creates a new one
log_start() {
if [ -f "$LOGFILE" ]; then
mv -f $LOGFILE $LASTLOGFILE
fi
touch $LOGFILE
echo "***************************************************" >> $LOGFILE
echo "******** MagiskHide Props Config $MODVERSION ********" >> $LOGFILE
echo "**************** By Didgeridoohan ***************" >> $LOGFILE
echo "***************************************************" >> $LOGFILE
log_script_chk "Log start."
}
log_handler() {
echo "" >> $LOGFILE
echo -e "$(date +"%m-%d-%Y %H:%M:%S") - $1" >> $LOGFILE
}
log_print() {
echo "$1"
log_handler "$1"
}
log_script_chk() {
log_handler "$1"
echo -e "$(date +"%m-%d-%Y %H:%M:%S") - $1" >> $RUNFILE
}
#Divider
DIVIDER="${Y}=====================================${N}"
# Header
menu_header() {
if [ -z "$LOGNAME" ]; then
clear
fi
if [ "$MODVERSION" == "VER_PLACEHOLDER" ]; then
VERSIONTXT=""
else
VERSIONTXT=$MODVERSION
fi
echo ""
echo "${W}MagiskHide Props Config $VERSIONTXT${N}"
echo "${W}by Didgeridoohan @ XDA Developers${N}"
echo ""
echo $DIVIDER
echo -e " $1"
echo $DIVIDER
}
# Find prop type
get_prop_type() {
echo $1 | sed 's@.*\.@@'
}
# Get left side of =
get_eq_left() {
echo $1 | sed 's@=.*@@'
}
# Get right side of =
get_eq_right() {
echo $1 | sed 's@.*=@@'
}
# Get first word in string
get_first() {
case $1 in
*\ *) echo $1 | sed 's@\ .*@@'
;;
*=*) get_eq_left $1
;;
esac
}
# Replace file values
replace_fn() {
sed -i "s@${1}=${2}@${1}=${3}@" $4
}
# Updates placeholders
placeholder_update() {
FILEVALUE=$(get_file_value $1 "$2=")
log_handler "Checking for ${3} in ${1}. Current value is ${FILEVALUE}."
case $FILEVALUE in
*PLACEHOLDER*) replace_fn $2 $3 $4 $1
log_handler "Placeholder ${3} updated to ${4} in ${1}."
;;
esac
}
orig_check() {
PROPSTMPLIST=$PROPSLIST"
ro.build.fingerprint
"
ORIGLOAD=0
for PROPTYPE in $PROPSTMPLIST; do
PROP=$(get_prop_type $PROPTYPE)
ORIGPROP=$(echo "FILE${PROP}" | tr '[:lower:]' '[:upper:]')
ORIGVALUE=$(get_file_value $LATEFILE "${ORIGPROP}=")
if [ "$ORIGVALUE" ]; then
ORIGLOAD=1
fi
done
}
script_ran_check() {
POSTCHECK=0
if [ "$(cat $RUNFILE | grep "post-fs-data.sh finished")" ]; then
POSTCHECK=1
fi
LATECHECK=0
if [ "$(cat $RUNFILE | grep "Boot script finished")" ]; then
LATECHECK=1
fi
}
# Currently set values
curr_values() {
CURRDEBUGGABLE=$(resetprop ro.debuggable)
CURRSECURE=$(resetprop ro.secure)
CURRTYPE=$(resetprop ro.build.type)
CURRTAGS=$(resetprop ro.build.tags)
CURRSELINUX=$(resetprop ro.build.selinux)
CURRFINGERPRINT=$(resetprop ro.build.fingerprint)
if [ -z "$CURRFINGERPRINT" ]; then
CURRFINGERPRINT=$(resetprop ro.bootimage.build.fingerprint)
if [ -z "$CURRFINGERPRINT" ]; then
CURRFINGERPRINT=$(resetprop ro.vendor.build.fingerprint)
fi
fi
}
# Prop file values
file_values() {
FILEDEBUGGABLE=$(resetprop ro.debuggable)
FILESECURE=$(resetprop ro.secure)
FILETYPE=$(resetprop ro.build.type)
FILETAGS=$(resetprop ro.build.tags)
FILESELINUX=$(resetprop ro.build.selinux)
FILEFINGERPRINT=$(resetprop ro.build.fingerprint)
if [ -z "$FILEFINGERPRINT" ]; then
FILEFINGERPRINT=$(resetprop ro.bootimage.build.fingerprint)
if [ -z "$FILEFINGERPRINT" ]; then
FILEFINGERPRINT=$(resetprop ro.vendor.build.fingerprint)
fi
fi
}
# Latefile values
latefile_values() {
LATEFILEDEBUGGABLE=$(get_file_value $LATEFILE "FILEDEBUGGABLE=")
LATEFILESECURE=$(get_file_value $LATEFILE "FILESECURE=")
LATEFILETYPE=$(get_file_value $LATEFILE "FILETYPE=")
LATEFILETAGS=$(get_file_value $LATEFILE "FILETAGS=")
LATEFILESELINUX=$(get_file_value $LATEFILE "FILESELINUX=")
LATEFILEFINGERPRINT=$(get_file_value $LATEFILE "FILEFINGERPRINT=")
}
# Module values
module_values() {
MODULEDEBUGGABLE=$(get_file_value $LATEFILE "MODULEDEBUGGABLE=")
MODULESECURE=$(get_file_value $LATEFILE "MODULESECURE=")
MODULETYPE=$(get_file_value $LATEFILE "MODULETYPE=")
MODULETAGS=$(get_file_value $LATEFILE "MODULETAGS=")
MODULESELINUX=$(get_file_value $LATEFILE "MODULESELINUX=")
MODULEFINGERPRINT=$(get_file_value $LATEFILE "MODULEFINGERPRINT=")
CUSTOMPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=")
}
# Run all value functions
all_values() {
# Currently set values
curr_values
# Prop file values
file_values
# Latefile values
latefile_values
# Module values
module_values
}
after_change() {
# Update the reboot variable
reboot_chk
# Load all values
all_values
# Ask to reboot
reboot_fn "$1"
}
after_change_file() {
# Update the reboot variable
reboot_chk
# Load all values
INPUT=""
all_values
# Ask to reboot
reboot_fn "$1" "$2"
}
reboot_chk() {
replace_fn REBOOTCHK 0 1 $LATEFILE
}
reset_fn() {
BUILDPROPENB=$(get_file_value $LATEFILE "BUILDPROPENB=")
FINGERPRINTENB=$(get_file_value $LATEFILE "FINGERPRINTENB=")
cp -af $MODPATH/propsconf_late $LATEFILE
if [ "$BUILDPROPENB" ] && [ -z "$BUILDPROPENB" == 1 ]; then
replace_fn BUILDPROPENB 1 $BUILDPROPENB $LATEFILE
fi
if [ "$FINGERPRINTENB" ] && [ -z "$FINGERPRINTENB" == 1 ]; then
replace_fn FINGERPRINTENB 1 $FINGERPRINTENB $LATEFILE
fi
chmod 755 $LATEFILE
placeholder_update $LATEFILE IMGPATH IMG_PLACEHOLDER $IMGPATH
# Update the reboot variable
reboot_chk
# Update all prop value variables
all_values
}
# Check if original file values are safe
orig_safe() {
replace_fn FILESAFE 0 1 $LATEFILE
for V in $PROPSLIST; do
PROP=$(get_prop_type $V)
FILEPROP=$(echo "FILE${PROP}" | tr '[:lower:]' '[:upper:]')
FILEVALUE=$(eval "echo \$$FILEPROP")
log_handler "Checking $FILEPROP=$FILEVALUE"
safe_props $V $FILEVALUE
if [ "$SAFE" == 0 ]; then
log_handler "Prop $V set to triggering value in prop file."
replace_fn FILESAFE 1 0 $LATEFILE
else
log_handler "Prop $V set to \"safe\" value in prop file."
fi
done
}
# Checks for configuration file
config_file() {
log_handler "Checking for configuration file."
if [ -f "$CONFFILE" ]; then
log_handler "Configuration file detected."
# Loads custom variables
. $CONFFILE
# Updates prop values (including fingerprint)
PROPSTMPLIST=$PROPSLIST"
ro.build.fingerprint
"
for PROPTYPE in $PROPSTMPLIST; do
CONFPROP=$(echo "CONF$(get_prop_type $PROPTYPE)" | tr '[:lower:]' '[:upper:]')
TMPPROP=$(eval "echo \$$CONFPROP")
if [ "$TMPPROP" ]; then
log_handler "Checking $PROPTYPE settings."
if [ "$TMPPROP" != "preserve" ]; then
if [ "$PROPTYPE" == "ro.build.fingerprint" ]; then
if [ "$(get_file_value $LATEFILE "FINGERPRINTENB=")" == 1 ]; then
change_print "$PROPTYPE" "$TMPPROP" "file"
fi
else
change_prop "$PROPTYPE" "$TMPPROP" "file"
fi
fi
else
if [ "$PROPTYPE" == "ro.build.fingerprint" ]; then
if [ "$(get_file_value $LATEFILE "FINGERPRINTENB=")" == 1 ]; then
reset_print "$PROPTYPE" "file"
fi
else
reset_prop "$PROPTYPE" "file"
fi
fi
done
# Updates prop file editing
if [ "$(get_file_value $LATEFILE "FILESAFE=")" == 0 ]; then
if [ "$CONFPROPFILES" == "true" ]; then
edit_prop_files "file" "" " (configuration file)"
elif [ "$CONFPROPFILES" == "false" ]; then
reset_prop_files "file" "" " (configuration file)"
fi
fi
# Updates custom props
if [ "$PROPOPTION" != "preserve" ]; then
if [ "$CONFPROPS" ]; then
if [ "$PROPOPTION" == "add" ] || [ "$PROPOPTION" == "replace" ]; then
if [ "$PROPOPTION" == "replace" ]; then
reset_all_custprop "file"
fi
for ITEM in $CONFPROPS; do
set_custprop "$(get_eq_left $ITEM)" "$(get_eq_right $ITEM)" "file"
done
fi
else
reset_all_custprop "file"
fi
fi
# Updates options
OPTCCURR=$(get_file_value $LATEFILE "OPTIONCOLOUR=")
OPTWCURR=$(get_file_value $LATEFILE "OPTIONWEB=")
if [ "$CONFCOLOUR" == "enabled" ]; then
OPTCCHNG=1
else
OPTCCHNG=0
fi
replace_fn OPTIONCOLOUR $OPTCCURR $OPTCCHNG $LATEFILE
log_handler "Colour $CONFCOLOUR."
if [ "$CONFWEB" == "enabled" ]; then
OPTWCHNG=1
else
OPTWCHNG=0
fi
replace_fn OPTIONWEB $OPTWCURR $OPTWCHNG $LATEFILE
log_handler "Automatic fingerprints list update $CONFWEB."
# Deletes the configuration file
log_handler "Deleting configuration file."
rm -f $CONFFILE
else
log_handler "No configuration file."
fi
}
# ======================== Fingerprint functions ========================
# Checks and updates the prints list
download_prints() {
if [ -z "$LOGNAME" ]; then
clear
fi
menu_header "Updating fingerprints list"
echo ""
log_print "Checking list version."
wget -T 10 -O $PRINTSTMP $PRINTSWWW 2>> $LOGFILE
if [ -f "$PRINTSTMP" ]; then
LISTVERSION=$(get_file_value $PRINTSTMP "PRINTSV=")
if [ "$LISTVERSION" -gt "$(get_file_value $PRINTSLOC "PRINTSV=")" ]; then
if [ "$(get_file_value $PRINTSTMP "PRINTSTRANSF=")" -le "$(get_file_value $PRINTSLOC "PRINTSTRANSF=")" ]; then
mv -f $PRINTSTMP $PRINTSLOC
# Updates list version in module.prop
VERSIONTMP=$(get_file_value $MODPATH/module.prop "version=")
replace_fn version $VERSIONTMP "${MODVERSION}-v${LISTVERSION}" $MODPATH/module.prop
log_print "Updated list to v${LISTVERSION}."
else
rm -f $PRINTSTMP
log_print "New fingerprints list requires module update."
fi
else
rm -f $PRINTSTMP
log_print "Fingerprints list up-to-date."
fi
else
log_print "No connection."
fi
if [ "$1" == "manual" ]; then
sleep 2
else
sleep 0.5
fi
}
# Reset the module fingerprint change
reset_print() {
log_handler "Resetting device fingerprint to default system value."
SUBA=$(get_file_value $LATEFILE "MODULEFINGERPRINT=")
# Saves new module value
replace_fn MODULEFINGERPRINT "\"$SUBA\"" "\"\"" $LATEFILE
# Updates prop change variables in propsconf_late
replace_fn PRINTEDIT 1 0 $LATEFILE
# Updates improved hiding setting
if [ "$(get_file_value $LATEFILE "BUILDEDIT=")" ]; then
replace_fn SETFINGERPRINT "true" "false" $LATEFILE
fi
if [ "$2" != "file" ]; then
after_change "$1"
fi
}
# Use fingerprint
change_print() {
log_handler "Changing device fingerprint to $2."
SUBA=$(get_file_value $LATEFILE "MODULEFINGERPRINT=")
# Saves new module value
replace_fn MODULEFINGERPRINT "\"$SUBA\"" "\"$2\"" $LATEFILE
# Updates prop change variables in propsconf_late
replace_fn PRINTEDIT 0 1 $LATEFILE
# Updates improved hiding setting
if [ "$(get_file_value $LATEFILE "BUILDEDIT=")" ]; then
replace_fn SETFINGERPRINT "false" "true" $LATEFILE
fi
NEWFINGERPRINT=""
if [ "$3" != "file" ]; then
after_change "$1"
fi
}
# ======================== Props files functions ========================
# Reset prop files
reset_prop_files() {
log_handler "Resetting prop files$3."
# Changes files
for PROPTYPE in $PROPSLIST; do
log_handler "Disabling prop file editing for '$PROPTYPTE'."
PROP=$(get_prop_type $PROPTYPE)
SETPROP=$(echo "SET$PROP" | tr '[:lower:]' '[:upper:]')
replace_fn $SETPROP "true" "false" $LATEFILE
done
# Change fingerprint
replace_fn SETFINGERPRINT "true" "false" $LATEFILE
# Edit settings variables
replace_fn BUILDEDIT 1 0 $LATEFILE
replace_fn DEFAULTEDIT 1 0 $LATEFILE
if [ "$1" != "file" ]; then
after_change_file "$1" "$2"
fi
}
# Editing prop files
edit_prop_files() {
log_handler "Modifying prop files$3."
# Checks if editing prop files is enabled
if [ "$(get_file_value $LATEFILE "BUILDPROPENB=")" == 0 ]; then
log_handler "Editing build.prop is disabled. Only editing default.prop."
PROPSLIST="
ro.debuggable
ro.secure
"
else
# Checking if the device fingerprint is set by the module
if [ "$(get_file_value $LATEFILE "FINGERPRINTENB=")" == 1 ] && [ "$(get_file_value $LATEFILE "PRINTEDIT=")" == 1 ]; then
if [ "$(cat /system/build.prop | grep "$FILEFINGERPRINT")" ]; then
log_handler "Enabling prop file editing for device fingerprint."
replace_fn SETFINGERPRINT "false" "true" $LATEFILE
fi
fi
fi
for PROPTYPE in $PROPSLIST; do
log_handler "Checking original file value for '$PROPTYPE'."
PROP=$(get_prop_type $PROPTYPE)
FILEPROP=$(echo "FILE$PROP" | tr '[:lower:]' '[:upper:]')
SETPROP=$(echo "SET$PROP" | tr '[:lower:]' '[:upper:]')
# Check the original file value
PROPVALUE=$(get_file_value $LATEFILE "$FILEPROP=")
if [ -z "$PROPVALUE" ]; then
if [ "$PROPTYPE" == "ro.debuggable" ] || [ "$PROPTYPE" == "ro.secure" ]; then
PROPVALUE=$(get_file_value /default.prop "${PROPTYPE}=")
else
PROPVALUE=$(get_file_value /system/build.prop "${PROPTYPE}=")
fi
fi
# Checks for default/set values
safe_props $PROPTYPE $PROPVALUE
# Changes file only if necessary
if [ "$SAFE" == 0 ]; then
log_handler "Enabling prop file editing for '$PROPTYPE'."
replace_fn $SETPROP "false" "true" $LATEFILE
elif [ "$SAFE" == 1 ]; then
log_handler "Prop file editing unnecessary for '$PROPTYPE'."
replace_fn $SETPROP "true" "false" $LATEFILE
else
log_handler "Couldn't check safe value for '$PROPTYPE'."
fi
done
replace_fn BUILDEDIT 0 1 $LATEFILE
replace_fn DEFAULTEDIT 0 1 $LATEFILE
if [ "$1" != "file" ]; then
after_change_file "$1" "$2"
fi
}
change_prop_file() {
case $1 in
build)
FNLIST="
ro.build.type
ro.build.tags
ro.build.selinux
"
PROPFILELOC=$MODPATH/system/build.prop
;;
default)
FNLIST="
ro.debuggable
ro.secure
"
PROPFILELOC=/default.prop
;;
esac
for ITEM in $FNLIST; do
PROP=$(get_prop_type $ITEM)
MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')
FILEPROP=$(echo "FILE${PROP}" | tr '[:lower:]' '[:upper:]')
SETPROP=$(echo "SET${PROP}" | tr '[:lower:]' '[:upper:]')
if [ "$(eval "echo \$$MODULEPROP")" ]; then
SEDVAR="$(eval "echo \$$MODULEPROP")"
else
for P in $SAFELIST; do
if [ "$(get_eq_left $P)" == "$ITEM" ]; then
SEDVAR=$(get_eq_right $P)
fi
done
fi
if [ "$(get_file_value $LATEFILE "${SETPROP}=")" == "true" ]; then
replace_fn $ITEM $(eval "echo \$$FILEPROP") $SEDVAR $PROPFILELOC && log_handler "${ITEM}=${SEDVAR}"
fi
done
}
# ======================== MagiskHide Props functions ========================
# Check safe values
safe_props() {
SAFE=""
if [ "$2" ]; then
for P in $SAFELIST; do
if [ "$(get_eq_left $P)" == "$1" ]; then
if [ "$2" == "$(get_eq_right $P)" ]; then
SAFE=1
else
SAFE=0
fi
break
fi
done
fi
}
# Find what prop value to change to
change_to() {
CHANGE=""
case "$1" in
ro.debuggable) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi
;;
ro.secure) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi
;;
ro.build.type) if [ "$2" == "userdebug" ]; then CHANGE="user"; else CHANGE="userdebug"; fi
;;
ro.build.tags) if [ "$2" == "test-keys" ]; then CHANGE="release-keys"; else CHANGE="test-keys"; fi
;;
ro.build.selinux) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi
;;
esac
}
# Reset the module prop change
reset_prop() {
# Sets variables
PROP=$(get_prop_type $1)
MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')
REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')
SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=")
log_handler "Resetting $1 to default system value."
# Saves new module value
replace_fn $MODULEPROP "\"$SUBA\"" "\"\"" $LATEFILE
# Changes prop
replace_fn $REPROP "true" "false" $LATEFILE
# Updates prop change variable in propsconf_late
PROPCOUNT=$(get_file_value $LATEFILE "PROPCOUNT=")
if [ "$SUBA" ]; then
if [ "$PROPCOUNT" -gt 0 ]; then
PROPCOUNTP=$(($PROPCOUNT-1))
replace_fn PROPCOUNT $PROPCOUNT $PROPCOUNTP $LATEFILE
fi
if [ "$PROPCOUNT" == 0 ]; then
replace_fn PROPEDIT 1 0 $LATEFILE
fi
fi
if [ "$2" != "file" ]; then
after_change "$1"
fi
}
# Use prop value
change_prop() {
# Sets variables
PROP=$(get_prop_type $1)
MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')
REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')
SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=")
log_handler "Changing $1 to $2."
# Saves new module value
replace_fn $MODULEPROP "\"$SUBA\"" "\"$2\"" $LATEFILE
# Changes prop
replace_fn $REPROP "false" "true" $LATEFILE
# Updates prop change variables in propsconf_late
if [ -z "$SUBA" ]; then
PROPCOUNT=$(get_file_value $LATEFILE "PROPCOUNT=")
PROPCOUNTP=$(($PROPCOUNT+1))
replace_fn PROPCOUNT $PROPCOUNT $PROPCOUNTP $LATEFILE
fi
replace_fn PROPEDIT 0 1 $LATEFILE
if [ "$3" != "file" ]; then
after_change "$1"
fi
}
# Reset all module prop changes
reset_prop_all() {
log_handler "Resetting all props to default values."
for PROPTYPE in $PROPSLIST; do
PROP=$(get_prop_type $PROPTYPE)
MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')
REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')
SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=")
# Saves new module value
replace_fn $MODULEPROP "\"$SUBA\"" "\"\"" $LATEFILE
# Changes prop
replace_fn $REPROP "true" "false" $LATEFILE
done
# Updates prop change variables in propsconf_late
PROPCOUNT=$(get_file_value $LATEFILE "PROPCOUNT=")
replace_fn PROPCOUNT $PROPCOUNT 0 $LATEFILE
replace_fn PROPEDIT 1 0 $LATEFILE
after_change "$1"
}
# ======================== Custom Props functions ========================
# Set custom prop value
set_custprop() {
if [ "$2" ]; then
CURRCUSTPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=")
TMPCUSTPROPS=$(echo "$CURRCUSTPROPS ${1}=${2}" | sed 's@^[ \t]*@@')
SORTCUSTPROPS=$(echo $(printf '%s\n' $TMPCUSTPROPS | sort -u))
log_handler "Setting custom prop $1."
replace_fn CUSTOMPROPS "\"$CURRCUSTPROPS\"" "\"$SORTCUSTPROPS\"" $LATEFILE
replace_fn CUSTOMEDIT 0 1 $LATEFILE
if [ "$3" != "file" ]; then
after_change "$1"
fi
fi
}
# Reset all custom prop values
reset_all_custprop() {
CURRCUSTPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=")
log_handler "Resetting all custom props."
# Removing all custom props
replace_fn CUSTOMPROPS "\"$CURRCUSTPROPS\"" "\"\"" $LATEFILE
replace_fn CUSTOMEDIT 1 0 $LATEFILE
if [ "$1" != "file" ]; then
after_change "$1"
fi
}
# Reset custom prop value
reset_custprop() {
CURRCUSTPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=")
log_handler "Resetting custom props $1."
TMPCUSTPROPS=$(echo $CURRCUSTPROPS | sed "s@${1}=${2}@@" | tr -s " " | sed 's@^[ \t]*@@')
# Removing all custom props
replace_fn CUSTOMPROPS "\"$CURRCUSTPROPS\"" "\"$TMPCUSTPROPS\"" $LATEFILE
CURRCUSTPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=")
if [ -z "$CURRCUSTPROPS" ]; then
replace_fn CUSTOMEDIT 1 0 $LATEFILE
fi
after_change "$1"
}