El desarrollo de complementos es una alegría y un dolor. Lo bueno es que puede implementarlo a través de complementos según sus propias necesidades, como el desarrollo de complementos de Chrome que ve a menudo. Los complementos son de gran beneficio para la ecología nativa de la aplicación y, a menudo, esos complementos particularmente excelentes incluso se incluyen oficialmente o las funciones de los complementos se agregan a las funciones oficiales. El dolor es que necesita ir a la documentación, mirar la documentación diversa para el desarrollo de complementos, si la documentación no está detallada, el dolor se duplica. Lo más molesto para los programadores es leer los documentos de otras personas y escribir sus propios documentos. Por supuesto, además de documentación, como novato, también pisarás todo tipo de fosos.

tucao primero

Durante el período del Primero de Mayo, la epidemia fue realmente aburrida, así que se me ocurrió la idea de escribir un complemento para la detección de SCA en Goland. Como empresa de desarrollo de IDE, Jetbrains ha desarrollado productos IDE tan hermosos y potentes como la serie de cubos de la familia IDEA a través de la ecología del lenguaje Java. Las capacidades técnicas detrás de esto tienen que ser convincentes. IDE es la productividad del desarrollo de programadores y Jetbrains es la productividad de la productividad. En los últimos días, el autor está trabajando arduamente para desarrollar un primer complemento de detección de SCA para Goland. En comparación con el desarrollo anterior de complementos de Chrome o Burp, la dificultad del desarrollo de complementos de Jetbrains ha mejorado considerablemente, principalmente por las siguientes razones:

La documentación de la API es demasiado simplista

IntelliJ solo proporciona direcciones de documentación oficial. Esto contiene algo de implementación e introducción de API, pero es demasiado simple. Casi no hay código de ejemplo para la implementación relevante en todo el artículo, por lo general, solo se introducen unas pocas palabras. Por ejemplo, espero poder crear archivos a través de complementos.Después de buscar en la documentación oficial, solo encontré lo siguiente:

imagen

La documentación menciona  PsiDirectory que el  add método in se puede usar para guardar  el PSI archivo, ¡pero no dice CÓMO! Qué hacer entonces, solo puede ir a Github para buscar palabras clave del código y luego raspar el código de otras personas para ver cómo lo implementan otros Este es definitivamente un proceso muy doloroso, especialmente si está buscando un complemento con una mala implementación. .

Complejidad de la API

Debido a la poderosa ecología de IDEA, su API debe considerar la compatibilidad y muchas funciones, por lo que muchos de los significados de la API no son fáciles de entender. También contiene muchos elementos de configuración complejos y, al mismo tiempo, es necesario considerar de manera integral la forma en que se implementa el complemento.

Plantilla oficial demasiado "poderosa"

El funcionario proporciona una plantilla para crear complementos. Lo primero que hay que admitir es que esta plantilla es muy poderosa y cubre todo el ciclo de vida del desarrollo de complementos, pruebas unitarias, control de calidad, publicación y se integra a la perfección con Github. Pero como plantilla, ¿contiene demasiado contenido? Después de leer el LÉAME de esta plantilla casi tres veces, me di cuenta de lo que contiene. De hecho, para un novato, este proceso es bastante doloroso, y algunas personas pueden incluso sentir la necesidad de retirarse después de verlo. Algunos de los módulos que contiene, como el módulo de prueba unitaria y el módulo de verificación de cobertura, se pueden usar como opciones y no es necesario que se incluyan de forma predeterminada.

Errores un poco más

No se ha determinado si esto es un error, pero dudo seriamente que lo sea. La plantilla mencionada anteriormente implementa una serie de tareas a través de Gradle. En  Run Verifications , hay una pequeña tarea  ./gradlew listProductsReleasesbuild generará un archivo en  listProductsReleases.txt el archivo. Y la versión de este archivo debería funcionar para las comprobaciones de compatibilidad con IDE. Pero en el proceso de ejecutar esta tarea, se encuentra repetidamente el siguiente error:

imagen

El error de esta tarea se debe a la imposibilidad de descargar  GO-2021.1.4 la versión del IDE. Según tengo entendido, esta versión debe ser la versión correspondiente a Goland, y la versión de IDEA puede consultar la página de lista de versiones oficiales. El enlace en el informe de errores es la información de publicación de cada IDEA.

imagen

