FEATURE: site settings to revoke api keys older than a number of days (#23595)

* FEATURE: site settings to revoke api keys older than a number of days
This commit is contained in:
Renato Atilio 2023-09-15 16:31:29 -03:00 committed by GitHub
parent c8fff19b99
commit d93c2cb3d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 207 additions and 86 deletions

View File

@ -1,17 +0,0 @@
# frozen_string_literal: true
module Jobs
class AutoExpireUserApiKeys < ::Jobs::Scheduled
every 1.day
def execute(args)
if SiteSetting.expire_user_api_keys_days > 0
expire_user_api_keys_days = SiteSetting.expire_user_api_keys_days.days.ago
UserApiKey.where("last_used_at < ?", expire_user_api_keys_days).update_all(
revoked_at: Time.zone.now,
)
end
end
end
end

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
module Jobs
class CleanUpApiKeysMaxLife < ::Jobs::Scheduled
every 1.day
def execute(args)
ApiKey.revoke_max_life_keys!
end
end
end

View File

@ -0,0 +1,18 @@
# frozen_string_literal: true
module Jobs
class CleanUpUnusedUserApiKeys < ::Jobs::Scheduled
every 1.day
def execute(args)
if SiteSetting.revoke_user_api_keys_unused_days > 0
revoke_days_ago = SiteSetting.revoke_user_api_keys_unused_days.days.ago
UserApiKey
.active
.where("last_used_at < ?", revoke_days_ago)
.update_all(revoked_at: Time.zone.now)
end
end
end
end

View File

@ -0,0 +1,18 @@
# frozen_string_literal: true
module Jobs
class CleanUpUserApiKeysMaxLife < ::Jobs::Scheduled
every 1.day
def execute(args)
if SiteSetting.revoke_user_api_keys_maxlife_days > 0
revoke_days_ago = SiteSetting.revoke_user_api_keys_maxlife_days.days.ago
UserApiKey
.active
.where("created_at < ?", revoke_days_ago)
.update_all(revoked_at: Time.zone.now)
end
end
end
end

View File

@ -45,12 +45,12 @@ class ApiKey < ActiveRecord::Base
end
def self.revoke_unused_keys!
return if SiteSetting.revoke_api_keys_days == 0 # Never expire keys
return if SiteSetting.revoke_api_keys_unused_days == 0 # Never expire keys
to_revoke =
active.where(
"GREATEST(last_used_at, created_at, updated_at, :epoch) < :threshold",
epoch: last_used_epoch,
threshold: SiteSetting.revoke_api_keys_days.days.ago,
threshold: SiteSetting.revoke_api_keys_unused_days.days.ago,
)
to_revoke.find_each do |api_key|
@ -64,7 +64,31 @@ class ApiKey < ActiveRecord::Base
context:
I18n.t(
"staff_action_logs.api_key.automatic_revoked",
count: SiteSetting.revoke_api_keys_days,
count: SiteSetting.revoke_api_keys_unused_days,
),
)
end
end
end
def self.revoke_max_life_keys!
return if SiteSetting.revoke_api_keys_maxlife_days == 0
revoke_days_ago = SiteSetting.revoke_api_keys_maxlife_days.days.ago
to_revoke = ApiKey.active.where("created_at < ?", revoke_days_ago)
to_revoke.find_each do |api_key|
ApiKey.transaction do
api_key.update!(revoked_at: Time.zone.now)
StaffActionLogger.new(Discourse.system_user).log_api_key(
api_key,
UserHistory.actions[:api_key_update],
changes: api_key.saved_changes,
context:
I18n.t(
"staff_action_logs.api_key.automatic_revoked_max_life",
count: SiteSetting.revoke_api_keys_maxlife_days,
),
)
end

View File

@ -2335,14 +2335,14 @@ ar:
default_sidebar_switch_panel_position: "موضع أزرار لوحة تبديل الشريط الجانبي"
retain_web_hook_events_period_days: "عدد أيام الاحتفاظ بسجلات أحداث خطافات الويب"
retry_web_hook_events: "إعادة المحاولة تلقائيًا 4 مرات لأحداث خطافات الويب التي فشلت. الفجوات الزمنية بين مرات إعادة المحاولة هي 1 و5 و25 و125 دقيقة."
revoke_api_keys_days: "عدد الأيام قبل إلغاء مفتاح API غير المُستخدَم تلقائيًا (0 للتعيين على \"أبدًا\")"
revoke_api_keys_unused_days: "عدد الأيام قبل إلغاء مفتاح API غير المُستخدَم تلقائيًا (0 للتعيين على \"أبدًا\")"
allow_user_api_key_scopes: "قائمة النطاقات المسموح بها لمفاتيح API للمستخدم"
min_trust_level_for_user_api_key: |
مستوى الثقة المطلوب لإنشاء مفاتيح واجهة برمجة تطبيقات المستخدم<br>
<b>تحذير</b>: سيؤدي تغيير مستوى الثقة إلى منع المستخدمين في مستويات الثقة الأقل من تسجيل الدخول عبر Discourse Hub
allowed_user_api_auth_redirects: "عنوان URL المسموح به لإعادة توجيه المصادقة لمفاتيح API للمستخدم. يمكن استخدام رمز البدل * لمطابقة أي جزء منه (على سبيل المثال،www.example.com/*)."
allowed_user_api_push_urls: "عناوين URL المسموح لها بإرسال المعلومات إلى API للمستخدم قبل طلبها من الخادم"
expire_user_api_keys_days: "عدد الأيام قبل انتهاء صلاحية مفتاح API للمستخدم تلقائيًا (0 للتعيين على \"أبدًا\")"
revoke_user_api_keys_unused_days: "عدد الأيام قبل انتهاء صلاحية مفتاح API للمستخدم تلقائيًا (0 للتعيين على \"أبدًا\")"
tagging_enabled: "السماح بالوسوم في الموضوعات؟"
min_trust_to_create_tag: "الحد الأدنى لمستوى الثقة المطلوب لإنشاء وسم"
max_tags_per_topic: "الحد الأقصى لعدد الوسوم التي يمكن تطبيقها على موضوع"

View File

