%[1]s
para %[3]s
-commit_repo=enviado para %[3]s em %[4]s
+commit_repo=enviou para %[3]s em %[4]s
create_issue=`abriu a questão %[3]s#%[2]s`
close_issue=`fechou a questão %[3]s#%[2]s`
reopen_issue=`reabriu a questão %[3]s#%[2]s`
@@ -3483,6 +3507,7 @@ runners.reset_registration_token_success=O código de incrição do executor foi
runs.all_workflows=Todas as sequências de trabalho
runs.commit=Cometimento
+runs.scheduled=Agendadas
runs.pushed_by=enviado por
runs.invalid_workflow_helper=O ficheiro de configuração da sequência de trabalho é inválido. Verifique o seu ficheiro de configuração: %s
runs.no_matching_runner_helper=Não há qualquer executor que corresponda: %s
@@ -3497,6 +3522,7 @@ workflow.disable=Desabilitar sequência de trabalho
workflow.disable_success=A sequência de trabalho '%s' foi desabilitada com sucesso.
workflow.enable=Habilitar sequência de trabalho
workflow.enable_success=A sequência de trabalho '%s' foi habilitada com sucesso.
+workflow.disabled=A sequência de trabalho está desabilitada.
need_approval_desc=É necessária aprovação para executar sequências de trabalho para a derivação do pedido de integração.
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index edf3b0b981..709a173df3 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -175,7 +175,6 @@ network_error=Ошибка сети
[startpage]
app_desc=Удобный сервис собственного хостинга репозиториев Git
install=Простой в установке
-install_desc=Просто запустите исполняемый файл для вашей платформы, разверните через Docker, или установите с помощью менеджера пакетов.
platform=Кроссплатформенный
platform_desc=Gitea работает на любой платформе, поддерживаемой Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится!
lightweight=Легковесный
@@ -308,6 +307,7 @@ filter_by_team_repositories=Фильтровать по репозиториям
feed_of=Лента «%s»
show_archived=Архивировано
+archived=Архивировано
show_both_archived_unarchived=Показаны архивированные и разархивированные
show_only_archived=Показаны только архивированные
show_only_unarchived=Показаны только разархивированные
@@ -582,7 +582,6 @@ overview=Обзор
following=Подписки
follow=Подписаться
unfollow=Отписаться
-heatmap.loading=Загрузка карты активности…
user_bio=О себе
disabled_public_activity=Этот пользователь отключил публичную видимость активности.
email_visibility.limited=Ваш адрес электронной почты виден всем выполнившим вход пользователям
@@ -655,7 +654,6 @@ choose_new_avatar=Выбрать новый аватар
update_avatar=Обновить аватар
delete_current_avatar=Удалить текущий аватар
uploaded_avatar_not_a_image=Загружаемый файл не является изображением.
-uploaded_avatar_is_too_big=Загруженный файл превысил максимальный размер.
update_avatar_success=Ваш аватар был изменен.
update_user_avatar_success=Аватар пользователя обновлён.
@@ -1216,6 +1214,11 @@ commit.cherry-pick=Перенос
commit.cherry-pick-header=Cherry-pick: %s
commit.cherry-pick-content=Выбрать ветку для переноса:
+commitstatus.error=Ошибка
+commitstatus.failure=Неудача
+commitstatus.pending=Ожидание
+commitstatus.success=Успешно
+
ext_issues=Доступ к внешним задачам
ext_issues.desc=Ссылка на внешнюю систему отслеживания ошибок.
@@ -1407,9 +1410,9 @@ issues.ref_reopening_from=`сослался(ась) на зап
issues.ref_closed_from=`закрыл этот запрос %[4]s %[2]s`
issues.ref_reopened_from=`переоткрыл эту задачу %[4]s %[2]s`
issues.ref_from=`из %[1]s`
-issues.poster=Автор
-issues.collaborator=Соавтор
-issues.owner=Владелец
+issues.author=Автор
+issues.role.owner=Владелец
+issues.role.member=Участник
issues.re_request_review=Повторить запрос на отзыв
issues.is_stale=Со времени этого обзора в этот PR были внесены некоторые изменения
issues.remove_request_review=Удалить запрос на отзыв
@@ -1724,8 +1727,6 @@ milestones.edit_success=Этап «%s» обновлён.
milestones.deletion=Удалить этап
milestones.deletion_desc=Удаление этапа приведет к его удалению из всех связанных задач. Продолжить?
milestones.deletion_success=Этап успешно удалён.
-milestones.filter_sort.closest_due_date=Ближайшее по дате
-milestones.filter_sort.furthest_due_date=Дальнее по дате
milestones.filter_sort.least_complete=Менее полное
milestones.filter_sort.most_complete=Более полное
milestones.filter_sort.most_issues=Большинство задач
@@ -2196,7 +2197,6 @@ settings.tags.protection.allowed.teams=Разрешенные команды
settings.tags.protection.allowed.noone=Ни один
settings.tags.protection.create=Защитить тег
settings.tags.protection.none=Нет защищенных тегов.
-settings.tags.protection.pattern.description=Вы можете использовать одно имя или глоб-шаблон или регулярное выражение, для выбора нескольких тегов. Подробнее о защищенных тэгах.
settings.bot_token=Токен для бота
settings.chat_id=ID чата
settings.matrix.homeserver_url=URL домашнего сервера
@@ -2710,12 +2710,10 @@ packages.size=Размер
packages.published=Опубликовано
defaulthooks=Стандартные Веб-хуки
-defaulthooks.desc=Веб-хуки автоматически делают HTTP-POST запросы на сервер, когда вызываются определенные события Gitea. Веб-хуки, определённые здесь, по умолчанию и будут скопированы во все новые репозитории. Подробнее читайте в руководстве по веб-хукам.
defaulthooks.add_webhook=Добавить стандартный Веб-хук
defaulthooks.update_webhook=Обновить стандартный Веб-хук
systemhooks=Системные веб-хуки
-systemhooks.desc=Веб-хуки автоматически делают HTTP-POST запросы на сервер, когда вызываются определённые события Gitea. Определённые веб-хуки будут действовать на всех репозиториях системы, поэтому пожалуйста, учитывайте любые последствия для производительности. Подробнее читайте в руководстве по веб-хукам.
systemhooks.add_webhook=Добавить системный веб-хук
systemhooks.update_webhook=Обновить системный веб-хук
@@ -2819,7 +2817,6 @@ auths.tip.google_plus=Получите учётные данные клиент
auths.tip.openid_connect=Используйте OpenID Connect Discovery URL ({{(MirrorRemoteAddress $.Context .Repository .PullMirror.GetRemoteName false).Address}} | +{{.PullMirror.RemoteAddress}} | {{$.locale.Tr "repo.settings.mirror_settings.direction.pull"}} | {{DateTime "full" .PullMirror.UpdatedUnix}} | @@ -200,8 +200,7 @@ |
{{$address.Address}} | +{{.RemoteAddress}} | {{$.locale.Tr "repo.settings.mirror_settings.direction.push"}} | {{if .LastUpdateUnix}}{{DateTime "full" .LastUpdateUnix}}{{else}}{{$.locale.Tr "never"}}{{end}} {{if .LastError}} {{$.locale.Tr "error"}} {{end}} |
@@ -211,7 +210,7 @@ data-tooltip-content="{{$.locale.Tr "repo.settings.mirror_settings.push_mirror.edit_sync_time"}}" data-modal-push-mirror-edit-id="{{.ID}}" data-modal-push-mirror-edit-interval="{{.Interval}}" - data-modal-push-mirror-edit-address="{{$address.Address}}" + data-modal-push-mirror-edit-address="{{.RemoteAddress}}" > {{svg "octicon-pencil" 14}} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 88dc9ea1ce..39c5a7fe11 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -16359,6 +16359,9 @@ "responses": { "200": { "$ref": "#/responses/AccessTokenList" + }, + "403": { + "$ref": "#/responses/forbidden" } } }, @@ -16396,6 +16399,9 @@ }, "400": { "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" } } } @@ -16430,6 +16436,9 @@ "204": { "$ref": "#/responses/empty" }, + "403": { + "$ref": "#/responses/forbidden" + }, "404": { "$ref": "#/responses/notFound" }, diff --git a/tests/integration/api_token_test.go b/tests/integration/api_token_test.go index 1c63d07f22..a713922982 100644 --- a/tests/integration/api_token_test.go +++ b/tests/integration/api_token_test.go @@ -40,6 +40,29 @@ func TestAPIDeleteMissingToken(t *testing.T) { MakeRequest(t, req, http.StatusNotFound) } +// TestAPIGetTokensPermission ensures that only the admin can get tokens from other users +func TestAPIGetTokensPermission(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + // admin can get tokens for other users + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + req := NewRequestf(t, "GET", "/api/v1/users/user2/tokens") + req = AddBasicAuthHeader(req, user.Name) + MakeRequest(t, req, http.StatusOK) + + // non-admin can get tokens for himself + user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + req = NewRequestf(t, "GET", "/api/v1/users/user2/tokens") + req = AddBasicAuthHeader(req, user.Name) + MakeRequest(t, req, http.StatusOK) + + // non-admin can't get tokens for other users + user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) + req = NewRequestf(t, "GET", "/api/v1/users/user2/tokens") + req = AddBasicAuthHeader(req, user.Name) + MakeRequest(t, req, http.StatusForbidden) +} + type permission struct { category auth_model.AccessTokenScopeCategory level auth_model.AccessTokenScopeLevel diff --git a/tests/integration/incoming_email_test.go b/tests/integration/incoming_email_test.go index b4478f5780..1284833864 100644 --- a/tests/integration/incoming_email_test.go +++ b/tests/integration/incoming_email_test.go @@ -154,7 +154,7 @@ func TestIncomingEmail(t *testing.T) { t.Run("Unsubscribe", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - watching, err := issues_model.CheckIssueWatch(user, issue) + watching, err := issues_model.CheckIssueWatch(db.DefaultContext, user, issue) assert.NoError(t, err) assert.True(t, watching) @@ -169,7 +169,7 @@ func TestIncomingEmail(t *testing.T) { assert.NoError(t, handler.Handle(db.DefaultContext, content, user, payload)) - watching, err = issues_model.CheckIssueWatch(user, issue) + watching, err = issues_model.CheckIssueWatch(db.DefaultContext, user, issue) assert.NoError(t, err) assert.False(t, watching) }) diff --git a/web_src/css/base.css b/web_src/css/base.css index b41bfc6942..a305701332 100644 --- a/web_src/css/base.css +++ b/web_src/css/base.css @@ -1969,7 +1969,8 @@ a.ui.ui.ui.basic.primary.label:hover { } .ui.basic.labels .label, -.ui.basic.label { +.ui.basic.label, +.ui.secondary.labels .ui.basic.label { background: var(--color-button); border-color: var(--color-light-border); color: var(--color-text-light); diff --git a/web_src/css/modules/navbar.css b/web_src/css/modules/navbar.css index 61dffb3c80..b6fd2ff20a 100644 --- a/web_src/css/modules/navbar.css +++ b/web_src/css/modules/navbar.css @@ -31,7 +31,6 @@ padding-top: 3px; padding-bottom: 3px; display: flex; - justify-content: center; } #navbar > .menu > .item { diff --git a/web_src/css/repo/issue-label.css b/web_src/css/repo/issue-label.css index a2eb0344a5..1f83e81d96 100644 --- a/web_src/css/repo/issue-label.css +++ b/web_src/css/repo/issue-label.css @@ -30,7 +30,6 @@ .issue-label-list .item .label-operation { width: 33%; - text-align: right; } .issue-label-list .item a { @@ -42,3 +41,7 @@ .issue-label-list .item.org-label { opacity: 0.7; } + +.label-operation .label { + height: fit-content; +} diff --git a/web_src/css/repo/release-tag.css b/web_src/css/repo/release-tag.css index 5d1830f16a..a146eda6a9 100644 --- a/web_src/css/repo/release-tag.css +++ b/web_src/css/repo/release-tag.css @@ -7,22 +7,14 @@ .repository.releases #release-list .release-list-title { font-size: 2rem; font-weight: var(--font-weight-normal); - margin-top: -4px; - margin-bottom: 0; -} - -.repository.releases #release-list > li { - list-style: none; -} - -.repository.releases #release-list > li .meta, -.repository.releases #release-list > li .detail { - padding-top: 30px; - padding-bottom: 40px; + display: flex; + align-items: center; + gap: 0.25em; + margin: 0; } .repository.releases #release-list > li .meta { - margin-top: 4px; + padding-top: 25px; position: relative; text-align: right; display: flex; @@ -31,44 +23,30 @@ } .repository.releases #release-list > li .detail { + padding-bottom: 20px; border-left: 1px solid var(--color-secondary); } .repository.releases #release-list > li .detail .author img { - margin-bottom: 3px; -} - -.repository.releases #release-list > li .detail .download > a .svg { - margin-left: 5px; - margin-right: 5px; + margin-bottom: 2px; /* the legacy trick to align the avatar vertically, no better solution at the moment */ } .repository.releases #release-list > li .detail .download .list { padding-left: 0; -} - -.repository.releases #release-list > li .detail .download .list li { - list-style: none; - display: block; - padding: 8px; border: 1px solid var(--color-secondary); + border-radius: var(--border-radius); background: var(--color-light); } -.repository.releases #release-list > li .detail .download .list li a > .text.right { - margin-right: 5px; +.repository.releases #release-list > li .detail .download .list li { + display: flex; + justify-content: space-between; + padding: 8px; + border-bottom: 1px solid var(--color-secondary); } -.repository.releases #release-list > li .detail .download .list li + li { - border-top: 0; -} - -.repository.releases #release-list > li .detail .download .list li:first-of-type { - border-radius: var(--border-radius) 0 0 var(--border-radius); -} - -.repository.releases #release-list > li .detail .download .list li:last-of-type { - border-radius: 0 var(--border-radius) var(--border-radius) 0; +.repository.releases #release-list > li .detail .download .list li:last-child { + border-bottom: none; } .repository.releases #release-list > li .detail .dot { @@ -77,7 +55,7 @@ background-color: var(--color-secondary-dark-3); position: absolute; left: -5.5px; - top: 40px; + top: 30px; border-radius: var(--border-radius-circle); border: 2.5px solid var(--color-body); } |