#!/usr/bin/env bash

## ghacks-user.js updater for macOS and Linux

## version: 1.5
## Author: Pat Johnson (@overdodactyl)
## Additional contributors: @earthlng, @ema-pe

## DON'T GO HIGHER THAN VERSION x.9 !! ( because of ASCII comparison in check_for_update() )

#########################
#    Base variables     #
#########################
update_pref=${1:--ask}
RED='\033[0;31m'
BLUE='\033[0;34m'
BBLUE='\033[1;34m' 
GREEN='\033[0;32m'
ORANGE='\033[0;33m'
CYAN='\033[0;36m'  
NC='\033[0m' # No Color


#########################
#   Working directory   #
#########################

# get current directory
currdir=$(pwd)
## get the full path of this script (readlink for Linux, greadlink for Mac with coreutils installed)
sfp=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null)
## fallback for Macs without coreutils
if [ -z "$sfp" ]; then sfp=${BASH_SOURCE[0]}; fi
## store the Firefox profile directory
ff_profile="$(dirname "${sfp}")"


#########################
#     File Handeling    #
#########################

# Download method priority: curl -> wget -> pearl
DOWNLOAD_METHOD="not_pearl"
if [[ $(command -v "curl") ]] > /dev/null 2>&1; then
  DOWNLOAD_TO_FILE="curl -O"  
elif [[ $(command -v "wget") ]] > /dev/null 2>&1; then
  DOWNLOAD_TO_FILE="wget"
elif [[ $(command -v "perl") ]]; then
  DOWNLOAD_METHOD="perl"
else
  echo -e ${RED}"This script requires curl, wget or perl to be installed.\nProcess aborted"${NC}
  exit 0
fi

# Download files
download_file () {
  mkdir -p userjs_temps
  cd userjs_temps
  url=$1

  if [ $DOWNLOAD_METHOD = "not_pearl" ]; then
    $DOWNLOAD_TO_FILE ${url}
  else
    http_url=${url/https/http}
    # Variables from the shell are available in Perl's %ENV hash
    # Need to export shell variable so it is visible to subprocesses
    export http_url

    perl -e '
            use File::Fetch;
            my $ff = File::Fetch->new(uri => $ENV{http_url});
            my $where = $ff->fetch() or die $ff->error;
            my $where = $ff->fetch( to => "." );
            '
  fi

  cd ..
}

# Backup a file into userjs_backups
# Replace current version of a file with new one in userjs_temps
backup_file () {
  filename=$1
  mkdir -p userjs_backups
  mv $filename "userjs_backups/${filename}.backup.$(date +"%Y-%m-%d_%H%M")"
  mv "userjs_temps/${filename}" $filename
  echo -e "Status: ${GREEN}${filename} has been backed up and replaced with the latest version!${NC}"
}

#########################
#      Initiation       #
#########################

initiate () {
  echo -e
  echo -e
  echo -e        ${BBLUE}"  ############################################################################"
  echo -e                "  ####                                                                    ####"
  echo -e 				 "  ####                           ghacks user.js                           ####"
  echo -e                "  ####       Hardening the Privacy and Security Settings of Firefox       ####"
  echo -e                "  ####           Maintained by @Thorin-Oakenpants and @earthlng           ####"                            ####"
  echo -e                "  ####            Updater for macOS and Linux by @overdodactyl            ####"            									 ####"
  echo -e                "  ####                                                                    ####"
  echo -e                "  ############################################################################"${NC}
  echo -e
  echo -e
  echo -e "Documentation for this script is available here: ${CYAN}https://github.com/ghacksuserjs/ghacks-user.js/wiki/3.3-Updater-Scripts${NC}\n"
}

confirmation () {
  download_file "https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/user.js" &>/dev/null
  echo -e "Please observe the following information:"
  echo -e "\tFirefox profile:  ${ORANGE}$(pwd)${NC}"
  echo -e "\tAvailable online: ${ORANGE}$(get_userjs_version userjs_temps/user.js)${NC}"
  echo -e "\tCurrently using:  ${ORANGE}$(get_userjs_version user.js)\n${NC}\n"

  echo -e "This script will update to the latest user.js file and append any custom configurations from user-overrides.js. ${RED}Continue Y/N? ${NC}"
  read -p "" -n 1 -r
  echo -e "\n"

  if [[ $REPLY =~ ^[Nn]$ ]]; then
    echo -e ${RED}"Process aborted"${NC}
    return 1
  fi
}


#########################
#   Update updater.sh   #
#########################

# Returns the version number of a updater.sh file
get_updater_version () {
  filename=$1
  version_regex='5 s/.*[[:blank:]]\([[:digit:]]*\.[[:digit:]]*\)/\1/p'
  echo "$(sed -n "$version_regex" "${ff_profile}/${filename}")"
}

# Update updater.sh
# Default: Check for update, if available, ask user if they want to execute it
# Args:
#   -donotupdate: New version will not be looked for and update will not occur
#   -update: Check for update, if available, execute without asking
update_updater () {
  update_pref="$(echo $update_pref | tr '[A-Z]' '[a-z]')"
  if [ $update_pref = "-donotupdate" ]; then
    # User signified not to check for updates
    return 0
  fi

  download_file "https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/updater.sh" &>/dev/null

  if [[ $(get_updater_version updater.sh) < $(get_updater_version userjs_temps/updater.sh) ]]; then
    if [ $update_pref != "-update" ]; then
      echo -e "There is a newer version of updater.sh available. ${RED}Download and execute Y/N?${NC}"
      read -p "" -n 1 -r
      echo -e "\n\n"
      if [[ $REPLY =~ ^[Nn]$ ]]; then
        # Update available, but user chooses not to update
        return 0
      fi
    fi
  else
    # No update available
    return 0
  fi
  # Backup current updater, execute latest version
  backup_file updater.sh
  chmod +x updater.sh
  ./updater.sh -donotupdate
  exit 1
}


#########################
#    Update user.js     #
#########################

# Returns version number of a user.js file
get_userjs_version () {
  filename=$1
  echo "$(sed -n "4p" "${ff_profile}/${filename}")"
}

# Applies latest version of user.js and any custom overrides
update_userjs () {
  backup_file user.js
  if [ -e user-overrides.js ]; then
    cat user-overrides.js >> user.js
    echo -e "Status: ${GREEN}Your user-overrides.js customizations have been applied!${NC}"
  fi
}

#########################
#        Execute        #
#########################

## change directory to the Firefox profile directory
cd "$ff_profile"

initiate
update_updater
confirmation && update_userjs
rm -rf userjs_temps
cd "${currdir}"