En la información de lanzamiento de Go, realmente no veo  2021.1.4 la información de la versión, y se  listProductsRelases genera este número de versión. Y es imposible saber cuál es el principio de esta generación. En una tarde de intentos continuos, finalmente encontré que la información de esta versión está relacionada con gradle.properties  , pluginSinceBuild y  pluginUntilBuild finalmente ubiqué que fue causado por  pluginSinceBuild = 211 este elemento de configuración, y finalmente cambié el número de versión a 212, y  2021.1.4 esta versión no se generó. La configuración de la información de esta versión la proporciona la configuración de la plantilla oficial, y algunos complementos usan la misma configuración en Github, por lo que actualmente se sospecha que esto se debe a un error oficial.

Esto ahora ha sido confirmado oficialmente como un error. Sin embargo, el impacto de este error aún es relativamente grande, porque se debe verificar la compatibilidad del complemento antes de su lanzamiento, pero en la actualidad no puede pasar la verificación de compatibilidad de la última versión de Goland, lo que resultará en el complemento. -en no poder ser utilizado en la última versión.

Más tarde, me encontré con un error muy extraño.Al principio, se encontró que  map no se podía obtener en el código. Después de dar vueltas por un tiempo, descubrí que  Run Plugin el complemento no se recompilaba cada vez. La consecuencia de esto es que después de modificar el código, el código modificado no surte efecto. Este problema también se identificó como un error en el complemento gradle-intellij. Hasta ahora, hay dos errores en esta plantilla de complemento. De hecho  changelog , también hay un pequeño error, pero no se mencionará porque no afecta particularmente el uso.

imagenPor supuesto, Jetrains YYDS, a pesar de las deficiencias anteriores, no oculta las fallas, y las funciones de los complementos ecológicos de IDEA siguen siendo muy poderosas. Además, después de pasar por el foso, la plantilla oficial le brinda todo tipo de conveniencia, lo que le permite disfrutar de un servicio integral desde el desarrollo hasta el lanzamiento. A continuación, comienza el verdadero viaje del desarrollo de este plug-in de Goland.

SCA

Lu Xun dijo una vez que un buen programador definitivamente leerá el código fuente de otras personas. Al igual que el famoso dicho de Newton, pararse sobre los hombros de gigantes es lo mismo. En el proceso de desarrollo de complementos, sin duda es necesario aprender de cómo se desarrollan otros complementos. El proyecto oficial proporciona una muestra, pero las funciones implementadas en él son muy simples.

https://github.com/JetBrains/intellij-samples

Para la resolución de las dependencias del proyecto Go, debe  go.mod analizar el archivo para obtenerlo. Tomando gobuster como ejemplo, su  go.mod definición es la siguiente:

module github.com/OJ/gobuster/v3

require (
github.com/google/uuid v1.2.0
github.com/spf13/cobra v1.1.3
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83 // indirect
golang.org/x/term v0.0.0-20210422114643-f5beecf764ed
)

go 1.16

require El contenido definido en son las dependencias del proyecto y sus correspondientes versiones. Entonces, el enfoque del complemento es resolver las dependencias y las versiones correspondientes. Consultando  https://deps.dev/ si la versión del componente correspondiente tiene una vulnerabilidad de seguridad. La otra parte es analizar los resultados y mostrarlos. La idea original era  JPanel mostrarlo a través, pero se encontró que era más laborioso. Posteriormente, se generó un archivo de informe en formato Markdown. El efecto de visualización es el siguiente:

# github.com/madneal/gshark  v0.2
## GO-2020-0048
## Overview
Source: OSVID: GO-2020-0048Aliases: CVE-2020-25614## Desciption
[`LoadURL`] does not check the Content-Type of loaded resources,which can cause a panic due to nil pointer deference if the loadedresource is not XML. If user supplied URLs are loaded, this may beused as a denial of service vector.## Impact
Severity: UNKNOWNReferences:

* https://github.com/antchfx/xmlquery/commit/5648b2f39e8d5d3fc903c45a4f1274829df71821 * https://github.com/antchfx/xmlquery/issues/39 * https://go.googlesource.com/vulndb/+/refs/heads/master/reports/GO-2020-0048.yaml * https://storage.googleapis.com/go-vulndb/byID/GO-2020-0048.json

Desarrollo de complementos

El principio de la detección de SCA es básicamente el anterior, y la parte más compleja del desarrollo de complementos es la parte de ingeniería del desarrollo de complementos. intellij-platform-plugin-template es una plantilla para el desarrollo de complementos. A través del complemento,  README puede comprender el contenido de este complemento. Esta plantilla también incluye procesos de configuración, desarrollo, pruebas unitarias, reforma del uso compartido de pruebas, CI y lanzamiento. Use this template Puedes crear tus propios proyectos a través de esta plantilla directamente desde Github  . El lenguaje de desarrollo predeterminado para las plantillas es kotlin y, por supuesto, también se puede seleccionar Java. Pero no hay duda de que esta es una buena oportunidad para aprender un nuevo idioma, así que opta por seguir usando kotlin.

