Compare commits
	
		
			6 Commits
		
	
	
		
			enterprise
			...
			template-f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b0f8c29d69 | |||
| f20d7a200e | |||
| 3eb2c9bcc0 | |||
| 037ef3a2a0 | |||
| 61bc89959b | |||
| 2797d26b93 | 
| @ -3,15 +3,20 @@ | ||||
| {% load authentik_core %} | ||||
|  | ||||
| {% block title %} | ||||
| API Browser - {{ brand.branding_title }} | ||||
|   API Browser - {{ brand.branding_title }} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block head %} | ||||
| <script src="{% versioned_script 'dist/standalone/api-browser/index-%v.js' %}" type="module"></script> | ||||
| <meta name="theme-color" content="#151515" media="(prefers-color-scheme: light)"> | ||||
| <meta name="theme-color" content="#151515" media="(prefers-color-scheme: dark)"> | ||||
|   <meta name="theme-color" content="#18191a" media="(prefers-color-scheme: dark)"> | ||||
|   <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"> | ||||
|  | ||||
|   <script | ||||
|     data-test-id="entrypoint" | ||||
|     src="{% versioned_script 'dist/standalone/api-browser/index-%v.js' %}" | ||||
|     type="module"> | ||||
|   </script> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block body %} | ||||
| <ak-api-browser schemaPath="{{ path }}"></ak-api-browser> | ||||
|   <ak-api-browser schemaPath="{{ path }}"></ak-api-browser> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -2,30 +2,35 @@ | ||||
| {% get_current_language as LANGUAGE_CODE %} | ||||
|  | ||||
| <script> | ||||
|     window.authentik = { | ||||
|         locale: "{{ LANGUAGE_CODE }}", | ||||
|         config: JSON.parse('{{ config_json|escapejs }}'), | ||||
|         brand: JSON.parse('{{ brand_json|escapejs }}'), | ||||
|         versionFamily: "{{ version_family }}", | ||||
|         versionSubdomain: "{{ version_subdomain }}", | ||||
|         build: "{{ build }}", | ||||
|         api: { | ||||
|             base: "{{ base_url }}", | ||||
|             relBase: "{{ base_url_rel }}", | ||||
|         }, | ||||
|     }; | ||||
|     window.addEventListener("DOMContentLoaded", function () { | ||||
|         {% for message in messages %} | ||||
|         window.dispatchEvent( | ||||
|             new CustomEvent("ak-message", { | ||||
|                 bubbles: true, | ||||
|                 composed: true, | ||||
|                 detail: { | ||||
|                     level: "{{ message.tags|escapejs }}", | ||||
|                     message: "{{ message.message|escapejs }}", | ||||
|                 }, | ||||
|             }), | ||||
|         ); | ||||
|         {% endfor %} | ||||
|     }); | ||||
|   window.authentik = { | ||||
|     locale: "{{ LANGUAGE_CODE }}", | ||||
|     config: JSON.parse('{{ config_json|escapejs }}' || '{}'), | ||||
|     brand: JSON.parse('{{ brand_json|escapejs }}' || '{}'), | ||||
|     versionFamily: '{{ version_family }}', | ||||
|     versionSubdomain: '{{ version_subdomain }}', | ||||
|     build: '{{ build }}', | ||||
|     api: { | ||||
|       base: '{{ base_url }}', | ||||
|       relBase: '{{ base_url_rel }}', | ||||
|     }, | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| {% if messages %} | ||||
|   <script> | ||||
|     window.addEventListener("DOMContentLoaded", function () { | ||||
|       {% for message in messages %} | ||||
|         window.dispatchEvent( | ||||
|           new CustomEvent("ak-message", { | ||||
|               bubbles: true, | ||||
|               composed: true, | ||||
|               detail: { | ||||
|                   level: "{{ message.tags|escapejs }}", | ||||
|                   message: "{{ message.message|escapejs }}", | ||||
|               }, | ||||
|           }), | ||||
|         ); | ||||
|       {% endfor %} | ||||
|     }); | ||||
|   </script> | ||||
| {% endif %} | ||||
|  | ||||
| @ -2,31 +2,85 @@ | ||||
| {% load i18n %} | ||||
| {% load authentik_core %} | ||||
|  | ||||
| <!DOCTYPE html> | ||||
| <!doctype html> | ||||
| <html lang="{{ get_current_language }}"> | ||||
|   <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||
|  | ||||
| <html> | ||||
|     <head> | ||||
|         <meta charset="UTF-8"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||
|         {# Darkreader breaks the site regardless of theme as its not compatible with webcomponents, and we default to a dark theme based on preferred colour-scheme #} | ||||
|         <meta name="darkreader-lock"> | ||||
|         <title>{% block title %}{% trans title|default:brand.branding_title %}{% endblock %}</title> | ||||
|         <link rel="icon" href="{{ brand.branding_favicon_url }}"> | ||||
|         <link rel="shortcut icon" href="{{ brand.branding_favicon_url }}"> | ||||
|         {% block head_before %} | ||||
|         {% endblock %} | ||||
|         <link rel="stylesheet" type="text/css" href="{% static 'dist/authentik.css' %}"> | ||||
|         <style>{{ brand.branding_custom_css }}</style> | ||||
|         <script src="{% versioned_script 'dist/poly-%v.js' %}" type="module"></script> | ||||
|         <script src="{% versioned_script 'dist/standalone/loading/index-%v.js' %}" type="module"></script> | ||||
|         {% block head %} | ||||
|         {% endblock %} | ||||
|         <meta name="sentry-trace" content="{{ sentry_trace }}" /> | ||||
|     </head> | ||||
|     <body> | ||||
|         {% block body %} | ||||
|         {% endblock %} | ||||
|         {% block scripts %} | ||||
|         {% endblock %} | ||||
|     </body> | ||||
|     {% comment %} | ||||
|       Darkreader breaks the site regardless of theme as its not compatible with webcomponents, | ||||
|       and we default to a dark theme based on preferred colour-scheme. | ||||
|     {% endcomment %} | ||||
|  | ||||
|     <meta name="darkreader-lock"> | ||||
|  | ||||
|     <title>{% block title %}{% trans title|default:brand.branding_title %}{% endblock %}</title> | ||||
|  | ||||
|     <link rel="icon" href="{{ brand.branding_favicon_url }}"> | ||||
|     <link rel="shortcut icon" href="{{ brand.branding_favicon_url }}"> | ||||
|  | ||||
|     {% block head_before %} | ||||
|     {% endblock %} | ||||
|  | ||||
|     <link rel="stylesheet" type="text/css" href="{% static 'dist/authentik.css' %}"> | ||||
|  | ||||
|     <style data-test-id="color-scheme"> | ||||
|       @media (prefers-color-scheme: dark) { | ||||
|         :root { | ||||
|           color-scheme: dark light; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       @media (prefers-color-scheme: light) { | ||||
|         :root { | ||||
|           color-scheme: light dark; | ||||
|         } | ||||
|       } | ||||
|     </style> | ||||
|  | ||||
|     <style data-test-id="custom-branding-css"> | ||||
|       {{ brand.branding_custom_css }} | ||||
|     </style> | ||||
|  | ||||
|     <script | ||||
|       data-test-id="entrypoint-polyfill" | ||||
|       src="{% versioned_script 'dist/poly-%v.js' %}" | ||||
|       type="module"> | ||||
|     </script> | ||||
|  | ||||
|     <script | ||||
|       data-test-id="entrypoint-loading" | ||||
|       src="{% versioned_script 'dist/standalone/loading/index-%v.js' %}" | ||||
|       type="module"> | ||||
|     </script> | ||||
|  | ||||
|     {% block head %} | ||||
|     {% endblock %} | ||||
|  | ||||
|     <meta name="sentry-trace" content="{{ sentry_trace }}"> | ||||
|   </head> | ||||
|  | ||||
|   <body> | ||||
|     {% block body %}{% endblock %} | ||||
|     {% block scripts %}{% endblock %} | ||||
|  | ||||
|     <noscript> | ||||
|       <style> | ||||
|         body { | ||||
|           font-family: var(--ak-font-family-base), sans-serif; | ||||
|         } | ||||
|       </style> | ||||
|  | ||||
|       <h1> | ||||
|         {% blocktrans with brand_title=title|default:brand.branding_title %} | ||||
|           JavaScript is required to use {{ brand_title }} | ||||
|         {% endblocktrans %} | ||||
|       </h1> | ||||
|  | ||||
|       <p> | ||||
|         {% trans 'Please enable JavaScript in your browser settings and reload the page. If you are using a browser extension that blocks JavaScript, please disable it for this site.' %} | ||||
|       </p> | ||||
|     </noscript> | ||||
|   </body> | ||||
| </html> | ||||
|  | ||||
| @ -3,15 +3,22 @@ | ||||
| {% load authentik_core %} | ||||
|  | ||||
| {% block head %} | ||||
| <script src="{% versioned_script 'dist/admin/AdminInterface-%v.js' %}" type="module"></script> | ||||
| <meta name="theme-color" content="#18191a" media="(prefers-color-scheme: dark)"> | ||||
| <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"> | ||||
| {% include "base/header_js.html" %} | ||||
|   <meta name="theme-color" content="#18191a" media="(prefers-color-scheme: dark)"> | ||||
|   <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"> | ||||
|  | ||||
|   {% include "base/header_js.html" %} | ||||
|  | ||||
|   <script | ||||
|     data-test-id="entrypoint" | ||||
|     src="{% versioned_script 'dist/admin/AdminInterface-%v.js' %}" | ||||
|     type="module"> | ||||
|   </script> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block body %} | ||||
| <ak-message-container></ak-message-container> | ||||
| <ak-interface-admin> | ||||
|   <ak-message-container></ak-message-container> | ||||
|  | ||||
|   <ak-interface-admin> | ||||
|     <ak-loading></ak-loading> | ||||
| </ak-interface-admin> | ||||
|   </ak-interface-admin> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -4,18 +4,22 @@ | ||||
| {% load i18n %} | ||||
|  | ||||
| {% block title %} | ||||
| {{ brand.branding_title }} | ||||
|   {{ brand.branding_title }} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block card_title %} | ||||
| {% trans title %} | ||||
|   {% trans title %} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block card %} | ||||
| <form method="POST" class="pf-c-form"> | ||||
|   <form method="POST" class="pf-c-form"> | ||||
|     <p>{% trans message %}</p> | ||||
|     <a id="ak-back-home" href="{% url 'authentik_core:root-redirect' %}" class="pf-c-button pf-m-primary"> | ||||
|         {% trans 'Go home' %} | ||||
|  | ||||
|     <a | ||||
|       id="ak-back-home" | ||||
|       href="{% url 'authentik_core:root-redirect' %}" | ||||
|       class="pf-c-button pf-m-primary"> | ||||
|       {% trans 'Go home' %} | ||||
|     </a> | ||||
| </form> | ||||
|   </form> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -3,15 +3,22 @@ | ||||
| {% load authentik_core %} | ||||
|  | ||||
| {% block head %} | ||||
| <script src="{% versioned_script 'dist/user/UserInterface-%v.js' %}" type="module"></script> | ||||
| <meta name="theme-color" content="#1c1e21" media="(prefers-color-scheme: light)"> | ||||
| <meta name="theme-color" content="#1c1e21" media="(prefers-color-scheme: dark)"> | ||||
| {% include "base/header_js.html" %} | ||||
|   <meta name="theme-color" content="#18191a" media="(prefers-color-scheme: dark)"> | ||||
|   <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"> | ||||
|  | ||||
|   {% include "base/header_js.html" %} | ||||
|  | ||||
|   <script | ||||
|     data-test-id="entrypoint" | ||||
|     src="{% versioned_script 'dist/user/UserInterface-%v.js' %}" | ||||
|     type="module"> | ||||
|   </script> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block body %} | ||||
| <ak-message-container></ak-message-container> | ||||
| <ak-interface-user> | ||||
|   <ak-message-container></ak-message-container> | ||||
|  | ||||
|   <ak-interface-user> | ||||
|     <ak-loading></ak-loading> | ||||
| </ak-interface-user> | ||||
|   </ak-interface-user> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -4,79 +4,93 @@ | ||||
| {% load i18n %} | ||||
|  | ||||
| {% block head_before %} | ||||
| <link rel="prefetch" href="{{ request.brand.branding_default_flow_background_url }}" /> | ||||
| <link rel="stylesheet" type="text/css" href="{% static 'dist/patternfly.min.css' %}"> | ||||
| <link rel="stylesheet" type="text/css" href="{% static 'dist/theme-dark.css' %}" media="(prefers-color-scheme: dark)"> | ||||
| {% include "base/header_js.html" %} | ||||
|   <link rel="prefetch" href="{{ request.brand.branding_default_flow_background_url }}"> | ||||
|  | ||||
|   <link rel="stylesheet" type="text/css" href="{% static 'dist/patternfly.min.css' %}"> | ||||
|   <link | ||||
|     rel="stylesheet" | ||||
|     type="text/css" | ||||
|     href="{% static 'dist/theme-dark.css' %}" | ||||
|     media="(prefers-color-scheme: dark)" | ||||
|  > | ||||
|  | ||||
|   {% include "base/header_js.html" %} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block head %} | ||||
| <style> | ||||
| :root { | ||||
|     --ak-flow-background: url("{{ request.brand.branding_default_flow_background_url }}"); | ||||
|     --pf-c-background-image--BackgroundImage: var(--ak-flow-background); | ||||
|     --pf-c-background-image--BackgroundImage-2x: var(--ak-flow-background); | ||||
|     --pf-c-background-image--BackgroundImage--sm: var(--ak-flow-background); | ||||
|     --pf-c-background-image--BackgroundImage--sm-2x: var(--ak-flow-background); | ||||
|     --pf-c-background-image--BackgroundImage--lg: var(--ak-flow-background); | ||||
| } | ||||
| /* Form with user */ | ||||
| .form-control-static { | ||||
|     margin-top: var(--pf-global--spacer--sm); | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: space-between; | ||||
| } | ||||
| .form-control-static .avatar { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
| } | ||||
| .form-control-static img { | ||||
|     margin-right: var(--pf-global--spacer--xs); | ||||
| } | ||||
| .form-control-static a { | ||||
|     padding-top: var(--pf-global--spacer--xs); | ||||
|     padding-bottom: var(--pf-global--spacer--xs); | ||||
|     line-height: var(--pf-global--spacer--xl); | ||||
| } | ||||
| </style> | ||||
|   <style data-test-id="base-full-root-styles"> | ||||
|     :root { | ||||
|       --ak-flow-background: url("{{ request.brand.branding_default_flow_background_url }}"); | ||||
|       --pf-c-background-image--BackgroundImage: var(--ak-flow-background); | ||||
|       --pf-c-background-image--BackgroundImage-2x: var(--ak-flow-background); | ||||
|       --pf-c-background-image--BackgroundImage--sm: var(--ak-flow-background); | ||||
|       --pf-c-background-image--BackgroundImage--sm-2x: var(--ak-flow-background); | ||||
|       --pf-c-background-image--BackgroundImage--lg: var(--ak-flow-background); | ||||
|     } | ||||
|  | ||||
|     /* Form with user */ | ||||
|     .form-control-static { | ||||
|       margin-top: var(--pf-global--spacer--sm); | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|     } | ||||
|  | ||||
|     .form-control-static .avatar { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|     } | ||||
|  | ||||
|     .form-control-static img { | ||||
|       margin-right: var(--pf-global--spacer--xs); | ||||
|     } | ||||
|  | ||||
|     .form-control-static a { | ||||
|       padding-top: var(--pf-global--spacer--xs); | ||||
|       padding-bottom: var(--pf-global--spacer--xs); | ||||
|       line-height: var(--pf-global--spacer--xl); | ||||
|     } | ||||
|   </style> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block body %} | ||||
| <div class="pf-c-background-image"> | ||||
| </div> | ||||
| <ak-message-container></ak-message-container> | ||||
| <div class="pf-c-login stacked"> | ||||
|   <div class="pf-c-background-image"></div> | ||||
|  | ||||
|   <ak-message-container></ak-message-container> | ||||
|  | ||||
|   <div class="pf-c-login stacked"> | ||||
|     <div class="ak-login-container"> | ||||
|         <main class="pf-c-login__main"> | ||||
|             <div class="pf-c-login__main-header pf-c-brand ak-brand"> | ||||
|                 <img src="{{ brand.branding_logo_url }}" alt="authentik Logo" /> | ||||
|             </div> | ||||
|             <header class="pf-c-login__main-header"> | ||||
|                 <h1 class="pf-c-title pf-m-3xl"> | ||||
|                     {% block card_title %} | ||||
|                     {% endblock %} | ||||
|                 </h1> | ||||
|             </header> | ||||
|             <div class="pf-c-login__main-body"> | ||||
|                 {% block card %} | ||||
|                 {% endblock %} | ||||
|             </div> | ||||
|         </main> | ||||
|         <footer class="pf-c-login__footer"> | ||||
|             <ul class="pf-c-list pf-m-inline"> | ||||
|                 {% for link in footer_links %} | ||||
|                 <li> | ||||
|                     <a href="{{ link.href }}">{{ link.name }}</a> | ||||
|                 </li> | ||||
|                 {% endfor %} | ||||
|                 <li> | ||||
|                     <span> | ||||
|                         {% trans 'Powered by authentik' %} | ||||
|                     </span> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </footer> | ||||
|       <main class="pf-c-login__main"> | ||||
|         <div class="pf-c-login__main-header pf-c-brand ak-brand"> | ||||
|           <img src="{{ brand.branding_logo_url }}" alt="authentik Logo"> | ||||
|         </div> | ||||
|  | ||||
|         <header class="pf-c-login__main-header"> | ||||
|           <h1 class="pf-c-title pf-m-3xl"> | ||||
|             {% block card_title %} | ||||
|             {% endblock %} | ||||
|           </h1> | ||||
|         </header> | ||||
|  | ||||
|         <div class="pf-c-login__main-body"> | ||||
|           {% block card %} | ||||
|           {% endblock %} | ||||
|         </div> | ||||
|       </main> | ||||
|  | ||||
|       <footer class="pf-c-login__footer"> | ||||
|         <ul class="pf-c-list pf-m-inline"> | ||||
|           {% for link in footer_links %} | ||||
|             <li> | ||||
|               <a href="{{ link.href }}">{{ link.name }}</a> | ||||
|             </li> | ||||
|           {% endfor %} | ||||
|  | ||||
|           <li> | ||||
|             <span>{% trans 'Powered by authentik' %}</span> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </footer> | ||||
|     </div> | ||||
| </div> | ||||
|   </div> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -2,53 +2,63 @@ | ||||
| {% load i18n %} | ||||
| {% load authentik_core %} | ||||
|  | ||||
| <!DOCTYPE html> | ||||
| <!doctype html> | ||||
|  | ||||
| <html lang="en"> | ||||
|     <head> | ||||
|         <meta charset="UTF-8"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||
|         <title>{% block title %}{% trans title|default:brand.branding_title %}{% endblock %}</title> | ||||
|         <link rel="icon" href="{{ brand.branding_favicon_url }}"> | ||||
|         <link rel="shortcut icon" href="{{ brand.branding_favicon_url }}"> | ||||
|         {% block head_before %} | ||||
|         {% endblock %} | ||||
|         <link rel="stylesheet" type="text/css" href="{% static 'dist/sfe/bootstrap.min.css' %}"> | ||||
|         <meta name="sentry-trace" content="{{ sentry_trace }}" /> | ||||
|         {% include "base/header_js.html" %} | ||||
|         <style> | ||||
|           html, | ||||
|           body { | ||||
|             height: 100%; | ||||
|           } | ||||
|           body { | ||||
|             background-image: url("{{ flow.background_url }}"); | ||||
|             background-repeat: no-repeat; | ||||
|             background-size: cover; | ||||
|           } | ||||
|           .card { | ||||
|             padding: 3rem; | ||||
|           } | ||||
|   <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||
|  | ||||
|           .form-signin { | ||||
|             max-width: 330px; | ||||
|             padding: 1rem; | ||||
|           } | ||||
|     <title>{% block title %}{% trans title|default:brand.branding_title %}{% endblock %}</title> | ||||
|  | ||||
|           .form-signin .form-floating:focus-within { | ||||
|             z-index: 2; | ||||
|           } | ||||
|           .brand-icon { | ||||
|             max-width: 100%; | ||||
|           } | ||||
|         </style> | ||||
|     </head> | ||||
|     <body class="d-flex align-items-center py-4 bg-body-tertiary"> | ||||
|       <div class="card m-auto"> | ||||
|         <main class="form-signin w-100 m-auto" id="flow-sfe-container"> | ||||
|         </main> | ||||
|         <span class="mt-3 mb-0 text-muted text-center">{% trans 'Powered by authentik' %}</span> | ||||
|       </div> | ||||
|       <script src="{% static 'dist/sfe/index.js' %}"></script> | ||||
|     </body> | ||||
|     <link rel="icon" href="{{ brand.branding_favicon_url }}"> | ||||
|     <link rel="shortcut icon" href="{{ brand.branding_favicon_url }}"> | ||||
|  | ||||
|     {% block head_before %} | ||||
|     {% endblock %} | ||||
|  | ||||
|     <link rel="stylesheet" type="text/css" href="{% static 'dist/sfe/bootstrap.min.css' %}"> | ||||
|     <meta name="sentry-trace" content="{{ sentry_trace }}"> | ||||
|  | ||||
|     {% include "base/header_js.html" %} | ||||
|  | ||||
|     <style> | ||||
|       html, | ||||
|       body { | ||||
|         height: 100%; | ||||
|       } | ||||
|  | ||||
|       body { | ||||
|         background-image: url("{{ flow.background_url }}"); | ||||
|         background-repeat: no-repeat; | ||||
|         background-size: cover; | ||||
|       } | ||||
|  | ||||
|       .card { | ||||
|         padding: 3rem; | ||||
|       } | ||||
|  | ||||
|       .form-signin { | ||||
|         max-width: 330px; | ||||
|         padding: 1rem; | ||||
|       } | ||||
|  | ||||
|       .form-signin .form-floating:focus-within { | ||||
|         z-index: 2; | ||||
|       } | ||||
|  | ||||
|       .brand-icon { | ||||
|         max-width: 100%; | ||||
|       } | ||||
|     </style> | ||||
|   </head> | ||||
|  | ||||
|   <body class="d-flex align-items-center py-4 bg-body-tertiary"> | ||||
|     <div class="card m-auto"> | ||||
|       <main class="form-signin w-100 m-auto" id="flow-sfe-container"></main> | ||||
|       <span class="mt-3 mb-0 text-muted text-center">{% trans 'Powered by authentik' %}</span> | ||||
|     </div> | ||||
|  | ||||
|     <script src="{% static 'dist/sfe/index.js' %}"></script> | ||||
|   </body> | ||||
| </html> | ||||
|  | ||||
| @ -4,31 +4,45 @@ | ||||
| {% load authentik_core %} | ||||
|  | ||||
| {% block head_before %} | ||||
| {{ block.super }} | ||||
| <link rel="prefetch" href="{{ flow.background_url }}" /> | ||||
| {% if flow.compatibility_mode and not inspector %} | ||||
| <script>ShadyDOM = { force: !navigator.webdriver };</script> | ||||
| {% endif %} | ||||
| {% include "base/header_js.html" %} | ||||
| <script> | ||||
| window.authentik.flow = { | ||||
|     "layout": "{{ flow.layout }}", | ||||
| }; | ||||
| </script> | ||||
|   {{ block.super }} | ||||
|  | ||||
|   <link rel="prefetch" href="{{ flow.background_url }}"> | ||||
|  | ||||
|   {% if flow.compatibility_mode and not inspector %} | ||||
|     <script> | ||||
|       window.ShadyDOM = { force: !navigator.webdriver }; | ||||
|     </script> | ||||
|   {% endif %} | ||||
|  | ||||
|   {% include "base/header_js.html" %} | ||||
|  | ||||
|   <script> | ||||
|     window.authentik.flow = { | ||||
|       layout: "{{ flow.layout }}", | ||||
|     }; | ||||
|   </script> | ||||
|  | ||||
|   <meta name="ak-flow-layout" content="{{ flow.layout }}"> | ||||
|  | ||||
| {% endblock %} | ||||
|  | ||||
| {% block head %} | ||||
| <script src="{% versioned_script 'dist/flow/FlowInterface-%v.js' %}" type="module"></script> | ||||
| <style> | ||||
| :root { | ||||
|     --ak-flow-background: url("{{ flow.background_url }}"); | ||||
| } | ||||
| </style> | ||||
|   <script | ||||
|     data-test-id="entrypoint" | ||||
|     src="{% versioned_script 'dist/flow/FlowInterface-%v.js' %}" | ||||
|     type="module"> | ||||
|   </script> | ||||
|  | ||||
|   <style data-test-id="flow-root-styles"> | ||||
|     :root { | ||||
|       --ak-flow-background: url("{{ flow.background_url }}"); | ||||
|     } | ||||
|   </style> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block body %} | ||||
| <ak-message-container></ak-message-container> | ||||
| <ak-flow-executor flowSlug="{{ flow.slug }}"> | ||||
|   <ak-message-container></ak-message-container> | ||||
|   <ak-flow-executor flowSlug="{{ flow.slug }}"> | ||||
|     <ak-loading></ak-loading> | ||||
| </ak-flow-executor> | ||||
|   </ak-flow-executor> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -5,21 +5,28 @@ | ||||
|  | ||||
| {% block head %} | ||||
| {{ block.super }} | ||||
|  | ||||
| <script> | ||||
|   let redirecting = false; | ||||
|  | ||||
|   const checkAuth = async () => { | ||||
|     if (redirecting) return true; | ||||
|  | ||||
|     const url = "{{ check_auth_url }}"; | ||||
|     console.debug("authentik/policies/buffer: Checking authentication..."); | ||||
|  | ||||
|     try { | ||||
|       const result = await fetch(url, { | ||||
|         method: "HEAD", | ||||
|       }); | ||||
|  | ||||
|       if (result.status >= 400) { | ||||
|         return false | ||||
|       } | ||||
|  | ||||
|       console.debug("authentik/policies/buffer: Continuing"); | ||||
|       redirecting = true; | ||||
|  | ||||
|       if ("{{ auth_req_method }}" === "post") { | ||||
|         document.querySelector("form").submit(); | ||||
|       } else { | ||||
| @ -29,61 +36,75 @@ | ||||
|       return false; | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   let timeout = 100; | ||||
|   let offset = 20; | ||||
|   let attempt = 0; | ||||
|  | ||||
|   const main = async () => { | ||||
|     attempt += 1; | ||||
|  | ||||
|     await checkAuth(); | ||||
|  | ||||
|     console.debug(`authentik/policies/buffer: Waiting ${timeout}ms...`); | ||||
|  | ||||
|     setTimeout(main, timeout); | ||||
|  | ||||
|     timeout += (offset * attempt); | ||||
|  | ||||
|     if (timeout >= 2000) { | ||||
|       timeout = 2000; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   document.addEventListener("visibilitychange", async () => { | ||||
|     if (document.hidden) return; | ||||
|  | ||||
|     console.debug("authentik/policies/buffer: Checking authentication on tab activate..."); | ||||
|  | ||||
|     await checkAuth(); | ||||
|   }); | ||||
|  | ||||
|   main(); | ||||
| </script> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block title %} | ||||
| {% trans 'Waiting for authentication...' %} - {{ brand.branding_title }} | ||||
|   {% trans 'Waiting for authentication...' %} - {{ brand.branding_title }} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block card_title %} | ||||
| {% trans 'Waiting for authentication...' %} | ||||
|   {% trans 'Waiting for authentication...' %} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block card %} | ||||
| <form class="pf-c-form" method="{{ auth_req_method }}" action="{{ continue_url }}"> | ||||
|   {% if auth_req_method == "post" %} | ||||
|     {% for key, value in auth_req_body.items %} | ||||
|       <input type="hidden" name="{{ key }}" value="{{ value }}" /> | ||||
|     {% endfor %} | ||||
|   {% endif %} | ||||
|   <div class="pf-c-empty-state"> | ||||
|     <div class="pf-c-empty-state__content"> | ||||
|       <div class="pf-c-empty-state__icon"> | ||||
|         <span class="pf-c-spinner pf-m-xl" role="progressbar"> | ||||
|           <span class="pf-c-spinner__clipper"></span> | ||||
|           <span class="pf-c-spinner__lead-ball"></span> | ||||
|           <span class="pf-c-spinner__tail-ball"></span> | ||||
|         </span> | ||||
|   <form class="pf-c-form" method="{{ auth_req_method }}" action="{{ continue_url }}"> | ||||
|     {% if auth_req_method == "post" %} | ||||
|       {% for key, value in auth_req_body.items %} | ||||
|         <input type="hidden" name="{{ key }}" value="{{ value }}"> | ||||
|       {% endfor %} | ||||
|     {% endif %} | ||||
|  | ||||
|     <div class="pf-c-empty-state"> | ||||
|       <div class="pf-c-empty-state__content"> | ||||
|         <div class="pf-c-empty-state__icon"> | ||||
|           <span class="pf-c-spinner pf-m-xl" role="progressbar"> | ||||
|             <span class="pf-c-spinner__clipper"></span> | ||||
|             <span class="pf-c-spinner__lead-ball"></span> | ||||
|             <span class="pf-c-spinner__tail-ball"></span> | ||||
|           </span> | ||||
|         </div> | ||||
|  | ||||
|         <h1 class="pf-c-title pf-m-lg"> | ||||
|           {% trans "You're already authenticating in another tab. This page will refresh once authentication is completed." %} | ||||
|         </h1> | ||||
|       </div> | ||||
|       <h1 class="pf-c-title pf-m-lg"> | ||||
|         {% trans "You're already authenticating in another tab. This page will refresh once authentication is completed." %} | ||||
|       </h1> | ||||
|     </div> | ||||
|   </div> | ||||
|   <div class="pf-c-form__group pf-m-action"> | ||||
|     <a href="{{ auth_req_url }}" class="pf-c-button pf-m-primary pf-m-block"> | ||||
|       {% trans "Authenticate in this tab" %} | ||||
|     </a> | ||||
|   </div> | ||||
| </form> | ||||
|  | ||||
|     <div class="pf-c-form__group pf-m-action"> | ||||
|       <a href="{{ auth_req_url }}" class="pf-c-button pf-m-primary pf-m-block"> | ||||
|         {% trans "Authenticate in this tab" %} | ||||
|       </a> | ||||
|     </div> | ||||
|   </form> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -13,63 +13,69 @@ | ||||
|  | ||||
| {% block card %} | ||||
| <form class="pf-c-form"> | ||||
|     {% csrf_token %} | ||||
|     {% if user.is_authenticated %} | ||||
|         <div class="pf-c-form__group"> | ||||
|             <div class="form-control-static"> | ||||
|                 <div class="avatar"> | ||||
|                     <img class="pf-c-avatar" src="{{ user.avatar }}" alt="{% trans "User's avatar" %}" /> | ||||
|                     {{ user.username }} | ||||
|                 </div> | ||||
|                 <div slot="link"> | ||||
|                     <a href="{{ cancel }}">{% trans "Not you?" %}</a> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     {% endif %} | ||||
|   {% csrf_token %} | ||||
|  | ||||
|   {% if user.is_authenticated %} | ||||
|     <div class="pf-c-form__group"> | ||||
|         <p> | ||||
|             <i class="pf-icon pf-icon-error-circle-o"></i> | ||||
|             {% trans 'Request has been denied.' %} | ||||
|         </p> | ||||
|         {% if error %} | ||||
|         <hr> | ||||
|         <p> | ||||
|             {{ error }} | ||||
|         </p> | ||||
|         {% endif %} | ||||
|         {% if policy_result %} | ||||
|             <hr> | ||||
|             {% if policy_result.messages %} | ||||
|             <em>{% trans 'Messages:' %}</em> | ||||
|             <ul class="pf-c-list"> | ||||
|                 {% for message in policy_result.messages %} | ||||
|                 <li> | ||||
|                     {{ message }} | ||||
|                 </li> | ||||
|                 {% endfor %} | ||||
|             </ul> | ||||
|             {% endif %} | ||||
|             {% if policy_result.source_results %} | ||||
|             <em>{% trans 'Explanation:' %}</em> | ||||
|             <ul class="pf-c-list"> | ||||
|                 {% for source_result in policy_result.source_results %} | ||||
|                 <li> | ||||
|                     {% blocktrans with name=source_result.source_binding result=source_result.passing %} | ||||
|                     Policy binding '{{ name }}' returned result '{{ result }}' | ||||
|                     {% endblocktrans %} | ||||
|                     {% if source_result.messages %} | ||||
|                     <ul class="pf-c-list"> | ||||
|                         {% for message in source_result.messages %} | ||||
|                             <li>{{ message }}</li> | ||||
|                         {% endfor %} | ||||
|                     </ul> | ||||
|                     {% endif %} | ||||
|                 </li> | ||||
|                 {% endfor %} | ||||
|             </ul> | ||||
|             {% endif %} | ||||
|         {% endif %} | ||||
|       <div class="form-control-static"> | ||||
|         <div class="avatar"> | ||||
|           <img class="pf-c-avatar" src="{{ user.avatar }}" alt="{% trans "User's avatar" %}"> | ||||
|           {{ user.username }} | ||||
|         </div> | ||||
|         <div slot="link"> | ||||
|           <a href="{{ cancel }}">{% trans "Not you?" %}</a> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   {% endif %} | ||||
|  | ||||
|   <div class="pf-c-form__group"> | ||||
|     <p> | ||||
|       <i class="pf-icon pf-icon-error-circle-o"></i> | ||||
|       {% trans 'Request has been denied.' %} | ||||
|     </p> | ||||
|  | ||||
|     {% if error %} | ||||
|       <hr> | ||||
|  | ||||
|       <p>{{ error }}</p> | ||||
|     {% endif %} | ||||
|  | ||||
|     {% if policy_result %} | ||||
|       <hr> | ||||
|  | ||||
|       {% if policy_result.messages %} | ||||
|         <em>{% trans 'Messages:' %}</em> | ||||
|  | ||||
|         <ul class="pf-c-list"> | ||||
|           {% for message in policy_result.messages %} | ||||
|             <li>{{ message }}</li> | ||||
|           {% endfor %} | ||||
|         </ul> | ||||
|       {% endif %} | ||||
|  | ||||
|       {% if policy_result.source_results %} | ||||
|         <em>{% trans 'Explanation:' %}</em> | ||||
|  | ||||
|         <ul class="pf-c-list"> | ||||
|           {% for source_result in policy_result.source_results %} | ||||
|             <li> | ||||
|               {% blocktrans with name=source_result.source_binding result=source_result.passing %} | ||||
|               Policy binding '{{ name }}' returned result '{{ result }}' | ||||
|               {% endblocktrans %} | ||||
|  | ||||
|               {% if source_result.messages %} | ||||
|                 <ul class="pf-c-list"> | ||||
|                   {% for message in source_result.messages %} | ||||
|                     <li>{{ message }}</li> | ||||
|                   {% endfor %} | ||||
|                 </ul> | ||||
|               {% endif %} | ||||
|             </li> | ||||
|           {% endfor %} | ||||
|         </ul> | ||||
|       {% endif %} | ||||
|     {% endif %} | ||||
|   </div> | ||||
| </form> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -3,16 +3,22 @@ | ||||
| {% load authentik_core %} | ||||
|  | ||||
| {% block head %} | ||||
| <script src="{% versioned_script 'dist/rac/index-%v.js' %}" type="module"></script> | ||||
| <meta name="theme-color" content="#18191a" media="(prefers-color-scheme: dark)"> | ||||
| <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"> | ||||
| <link rel="icon" href="{{ tenant.branding_favicon_url }}"> | ||||
| <link rel="shortcut icon" href="{{ tenant.branding_favicon_url }}"> | ||||
| {% include "base/header_js.html" %} | ||||
|   <meta name="theme-color" content="#18191a" media="(prefers-color-scheme: dark)"> | ||||
|   <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"> | ||||
|  | ||||
|   <link rel="icon" href="{{ tenant.branding_favicon_url }}"> | ||||
|   <link rel="shortcut icon" href="{{ tenant.branding_favicon_url }}"> | ||||
|  | ||||
|   {% include "base/header_js.html" %} | ||||
|  | ||||
|   <script | ||||
|     src="{% versioned_script 'dist/rac/index-%v.js' %}" | ||||
|     type="module"> | ||||
|   </script> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block body %} | ||||
| <ak-rac token="{{ url_kwargs.token }}" endpointName="{{ token.endpoint.name }}"> | ||||
|   <ak-loading></ak-loading> | ||||
| </ak-rac> | ||||
|   <ak-rac token="{{ url_kwargs.token }}" endpointName="{{ token.endpoint.name }}"> | ||||
|     <ak-loading></ak-loading> | ||||
|   </ak-rac> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -4,41 +4,43 @@ | ||||
| {% load humanize %} | ||||
|  | ||||
| {% block content %} | ||||
| <tr> | ||||
|   <td align="center"> | ||||
|     <h1> | ||||
|       {% blocktrans with username=user.username %} | ||||
|       Hi {{ username }}, | ||||
|       {% endblocktrans %} | ||||
|     </h1> | ||||
|   </td> | ||||
| </tr> | ||||
| <tr> | ||||
|   <td align="center"> | ||||
|     <table border="0"> | ||||
|       <tr> | ||||
|         <td align="center" style="max-width: 300px; padding: 20px 0; color: #212124;"> | ||||
|           {% blocktrans %} | ||||
|           Email MFA code. | ||||
|           {% endblocktrans %} | ||||
|         </td> | ||||
|       </tr> | ||||
|       <tr> | ||||
|         <td align="center" class="btn btn-primary"> | ||||
|           {{ token }} | ||||
|         </td> | ||||
|       </tr> | ||||
|     </table> | ||||
|   </td> | ||||
| </tr> | ||||
|   <tr> | ||||
|     <td align="center"> | ||||
|       <h1> | ||||
|         {% blocktrans with username=user.username %} | ||||
|         Hi {{ username }}, | ||||
|         {% endblocktrans %} | ||||
|       </h1> | ||||
|     </td> | ||||
|   </tr> | ||||
|  | ||||
|   <tr> | ||||
|     <td align="center"> | ||||
|       <table border="0"> | ||||
|         <tr> | ||||
|           <td align="center" style="max-width: 300px; padding: 20px 0; color: #212124;"> | ||||
|             {% blocktrans %} | ||||
|             Email MFA code. | ||||
|             {% endblocktrans %} | ||||
|           </td> | ||||
|         </tr> | ||||
|  | ||||
|         <tr> | ||||
|           <td align="center" class="btn btn-primary"> | ||||
|             {{ token }} | ||||
|           </td> | ||||
|         </tr> | ||||
|       </table> | ||||
|     </td> | ||||
|   </tr> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block sub_content %} | ||||
| <tr> | ||||
|   <td style="padding: 20px; font-size: 12px; color: #212124;" align="center"> | ||||
|     {% blocktrans with expires=expires|timeuntil %} | ||||
|     If you did not request this code, please ignore this email. The code above is valid for {{ expires }}. | ||||
|     {% endblocktrans %} | ||||
|   </td> | ||||
| </tr> | ||||
|   <tr> | ||||
|     <td style="padding: 20px; font-size: 12px; color: #212124;" align="center"> | ||||
|       {% blocktrans with expires=expires|timeuntil %} | ||||
|         If you did not request this code, please ignore this email. The code above is valid for {{ expires }}. | ||||
|       {% endblocktrans %} | ||||
|     </td> | ||||
|   </tr> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -4,38 +4,47 @@ | ||||
| {% load i18n %} | ||||
|  | ||||
| {% block content %} | ||||
| <tr> | ||||
|   <td align="center"> | ||||
|     <h1> | ||||
|       {% trans 'Welcome!' %} | ||||
|     </h1> | ||||
|   </td> | ||||
| </tr> | ||||
| <tr> | ||||
|   <td align="center"> | ||||
|     <table border="0"> | ||||
|       <tr> | ||||
|         <td align="center" style="max-width: 300px; padding: 20px 0; color: #212124;"> | ||||
|           {% trans "We're excited to have you get started. First, you need to confirm your account. Just press the button below."%} | ||||
|         </td> | ||||
|       </tr> | ||||
|       <tr> | ||||
|         <td align="center" class="btn btn-primary"> | ||||
|           <a id="confirm" href="{{ url }}" rel="noopener noreferrer" target="_blank">{% trans 'Confirm Account' %}</a> | ||||
|         </td> | ||||
|       </tr> | ||||
|     </table> | ||||
|   </td> | ||||
| </tr> | ||||
| <td> | ||||
|   <tr> | ||||
|     <td align="center"> | ||||
|       <h1> | ||||
|         {% trans 'Welcome!' %} | ||||
|       </h1> | ||||
|     </td> | ||||
|   </tr> | ||||
|  | ||||
|   <tr> | ||||
|     <td align="center"> | ||||
|       <table border="0"> | ||||
|         <tr> | ||||
|           <td align="center" style="max-width: 300px; padding: 20px 0; color: #212124;"> | ||||
|             {% trans "We're excited to have you get started. First, you need to confirm your account. Just press the button below."%} | ||||
|           </td> | ||||
|         </tr> | ||||
|  | ||||
|         <tr> | ||||
|           <td align="center" class="btn btn-primary"> | ||||
|             <a | ||||
|               id="confirm" | ||||
|               href="{{ url }}" | ||||
|               rel="noopener noreferrer" | ||||
|               target="_blank"> | ||||
|               {% trans 'Confirm Account' %} | ||||
|             </a> | ||||
|           </td> | ||||
|         </tr> | ||||
|       </table> | ||||
|     </td> | ||||
|   </tr> | ||||
|  | ||||
|   <td> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block sub_content %} | ||||
| <tr> | ||||
|   <td style="padding: 20px; font-size: 12px; color: #212124;word-break: break-all; overflow-wrap: break-word;" align="center"> | ||||
|     {% blocktrans with url=url %} | ||||
|     If that doesn't work, copy and paste the following link in your browser: {{ url }} | ||||
|     {% endblocktrans %} | ||||
|   </td> | ||||
| </tr> | ||||
|   <tr> | ||||
|     <td style="padding: 20px; font-size: 12px; color: #212124;word-break: break-all; overflow-wrap: break-word;" align="center"> | ||||
|       {% blocktrans with url=url %} | ||||
|         If that doesn't work, copy and paste the following link in your browser: {{ url }} | ||||
|       {% endblocktrans %} | ||||
|     </td> | ||||
|   </tr> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| {% load authentik_stages_email %} | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||||
|  | ||||
| <html xmlns="http://www.w3.org/1999/xhtm=l"> | ||||
|   <head> | ||||
|     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | ||||
| @ -99,11 +100,13 @@ | ||||
|                       <img src="{% block logo_url %}cid:logo.png{% endblock %}" border="0=" alt="authentik logo" class="flexibleImage logo"> | ||||
|                     </td> | ||||
|                   </tr> | ||||
|  | ||||
|                   {% block content %} | ||||
|                   {% endblock %} | ||||
|                 </table> | ||||
|               </td> | ||||
|             </tr> | ||||
|  | ||||
|             <tr> | ||||
|               <td> | ||||
|                 <table border="0" style="margin-top: 10px;" width="100%"> | ||||
| @ -118,6 +121,7 @@ | ||||
|                 </table> | ||||
|               </td> | ||||
|             </tr> | ||||
|  | ||||
|             <tr> | ||||
|               <td align="center"> | ||||
|                 Powered by <a rel="noopener noreferrer" target="_blank" href="https://goauthentik.io?utm_source=authentik&utm_medium=email">authentik</a>. | ||||
|  | ||||
| @ -3,50 +3,52 @@ | ||||
| {% load i18n %} | ||||
|  | ||||
| {% block content %} | ||||
| <tr> | ||||
|   <td align="center"> | ||||
|     <h1> | ||||
|       {{ title }} | ||||
|     </h1> | ||||
|   </td> | ||||
| </tr> | ||||
| <tr> | ||||
|   <td align="center"> | ||||
|     <table border="0"> | ||||
|       <tr> | ||||
|         <td align="center" style="max-width: 300px; padding: 20px 0; color: #212124;"> | ||||
|           {{ body }} | ||||
|         </td> | ||||
|       </tr> | ||||
|       {% if key_value %} | ||||
|       <tr> | ||||
|         <td> | ||||
|           <table class="properties-table" width="100%"> | ||||
|             <tbody> | ||||
|               {% for key, value in key_value.items %} | ||||
|               <tr> | ||||
|                 <td class="td-right">{{ key }}</td> | ||||
|                 <td class="td-left">{{ value }}</td> | ||||
|               </tr> | ||||
|               {% endfor %} | ||||
|             </tbody> | ||||
|           </table> | ||||
|         </td> | ||||
|       </tr> | ||||
|       {% endif %} | ||||
|     </table> | ||||
|   </td> | ||||
| </tr> | ||||
|   <tr> | ||||
|     <td align="center"> | ||||
|       <h1> | ||||
|         {{ title }} | ||||
|       </h1> | ||||
|     </td> | ||||
|   </tr> | ||||
|  | ||||
|   <tr> | ||||
|     <td align="center"> | ||||
|       <table border="0"> | ||||
|         <tr> | ||||
|           <td align="center" style="max-width: 300px; padding: 20px 0; color: #212124;"> | ||||
|             {{ body }} | ||||
|           </td> | ||||
|         </tr> | ||||
|  | ||||
|         {% if key_value %} | ||||
|           <tr> | ||||
|             <td> | ||||
|               <table class="properties-table" width="100%"> | ||||
|                 <tbody> | ||||
|                   {% for key, value in key_value.items %} | ||||
|                   <tr> | ||||
|                     <td class="td-right">{{ key }}</td> | ||||
|                     <td class="td-left">{{ value }}</td> | ||||
|                   </tr> | ||||
|                   {% endfor %} | ||||
|                 </tbody> | ||||
|               </table> | ||||
|             </td> | ||||
|           </tr> | ||||
|         {% endif %} | ||||
|       </table> | ||||
|     </td> | ||||
|   </tr> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block sub_content %} | ||||
| {% if source %} | ||||
| <tr> | ||||
|   <td style="padding: 20px; font-size: 12px; color: #212124;" align="center"> | ||||
|     {% blocktranslate with name=source.from %} | ||||
|     This email was sent from the notification transport <code>{{ name }}</code>. | ||||
|     {% endblocktranslate %} | ||||
|   </td> | ||||
| </tr> | ||||
| {% endif %} | ||||
|   {% if source %} | ||||
|     <tr> | ||||
|       <td style="padding: 20px; font-size: 12px; color: #212124;" align="center"> | ||||
|         {% blocktranslate with name=source.from %} | ||||
|         This email was sent from the notification transport <code>{{ name }}</code>. | ||||
|         {% endblocktranslate %} | ||||
|       </td> | ||||
|     </tr> | ||||
|   {% endif %} | ||||
| {% endblock %} | ||||
|  | ||||
| @ -4,41 +4,49 @@ | ||||
| {% load humanize %} | ||||
|  | ||||
| {% block content %} | ||||
| <tr> | ||||
|   <td align="center"> | ||||
|     <h1> | ||||
|       {% blocktrans with username=user.username %} | ||||
|       Hi {{ username }}, | ||||
|       {% endblocktrans %} | ||||
|     </h1> | ||||
|   </td> | ||||
| </tr> | ||||
| <tr> | ||||
|   <td align="center"> | ||||
|     <table border="0"> | ||||
|       <tr> | ||||
|         <td align="center" style="max-width: 300px; padding: 20px 0; color: #212124;"> | ||||
|           {% blocktrans %} | ||||
|           You recently requested to change your password for your authentik account. Use the button below to set a new password. | ||||
|           {% endblocktrans %} | ||||
|         </td> | ||||
|       </tr> | ||||
|       <tr> | ||||
|         <td align="center" class="btn btn-primary"> | ||||
|           <a id="confirm" href="{{ url }}" rel="noopener noreferrer" target="_blank">{% trans 'Reset Password' %}</a> | ||||
|         </td> | ||||
|       </tr> | ||||
|     </table> | ||||
|   </td> | ||||
| </tr> | ||||
|   <tr> | ||||
|     <td align="center"> | ||||
|       <h1> | ||||
|         {% blocktrans with username=user.username %} | ||||
|           Hi {{ username }}, | ||||
|         {% endblocktrans %} | ||||
|       </h1> | ||||
|     </td> | ||||
|   </tr> | ||||
|  | ||||
|   <tr> | ||||
|     <td align="center"> | ||||
|       <table border="0"> | ||||
|         <tr> | ||||
|           <td align="center" style="max-width: 300px; padding: 20px 0; color: #212124;"> | ||||
|             {% blocktrans %} | ||||
|               You recently requested to change your password for your authentik account. Use the button below to set a new password. | ||||
|             {% endblocktrans %} | ||||
|           </td> | ||||
|         </tr> | ||||
|  | ||||
|         <tr> | ||||
|           <td align="center" class="btn btn-primary"> | ||||
|             <a | ||||
|               id="confirm" | ||||
|               href="{{ url }}" | ||||
|               rel="noopener noreferrer" | ||||
|               target="_blank"> | ||||
|               {% trans 'Reset Password' %} | ||||
|             </a> | ||||
|           </td> | ||||
|         </tr> | ||||
|       </table> | ||||
|     </td> | ||||
|   </tr> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block sub_content %} | ||||
| <tr> | ||||
|   <td style="padding: 20px; font-size: 12px; color: #212124;" align="center"> | ||||
|     {% blocktrans with expires=expires|naturaltime %} | ||||
|     If you did not request a password change, please ignore this email. The link above is valid for {{ expires }}. | ||||
|     {% endblocktrans %} | ||||
|   </td> | ||||
| </tr> | ||||
|   <tr> | ||||
|     <td style="padding: 20px; font-size: 12px; color: #212124;" align="center"> | ||||
|       {% blocktrans with expires=expires|naturaltime %} | ||||
|         If you did not request a password change, please ignore this email. The link above is valid for {{ expires }}. | ||||
|       {% endblocktrans %} | ||||
|     </td> | ||||
|   </tr> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -4,22 +4,23 @@ | ||||
| {% load i18n %} | ||||
|  | ||||
| {% block content %} | ||||
| <tr> | ||||
|   <tr> | ||||
|     <td class="alert alert-brand"> | ||||
|         {% trans 'authentik Test-Email' %} | ||||
|       {% trans 'authentik Test-Email' %} | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|   </tr> | ||||
|  | ||||
|   <tr> | ||||
|     <td class="content-wrap"> | ||||
|         <table width="100%" cellpadding="0" cellspacing="0"> | ||||
|             <tr> | ||||
|                 <td class="content-block"> | ||||
|                     {% blocktrans %} | ||||
|                     This is a test email to inform you, that you've successfully configured authentik emails. | ||||
|                     {% endblocktrans %} | ||||
|                 </td> | ||||
|             </tr> | ||||
|         </table> | ||||
|       <table width="100%" cellpadding="0" cellspacing="0"> | ||||
|         <tr> | ||||
|           <td class="content-block"> | ||||
|             {% blocktrans %} | ||||
|               This is a test email to inform you, that you've successfully configured authentik emails. | ||||
|             {% endblocktrans %} | ||||
|           </td> | ||||
|         </tr> | ||||
|       </table> | ||||
|     </td> | ||||
| </tr> | ||||
|   </tr> | ||||
| {% endblock %} | ||||
|  | ||||
| @ -1,59 +1,70 @@ | ||||
| <!DOCTYPE html> | ||||
|  | ||||
| <html lang="en"> | ||||
|     <head> | ||||
|         <meta charset="UTF-8"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||
|         <title>{{.Title}}</title> | ||||
|         <link rel="shortcut icon" type="image/png" href="/outpost.goauthentik.io/static/dist/assets/icons/icon.png"> | ||||
|         <link rel="stylesheet" type="text/css" href="/outpost.goauthentik.io/static/dist/patternfly.min.css"> | ||||
|         <link rel="stylesheet" type="text/css" href="/outpost.goauthentik.io/static/dist/authentik.css"> | ||||
|         <link rel="prefetch" href="/outpost.goauthentik.io/static/dist/assets/images/flow_background.jpg" /> | ||||
|         <style> | ||||
|             .pf-c-background-image::before { | ||||
|                 --ak-flow-background: url("/outpost.goauthentik.io/static/dist/assets/images/flow_background.jpg"); | ||||
|             } | ||||
|             :root { | ||||
|                 --ak-flow-background: url("/outpost.goauthentik.io/static/dist/assets/images/flow_background.jpg"); | ||||
|                 --pf-c-background-image--BackgroundImage: var(--ak-flow-background); | ||||
|                 --pf-c-background-image--BackgroundImage-2x: var(--ak-flow-background); | ||||
|                 --pf-c-background-image--BackgroundImage--sm: var(--ak-flow-background); | ||||
|                 --pf-c-background-image--BackgroundImage--sm-2x: var(--ak-flow-background); | ||||
|                 --pf-c-background-image--BackgroundImage--lg: var(--ak-flow-background); | ||||
|             } | ||||
|         </style> | ||||
|     </head> | ||||
|     <body> | ||||
|         <div class="pf-c-background-image"> | ||||
| <head> | ||||
|   <meta charset="UTF-8"> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||
|  | ||||
|   <title>{{.Title}}</title> | ||||
|  | ||||
|   <link rel="shortcut icon" type="image/png" href="/outpost.goauthentik.io/static/dist/assets/icons/icon.png"> | ||||
|  | ||||
|   <link rel="stylesheet" type="text/css" href="/outpost.goauthentik.io/static/dist/patternfly.min.css"> | ||||
|   <link rel="stylesheet" type="text/css" href="/outpost.goauthentik.io/static/dist/authentik.css"> | ||||
|  | ||||
|   <link rel="prefetch" href="/outpost.goauthentik.io/static/dist/assets/images/flow_background.jpg"> | ||||
|  | ||||
|   <style> | ||||
|     .pf-c-background-image::before { | ||||
|       --ak-flow-background: url("/outpost.goauthentik.io/static/dist/assets/images/flow_background.jpg"); | ||||
|     } | ||||
|  | ||||
|     :root { | ||||
|       --ak-flow-background: url("/outpost.goauthentik.io/static/dist/assets/images/flow_background.jpg"); | ||||
|       --pf-c-background-image--BackgroundImage: var(--ak-flow-background); | ||||
|       --pf-c-background-image--BackgroundImage-2x: var(--ak-flow-background); | ||||
|       --pf-c-background-image--BackgroundImage--sm: var(--ak-flow-background); | ||||
|       --pf-c-background-image--BackgroundImage--sm-2x: var(--ak-flow-background); | ||||
|       --pf-c-background-image--BackgroundImage--lg: var(--ak-flow-background); | ||||
|     } | ||||
|   </style> | ||||
| </head> | ||||
|  | ||||
| <body> | ||||
|   <div class="pf-c-background-image"></div> | ||||
|  | ||||
|   <div class="pf-c-login stacked"> | ||||
|     <div class="ak-login-container"> | ||||
|       <main class="pf-c-login__main"> | ||||
|         <div class="pf-c-login__main-header pf-c-brand ak-brand"> | ||||
|           <img src="/outpost.goauthentik.io/static/dist/assets/icons/icon_left_brand.svg" alt="authentik Logo"> | ||||
|         </div> | ||||
|         <div class="pf-c-login stacked"> | ||||
|             <div class="ak-login-container"> | ||||
|                 <main class="pf-c-login__main"> | ||||
|                     <div class="pf-c-login__main-header pf-c-brand ak-brand"> | ||||
|                         <img src="/outpost.goauthentik.io/static/dist/assets/icons/icon_left_brand.svg" alt="authentik Logo" /> | ||||
|                     </div> | ||||
|                     <header class="pf-c-login__main-header"> | ||||
|                         <h1 class="pf-c-title pf-m-3xl"> | ||||
|                             {{ .Title }} | ||||
|                         </h1> | ||||
|                     </header> | ||||
|                     <div class="pf-c-login__main-body"> | ||||
|                         {{ .Message }} | ||||
|                     </div> | ||||
|                     <div class="pf-c-login__main-body"> | ||||
|                         <a href="/" class="pf-c-button pf-m-primary pf-m-block">Go to home</a> | ||||
|                     </div> | ||||
|                 </main> | ||||
|                 <footer class="pf-c-login__footer"> | ||||
|                     <ul class="pf-c-list pf-m-inline"> | ||||
|                         <li> | ||||
|                             <span> | ||||
|                                 Powered by authentik | ||||
|                             </span> | ||||
|                         </li> | ||||
|                     </ul> | ||||
|                 </footer> | ||||
|             </div> | ||||
|  | ||||
|         <header class="pf-c-login__main-header"> | ||||
|           <h1 class="pf-c-title pf-m-3xl"> | ||||
|             {{ .Title }} | ||||
|           </h1> | ||||
|         </header> | ||||
|  | ||||
|         <div class="pf-c-login__main-body"> | ||||
|           {{ .Message }} | ||||
|         </div> | ||||
|     </body> | ||||
|  | ||||
|         <div class="pf-c-login__main-body"> | ||||
|           <a href="/" class="pf-c-button pf-m-primary pf-m-block">Go to home</a> | ||||
|         </div> | ||||
|       </main> | ||||
|  | ||||
|       <footer class="pf-c-login__footer"> | ||||
|         <ul class="pf-c-list pf-m-inline"> | ||||
|           <li> | ||||
|             <span> | ||||
|               Powered by authentik | ||||
|             </span> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </footer> | ||||
|     </div> | ||||
|   </div> | ||||
| </body> | ||||
| </html> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	