From d7f12af805e33e327ec0c7a250ad8ed09a88e8fd Mon Sep 17 00:00:00 2001 From: zeripath Date: Fri, 25 Nov 2022 20:58:20 +0000 Subject: [PATCH] Prevent NPE if trying to restore an already restored deleted branch (#21940) If a deleted-branch has already been restored, a request to restore it again will cause a NPE. This PR adds detection for this case, but also disables buttons when they're clicked in order to help prevent accidental repeat requests. Fix #21930 Signed-off-by: Andrew Thornton --- routers/web/repo/branch.go | 4 ++++ web_src/js/features/common-global.js | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/routers/web/repo/branch.go b/routers/web/repo/branch.go index a7588d275d..43e6d43134 100644 --- a/routers/web/repo/branch.go +++ b/routers/web/repo/branch.go @@ -126,6 +126,10 @@ func RestoreBranchPost(ctx *context.Context) { log.Error("GetDeletedBranchByID: %v", err) ctx.Flash.Error(ctx.Tr("repo.branch.restore_failed", branchName)) return + } else if deletedBranch == nil { + log.Debug("RestoreBranch: Can't restore branch[%d] '%s', as it does not exist", branchID, branchName) + ctx.Flash.Error(ctx.Tr("repo.branch.restore_failed", branchName)) + return } if err := git.Push(ctx, ctx.Repo.Repository.RepoPath(), git.PushOptions{ diff --git a/web_src/js/features/common-global.js b/web_src/js/features/common-global.js index b00b4aea9c..7efefd7084 100644 --- a/web_src/js/features/common-global.js +++ b/web_src/js/features/common-global.js @@ -260,6 +260,7 @@ export function initGlobalLinkActions() { e.preventDefault(); const $this = $(this); const redirect = $this.data('redirect'); + $this.prop('disabled', true); $.post($this.data('url'), { _csrf: csrfToken }).done((data) => { @@ -270,6 +271,8 @@ export function initGlobalLinkActions() { } else { window.location.reload(); } + }).always(() => { + $this.prop('disabled', false); }); } @@ -283,11 +286,14 @@ export function initGlobalLinkActions() { // FIXME: this is only used once, and should be replace with `link-action` instead $('.undo-button').on('click', function () { const $this = $(this); + $this.prop('disabled', true); $.post($this.data('url'), { _csrf: csrfToken, id: $this.data('id') }).done((data) => { window.location.href = data.redirect; + }).always(() => { + $this.prop('disabled', false); }); }); }