Compare commits

...

6 Commits

Author SHA1 Message Date
Kyle Mendell
505bdcb8ba release: 1.6.2 2025-07-09 16:56:34 -05:00
Kyle Mendell
f103a54790 fix: ensure confirmation dialog shows on top of other components 2025-07-09 16:50:01 -05:00
Alessandro (Ale) Segala
e1de593dcd fix: login failures on Postgres when IP is null (#737) 2025-07-09 08:45:07 -05:00
Elias Schneider
45f42772b1 chore(translations): update translations via Crowdin (#730) 2025-07-07 20:06:52 -05:00
XLion
98152640b1 chore(translations): Fix inconsistent punctuation marks for the language name of zh-TW (#731) 2025-07-07 12:54:45 +00:00
github-actions[bot]
04e235e805 chore: update AAGUIDs (#729)
Co-authored-by: stonith404 <58886915+stonith404@users.noreply.github.com>
2025-07-06 21:04:32 -05:00
11 changed files with 77 additions and 68 deletions

View File

@@ -1 +1 @@
1.6.1
1.6.2

View File

@@ -1,3 +1,9 @@
## [](https://github.com/pocket-id/pocket-id/compare/v1.6.1...v) (2025-07-09)
### Bug Fixes
* ensure confirmation dialog shows on top of other components ([f103a54](https://github.com/pocket-id/pocket-id/commit/f103a547904070c5b192e519c8b5a8fed9d80e96))
* login failures on Postgres when IP is null ([#737](https://github.com/pocket-id/pocket-id/issues/737)) ([e1de593](https://github.com/pocket-id/pocket-id/commit/e1de593dcd30b7b04da3b003455134992b702595))
## [](https://github.com/pocket-id/pocket-id/compare/v1.5.0...v) (2025-07-06)

View File

@@ -29,7 +29,7 @@ func (m *RateLimitMiddleware) Add(limit rate.Limit, burst int) gin.HandlerFunc {
// Skip rate limiting for localhost and test environment
// If the client ip is localhost the request comes from the frontend
if ip == "127.0.0.1" || ip == "::1" || common.EnvConfig.AppEnv == "test" {
if ip == "" || ip == "127.0.0.1" || ip == "::1" || common.EnvConfig.AppEnv == "test" {
c.Next()
return
}

View File

@@ -70,12 +70,17 @@ func (s *AuditLogService) CreateNewSignInWithEmail(ctx context.Context, ipAddres
// Count the number of times the user has logged in from the same device
var count int64
err := tx.
stmt := tx.
WithContext(ctx).
Model(&model.AuditLog{}).
Where("user_id = ? AND ip_address = ? AND user_agent = ?", userID, ipAddress, userAgent).
Count(&count).
Error
Where("user_id = ? AND user_agent = ?", userID, ipAddress)
if ipAddress == "" {
// An empty IP address is stored as NULL in the database
stmt = stmt.Where("ip_address IS NULL")
} else {
stmt = stmt.Where("ip_address = ?", ipAddress)
}
err := stmt.Count(&count).Error
if err != nil {
log.Printf("Failed to count audit logs: %v", err)
return createdAuditLog

View File

@@ -469,9 +469,7 @@ func (s *UserService) ExchangeOneTimeAccessToken(ctx context.Context, token stri
return model.User{}, "", err
}
if ipAddress != "" && userAgent != "" {
s.auditLogService.Create(ctx, model.AuditLogEventOneTimeAccessTokenSignIn, ipAddress, userAgent, oneTimeAccessToken.User.ID, model.AuditLogData{}, tx)
}
s.auditLogService.Create(ctx, model.AuditLogEventOneTimeAccessTokenSignIn, ipAddress, userAgent, oneTimeAccessToken.User.ID, model.AuditLogData{}, tx)
err = tx.Commit().Error
if err != nil {

File diff suppressed because one or more lines are too long

View File

@@ -37,7 +37,7 @@
"generate_code": "Сгенерировать код",
"name": "Имя",
"browser_unsupported": "Браузер не поддерживается",
"this_browser_does_not_support_passkeys": "Этот браузер не поддерживает passkey. Пожалуйста, воспользуйтесь альтернативным способом входа.",
"this_browser_does_not_support_passkeys": "Этот браузер не поддерживает ключи доступа. Пожалуйста, воспользуйтесь альтернативным способом входа.",
"an_unknown_error_occurred": "Произошла неизвестная ошибка",
"authentication_process_was_aborted": "Процесс аутентификации был прерван",
"error_occurred_with_authenticator": "С аутентификатором произошла ошибка",
@@ -107,11 +107,11 @@
"passkey_missing": "Passkey отсутствует",
"please_provide_a_passkey_to_prevent_losing_access_to_your_account": "Пожалуйста, добавьте passkey, чтобы избежать утери доступа к вашей учетной записи.",
"single_passkey_configured": "Настроен один passkey",
"it_is_recommended_to_add_more_than_one_passkey": "Рекомендуется добавить более одного passkey во избежание потери доступа к вашей учетной записи.",
"it_is_recommended_to_add_more_than_one_passkey": "Рекомендуется добавить более одного ключа доступа во избежание потери доступа к вашей учетной записи.",
"account_details": "Детали учетной записи",
"passkeys": "Passkeys",
"manage_your_passkeys_that_you_can_use_to_authenticate_yourself": "Управляйте passkeys, которые вы можете использовать для аутентификации себя.",
"add_passkey": "Добавить Passkey",
"passkeys": "Ключи доступа",
"manage_your_passkeys_that_you_can_use_to_authenticate_yourself": "Управляйте ключами доступа, которые вы можете использовать для аутентификации.",
"add_passkey": "Добавить ключ",
"create_a_one_time_login_code_to_sign_in_from_a_different_device_without_a_passkey": "Создайте одноразовый код входа, чтобы войти с другого устройства без passkey.",
"create": "Создать",
"first_name": "Имя",
@@ -178,7 +178,7 @@
"email_login_notification": "Уведомление о логине по электронной почте",
"send_an_email_to_the_user_when_they_log_in_from_a_new_device": "Отправлять пользователю письмо при входе с нового устройства.",
"emai_login_code_requested_by_user": "Код входа по электронной почте, запрошенный пользователем",
"allow_users_to_sign_in_with_a_login_code_sent_to_their_email": "Позволяет пользователям обходить вход через passkey, запросив код входа, отправляемый на их электронную почту. Это значительно снижает безопасность так как любой человек, имеющий доступ к электронной почте пользователя, может получить доступ.",
"allow_users_to_sign_in_with_a_login_code_sent_to_their_email": "Позволяет пользователям обходить вход через ключи доступа, запросив код входа, отправляемый на их электронную почту. Это значительно снижает безопасность, так как любой человек, имеющий доступ к электронной почте пользователя, может получить доступ.",
"email_login_code_from_admin": "Код входа по электронной почте от администратора",
"allows_an_admin_to_send_a_login_code_to_the_user": "Позволяет администратору отправлять код входа пользователю по электронной почте.",
"send_test_email": "Отправить тестовое письмо",
@@ -244,7 +244,7 @@
"user_details_firstname_lastname": "Данные пользователя {firstName} {lastName}",
"manage_which_groups_this_user_belongs_to": "Управление группами, к которым принадлежит этот пользователь.",
"custom_claims": "Пользовательские claims",
"custom_claims_are_key_value_pairs_that_can_be_used_to_store_additional_information_about_a_user": "Пользовательские claims — это пары ключ-значение, которые могут использоваться для хранения дополнительной информации о пользователе. Эти пары будут включены в ID Token при запросе scope 'profile'.",
"custom_claims_are_key_value_pairs_that_can_be_used_to_store_additional_information_about_a_user": "Пользовательские claims — это пары ключ-значение, которые могут использоваться для хранения дополнительной информации о пользователе. Эти пары будут включены в ID Token при запросе scope \"profile\".",
"user_group_created_successfully": "Группа пользователей успешно создана",
"create_user_group": "Создать группу пользователей",
"create_a_new_group_that_can_be_assigned_to_users": "Создайте новую группу, которая может быть назначена пользователям.",
@@ -252,7 +252,7 @@
"manage_user_groups": "Управление группами пользователей",
"friendly_name": "Удобное имя",
"name_that_will_be_displayed_in_the_ui": "Название, которое будет отображаться в интерфейсе",
"name_that_will_be_in_the_groups_claim": "Название, которое будет в 'groups' claim",
"name_that_will_be_in_the_groups_claim": "Название, которое будет в claim \"groups\"",
"delete_name": "Удалить {name}",
"are_you_sure_you_want_to_delete_this_user_group": "Вы уверены, что хотите удалить эту группу пользователей?",
"user_group_deleted_successfully": "Группа пользователей успешно удалена",
@@ -261,7 +261,7 @@
"users_updated_successfully": "Пользователи успешно обновлены",
"user_group_details_name": "Группа пользователей {name}",
"assign_users_to_this_group": "Назначить пользователей этой группе.",
"custom_claims_are_key_value_pairs_that_can_be_used_to_store_additional_information_about_a_user_prioritized": "Пользовательские claims — это пары ключ-значение, которые могут использоваться для хранения дополнительной информации о пользователе. Эти пары будут включены в ID Token при запросе scope 'profile'. Пользовательские claims, определенные для пользователя, в случае конфликта будут приоритизированы.",
"custom_claims_are_key_value_pairs_that_can_be_used_to_store_additional_information_about_a_user_prioritized": "Пользовательские claims — это пары ключ-значение, которые могут использоваться для хранения дополнительной информации о пользователе. Эти пары будут включены в ID Token при запросе scope \"profile\". Пользовательские claims, определенные для пользователя, в случае конфликта будут приоритизированы.",
"oidc_client_created_successfully": "OIDC клиент успешно создан",
"create_oidc_client": "Создать OIDC клиент",
"add_a_new_oidc_client_to_appname": "Добавить новый OIDC клиент в {appName}.",
@@ -289,7 +289,7 @@
"logout_url": "Logout URL",
"certificate_url": "Certificate URL",
"enabled": "Включен",
"disabled": "Выключен",
"disabled": "Отключено",
"oidc_client_updated_successfully": "OIDC клиент успешно обновлен",
"create_new_client_secret": "Создать новый клиентский секрет",
"are_you_sure_you_want_to_create_a_new_client_secret": "Вы уверены, что хотите создать новый клиентский секрет? Старый будет аннулирован.",
@@ -312,8 +312,8 @@
"reset": "Сбросить",
"reset_to_default": "Сбросить по умолчанию",
"profile_picture_has_been_reset": "Изображение профиля было сброшено. Обновление может занять несколько минут.",
"select_the_language_you_want_to_use": "Выбери язык, на котором хочешь работать. Имей в виду, что часть текста может быть переведена автоматически и может содержать неточности.",
"contribute_to_translation": "Если ты нашел ошибку, приглашаем тебя помочь с переводом на <link href='https://crowdin.com/project/pocket-id'>Crowdin</link>.",
"select_the_language_you_want_to_use": "Выберите язык, который вы хотите использовать. Обратите внимание на то, что часть текста может быть переведена автоматически и содержать неточности.",
"contribute_to_translation": "Если вы нашли ошибку, приглашаем вас помочь с переводом на <link href='https://crowdin.com/project/pocket-id'>Crowdin</link>.",
"personal": "Персональный",
"global": "Глобальный",
"all_users": "Все пользователи",

View File

@@ -65,7 +65,7 @@
"do_you_want_to_sign_out_of_pocketid_with_the_account": "您確定要使用帳號 <b>{username}</b> 登出 {appName} 嗎?",
"sign_in_to_appname": "登入 {appName}",
"please_try_to_sign_in_again": "請嘗試重新登入。",
"authenticate_with_passkey_to_access_account": "使用您的密碼進行身份驗證以存取您的帳。",
"authenticate_with_passkey_to_access_account": "使用您的密碼金鑰進行身份驗證以存取您的帳。",
"authenticate": "驗證",
"please_try_again": "請再試一次。",
"continue": "繼續",
@@ -93,7 +93,7 @@
"settings": "設定",
"update_pocket_id": "更新 Pocket ID",
"powered_by": "技術支援",
"see_your_account_activities_from_the_last_3_months": "查看您過去 3 個月的帳活動。",
"see_your_account_activities_from_the_last_3_months": "查看您過去 3 個月的帳活動。",
"time": "時間",
"event": "事件",
"approximate_location": "概略位置",
@@ -103,12 +103,12 @@
"unknown": "未知",
"account_details_updated_successfully": "帳號資訊更新成功",
"profile_picture_updated_successfully": "個人資料圖片更新成功。 這可能會花幾分鐘更新。",
"account_settings": "帳設定",
"account_settings": "帳設定",
"passkey_missing": "沒有密碼金鑰",
"please_provide_a_passkey_to_prevent_losing_access_to_your_account": "請新增密碼金鑰以避免日後無法存取您的帳。",
"please_provide_a_passkey_to_prevent_losing_access_to_your_account": "請新增密碼金鑰以避免日後無法存取您的帳。",
"single_passkey_configured": "已設定一組密碼金鑰",
"it_is_recommended_to_add_more_than_one_passkey": "建議您新增多組密碼金鑰,以避免日後無法存取帳。",
"account_details": "帳詳細資料",
"it_is_recommended_to_add_more_than_one_passkey": "建議您新增多組密碼金鑰,以避免日後無法存取帳。",
"account_details": "帳詳細資料",
"passkeys": "密碼金鑰",
"manage_your_passkeys_that_you_can_use_to_authenticate_yourself": "管理可用於驗證身分的密碼金鑰。",
"add_passkey": "新增密碼金鑰",
@@ -178,7 +178,7 @@
"email_login_notification": "電子郵件登入通知",
"send_an_email_to_the_user_when_they_log_in_from_a_new_device": "使用者從新裝置登入時寄送電子郵件通知。",
"emai_login_code_requested_by_user": "使用者請求電子郵件登入代碼",
"allow_users_to_sign_in_with_a_login_code_sent_to_their_email": "允許使用者透過要求將登入代碼傳送到他們的電子郵件繞過密碼。這會大幅降低安全性,因為任何可以存取使用者電子郵件的人都可以進入。",
"allow_users_to_sign_in_with_a_login_code_sent_to_their_email": "允許使用者透過要求將登入代碼傳送到他們的電子郵件繞過密碼金鑰。這會大幅降低安全性,因為任何可以存取使用者電子郵件的人都可以獲得存取權限。",
"email_login_code_from_admin": "來自管理員的使用者登入代碼",
"allows_an_admin_to_send_a_login_code_to_the_user": "允許管理員透過電子郵件向使用者發送登入代碼。",
"send_test_email": "發送測試郵件",
@@ -186,7 +186,7 @@
"application_name": "應用程式名稱",
"session_duration": "登入階段有效時長",
"the_duration_of_a_session_in_minutes_before_the_user_has_to_sign_in_again": "使用者需重新登入前的階段時長(以分鐘為單位)。",
"enable_self_account_editing": "允許使用者自行編輯帳資訊",
"enable_self_account_editing": "允許使用者自行編輯帳資訊",
"whether_the_users_should_be_able_to_edit_their_own_account_details": "是否允許使用者編輯自己的帳號資料。",
"emails_verified": "已驗證的電子郵件",
"whether_the_users_email_should_be_marked_as_verified_for_the_oidc_clients": "是否應將使用者的電子郵件標記為已驗證,以供 OIDC 客戶端使用。",
@@ -308,7 +308,7 @@
"background_image": "背景圖片",
"language": "語言",
"reset_profile_picture_question": "重設個人資料圖片?",
"this_will_remove_the_uploaded_image_and_reset_the_profile_picture_to_default": "這將會移除上傳的圖片,並將個人資料圖片重設為預設值。要繼續嗎?",
"this_will_remove_the_uploaded_image_and_reset_the_profile_picture_to_default": "這將會移除上傳的圖片,並將個人資料圖片重設為預設值。您確定要繼續嗎?",
"reset": "重設",
"reset_to_default": "重設至預設值",
"profile_picture_has_been_reset": "個人資料圖片已經重設。 這可能會花幾分鐘更新。",
@@ -326,8 +326,8 @@
"client_authorization": "客戶端授權",
"new_client_authorization": "新客戶端授權",
"disable_animations": "停用動畫",
"turn_off_ui_animations": "關閉整個使用者介面的動畫。",
"user_disabled": "帳已停用",
"turn_off_ui_animations": "關閉整個 UI 的動畫。",
"user_disabled": "帳已停用",
"disabled_users_cannot_log_in_or_use_services": "已停用的使用者不能登入或使用服務。",
"user_disabled_successfully": "使用者已成功停用。",
"user_enabled_successfully": "使用者已成功啟用。",
@@ -348,7 +348,7 @@
"enter_code_displayed_in_previous_step": "請輸入上一步顯示的代碼。",
"authorize": "授權",
"federated_client_credentials": "聯邦身分",
"federated_client_credentials_description": "使用聯邦身分,您可以透過由第三方授權機構簽發的 JWT 權杖來驗證 OIDC 客戶端。",
"federated_client_credentials_description": "使用聯邦身分,您可以透過由第三方授權機構簽發的 JWT 令牌來驗證 OIDC 客戶端。",
"add_federated_client_credential": "增加聯邦身分",
"add_another_federated_client_credential": "新增另一組聯邦身分",
"oidc_allowed_group_count": "允許的群組數量",
@@ -361,7 +361,7 @@
"access_token": "存取令牌",
"userinfo": "使用者資訊",
"id_token_payload": "ID 令牌有效負載",
"access_token_payload": "存取權杖有效負載",
"access_token_payload": "存取令牌有效負載",
"userinfo_endpoint_response": "使用者資訊端點回應",
"copy": "複製",
"no_preview_data_available": "無預覽資料",
@@ -370,54 +370,54 @@
"preview_for_user": "預覽 {name} ({email})",
"preview_the_oidc_data_that_would_be_sent_for_this_user": "預覽將為此使用者傳送的 OIDC 資料",
"show": "顯示",
"select_an_option": "選擇選項",
"select_an_option": "選擇一個選項",
"select_user": "選擇使用者",
"error": "錯誤",
"select_an_accent_color_to_customize_the_appearance_of_pocket_id": "選擇重點顏色,自訂 Pocket ID 的外觀。",
"accent_color": "重點顏色",
"custom_accent_color": "自訂色",
"custom_accent_color_description": "使用有效的 CSS 顏色格式 (例如hex、rgb、hsl) 輸入自訂顏色。",
"select_an_accent_color_to_customize_the_appearance_of_pocket_id": "選擇強調色以自訂 Pocket ID 的外觀。",
"accent_color": "強調色",
"custom_accent_color": "自訂強調色",
"custom_accent_color_description": "使用有效的 CSS 顏色格式例如hex、rgb、hsl輸入自訂顏色。",
"color_value": "顏色值",
"apply": "申請",
"signup_token": "註冊代碼",
"create_a_signup_token_to_allow_new_user_registration": "建立註冊標記,允許新使用者註冊。",
"usage_limit": "使用限制",
"number_of_times_token_can_be_used": "註冊標記可使用的次數。",
"apply": "套用",
"signup_token": "註冊令牌",
"create_a_signup_token_to_allow_new_user_registration": "建立註冊令牌,允許新使用者註冊。",
"usage_limit": "使用次數限制",
"number_of_times_token_can_be_used": "註冊令牌可使用的次數。",
"expires": "到期",
"signup": "註冊",
"signup_requires_valid_token": "建立帳需要有效的註冊標記",
"signup_requires_valid_token": "建立帳需要有效的註冊令牌",
"validating_signup_token": "驗證註冊標記",
"go_to_login": "前往登入",
"signup_to_appname": "註冊 {appName}",
"create_your_account_to_get_started": "建立您的帳即可開始使用。",
"initial_account_creation_description": "請先建立您的帳。您稍後可以設定密碼。",
"setup_your_passkey": "設定您的密碼",
"create_a_passkey_to_securely_access_your_account": "建立密碼以安全存取您的帳。這將是您登入的主要方式。",
"create_your_account_to_get_started": "建立您的帳即可開始使用。",
"initial_account_creation_description": "請先建立您的帳號以開始。您稍後可以設定密碼金鑰。",
"setup_your_passkey": "設定您的密碼金鑰",
"create_a_passkey_to_securely_access_your_account": "建立密碼金鑰以安全存取您的帳。這將是您登入的主要方式。",
"skip_for_now": "暫時跳過",
"account_created": "建立帳戶",
"account_created": "帳號已建立",
"enable_user_signups": "啟用使用者註冊",
"enable_user_signups_description": "是否要啟用使用者註冊功能。",
"user_signups_are_disabled": "使用者註冊目前已停用",
"create_signup_token": "建立註冊代用幣",
"view_active_signup_tokens": "檢視有效的註冊代碼",
"manage_signup_tokens": "管理註冊代碼",
"view_and_manage_active_signup_tokens": "檢視並管理有效的註冊代用幣。",
"signup_token_deleted_successfully": "註冊標記已成功刪除。",
"create_signup_token": "建立註冊令牌",
"view_active_signup_tokens": "檢視有效的註冊令牌",
"manage_signup_tokens": "管理註冊令牌",
"view_and_manage_active_signup_tokens": "檢視並管理有效的註冊令牌。",
"signup_token_deleted_successfully": "註冊令牌已成功刪除。",
"expired": "已過期",
"used_up": "已用完",
"active": "活躍",
"usage": "使用方式",
"created": "創建",
"token": "代幣",
"created": "已建立",
"token": "令牌",
"loading": "載入中",
"delete_signup_token": "刪除註冊令牌",
"are_you_sure_you_want_to_delete_this_signup_token": "您確定要刪除這個註冊標記嗎?此動作無法撤銷。",
"signup_disabled_description": "使用者註冊完全停用。只有管理員可以建立新的使用者帳號。",
"signup_with_token": "使用代碼註冊",
"signup_with_token_description": "使用者只能使用管理員建立的有效登入標記註冊。",
"are_you_sure_you_want_to_delete_this_signup_token": "您確定要刪除這個註冊令牌嗎?此動作無法撤銷。",
"signup_disabled_description": "使用者註冊完全停用。只有管理員可以建立新的使用者帳號。",
"signup_with_token": "使用註冊令牌註冊",
"signup_with_token_description": "使用者只能使用管理員建立的有效登入令牌註冊。",
"signup_open": "開放報名",
"signup_open_description": "任何人都可以不受限制地建立新帳。",
"signup_open_description": "任何人都可以不受限制地建立新帳。",
"of": "的",
"skip_passkey_setup": "跳過密碼設定",
"skip_passkey_setup_description": "我們強烈建議您設定通行鑰匙,因為如果沒有通行鑰匙,當會話到期時,您就會被鎖住。"
"skip_passkey_setup": "跳過密碼金鑰設定",
"skip_passkey_setup_description": "我們強烈建議您設定密碼金鑰,因為如果沒有密碼金鑰,當工作階段到期時,您就會被鎖住。"
}

View File

@@ -1,6 +1,6 @@
{
"name": "pocket-id-frontend",
"version": "1.6.1",
"version": "1.6.2",
"private": true,
"type": "module",
"scripts": {

View File

@@ -5,7 +5,7 @@
</script>
<AlertDialog.Root bind:open={$confirmDialogStore.open}>
<AlertDialog.Content>
<AlertDialog.Content class="z-9999">
<AlertDialog.Header>
<AlertDialog.Title>{$confirmDialogStore.title}</AlertDialog.Title>
<AlertDialog.Description>

View File

@@ -21,7 +21,7 @@
'pt-BR': 'Português brasileiro',
ru: 'Русский',
'zh-CN': '简体中文',
'zh-TW': '繁體中文(臺灣)'
'zh-TW': '繁體中文(臺灣'
};
async function updateLocale(locale: Locale) {