#!/bin/bash
#lastact: arturo@2023-04-14
#desc: script encargado de actualizar o borrar configuración del archivo de policies de configuración de firefox

FICHFUNCS="/usr/bin/vx-funcs-bash"
[ -f "${FICHFUNCS}" ] && . "${FICHFUNCS}" "null"

FICH_POLICIES=(
    "/usr/lib/firefox/distribution/policies.json"
    "/usr/lib/firefox-esr/distribution/policies.json"
)

# 0) Ayuda:
# Mostramos la ayuda si se pasa como parámetro -h o --help:
EJ_CONFIGURACION='{
            "PromptForDownloadLocation": true,
            "OfferToSaveLogins": false,
            "OfferToSaveLoginsDefault": false,
            "PasswordManagerEnabled": false,
            "DisablePasswordReveal": true,
            "SanitizeOnShutdown": {
                "Cache": true,
                "Cookies": true,
                "Downloads": false,
                "FormData": true,
                "History": false,
                "Sessions": true,
                "SiteSettings": false,
                "OfflineApps": false,
                "Locked": true
            }
        }'
EJ_LISTA_POLICIES_DEL=(
    ".policies.OfferToSaveLogins"
    ".policies.OfferToSaveLoginsDefault"
    ".policies.PasswordManagerEnabled"
    ".policies.DisablePasswordReveal"
    ".policies.SanitizeOnShutdown"
)
AYUDA="Script encargado de configurar el comportamiento de Firefox a través de las policies: ${FICH_POLICIES[*]}."
AYUDA+="\nURL: https://github.com/mozilla/policy-templates/blob/master/README.md"
AYUDA+="\nDebes pasar como primer parámetro la operación a realizar:"
AYUDA+="\n\t1) \"-u|--update|u|upd|update\" para actualizar o añadir nuevas directivas de configuración. Se pasa un objeto con las directivas y su valor."
AYUDA+="\n\t2) \"-d|--delete|d|del|delete\" para eliminar directivas de configuración. Se pasa una lista de directivas a eliminar."
AYUDA+="\nImportante tener mucho cuidado con las comillas dobles y simples, respetar la sintaxis de los ejemplos. Los nombres de las directivas y los valores que lo requieran deben estar encerrados entre comillas dobles."
EJEMPLOS=("$(basename "${0}") \"-u\" '${EJ_CONFIGURACION}' # Actualiza las directivas de configuración")
EJEMPLOS+=("VAR='{ \"DisableProfileCreation\": true }' # Almacena una configuración una varible VAR")
EJEMPLOS+=("$(basename "${0}") \"--update\" \"\${VAR}\" # Actualiza las politicas de firefox según el contenido de la variable VAR")
EJEMPLOS+=("$(basename "${0}") \"-d\" ${EJ_LISTA_POLICIES_DEL[@]} # Elimina la lista de directivas indicada")

vx-check_need_help "${1}" &&
    vx-show_help "${0}" "${AYUDA}" "${EJEMPLOS[@]}" &&
    exit 0

function ayuda() {
    # Informamos del uso del comando:
    vx-show_help "${0}" "${AYUDA}" "${EJEMPLOS[@]}" &&
        exit 0
}

# 1) Comprobamos que es el usuario root quien quiere ejecutar el programa, sino salimos:
vx-check_user_root

# 2) Preparamos la auditoria:
LOG="$(basename "${0}").log"
vx-log_xsession -o "${LOG}"
TEXTO="Configuración del Navegador Web Firefox vía policies: ${FICH_POLICIES[*]}"
vx-echo_log_titulo1 "SRV-CONF-FIREFOX" "${TEXTO}"

# 3) Comenzamos comprobando que existe en archivo.  En caso de no existir lo creamos:
# Comprobamos si existe o no el fichero de configuraición de firefox:
for FICH in "${FICH_POLICIES[@]}" ; do
    if [[ ! -f "${FICH}" ]] || ! grep -qi "policies" "${FICH}" ; then
        echo "#> El fichero de policies no esta preparado, vamos a inicializarlo:"
        [[ ! -d "$(dirname "${FICH}")" ]] && mkdir -p "$(dirname "${FICH}")" # \
        echo "#> $(dirname "${FICH}"): Se ha creado el directorio base de firefox, no existía"
        jq --null-input '{"policies": {}}' | sponge "${FICH}" && \
        echo "#> ${FICH}: Se ha inicializado, estaba vacío"
    fi
done

# 4) Comprobamos el primer parámetro pasado como parámetro para saber si queremos actualizar o eliminar el contenido del json:
case "${1//-/}" in
"delete" | "d" | "del" | "-d" | "--delete" )
    shift
    LISTA_POLICIES=(${@})
    for FICH in "${FICH_POLICIES[@]}" ; do
        jq 'del('$(echo "${LISTA_POLICIES[*]}" | tr -s " " ",")')' "${FICH}" | sponge "${FICH}" &&
            vx-colorear_echo "verde" "=> Se han eliminado las siguientes directivas: ${LISTA_POLICIES[*]}" &&
            vx-colorear_echo "verde" "=> ${FICH}:" &&
            cat "${FICH}"
    done
    ;;
"update" | "u" | "upd" | "-u" | "--update" )
    for FICH in "${FICH_POLICIES[@]}" ; do
        jq '.policies += '"${2}"'' "${FICH}" | sponge "${FICH}" &&
            vx-colorear_echo "verde" "=> Se han configurado las siguientes directivas:" &&
            vx-colorear_echo "verde" "=> ${FICH}:" &&
            cat "${FICH}"
    done
    ;;
*)
    vx-colorear_echo "rojo" "=> Has introducido un parámetro desconocido, revisa la ayuda por favor."
    ayuda
    ;;
esac
