fix: err id as title (shown on hover) (#1895)

This commit is contained in:
Fabi
2021-06-18 10:31:53 +02:00
committed by GitHub
parent ab88d311f3
commit 41560274c1
21 changed files with 64 additions and 64 deletions

View File

@@ -35,12 +35,12 @@ func (l *Login) handleChangePassword(w http.ResponseWriter, r *http.Request) {
} }
func (l *Login) renderChangePassword(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderChangePassword(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := passwordData{ data := passwordData{
baseData: l.getBaseData(r, authReq, "Change Password", errType, errMessage), baseData: l.getBaseData(r, authReq, "Change Password", errID, errMessage),
profileData: l.getProfileData(authReq), profileData: l.getProfileData(authReq),
} }
policy, description, _ := l.getPasswordComplexityPolicy(r, authReq.UserOrgID) policy, description, _ := l.getPasswordComplexityPolicy(r, authReq.UserOrgID)

View File

@@ -141,12 +141,12 @@ func (l *Login) handleExternalUserAuthenticated(w http.ResponseWriter, r *http.R
} }
func (l *Login) renderExternalNotFoundOption(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderExternalNotFoundOption(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := externalNotFoundOptionData{ data := externalNotFoundOptionData{
baseData: l.getBaseData(r, authReq, "ExternalNotFoundOption", errType, errMessage), baseData: l.getBaseData(r, authReq, "ExternalNotFoundOption", errID, errMessage),
} }
l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplExternalNotFoundOption], data, nil) l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplExternalNotFoundOption], data, nil)
} }

View File

