feat: check passwordpolicy on login (#477)

* fix: password complexity policy

* feat: check password policy

* feat: check password policy

* fix: password policy on password change

* fix: remove double policy check

* feat: check pw policy on register

* feat: check pw policy on init

* fix: hover on secondary buttons

* fix: use data set instead of hidden inputs

* fix: disabled button

* fix: en login

* fix: read policy

* feat: check if org exists

* multiple checks

* feat: validate all forms

* fix: check all forms

* fix: remove unused err

Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
Fabi 2020-07-16 14:26:08 +02:00 committed by GitHub
parent c34f6b1074
commit 2a3ecc0c6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 3262 additions and 2662 deletions

View File

@ -12,8 +12,9 @@ const (
)
type changePasswordData struct {
OldPassword string `schema:"old_password"`
NewPassword string `schema:"new_password"`
OldPassword string `schema:"change-old-password"`
NewPassword string `schema:"change-new-password"`
NewPasswordConfirmation string `schema:"change-password-confirmation"`
}
func (l *Login) handleChangePassword(w http.ResponseWriter, r *http.Request) {
@ -23,6 +24,7 @@ func (l *Login) handleChangePassword(w http.ResponseWriter, r *http.Request) {
l.renderError(w, r, authReq, err)
return
}
err = l.authRepo.ChangePassword(setContext(r.Context(), authReq.UserOrgID), authReq.UserID, data.OldPassword, data.NewPassword)
if err != nil {
l.renderChangePassword(w, r, authReq, err)
@ -36,10 +38,27 @@ func (l *Login) renderChangePassword(w http.ResponseWriter, r *http.Request, aut
if err != nil {
errMessage = l.getErrorMessage(r, err)
}
data := userData{
data := passwordData{
baseData: l.getBaseData(r, authReq, "Change Password", errType, errMessage),
LoginName: authReq.LoginName,
}
policy, description, _ := l.getPasswordComplexityPolicy(r, authReq.UserOrgID)
if policy != nil {
data.PasswordPolicyDescription = description
data.MinLength = policy.MinLength
if policy.HasUppercase {
data.HasUppercase = UpperCaseRegex
}
if policy.HasLowercase {
data.HasLowercase = LowerCaseRegex
}
if policy.HasSymbol {
data.HasSymbol = SymbolRegex
}
if policy.HasNumber {
data.HasNumber = NumberRegex
}
}
l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplChangePassword], data, nil)
}

View File

@ -25,8 +25,14 @@ type initPasswordFormData struct {
type initPasswordData struct {
baseData
Code string
UserID string
Code string
UserID string
PasswordPolicyDescription string
MinLength uint64
HasUppercase string
HasLowercase string
HasNumber string
HasSymbol string
}
func (l *Login) handleInitPassword(w http.ResponseWriter, r *http.Request) {
@ -85,11 +91,29 @@ func (l *Login) renderInitPassword(w http.ResponseWriter, r *http.Request, authR
if userID == "" && authReq != nil {
userID = authReq.UserID
}
data := initPasswordData{
baseData: l.getBaseData(r, authReq, "Init Password", errType, errMessage),
UserID: userID,
Code: code,
}
policy, description, _ := l.getPasswordComplexityPolicyByUserID(r, userID)
if policy != nil {
data.PasswordPolicyDescription = description
data.MinLength = policy.MinLength
if policy.HasUppercase {
data.HasUppercase = UpperCaseRegex
}
if policy.HasLowercase {
data.HasLowercase = LowerCaseRegex
}
if policy.HasSymbol {
data.HasSymbol = SymbolRegex
}
if policy.HasNumber {
data.HasNumber = NumberRegex
}
}
l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplInitPassword], data, nil)
}

View File

@ -28,9 +28,15 @@ type initUserFormData struct {
type initUserData struct {
baseData
Code string
UserID string
PasswordSet bool
Code string
UserID string
PasswordSet bool
PasswordPolicyDescription string
MinLength uint64
HasUppercase string
HasLowercase string
HasNumber string
HasSymbol string
}
func (l *Login) handleInitUser(w http.ResponseWriter, r *http.Request) {
@ -96,6 +102,23 @@ func (l *Login) renderInitUser(w http.ResponseWriter, r *http.Request, authReq *
Code: code,
PasswordSet: passwordSet,
}
policy, description, _ := l.getPasswordComplexityPolicyByUserID(r, userID)
if policy != nil {
data.PasswordPolicyDescription = description
data.MinLength = policy.MinLength
if policy.HasUppercase {
data.HasUppercase = UpperCaseRegex
}
if policy.HasLowercase {
data.HasLowercase = LowerCaseRegex
}
if policy.HasSymbol {
data.HasSymbol = SymbolRegex
}
if policy.HasNumber {
data.HasNumber = NumberRegex
}
}
l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplInitUser], data, nil)
}

View File

@ -0,0 +1,98 @@
package handler
import (
"github.com/caos/zitadel/internal/auth_request/model"
"github.com/caos/zitadel/internal/errors"
policy_model "github.com/caos/zitadel/internal/policy/model"
"net/http"
"regexp"
"strconv"
)
const (
LowerCaseRegex = `[a-z]`
UpperCaseRegex = `[A-Z]`
NumberRegex = `[0-9]`
SymbolRegex = `[^A-Za-z0-9]`
)
var (
hasStringLowerCase = regexp.MustCompile(LowerCaseRegex).MatchString
hasStringUpperCase = regexp.MustCompile(UpperCaseRegex).MatchString
hasNumber = regexp.MustCompile(NumberRegex).MatchString
hasSymbol = regexp.MustCompile(SymbolRegex).MatchString
)
func (l *Login) getPasswordComplexityPolicy(r *http.Request, orgID string) (*policy_model.PasswordComplexityPolicy, string, error) {
policy, err := l.authRepo.GetMyPasswordComplexityPolicy(setContext(r.Context(), orgID))
if err != nil {
return nil, err.Error(), err
}
description, err := l.generatePolicyDescription(r, policy)
return policy, description, nil
}
func (l *Login) getPasswordComplexityPolicyByUserID(r *http.Request, userID string) (*policy_model.PasswordComplexityPolicy, string, error) {
user, err := l.authRepo.UserByID(r.Context(), userID)
if err != nil {
return nil, "", nil
}
policy, err := l.authRepo.GetMyPasswordComplexityPolicy(setContext(r.Context(), user.ResourceOwner))
if err != nil {
return nil, err.Error(), err
}
description, err := l.generatePolicyDescription(r, policy)
return policy, description, nil
}
func (l *Login) generatePolicyDescription(r *http.Request, policy *policy_model.PasswordComplexityPolicy) (string, error) {
description := "<ul id=\"passwordcomplexity\">"
minLength := l.renderer.LocalizeFromRequest(r, "Password.MinLength", nil)
description += "<li id=\"minlength\" class=\"invalid\"><i class=\"material-icons\">clear</i>" + minLength + " " + strconv.Itoa(int(policy.MinLength)) + "</li>"
if policy.HasUppercase {
uppercase := l.renderer.LocalizeFromRequest(r, "Password.HasUppercase", nil)
description += "<li id=\"uppercase\" class=\"invalid\"><i class=\"material-icons\">clear</i>" + uppercase + "</li>"
}
if policy.HasLowercase {
lowercase := l.renderer.LocalizeFromRequest(r, "Password.HasLowercase", nil)
description += "<li id=\"lowercase\" class=\"invalid\"><i class=\"material-icons\">clear</i>" + lowercase + "</li>"
}
if policy.HasNumber {
hasnumber := l.renderer.LocalizeFromRequest(r, "Password.HasNumber", nil)
description += "<li id=\"number\" class=\"invalid\"><i class=\"material-icons\">clear</i>" + hasnumber + "</li>"
}
if policy.HasSymbol {
hassymbol := l.renderer.LocalizeFromRequest(r, "Password.HasSymbol", nil)
description += "<li id=\"symbol\" class=\"invalid\"><i class=\"material-icons\">clear</i>" + hassymbol + "</li>"
}
description += "</ul>"
return description, nil
}
func (l *Login) checkPasswordComplexityPolicy(password string, r *http.Request, authReq *model.AuthRequest) error {
policy, err := l.authRepo.GetMyPasswordComplexityPolicy(setContext(r.Context(), authReq.UserOrgID))
if err != nil {
return nil
}
if policy.MinLength != 0 && uint64(len(password)) < policy.MinLength {
return errors.ThrowInvalidArgument(nil, "POLICY-LSo0p", "Errors.User.PasswordComplexityPolicy.MinLength")
}
if policy.HasLowercase && !hasStringLowerCase(password) {
return errors.ThrowInvalidArgument(nil, "POLICY-4Sjsf", "Errors.User.PasswordComplexityPolicy.HasLower")
}
if policy.HasUppercase && !hasStringUpperCase(password) {
return errors.ThrowInvalidArgument(nil, "POLICY-6Sjc9", "Errors.User.PasswordComplexityPolicy.HasUpper")
}
if policy.HasNumber && !hasNumber(password) {
return errors.ThrowInvalidArgument(nil, "POLICY-2Fksi", "Errors.User.PasswordComplexityPolicy.HasNumber")
}
if policy.HasSymbol && !hasSymbol(password) {
return errors.ThrowInvalidArgument(nil, "POLICY-0Js6e", "Errors.User.PasswordComplexityPolicy.HasSymbol")
}
return nil
}

View File

@ -10,7 +10,7 @@ const (
tmplPassword = "password"
)
type passwordData struct {
type passwordFormData struct {
Password string `schema:"password"`
}
@ -27,7 +27,7 @@ func (l *Login) renderPassword(w http.ResponseWriter, r *http.Request, authReq *
}
func (l *Login) handlePasswordCheck(w http.ResponseWriter, r *http.Request) {
data := new(passwordData)
data := new(passwordFormData)
authReq, err := l.getAuthRequestAndParseData(r, data)
if err != nil {
l.renderError(w, r, authReq, err)

View File

@ -23,13 +23,19 @@ type registerFormData struct {
Lastname string `schema:"lastname"`
Language string `schema:"language"`
Gender int32 `schema:"gender"`
Password string `schema:"password"`
Password2 string `schema:"password2"`
Password string `schema:"register-password"`
Password2 string `schema:"register-password-confirmation"`
}
type registerData struct {
baseData
registerFormData
PasswordPolicyDescription string
MinLength uint64
HasUppercase string
HasLowercase string
HasNumber string
HasSymbol string
}
func (l *Login) handleRegister(w http.ResponseWriter, r *http.Request) {
@ -88,10 +94,32 @@ func (l *Login) renderRegister(w http.ResponseWriter, r *http.Request, authReque
if formData.Language == "" {
formData.Language = l.renderer.Lang(r).String()
}
data := registerData{
baseData: l.getBaseData(r, authRequest, "Register", errType, errMessage),
registerFormData: *formData,
}
iam, _ := l.authRepo.GetIam(r.Context())
if iam != nil {
policy, description, _ := l.getPasswordComplexityPolicy(r, iam.GlobalOrgID)
if policy != nil {
data.PasswordPolicyDescription = description
data.MinLength = policy.MinLength
if policy.HasUppercase {
data.HasUppercase = UpperCaseRegex
}
if policy.HasLowercase {
data.HasLowercase = LowerCaseRegex
}
if policy.HasSymbol {
data.HasSymbol = SymbolRegex
}
if policy.HasNumber {
data.HasNumber = NumberRegex
}
}
}
funcs := map[string]interface{}{
"selectedLanguage": func(l string) bool {
if formData == nil {

View File

@ -3,12 +3,11 @@ package handler
import (
"errors"
"fmt"
"github.com/gorilla/csrf"
"html/template"
"net/http"
"path"
"github.com/gorilla/csrf"
"github.com/caos/zitadel/internal/api/http/middleware"
"github.com/caos/zitadel/internal/auth_request/model"
caos_errs "github.com/caos/zitadel/internal/errors"
@ -264,6 +263,17 @@ type userData struct {
SelectedMfaProvider model.MfaType
}
type passwordData struct {
baseData
LoginName string
PasswordPolicyDescription string
MinLength uint64
HasUppercase string
HasLowercase string
HasNumber string
HasSymbol string
}
type userSelectionData struct {
baseData
Users []model.UserSelection

View File

@ -2,6 +2,11 @@ Password:
Title: Passwort
Description: Gib deine Benutzerdaten ein.
Password: Passwort
MinLength: Mindestlänge
HasUppercase: Grossbuchstaben
HasLowercase: Kleinbuchstaben
HasNumber: Nummer
HasSymbol: Symbol
Login:
Title: Anmeldung
@ -66,6 +71,7 @@ PasswordChange:
Description: Ändere dein Password in dem du dein altes und dann dein neuen Passwort eingibst.
OldPassword: Altes Passwort
NewPassword: Neues Passwort
NewPasswordConfirmation: Passwort Bestätigung
PasswordChangeDone:
Title: Passwort ändern

View File

@ -15,6 +15,11 @@ Password:
Title: Password
Description: Enter your logindata.
Password: Password
MinLength: Minimumlength
HasUppercase: Uppercase letter
HasLowercase: Lowercase letter
HasNumber: Number
HasSymbol: Symbol
MfaVerify:
Title: Verify Multificator
@ -66,6 +71,7 @@ PasswordChange:
Description: Change your password. Enter your old and new password.
OldPassword: Old Password
NewPassword: New Password
NewPasswordConfirmation: Passwort confirmation
PasswordChangeDone:
Title: Change Password

View File

@ -0,0 +1,14 @@
function CheckChangePwPolicy() {
let policyElement = document.getElementById("change-new-password")
let pwNew = policyElement.value;
let pwNewConfirmation = document.getElementById("change-password-confirmation").value;
if (ComplexityPolicyCheck(policyElement, pwNew) === false) {
return false;
}
return pwNew == pwNewConfirmation;
}
let button = document.getElementById("change-password--button");
disableSubmit(CheckChangePwPolicy, button);

View File

@ -0,0 +1,3 @@
let button = document.getElementById("submit-button");
disableSubmit(undefined, button);

View File

@ -0,0 +1,29 @@
function disableSubmit(checks, button) {
console.log("GUGUS");
let form = document.getElementsByTagName('form')[0];
let inputs = form.getElementsByTagName('input');
for (i = 0; i < inputs.length; i++) {
inputs[i].addEventListener('input', function () {
if (checks != undefined) {
if (checks() === false) {
button.disabled = true;
return
}
}
if (checkRequired(form, inputs) === false) {
button.disabled = true;
return
}
button.disabled = false;
});
}
}
function checkRequired(form, inputs) {
for (i = 0; i < inputs.length; i++) {
if (inputs[i].required && inputs[i].value == '') {
return false
}
}
return true;
}

View File

@ -0,0 +1,14 @@
function CheckInitPwPolicy() {
let policyElement = document.getElementById("password");
let pwNew = policyElement.value;
let pwNewConfirmation = document.getElementById("passwordconfirm").value;
if (ComplexityPolicyCheck(policyElement, pwNew) === false) {
return false;
}
return pwNew == pwNewConfirmation;
}
let button = document.getElementById("init-button");
disableSubmit(CheckInitPwPolicy, button);

View File

@ -0,0 +1,68 @@
function ComplexityPolicyCheck(policyElement, pwNew) {
let minLength = policyElement.dataset.minlength;
let upperRegex = policyElement.dataset.hasUppercase;
let lowerRegex = policyElement.dataset.hasLowercase;
let numberRegex = policyElement.dataset.hasNumber;
let symbolRegex = policyElement.dataset.hasSymbol;
let valid = true;
let minlengthelem = document.getElementById('minlength')
if (pwNew.length >= minLength) {
ValidPolicy(minlengthelem);
valid = true;
} else {
InvalidPolicy(minlengthelem);
valid = false;
}
let upper = document.getElementById('uppercase')
if (upperRegex !== "") {
if (RegExp(upperRegex).test(pwNew)) {
ValidPolicy(upper);
valid = true;
} else {
InvalidPolicy(upper);
valid = false;
}
}
let lower = document.getElementById('lowercase')
if (lowerRegex !== "") {
if (RegExp(lowerRegex).test(pwNew)) {
ValidPolicy(lower);
valid = true;
} else {
InvalidPolicy(lower);
valid = false;
}
}
let number = document.getElementById('number')
if (numberRegex != "") {
if (RegExp(numberRegex).test(pwNew)) {
ValidPolicy(number);
valid = true;
} else {
InvalidPolicy(number);
valid = false;
}
}
let symbol = document.getElementById('symbol')
if (symbolRegex != "") {
if (RegExp(symbolRegex).test(pwNew)) {
ValidPolicy(symbol)
valid = true;
} else {
InvalidPolicy(symbol);
valid = false;
}
}
return valid;
}
function ValidPolicy(element) {
element.classList.remove('invalid')
element.getElementsByTagName('i')[0].innerText = 'check';
}
function InvalidPolicy(element) {
element.classList.add('invalid')
element.getElementsByTagName('i')[0].innerText = 'clear';
}

View File

@ -0,0 +1,14 @@
function CheckRegisterPwPolicy() {
let policyElement = document.getElementById("register-password");
let pwNew = policyElement.value;
let pwNewConfirmation = document.getElementById("register-password-confirmation").value;
if (ComplexityPolicyCheck(policyElement, pwNew) === false) {
return false;
}
return pwNew == pwNewConfirmation;
}
let button = document.getElementById("register-button");
disableSubmit(CheckRegisterPwPolicy, button);

View File

@ -144,6 +144,7 @@ button {
}
button:hover {
background-color: #f60075;
color: #282828;
border: 2px solid #f60075;
}
button.primary {
@ -154,6 +155,14 @@ button.primary {
button.primary:hover {
background-color: #f60075;
}
button:disabled {
background-color: #505050;
border: 2px solid #505050;
}
button:disabled:hover {
background-color: #505050;
border: 2px solid #505050;
}
input:not([type=radio]), select {
background-color: #252525;
@ -300,6 +309,28 @@ form button.other-user > div:nth-of-type(2) {
margin: 15px;
font-size: 1.4rem;
}
form ul#passwordcomplexity {
display: flex;
flex-wrap: wrap;
padding: 0;
list-style: none;
}
form ul#passwordcomplexity li {
flex: 1 0 50%;
display: block;
font-weight: 300;
font-size: 12px;
line-height: 12px;
}
form ul#passwordcomplexity li i {
height: 26px;
padding-right: 10px;
vertical-align: middle;
color: #0DF279;
}
form ul#passwordcomplexity li.invalid i {
color: #F20D6B;
}
#copy-secret {
visibility: hidden;

View File

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCDc;EDEd,OCDQ;EDER;EACA;EACA;;;AAMJ;EACI,OCXQ;EDYR,aClBS;EDmBT;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OCxCW;EDyCX;EACA;;AAEA;EACI,OC5CY;;;ADgDpB;EACI,kBCpDc;EDqDd,OCnDW;EDoDX;EACA;EACA;EACA;EACA,QErEU;EFsEV;EACA;EACA;;AACA;EACI,kBC5DY;ED6DZ;;AAGJ;EACI,kBClEO;EDmEP,OCpEI;EDqEJ;;AACA;EACI,kBCrEQ;;;AD0EpB;EACI,kBElEmB;EFmEnB,OC9EQ;ED+ER,QE3FU;EF4FV;EACA;EACA;;;AAIA;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI,OEnGK;EFoGL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCtII;EDuIJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBEnIW;;AFsIf;EACI;;AAIR;EACI;;AAIA;EACI;EACA;EEhKV;;AACA;EF6JM;IE5JJ;IACA;;;AFkKQ;EErKV;;AACA;EFoKU;IEnKR;IACA;;;AFuKI;EACI;EACA;EACA;EACA;EACA,cElKO;EFmKP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OE9LP;;AFqML;EACI;;AAEJ;EACI;EACA;EACA;EACA;EExNV;;AACA;EFmNM;IElNJ;IACA;;;AF0NQ;EACI;EACA;EE/Nd;;AACA;EF4NU;IE3NR;IACA;;;AFiOI;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCjPI;;ADoPR;EACI,MCtPU;;;AD2Pd;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA","file":"dark.css"}
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCDc;EDEd,OCDQ;EDER;EACA;EACA;;;AAMJ;EACI,OCXQ;EDYR,aClBS;EDmBT;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OCxCW;EDyCX;EACA;;AAEA;EACI,OC5CY;;;ADgDpB;EACI,kBCpDc;EDqDd,OCnDW;EDoDX;EACA;EACA;EACA;EACA,QErEU;EFsEV;EACA;EACA;;AACA;EACI,kBC5DY;ED6DZ,OChEU;EDiEV;;AAGJ;EACI,kBCnEO;EDoEP,OCrEI;EDsEJ;;AACA;EACI,kBCtEQ;;AD0EhB;EACI,kBEnEW;EFoEX;;AAEA;EACI,kBEvEO;EFwEP;;;AAKZ;EACI,kBE7EmB;EF8EnB,OCzFQ;ED0FR,QEtGU;EFuGV;EACA;EACA;;;AAIA;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI,OE9GK;EF+GL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCjJI;EDkJJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBE9IW;;AFiJf;EACI;;AAIR;EACI;;AAIA;EACI;EACA;EE3KV;;AACA;EFwKM;IEvKJ;IACA;;;AF6KQ;EEhLV;;AACA;EF+KU;IE9KR;IACA;;;AFkLI;EACI;EACA;EACA;EACA;EACA,cE7KO;EF8KP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OEzMP;;AFgNL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EEnOV;;AACA;EF8NM;IE7NJ;IACA;;;AFqOQ;EACI;EACA;EE1Od;;AACA;EFuOU;IEtOR;IACA;;;AF4OI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OEnPN;;AFwPE;EACI,OE1PL;;;AFgQX;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCxRI;;AD2RR;EACI,MC7RU;;;ADkSd;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA","file":"dark.css"}

View File

@ -144,6 +144,7 @@ button {
}
button:hover {
background-color: #f60075;
color: #282828;
border: 2px solid #f60075;
}
button.primary {
@ -154,6 +155,14 @@ button.primary {
button.primary:hover {
background-color: #f60075;
}
button:disabled {
background-color: #505050;
border: 2px solid #505050;
}
button:disabled:hover {
background-color: #505050;
border: 2px solid #505050;
}
input:not([type=radio]), select {
background-color: #252525;
@ -300,6 +309,28 @@ form button.other-user > div:nth-of-type(2) {
margin: 15px;
font-size: 1.4rem;
}
form ul#passwordcomplexity {
display: flex;
flex-wrap: wrap;
padding: 0;
list-style: none;
}
form ul#passwordcomplexity li {
flex: 1 0 50%;
display: block;
font-weight: 300;
font-size: 12px;
line-height: 12px;
}
form ul#passwordcomplexity li i {
height: 26px;
padding-right: 10px;
vertical-align: middle;
color: #0DF279;
}
form ul#passwordcomplexity li.invalid i {
color: #F20D6B;
}
#copy-secret {
visibility: hidden;

View File

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"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","file":"light.css"}
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"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","file":"light.css"}

View File

@ -78,6 +78,7 @@ button {
outline: none;
&:hover {
background-color: $primaryColorHover;
color: $backgroundColor;
border: 2px solid $primaryColorHover;
}
@ -89,6 +90,16 @@ button {
background-color: $primaryColorHover;
}
}
&:disabled {
background-color: $inputBorderColor;
border: 2px solid $inputBorderColor;
&:hover {
background-color: $inputBorderColor;
border: 2px solid $inputBorderColor;
}
}
}
input:not([type='radio']), select {
@ -245,6 +256,34 @@ form {
font-size: 1.4rem;
}
}
ul#passwordcomplexity {
display: flex;
flex-wrap: wrap;
padding: 0;
list-style: none;
li {
flex: 1 0 50%;
display: block;
font-weight: 300;
font-size: 12px;
line-height: 12px;
i {
height: 26px;
padding-right: 10px;
vertical-align: middle;
color: $okColor;
}
}
li.invalid {
i {
color: $nokColor;
}
}
}
}
#copy-secret {

View File

@ -30,6 +30,8 @@ $inputBackgroundColor: #252525;
$buttonBackgroundColorHover: $inputBackgroundColor;
$profileImgDark: "/resources/images/icon-user-dark";
$otherUserImgDark: "/resources/images/icon-newuser-dark";
$nokColor: #F20D6B;
$okColor: #0DF279;
// ----- LIGHT-THEME --------

View File

@ -145,6 +145,7 @@ button {
}
button:hover {
background-color: #5b8fd3;
color: #282828;
border: 2px solid #5b8fd3;
}
button.primary {
@ -155,6 +156,14 @@ button.primary {
button.primary:hover {
background-color: #5b8fd3;
}
button:disabled {
background-color: #505050;
border: 2px solid #505050;
}
button:disabled:hover {
background-color: #505050;
border: 2px solid #505050;
}
input:not([type=radio]), select {
background-color: #252525;
@ -301,6 +310,28 @@ form button.other-user > div:nth-of-type(2) {
margin: 15px;
font-size: 1.4rem;
}
form ul#passwordcomplexity {
display: flex;
flex-wrap: wrap;
padding: 0;
list-style: none;
}
form ul#passwordcomplexity li {
flex: 1 0 50%;
display: block;
font-weight: 300;
font-size: 12px;
line-height: 12px;
}
form ul#passwordcomplexity li i {
height: 26px;
padding-right: 10px;
vertical-align: middle;
color: #0DF279;
}
form ul#passwordcomplexity li.invalid i {
color: #F20D6B;
}
#copy-secret {
visibility: hidden;

View File

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCKc;EDJd,OCKQ;EDJR;EACA;EACA;EAEI;;;AAIR;EACI,OCLQ;EDMR,aC3BS;ED4BT;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OClCW;EDmCX;EACA;;AAEA;EACI,OCtCY;;;AD0CpB;EACI,kBC9Cc;ED+Cd,OC7CW;ED8CX;EACA;EACA;EACA;EACA,QCrEU;EDsEV;EACA;EACA;;AACA;EACI,kBCtDY;EDuDZ;;AAGJ;EACI,kBC5DO;ED6DP,OC9DI;ED+DJ;;AACA;EACI,kBC/DQ;;;ADoEpB;EACI,kBClEmB;EDmEnB,OCxEQ;EDyER,QC3FU;ED4FV;EACA;EACA;;;AAIA;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI,OCnGK;EDoGL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OChII;EDiIJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBCnIW;;ADsIf;EACI;;AAIR;EACI;;AAIA;EACI;EACA;EChKV;;AACA;ED6JM;IC5JJ;IACA;;;ADkKQ;ECrKV;;AACA;EDoKU;ICnKR;IACA;;;ADuKI;EACI;EACA;EACA;EACA;EACA,cClKO;EDmKP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OC9LP;;ADqML;EACI;;AAEJ;EACI;EACA;EACA;EACA;ECxNV;;AACA;EDmNM;IClNJ;IACA;;;AD0NQ;EACI;EACA;EC/Nd;;AACA;ED4NU;IC3NR;IACA;;;ADiOI;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MC3OI;;AD8OR;EACI,MChPU;;;ADqPd;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA","file":"dark.css"}
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCKc;EDJd,OCKQ;EDJR;EACA;EACA;EAEI;;;AAIR;EACI,OCLQ;EDMR,aC3BS;ED4BT;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OClCW;EDmCX;EACA;;AAEA;EACI,OCtCY;;;AD0CpB;EACI,kBC9Cc;ED+Cd,OC7CW;ED8CX;EACA;EACA;EACA;EACA,QCrEU;EDsEV;EACA;EACA;;AACA;EACI,kBCtDY;EDuDZ,OC1DU;ED2DV;;AAGJ;EACI,kBC7DO;ED8DP,OC/DI;EDgEJ;;AACA;EACI,kBChEQ;;ADoEhB;EACI,kBCnEW;EDoEX;;AAEA;EACI,kBCvEO;EDwEP;;;AAKZ;EACI,kBC7EmB;ED8EnB,OCnFQ;EDoFR,QCtGU;EDuGV;EACA;EACA;;;AAIA;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI,OC9GK;ED+GL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OC3II;ED4IJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBC9IW;;ADiJf;EACI;;AAIR;EACI;;AAIA;EACI;EACA;EC3KV;;AACA;EDwKM;ICvKJ;IACA;;;AD6KQ;EChLV;;AACA;ED+KU;IC9KR;IACA;;;ADkLI;EACI;EACA;EACA;EACA;EACA,cC7KO;ED8KP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OCzMP;;ADgNL;EACI;;AAEJ;EACI;EACA;EACA;EACA;ECnOV;;AACA;ED8NM;IC7NJ;IACA;;;ADqOQ;EACI;EACA;EC1Od;;AACA;EDuOU;ICtOR;IACA;;;AD4OI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OCnPN;;ADwPE;EACI,OC1PL;;;ADgQX;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MClRI;;ADqRR;EACI,MCvRU;;;AD4Rd;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA","file":"dark.css"}

View File

@ -145,6 +145,7 @@ button {
}
button:hover {
background-color: #5b8fd3;
color: #282828;
border: 2px solid #5b8fd3;
}
button.primary {
@ -155,6 +156,14 @@ button.primary {
button.primary:hover {
background-color: #5b8fd3;
}
button:disabled {
background-color: #505050;
border: 2px solid #505050;
}
button:disabled:hover {
background-color: #505050;
border: 2px solid #505050;
}
input:not([type=radio]), select {
background-color: #252525;
@ -301,6 +310,28 @@ form button.other-user > div:nth-of-type(2) {
margin: 15px;
font-size: 1.4rem;
}
form ul#passwordcomplexity {
display: flex;
flex-wrap: wrap;
padding: 0;
list-style: none;
}
form ul#passwordcomplexity li {
flex: 1 0 50%;
display: block;
font-weight: 300;
font-size: 12px;
line-height: 12px;
}
form ul#passwordcomplexity li i {
height: 26px;
padding-right: 10px;
vertical-align: middle;
color: #0DF279;
}
form ul#passwordcomplexity li.invalid i {
color: #F20D6B;
}
#copy-secret {
visibility: hidden;

View File

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"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","file":"light.css"}
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"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","file":"light.css"}

