#!/bin/bash BILLING_PATH="$HOME/Code/code/Scripts/Billing" TEMPDIR=$1 INPUT=$2 OUTPUT=`$BILLING_PATH/dkim-verify.sh $TEMPDIR $INPUT` RESULT=$? if [ "$RESULT" != "0" ] then echo "DKIM check failed" exit $RESULT fi echo > $TEMPDIR/check-params.sh cat $TEMPDIR/cheaders.txt | while read LINE do KEY=`echo $LINE | cut -d ':' -f 1` VAL=`echo $LINE | cut -d ':' -f 2-` [ "$KEY" == "reply-to" ] && echo "REPLYTO_EMAIL='$VAL'" >> $TEMPDIR/check-params.sh [ "$KEY" == "content-type" ] && echo "CONTENT_TYPE='$VAL'" >> $TEMPDIR/check-params.sh done # We are expecting that PayPal will DKIM sign the from and subject fields and so we search # for those fields in dkim-headers.dos so we only detect them if they were signed # If they are not in the dkim-headers that are signed, then the idea is that the rest of # the script will fail as the names and emails will mis-match cat $TEMPDIR/dkim-headers.dos | while read LINE do KEY=`echo $LINE | cut -d ':' -f 1` VAL=`echo $LINE | cut -d ':' -f 2-` [ "$KEY" == "from" ] && echo "$VAL" | sed 's/\(.*\) via PayPal.*/FROM_NAME='\''\1'\''/' >> $TEMPDIR/check-params.sh [ "$KEY" == "subject" ] && echo "$VAL" | sed 's/\(.*\) - Notification of Payment Received from \(.*\) (\(.*\)).*/ITEM='\''\1'\''\nSENDER_NAME='\''\2'\''\nSENDER_EMAIL='\''\3'\''\n/' >> $TEMPDIR/check-params.sh done echo >> $TEMPDIR/check-params.sh # TODO: Need to really check the domain is from paypal, the only way to properly check is # checking the DKIM signature domain and that it is one controlled by PayPal . $TEMPDIR/check-params.sh echo > $TEMPDIR/plain-body.txt MULTIPART_TYPE=`echo "$CONTENT_TYPE" | cut -d ';' -f 1` if [ "$MULTIPART_TYPE" == "multipart/alternative" ] then MULTIPART_SEPERATOR=`echo "$CONTENT_TYPE" | cut -d ';' -f 2- | cut -d '=' -f 2` PART=0 cat $TEMPDIR/body.txt | while read LINE do [ "$PART" == "1" ] && echo "$LINE" >> $TEMPDIR/plain-body.txt [ "$PART" == "1" ] && [ "$LINE" == "--$MULTIPART_SEPERATOR" ] && break [ "$PART" == "0" ] && [ "$LINE" == "--$MULTIPART_SEPERATOR" ] && PART=1 done else cat $TEMPDIR/body.txt >> $TEMPDIR/plain-body.txt fi cat $TEMPDIR/plain-body.txt | perl -pe 'use MIME::QuotedPrint; $_=MIME::QuotedPrint::decode($_);' > $TEMPDIR/plain.txt STATE=0 echo > $TEMPDIR/vals.sh cat $TEMPDIR/plain.txt | while read LINE do KEY=`echo $LINE | cut -d ':' -f 1` VAL=`echo $LINE | cut -d ':' -f 2- | sed 's/[ \t]*\(.*\)/\1/'` [ "$LINE" == "" ] && STATE=0 [ "$STATE" == "2" ] && echo "BUYER_EMAIL='$LINE'" >> $TEMPDIR/vals.sh && STATE=0 [ "$STATE" == "1" ] && echo "BUYER_NAME='$LINE'" >> $TEMPDIR/vals.sh && STATE=2 [ "$LINE" == "Buyer:" ] && STATE=1 [ "$STATE" == "3" ] && echo "SHIPPING=\$SHIPPING' | $LINE'" >> $TEMPDIR/vals.sh [ "$LINE" == "Shipping address:" ] && STATE=3 [ "$KEY" == "Description" ] && echo "DESC='$VAL'" >> $TEMPDIR/vals.sh [ "$KEY" == "Qty" ] && echo "QTY='$VAL'" >> $TEMPDIR/vals.sh [ "$KEY" == "Unit price" ] && echo "UNIT_PRICE='$VAL'" >> $TEMPDIR/vals.sh [ "$KEY" == "Total" ] && echo "PRICE='$VAL'" >> $TEMPDIR/vals.sh [ "$KEY" == "Payment" ] && echo "PAID='$VAL'" >> $TEMPDIR/vals.sh [ "$KEY" == "Payment sent to" ] && echo "ME='$VAL'" >> $TEMPDIR/vals.sh done . $TEMPDIR/vals.sh if [ "$ME" != "billing@subflexion.com" ] then echo "Wrong account:" echo " -$ME- is not -billing@subflexion.com- " echo " Or perhaps the email isn't formatted as expected, perhaps paypal have changed the format?" exit -1 fi if [ "$SENDER_NAME" != "$FROM_NAME" ] then echo "Name mismatch:" echo " -$SENDER_NAME- is not -$FROM_NAME- " echo " Perhaps the from or subject header fields were not signed, so can we really trust this email?" exit -1 fi if [ "$REPLYTO_EMAIL" != "$SENDER_EMAIL" ] then echo "Email mismatch:" echo " -$REPLYTO_EMAIL- is not -$SENDER_EMAIL- " echo " Perhaps the from or subject header fields were not signed, so can we really trust this email?" exit -1 fi if [ "$SENDER_NAME" != "$BUYER_NAME" ] then echo "Name mismatch:" echo " -$SENDER_NAME- is not -$BUYER_NAME- " echo " The email doesn't not appear to be formatted as expected, perhaps paypal have changed the format" exit -1 fi if [ "$BUYER_EMAIL" != "$SENDER_EMAIL" ] then echo "Email mismatch:" echo " -$BUYER_EMAIL- is not -$SENDER_EMAIL- " echo " The email doesn't not appear to be formatted as expected, perhaps paypal have changed the format" exit -1 fi # if [ "$ITEM" == "Item no.v1.0" ] if [ "$ITEM" == "Item no.Site License" ] then echo "Found requested stock item" # if [ "$UNIT_PRICE" != "\$0.05 USD" ] if [ "$UNIT_PRICE" != "\$0.05 AUD" ] then echo "Price mismatch:" # echo " -$UNIT_PRICE- != \$0.05 USD" echo " -$UNIT_PRICE- != \$0.05 AUD" echo " Prices changed, but this script not updated?" echo " Or potentially someone is trying to make a paypal payment with the correct details except for the price" exit -1 fi # TODO: calculate that the total price is the correctly calculated product of the unit price by the quantitya else echo "Stock item not found!" echo " Item: -$ITEM-" echo " Items changed, but this script not updated?" exit -1 fi ORDER_ID=`uuidgen` echo "Generating license..." echo > $TEMPDIR/license.txt echo "PRODUCT=$DESC" >> $TEMPDIR/license.txt echo "COUNT=$QTY" >> $TEMPDIR/license.txt echo "ID=$ORDER_ID" >> $TEMPDIR/license.txt echo "NAME=$BUYER_NAME" >> $TEMPDIR/license.txt echo "EMAIL=$BUYER_EMAIL" >> $TEMPDIR/license.txt echo "ADDRESS_LINE1=`echo $SHIPPING | cut -d '|' -f 2 | sed 's/[ \t]*\(.*\)/\1/'`" >> $TEMPDIR/license.txt echo "ADDRESS_LINE2=`echo $SHIPPING | cut -d '|' -f 3 | sed 's/[ \t]*\(.*\)/\1/'`" >> $TEMPDIR/license.txt echo "ADDRESS_LINE3=`echo $SHIPPING | cut -d '|' -f 4 | sed 's/[ \t]*\(.*\)/\1/'`" >> $TEMPDIR/license.txt echo "ADDRESS_LINE4=`echo $SHIPPING | cut -d '|' -f 5 | sed 's/[ \t]*\(.*\)/\1/'`" >> $TEMPDIR/license.txt echo "ADDRESS_LINE5=`echo $SHIPPING | cut -d '|' -f 6 | sed 's/[ \t]*\(.*\)/\1/'`" >> $TEMPDIR/license.txt # openssl genrsa -out $BILLING_PATH/private.pem 2048 > /dev/null # openssl rsa -in $BILLING_PATH/private.pem -outform PEM -pubout -out $BILLING_PATH/public.pem cat $TEMPDIR/license.txt | openssl dgst -keyform pem -sha256 -sign $BILLING_PATH/private.pem > $TEMPDIR/sig.bin cat $TEMPDIR/license.txt | openssl dgst -keyform pem -sha256 -verify $BILLING_PATH/public.pem -signature $TEMPDIR/sig.bin SIG=`cat $TEMPDIR/sig.bin | base64 -w 50` echo "SIGNATURE_LINE1=`echo $SIG | tr ' ' '\n' | head -n 1 | tail -n 1`" >> $TEMPDIR/license.txt echo "SIGNATURE_LINE2=`echo $SIG | tr ' ' '\n' | head -n 2 | tail -n 1`" >> $TEMPDIR/license.txt echo "SIGNATURE_LINE3=`echo $SIG | tr ' ' '\n' | head -n 3 | tail -n 1`" >> $TEMPDIR/license.txt echo "SIGNATURE_LINE4=`echo $SIG | tr ' ' '\n' | head -n 4 | tail -n 1`" >> $TEMPDIR/license.txt echo "SIGNATURE_LINE5=`echo $SIG | tr ' ' '\n' | head -n 5 | tail -n 1`" >> $TEMPDIR/license.txt echo "SIGNATURE_LINE6=`echo $SIG | tr ' ' '\n' | head -n 6 | tail -n 1`" >> $TEMPDIR/license.txt echo "SIGNATURE_LINE7=`echo $SIG | tr ' ' '\n' | head -n 7 | tail -n 1`" >> $TEMPDIR/license.txt cat $TEMPDIR/license.txt $BILLING_PATH/email-template.sh "$BUYER_NAME" "$BUYER_EMAIL" "$DESC" "$QTY" "$UNIT_PRICE" "$TEMPDIR/license.txt" "$ORDER_ID"