Rake api_key:get roto

Bueno, falló una instalación (mi script de instalación obtiene una clave API para poder establecer la mailgun_api_key). También lo verifiqué en mi instancia local de desarrollo.

$ rake api_key:get
rake aborted!
NoMethodError: undefined method `create_master_key' for ApiKey (call 'ApiKey.connection' to establish a connection):Class
Did you mean?  create_with
/home/pfaffman/src/discourse/lib/tasks/api.rake:5:in `block in <main>'
Tasks: TOP => api_key:get
(See full trace by running task with --trace)

Es este commit. @david

Aquí está el PR: FIX: create_master_key got renamed by pfaffman · Pull Request #8325 · discourse/discourse · GitHub

Gracias @pfaffman, he dejado un comentario en la PR

Solo verificando: ¿este es tu script personal y no el script de instalación estándar?

¡Sí! Esto no rompió una instalación normal, solo la parte de mis tareas posteriores a la instalación que necesita una clave de API para configurar mailgun_api_key.

Sospecho que pocas personas utilizan esta tarea de Rake.

:+1: Por curiosidad, ¿limpias la clave de la API cuando terminas? Es posible que hayas notado que he realizado muchos cambios recientemente para que podamos hacer un mejor seguimiento de las claves de API. Estamos intentando reducir las claves de API “no utilizadas” que quedan como posibles vulnerabilidades de seguridad.

Si esto se está ejecutando en el servidor, ¿podrías usar Ruby para configurar la opción del sitio, en lugar de generar y usar una clave de API?

¡Oh! Creo que sería mejor no cambiar la clave si ya existe o tener una tarea llamada create_if_not_exists. Es muy útil poder obtener la clave existente con una tarea de Rake sin tener que modificarla y romper nada que la esté utilizando.

En varios lugares de mis herramientas de Ansible, si no tengo la clave de API, llamo a esa tarea de Rake para obtener la existente, así:

- name: Obtener clave de API
  block:
    - shell: docker exec -w /var/www/discourse -i {{ discourse_yml }}  rake api_key:get
      register: get_api_key

    - set_fact:
        discourse_api_key: "{{ get_api_key.stdout }}"

  when: discourse_api_key is not defined

Supongo que la única vez que realmente es necesario obtenerla de esta manera es cuando estoy realizando una instalación limpia. (Para sitios existentes, tengo la clave de API en las variables de ese sitio.)

Supongo que, con la nueva forma en que se manejan las claves, podría eliminar la clave cuando termine o, por ejemplo, cambiar la configuración del sitio ejecutando un script de Rails dentro del contenedor.

Un cambio que hice es que ahora puedes tener varias claves por usuario (o varias ‘claves maestras’). Esto significa que cada integración puede recibir su propia clave, y estas se pueden auditar, revocar o eliminar por separado. Así que, en tu caso, podrías crear una clave con la descripción “herramientas de configuración de pfaffman”. De esta forma, los administradores del sitio sabrán para qué sirve y podrán revocarla o eliminarla cuando ya no sea necesaria.

En cuanto a cómo se traduce esto a una tarea de Rake… no estoy seguro. Quizás podríamos tener una tarea como api:get_or_create "mi descripción de clave" :thinking:

¿Eso funcionaría para tu caso, @pfaffman?

¡Claro! Creo que sería genial.

¿Qué les parece esto?

rake api_key:get_or_create_master["Onboarding Key"]

Si no hay objeciones, lo fusionaré en unas horas.

¡Parece bien para mí! Y mi playbook seguía abierto en mi editor, así que ya estoy comprometido. :slight_smile:

Fusionado en

Lo siento @pfaffman, pero temo que tendré que eliminar esta nueva tarea de rake en un PR próximo. Vamos a estar hasheando las claves de API en la base de datos, por lo que será fundamentalmente imposible recuperar una clave existente.

He reemplazado la tarea get_or_create_master con una tarea create_master más simple, que creará incondicionalmente una nueva clave. Si solo quieres tener una clave, entonces tendrás que hacer un seguimiento de la clave en tu propio sistema.

Sí. Ya me imaginaba que eso iba a pasar. Otros sistemas muestran la clave de la API solo una vez, así que…

¡Gracias por la alerta!

No puedo decirlo rápidamente. (Espera. ¿Cómo es que no hay un archivo schema.rb en el directorio db?)

Si ejecuto múltiples veces rake api_key:create_master['some name'] con el mismo some name, ¿fallará? Es decir, ¿ese nombre debe ser único?

Las descripciones no necesitan ser únicas, no. Aunque podría resultar bastante confuso si creas muchas claves que se ven iguales.

No hacemos commit del archivo schema.rb. El mejor lugar para buscar son las anotaciones al final de cada archivo en /app/models

Espera. ¿Qué?! ¿Desde cuándo? Cualquier commit que tengo en mi fuente actual de Discourse en mi disco duro todavía incluye schema.rb. Es realmente, realmente útil poder descubrir exactamente qué modelo estás buscando. Poder abrir un solo archivo y buscar algo (por ejemplo, para determinar qué modelo estás buscando) es mucho más fácil que buscar en más de 200 archivos en app/models. Ni siquiera hay una buena manera de hacer grep solo en el esquema al final de los modelos.

Si no sabes qué modelo estás buscando, ¿cómo puedes encontrarlo? Por ejemplo, hay varias tablas relacionadas con “auth”, y no todas comienzan con auth; ¿cómo puedes empezar a determinar dónde buscar?

Desde siempre, está en el archivo .gitignore. Pero se genera cuando ejecutas db:migrate, por eso está presente localmente.

El nombre de la tabla siempre coincide con el nombre del modelo, así que simplemente uso los nombres de los archivos :man_shrugging:

Aja. Bueno, eso demuestra lo que sé. :wink gracias por la explicación.

A veces no puedo adivinar el nombre de la tabla o el modelo, así que tener todos los campos en un solo lugar es de gran ayuda.