View File

@ -1,6 +1,5 @@
{{template "main-top" .}}
<h1>{{t "PasswordChange.Title"}}</h1>
<p>{{t "PasswordChange.Description"}}</p>
@ -12,23 +11,43 @@
<div class="fields">
<div class="field">
<label class="label" for="old_password">{{t "PasswordChange.OldPassword"}}</label>
<input class="input" type="password" id="old_password" name="old_password" autocomplete="current-password" autofocus required>
<label class="label" for="change-old-password">{{t "PasswordChange.OldPassword"}}</label>
<input class="input" type="password" id="change-old-password" name="change-old-password" autocomplete="current-password" autofocus required>
</div>
<div class="field">
<label class="label" for="new_password">{{t "PasswordChange.NewPassword"}}</label>
<input class="input" type="password" id="new-password" name="new_password" autocomplete="new-password" required>
<label class="label" for="change-new-password">{{t "PasswordChange.NewPassword"}}</label>
<input data-minlength="{{ .MinLength }}"
data-has-uppercase="{{ .HasUppercase }}"
data-has-lowercase="{{ .HasLowercase }}"
data-has-number="{{ .HasNumber }}"
data-has-symbol="{{ .HasSymbol }}"
class="input"
type="password"
id="change-new-password"
name="change-new-password"
autocomplete="new-password"
required>
{{ .PasswordPolicyDescription }}
</div>
<div class="field">
<label class="label" for="change-password-confirmation">{{t "PasswordChange.NewPasswordConfirmation"}}</label>
<input class="input" type="password" id="change-password-confirmation" name="change-password-confirmation" autocomplete="new-password" required>
</div>
</div>
{{ template "error-message" .}}
<div class="actions">
<button type="submit" name="resend" value="false" class="primary right" >{{t "Actions.Next"}}</buttontype="submit">
<button type="submit" id="change-password-button" name="resend" value="false" class="primary right" disabled>{{t "Actions.Next"}}</buttontype="submit">
</div>
</form>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/password_policy_check.js" }}"></script>
<script src="{{ resourceUrl "scripts/change_password_check.js" }}"></script>
{{template "main-bottom" .}}

