Septiembre
2006
El maravilloso mundo de xauth y MIT-MAGIC-COOKIE
Si normalmente leeis este humilde blog, habreis visto que una de las últimas mejoras de TCOS es el acceso a dispositivos extraibles en el terminal mediante una mezcla (bastante rara) de udev, shell scripts, XMLRC y python.
Pues bien tcos-devices, que dista mucho de ser perfecto, tenía algún fallo que he ido descubiendo poco a poco:
No es muy usual que una partición de las memorias USB tenga etiqueta así que el punto de montaje será primero la etiqueta y si no el fabricante (siguiendo la regla anterior)
Para el tema de autenticación es donde más horas de neuronas he metido, no sirve la misma autenticación de tcosmonitor ya que el usuario y contraseña son de administrador de todos los terminales (habría que duplicar por todas las home de usuarios y sería muuuuyyyy inseguro), así que tenía que pensar otro método rápido que comprobase si la persona que intenta usar el disquete está sentado delante del equipo donde ha metido el disquete (esto en PXES es como la casa de «tocameroque», ya que metes el disquete en un terminal y lo puedes leer desde cualquiera, cosas de "sambas" mal configurados...)
Pensando otras formas me acordé que ltspfs usa la cookie de las X, he leido montones de páginas man (xauth, Xserver, mcookie, Xauth, Xau, Xsecurity) y algunas webs [1], y ya lo refinitivo, el código fuente de varios paquetes: libxau6, mtools, floppyd.... Total que al final he decidido usar parte de ltspfsd pero sin sockets, una función simple que reciba una cookie, la guarde en un archivo temporal exporte la variable de entorno XAUTHORITY a ese archivo temporal e intente conectarse mediante XOpenDisplay, si conecta se deja usar USB, disquetes, cdrom, sino se devuelve un error. Al final el código de xauth no ha quedado muy mal... En el terminal y por medio de python se captura la cookie de sessión y se procesa con una nueva clase TcosXauth.py
Al obligar a la autenticación, la cantidad de datos que se envian y reciben aumenta por lo que he tenido que disminuir el intervalo de escaneo del demonio USB, a 3 segundos, que en el peor de los casos ese será el retraso entre enchufar un pendrive y que empiece a detectarlo, en el mejor de los casos puede ser 0.
Resumen de la autenticación:
Pues bien tcos-devices, que dista mucho de ser perfecto, tenía algún fallo que he ido descubiendo poco a poco:
- Memorias USB con más de una partición
- Memorias sin etiqueta (LABEL)
- Autenticación
- Refresco de 1 segundo, mucha carga
No es muy usual que una partición de las memorias USB tenga etiqueta así que el punto de montaje será primero la etiqueta y si no el fabricante (siguiendo la regla anterior)
Para el tema de autenticación es donde más horas de neuronas he metido, no sirve la misma autenticación de tcosmonitor ya que el usuario y contraseña son de administrador de todos los terminales (habría que duplicar por todas las home de usuarios y sería muuuuyyyy inseguro), así que tenía que pensar otro método rápido que comprobase si la persona que intenta usar el disquete está sentado delante del equipo donde ha metido el disquete (esto en PXES es como la casa de «tocameroque», ya que metes el disquete en un terminal y lo puedes leer desde cualquiera, cosas de "sambas" mal configurados...)
Pensando otras formas me acordé que ltspfs usa la cookie de las X, he leido montones de páginas man (xauth, Xserver, mcookie, Xauth, Xau, Xsecurity) y algunas webs [1], y ya lo refinitivo, el código fuente de varios paquetes: libxau6, mtools, floppyd.... Total que al final he decidido usar parte de ltspfsd pero sin sockets, una función simple que reciba una cookie, la guarde en un archivo temporal exporte la variable de entorno XAUTHORITY a ese archivo temporal e intente conectarse mediante XOpenDisplay, si conecta se deja usar USB, disquetes, cdrom, sino se devuelve un error. Al final el código de xauth no ha quedado muy mal... En el terminal y por medio de python se captura la cookie de sessión y se procesa con una nueva clase TcosXauth.py
Al obligar a la autenticación, la cantidad de datos que se envian y reciben aumenta por lo que he tenido que disminuir el intervalo de escaneo del demonio USB, a 3 segundos, que en el peor de los casos ese será el retraso entre enchufar un pendrive y que empiece a detectarlo, en el mejor de los casos puede ser 0.
Resumen de la autenticación:
- tcos-devices, por medio de TcosXauth lee la cookie que coincida con su $DISPLAY
- Prueba a conectarse con ella con la función TcosXauth::test_auth()
- tcosxmlrpc recibe esa cookie y el hostname, crea un archivo .Xauthority temporal e intenta abrir la pantalla
- Si falla devuelve error, en caso contrario devuelve OK.
- Si falla la xauth tcos-devices se cierra sino empieza a ejecutarse el demonio
- Cada 3 segundos (intervalo sujeto a cambios) tcos-devices le pide a tcosxmlrpc un resumen de los eventos USB de udev
- tcosxmlrpc lo envía, si está vacío se esperan otros 3 segundos, sino se buscan los eventos programados (básicamente BUS=usb y ACTION=add/remove)
- Se lanza el evento que corresponda en un hilo (thread) así si tiene un problema no congela el demonio o no lo cierra.
- El evento termina y se guarda en un diccionario el dispositivo y el punto de montaje para cuando se desmonte.
- Vuelta a empezar....
Sonido en Red. Guardianes. Y gestión de dispositivos en red, incluso USB pendrives!
Enhorabuena. Dentro de poco el TCOS superará al PXES con creces.
adrian15