forgot-password.gohtml (10762B)
1 {{ define "extra-head" }} 2 <style> 3 #timer_countdown:before { 4 content: "{{ .Data.CaptchaSec }}"; 5 animation: {{ .Data.CaptchaSec }}s 1s forwards timer_countdown_frames; 6 } 7 @keyframes timer_countdown_frames { 8 {{ range .Data.Frames -}}{{ . | css }}{{ end -}} 9 } 10 </style> 11 {{ end }} 12 13 {{ define "content" }} 14 <div id="parent"> 15 <div class="container" id="form_login"> 16 <div class="row"> 17 <div class="col-8 offset-2 col-md-8 offset-md-2 col-sm-8 col-lg-6 offset-lg-3 col-xl-4 offset-xl-4"> 18 {{ if eq .Data.Step 1 }} 19 <form autocomplete="on" method="post"> 20 <input type="hidden" name="csrf" value="{{ .CSRF }}" /> 21 <input type="hidden" name="form_name" value="step1" /> 22 <input type="hidden" name="captcha_id" value="{{ .Data.CaptchaID }}" /> 23 <input type="hidden" name="captcha_img" value="{{ .Data.CaptchaImg }}" /> 24 <fieldset> 25 <div class="row"> 26 <div class="center-block"> 27 </div> 28 </div> 29 <div class="row"> 30 <div class="col-sm-12 col-md-10 offset-md-1 "> 31 <div class="form-group"> 32 <input class="transparent-input form-control{{ if .Data.UsernameError }} is-invalid{{ end }}" placeholder="{{ t "Username" . }}" name="username" type="text" value="{{ .Data.Username }}" autofocus /> 33 {{ if .Data.UsernameError }}<div class="invalid-feedback d-block">{{ .Data.UsernameError }}</div>{{ end }} 34 </div> 35 <div class="form-group"> 36 <div class="text-center mb-2 bg-label">Captcha expires in <span id="timer_countdown"></span> seconds (<a href="/captcha-help">help</a>)</div> 37 <div class="mb-2 text-center"> 38 <img src="data:image/png;base64,{{ .Data.CaptchaImg }}" alt="captcha" style="background-color: hsl(0, 0%, 90%);" class="captcha-img" /> 39 </div> 40 <input class="transparent-input form-control{{ if .Data.ErrCaptcha }} is-invalid{{ end }}" placeholder="{{ t "Captcha (6 digits)" . }}" name="captcha" type="text" value="{{ .Data.Captcha }}" maxlength="6" autocomplete="off" /> 41 {{ if .Data.ErrCaptcha }}<div class="invalid-feedback d-block">{{ .Data.ErrCaptcha }}</div>{{ end }} 42 </div> 43 <div class="form-group"> 44 <span class="bg-label"> 45 <input id="gpg_mode_decrypt" name="gpg_mode" value="0" type="radio"{{ if not .Data.GpgMode }} checked{{ end }} /> 46 <label for="gpg_mode_decrypt">Decrypt code</label> 47 </span> 48 <span class="bg-label ml-2"> 49 <input id="gpg_mode_sign" name="gpg_mode" value="1" type="radio"{{ if .Data.GpgMode }} checked{{ end }} /> 50 <label for="gpg_mode_sign">Sign message</label> 51 </span> 52 </div> 53 <div class="form-group"> 54 <input type="submit" class="transparent-input btn btn-lg btn-primary btn-block" value="{{ t "Recover password" . }}" /> 55 </div> 56 <div class="form-group"> 57 <a href="/{{ if .Data.Redirect }}?redirect={{ .Data.Redirect }}{{ end }}" class="bg-label link">{{ t "Login" . }}</a> 58 </div> 59 </div> 60 </div> 61 </fieldset> 62 </form> 63 {{ else if eq .Data.Step 2 }} 64 <form autocomplete="on" method="post"> 65 <input type="hidden" name="csrf" value="{{ .CSRF }}" /> 66 <input type="hidden" name="token" value="{{ .Data.Token }}" /> 67 <input type="hidden" name="form_name" value="step2" /> 68 <input type="hidden" name="gpg_mode" value="{{ .Data.GpgMode }}" /> 69 <fieldset> 70 <div class="row"> 71 <div class="center-block"> 72 </div> 73 </div> 74 <div class="row"> 75 <div class="col-sm-12 col-md-10 offset-md-1 "> 76 {{ if .Data.GpgMode }} 77 <div class="form-group"> 78 <label for="encrypted_message" class="bg-label"> 79 {{ t "Please sign the following message with your private key and send the signature" . }}<br /> 80 <code>gpg --armor --detach-sign file</code> 81 </label> 82 <input name="to_be_signed_message" id="to_be_signed_message" value="{{ .Data.ToBeSignedMessage }}" type="text" class="transparent-input form-control mono" readonly /> 83 </div> 84 <div class="form-group"> 85 <label for="signed_message" class="bg-label">{{ t "Message detached signature" . }}</label> 86 <textarea name="signed_message" id="signed_message" rows="10" class="transparent-input form-control mono{{ if .Data.ErrorSignedMessage }} is-invalid{{ end }}" autofocus>{{ .Data.SignedMessage }}</textarea> 87 {{ if .Data.ErrorSignedMessage }} 88 <div class="invalid-feedback">{{ .Data.ErrorSignedMessage }}</div> 89 {{ end }} 90 </div> 91 {{ else }} 92 <div class="form-group"> 93 <label for="encrypted_message" class="bg-label">{{ t "Please decrypt the following message with your private key and send the required code" . }}</label> 94 <input name="encrypted_message" value="{{ .Data.EncryptedMessage }}" type="hidden" /> 95 <pre class="code-select transparent-input"><code>{{ .Data.EncryptedMessage }}</code></pre> 96 </div> 97 <div class="form-group"> 98 <label for="pgp_code" class="bg-label">{{ t "Your decrypted code" . }}</label> 99 <input name="pgp_code" id="pgp_code" value="{{ .Data.Code }}" type="text" class="transparent-input form-control{{ if .Data.ErrorCode }} is-invalid{{ end }}" autofocus /> 100 {{ if .Data.ErrorCode }} 101 <div class="invalid-feedback">{{ .Data.ErrorCode }}</div> 102 {{ end }} 103 </div> 104 {{ end }} 105 <div class="form-group"> 106 <input type="submit" value="{{ t "Continue" . }}" class="btn btn-primary" /> 107 <a href="/" class="btn btn-secondary">{{ t "Cancel" . }}</a> 108 </div> 109 </div> 110 </div> 111 </fieldset> 112 </form> 113 {{ else if eq .Data.Step 3 }} 114 <form autocomplete="on" method="post"> 115 <input type="hidden" name="csrf" value="{{ .CSRF }}" /> 116 <input type="hidden" name="token" value="{{ .Data.Token }}" /> 117 <input type="hidden" name="form_name" value="step3" /> 118 <fieldset> 119 <div class="row"> 120 <div class="center-block"> 121 </div> 122 </div> 123 <div class="row"> 124 <div class="col-sm-12 col-md-10 offset-md-1 "> 125 <div class="form-group"> 126 <input placeholder="{{ t "New password" . }}" name="newPassword" value="{{ .Data.NewPassword }}" class="transparent-input form-control{{ if .Data.ErrorNewPassword }} is-invalid{{ end }}" type="password"{{ if .Data.ErrorNewPassword }} autofocus{{ end }} required /> 127 {{ if .Data.ErrorNewPassword }} 128 <div class="invalid-feedback">{{ .Data.ErrorNewPassword }}</div> 129 {{ end }} 130 </div> 131 <div class="form-group"> 132 <input placeholder="{{ t "Confirm new password" . }}" name="rePassword" value="{{ .Data.RePassword }}" class="transparent-input form-control{{ if .Data.ErrorRePassword }} is-invalid{{ end }}" type="password"{{ if .Data.ErrorRePassword }} autofocus{{ end }} /> 133 {{ if .Data.ErrorRePassword }} 134 <div class="invalid-feedback">{{ .Data.ErrorRePassword }}</div> 135 {{ end }} 136 </div> 137 <div class="form-group"> 138 <input type="submit" value="{{ t "Update password" . }}" class="btn btn-primary" /> 139 <a href="/" class="btn btn-secondary">{{ t "Cancel" . }}</a> 140 </div> 141 </div> 142 </div> 143 </fieldset> 144 </form> 145 {{ end }} 146 </div> 147 </div> 148 </div> 149 </div> 150 {{ end }}