View File

@ -18,22 +18,42 @@
</div>
<div class="field">
<label class="label" for="password">{{t "InitPassword.NewPassword"}}</label>
<input class="input" type="password" id="password" name="password" autocomplete="new-password" autofocus required>
<input data-minlength="{{ .MinLength }}"
data-has-uppercase="{{ .HasUppercase }}"
data-has-lowercase="{{ .HasLowercase }}"
data-has-number="{{ .HasNumber }}"
data-has-symbol="{{ .HasSymbol }}"
class="input"
type="password"
id="password"
name="password"
autocomplete="new-password"
autofocus required>
{{ .PasswordPolicyDescription }}
</div>
<div class="field">
<label class="label" for="passwordconfirm">{{t "InitPassword.NewPasswordConfirm"}}</label>
<input class="input" type="password" id="passwordconfirm" name="passwordconfirm" autocomplete="new-password" autofocus required>
<input class="input"
type="password"
id="passwordconfirm"
name="passwordconfirm"
autocomplete="new-password"
autofocus required>
</div>
</div>
{{ template "error-message" .}}
<div class="actions">
<button type="submit" name="resend" value="false" class="primary right" >{{t "Actions.Next"}}</button>
<button type="submit" id="init-button" name="resend" value="false" class="primary right" >{{t "Actions.Next"}}</button>
<button type="submit" name="resend" value="true" class="secondary right" formnovalidate>{{t "Actions.Resend" }}</button>
</div>
</form>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/password_policy_check.js" }}"></script>
<script src="{{ resourceUrl "scripts/init_password_check.js" }}"></script>
{{template "main-bottom" .}}

