Replace the anti-CSRF token with a [cross origin protection by Go](https://go.dev/doc/go1.25#nethttppkgnethttp) that uses a stateless way of verifying if a request was cross origin or not. This allows is to remove al lot of code and replace it with a few lines of code and we no longer have to hand roll this protection. The new protection uses indicators by the browser itself that indicate if the request is cross-origin, thus we no longer have to take care of ensuring the generated CSRF token is passed back to the server any request by the the browser will have send this indicator. Resolves forgejo/forgejo#3538 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9830 Reviewed-by: oliverpool <oliverpool@noreply.codeberg.org> Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org> Co-authored-by: Gusted <postmaster@gusted.xyz> Co-committed-by: Gusted <postmaster@gusted.xyz>
265 lines
15 KiB
Go HTML Template
265 lines
15 KiB
Go HTML Template
{{template "base/head" .}}
|
|
<div role="main" aria-label="{{.Title}}" class="page-content ui repository branches">
|
|
{{template "repo/header" .}}
|
|
<div class="ui container">
|
|
{{template "base/alert" .}}
|
|
{{template "repo/sub_menu" .}}
|
|
{{if .DefaultBranchBranch}}
|
|
<h4 class="ui top attached header">
|
|
{{ctx.Locale.Tr "repo.default_branch"}}
|
|
{{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}}
|
|
<a role="button" class="right" href="{{.RepoLink}}/settings/branches" data-tooltip-content="{{ctx.Locale.Tr "repo.settings.branches.switch_default_branch"}}">
|
|
{{svg "octicon-arrow-switch"}}
|
|
</a>
|
|
{{end}}
|
|
</h4>
|
|
|
|
<div class="ui attached table segment">
|
|
<table class="ui very basic striped fixed table single line">
|
|
<tbody>
|
|
<tr>
|
|
<td>
|
|
<div class="flex-text-block">
|
|
<a class="gt-ellipsis" href="{{.RepoLink}}/src/branch/{{PathEscapeSegments .DefaultBranchBranch.DBBranch.Name}}">{{.DefaultBranchBranch.DBBranch.Name}}</a>
|
|
{{if .DefaultBranchBranch.IsProtected}}
|
|
<span data-tooltip-content="{{ctx.Locale.Tr "repo.settings.protected_branch"}}">{{svg "octicon-shield-lock"}}</span>
|
|
{{end}}
|
|
<button class="btn interact-fg tw-px-1" data-clipboard-text="{{.DefaultBranchBranch.DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "copy_branch"}}">{{svg "octicon-copy" 14}}</button>
|
|
{{template "repo/commit_statuses" dict "Status" (index $.CommitStatus .DefaultBranchBranch.DBBranch.CommitID) "Statuses" (index $.CommitStatuses .DefaultBranchBranch.DBBranch.CommitID)}}
|
|
</div>
|
|
<p class="info tw-flex tw-items-center tw-my-1">{{svg "octicon-git-commit" 16 "tw-mr-1"}}<a href="{{.RepoLink}}/commit/{{PathEscape .DefaultBranchBranch.DBBranch.CommitID}}">{{ShortSha .DefaultBranchBranch.DBBranch.CommitID}}</a> · <span class="commit-message">{{RenderCommitMessage $.Context .DefaultBranchBranch.DBBranch.CommitMessage (.Repository.ComposeMetas ctx)}}</span> · {{ctx.Locale.Tr "org.repo_updated" (DateUtils.TimeSince .DefaultBranchBranch.DBBranch.CommitTime)}}{{if .DefaultBranchBranch.DBBranch.Pusher}} {{template "shared/user/avatarlink" dict "user" .DefaultBranchBranch.DBBranch.Pusher}}{{template "shared/user/namelink" .DefaultBranchBranch.DBBranch.Pusher}}{{end}}</p>
|
|
</td>
|
|
<td class="right aligned middle aligned overflow-visible">
|
|
{{if and $.IsWriter (not $.Repository.IsArchived) (not $.Repository.IsMirror) (not .IsDeleted)}}
|
|
<button class="btn interact-bg show-create-branch-modal tw-p-2"
|
|
data-modal="#create-branch-modal"
|
|
data-branch-from="{{$.DefaultBranchBranch.DBBranch.Name}}"
|
|
data-branch-from-urlcomponent="{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}"
|
|
data-tooltip-content="{{ctx.Locale.Tr "repo.branch.new_branch_from" ($.DefaultBranchBranch.DBBranch.Name)}}"
|
|
>
|
|
{{svg "octicon-git-branch"}}
|
|
</button>
|
|
{{end}}
|
|
{{if .EnableFeed}}
|
|
<a role="button" class="btn interact-bg tw-p-2" href="{{$.FeedURL}}/rss/branch/{{PathEscapeSegments .DefaultBranchBranch.DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "rss_feed"}}">{{svg "octicon-rss"}}</a>
|
|
{{end}}
|
|
{{if not $.DisableDownloadSourceArchives}}
|
|
<div class="ui dropdown btn interact-bg tw-p-2" data-tooltip-content="{{ctx.Locale.Tr "repo.branch.download" ($.DefaultBranchBranch.DBBranch.Name)}}">
|
|
{{svg "octicon-download"}}
|
|
<div class="menu">
|
|
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}.zip" rel="nofollow">{{svg "octicon-file-zip"}} ZIP</a>
|
|
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}.tar.gz" rel="nofollow">{{svg "octicon-file-zip"}} TAR.GZ</a>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted) (not $.IsMirror)}}
|
|
<button class="btn interact-bg tw-p-2 show-modal show-rename-branch-modal"
|
|
data-is-default-branch="true"
|
|
data-modal="#rename-branch-modal"
|
|
data-old-branch-name="{{$.DefaultBranchBranch.DBBranch.Name}}"
|
|
data-tooltip-content="{{ctx.Locale.Tr "repo.branch.rename" ($.DefaultBranchBranch.DBBranch.Name)}}"
|
|
>
|
|
{{svg "octicon-pencil"}}
|
|
</button>
|
|
{{end}}
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{{end}}
|
|
|
|
<h4 class="ui top attached header tw-flex tw-items-center tw-justify-between">
|
|
<div class="tw-flex tw-items-center">
|
|
{{ctx.Locale.Tr "repo.branches"}}
|
|
</div>
|
|
</h4>
|
|
|
|
<div class="ui attached segment">
|
|
<form class="ignore-dirty" method="get">
|
|
{{template "shared/search/combo" dict "Value" .Keyword "Placeholder" (ctx.Locale.Tr "search.branch_kind")}}
|
|
</form>
|
|
</div>
|
|
|
|
<div class="ui attached table segment">
|
|
<table class="ui very basic striped fixed table single line">
|
|
<tbody>
|
|
{{range .Branches}}
|
|
<tr>
|
|
<td class="eight wide">
|
|
{{if .DBBranch.IsDeleted}}
|
|
<div class="flex-text-block">
|
|
<span class="gt-ellipsis">{{.DBBranch.Name}}</span>
|
|
<button class="btn interact-fg tw-px-1" data-clipboard-text="{{.DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "copy_branch"}}">{{svg "octicon-copy" 14}}</button>
|
|
</div>
|
|
<p class="info">{{ctx.Locale.Tr "repo.branch.deleted_by" .DBBranch.DeletedBy.Name}} {{DateUtils.TimeSince .DBBranch.DeletedUnix}}</p>
|
|
{{else}}
|
|
<div class="flex-text-block">
|
|
<a class="gt-ellipsis" href="{{$.RepoLink}}/src/branch/{{PathEscapeSegments .DBBranch.Name}}">{{.DBBranch.Name}}</a>
|
|
{{if .IsProtected}}
|
|
<span data-tooltip-content="{{ctx.Locale.Tr "repo.settings.protected_branch"}}">{{svg "octicon-shield-lock"}}</span>
|
|
{{end}}
|
|
<button class="btn interact-fg tw-px-1" data-clipboard-text="{{.DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "copy_branch"}}">{{svg "octicon-copy" 14}}</button>
|
|
{{template "repo/commit_statuses" dict "Status" (index $.CommitStatus .DBBranch.CommitID) "Statuses" (index $.CommitStatuses .DBBranch.CommitID)}}
|
|
</div>
|
|
<p class="info tw-flex tw-items-center tw-my-1">{{svg "octicon-git-commit" 16 "tw-mr-1"}}<a href="{{$.RepoLink}}/commit/{{PathEscape .DBBranch.CommitID}}">{{ShortSha .DBBranch.CommitID}}</a> · <span class="commit-message">{{RenderCommitMessage $.Context .DBBranch.CommitMessage ($.Repository.ComposeMetas ctx)}}</span> · {{ctx.Locale.Tr "org.repo_updated" (DateUtils.TimeSince .DBBranch.CommitTime)}}{{if .DBBranch.Pusher}} {{template "shared/user/avatarlink" dict "user" .DBBranch.Pusher}} {{template "shared/user/namelink" .DBBranch.Pusher}}{{end}}</p>
|
|
{{end}}
|
|
</td>
|
|
<td class="two wide ui">
|
|
{{if and (not .DBBranch.IsDeleted) $.DefaultBranchBranch}}
|
|
<div class="commit-divergence">
|
|
<div class="bar-group">
|
|
<div class="count count-behind">{{.CommitsBehind}}</div>
|
|
{{/* old code bears 0/0.0 = NaN output, so it might output invalid "width: NaNpx", it just works and doesn't cause any problem. */}}
|
|
<div class="bar bar-behind" style="width: {{Eval 100 "*" .CommitsBehind "/" "(" .CommitsBehind "+" .CommitsAhead "+" 0.0 ")"}}%"></div>
|
|
</div>
|
|
<div class="bar-group">
|
|
<div class="count count-ahead">{{.CommitsAhead}}</div>
|
|
<div class="bar bar-ahead" style="width: {{Eval 100 "*" .CommitsAhead "/" "(" .CommitsBehind "+" .CommitsAhead "+" 0.0 ")"}}%"></div>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
</td>
|
|
<td class="two wide right aligned">
|
|
{{if not ($.Permission.CanRead $.UnitTypePullRequests)}}
|
|
<a href="{{$.RepoLink}}/compare/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}...{{if ne $.Repository.Owner.Name $.Owner.Name}}{{PathEscape $.Owner.Name}}:{{end}}{{PathEscapeSegments .DBBranch.Name}}">
|
|
<button class="ui compact basic button tw-mr-0">{{ctx.Locale.Tr "compare.branches.title"}}</button>
|
|
</a>
|
|
{{else if not .LatestPullRequest}}
|
|
{{if .IsIncluded}}
|
|
<span class="ui orange large label" data-tooltip-content="{{ctx.Locale.Tr "repo.branch.included_desc"}}">
|
|
{{svg "octicon-git-pull-request"}} {{ctx.Locale.Tr "repo.branch.included"}}
|
|
</span>
|
|
{{else if and (not .DBBranch.IsDeleted) $.AllowsPulls (gt .CommitsAhead 0)}}
|
|
<a href="{{$.RepoLink}}/compare/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}...{{if ne $.Repository.Owner.Name $.Owner.Name}}{{PathEscape $.Owner.Name}}:{{end}}{{PathEscapeSegments .DBBranch.Name}}">
|
|
<button id="new-pull-request" class="ui compact basic button tw-mr-0">{{if $.CanPull}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}</button>
|
|
</a>
|
|
{{end}}
|
|
{{else if and .LatestPullRequest.HasMerged .MergeMovedOn}}
|
|
{{if and (not .DBBranch.IsDeleted) $.AllowsPulls (gt .CommitsAhead 0)}}
|
|
<a href="{{$.RepoLink}}/compare/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}...{{if ne $.Repository.Owner.Name $.Owner.Name}}{{PathEscape $.Owner.Name}}:{{end}}{{PathEscapeSegments .DBBranch.Name}}">
|
|
<button id="new-pull-request" class="ui compact basic button tw-mr-0">{{if $.CanPull}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}</button>
|
|
</a>
|
|
{{end}}
|
|
{{else}}
|
|
<a href="{{.LatestPullRequest.Issue.Link}}" class="tw-align-middle ref-issue">{{if not .LatestPullRequest.IsSameRepo}}{{.LatestPullRequest.BaseRepo.FullName}}{{end}}#{{.LatestPullRequest.Issue.Index}}</a>
|
|
{{if .LatestPullRequest.HasMerged}}
|
|
<a href="{{.LatestPullRequest.Issue.Link}}" class="ui purple large label">{{svg "octicon-git-merge" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.pulls.merged"}}</a>
|
|
{{else if .LatestPullRequest.Issue.IsClosed}}
|
|
<a href="{{.LatestPullRequest.Issue.Link}}" class="ui red large label">{{svg "octicon-git-pull-request-closed" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.issues.closed_title"}}</a>
|
|
{{else if .LatestPullRequest.IsWorkInProgress ctx}}
|
|
<a href="{{.LatestPullRequest.Issue.Link}}" class="ui grey large label">{{svg "octicon-git-pull-request-draft" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.issues.draft_title"}}</a>
|
|
{{else}}
|
|
<a href="{{.LatestPullRequest.Issue.Link}}" class="ui green large label">{{svg "octicon-git-pull-request" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.issues.open_title"}}</a>
|
|
{{end}}
|
|
{{end}}
|
|
</td>
|
|
<td class="three wide right aligned overflow-visible">
|
|
{{if and $.IsWriter (not $.Repository.IsArchived) (not $.Repository.IsMirror) (not .DBBranch.IsDeleted)}}
|
|
<button class="btn interact-bg tw-p-2 show-modal show-create-branch-modal"
|
|
data-branch-from="{{.DBBranch.Name}}"
|
|
data-branch-from-urlcomponent="{{PathEscapeSegments .DBBranch.Name}}"
|
|
data-tooltip-content="{{ctx.Locale.Tr "repo.branch.new_branch_from" .DBBranch.Name}}"
|
|
data-modal="#create-branch-modal" data-name="{{.DBBranch.Name}}"
|
|
>
|
|
{{svg "octicon-git-branch"}}
|
|
</button>
|
|
{{end}}
|
|
{{if $.EnableFeed}}
|
|
<a role="button" class="btn interact-bg tw-p-2" href="{{$.FeedURL}}/rss/branch/{{PathEscapeSegments .DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "rss_feed"}}">{{svg "octicon-rss"}}</a>
|
|
{{end}}
|
|
{{if and (not .DBBranch.IsDeleted) (not $.DisableDownloadSourceArchives)}}
|
|
<div class="ui dropdown btn interact-bg tw-p-2" data-tooltip-content="{{ctx.Locale.Tr "repo.branch.download" (.DBBranch.Name)}}">
|
|
{{svg "octicon-download"}}
|
|
<div class="menu">
|
|
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments .DBBranch.Name}}.zip" rel="nofollow">{{svg "octicon-file-zip"}} ZIP</a>
|
|
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments .DBBranch.Name}}.tar.gz" rel="nofollow">{{svg "octicon-file-zip"}} TAR.GZ</a>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{if and $.IsWriter (not $.Repository.IsArchived) (not .DBBranch.IsDeleted) (not $.IsMirror)}}
|
|
<button class="btn interact-bg tw-p-2 show-modal show-rename-branch-modal"
|
|
data-is-default-branch="false"
|
|
data-old-branch-name="{{.DBBranch.Name}}"
|
|
data-modal="#rename-branch-modal"
|
|
data-tooltip-content="{{ctx.Locale.Tr "repo.branch.rename" (.DBBranch.Name)}}"
|
|
>
|
|
{{svg "octicon-pencil"}}
|
|
</button>
|
|
{{end}}
|
|
{{if and $.IsWriter (not $.IsMirror) (not $.Repository.IsArchived) (not .IsProtected)}}
|
|
{{if .DBBranch.IsDeleted}}
|
|
<button class="btn interact-bg tw-p-2 link-action restore-branch-button" data-url="{{$.Link}}/restore?branch_id={{.DBBranch.ID}}&name={{.DBBranch.Name}}&page={{$.Page.Paginater.Current}}" data-tooltip-content="{{ctx.Locale.Tr "repo.branch.restore" (.DBBranch.Name)}}">
|
|
<span class="text blue">
|
|
{{svg "octicon-reply"}}
|
|
</span>
|
|
</button>
|
|
{{else}}
|
|
<button class="btn interact-bg tw-p-2 delete-button delete-branch-button" data-url="{{$.Link}}/delete?name={{.DBBranch.Name}}&page={{$.Page.Paginater.Current}}" data-tooltip-content="{{ctx.Locale.Tr "repo.branch.delete" (.DBBranch.Name)}}" data-name="{{.DBBranch.Name}}" data-modal-id="delete-branch">
|
|
{{svg "octicon-trash"}}
|
|
</button>
|
|
{{end}}
|
|
{{end}}
|
|
</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{{template "base/paginate" .}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ui g-modal-confirm delete modal" id="delete-branch">
|
|
<div class="header">
|
|
{{svg "octicon-trash"}}
|
|
{{ctx.Locale.Tr "repo.branch.delete_html"}} <span class="name"></span>
|
|
</div>
|
|
<div class="content">
|
|
<p>{{ctx.Locale.Tr "repo.branch.delete_desc"}}</p>
|
|
</div>
|
|
{{template "base/modal_actions_confirm" .}}
|
|
</div>
|
|
|
|
<div class="ui mini modal" id="create-branch-modal">
|
|
<div class="header">
|
|
{{ctx.Locale.Tr "repo.branch.new_branch"}}
|
|
</div>
|
|
|
|
<form class="ui form" id="create-branch-form" action="" data-base-action="{{.Link}}/_new/branch/" method="post">
|
|
<div class="content">
|
|
<div class="field">
|
|
{{ctx.Locale.Tr "repo.branch.create_new_branch"}}
|
|
<span id="modal-create-branch-from-span"></span>
|
|
</div>
|
|
<div class="required field">
|
|
<label for="new_branch_name">{{ctx.Locale.Tr "repo.branch.name"}}</label>
|
|
<input id="new_branch_name" name="new_branch_name" required>
|
|
</div>
|
|
</div>
|
|
{{template "base/modal_actions_confirm" (dict "ModalButtonTypes" "confirm")}}
|
|
</form>
|
|
</div>
|
|
|
|
<div class="ui mini modal" id="rename-branch-modal">
|
|
<div class="header">
|
|
{{ctx.Locale.Tr "repo.settings.rename_branch"}}
|
|
</div>
|
|
<form class="ui form" action="{{$.Repository.Link}}/settings/rename_branch" method="post">
|
|
<div class="content">
|
|
<div class="field default-branch-warning">
|
|
<span class="text red">{{ctx.Locale.Tr "repo.branch.warning_rename_default_branch"}}</span>
|
|
</div>
|
|
<div class="field">
|
|
<span class="text" data-rename-branch-to="{{ctx.Locale.Tr "repo.branch.rename_branch_to"}}"></span>
|
|
</div>
|
|
<input name="from" type="hidden" required>
|
|
<div class="required field">
|
|
<input name="to" required>
|
|
</div>
|
|
</div>
|
|
{{template "base/modal_actions_confirm" (dict "ModalButtonTypes" "confirm")}}
|
|
</form>
|
|
</div>
|
|
{{template "base/footer" .}}
|