diff --git a/app/jobs/scheduled/auto_expire_user_api_keys.rb b/app/jobs/scheduled/auto_expire_user_api_keys.rb
deleted file mode 100644
index 60bd24418d2..00000000000
--- a/app/jobs/scheduled/auto_expire_user_api_keys.rb
+++ /dev/null
@@ -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
diff --git a/app/jobs/scheduled/clean_up_api_keys_max_life.rb b/app/jobs/scheduled/clean_up_api_keys_max_life.rb
new file mode 100644
index 00000000000..a94f3e6da14
--- /dev/null
+++ b/app/jobs/scheduled/clean_up_api_keys_max_life.rb
@@ -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
diff --git a/app/jobs/scheduled/clean_up_unused_user_api_keys.rb b/app/jobs/scheduled/clean_up_unused_user_api_keys.rb
new file mode 100644
index 00000000000..92e673b9ff9
--- /dev/null
+++ b/app/jobs/scheduled/clean_up_unused_user_api_keys.rb
@@ -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
diff --git a/app/jobs/scheduled/clean_up_user_api_keys_max_life.rb b/app/jobs/scheduled/clean_up_user_api_keys_max_life.rb
new file mode 100644
index 00000000000..6495bd2e78f
--- /dev/null
+++ b/app/jobs/scheduled/clean_up_user_api_keys_max_life.rb
@@ -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
diff --git a/app/models/api_key.rb b/app/models/api_key.rb
index 5c53ea52912..c8611418b74 100644
--- a/app/models/api_key.rb
+++ b/app/models/api_key.rb
@@ -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
diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml
index 1aef55f1528..d130023af42 100644
--- a/config/locales/server.ar.yml
+++ b/config/locales/server.ar.yml
@@ -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: |
مستوى الثقة المطلوب لإنشاء مفاتيح واجهة برمجة تطبيقات المستخدم
تحذير: سيؤدي تغيير مستوى الثقة إلى منع المستخدمين في مستويات الثقة الأقل من تسجيل الدخول عبر 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: "الحد الأقصى لعدد الوسوم التي يمكن تطبيقها على موضوع"
diff --git a/config/locales/server.ca.yml b/config/locales/server.ca.yml
index 8e7691e9594..3421dd92859 100644
--- a/config/locales/server.ca.yml
+++ b/config/locales/server.ca.yml
@@ -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 d’API no utilitzada sigui revocada automàticament (0 per a mai)"
+ revoke_api_keys_unused_days: "Nombre de dies abans que una clau d’API 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."
diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml
index 0e7a21ddd35..6c14b768952 100644
--- a/config/locales/server.da.yml
+++ b/config/locales/server.da.yml
@@ -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."
diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml
index 6404b5dd2e7..a000395d205 100644
--- a/config/locales/server.de.yml
+++ b/config/locales/server.de.yml
@@ -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.
WARNUNG: 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."
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index abbdc770e53..c86564f7c8e 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -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:
WARNING: 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
diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml
index 9427520d2e7..014ae6fe642 100644
--- a/config/locales/server.es.yml
+++ b/config/locales/server.es.yml
@@ -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.
ADVERTENCIA: 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."
diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml
index 2af76ec03d7..c876250c8b5 100644
--- a/config/locales/server.fi.yml
+++ b/config/locales/server.fi.yml
@@ -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.
VAROITUS: 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."
diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml
index d68d6bdca6e..87870cbc266 100644
--- a/config/locales/server.fr.yml
+++ b/config/locales/server.fr.yml
@@ -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.
AVERTISSEMENT : 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."
diff --git a/config/locales/server.gl.yml b/config/locales/server.gl.yml
index a92b6e70f9d..0a1f64cdee7 100644
--- a/config/locales/server.gl.yml
+++ b/config/locales/server.gl.yml
@@ -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."
diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml
index 6671ec7e2ce..90468a85d9d 100644
--- a/config/locales/server.he.yml
+++ b/config/locales/server.he.yml
@@ -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 למשתמש.
אזהרה: שינוי דרגת האמון ימנע ממשתמשים עם דרגת אמון נמוכה יותר להיכנס דרך 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: "כמות התגיות המרבית שניתן להקצות לנושא."
diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml
index 7f4c0b0a199..4b6a26a28df 100644
--- a/config/locales/server.it.yml
+++ b/config/locales/server.it.yml
@@ -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.
AVVISO: 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."
diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml
index fed64e32cb8..8383a825d1b 100644
--- a/config/locales/server.ja.yml
+++ b/config/locales/server.ja.yml
@@ -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 キーの生成に必要な信頼レベル。
警告: 信頼レベルを変更すると、それより低い信頼レベルのユーザーは 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: "トピックに適用できる最大タグ数。"
diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml
index dadee6e19b5..797817ac84e 100644
--- a/config/locales/server.ko.yml
+++ b/config/locales/server.ko.yml
@@ -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: "주제에 적용할 수 있는 최대 태그입니다."
diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml
index faa5ea24fbd..b9b7cf5cdad 100644
--- a/config/locales/server.nl.yml
+++ b/config/locales/server.nl.yml
@@ -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.
WAARSCHUWING: 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."
diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml
index ccde4890627..3303074ae40 100644
--- a/config/locales/server.pl_PL.yml
+++ b/config/locales/server.pl_PL.yml
@@ -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.
OSTRZEŻENIE: 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."
diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml
index aa601619cdc..07fc7507408 100644
--- a/config/locales/server.pt_BR.yml
+++ b/config/locales/server.pt_BR.yml
@@ -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).
AVISO: 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."
diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml
index 6be24786170..08661a6b8e5 100644
--- a/config/locales/server.ru.yml
+++ b/config/locales/server.ru.yml
@@ -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-ключей пользователей.
ВНИМАНИЕ! Изменение уровня доверия не позволит пользователям с более низким уровнем доверия входить через 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: "Максимальное количество тегов, которое может быть применено к теме."
diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml
index 51129773d9e..97614ac9a2f 100644
--- a/config/locales/server.sv.yml
+++ b/config/locales/server.sv.yml
@@ -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.
VARNING: Ä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."
diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml
index c181a9aac13..2330cc5fff8 100644
--- a/config/locales/server.tr_TR.yml
+++ b/config/locales/server.tr_TR.yml
@@ -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.
UYARI: 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ı."
diff --git a/config/locales/server.uk.yml b/config/locales/server.uk.yml
index 32e3f4e0d38..f815bba0993 100644
--- a/config/locales/server.uk.yml
+++ b/config/locales/server.uk.yml
@@ -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 користувача.
ПОПЕРЕДЖЕННЯ: Зміна рівня довіри не дозволить користувачам з нижчим рівнем довіри увійти в систему через 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: "Максимум теґів, які можна застосувати до теми."
diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml
index aed9a9d9e4d..161762565a5 100644
--- a/config/locales/server.ur.yml
+++ b/config/locales/server.ur.yml
@@ -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: "ایک ٹاپک پر لگائے جانے والے ٹَیگز کی زیادہ سے زیادہ تعداد۔"
diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml
index 93e5eca0204..d1e8f2e88a0 100644
--- a/config/locales/server.zh_CN.yml
+++ b/config/locales/server.zh_CN.yml
@@ -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 密钥所需的信任级别。
警告:更改信任级别将阻止信任级别较低的用户通过 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: "可应用于话题的最大标签数。"
diff --git a/config/site_settings.yml b/config/site_settings.yml
index e58ad1c84e8..8ec58243ff0 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -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:
diff --git a/db/migrate/20230913194832_rename_revoke_api_keys_settings.rb b/db/migrate/20230913194832_rename_revoke_api_keys_settings.rb
new file mode 100644
index 00000000000..36f7ca2b9f3
--- /dev/null
+++ b/db/migrate/20230913194832_rename_revoke_api_keys_settings.rb
@@ -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
diff --git a/spec/jobs/auto_expire_user_api_keys_spec.rb b/spec/jobs/auto_expire_user_api_keys_spec.rb
deleted file mode 100644
index 5c6ce1c8a6c..00000000000
--- a/spec/jobs/auto_expire_user_api_keys_spec.rb
+++ /dev/null
@@ -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
diff --git a/spec/jobs/clean_up_unused_user_api_keys_spec.rb b/spec/jobs/clean_up_unused_user_api_keys_spec.rb
new file mode 100644
index 00000000000..0136abe149f
--- /dev/null
+++ b/spec/jobs/clean_up_unused_user_api_keys_spec.rb
@@ -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
diff --git a/spec/jobs/clean_up_user_api_keys_max_life_spec.rb b/spec/jobs/clean_up_user_api_keys_max_life_spec.rb
new file mode 100644
index 00000000000..a000e908712
--- /dev/null
+++ b/spec/jobs/clean_up_user_api_keys_max_life_spec.rb
@@ -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
diff --git a/spec/models/api_key_spec.rb b/spec/models/api_key_spec.rb
index caf5c16e9dc..c9a728261e4 100644
--- a/spec/models/api_key_spec.rb
+++ b/spec/models/api_key_spec.rb
@@ -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]