View File

@ -20,7 +20,18 @@
{{ if not .PasswordSet }}
<div class="field">
<label class="label" for="password">{{t "InitUser.NewPassword"}}</label>
<input class="input" type="password" id="password" name="password" autocomplete="new-password" autofocus required>
<input data-minlength="{{ .MinLength }}"
data-has-uppercase="{{ .HasUppercase }}"
data-has-lowercase="{{ .HasLowercase }}"
data-has-number="{{ .HasNumber }}"
data-has-symbol="{{ .HasSymbol }}"
class="input"
type="password"
id="password"
name="password"
autocomplete="new-password"
autofocus required>
{{ .PasswordPolicyDescription }}
</div>
<div class="field">
<label class="label" for="passwordconfirm">{{t "InitUser.NewPasswordConfirm"}}</label>
@ -32,11 +43,21 @@
{{ template "error-message" .}}
<div class="actions">
<button type="submit" name="resend" value="false" class="primary right" >{{t "Actions.Next"}}</button>
<button type="submit"
id="init-button"
name="resend"
value="false"
class="primary right"
{{ if not .PasswordSet }} disabled {{ end }}>{{t "Actions.Next"}}</button>
<button type="submit" name="resend" value="true" class="secondary right" formnovalidate>{{t "Actions.Resend" }}</button>
</div>
</form>
{{ if not .PasswordSet }}
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/password_policy_check.js" }}"></script>
<script src="{{ resourceUrl "scripts/init_password_check.js" }}"></script>
{{ end }}
{{template "main-bottom" .}}