@ -1609,11 +1609,11 @@ ca:
default_title_count_mode: "Mode predeterminat per al comptador de títols de la pàgina"
retain_web_hook_events_period_days: "Nombre de dies per a conservar els registres d'esdeveniments webhook."
retry_web_hook_events: "Reintenta automàticament quatre vegades els esdeveniments webhook fallits. Els intervals de temps entre els reintents són 1, 5, 25 i 125 minuts."
revoke_api_keys_days: "Nombre de dies abans que una clau dAPI no utilitzada sigui revocada automàticament (0 per a mai)"
revoke_api_keys_unused_days: "Nombre de dies abans que una clau dAPI no utilitzada sigui revocada automàticament (0 per a mai)"
allow_user_api_key_scopes: "Llista d'àmbits permesos per a les claus d'API d'usuari"
allowed_user_api_auth_redirects: "URL permès per a la redirecció d'autenticació per a les claus de l'API d'usuari. El símbol de comodí * es pot utilitzar per a fer coincidir qualsevol part de l'URL (p. ex. www.example.com/*)."
allowed_user_api_push_urls: "Adreces URL permeses per al 'server push' a l'API d'usuari"
expire_user_api_keys_days: "Nombre de dies abans de l'extinció automàtica d'una clau d'API d'usuari (0 vol dir mai)"
revoke_user_api_keys_unused_days: "Nombre de dies abans de l'extinció automàtica d'una clau d'API d'usuari (0 vol dir mai)"
tagging_enabled: "Voleu activar les etiquetes en temes?"
min_trust_to_create_tag: "Nivell mínim de confiança necessari per a crear una etiqueta."
max_tags_per_topic: "Nombre màxim d'etiquetes que es poden aplicar a un tema."

View File

@ -1620,7 +1620,7 @@ da:
default_tags_muted: "Liste over mærker, der er tavse som standard."
default_tags_watching_first_post: "Liste over mærker, hvor første indlæg i hvert nyt emne vil blive overvåget som standard."
allow_user_api_key_scopes: "Liste over tilladte anvendelsesområder for bruger-API-nøgler"
expire_user_api_keys_days: "Antal dage før en bruger API-nøgle automatisk udløber (0 for aldrig)"
revoke_user_api_keys_unused_days: "Antal dage før en bruger API-nøgle automatisk udløber (0 for aldrig)"
tagging_enabled: "Aktivér mærker på emner?"
max_tags_per_topic: "Det maksimale antal mærker, der kan anvendes i et emne."
max_tag_search_results: "Ved søger efter mærker, skal der maksimalt vises følgende antal resultater."

View File

@ -2123,14 +2123,14 @@ de:
default_sidebar_switch_panel_position: "Position der Panel-Umschaltschaltflächen in der Seitenleiste"
retain_web_hook_events_period_days: "Anzahl an Tagen, die Webhook-Ereigniseinträge aufbewahrt werden."
retry_web_hook_events: "Fehlgeschlagene Webhook-Ereignisse automatisch 4 Mal erneut versuchen. Die Wartezeiten zwischen den Versuchen betragen eine, 5, 25 und 125 Minuten."
revoke_api_keys_days: "Anzahl der Tage, bevor ein nicht verwendeter API-Schlüssel automatisch widerrufen wird (0 für niemals)"
revoke_api_keys_unused_days: "Anzahl der Tage, bevor ein nicht verwendeter API-Schlüssel automatisch widerrufen wird (0 für niemals)"
allow_user_api_key_scopes: "Liste erlaubter Bereiche für Benutzer-API-Schlüssel"
min_trust_level_for_user_api_key: |
Vertrauensstufe, die für die Generierung von Benutzer-API-Schlüsseln erforderlich ist.<br>
<b>WARNUNG</b>: Die Änderung der Vertrauensstufe verhindert, dass sich Benutzer mit einer niedrigeren Vertrauensstufe über Discourse Hub anmelden können.
allowed_user_api_auth_redirects: "Zulässige URL für Authentifizierungs-Umleitung für Benutzer-API-Schlüssel. Das Platzhaltersymbol * kann verwendet werden, um jeden Bestandteil der Adresse zu ersetzen (z. B. www.example.com/*)."
allowed_user_api_push_urls: "Erlaubte URLs für Server-Push zur Benutzer-API"
expire_user_api_keys_days: "Anzahl der Tage, bevor ein Benutzer-API-Schlüssel automatisch abläuft (0 für niemals)"
revoke_user_api_keys_unused_days: "Anzahl der Tage, bevor ein Benutzer-API-Schlüssel automatisch abläuft (0 für niemals)"
tagging_enabled: "Schlagwörter für Themen aktivieren?"
min_trust_to_create_tag: "Minimale Vertrauensstufe, um ein Schlagwort zu erstellen."
max_tags_per_topic: "Maximale Anzahl an Schlagwörtern, die einem Thema hinzugefügt werden können."

View File

@ -2369,7 +2369,8 @@ en:
retain_web_hook_events_period_days: "Number of days to retain web hook event records."
retry_web_hook_events: "Automatically retry failed web hook events for 4 times. Time gaps between the retries are 1, 5, 25 and 125 minutes."
revoke_api_keys_days: "Number of days before an unused API key is automatically revoked (0 for never)"
revoke_api_keys_unused_days: "Number of days since an API key was last used before it is automatically revoked (0 for never)"
revoke_api_keys_maxlife_days: "Number of days before an API key is automatically revoked (0 for never)"
allow_user_api_key_scopes: "List of scopes allowed for user API keys"
min_trust_level_for_user_api_key: |
@ -2377,7 +2378,8 @@ en:
<b>WARNING</b>: Changing the trust level will prevent users with a lower trust level from logging in via Discourse Hub
allowed_user_api_auth_redirects: "Allowed URL for authentication redirect for user API keys. Wildcard symbol * can be used to match any part of it (e.g. www.example.com/*)."
allowed_user_api_push_urls: "Allowed URLs for server push to user API"
expire_user_api_keys_days: "Number of days before a user API key automatically expires (0 for never)"
revoke_user_api_keys_unused_days: "Number of days since a user API key was last used before it is automatically revoked (0 for never)"
revoke_user_api_keys_maxlife_days: "Number of days before a user API key is automatically revoked (0 for never)"
tagging_enabled: "Enable tags on topics?"
min_trust_to_create_tag: "The minimum trust level required to create a tag."
@ -5130,6 +5132,9 @@ en:
automatic_revoked:
one: "Automatically revoked, last activity more than %{count} day ago"
other: "Automatically revoked, last activity more than %{count} days ago"
automatic_revoked_max_life:
one: "Automatically revoked, created at more than %{count} day ago"
other: "Automatically revoked, created at more than %{count} days ago"
revoked: Revoked
restored: Restored

