feat(sessions): show session origin in admin panel + test

This commit is contained in:
Edouard Vanbelle
2026-08-09 15:35:04 +02:00
parent 763ee82028
commit a7df46f8f8
25 changed files with 396 additions and 29 deletions
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "تضمين الملغاة / المنتهية",
"refresh": "تحديث",
"col_user": "المستخدم",
"col_origin": "المصدر",
"col_created": "تم الإنشاء",
"col_expires": "تنتهي في",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "إلغاء",
"empty": "لا توجد جلسات مطابقة للتصفية الحالية.",
"revoke_self_confirm": "⚠️ هذه جلستك الحالية. إلغاؤها سيؤدي إلى تسجيل خروجك فورًا وعليك تسجيل الدخول مرة أخرى. هل تريد المتابعة؟",
"revoke_confirm": "إلغاء هذه الجلسة؟ سيتلقى المتصفح رمز 401 عند الطلب التالي."
"revoke_confirm": "إلغاء هذه الجلسة؟ سيتلقى المتصفح رمز 401 عند الطلب التالي.",
"revoke_lag_notice": "إلغاء الجلسة يقطع مسار التحديث فورًا، لكن أي JWT موجود بالفعل في المتصفح يظل صالحًا حتى {{secs}} ثانية حتى محاولة التحديث التالية.",
"origin": {
"password": "كلمة المرور",
"opaque": "OPAQUE",
"magic_link": "رابط سحري",
"oidc": "SSO",
"device": "جهاز",
"unknown": "غير معروف"
}
},
"smtp_fail": "فشل الإرسال.",
"smtp_send": "إرسال",
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "Widerrufene / abgelaufene einschließen",
"refresh": "Aktualisieren",
"col_user": "Benutzer",
"col_origin": "Herkunft",
"col_created": "Erstellt",
"col_expires": "Läuft ab",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "Widerrufen",
"empty": "Keine Sitzungen entsprechen dem aktuellen Filter.",
"revoke_self_confirm": "⚠️ Dies ist IHRE aktuelle Sitzung. Wenn Sie sie widerrufen, werden Sie sofort abgemeldet und müssen sich neu anmelden. Fortfahren?",
"revoke_confirm": "Diese Sitzung widerrufen? Die nächste Anfrage von diesem Browser erhält 401."
"revoke_confirm": "Diese Sitzung widerrufen? Die nächste Anfrage von diesem Browser erhält 401.",
"revoke_lag_notice": "Das Widerrufen einer Sitzung unterbricht den Refresh-Pfad sofort, aber ein bereits im Browser vorhandenes JWT bleibt bis zu {{secs}} Sekunden gültig, bis der nächste Refresh-Versuch erfolgt.",
"origin": {
"password": "Passwort",
"opaque": "OPAQUE",
"magic_link": "Magic Link",
"oidc": "SSO",
"device": "Gerät",
"unknown": "Unbekannt"
}
},
"smtp_fail": "Senden fehlgeschlagen.",
"smtp_send": "Senden",
+11 -1
View File
@@ -1120,6 +1120,7 @@
"include_revoked": "Include revoked / expired",
"refresh": "Refresh",
"col_user": "User",
"col_origin": "Origin",
"col_created": "Created",
"col_expires": "Expires",
"col_ip": "IP",
@@ -1135,7 +1136,16 @@
"revoke": "Revoke",
"empty": "No sessions match the current filter.",
"revoke_self_confirm": "⚠️ This is YOUR current session. Revoking it will log YOU out immediately and you'll have to sign back in. Continue?",
"revoke_confirm": "Revoke this session? The next request from that browser will 401."
"revoke_confirm": "Revoke this session? The next request from that browser will 401.",
"revoke_lag_notice": "Revoking a session breaks its refresh path immediately, but any JWT already in the browser stays valid for up to {{secs}} seconds until the next refresh attempt.",
"origin": {
"password": "Password",
"opaque": "OPAQUE",
"magic_link": "Magic link",
"oidc": "SSO",
"device": "Device",
"unknown": "Unknown"
}
},
"settings_saved_ok": "Settings saved.",
"smtp": "Email (SMTP)",
+11 -1
View File
@@ -853,6 +853,7 @@
"include_revoked": "Incluir revocadas / caducadas",
"refresh": "Actualizar",
"col_user": "Usuario",
"col_origin": "Origen",
"col_created": "Creada",
"col_expires": "Caduca",
"col_ip": "IP",
@@ -868,7 +869,16 @@
"revoke": "Revocar",
"empty": "Ninguna sesión coincide con el filtro actual.",
"revoke_self_confirm": "⚠️ Esta es SU sesión actual. Al revocarla se cerrará su sesión inmediatamente y tendrá que iniciar sesión de nuevo. ¿Continuar?",
"revoke_confirm": "¿Revocar esta sesión? La próxima petición desde ese navegador devolverá 401."
"revoke_confirm": "¿Revocar esta sesión? La próxima petición desde ese navegador devolverá 401.",
"revoke_lag_notice": "Revocar una sesión rompe su vía de renovación de inmediato, pero cualquier JWT ya presente en el navegador permanece válido hasta {{secs}} segundos, hasta el próximo intento de renovación.",
"origin": {
"password": "Contraseña",
"opaque": "OPAQUE",
"magic_link": "Enlace mágico",
"oidc": "SSO",
"device": "Dispositivo",
"unknown": "Desconocido"
}
},
"smtp_fail": "Fallo al enviar.",
"smtp_send": "Enviar",
+11 -1
View File
@@ -831,6 +831,7 @@
"include_revoked": "شامل لغو‌شده‌ها / منقضی‌شده‌ها",
"refresh": "به‌روزرسانی",
"col_user": "کاربر",
"col_origin": "منبع",
"col_created": "ایجاد شده",
"col_expires": "انقضا",
"col_ip": "IP",
@@ -846,7 +847,16 @@
"revoke": "لغو",
"empty": "هیچ نشستی با فیلتر فعلی مطابقت ندارد.",
"revoke_self_confirm": "⚠️ این نشست فعلی شماست. با لغو آن، بلافاصله خارج می‌شوید و باید دوباره وارد شوید. ادامه؟",
"revoke_confirm": "این نشست لغو شود؟ درخواست بعدی از آن مرورگر با 401 پاسخ داده می‌شود."
"revoke_confirm": "این نشست لغو شود؟ درخواست بعدی از آن مرورگر با 401 پاسخ داده می‌شود.",
"revoke_lag_notice": "لغو یک نشست بلافاصله مسیر تازه‌سازی را قطع می‌کند، اما هر JWT که از قبل در مرورگر وجود دارد تا {{secs}} ثانیه تا تلاش بعدی برای تازه‌سازی معتبر باقی می‌ماند.",
"origin": {
"password": "رمز عبور",
"opaque": "OPAQUE",
"magic_link": "پیوند جادویی",
"oidc": "SSO",
"device": "دستگاه",
"unknown": "ناشناخته"
}
},
"smtp_fail": "ارسال ناموفق.",
"smtp_send": "ارسال",
+11 -1
View File
@@ -859,6 +859,7 @@
"include_revoked": "Inclure les révoquées / expirées",
"refresh": "Actualiser",
"col_user": "Utilisateur",
"col_origin": "Origine",
"col_created": "Créée",
"col_expires": "Expire",
"col_ip": "IP",
@@ -874,7 +875,16 @@
"revoke": "Révoquer",
"empty": "Aucune session ne correspond au filtre actuel.",
"revoke_self_confirm": "⚠️ Il s'agit de VOTRE session actuelle. La révoquer vous déconnectera immédiatement et vous devrez vous reconnecter. Continuer ?",
"revoke_confirm": "Révoquer cette session ? La prochaine requête depuis ce navigateur renverra 401."
"revoke_confirm": "Révoquer cette session ? La prochaine requête depuis ce navigateur renverra 401.",
"revoke_lag_notice": "La révocation d'une session coupe immédiatement son chemin de rafraîchissement, mais tout JWT déjà présent dans le navigateur reste valide pendant jusqu'à {{secs}} secondes, jusqu'à la prochaine tentative de rafraîchissement.",
"origin": {
"password": "Mot de passe",
"opaque": "OPAQUE",
"magic_link": "Lien magique",
"oidc": "SSO",
"device": "Appareil",
"unknown": "Inconnu"
}
},
"smtp_fail": "Échec de l'envoi.",
"smtp_send": "Envoyer",
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "रद्द / समाप्त शामिल करें",
"refresh": "ताज़ा करें",
"col_user": "उपयोगकर्ता",
"col_origin": "स्रोत",
"col_created": "बनाई गई",
"col_expires": "समाप्त होगी",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "रद्द करें",
"empty": "वर्तमान फ़िल्टर से कोई सत्र मेल नहीं खाता।",
"revoke_self_confirm": "⚠️ यह आपका वर्तमान सत्र है। इसे रद्द करने पर आप तुरंत साइन आउट हो जाएंगे और आपको दोबारा साइन इन करना होगा। जारी रखें?",
"revoke_confirm": "इस सत्र को रद्द करें? उस ब्राउज़र से अगला अनुरोध 401 होगा।"
"revoke_confirm": "इस सत्र को रद्द करें? उस ब्राउज़र से अगला अनुरोध 401 होगा।",
"revoke_lag_notice": "किसी सत्र को रद्द करने से उसका रीफ़्रेश पथ तुरंत टूट जाता है, लेकिन ब्राउज़र में पहले से मौजूद कोई भी JWT अगले रीफ़्रेश प्रयास तक {{secs}} सेकंड तक मान्य रहता है।",
"origin": {
"password": "पासवर्ड",
"opaque": "OPAQUE",
"magic_link": "मैजिक लिंक",
"oidc": "SSO",
"device": "डिवाइस",
"unknown": "अज्ञात"
}
},
"smtp_fail": "भेजना विफल।",
"smtp_send": "भेजें",
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "Includi revocate / scadute",
"refresh": "Aggiorna",
"col_user": "Utente",
"col_origin": "Origine",
"col_created": "Creata",
"col_expires": "Scade",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "Revoca",
"empty": "Nessuna sessione corrisponde al filtro attuale.",
"revoke_self_confirm": "⚠️ Questa è la TUA sessione corrente. Revocarla ti disconnetterà immediatamente e dovrai accedere di nuovo. Continuare?",
"revoke_confirm": "Revocare questa sessione? La prossima richiesta da quel browser risponderà 401."
"revoke_confirm": "Revocare questa sessione? La prossima richiesta da quel browser risponderà 401.",
"revoke_lag_notice": "Revocare una sessione interrompe immediatamente il suo percorso di aggiornamento, ma qualsiasi JWT già presente nel browser rimane valido fino a {{secs}} secondi, fino al prossimo tentativo di aggiornamento.",
"origin": {
"password": "Password",
"opaque": "OPAQUE",
"magic_link": "Link magico",
"oidc": "SSO",
"device": "Dispositivo",
"unknown": "Sconosciuto"
}
},
"smtp_fail": "Invio non riuscito.",
"smtp_send": "Invia",
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "取り消し済み / 期限切れを含む",
"refresh": "更新",
"col_user": "ユーザー",
"col_origin": "由来",
"col_created": "作成日時",
"col_expires": "有効期限",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "取り消し",
"empty": "現在のフィルターに一致するセッションはありません。",
"revoke_self_confirm": "⚠️ これはあなたの現在のセッションです。取り消すと直ちにサインアウトされ、再度サインインが必要になります。続行しますか?",
"revoke_confirm": "このセッションを取り消しますか? そのブラウザからの次のリクエストは 401 になります。"
"revoke_confirm": "このセッションを取り消しますか? そのブラウザからの次のリクエストは 401 になります。",
"revoke_lag_notice": "セッションを取り消すと、リフレッシュ経路は直ちに切断されますが、ブラウザにすでに存在する JWT は次のリフレッシュ試行まで最大 {{secs}} 秒間有効なままです。",
"origin": {
"password": "パスワード",
"opaque": "OPAQUE",
"magic_link": "マジックリンク",
"oidc": "SSO",
"device": "デバイス",
"unknown": "不明"
}
},
"smtp_fail": "送信に失敗しました。",
"smtp_send": "送信",
+11 -1
View File
@@ -975,6 +975,7 @@
"include_revoked": "취소됨 / 만료됨 포함",
"refresh": "새로 고침",
"col_user": "사용자",
"col_origin": "출처",
"col_created": "생성일",
"col_expires": "만료일",
"col_ip": "IP",
@@ -990,7 +991,16 @@
"revoke": "취소",
"empty": "현재 필터와 일치하는 세션이 없습니다.",
"revoke_self_confirm": "⚠️ 현재 사용 중인 세션입니다. 취소하면 즉시 로그아웃되고 다시 로그인해야 합니다. 계속하시겠습니까?",
"revoke_confirm": "이 세션을 취소하시겠습니까? 해당 브라우저의 다음 요청은 401을 받게 됩니다."
"revoke_confirm": "이 세션을 취소하시겠습니까? 해당 브라우저의 다음 요청은 401을 받게 됩니다.",
"revoke_lag_notice": "세션을 취소하면 새로 고침 경로가 즉시 끊어지지만, 브라우저에 이미 있는 JWT는 다음 새로 고침 시도까지 최대 {{secs}}초 동안 유효합니다.",
"origin": {
"password": "비밀번호",
"opaque": "OPAQUE",
"magic_link": "매직 링크",
"oidc": "SSO",
"device": "장치",
"unknown": "알 수 없음"
}
},
"smtp_fail": "전송 실패.",
"smtp_send": "보내기",
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "Ingetrokken / verlopen tonen",
"refresh": "Vernieuwen",
"col_user": "Gebruiker",
"col_origin": "Herkomst",
"col_created": "Aangemaakt",
"col_expires": "Verloopt",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "Intrekken",
"empty": "Geen sessies komen overeen met het huidige filter.",
"revoke_self_confirm": "⚠️ Dit is UW huidige sessie. Intrekken meldt u direct af en u moet opnieuw inloggen. Doorgaan?",
"revoke_confirm": "Deze sessie intrekken? Het volgende verzoek van die browser krijgt 401."
"revoke_confirm": "Deze sessie intrekken? Het volgende verzoek van die browser krijgt 401.",
"revoke_lag_notice": "Het intrekken van een sessie verbreekt onmiddellijk het vernieuwingspad, maar elke JWT die al in de browser aanwezig is, blijft geldig tot {{secs}} seconden, tot de volgende vernieuwingspoging.",
"origin": {
"password": "Wachtwoord",
"opaque": "OPAQUE",
"magic_link": "Magische link",
"oidc": "SSO",
"device": "Apparaat",
"unknown": "Onbekend"
}
},
"smtp_fail": "Verzenden mislukt.",
"smtp_send": "Verzenden",
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "Uwzględnij unieważnione / wygasłe",
"refresh": "Odśwież",
"col_user": "Użytkownik",
"col_origin": "Pochodzenie",
"col_created": "Utworzono",
"col_expires": "Wygasa",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "Unieważnij",
"empty": "Żadne sesje nie pasują do bieżącego filtra.",
"revoke_self_confirm": "⚠️ To TWOJA bieżąca sesja. Unieważnienie jej wyloguje Cię natychmiast i musisz zalogować się ponownie. Kontynuować?",
"revoke_confirm": "Unieważnić tę sesję? Następne żądanie z tej przeglądarki otrzyma 401."
"revoke_confirm": "Unieważnić tę sesję? Następne żądanie z tej przeglądarki otrzyma 401.",
"revoke_lag_notice": "Unieważnienie sesji natychmiast przerywa ścieżkę odświeżania, ale każdy JWT już obecny w przeglądarce pozostaje ważny przez maksymalnie {{secs}} sekund, aż do następnej próby odświeżenia.",
"origin": {
"password": "Hasło",
"opaque": "OPAQUE",
"magic_link": "Magiczny link",
"oidc": "SSO",
"device": "Urządzenie",
"unknown": "Nieznane"
}
},
"smtp_fail": "Wysłanie nie powiodło się.",
"smtp_send": "Wyślij",
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "Incluir revogadas / expiradas",
"refresh": "Atualizar",
"col_user": "Utilizador",
"col_origin": "Origem",
"col_created": "Criada",
"col_expires": "Expira",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "Revogar",
"empty": "Nenhuma sessão corresponde ao filtro atual.",
"revoke_self_confirm": "⚠️ Esta é a SUA sessão atual. Revogá-la irá terminar a sessão imediatamente e terá de iniciar sessão novamente. Continuar?",
"revoke_confirm": "Revogar esta sessão? O próximo pedido desse browser receberá 401."
"revoke_confirm": "Revogar esta sessão? O próximo pedido desse browser receberá 401.",
"revoke_lag_notice": "Revogar uma sessão interrompe imediatamente o seu caminho de renovação, mas qualquer JWT já presente no navegador permanece válido por até {{secs}} segundos, até à próxima tentativa de renovação.",
"origin": {
"password": "Palavra-passe",
"opaque": "OPAQUE",
"magic_link": "Ligação mágica",
"oidc": "SSO",
"device": "Dispositivo",
"unknown": "Desconhecido"
}
},
"smtp_fail": "Falha no envio.",
"smtp_send": "Enviar",
+11 -1
View File
@@ -848,6 +848,7 @@
"include_revoked": "Включая отозванные / истёкшие",
"refresh": "Обновить",
"col_user": "Пользователь",
"col_origin": "Источник",
"col_created": "Создан",
"col_expires": "Истекает",
"col_ip": "IP",
@@ -863,7 +864,16 @@
"revoke": "Отозвать",
"empty": "Нет сеансов, соответствующих текущему фильтру.",
"revoke_self_confirm": "⚠️ Это ВАШ текущий сеанс. При отзыве вы будете немедленно разлогинены и придётся войти снова. Продолжить?",
"revoke_confirm": "Отозвать этот сеанс? Следующий запрос из этого браузера получит 401."
"revoke_confirm": "Отозвать этот сеанс? Следующий запрос из этого браузера получит 401.",
"revoke_lag_notice": "Отзыв сессии немедленно прерывает путь её обновления, но любой JWT, уже находящийся в браузере, остаётся действительным до {{secs}} секунд, до следующей попытки обновления.",
"origin": {
"password": "Пароль",
"opaque": "OPAQUE",
"magic_link": "Волшебная ссылка",
"oidc": "SSO",
"device": "Устройство",
"unknown": "Неизвестно"
}
},
"smtp_fail": "Сбой отправки.",
"smtp_send": "Отправить",
+11 -1
View File
@@ -831,6 +831,7 @@
"include_revoked": "包含已撤銷 / 已過期",
"refresh": "重新整理",
"col_user": "使用者",
"col_origin": "來源",
"col_created": "建立於",
"col_expires": "過期於",
"col_ip": "IP",
@@ -846,7 +847,16 @@
"revoke": "撤銷",
"empty": "沒有工作階段符合目前的篩選條件。",
"revoke_self_confirm": "⚠️ 這是您目前的工作階段。撤銷後將立即登出,您必須重新登入。要繼續嗎?",
"revoke_confirm": "撤銷此工作階段?該瀏覽器的下一次請求將回傳 401。"
"revoke_confirm": "撤銷此工作階段?該瀏覽器的下一次請求將回傳 401。",
"revoke_lag_notice": "撤銷工作階段會立即中斷其重新整理路徑,但瀏覽器中已存在的任何 JWT 在下次重新整理嘗試之前最多可保持有效 {{secs}} 秒。",
"origin": {
"password": "密碼",
"opaque": "OPAQUE",
"magic_link": "魔法連結",
"oidc": "SSO",
"device": "裝置",
"unknown": "未知"
}
},
"smtp_fail": "傳送失敗。",
"smtp_send": "傳送",
+11 -1
View File
@@ -831,6 +831,7 @@
"include_revoked": "包含已撤销 / 已过期",
"refresh": "刷新",
"col_user": "用户",
"col_origin": "来源",
"col_created": "创建于",
"col_expires": "过期于",
"col_ip": "IP",
@@ -846,7 +847,16 @@
"revoke": "撤销",
"empty": "没有会话与当前筛选条件匹配。",
"revoke_self_confirm": "⚠️ 这是您当前的会话。撤销后您将立即被注销并需要重新登录。是否继续?",
"revoke_confirm": "撤销此会话吗?该浏览器的下一次请求将返回 401。"
"revoke_confirm": "撤销此会话吗?该浏览器的下一次请求将返回 401。",
"revoke_lag_notice": "撤销会话会立即中断其刷新路径,但浏览器中已存在的任何 JWT 在下次刷新尝试之前最多可保持有效 {{secs}} 秒。",
"origin": {
"password": "密码",
"opaque": "OPAQUE",
"magic_link": "魔法链接",
"oidc": "SSO",
"device": "设备",
"unknown": "未知"
}
},
"smtp_fail": "发送失败。",
"smtp_send": "发送",