"Después del juego es antes del juego"
Sepp Herberger

viernes, 4 de noviembre de 2016

Desactivar el visualizador de PDF de Google Chrome

Bueno, pues en la entrada inmediatamente anterior contamos como desactivar el en ocasiones molesto visualizador de PDF embebido en el navegador Firefox. Veamos ahora lo propio para Chrome.

Si tenemos un solo usuario nada mas sencillo que escribir "about:plugins" en la barra del navegador e inhabilitar la extensión "Chrome PDF Viewer":


Si tenemos muchos usuarios esto no es evidentemente productivo y es una situación detestable para cualquiera de nosotros. Vamos a ver como hacerlo de forma masiva. Primero hay que buscar donde desactivarlo programatically como dicen los anglos o mediante un script, como se ha dicho aquí de siempre.

La primera mala noticia es que Google Chrome no tiene un fichero unificado global como /etc/firefox/syspref.js donde meter una configuración que afecte a todos los usuarios de una máquina. Hay que ir tocando home a home una configuración que no queda bloqueada y que el usuario puede cambiar cuando quiera.

El fichero de configuración es $HOME/.config/google-chrome/Default/Preferences, pero si intentamos verlo con un cat nos encontraremos con un texto ilegible en formato JSON. No creo que el fichero esté ofuscado aposta, simplemente a nadie se le ocurrió que tendría que leerlo un humano.

Para examinarlo primero debemos hacer beautifying del código o "ponerlo bonito" dicho en castizo. Una forma rápida es instalar el programita "jq" y haciendo:
# apt-get install jq
# jq '.' /home/rutaamihome/.config/google-chrome/Default/Preferences 
Con esto veremos todo mucho mas claro. El programa jq es a JSON lo que xmlstarlet a XML: una herramienta especializada de línea de comandos para manejar este formato, ideal para ser usada en scripts.

Bueno, pues navegando por dicho fichero, que es montruosamente grande, vemos este atributo JSON:
......
  "plugins": {
    "last_internal_directory": "/opt/google/chrome",
    "plugins_list": [
      {
        "enabled": true,
        "name": "Chrome PDF Viewer",
        "path": "chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/",
        "version": ""
      },
      {
        "enabled": true,
        "name": "Shockwave Flash",
        "path": "/home/staff/infoadmin/.config/google-chrome/PepperFlash/23.0.0.185/libpepflashplayer.so",
        "version": "23.0.0.185"
      },
      {
        "enabled": true,
        "name": "Widevine Content Decryption Module",
        "path": "/opt/google/chrome/libwidevinecdmadapter.so",
        "version": "1.4.8.893"
      },
      {
        "enabled": true,
        "name": "Native Client",
        "path": "/opt/google/chrome/internal-nacl-plugin",
        "version": ""
      },
      {
        "enabled": true,
        "name": "Chrome PDF Viewer",
        "path": "internal-pdf-viewer",
        "version": ""
      },
      {
        "enabled": true,
        "name": "Adobe Flash Player"
      },
  {
        "enabled": true,
        "name": "Chrome PDF Viewer"
      },
      {
        "enabled": true,
        "name": "Native Client"
      },
      {
        "enabled": true,
        "name": "Widevine Content Decryption Module"
      }
    ],
    "show_details": false
  },

En negrita están los 3 nodos del array "plugins_list" correspondientes al PDF Viewer. Si ponemos sus atributos "enabled" a false desde un script tendremos lo que queremos. Esto se hace también con jq, ya que sirve tanto para ver como para modificar ficheros JSON. Tras empollar varias docenas de ejemplos de uso de "jq", puedo aseverar que el código en cuestión es:
# CONFIG="$HOME/.config/google-chrome/Default/Preferences"
# cat $CONFIG | jq '.plugins.plugins_list |= map(if .name=="Chrome PDF Viewer" then .enabled=false else . end)'  | tr -d '\n' | tr -s " " > $CONFIG.new
Vayamos por partes:
  1. cat $CONFIG: vuelca el fichero en la salida estándar
  2. jq '.plugins.plugins_list |= map(if .name=="Chrome PDF Viewer" then .enabled=false else . end)': procesamos el fichero hasta dar con plugins.plugins_list, buscamos nodos cuyo name sea "Chrome PDF Viewer" y ponemos su campo enabled a false. El resto lo dejamos como está.
  3. tr -d '\n' | tr -s " " > $CONFIG.new: quitamos retornos de carro y espacios en blanco de la identación, ofuscando de nuevo el json. El resultado se guarda en la misma ruta, en Preferences.new
Una vez hecho esto, copiamos Preferences.new en Preferences y ya está hecho.

Pues no, tenemos otra mala noticia. Desgraciadamente me encontré con que hay muchas veces en que ".plugins" está vacio, aunque el PDF Viewer está activado, y el nodo plugins_list no aparece hasta que entramos manualmente en "about:config".

