aboutsummaryrefslogtreecommitdiffstats
path: root/templates
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2023-05-04 14:36:34 +0800
committerGitHub <noreply@github.com>2023-05-04 14:36:34 +0800
commit5d77691d428d5302ee4df6c2a936b8e2ea9dca7e (patch)
tree4fa6b13f2ae81c5de94d84f2288ae1f5653c011f /templates
parent75ea0d5dba5dbf2f84cef2d12460fdd566d43e62 (diff)
downloadgitea-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.tmpl1
-rw-r--r--templates/status/500.tmpl93
-rw-r--r--templates/user/profile.tmpl6
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}}">