From 801843b0115e29ba2304fa6a5bea1ae169a58e02 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Tue, 26 Jun 2018 16:45:18 +0200 Subject: [PATCH 1/2] Fix open redirect vulnerability on login screen (#4312) * Fix open redirect vulnerability on login screen Signed-off-by: Jonas Franz * Reorder imports Signed-off-by: Jonas Franz * Replace www. from Domain too Signed-off-by: Jonas Franz --- modules/util/util.go | 13 +++++++++++++ modules/util/util_test.go | 35 +++++++++++++++++++++++++++++++++++ routers/user/auth.go | 3 ++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/modules/util/util.go b/modules/util/util.go index b6acb9796..5dcbe448f 100644 --- a/modules/util/util.go +++ b/modules/util/util.go @@ -10,6 +10,7 @@ import ( "strings" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) // OptionalBool a boolean that can be "null" @@ -78,6 +79,18 @@ func URLJoin(base string, elems ...string) string { return joinedURL } +// IsExternalURL checks if rawURL points to an external URL like http://example.com +func IsExternalURL(rawURL string) bool { + parsed, err := url.Parse(rawURL) + if err != nil { + return true + } + if len(parsed.Host) != 0 && strings.Replace(parsed.Host, "www.", "", 1) != strings.Replace(setting.Domain, "www.", "", 1) { + return true + } + return false +} + // Min min of two ints func Min(a, b int) int { if a > b { diff --git a/modules/util/util_test.go b/modules/util/util_test.go index 0d79df605..d9357ffa3 100644 --- a/modules/util/util_test.go +++ b/modules/util/util_test.go @@ -7,6 +7,8 @@ package util import ( "testing" + "code.gitea.io/gitea/modules/setting" + "github.com/stretchr/testify/assert" ) @@ -42,3 +44,36 @@ func TestURLJoin(t *testing.T) { assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...)) } } + +func TestIsExternalURL(t *testing.T) { + setting.Domain = "try.gitea.io" + type test struct { + Expected bool + RawURL string + } + newTest := func(expected bool, rawURL string) test { + return test{Expected: expected, RawURL: rawURL} + } + for _, test := range []test{ + newTest(false, + "https://try.gitea.io"), + newTest(true, + "https://example.com/"), + newTest(true, + "//example.com"), + newTest(true, + "http://example.com"), + newTest(false, + "a/"), + newTest(false, + "https://try.gitea.io/test?param=false"), + newTest(false, + "test?param=false"), + newTest(false, + "//try.gitea.io/test?param=false"), + newTest(false, + "/hey/hey/hey#3244"), + } { + assert.Equal(t, test.Expected, IsExternalURL(test.RawURL)) + } +} diff --git a/routers/user/auth.go b/routers/user/auth.go index 9a59f52db..317b4af3b 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -18,6 +18,7 @@ import ( "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/go-macaron/captcha" "github.com/markbates/goth" @@ -474,7 +475,7 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR return setting.AppSubURL + "/" } - if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { + if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 && !util.IsExternalURL(redirectTo) { ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL) if obeyRedirect { ctx.RedirectToFirst(redirectTo) From a9ffbeb6791089b5ef04f5c1156f8b8cb0012d92 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 26 Jun 2018 14:46:26 +0000 Subject: [PATCH 2/2] [skip ci] Updated translations via Crowdin --- options/locale/locale_lv-LV.ini | 5 +++-- options/locale/locale_pt-BR.ini | 2 ++ options/locale/locale_ru-RU.ini | 2 ++ options/locale/locale_uk-UA.ini | 11 ++++++++++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index c2274b99a..1b0129ba1 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -54,13 +54,14 @@ password=Parole db_name=Datu bāzes nosaukums path=Ceļš -repo_path=Repozitoriju glabāšanas vieta -log_root_path=Žurnalizēšanas direktorija +repo_path=Repozitoriju glabāšanas ceļš +log_root_path=Žurnalizēšanas ceļš optional_title=Neobligātie iestatījumi smtp_host=SMTP resursdators federated_avatar_lookup_popup=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz libravatar. openid_signin=Iespējot OpenID autorizāciju +openid_signin_popup=Iespējot lietotāju autorizāciju ar OpenID. enable_captcha_popup=Lietotājam reģistrējoties, pieprasīt ievadīt drošības kodu. admin_password=Parole confirm_password=Apstipriniet paroli diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 0df553778..f2ec96dd0 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=A branch '%s' está protegida. Ela não pode se topic.manage_topics=Gerenciar Tópicos topic.done=Feito +topic.count_prompt=Você não pode selecionar mais de 25 tópicos +topic.format_prompt=Tópicos devem começar com uma letra ou um número, podem incluir hífens (-) e não devem ter mais de 35 caracteres [org] org_name_holder=Nome da organização diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 008895181..9df7e4e16 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=Ветка '%s' защищена. Её нель topic.manage_topics=Редактировать тематические метки topic.done=Сохранить +topic.count_prompt=Вы не можете выбрать более 25 тем +topic.format_prompt=Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов [org] org_name_holder=Название организации diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index b0d098bad..8946d2894 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -40,6 +40,7 @@ u2f_unsupported_browser=Ваш браузер не підтримує U2F клю u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. u2f_error_2=Переконайтеся, що ви використовуєте зашифроване з'єднання (https://) та відвідуєте правильну URL-адресу. u2f_error_3=Сервер не може обробити, ваш запит. +u2f_error_4=Представлений ключ не дає право на цей запит. Якщо спробуєте зареєструвати його, переконайтеся, що ключ ще не зареєстровано. u2f_error_5=Таймаут досягнуто до того, як ваш ключ можна буде прочитати. Перезавантажте, щоб повторити спробу. u2f_reload=Оновити @@ -74,7 +75,7 @@ cancel=Відмінити [install] install=Встановлення title=Початкова конфігурація -docker_helper=Якщо ви запускаєте Gitea всередині Docker, будь ласка уважно прочитайте документацію перед тим, як що-небудь змінити на цій сторінці. +docker_helper=Якщо ви запускаєте Gitea всередині Docker, будь ласка уважно прочитайте документацію перед тим, як щось змінити на цій сторінці. requite_db_desc=Gitea потребує MySQL, PostgreSQL, MSSQL, SQLite3 або TiDB. db_title=Налаштування бази даних db_type=Тип бази даних @@ -593,6 +594,7 @@ commits.signed_by=Підписано commits.gpg_key_id=Ідентифікатор GPG ключа ext_issues=Зов. Проблеми +ext_issues.desc=Посилання на зовнішню систему відстеження проблем. issues.new=Нова проблема issues.new.labels=Мітки @@ -614,6 +616,7 @@ issues.new_label_desc_placeholder=Опис issues.create_label=Створити мітку issues.label_templates.title=Завантажити визначений набір міток issues.label_templates.helper=Оберіть набір міток +issues.label_templates.use=Використовувати набір міток issues.label_templates.fail_to_load_file=Не вдалося завантажити файл шаблона мітки '%s': %v issues.add_label_at=додав(ла) мітку
%s
%s issues.add_milestone_at=`додав(ла) до %s етапу %s` @@ -702,9 +705,11 @@ issues.start_tracking=Почати відстеження часу issues.start_tracking_history=`почав працювати %s` issues.tracking_already_started=`Ви вже почали відстежувати час для цієї проблеми!` issues.stop_tracking=Стоп +issues.stop_tracking_history=`перестав(-ла) працювати %s` issues.add_time=Вручну додати час issues.add_time_short=Додати час issues.add_time_cancel=Відмінити +issues.add_time_history=`додав(-ла) витрачений час %s` issues.add_time_hours=Години issues.add_time_minutes=Хвилини issues.add_time_sum_to_small=Час не введено. @@ -713,6 +718,8 @@ issues.cancel_tracking_history=`скасував відстеження часу issues.time_spent_total=Загальний витрачений час issues.time_spent_from_all_authors=`Загальний витрачений час: %s` issues.due_date=Дата завершення +issues.invalid_due_date_format=Дата закінчення має бути в форматі 'ррр-мм-дд'. +issues.error_modifying_due_date=Не вдалося змінити дату завершення. issues.due_date_form=рррр-мм-дд issues.due_date_form_add=Додати дату завершення issues.due_date_form_update=Оновити дату завершення @@ -768,6 +775,7 @@ milestones.filter_sort.most_issues=Найбільш проблем milestones.filter_sort.least_issues=Найменш проблем ext_wiki=Зов. Вікі +ext_wiki.desc=Посилання на зовнішню вікі. wiki=Вікі wiki.welcome=Ласкаво просимо до Вікі. @@ -817,6 +825,7 @@ activity.closed_issue_label=Закрито activity.new_issues_count_1=Нова Проблема activity.new_issues_count_n=%d Проблем activity.new_issue_label=Відкриті +activity.title.unresolved_conv_1=%d Незавершене обговорення activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d Реліз activity.title.releases_n=%d Релізів