#!/bin/bash

function check_ccid_settings
{
    plist=$1

    while read LINE; do

        SECTION=`echo "$LINE" | sed -n 's/^.*<key>\(ifd[^ 	]*\)<\/key>.*$/\1/gp'`
        VALUES=`echo "$LINE" | sed -n 's/^.*<key>ifd[^ 	]*<\/key>[ 	]*<array>[ 	]*\(.*\)[ 	]*<\/array>.*$/\1/gp'`

        if [ -n "$VALUES"  ]; then
            SAVEIFS=$IFS
            IFS=$(echo -en "\n\b")
            VALUES=( `echo "$VALUES" | sed -n 's/[ 	]*<string>[ 	]*//gp' | sed -n 's/[ 	]*<\/string>[ 	]*/\n/gp' | sed '$d'` )
            IFS=$SAVEIFS

            if [ "$SECTION" == "ifdVendorID" ]; then
                IFDVENDORID=("${VALUES[@]}")
            fi

            if [ "$SECTION" == "ifdProductID" ];then
                IFDPRODUCTNAME=("${VALUES[@]}")
            fi

            if [ "$SECTION" == "ifdFriendlyName" ]; then
                IFDFRIENDLYNAME=("${VALUES[@]}")
            fi

        fi
    done < <(cat $plist | tr "\n" " " | tr "\r" " " |
             sed -n 's/\(.*\)/\1\n/gp' |
             sed -n 's/\(<key>ifd[^ 	]*<\/key>\)/\n\1/gp')

    COUNT=${#IFDVENDORID[@]}

    i=0
    while [ "$i" -le "$COUNT" ] ; do
        let i=i+1
        if [[ "${IFDVENDORID[$i]}" == "$VendorID" && "${IFDPRODUCTNAME[i]}" == "$ProductID" ]]; then
            return 0
        fi
    done

    echo "ifdVendorID ifdProductID ifdFriendlyName"
    return 0
}

function update_ccid_settings
{
    need_to_insert=$2;
    plist=$1;
    awk_code="";
    for i in $need_to_insert; do
	case "$i" in
	'ifdVendorID')
	awk_code="$awk_code""/ifdVendorID/ {
	    skip=1;
	    print \"\t<array>\";
	    print \"\t\t<string>$VendorID</string>\";
	    next;
	    }"
	    ;;
	'ifdProductID')
	    awk_code=$awk_code"/ifdProductID/ {
	    skip=1;
	    print \"\t<array>\";
	    print \"\t\t<string>$ProductID</string>\";
	    next;
	    }"
	;;
	'ifdFriendlyName')
	awk_code="$awk_code""/ifdFriendlyName/ {
	    skip=1;
	    print \"\t<array>\"
	    print \"\t\t<string>$FriendlyName</string>\";
	    next;
	    }"
	;;
	esac
    done
    cat $plist | $Awk "BEGIN {skip=0} skip == 1 { skip=0; next }
	{print \$0}
	$awk_code"

    return $r;
}

function update_ifd_ccid_bundle
{
    VendorID=$2
    ProductID=$3
    FriendlyName=$4

    Plist="$ccid_plist" && [ ! -n "$Plist" ] && Plist=$1;
    Awk=`which awk` && [ ! -n "$Awk" ] &&  Awk=`which gawk`;
    
    need_to_insert=$(check_ccid_settings $Plist)
    update_ccid_settings $Plist "${need_to_insert}";
}

function check_plist_integrity
{
    friendlyNameEntries=$(sed -n '/<key>ifdFriendlyName<\/key>/,/<\/array>/p' $1  | wc -l)
    vendorIdEntries=$(sed -n '/<key>ifdVendorID<\/key>/,/<\/array>/p' $1  | wc -l)
    productIdEntries=$(sed -n '/<key>ifdProductID<\/key>/,/<\/array>/p' $1  | wc -l)
    
    #echo "product $productIdEntries; vendor $vendorIdEntries; friendly $friendlyNameEntries"
    if [[ $productIdEntries = $vendorIdEntries && $vendorIdEntries = $friendlyNameEntries ]]; then
        return 0
    fi
    echo "$1 has invalid structure. Entries by section: VendorID = $vendorIdEntries; ProductID = $productIdEntries; FriendlyName = $friendlyNameEntries"
    return 1
}

function remove_by_friendly_name
{
    plist=$2
    searchString=$1
    while :
    do
	    searchResults=($( grep -n "${searchString}" ${plist} | sed -e 's/:.*//g' ))
	    numOfFoundEntries=$(echo ${searchResults[@]} | wc -w)

	    if [ ${numOfFoundEntries} -eq 0 ] ; then
		    return 0
	    fi
	
	    friendlyName=$( grep -n "<key>ifdFriendlyName</key>" ${plist} | sed -e 's/:.*//g')
	    relativePos=$(( ${searchResults[0]}-${friendlyName} ))
	    sed -i -e "$(( ${friendlyName}+${relativePos} ))d" $plist
	
	    productID=$( grep -n "<key>ifdProductID</key>" ${plist} | sed -e 's/:.*//g')
	    sed -i -e "$(( ${productID}+${relativePos} ))d" $plist
	
	    vendorID=$( grep -n "<key>ifdVendorID</key>" ${plist} | sed -e 's/:.*//g')
	    sed -i -e "$(( ${vendorID}+${relativePos}))d" $plist	
    done
}

function update_file
{
    if [ -f $1.tmp ]; then
        rm -f $1.tmp
    fi
	update_ifd_ccid_bundle "$1" "$2" "$3" "$4" > "$1.tmp"
    rm -f "$1"
    mv "$1.tmp" "$1"
}

for file in $(find /etc /usr/lib* /usr/local -name "*Info.plist" ); do
    NOW=$(date +%d-%m-%y-%T)
    # Get source file if @Info.plist - symbolic link
    file=`readlink -e $file`
    if [ "$?" -eq 1 ]; then
        continue
    fi

	#cp -f ${file} ${file}.$NOW.backup
            
	cp -f ${file} ${file}.orig
	WORK_FILE=${file}.orig
	echo updating $file
	remove_by_friendly_name '<string>Aladdin LiveOffice</string>' "$WORK_FILE"
	res=$?
	if [ $res -ne "0" ];then
        echo "exit"
      	exit 0
	fi
	
	update_file "$WORK_FILE" "0x24DC" "0x040c" "Aladdin LiveOffice"

	chown --reference=${file} "$WORK_FILE"
	chmod --reference=${file} "$WORK_FILE"
	rm -f ${file}
    mv "$WORK_FILE" ${file}
done

