Introducción
El Acumatica Hackathon anual es el principal evento para muchos de los desarrolladores más ávidos de la comunidad de Acumatica. Los desarrolladores y no desarrolladores de todo el mundo acudieron al Wynn Las Vegas para participar en este evento, muy apreciado por sus desafiantes competiciones, sus oportunidades de establecer contactos y sus intensas experiencias de aprendizaje. Como era de esperar, el evento ofreció todo el desafío, la diversión y las oportunidades de aprendizaje en un apretado paquete de 24 horas.
Basándonos en el interés recibido por parte de la comunidad, Gerhard van den Heever, del equipo Theta, y yo compartiremos algunos de los mecanismos internos de Acumatica Centurion que contribuyeron a que fuera votado como el proyecto ganador del 2022 Acumatica Hackathon. En este post, compartiré cómo Centurion intercepta las cargas de archivos y algunos detalles sobre las API de Cloudmersive utilizadas para el análisis de inteligencia artificial de los archivos adjuntos. En un post posterior, Gerhard explicará cómo la aplicación cliente de servicios web permite la carga masiva de archivos desde una carpeta del PC local.
Desde los albores del ordenador personal, archivos desagradables han llegado a los tablones de anuncios de acceso telefónico, a los modernos sitios web de Internet e incluso a los sistemas de las empresas. Tanto si contienen cargas útiles de virus como imágenes objetables, las empresas han luchado durante décadas para establecer políticas y protocolos que limiten la proliferación y la responsabilidad de los "archivos dañinos" en sus sistemas. En el mundo pospandémico, en el que muchos oficinistas tradicionales han abandonado la oficina y ahora trabajan desde el rincón de un dormitorio o del salón, el temor a ser descubiertos disminuye a medida que las acciones de los trabajadores se ocultan tras las paredes de sus hogares. Incluso desde los titulares de las noticias, recientemente se ha aprobado en el comité judicial del Senado un proyecto de ley contra el cifrado que amenaza con responsabilizar a las empresas de los archivos subidos a sus servidores. Lee más sobre la historia aquí.
¿Cómo pueden protegerse los clientes de Acumatica de todos estos riesgos? El equipo Theta respondió a la llamada creando Acumatica Centurion para ayudar a las empresas a protegerse.
Acumatica Centurion es un proyecto que intercepta las cargas de archivos y aprovecha la IA de Cloudmersive mediante llamadas a la API para sondear el contenido de los archivos y realizar determinadas acciones administrativas. Aunque Team Theta seleccionó escaneos de imágenes NSFW (Not Safe For Work), escaneos de virus y redimensionamiento de imágenes, las acciones implementadas son una pequeña representación de la gran cantidad de herramientas que se pueden aplicar. Cuando la carga de una imagen no pasa la comprobación NSFW, se genera una notificación para solicitar una respuesta del mundo real a una condición detectada por AI.
Acumatica Centurion está disponible en GitHub en la rama 2021R2 de: AcumaticaHackathon/2022-Team-Theta (github.com)
Aunque no todos los componentes se explicarán aquí, la Personalización de Acumatica contiene:
- Pantalla de configuración para guardar la clave API de Cloudmersive
- Pantalla de entrada de datos para los registros de marcadores de posición para los archivos adjuntos de carga masiva
- Extensión gráfica UploadFileMaint para interceptar las cargas de archivos antes de persistir en la base de datos
- Métodos de llamada a la API de Cloudmersive para facilitar el análisis de archivos
- IG, evento y plantilla de notificación para notificar las condiciones supervisadas que se produzcan
- Varios DAC subyacentes, gráficos y métodos
- Cloudmersive Image Recognition and Virus Scan NuGet packages (Se requiere una cuenta gratuita de Cloudmersive para obtener una clave gratuita de uso limitado).
El puesto de guardia
Acumatica Centurion hace guardia en una extensión del gráfico UploadFileMaintenace. Al anular Persist, podemos analizar el archivo adjunto, alterarlo si es necesario y actualizar el registro del archivo adjunto con un comentario que refleje los resultados del análisis y/o la alteración. Aunque no está escrito como tal en el código, un fallo del análisis de virus o una clasificación devuelta de NSFW (Not Safe for Work) podría utilizarse para desviar el adjunto a otro lugar u omitir la ejecución del Persist base. Dado que esto se ejecuta en un LongOperation, no se puede simplemente lanzar una PXException para devolver un mensaje a la pantalla. Sin embargo, lanzar una excepción SI hace que el adjunto se pierda y no se guarde en la base de datos.
A la hora de examinar el código, algunos puntos centrales son:
- Línea 16 - Cree una vista de Configuración para acceder a la Clave API de Cloudmersive almacenada en la pantalla de Preferencias TT.
- Línea 31 - Obtener el registro TTSetup y extraer la clave API.
- Línea 35 - Recorre todos los registros almacenados en caché en la vista Archivos.
- Línea 39 - Extraer el archivo adjunto en una matriz binaria.
- Líneas 46, 50 y 64 - Configure el campo de comentarios en función de los resultados del análisis.
- Líneas 45 y 49 - Utiliza la API para clasificar una imagen y devolver una descripción de la misma.
- Línea 55 - Utilice la API para cambiar el tamaño de la imagen.
- Línea 61 - Utiliza la API para escanear el archivo en busca de virus.
- Línea 75 - Invocar el método Persist original a través del delegado.
A continuación se muestra el fragmento de código descrito anteriormente:
GIST: https://gist.github.com/BrianMRO/682d869ef0baa357509e6d88b3ab0528
Hacer la llamada
Cloudmersive proporciona una gran biblioteca de API interesantes. El equipo Theta seleccionó Cloudmersive para el componente NSFW del paquete de reconocimiento de imágenes que puede instalarse a través de NuGet. Aunque en un principio esperábamos que Gerhard dirigiera el desarrollo de las llamadas al servicio web, descubrió en la documentación que se proporcionaban ejemplos de código de .Net Framework que sólo necesitaban su propia clave API de su cuenta para funcionar. Esto trasladó el desarrollo a mí (Brian). Con la dolorosa conciencia de que nuestro tiempo de presentación sería limitado, seleccionamos 4 llamadas API a través de 2 paquetes NuGet. Aunque las API externas han desempeñado un papel importante en los Hackathons durante años, las llamadas a las API no pretendían ser nuestro punto central. En su lugar, simplemente añadirían profundidad al proyecto realizando acciones una vez que interceptáramos los archivos adjuntos. Esto, por supuesto, da lugar a una demo mucho más interesante para demostrar un conjunto de reglas para el análisis de IA. La clasificación de imágenes para evaluar si son NSFW nos dio un caso plausible para notificar a un administrador que tomara medidas, lo que de nuevo añadiría profundidad a la presentación.
Aunque el código es bastante fácil de leer con los comentarios que le guían a través de los puntos principales, hemos hecho un par de cambios importantes en los ejemplos de código proporcionados por Cloudmersive. En primer lugar, hicimos estos métodos estáticos públicos para simplificar su llamada. También hemos añadido parámetros para la clave API y la matriz de bytes que contiene los datos, ya que los ejemplos creaban flujos desde un archivo local. En su lugar, necesitamos procesar el array de bytes y convertirlo en un System.IO.MemoryStream. Además, devolvíamos una cadena para la modificación del comentario, un bool para indicar el éxito, o un array de bytes si modificábamos el adjunto. Por último, cambiamos la salida a través de Debug para utilizar los mensajes PXTrace estándar de Acumatica.
Este es el fragmento de código:
GIST: https://gist.github.com/BrianMRO/7f1ce5d8717deb342e87a23b96251ffa
Dar la alarma
Como no hay centurión que se precie que no dé la alarma cuando le atacan, Christina creó una notificación para el administrador cuando la IA de Cloudmersive detectaba una imagen clasificada como NSFW. (Para divertirnos un poco sutilmente, lo cambiamos por No seguro para Acumatica, o NSFA). Cuando una imagen se devolvía como NSFA o "picante" por clasificación, anteponíamos al valor del campo UploadFile.Comment [NSFA] o [Racy] respectivamente. Christina configuró una Consulta Genérica (IG) para informar de todos los registros UploadFileRevision con un comentario que comenzaba por[NSFA]. Se utilizó UploadFileRevision porque UploadFile. Comment estaba en blanco a través de la GI, y encontramos los datos en UploadFileRevision de forma coherente. Después de crear una plantilla de notificación y un evento de negocio en la creación de un registro supervisado por la IG, el administrador podría ser notificado y enviado a investigar.
Disección de un centurión - Parte 2
En la parte 2, Gerhard nos da una mirada bajo el capó en el cargador masivo utilizado en la demo para probar los servicios web de carga de archivos mediante la recuperación de todos los archivos de una carpeta y empujándolos en Acumatica. Puede leer la parte 2 aquí.
Hasta entonces, ¡feliz codificación!