View File

@ -2099,14 +2099,14 @@ es:
default_sidebar_switch_panel_position: "Posición de los botones del panel conmutador de la barra lateral"
retain_web_hook_events_period_days: "Número de días para retener registros de eventos de web hook."
retry_web_hook_events: "Reintentar automáticamente 4 veces los eventos del web hook fallidos. Los intervalos de tiempo entre los reintentos son 1, 5, 25 y 125 minutos."
revoke_api_keys_days: "Número de días antes de que una clave de API sin usar sea revocada automáticamente (0 para nunca)"
revoke_api_keys_unused_days: "Número de días antes de que una clave de API sin usar sea revocada automáticamente (0 para nunca)"
allow_user_api_key_scopes: "Lista de ámbitos permitidos para las claves API de usuario"
min_trust_level_for_user_api_key: |
Nivel de confianza requerido para la generación de claves API de usuario.<br>
<b>ADVERTENCIA</b>: Cambiar el nivel de confianza impedirá a los usuarios con un nivel de confianza inferior iniciar sesión a través de Discourse Hub
allowed_user_api_auth_redirects: "URL permitida para autenticar redirección para claves API de usuario. Símbolo comodín * puede ser usado para que coincida cualquier parte de la misma (por ejemplo www.ejemplo.com/*)."
allowed_user_api_push_urls: "URLs permitidas para el push del servidor al API de usuario"
expire_user_api_keys_days: "Número de días antes de que la clave API del usuario caduque automáticamente (0 para nunca)"
revoke_user_api_keys_unused_days: "Número de días antes de que la clave API del usuario caduque automáticamente (0 para nunca)"
tagging_enabled: "¿Activar etiquetas para los temas?"
min_trust_to_create_tag: "El nivel de confianza mínimo requerido para crear una etiqueta."
max_tags_per_topic: "El número máximo de etiquetas que se pueden añadir a un tema."

View File

@ -2122,14 +2122,14 @@ fi:
default_sidebar_switch_panel_position: "Sivupalkin kytkinpaneelin painikkeiden sijainti"
retain_web_hook_events_period_days: "Kuinka monta päivää tietoa webhook-tapahtumista säilötään."
retry_web_hook_events: "Yritä uudelleen epäonnistuneita webhook-tapahtumia neljästi. Aikavälit yritysten välillä ovat 1, 5, 25 ja 125 minuuttia."
revoke_api_keys_days: "Kuinka monen päivän kuluttua käyttämätön API-avain mitätöidään automaattisesti (0 tarkoittaa ei koskaan)"
revoke_api_keys_unused_days: "Kuinka monen päivän kuluttua käyttämätön API-avain mitätöidään automaattisesti (0 tarkoittaa ei koskaan)"
allow_user_api_key_scopes: "Luettelo käyttäjä-API-avaimiin liittyvistä oikeuksista"
min_trust_level_for_user_api_key: |
Käyttäjän API-avaimien luomiseen vaadittu luottamustaso.<br>
<b>VAROITUS:</b> Luottamustason muuttaminen estää matalamman luottamustason käyttäjiä kirjautumasta sisään Discourse Hubin kautta.
allowed_user_api_auth_redirects: "Sallittu URL-osoite käyttäjän API-avainten todennuksen uudelleenohjaukselle. Jokerimerkkiä * voidaan käyttää vastaamaan mitä tahansa sen osaa (esim. www.esimerkki.fi/*)."
allowed_user_api_push_urls: "Sallitut URL-osoitteet palvelimen työnnöille käyttäjä-APIin"
expire_user_api_keys_days: "Kuinka monessa päivässä käyttäjä-API-avain vanhenee automaattisesti (0 tarkoittaa ei koskaan)"
revoke_user_api_keys_unused_days: "Kuinka monessa päivässä käyttäjä-API-avain vanhenee automaattisesti (0 tarkoittaa ei koskaan)"
tagging_enabled: "Otetaanko ketjujen tunnisteet käyttöön?"
min_trust_to_create_tag: "Vähimmäisluottamustaso, jolla voi luoda tunnisteita."
max_tags_per_topic: "Suurin tunnisteiden määrä, joka voi liittyä ketjuun."

View File

@ -2113,14 +2113,14 @@ fr:
default_sidebar_switch_panel_position: "Position des boutons du panneau de commande de la barre latérale"
retain_web_hook_events_period_days: "Nombre de jours de conservation des événements des Webhooks."
retry_web_hook_events: "Réessayer jusqu'à 4 fois les événements de Webhooks qui ont échoué. Les intervalles entre chaque tentative sont de 1, 5, 25 et 125 minutes."
revoke_api_keys_days: "Nombre de jours avant qu'une clé API inutilisée soit automatiquement révoquée (0 pour jamais)"
revoke_api_keys_unused_days: "Nombre de jours avant qu'une clé API inutilisée soit automatiquement révoquée (0 pour jamais)"
allow_user_api_key_scopes: "Liste des champs d'action autorisés pour les clés de l'API utilisateur"
min_trust_level_for_user_api_key: |
Niveau de confiance requis pour la génération de clés API utilisateur.<br>
<b>AVERTISSEMENT</b> : la modification du niveau de confiance empêchera les utilisateurs dont le niveau de confiance est inférieur de se connecter via Discourse Hub
allowed_user_api_auth_redirects: "URL autorisée pour la redirection d'un utilisateur lors de l'authentification via les clés d'API. Le symbole « * » peut être utilisé pour remplacer n'importe quelle partie de cette adresse (p. ex. : www.exemple.fr/*)."
allowed_user_api_push_urls: "Adresses URL autorisées pour le service push du serveur vers l'API utilisateur"
expire_user_api_keys_days: "Nombre de jours avant l'expiration automatique d'une clé API utilisateur (0 pour jamais)"
revoke_user_api_keys_unused_days: "Nombre de jours avant l'expiration automatique d'une clé API utilisateur (0 pour jamais)"
tagging_enabled: "Activer l'étiquetage des sujets ?"
min_trust_to_create_tag: "Le niveau de confiance minimal requis pour créer une étiquette."
max_tags_per_topic: "Le nombre maximal d'étiquettes pouvant être ajoutées à un sujet."