View File

@ -20,11 +20,14 @@
{{template "error-message" .}}
<div class="actions">
<button class="primary right" type="submit">{{t "Actions.Next"}}</button>
<button class="primary right" id="submit-button" type="submit" disabled>{{t "Actions.Next"}}</button>
<button class="secondary right" name="register" value="true" formnovalidate>{{t "Actions.Register"}}</button>
</div>
</form>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/default_form_validation.js" }}"></script>
{{template "main-bottom" .}}

View File

@ -21,13 +21,14 @@
{{ template "error-message" .}}
<div class="actions">
<button type="submit" name="resend" value="false" class="primary right" >{{t "Actions.Next"}}</button>
<button type="submit" id="submit-button" name="resend" value="false" class="primary right" disabled>{{t "Actions.Next"}}</button>
{{ if .UserID }}
<button type="submit" name="resend" value="true" class="secondary right" formnovalidate>{{t "Actions.Resend"}}</button>
{{ end }}
</div>
</form>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/default_form_validation.js" }}"></script>
{{template "main-bottom" .}}

View File

@ -34,11 +34,13 @@
{{end}}
<div class="actions">
<button class="primary right" type="submit">{{t "Actions.Next"}}</button>
<button class="primary right" id="submit-button" type="submit" disabled>{{t "Actions.Next"}}</button>
</div>
</form>
<script src="{{ resourceUrl "scripts/copy_to_clipboard.js" }}"></script>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/default_form_validation.js" }}"></script>
{{template "main-bottom" .}}

