From b46066f17c79b4b4196a61e710120d874af6ee5a Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 5 Jul 2018 05:47:05 +0800 Subject: [PATCH 1/5] fix repository last updated time update when delete a user who watched the repo (#4363) --- models/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/user.go b/models/user.go index 5ac865879..0b7af8df6 100644 --- a/models/user.go +++ b/models/user.go @@ -956,7 +956,7 @@ func deleteUser(e *xorm.Session, u *User) error { Where("watch.user_id = ?", u.ID).Find(&watchedRepoIDs); err != nil { return fmt.Errorf("get all watches: %v", err) } - if _, err = e.Decr("num_watches").In("id", watchedRepoIDs).Update(new(Repository)); err != nil { + if _, err = e.Decr("num_watches").In("id", watchedRepoIDs).NoAutoTime().Update(new(Repository)); err != nil { return fmt.Errorf("decrease repository num_watches: %v", err) } // ***** END: Watch ***** @@ -966,7 +966,7 @@ func deleteUser(e *xorm.Session, u *User) error { if err = e.Table("star").Cols("star.repo_id"). Where("star.uid = ?", u.ID).Find(&starredRepoIDs); err != nil { return fmt.Errorf("get all stars: %v", err) - } else if _, err = e.Decr("num_stars").In("id", starredRepoIDs).Update(new(Repository)); err != nil { + } else if _, err = e.Decr("num_stars").In("id", starredRepoIDs).NoAutoTime().Update(new(Repository)); err != nil { return fmt.Errorf("decrease repository num_stars: %v", err) } // ***** END: Star ***** From 4a8ee0b5ccbdc75bab29836a54db4e7af7b7ff3f Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Thu, 5 Jul 2018 01:45:15 +0300 Subject: [PATCH 2/5] Check that repositories can only be migrated to own user or organizations (#4366) * Repositories can only migrated to own user or organizations * Add check for organization that user does not belong to * Allow admin to migrate repositories for other users --- integrations/api_repo_test.go | 27 +++++++++++++++++++++++++++ routers/api/v1/repo/repo.go | 23 +++++++++++++++-------- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/integrations/api_repo_test.go b/integrations/api_repo_test.go index 12429c88a..c789cc9ee 100644 --- a/integrations/api_repo_test.go +++ b/integrations/api_repo_test.go @@ -235,3 +235,30 @@ func TestAPIGetRepoByIDUnauthorized(t *testing.T) { req := NewRequestf(t, "GET", "/api/v1/repositories/2") sess.MakeRequest(t, req, http.StatusNotFound) } + +func TestAPIRepoMigrate(t *testing.T) { + testCases := []struct { + ctxUserID, userID int64 + cloneURL, repoName string + expectedStatus int + }{ + {ctxUserID: 1, userID: 2, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-admin", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, userID: 2, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-own", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, userID: 1, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-bad", expectedStatus: http.StatusForbidden}, + {ctxUserID: 2, userID: 3, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-org", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, userID: 6, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-bad-org", expectedStatus: http.StatusForbidden}, + } + + prepareTestEnv(t) + for _, testCase := range testCases { + user := models.AssertExistsAndLoadBean(t, &models.User{ID: testCase.ctxUserID}).(*models.User) + session := loginUser(t, user.Name) + + req := NewRequestWithJSON(t, "POST", "/api/v1/repos/migrate", &api.MigrateRepoOption{ + CloneAddr: testCase.cloneURL, + UID: int(testCase.userID), + RepoName: testCase.repoName, + }) + session.MakeRequest(t, req, testCase.expectedStatus) + } +} diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index ccfe0440c..c6c5d4aec 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -306,16 +306,23 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) { return } - if ctxUser.IsOrganization() && !ctx.User.IsAdmin { - // Check ownership of organization. - isOwner, err := ctxUser.IsOwnedBy(ctx.User.ID) - if err != nil { - ctx.Error(500, "IsOwnedBy", err) - return - } else if !isOwner { - ctx.Error(403, "", "Given user is not owner of organization.") + if !ctx.User.IsAdmin { + if !ctxUser.IsOrganization() && ctx.User.ID != ctxUser.ID { + ctx.Error(403, "", "Given user is not an organization.") return } + + if ctxUser.IsOrganization() { + // Check ownership of organization. + isOwner, err := ctxUser.IsOwnedBy(ctx.User.ID) + if err != nil { + ctx.Error(500, "IsOwnedBy", err) + return + } else if !isOwner { + ctx.Error(403, "", "Given user is not owner of organization.") + return + } + } } remoteAddr, err := form.ParseRemoteAddr(ctx.User) From 4eae810d63cb48977d7c0b96c90877592ec3d7b2 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 4 Jul 2018 22:53:06 +0000 Subject: [PATCH 3/5] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 4 ++++ options/locale/locale_uk-UA.ini | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index dc4ebd405..addaa8e31 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -566,6 +566,10 @@ milestones.due_date=Förfallodatum (valfritt) milestones.clear=Rensa milestones.edit=Redigera milstolpe milestones.cancel=Avbryt +milestones.modify=Uppdatera milstolpe +milestones.edit_success=Milstolpe '%s' har blivit uppdaterad. +milestones.deletion=Ta bort milstolpe +milestones.deletion_desc=Borttagning av en milstolpe tar bort den från samtliga relaterade ärende. Fortsätta? milestones.filter_sort.closest_due_date=Närmaste förfallodatum milestones.filter_sort.furthest_due_date=Mest avlägsna förfallodatum milestones.filter_sort.least_complete=Minst klar diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 2bd85a3d6..fe93cdf0b 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -492,9 +492,13 @@ owner=Власник repo_name=Назва репозиторію repo_name_helper=Хороші назви репозиторіїв використовують короткі, унікальні ключові слова що легко запам'ятати. visibility=Видимість +visibility_helper=Створити приватний репозиторій +visibility_helper_forced=Адміністратор вашого сайту налаштував параметри: всі нові репозиторії будуть приватними. +visibility_fork_helper=(Ці зміни вплинуть на всі форки.) clone_helper=Потрібна допомога у клонуванні? Відвідайте сторінку Допомога. fork_repo=Форкнути репозиторій fork_from=Форк з +fork_visibility_helper=Неможливо змінити видимість форкнутого репозиторію. repo_desc=Опис repo_lang=Мова repo_gitignore_helper=Виберіть шаблон .gitignore. From 69e2ab161109eef667cd22a96711e4a8ee9d01d2 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Thu, 5 Jul 2018 02:51:02 +0300 Subject: [PATCH 4/5] Allow administrator to create repository for any organization (#4368) --- integrations/api_repo_test.go | 23 +++++++++++++++++++++++ routers/api/v1/repo/repo.go | 16 +++++++++------- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/integrations/api_repo_test.go b/integrations/api_repo_test.go index c789cc9ee..aec8c8f81 100644 --- a/integrations/api_repo_test.go +++ b/integrations/api_repo_test.go @@ -262,3 +262,26 @@ func TestAPIRepoMigrate(t *testing.T) { session.MakeRequest(t, req, testCase.expectedStatus) } } + +func TestAPIOrgRepoCreate(t *testing.T) { + testCases := []struct { + ctxUserID int64 + orgName, repoName string + expectedStatus int + }{ + {ctxUserID: 1, orgName: "user3", repoName: "repo-admin", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, orgName: "user3", repoName: "repo-own", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, orgName: "user6", repoName: "repo-bad-org", expectedStatus: http.StatusForbidden}, + } + + prepareTestEnv(t) + for _, testCase := range testCases { + user := models.AssertExistsAndLoadBean(t, &models.User{ID: testCase.ctxUserID}).(*models.User) + session := loginUser(t, user.Name) + + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/org/%s/repos", testCase.orgName), &api.CreateRepoOption{ + Name: testCase.repoName, + }) + session.MakeRequest(t, req, testCase.expectedStatus) + } +} diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index c6c5d4aec..044b1e9c1 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -257,13 +257,15 @@ func CreateOrgRepo(ctx *context.APIContext, opt api.CreateRepoOption) { return } - isOwner, err := org.IsOwnedBy(ctx.User.ID) - if err != nil { - ctx.ServerError("IsOwnedBy", err) - return - } else if !isOwner { - ctx.Error(403, "", "Given user is not owner of organization.") - return + if !ctx.User.IsAdmin { + isOwner, err := org.IsOwnedBy(ctx.User.ID) + if err != nil { + ctx.ServerError("IsOwnedBy", err) + return + } else if !isOwner { + ctx.Error(403, "", "Given user is not owner of organization.") + return + } } CreateUserRepo(ctx, org, opt) } From 07063e3e1179dbb8d6e131d7ea0c1b028a772226 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 5 Jul 2018 00:05:18 +0000 Subject: [PATCH 5/5] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index addaa8e31..968fb97a9 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -570,6 +570,7 @@ milestones.modify=Uppdatera milstolpe milestones.edit_success=Milstolpe '%s' har blivit uppdaterad. milestones.deletion=Ta bort milstolpe milestones.deletion_desc=Borttagning av en milstolpe tar bort den från samtliga relaterade ärende. Fortsätta? +milestones.deletion_success=Milstolpen har blivit borttagen. milestones.filter_sort.closest_due_date=Närmaste förfallodatum milestones.filter_sort.furthest_due_date=Mest avlägsna förfallodatum milestones.filter_sort.least_complete=Minst klar @@ -577,17 +578,26 @@ milestones.filter_sort.most_complete=Mest klar milestones.filter_sort.most_issues=Mest ärenden milestones.filter_sort.least_issues=Minst ärenden +ext_wiki=Extern Wiki +ext_wiki.desc=Länk till extern wiki. wiki=Wiki +wiki.welcome=Välkommen till Wikin. +wiki.welcome_desc=Wikin låter dig skriva och dela dokumentation med medarbetare. +wiki.desc=Skriv och dela dokumentation med medarbetare. +wiki.create_first_page=Skapa den första sidan wiki.page=Sida wiki.filter_page=Filtrera sida +wiki.new_page=Sida wiki.default_commit_message=Skriv en anteckning om den här uppdateringen (valfritt). wiki.save_page=Spara sidan wiki.last_commit_info=%s redigerade denna sida %s wiki.edit_page_button=Redigera wiki.new_page_button=Ny Sida wiki.delete_page_button=Tag bort sida +wiki.delete_page_notice_1=Borttagning utav wiki sidan '%s' kan inte ångras. Fortsätta? wiki.page_already_exists=Wiki-sida med samma namn finns redan. +wiki.reserved_page=Namnet för wikisidan '%s' är reserverat. wiki.pages=Sidor wiki.last_updated=Senast uppdaterad %s @@ -624,6 +634,9 @@ activity.closed_issue_label=Stängd activity.new_issues_count_1=Nytt ärende activity.new_issues_count_n=Nya ärenden activity.new_issue_label=Öppnad +activity.title.unresolved_conv_1=%d Olöst konversation +activity.title.unresolved_conv_n=%d Olösta konversationer +activity.unresolved_conv_desc=De nyligen förändrade ärendena och pull-requesterna har inte blivit lösta ännu. activity.unresolved_conv_label=Öppna activity.title.releases_1=%d release activity.title.releases_n=%d releaser @@ -636,6 +649,9 @@ search.results=Sökresultat för ”%s” i %s settings=Inställningar settings.desc=Inställningarna är där du kan hantera inställningar för utvecklingskatalogen +settings.options=Utvecklingskatalog +settings.collaboration=Medarbetare +settings.collaboration.admin=Administratör settings.collaboration.write=Skriva settings.collaboration.read=Läsa settings.collaboration.undefined=Odefinierad @@ -643,10 +659,23 @@ settings.hooks=Webbhookar settings.githooks=Githookar settings.basic_settings=Basinställningar settings.mirror_settings=Inställningar för spegling +settings.sync_mirror=Synkronisera nu +settings.mirror_sync_in_progress=Synkronisering utav speglingar pågår. Kontrollera igen om en minut. +settings.site=Webbplats settings.update_settings=Uppdatera inställningar settings.advanced_settings=Advancerade Inställningar +settings.wiki_desc=Aktivera wiki för utvecklingskatalog +settings.use_internal_wiki=Använd inbyggd Wiki +settings.use_external_wiki=Använd extern wiki settings.external_wiki_url=Extern Wiki-URL +settings.external_wiki_url_error=Den externa wiki-länken är inte giltig. +settings.external_wiki_url_desc=Besökare omdirigeras till den externa wiki-länken när de trycker på wiki-tabben. +settings.issues_desc=Aktivera ärendehantering för utvecklingskatalogen +settings.use_internal_issue_tracker=Använd inbyggt ärendehanteringssystem +settings.use_external_issue_tracker=Använd externt ärendehanteringssystem settings.external_tracker_url=URL För Extern Ärendehanterare +settings.external_tracker_url_error=Länken för ärendehanteringsystemet är inte en giltig länk. +settings.external_tracker_url_desc=Besökare dirigeras om till länken för det externa ärendehanteringssystemet när de trycker på ärende-tabben. settings.tracker_url_format=URL-Format För Extern Ärendehanterare settings.tracker_issue_style.numeric=Numerisk settings.tracker_issue_style.alphanumeric=Alfanumerisk