View File

@ -1839,11 +1839,11 @@ gl:
default_title_count_mode: "Modo predefinido para a páxina do contador do título"
retain_web_hook_events_period_days: "Número de días para reter rexistros de eventos de web hook."
retry_web_hook_events: "Volver tentar automaticamente 4 veces os eventos de web hook frustrados. Os intervalos entre os novos intentos son de 1, 5, 25 e 125 minutos."
revoke_api_keys_days: "Número de días antes de que unha chave API sen usar sexa revogada automaticamente (0 para nunca)"
revoke_api_keys_unused_days: "Número de días antes de que unha chave API sen usar sexa revogada automaticamente (0 para nunca)"
allow_user_api_key_scopes: "Listaxe de ámbitos permitidos para as chaves API de usuario"
allowed_user_api_auth_redirects: "URL permitido para redireccionar a autenticación das chaves API de usuario. O símbolo do comodín pódese utilizar para que coincida calquera parte súa (ex.: www.exemplo.com/*)."
allowed_user_api_push_urls: "Enderezos URL permitidos para que servidor envíe á API de usuario"
expire_user_api_keys_days: "Número de días antes de que a chave API de usuario caduque automaticamente (0 para nunca)"
revoke_user_api_keys_unused_days: "Número de días antes de que a chave API de usuario caduque automaticamente (0 para nunca)"
tagging_enabled: "Activar etiquetas nos temas?"
min_trust_to_create_tag: "O nivel de confianza mínimo para crear unha etiqueta."
max_tags_per_topic: "O número máximo de etiquetas aplicables a un tema."

View File

@ -2229,14 +2229,14 @@ he:
default_sidebar_switch_panel_position: "מיקום כפתורי החלפת לוח בסרגל הצד"
retain_web_hook_events_period_days: "מספר הימים לשמירת רשומות אירועי התלייה."
retry_web_hook_events: "לנסות מחדש אירועי התליה שנכשלו במשך 4 פעמים. פרקי הזמן שבין הניסיונות החוזרים הם 1, 5, 25 ו־125 דקות."
revoke_api_keys_days: "מספר הימים בטרם שלילה אוטומטית של מפתח API שלא היה בשימוש (0 - לעולם לא)."
revoke_api_keys_unused_days: "מספר הימים בטרם שלילה אוטומטית של מפתח API שלא היה בשימוש (0 - לעולם לא)."
allow_user_api_key_scopes: "רשימת אזורים מותרים למפתחות API של משתמשים"
min_trust_level_for_user_api_key: |
נדרשת דרגת אמון ליצירת מפתחות API למשתמש.<br>
<b>אזהרה</b>: שינוי דרגת האמון ימנע ממשתמשים עם דרגת אמון נמוכה יותר להיכנס דרך Discourse Hub
allowed_user_api_auth_redirects: "כתובת מורשית להפניית אימות למפתחות API של משתמש. בסימן התו־כל * ניתן להשתמש כדי ללכוד חלק ממנה (למשל: www.example.com/*)."
allowed_user_api_push_urls: "URLים מורשים לדחיפת שרת ל API של משתמשים."
expire_user_api_keys_days: "מספר הימים בטרם פקיעת תוקף מפתח ה־API של המשתמש אוטומטית (0 - לעולם לא)."
revoke_user_api_keys_unused_days: "מספר הימים בטרם פקיעת תוקף מפתח ה־API של המשתמש אוטומטית (0 - לעולם לא)."
tagging_enabled: "לאפשר תגיות על נושאים?"
min_trust_to_create_tag: "דרגת האמון המזערית שנדרשת כדי ליצור תגית."
max_tags_per_topic: "כמות התגיות המרבית שניתן להקצות לנושא."

View File

@ -2123,14 +2123,14 @@ it:
default_sidebar_switch_panel_position: "Posizione dei pulsanti della barra laterale"
retain_web_hook_events_period_days: "Numero di giorni per mantenere i record degli eventi di web hook."
retry_web_hook_events: "Riprova automaticamente gli eventi di hook Web falliti per 4 volte. Gli intervalli di tempo tra i tentativi sono 1, 5, 25 e 125 minuti."
revoke_api_keys_days: "Numero di giorni prima che una chiave API non utilizzata sia revocata automaticamente (0 per non avere mai revoca)"
revoke_api_keys_unused_days: "Numero di giorni prima che una chiave API non utilizzata sia revocata automaticamente (0 per non avere mai revoca)"
allow_user_api_key_scopes: "Elenco di ambiti consentiti per le chiavi API utente"
min_trust_level_for_user_api_key: |
Livello di attendibilità richiesto per la generazione di chiavi API utente.<br>
<b>AVVISO</b>: la modifica del livello di attendibilità impedirà agli utenti con un livello di attendibilità inferiore di accedere tramite Discourse Hub
allowed_user_api_auth_redirects: "URL consentito per il reindirizzamento dell'autenticazione per le chiavi API utente. Il simbolo jolly * può essere utilizzato per abbinare qualsiasi parte di esso (ad esempio www.example.com/*)."
allowed_user_api_push_urls: "URL consentiti per il push del server alle API utente"
expire_user_api_keys_days: "Numero di giorni prima che una chiave API utente scada automaticamente (0 per non avere scadenza)"
revoke_user_api_keys_unused_days: "Numero di giorni prima che una chiave API utente scada automaticamente (0 per non avere scadenza)"
tagging_enabled: "Abilitare le etichette per gli argomenti?"
min_trust_to_create_tag: "Il livello di attendibilità minimo per creare un'etichetta."
max_tags_per_topic: "Il numero massimo di etichette che si possono applicare ad un argomento."

View File