View File

@ -21,10 +21,11 @@
{{ template "error-message" .}}
<div class="actions">
<button class="primary right" type="submit">{{t "Actions.Next"}}</button>
<button class="primary right" id="submit-button" type="submit" disabled>{{t "Actions.Next"}}</button>
</div>
</form>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/default_form_validation.js" }}"></script>
{{template "main-bottom" .}}

View File

@ -20,7 +20,7 @@
{{template "error-message" .}}
<div class="actions">
<button class="primary right" type="submit">{{t "Actions.Next"}}</button>
<button id="submit-button" class="primary right" type="submit" disabled>{{t "Actions.Next"}}</button>
<a href="{{ loginNameChangeUrl .AuthReqID }}">
<button class="secondary" type="button">{{t "Actions.Back"}}</button>
</a>
@ -30,6 +30,7 @@
</div>
</form>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/default_form_validation.js" }}"></script>
{{template "main-bottom" .}}

View File

@ -43,21 +43,31 @@
</select>
</div>
<div class="field">
<label class="label" for="password">{{t "Registration.Password"}}</label>
<input class="input" type="password" id="password" name="password" autocomplete="new-password" required>
<label class="label" for="register-password">{{t "Registration.Password"}}</label>
<input data-minlength="{{ .MinLength }}"
data-has-uppercase="{{ .HasUppercase }}"
data-has-lowercase="{{ .HasLowercase }}"
data-has-number="{{ .HasNumber }}"
data-has-symbol="{{ .HasSymbol }}"
class="input" type="password" id="register-password" name="register-password" autocomplete="new-password" required>
{{ .PasswordPolicyDescription }}
</div>
<div class="field">
<label class="label" for="password2">{{t "Registration.Password2"}}</label>
<input class="input" type="password" id="password2" name="password2" autocomplete="new-password" required>
<label class="label" for="register-password-confirmation">{{t "Registration.Password2"}}</label>
<input class="input" type="password" id="register-password-confirmation" name="register-password-confirmation" autocomplete="new-password" required>
</div>
</div>
{{template "error-message" .}}
<div class="actions">
<button class="primary right" type="submit">{{t "Actions.Next"}}</button>
<button class="primary right" id="register-button" type="submit" disabled>{{t "Actions.Next"}}</button>
</div>
</form>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/password_policy_check.js" }}"></script>
<script src="{{ resourceUrl "scripts/register_check.js" }}"></script>
{{template "main-bottom" .}}

File diff suppressed because it is too large Load Diff

View File

@ -1702,7 +1702,7 @@ message PasswordComplexityPolicy {
message PasswordComplexityPolicyCreate {
string description = 1 [(validate.rules).string = {max_len: 500}];
uint64 min_length = 2;
uint64 min_length = 2 [(validate.rules).uint64.gt = 0];
bool has_lowercase = 3;
bool has_uppercase = 4;
bool has_number = 5;