imagen

La parte principal de la implementación del complemento de función es activar la acción definiendo una nueva Acción. Se basa principalmente en  PSI la API para obtener  go.mod archivos para la detección de SCA.

var modFiles = FilenameIndex.getFilesByName(project, "go.mod", GlobalSearchScope.projectScope(project))

Luego pase  directory a crear el archivo de informe.

var psiFileFactory = PsiFileFactory.getInstance(project)
val createFileFromText = psiFileFactory.createFileFromText("sca.md", result)
var directory = modFile.containingDirectory
directory.add(createFileFromText)

action La definición de está en el  plugin.xml archivo, se puede agregar  action y agregar a la barra de menú.

<actions>
<group id="Myplugin.CheckMenu" text="SCA Checker" description="Software component analysis">
<add-to-group group-id="MainMenu" anchor="last"></add-to-group>
<action class="com.github.madneal.secdog.DependencyCheck" id="Myplugin.Checker" text="SCA Check"></action>
</group>
</actions>

En la  .run carpeta puede ver las siguientes tareas:

imagen

Run Plugin A menudo se usa en tareas de desarrollo.Después de ejecutar la tarea, se creará un entorno IDE para ejecutar, y también se puede usar directamente para la depuración. El proceso de depuración también es muy conveniente, simplemente rompiendo el punto. Para la definición de tarea, consulte la definición de tarea en gradle-intellij-plugin. buildPlugin Se crea un archivo zip del complemento correspondiente en  build la carpeta.

Los elementos de configuración en gradle.properties también juegan un papel importante. El elemento de configuración predeterminado en la plantilla es  platformType = IC, para Goland debe modificarse a  GO. Y   es un   elemento de configuración pluginSinceBuild más  importante.pluginUntilBuildRun Verifictions

Además  .github , también vale la pena hablar sobre el flujo de trabajo. En  template-cleanup.yml , he estado recibiendo un error:

imagen

Este trabajo se utiliza principalmente para reemplazar los elementos de configuración predeterminados en la plantilla anterior. De hecho, este problema se debe principalmente a la configuración en Acciones en el almacén. La configuración predeterminada no permite permisos de escritura.

imagen

Una vez que se completa el trabajo, el nombre del paquete y el nombre del complemento del repositorio se modificarán en consecuencia. Al mismo tiempo, si desea publicar complementos a través de Github, debe configurar los siguientes elementos de configuración.

imagen

Hasta ahora, el proceso de desarrollo y lanzamiento de complementos está básicamente completado, y el proceso de lanzamiento posterior es relativamente simple. Las plantillas también brindan la capacidad de publicar y actualizar a través de Release  CHANGELOG.md .

Los complementos se pueden instalar a través del mercado de aplicaciones o archivos zip en versiones. El uso del complemento se puede ejecutar haciendo clic  SCA Checker en la  barra de menú SCA Check o invocarlo directamente  action para activarlo. La instalación y el uso del complemento pueden consultar este video instructivo.

imagen

imagen

Resumir

No hay duda de que el proceso de desarrollo de este complemento sigue siendo tortuoso y se han encontrado varios problemas en el proceso de desarrollo del complemento. El estado actual del complemento aún es muy preliminar, y en el futuro se llevará a cabo una mayor optimización de las funciones del complemento, e incluso se ampliará el alcance de las funciones cubiertas por el complemento, como cubrir los problemas de seguridad del código en Golang.

Referencias:

  • https://developerlife.com/2021/03/13/ij-idea-plugin-advanced/#generate-psi-elements-from-text

  • https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html#intellij-platform-based-products-of-recent-ide-versions

  • https://data.services.jetbrains.com/products?code=DG%2CPS%2CDL%2CMPS%2CMPSIIP%2CRDCPPP%2CWS%2CAC%2CIIC%2CIIE%2CGO%2CCL%2CPCD%2CPCC%2CRD%2CPCE%2CIIU% 2CRM%2CPCP&fields=código%2Cname%2Creleases.downloads%2Creleases.version%2Creleases.build%2Creleases.type

  • https://github.com/JetBrains/intellij-platform-plugin-template

  • https://github.com/JetBrains/gradle-intellij-plugin

  • https://plugins.jetbrains.com/intellij-platform-explorer/extensions