@ -2046,14 +2046,14 @@ ja:
default_sidebar_switch_panel_position: "サイドバー切り替えパネルボタンの位置"
retain_web_hook_events_period_days: "Webhook イベントレコードを保持する日数。"
retry_web_hook_events: "失敗した Webhook イベントを自動的に 4 回再試行する。再試行間の時間差は、1、5、25、および 125 分です。"
revoke_api_keys_days: "未使用の API キーが自動的に取り消されるまでの日数 (0 に設定すると取り消されません)"
revoke_api_keys_unused_days: "未使用の API キーが自動的に取り消されるまでの日数 (0 に設定すると取り消されません)"
allow_user_api_key_scopes: "ユーザー API キーに許可されるスコープのリスト"
min_trust_level_for_user_api_key: |
ユーザー API キーの生成に必要な信頼レベル。<br>
<b>警告</b>: 信頼レベルを変更すると、それより低い信頼レベルのユーザーは DiscourseHub からログインできなくなります。
allowed_user_api_auth_redirects: "ユーザー API キーの認証リダイレクトに許可された URL。任意の部分を照合するには、ワイルドカード記号 * を使用できます (例: www.example.com/*)。"
allowed_user_api_push_urls: "ユーザー API へのサーバープッシュで許可される URL"
expire_user_api_keys_days: "ユーザー API キーが自動的に期限切れになるまでの日数 (0 に設定すると期限切れになりません)"
revoke_user_api_keys_unused_days: "ユーザー API キーが自動的に期限切れになるまでの日数 (0 に設定すると期限切れになりません)"
tagging_enabled: "トピックでタグを有効にしますか?"
min_trust_to_create_tag: "タグを作成するために必要な最低信頼レベル。"
max_tags_per_topic: "トピックに適用できる最大タグ数。"

View File

@ -1884,11 +1884,11 @@ ko:
default_title_count_mode: "페이지 제목 카운터의 디폴트 모드"
retain_web_hook_events_period_days: "Webhook 이벤트 기록 보유 기간(일)입니다."
retry_web_hook_events: "실패한 Webhook 이벤트를 4번 자동으로 재시도합니다. 재시도 간 간격은 1, 5, 25 및 125분입니다."
revoke_api_keys_days: "사용하지 않는 API 키가 자동으로 취소되기까지의 기간(일)(0은 취소 안 함)"
revoke_api_keys_unused_days: "사용하지 않는 API 키가 자동으로 취소되기까지의 기간(일)(0은 취소 안 함)"
allow_user_api_key_scopes: "사용자 API 키에 허용되는 범위 목록"
allowed_user_api_auth_redirects: "사용자 API 키의 인증 리디렉션을 위해 허용된 URL입니다. 와일드 카드 기호 *를 사용하면 일부를 일치시킬 수 있습니다(예 : www.example.com/*)."
allowed_user_api_push_urls: "사용자 API의 서버 푸시를 위한 허용된 URL"
expire_user_api_keys_days: "사용자 API 키가 자동으로 만료되기까지의 기간(일)(0은 만료 안 함)"
revoke_user_api_keys_unused_days: "사용자 API 키가 자동으로 만료되기까지의 기간(일)(0은 만료 안 함)"
tagging_enabled: "주제에 태그를 활성화할까요?"
min_trust_to_create_tag: "태그를 생성하기 위한 최소 신뢰 레벨입니다."
max_tags_per_topic: "주제에 적용할 수 있는 최대 태그입니다."

View File

@ -2113,14 +2113,14 @@ nl:
default_sidebar_switch_panel_position: "Positie van paneelschakelknop in de zijbalk"
retain_web_hook_events_period_days: "Aantal dagen voor het behouden van records van webhookgebeurtenissen."
retry_web_hook_events: "Mislukte webhookgebeurtenissen automatisch 4 keer opnieuw proberen. De intervallen tussen de pogingen zijn 1, 5, 25 en 125 minuten."
revoke_api_keys_days: "Aantal dagen voordat een niet-gebruikte API-sleutel van een gebruiker automatisch wordt ingetrokken (0 voor nooit)"
revoke_api_keys_unused_days: "Aantal dagen voordat een niet-gebruikte API-sleutel van een gebruiker automatisch wordt ingetrokken (0 voor nooit)"
allow_user_api_key_scopes: "Lijst van toegestane scopes voor API-sleutels van gebruiker"
min_trust_level_for_user_api_key: |
Vereist vertrouwensniveau voor het genereren van API-sleutels voor gebruikers.<br>
<b>WAARSCHUWING</b>: als je het vertrouwensniveau wijzigt, kunnen gebruikers met een lager vertrouwensniveau zich niet aanmelden via Discourse Hub
allowed_user_api_auth_redirects: "Toegestane URL voor verificatie bij omleiden voor API-sleutels van gebruiker. Het jokerteken * kan worden gebruikt om een deel ervan te laten overeenkomen (bv. www.example.com/*)."
allowed_user_api_push_urls: "Toegestane URL's voor server-push naar gebruikers-API"
expire_user_api_keys_days: "Aantal dagen voordat een API-sleutel van een gebruiker automatisch verloopt (0 voor nooit)"
revoke_user_api_keys_unused_days: "Aantal dagen voordat een API-sleutel van een gebruiker automatisch verloopt (0 voor nooit)"
tagging_enabled: "Tags op topics inschakelen?"
min_trust_to_create_tag: "Het minimale vertrouwensniveau dat nodig is om een tag te maken."
max_tags_per_topic: "De maximale tags die op een topic kunnen worden toegepast."

View File

@ -2230,14 +2230,14 @@ pl_PL:
default_sidebar_switch_panel_position: "Położenie przycisków panelu przełączania paska bocznego"
retain_web_hook_events_period_days: "Liczba dni przechowywania rekordów zdarzeń webhooków."
retry_web_hook_events: "Automatycznie ponów 4 razy nieudane zdarzenia webhooków. Luki czasowe między ponownymi próbami wynoszą 1, 5, 25 i 125 minut."
revoke_api_keys_days: "Liczba dni do automatycznego unieważnienia nieużywanego klucza API (0 oznacza brak)"
revoke_api_keys_unused_days: "Liczba dni do automatycznego unieważnienia nieużywanego klucza API (0 oznacza brak)"
allow_user_api_key_scopes: "Lista zakresów dozwolona dla kluczy API użytkownika."
min_trust_level_for_user_api_key: |
Poziom zaufania wymagany do generowania kluczy API użytkownika.<br>
<b>OSTRZEŻENIE</b>: Zmiana poziomu zaufania uniemożliwi użytkownikom o niższym poziomie zaufania logowanie się przez Discourse Hub
allowed_user_api_auth_redirects: "Dozwolony adres URL do przekierowania uwierzytelniania dla kluczy interfejsu API użytkownika. Symbol wieloznaczny * może być użyty do dopasowania dowolnej jego części (np. www.example.com/*)."
allowed_user_api_push_urls: "Dozwolone URLs dla serwera push do API użytkownika"
expire_user_api_keys_days: "Liczba dni do automatycznego wygaśnięcia klucza API użytkownika (0 oznacza brak)"
revoke_user_api_keys_unused_days: "Liczba dni do automatycznego wygaśnięcia klucza API użytkownika (0 oznacza brak)"
tagging_enabled: "Włączyć tagi w tematach?"
min_trust_to_create_tag: "Minimalny poziom zaufania potrzebny do stworzenia tagu."
max_tags_per_topic: "Maksymalna liczba tagów, które mogą zostać połączone z tematem."