Ese caso hay que detectarlo e inyectar dentro del JSON una rama plugins_list con el enable=false allí donde corresponda. Eso se hace con este código (ojo, metemos el array plugins_list completo en una sola línea, es bastante largo):
salida=$(cat $CONFIG | jq '.plugins.plugins_list[0]')
if [ "$salida" = "null"  ]
then
   cat $CONFIG | jq '.plugins={ "show_details": true, "plugins_list": [ { "version": "", "path": "chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/", "name": "Chrome PDF Viewer", "enabled": false }, { "version": "23.0.0.162", "path": "/var/home/usuario/.config/google-chrome/PepperFlash/23.0.0.162/libpepflashplayer.so", "name": "Shockwave Flash", "enabled": true }, { "version": "1.4.8.824", "path": "/opt/google/chrome/libwidevinecdmadapter.so", "name": "Widevine Content Decryption Module", "enabled": true }, { "version": "", "path": "/opt/google/chrome/internal-nacl-plugin", "name": "Native Client", "enabled": true }, { "version": "", "path": "internal-pdf-viewer", "name": "Chrome PDF Viewer", "enabled": false }, { "name": "Adobe Flash Player", "enabled": true }, { "name": "Chrome PDF Viewer", "enabled": false }, { "name": "Native Client", "enabled": true }, { "name": "Widevine Content Decryption Module", "enabled": true } ], "last_internal_directory": "/opt/google/chrome"}' | tr -d '\n' | tr -s " " > $CONFIG.new
fi 
Ahora si plugins_list no existe o está vacío le metemos dentro la rama entera con los plugins, poniendo enabled=false en los Chrome PDF Viewer. Ahora sí funcionará. Como dicen en mi pueblo, "enjuntándolo todo" queda este script:
# cat google_disable_pdf_viewer 
#!/bin/bash

if [ "$1" = "" ]
then
  echo "Falta parametro con la ruta del home"
  exit 1
fi

if [ ! -e /usr/bin/jq ]
then
   echo "No hay jq, instalalo"
   exit 1
fi

CONFIG="$1/.config/google-chrome/Default/Preferences"

if [ ! -e $CONFIG ]
then
  echo "No existe $CONFIG"
  exit 1
fi

#Verificamos si existe la rama .plugins con contenido. Muchas veces esta vacia y no podemos poner a false el plugin.
salida=$(cat $CONFIG | jq '.plugins.plugins_list[0]')
if [ "$salida" = "null"  ]
then
   cat $CONFIG | jq '.plugins={ "show_details": true, "plugins_list": [ { "version": "", "path": "chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/", "name": "Chrome PDF Viewer", "enabled": false }, { "version": "23.0.0.162", "path": "/var/home/usuario/.config/google-chrome/PepperFlash/23.0.0.162/libpepflashplayer.so", "name": "Shockwave Flash", "enabled": true }, { "version": "1.4.8.824", "path": "/opt/google/chrome/libwidevinecdmadapter.so", "name": "Widevine Content Decryption Module", "enabled": true }, { "version": "", "path": "/opt/google/chrome/internal-nacl-plugin", "name": "Native Client", "enabled": true }, { "version": "", "path": "internal-pdf-viewer", "name": "Chrome PDF Viewer", "enabled": false }, { "name": "Adobe Flash Player", "enabled": true }, { "name": "Chrome PDF Viewer", "enabled": false }, { "name": "Native Client", "enabled": true }, { "name": "Widevine Content Decryption Module", "enabled": true } ], "last_internal_directory": "/opt/google/chrome"}' | tr -d '\n' | tr -s " " > $CONFIG.new
   if [ $? -eq 0 ]
   then
      cp -f "$CONFIG" "$CONFIG.bak2" 
      mv "$CONFIG.new" "$CONFIG"
   fi
else
   #Comprobamos si el plugin Chrome PDF Viewer está activdo, buscando enabled=true en alguna entrada del plugin. con los tr se "des-beautifica"
   salida=$(cat $CONFIG | jq '.plugins.plugins_list[] | select(.name=="Chrome PDF Viewer") | .enabled' 2> /dev/null | grep true)
   if [ "$salida" != "" ]
   then
      cat $CONFIG | jq '.plugins.plugins_list |= map(if .name=="Chrome PDF Viewer" then .enabled=false else . end)'  | tr -d '\n' | tr -s " " > $CONFIG.new
      if [ $? -eq 0 ]
      then
         cp -f "$CONFIG" "$CONFIG.bak2" 
         mv "$CONFIG.new" "$CONFIG"
      fi
   else
     echo "Ya está desactivada"
   fi
El script toma un parámetro, que sería el HOME del usuario al que queremos aplicar la desactivación del PDF Viewer de Chrome. Ya solo es cuestión de hacer un script que recorra los homes deseados y lo vaya haciendo. Incluso si ponemos el script en un crontab podemos hacerlo a diario para anular de un día para otro cualquier modificación que haga algún usuario por su cuenta.

Y ya está. Bastante mas doloroso en Chrome que en Firefox. Odio los programas que no tienen una configuración de opciones global y bloqueante. Me despido recordando que:





No hay comentarios:

Publicar un comentario