@@ -96,16 +96,16 @@ func (l *Login) resendPasswordSet(w http.ResponseWriter, r *http.Request, authRe
} }
func (l *Login) renderInitPassword(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, userID, code string, err error) { func (l *Login) renderInitPassword(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, userID, code string, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
if userID == "" && authReq != nil { if userID == "" && authReq != nil {
userID = authReq.UserID userID = authReq.UserID
} }
data := initPasswordData{ data := initPasswordData{
baseData: l.getBaseData(r, authReq, "Init Password", errType, errMessage), baseData: l.getBaseData(r, authReq, "Init Password", errID, errMessage),
profileData: l.getProfileData(authReq), profileData: l.getProfileData(authReq),
UserID: userID, UserID: userID,
Code: code, Code: code,

View File

@@ -90,15 +90,15 @@ func (l *Login) resendUserInit(w http.ResponseWriter, r *http.Request, authReq *
} }
func (l *Login) renderInitUser(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, userID, code string, passwordSet bool, err error) { func (l *Login) renderInitUser(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, userID, code string, passwordSet bool, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
if authReq != nil { if authReq != nil {
userID = authReq.UserID userID = authReq.UserID
} }
data := initUserData{ data := initUserData{
baseData: l.getBaseData(r, authReq, "Init User", errType, errMessage), baseData: l.getBaseData(r, authReq, "Init User", errID, errMessage),
profileData: l.getProfileData(authReq), profileData: l.getProfileData(authReq),
UserID: userID, UserID: userID,
Code: code, Code: code,

View File

@@ -64,11 +64,11 @@ func (l *Login) handleLoginNameCheck(w http.ResponseWriter, r *http.Request) {
} }
func (l *Login) renderLogin(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderLogin(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := l.getUserData(r, authReq, "Login", errType, errMessage) data := l.getUserData(r, authReq, "Login", errID, errMessage)
funcs := map[string]interface{}{ funcs := map[string]interface{}{
"hasUsernamePasswordLogin": func() bool { "hasUsernamePasswordLogin": func() bool {
return authReq.LoginPolicy != nil && authReq.LoginPolicy.AllowUsernamePassword return authReq.LoginPolicy != nil && authReq.LoginPolicy.AllowUsernamePassword

View File

@@ -31,12 +31,12 @@ func (l *Login) handleLoginSuccess(w http.ResponseWriter, r *http.Request) {
} }
func (l *Login) renderSuccessAndCallback(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderSuccessAndCallback(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := loginSuccessData{ data := loginSuccessData{
userData: l.getUserData(r, authReq, "Login Successful", errType, errMessage), userData: l.getUserData(r, authReq, "Login Successful", errID, errMessage),
} }
if authReq != nil { if authReq != nil {
data.RedirectURI = l.oidcAuthCallbackURL data.RedirectURI = l.oidcAuthCallbackURL

View File

@@ -69,15 +69,15 @@ func (l *Login) checkMailCode(w http.ResponseWriter, r *http.Request, authReq *d
} }
func (l *Login) renderMailVerification(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, userID string, err error) { func (l *Login) renderMailVerification(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, userID string, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
if userID == "" { if userID == "" {
userID = authReq.UserID userID = authReq.UserID
} }
data := mailVerificationData{ data := mailVerificationData{
baseData: l.getBaseData(r, authReq, "Mail Verification", errType, errMessage), baseData: l.getBaseData(r, authReq, "Mail Verification", errID, errMessage),
UserID: userID, UserID: userID,
profileData: l.getProfileData(authReq), profileData: l.getProfileData(authReq),
} }

View File

@@ -19,20 +19,20 @@ type u2fInitData struct {
} }
func (l *Login) renderRegisterU2F(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderRegisterU2F(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage, credentialData string var errID, errMessage, credentialData string
var u2f *domain.WebAuthNToken var u2f *domain.WebAuthNToken
if err == nil { if err == nil {
u2f, err = l.command.HumanAddU2FSetup(setContext(r.Context(), authReq.UserOrgID), authReq.UserID, authReq.UserOrgID, true) u2f, err = l.command.HumanAddU2FSetup(setContext(r.Context(), authReq.UserOrgID), authReq.UserID, authReq.UserOrgID, true)
} }
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
if u2f != nil { if u2f != nil {
credentialData = base64.RawURLEncoding.EncodeToString(u2f.CredentialCreationData) credentialData = base64.RawURLEncoding.EncodeToString(u2f.CredentialCreationData)
} }
data := &u2fInitData{ data := &u2fInitData{
webAuthNData: webAuthNData{ webAuthNData: webAuthNData{
userData: l.getUserData(r, authReq, "Register WebAuthNToken", errType, errMessage), userData: l.getUserData(r, authReq, "Register WebAuthNToken", errID, errMessage),
CredentialCreationData: credentialData, CredentialCreationData: credentialData,
}, },
MFAType: model.MFATypeU2F, MFAType: model.MFATypeU2F,

View File

@@ -65,11 +65,11 @@ func (l *Login) handleOTPVerify(w http.ResponseWriter, r *http.Request, authReq
} }
func (l *Login) renderMFAInitVerify(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, data *mfaVerifyData, err error) { func (l *Login) renderMFAInitVerify(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, data *mfaVerifyData, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data.baseData = l.getBaseData(r, authReq, "MFA Init Verify", errType, errMessage) data.baseData = l.getBaseData(r, authReq, "MFA Init Verify", errID, errMessage)
data.profileData = l.getProfileData(authReq) data.profileData = l.getProfileData(authReq)
if data.MFAType == domain.MFATypeOTP { if data.MFAType == domain.MFATypeOTP {
code, err := generateQrCode(data.otpData.Url) code, err := generateQrCode(data.otpData.Url)

View File

@@ -49,12 +49,12 @@ func (l *Login) handleMFAPromptSelection(w http.ResponseWriter, r *http.Request)
} }
func (l *Login) renderMFAPrompt(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, mfaPromptData *domain.MFAPromptStep, err error) { func (l *Login) renderMFAPrompt(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, mfaPromptData *domain.MFAPromptStep, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := mfaData{ data := mfaData{
baseData: l.getBaseData(r, authReq, "MFA Prompt", errType, errMessage), baseData: l.getBaseData(r, authReq, "MFA Prompt", errID, errMessage),
profileData: l.getProfileData(authReq), profileData: l.getProfileData(authReq),
} }

View File

@@ -53,11 +53,11 @@ func (l *Login) renderMFAVerify(w http.ResponseWriter, r *http.Request, authReq
} }
func (l *Login) renderMFAVerifySelected(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, verificationStep *domain.MFAVerificationStep, selectedProvider domain.MFAType, err error) { func (l *Login) renderMFAVerifySelected(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, verificationStep *domain.MFAVerificationStep, selectedProvider domain.MFAType, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := l.getUserData(r, authReq, "MFA Verify", errType, errMessage) data := l.getUserData(r, authReq, "MFA Verify", errID, errMessage)
if verificationStep == nil { if verificationStep == nil {
l.renderError(w, r, authReq, err) l.renderError(w, r, authReq, err)
return return

View File

@@ -24,21 +24,21 @@ type mfaU2FFormData struct {
} }
func (l *Login) renderU2FVerification(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, providers []domain.MFAType, err error) { func (l *Login) renderU2FVerification(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, providers []domain.MFAType, err error) {
var errType, errMessage, credentialData string var errID, errMessage, credentialData string
var webAuthNLogin *domain.WebAuthNLogin var webAuthNLogin *domain.WebAuthNLogin
if err == nil { if err == nil {
userAgentID, _ := http_mw.UserAgentIDFromCtx(r.Context()) userAgentID, _ := http_mw.UserAgentIDFromCtx(r.Context())
webAuthNLogin, err = l.authRepo.BeginMFAU2FLogin(setContext(r.Context(), authReq.UserOrgID), authReq.UserID, authReq.UserOrgID, authReq.ID, userAgentID) webAuthNLogin, err = l.authRepo.BeginMFAU2FLogin(setContext(r.Context(), authReq.UserOrgID), authReq.UserID, authReq.UserOrgID, authReq.ID, userAgentID)
} }
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
if webAuthNLogin != nil { if webAuthNLogin != nil {
credentialData = base64.RawURLEncoding.EncodeToString(webAuthNLogin.CredentialAssertionData) credentialData = base64.RawURLEncoding.EncodeToString(webAuthNLogin.CredentialAssertionData)
} }
data := &mfaU2FData{ data := &mfaU2FData{
webAuthNData: webAuthNData{ webAuthNData: webAuthNData{
userData: l.getUserData(r, authReq, "Login WebAuthNToken", errType, errMessage), userData: l.getUserData(r, authReq, "Login WebAuthNToken", errID, errMessage),
CredentialCreationData: credentialData, CredentialCreationData: credentialData,
}, },
MFAProviders: providers, MFAProviders: providers,

View File

@@ -16,11 +16,11 @@ type passwordFormData struct {
} }
func (l *Login) renderPassword(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderPassword(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := l.getUserData(r, authReq, "Password", errType, errMessage) data := l.getUserData(r, authReq, "Password", errID, errMessage)
funcs := map[string]interface{}{ funcs := map[string]interface{}{
"showPasswordReset": func() bool { "showPasswordReset": func() bool {
if authReq.LoginPolicy != nil { if authReq.LoginPolicy != nil {

View File

@@ -25,10 +25,10 @@ func (l *Login) handlePasswordReset(w http.ResponseWriter, r *http.Request) {
} }
func (l *Login) renderPasswordResetDone(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderPasswordResetDone(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := l.getUserData(r, authReq, "Password Reset Done", errType, errMessage) data := l.getUserData(r, authReq, "Password Reset Done", errID, errMessage)
l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplPasswordResetDone], data, nil) l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplPasswordResetDone], data, nil)
} }

View File

@@ -23,14 +23,14 @@ type passwordlessFormData struct {
} }
func (l *Login) renderPasswordlessVerification(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderPasswordlessVerification(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage, credentialData string var errID, errMessage, credentialData string
var webAuthNLogin *domain.WebAuthNLogin var webAuthNLogin *domain.WebAuthNLogin
if err == nil { if err == nil {
userAgentID, _ := http_mw.UserAgentIDFromCtx(r.Context()) userAgentID, _ := http_mw.UserAgentIDFromCtx(r.Context())
webAuthNLogin, err = l.authRepo.BeginPasswordlessLogin(setContext(r.Context(), authReq.UserOrgID), authReq.UserID, authReq.UserOrgID, authReq.ID, userAgentID) webAuthNLogin, err = l.authRepo.BeginPasswordlessLogin(setContext(r.Context(), authReq.UserOrgID), authReq.UserID, authReq.UserOrgID, authReq.ID, userAgentID)
} }
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
if webAuthNLogin != nil { if webAuthNLogin != nil {
credentialData = base64.RawURLEncoding.EncodeToString(webAuthNLogin.CredentialAssertionData) credentialData = base64.RawURLEncoding.EncodeToString(webAuthNLogin.CredentialAssertionData)
@@ -41,7 +41,7 @@ func (l *Login) renderPasswordlessVerification(w http.ResponseWriter, r *http.Re
} }
data := &passwordlessData{ data := &passwordlessData{
webAuthNData{ webAuthNData{
userData: l.getUserData(r, authReq, "Login Passwordless", errType, errMessage), userData: l.getUserData(r, authReq, "Login Passwordless", errID, errMessage),
CredentialCreationData: credentialData, CredentialCreationData: credentialData,
}, },
passwordLogin, passwordLogin,

View File

@@ -92,9 +92,9 @@ func (l *Login) handleRegisterCheck(w http.ResponseWriter, r *http.Request) {
} }
func (l *Login) renderRegister(w http.ResponseWriter, r *http.Request, authRequest *domain.AuthRequest, formData *registerFormData, err error) { func (l *Login) renderRegister(w http.ResponseWriter, r *http.Request, authRequest *domain.AuthRequest, formData *registerFormData, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
if formData == nil { if formData == nil {
formData = new(registerFormData) formData = new(registerFormData)
@@ -103,7 +103,7 @@ func (l *Login) renderRegister(w http.ResponseWriter, r *http.Request, authReque
formData.Language = l.renderer.Lang(r).String() formData.Language = l.renderer.Lang(r).String()
} }
data := registerData{ data := registerData{
baseData: l.getBaseData(r, authRequest, "Register", errType, errMessage), baseData: l.getBaseData(r, authRequest, "Register", errID, errMessage),
registerFormData: *formData, registerFormData: *formData,
} }

View File

@@ -28,12 +28,12 @@ func (l *Login) handleRegisterOption(w http.ResponseWriter, r *http.Request) {
} }
func (l *Login) renderRegisterOption(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderRegisterOption(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := registerOptionData{ data := registerOptionData{
baseData: l.getBaseData(r, authReq, "RegisterOption", errType, errMessage), baseData: l.getBaseData(r, authReq, "RegisterOption", errID, errMessage),
} }
funcs := map[string]interface{}{ funcs := map[string]interface{}{
"hasExternalLogin": func() bool { "hasExternalLogin": func() bool {

View File

@@ -78,16 +78,16 @@ func (l *Login) handleRegisterOrgCheck(w http.ResponseWriter, r *http.Request) {
} }
func (l *Login) renderRegisterOrg(w http.ResponseWriter, r *http.Request, authRequest *domain.AuthRequest, formData *registerOrgFormData, err error) { func (l *Login) renderRegisterOrg(w http.ResponseWriter, r *http.Request, authRequest *domain.AuthRequest, formData *registerOrgFormData, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
if formData == nil { if formData == nil {
formData = new(registerOrgFormData) formData = new(registerOrgFormData)
} }
data := registerOrgData{ data := registerOrgData{
baseData: l.getBaseData(r, authRequest, "Register", errType, errMessage), baseData: l.getBaseData(r, authRequest, "Register", errID, errMessage),
registerOrgFormData: *formData, registerOrgFormData: *formData,
} }
pwPolicy, description, _ := l.getPasswordComplexityPolicy(r, "0") pwPolicy, description, _ := l.getPasswordComplexityPolicy(r, "0")

View File

@@ -301,7 +301,7 @@ func (l *Login) getUserData(r *http.Request, authReq *domain.AuthRequest, title
func (l *Login) getBaseData(r *http.Request, authReq *domain.AuthRequest, title string, errType, errMessage string) baseData { func (l *Login) getBaseData(r *http.Request, authReq *domain.AuthRequest, title string, errType, errMessage string) baseData {
baseData := baseData{ baseData := baseData{
errorData: errorData{ errorData: errorData{
ErrType: errType, ErrID: errType,
ErrMessage: errMessage, ErrMessage: errMessage,
}, },
Lang: l.renderer.Lang(r).String(), Lang: l.renderer.Lang(r).String(),
@@ -343,14 +343,14 @@ func (l *Login) getProfileData(authReq *domain.AuthRequest) profileData {
} }
} }
func (l *Login) getErrorMessage(r *http.Request, err error) (errMsg string) { func (l *Login) getErrorMessage(r *http.Request, err error) (errID, errMsg string) {
caosErr := new(caos_errs.CaosError) caosErr := new(caos_errs.CaosError)
if errors.As(err, &caosErr) { if errors.As(err, &caosErr) {
localized := l.renderer.LocalizeFromRequest(r, caosErr.Message, nil) localized := l.renderer.LocalizeFromRequest(r, caosErr.Message, nil)
return localized + " (" + caosErr.ID + ")" return caosErr.ID, localized
} }
return err.Error() return "", err.Error()
} }
func (l *Login) getTheme(r *http.Request) string { func (l *Login) getTheme(r *http.Request) string {
@@ -446,7 +446,7 @@ type baseData struct {
} }
type errorData struct { type errorData struct {
ErrType string ErrID string
ErrMessage string ErrMessage string
} }

View File

@@ -15,11 +15,11 @@ type changeUsernameData struct {
} }
func (l *Login) renderChangeUsername(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) { func (l *Login) renderChangeUsername(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, err error) {
var errType, errMessage string var errID, errMessage string
if err != nil { if err != nil {
errMessage = l.getErrorMessage(r, err) errID, errMessage = l.getErrorMessage(r, err)
} }
data := l.getUserData(r, authReq, "Change Username", errType, errMessage) data := l.getUserData(r, authReq, "Change Username", errID, errMessage)
l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplChangeUsername], data, nil) l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplChangeUsername], data, nil)
} }

View File

@@ -1,9 +1,9 @@
{{ define "error-message" }} {{ define "error-message" }}
{{if .ErrMessage }} {{if .ErrMessage }}
<div class="lgn-error"> <div class="lgn-error" title="{{.ErrID}}">
<i class="lgn-icon-exclamation-circle-solid lgn-warn"></i> <i class="lgn-icon-exclamation-circle-solid lgn-warn"></i>
<p class="lgn-error-message"> <p class="lgn-error-message">
{{ if .ErrType }}{{ .ErrType }} - {{end}}{{ .ErrMessage }} {{ .ErrMessage }}
</p> </p>
</div> </div>
{{end}} {{end}}