View File

@ -2113,14 +2113,14 @@ pt_BR:
default_sidebar_switch_panel_position: "Posição dos botões do painel de opções na barra lateral"
retain_web_hook_events_period_days: "Quantidade de dias para manter registros de eventos de webhook."
retry_web_hook_events: "Repita automaticamente os eventos com falha do webhook quatro vezes. Os intervalos de tempo entre as tentativas são de 1, 5, 25 e 125 minutos."
revoke_api_keys_days: "Quantidade de dias antes de uma chave de API não usada ser revogada automaticamente (0 para nunca)"
revoke_api_keys_unused_days: "Quantidade de dias antes de uma chave de API não usada ser revogada automaticamente (0 para nunca)"
allow_user_api_key_scopes: "Lista de escopos permitidos para chaves de API do(a) usuário(a)"
min_trust_level_for_user_api_key: |
Nível de confiança necessário para geração de chaves de API do(a) usuário(a).<br>
<b>AVISO</b>: alterar o nível de confiança impedirá que os(as) usuários(as) com um nível de confiança inferior façam login via Discourse Hub
allowed_user_api_auth_redirects: "URL permitida para o redirecionamento de autenticação das chaves de API do(a) usuário(a). O símbolo curinga * pode ser usado para corresponder a qualquer parte dele (por exemplo, www.example.com/*)."
allowed_user_api_push_urls: "URLs permitidas para push de servidor para API do(a) usuário(a)"
expire_user_api_keys_days: "Quantidade de dias antes de uma chave de API do(a) usuário(a) expirar automaticamente (0 para nunca)"
revoke_user_api_keys_unused_days: "Quantidade de dias antes de uma chave de API do(a) usuário(a) expirar automaticamente (0 para nunca)"
tagging_enabled: "Ativar etiquetas em tópicos?"
min_trust_to_create_tag: "O nível de confiança mínimo necessário para criar uma etiqueta."
max_tags_per_topic: "As etiquetas máximas que podem ser aplicadas a um tópico."

View File

@ -2205,14 +2205,14 @@ ru:
default_sidebar_switch_panel_position: "Положение кнопок переключения панели на боковой панели"
retain_web_hook_events_period_days: "Количество дней, в течение которых сохраняются записи событий вебхука."
retry_web_hook_events: "Автоматически повторять неудачные события вебхука 4 раза. Промежуток времени между повторными попытками составляет 1, 5, 25 и 125 минут."
revoke_api_keys_days: "Количество дней до автоматического отзыва неиспользованного ключа API (0 — никогда)"
revoke_api_keys_unused_days: "Количество дней до автоматического отзыва неиспользованного ключа API (0 — никогда)"
allow_user_api_key_scopes: "Список областей, разрешённых для пользовательских API-ключей"
min_trust_level_for_user_api_key: |
Уровень доверия, необходимый для создания пользовательских API-ключей пользователей.<br>
<b>ВНИМАНИЕ</b>! Изменение уровня доверия не позволит пользователям с более низким уровнем доверия входить через Discourse Hub.
allowed_user_api_auth_redirects: "Разрешённый URL для перенаправления аутентификации для API-ключей пользователя. Подстановочный знак * может использоваться для соответствия любой его части (например, www.example.com/*)."
allowed_user_api_push_urls: "Разрешённые URL-адреса для отправки на сервер к пользовательскому API"
expire_user_api_keys_days: "Количество дней до автоматического истечения срока действия API-ключа (0 — никогда)"
revoke_user_api_keys_unused_days: "Количество дней до автоматического истечения срока действия API-ключа (0 — никогда)"
tagging_enabled: "Включить теги для тем?"
min_trust_to_create_tag: "Минимальный уровень доверия для создания тега."
max_tags_per_topic: "Максимальное количество тегов, которое может быть применено к теме."

View File

@ -2113,14 +2113,14 @@ sv:
default_sidebar_switch_panel_position: "Placering av panelknappar för sidofältsomkoppling"
retain_web_hook_events_period_days: "Antal dagar för att behålla register över webhook-händelsedata."
retry_web_hook_events: "Försök automatiskt igen för misslyckade händelser för webhooken 4 gånger. Tidsspannet mellan försöken är 1, 5, 25 och 125 minuter."
revoke_api_keys_days: "Antal dagar innan en oanvänd API-nyckel automatiskt återkallas (0 för aldrig)"
revoke_api_keys_unused_days: "Antal dagar innan en oanvänd API-nyckel automatiskt återkallas (0 för aldrig)"
allow_user_api_key_scopes: "Lista över samtliga tillåtna användar-API-nycklar"
min_trust_level_for_user_api_key: |
Förtroendenivå som krävs för generering av användar-API-nycklar.<br>
<b>VARNING</b>: Ändring av förtroendenivån kommer att förhindra användare med en lägre förtroendenivå från att logga in via Discourse Hub
allowed_user_api_auth_redirects: "Tillåten URL för omdirigering efter verifiering av användares API-nycklar. Jokersymbol * kan användas för att matcha vilken del som helst av denna (t.ex. www.exempel.se/*)."
allowed_user_api_push_urls: "Tillåtna URL:er för serverframstötning till användar-API"
expire_user_api_keys_days: "Antal dagar innan en användares API-nyckel automatiskt upphör (0 för aldrig)"
revoke_user_api_keys_unused_days: "Antal dagar innan en användares API-nyckel automatiskt upphör (0 för aldrig)"
tagging_enabled: "Vill du aktivera taggar på ämnen?"
min_trust_to_create_tag: "Lägsta förtroendenivå som krävs för att skapa en tagg."
max_tags_per_topic: "Högsta antal taggar som kan tillskrivas ett ämne."

