diff options
author | wxiaoguang <wxiaoguang@gmail.com> | 2023-05-04 14:36:34 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-04 14:36:34 +0800 |
commit | 5d77691d428d5302ee4df6c2a936b8e2ea9dca7e (patch) | |
tree | 4fa6b13f2ae81c5de94d84f2288ae1f5653c011f /templates | |
parent | 75ea0d5dba5dbf2f84cef2d12460fdd566d43e62 (diff) | |
download | gitea-5d77691d428d5302ee4df6c2a936b8e2ea9dca7e.tar.gz gitea-5d77691d428d5302ee4df6c2a936b8e2ea9dca7e.zip |
Improve template system and panic recovery (#24461)
Partially for #24457
Major changes:
1. The old `signedUserNameStringPointerKey` is quite hacky, use
`ctx.Data[SignedUser]` instead
2. Move duplicate code from `Contexter` to `CommonTemplateContextData`
3. Remove incorrect copying&pasting code `ctx.Data["Err_Password"] =
true` in API handlers
4. Use one unique `RenderPanicErrorPage` for panic error page rendering
5. Move `stripSlashesMiddleware` to be the first middleware
6. Install global panic recovery handler, it works for both `install`
and `web`
7. Make `500.tmpl` only depend minimal template functions/variables,
avoid triggering new panics
Screenshot:
<details>
![image](https://user-images.githubusercontent.com/2114189/235444895-cecbabb8-e7dc-4360-a31c-b982d11946a7.png)
</details>
Diffstat (limited to 'templates')
-rw-r--r-- | templates/base/head_script.tmpl | 1 | ||||
-rw-r--r-- | templates/status/500.tmpl | 93 | ||||
-rw-r--r-- | templates/user/profile.tmpl | 6 |
3 files changed, 62 insertions, 38 deletions
diff --git a/templates/base/head_script.tmpl b/templates/base/head_script.tmpl index d19fae629b..670d146b56 100644 --- a/templates/base/head_script.tmpl +++ b/templates/base/head_script.tmpl @@ -6,7 +6,6 @@ If you introduce mistakes in it, Gitea JavaScript code wouldn't run correctly. <script> window.addEventListener('error', function(e) {window._globalHandlerErrors=window._globalHandlerErrors||[]; window._globalHandlerErrors.push(e);}); window.config = { - initCount: (window.config?.initCount ?? 0) + 1, appUrl: '{{AppUrl}}', appSubUrl: '{{AppSubUrl}}', assetVersionEncoded: encodeURIComponent('{{AssetVersion}}'), // will be used in URL construction directly diff --git a/templates/status/500.tmpl b/templates/status/500.tmpl index bca0387756..469fce593a 100644 --- a/templates/status/500.tmpl +++ b/templates/status/500.tmpl @@ -1,36 +1,61 @@ -{{template "base/head" .}} -<div role="main" aria-label="{{.Title}}" class="page-content status-page-500"> - <p class="gt-mt-5 center"><img src="{{AssetUrlPrefix}}/img/500.png" alt="Internal Server Error"></p> - <div class="ui divider"></div> - - <div class="ui container gt-mt-5"> - {{if .ErrorMsg}} - <p>{{.locale.Tr "error.occurred"}}:</p> - <pre class="gt-whitespace-pre-wrap gt-break-all">{{.ErrorMsg}}</pre> - {{end}} - - <div class="center gt-mt-5"> - {{if .ShowFooterVersion}}<p>{{.locale.Tr "admin.config.app_ver"}}: {{AppVer}}</p>{{end}} - {{if .IsAdmin}}<p>{{.locale.Tr "error.report_message" | Safe}}</p>{{end}} +{{/* This page should only depend the minimal template functions/variables, to avoid triggering new panics. +* base template functions: AppName, AssetUrlPrefix, AssetVersion, AppSubUrl, DefaultTheme, Str2html +* locale +* ErrorMsg +* SignedUser (optional) +*/}} +<!DOCTYPE html> +<html lang="{{.locale.Lang}}" class="theme-{{if .SignedUser.Theme}}{{.SignedUser.Theme}}{{else}}{{DefaultTheme}}{{end}}"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Internal Server Error - {{AppName}}</title> + <link rel="icon" href="{{AssetUrlPrefix}}/img/favicon.svg" type="image/svg+xml"> + <link rel="alternate icon" href="{{AssetUrlPrefix}}/img/favicon.png" type="image/png"> + <link rel="stylesheet" href="{{AssetUrlPrefix}}/css/index.css?v={{AssetVersion}}"> +</head> +<body> + <div class="full height"> + <nav class="ui secondary menu following bar light"> + <div class="ui container gt-df"> + <div class="item brand gt-f1"> + <a href="{{AppSubUrl}}/" aria-label="{{.locale.Tr "home"}}"> + <img width="30" height="30" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{.locale.Tr "logo"}}" aria-hidden="true"> + </a> + </div> + <button class="item ui icon button">{{svg "octicon-three-bars"}}</button>{{/* a fake button to make the UI looks better*/}} + </div> + </nav> + <div role="main" class="page-content status-page-500"> + <p class="gt-mt-5 center"><img src="{{AssetUrlPrefix}}/img/500.png" alt="Internal Server Error"></p> + <div class="ui divider"></div> + <div class="ui container gt-mt-5"> + {{if .ErrorMsg}} + <p>{{.locale.Tr "error.occurred"}}:</p> + <pre class="gt-whitespace-pre-wrap gt-break-all">{{.ErrorMsg}}</pre> + {{end}} + <div class="center gt-mt-5"> + {{if or .SignedUser.IsAdmin .ShowFooterVersion}}<p>{{.locale.Tr "admin.config.app_ver"}}: {{AppVer}}</p>{{end}} + {{if .SignedUser.IsAdmin}}<p>{{.locale.Tr "error.report_message" | Str2html}}</p>{{end}} + </div> + </div> </div> </div> -</div> -{{/* when a sub-template triggers an 500 error, its parent template has been partially rendered, -then the 500 page will be rendered after that partially rendered page, the HTML/JS are totally broken. -so use this inline script to try to move it to main viewport */}} -<script type="module"> -const embedded = document.querySelector('.page-content .page-content.status-page-500'); -if (embedded) { - // move footer to main view - const footer = document.querySelector('footer'); - if (footer) document.querySelector('body').append(footer); - // move the 500 error page content to main view - const embeddedParent = embedded.parentNode; - let main = document.querySelector('.page-content'); - main = main ?? document.querySelector('body'); - main.prepend(document.createElement('hr')); - main.prepend(embedded); - embeddedParent.remove(); // remove the unrelated 500-page elements (eg: the duplicate nav bar) -} -</script> -{{template "base/footer" .}} + + {{/* When a sub-template triggers an 500 error, its parent template has been partially rendered, then the 500 page + will be rendered after that partially rendered page, the HTML/JS are totally broken. Use this inline script to try to move it to main viewport. + And this page shouldn't include any other JS file, avoid duplicate JS execution (still due to the partial rendering).*/}} + <script type="module"> + const embedded = document.querySelector('.page-content .page-content.status-page-500'); + if (embedded) { + // move the 500 error page content to main view + const embeddedParent = embedded.parentNode; + let main = document.querySelector('.page-content'); + main = main ?? document.querySelector('body'); + main.prepend(document.createElement('hr')); + main.prepend(embedded); + embeddedParent.remove(); // remove the unrelated 500-page elements (eg: the duplicate nav bar) + } + </script> +</body> +</html> diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl index 9f454a82f1..5463270854 100644 --- a/templates/user/profile.tmpl +++ b/templates/user/profile.tmpl @@ -5,7 +5,7 @@ <div class="ui five wide column"> <div class="ui card"> <div id="profile-avatar" class="content gt-df"> - {{if eq .SignedUserName .ContextUser.Name}} + {{if eq .SignedUserID .ContextUser.ID}} <a class="image" href="{{AppSubUrl}}/user/settings" data-tooltip-content="{{.locale.Tr "user.change_avatar"}}"> {{avatar $.Context .ContextUser 290}} </a> @@ -30,7 +30,7 @@ {{if .ContextUser.Location}} <li>{{svg "octicon-location"}} {{.ContextUser.Location}}</li> {{end}} - {{if (eq .SignedUserName .ContextUser.Name)}} + {{if (eq .SignedUserID .ContextUser.ID)}} <li> {{svg "octicon-mail"}} <a href="mailto:{{.ContextUser.Email}}" rel="nofollow">{{.ContextUser.Email}}</a> @@ -100,7 +100,7 @@ </ul> </li> {{end}} - {{if and .IsSigned (ne .SignedUserName .ContextUser.Name)}} + {{if and .IsSigned (ne .SignedUserID .ContextUser.ID)}} <li class="follow"> {{if $.IsFollowing}} <form method="post" action="{{.Link}}?action=unfollow&redirect_to={{$.Link}}"> |