View File

@ -2110,14 +2110,14 @@ tr_TR:
default_sidebar_switch_panel_position: "Kenar çubuğu geçiş paneli düğmelerinin konumu"
retain_web_hook_events_period_days: "Web kancası olay kayıtlarının saklanacağı gün sayısı."
retry_web_hook_events: "Başarısız web kancası olaylarını otomatik olarak 4 kez yeniden deneyin. Yeniden denemeler arasındaki zaman aralıkları 1, 5, 25 ve 125 dakikadır."
revoke_api_keys_days: "Kullanılmayan bir API anahtarının otomatik olarak iptal edilmesinden önceki gün sayısı (asla için 0)"
revoke_api_keys_unused_days: "Kullanılmayan bir API anahtarının otomatik olarak iptal edilmesinden önceki gün sayısı (asla için 0)"
allow_user_api_key_scopes: "Kullanıcı API anahtarları için izin verilen kapsamların listesi"
min_trust_level_for_user_api_key: |
Kullanıcı API anahtarlarının oluşturulması için gereken güven seviyesi.<br>
<b>UYARI</b>: Güven seviyesinin değiştirilmesi, daha düşük güven seviyesine sahip kullanıcıların Discourse Hub üzerinden giriş yapmasını engeller
allowed_user_api_auth_redirects: "Kullanıcı API anahtarları için kimlik doğrulama yönlendirmesi için izin verilen URL. Joker karakter sembolü * herhangi bir bölümüyle eşleşmek için kullanılabilir (ör. www.example.com/*)."
allowed_user_api_push_urls: "Kullanıcı API'sine sunucu anlık iletimi için izin verilen URL'ler"
expire_user_api_keys_days: "Bir kullanıcı API anahtarının otomatik olarak sona ermesinden önceki gün sayısı (asla için 0)"
revoke_user_api_keys_unused_days: "Bir kullanıcı API anahtarının otomatik olarak sona ermesinden önceki gün sayısı (asla için 0)"
tagging_enabled: "Konularda etiketler etkinleştirilsin mi?"
min_trust_to_create_tag: "Etiket oluşturmak için gereken minimum güven seviyesi."
max_tags_per_topic: "Bir konuya uygulanabilecek maksimum etiket sayısı."

View File

@ -2229,14 +2229,14 @@ uk:
default_sidebar_switch_panel_position: "Позиція кнопок перемикання панелі на бічній панелі"
retain_web_hook_events_period_days: "Кількість днів для збереження записів про події web hook."
retry_web_hook_events: "Автоматично повторювати невдалі події web hook протягом 4 разів. Проміжки часу між повторними спробами становлять 1, 5, 25 і 125 хвилин."
revoke_api_keys_days: "Кількість днів до автоматичного відкликання невикористаного ключа API (0 для ніколи)"
revoke_api_keys_unused_days: "Кількість днів до автоматичного відкликання невикористаного ключа API (0 для ніколи)"
allow_user_api_key_scopes: "Список даних, дозволених для API ключів користувача"
min_trust_level_for_user_api_key: |
Рівень довіри, необхідний для генерації ключів API користувача.<br>
<b>ПОПЕРЕДЖЕННЯ</b>: Зміна рівня довіри не дозволить користувачам з нижчим рівнем довіри увійти в систему через Discourse Hub
allowed_user_api_auth_redirects: "Дозволена URL-адреса для переадресації автентифікації для ключів API користувача. Символ підстановки * може використовуватися для узгодження будь-якої його частини (наприклад, www.example.com/*)."
allowed_user_api_push_urls: "Дозволені URL-адреси для надсилання на сервер push до API"
expire_user_api_keys_days: "Кількість днів до того, як автоматично закінчиться термін дії ключа API користувача (0 ніколи)"
revoke_user_api_keys_unused_days: "Кількість днів до того, як автоматично закінчиться термін дії ключа API користувача (0 ніколи)"
tagging_enabled: "Увімкнути теґи за темами?"
min_trust_to_create_tag: "Мінімальний рівень довіри, необхідний для створення теґу."
max_tags_per_topic: "Максимум теґів, які можна застосувати до теми."

View File

@ -1861,7 +1861,7 @@ ur:
allow_user_api_key_scopes: "صارف API کلیدوں کیلئے اجازت دی جانے والی سکَوپس کی فہرست"
allowed_user_api_auth_redirects: "صارف API کیز کیلئے توثیقی ریڈائرَیکٹ کیلئے اجازت یافتہ URL۔ وائلڈ کارڈ علامت * اُس کے کسی بھی حصے کو میچ کرنے کیلئے استعمال کیا جا سکتا ہے (مثلاً www.example.com/*)۔"
allowed_user_api_push_urls: "صارف API پر سرور پُش کیلئے اجازت یافتہ URL"
expire_user_api_keys_days: "دنوں کی تعداد جس سے پہلے ایک صارف API کِی کی میعاد ختم ہو جائے (کبھی نہیں کیلئے 0)"
revoke_user_api_keys_unused_days: "دنوں کی تعداد جس سے پہلے ایک صارف API کِی کی میعاد ختم ہو جائے (کبھی نہیں کیلئے 0)"
tagging_enabled: "ٹاپکس پر ٹیگز فعال کریں؟"
min_trust_to_create_tag: "ٹَیگ بنانے کیلئے کم از کم مطلوبہ ٹرسٹ لَیول۔"
max_tags_per_topic: "ایک ٹاپک پر لگائے جانے والے ٹَیگز کی زیادہ سے زیادہ تعداد۔"

View File

@ -2055,14 +2055,14 @@ zh_CN:
default_sidebar_switch_panel_position: "边栏开关面板按钮的位置"
retain_web_hook_events_period_days: "保留网络钩子事件记录的天数。"
retry_web_hook_events: "自动重试失败的网络钩子事件 4 次。重试之间的时间间隔为 1、5、25 和 125 分钟。"
revoke_api_keys_days: "未使用的 API 密钥被自动撤消前的天数0 表示从不撤消)"
revoke_api_keys_unused_days: "未使用的 API 密钥被自动撤消前的天数0 表示从不撤消)"
allow_user_api_key_scopes: "用户 API 密钥允许的范围列表"
min_trust_level_for_user_api_key: |
生成用户 API 密钥所需的信任级别。<br>
<b>警告</b>:更改信任级别将阻止信任级别较低的用户通过 Discourse Hub 登录
allowed_user_api_auth_redirects: "用户 API 密钥身份验证重定向的允许 URL。通配符 * 可用于匹配它的任何部分(例如 www.example.com/*)。"
allowed_user_api_push_urls: "服务器推送到用户 API 的允许 URL"
expire_user_api_keys_days: "用户 API 密钥自动过期前的天数0 表示从不过期)"
revoke_user_api_keys_unused_days: "用户 API 密钥自动过期前的天数0 表示从不过期)"
tagging_enabled: "在话题上启用标签?"
min_trust_to_create_tag: "创建标签所需的最低信任级别。"
max_tags_per_topic: "可应用于话题的最大标签数。"

View File

@ -2775,9 +2775,13 @@ api:
api_key_last_used_epoch:
default: "" # Value is added in a migration
hidden: true
revoke_api_keys_days:
revoke_api_keys_unused_days:
default: 180
max: 36500
revoke_api_keys_maxlife_days:
default: 0
max: 36500
hidden: true
user_api:
allow_user_api_key_scopes:
@ -2796,9 +2800,13 @@ user_api:
allowed_user_api_auth_redirects:
default: "https://api.discourse.org/api/auth_redirect|discourse://auth_redirect"
type: list
expire_user_api_keys_days:
revoke_user_api_keys_unused_days:
default: 180
max: 36500
revoke_user_api_keys_maxlife_days:
default: 0
max: 36500
hidden: true
tags:
tagging_enabled:

View File

@ -0,0 +1,13 @@
# frozen_string_literal: true
#
class RenameRevokeApiKeysSettings < ActiveRecord::Migration[7.0]
def up
execute "UPDATE site_settings SET name = 'revoke_api_keys_unused_days' where name = 'revoke_api_keys_days'"
execute "UPDATE site_settings SET name = 'revoke_user_api_keys_unused_days' where name = 'expire_user_api_keys_days'"
end
def down
execute "UPDATE site_settings SET name = 'revoke_api_keys_days' where name = 'revoke_api_keys_unused_days'"
execute "UPDATE site_settings SET name = 'expire_user_api_keys_days' where name = 'revoke_user_api_keys_unused_days'"
end
end

View File

@ -1,20 +0,0 @@
# frozen_string_literal: true
RSpec.describe Jobs::AutoExpireUserApiKeys do
fab!(:key1) { Fabricate(:readonly_user_api_key) }
fab!(:key2) { Fabricate(:readonly_user_api_key) }
context "when user api key is unused in last 1 days" do
before { SiteSetting.expire_user_api_keys_days = 1 }
it "should revoke the key" do
freeze_time
key1.update!(last_used_at: 2.days.ago)
described_class.new.execute({})
expect(key1.reload.revoked_at).to eq_time(Time.zone.now)
expect(key2.reload.revoked_at).to eq(nil)
end
end
end

View File

@ -0,0 +1,22 @@
# frozen_string_literal: true
RSpec.describe Jobs::CleanUpUnusedUserApiKeys do
fab!(:key1) { Fabricate(:readonly_user_api_key) }
fab!(:key2) { Fabricate(:readonly_user_api_key) }
fab!(:key3) { Fabricate(:readonly_user_api_key, revoked_at: 10.days.ago) }
context "when user api key is unused in last 1 days" do
before { SiteSetting.revoke_user_api_keys_unused_days = 1 }
it "should only revoke keys that are active and unused" do
freeze_time
key1.update!(last_used_at: 2.days.ago)
key3.update!(last_used_at: 2.days.ago)
expect { described_class.new.execute({}) }.to change { key1.reload.revoked_at }.from(nil).to(
be_within_one_second_of Time.current
).and not_change { key2.reload.revoked_at }.and not_change { key3.reload.revoked_at }
end
end
end

View File

@ -0,0 +1,23 @@
# frozen_string_literal: true
RSpec.describe Jobs::CleanUpUserApiKeysMaxLife do
fab!(:older_key) { Fabricate(:readonly_user_api_key, created_at: 3.days.ago) }
fab!(:newer_key) { Fabricate(:readonly_user_api_key, created_at: 1.day.ago) }
fab!(:revoked_key) do
Fabricate(:readonly_user_api_key, created_at: 4.day.ago, revoked_at: 1.day.ago)
end
context "when user api key was created before the max life period" do
before { SiteSetting.revoke_user_api_keys_maxlife_days = 2 }
it "should revoke active keys" do
freeze_time
expect { described_class.new.execute({}) }.to change { older_key.reload.revoked_at }.from(
nil,
).to(be_within_one_second_of Time.current).and not_change {
newer_key.reload.revoked_at
}.and not_change { revoked_key.reload.revoked_at }
end
end
end

View File

@ -42,11 +42,11 @@ RSpec.describe ApiKey do
expect(ApiKey.last_used_epoch).to eq(nil)
end
it "can automatically revoke keys" do
it "can automatically revoke unused keys" do
now = Time.now
SiteSetting.api_key_last_used_epoch = now - 2.years
SiteSetting.revoke_api_keys_days = 180 # 6 months
SiteSetting.revoke_api_keys_unused_days = 180 # 6 months
freeze_time now - 1.year
never_used = Fabricate(:api_key)
@ -78,6 +78,22 @@ RSpec.describe ApiKey do
expect(used_recently.revoked_at).to eq(nil)
end
it "can automatically revoke keys by max life" do
freeze_time
SiteSetting.revoke_api_keys_maxlife_days = 2
older_key = Fabricate(:api_key, created_at: 3.days.ago)
newer_key = Fabricate(:api_key, created_at: 1.days.ago)
revoked_key = Fabricate(:api_key, created_at: 3.days.ago, revoked_at: 1.day.ago)
expect { ApiKey.revoke_max_life_keys! }.to change { older_key.reload.revoked_at }.from(nil).to(
be_within_one_second_of Time.current
).and not_change { newer_key.reload.revoked_at }.and not_change {
revoked_key.reload.revoked_at
}
end
describe "API Key scope mappings" do
it "maps api_key permissions" do
api_key_mappings = ApiKeyScope.scope_mappings[:topics]