feat: support resetting password on first login (#2980)

* feat: support reset password in first login

* feat: disable needUpdatePassword when user haven't email and phone and mfa
This commit is contained in:
DacongDA
2024-06-02 01:00:55 +08:00
committed by GitHub
parent 7d05b69aac
commit e5f9aab28f
35 changed files with 149 additions and 36 deletions

View File

@ -117,7 +117,7 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob
if form.Type == ResponseTypeLogin { if form.Type == ResponseTypeLogin {
c.SetSessionUsername(userId) c.SetSessionUsername(userId)
util.LogInfo(c.Ctx, "API: [%s] signed in", userId) util.LogInfo(c.Ctx, "API: [%s] signed in", userId)
resp = &Response{Status: "ok", Msg: "", Data: userId} resp = &Response{Status: "ok", Msg: "", Data: userId, Data2: user.NeedUpdatePassword}
} else if form.Type == ResponseTypeCode { } else if form.Type == ResponseTypeCode {
clientId := c.Input().Get("clientId") clientId := c.Input().Get("clientId")
responseType := c.Input().Get("responseType") responseType := c.Input().Get("responseType")
@ -139,7 +139,7 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob
} }
resp = codeToResponse(code) resp = codeToResponse(code)
resp.Data2 = user.NeedUpdatePassword
if application.EnableSigninSession || application.HasPromptPage() { if application.EnableSigninSession || application.HasPromptPage() {
// The prompt page needs the user to be signed in // The prompt page needs the user to be signed in
c.SetSessionUsername(userId) c.SetSessionUsername(userId)
@ -152,6 +152,8 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob
nonce := c.Input().Get("nonce") nonce := c.Input().Get("nonce")
token, _ := object.GetTokenByUser(application, user, scope, nonce, c.Ctx.Request.Host) token, _ := object.GetTokenByUser(application, user, scope, nonce, c.Ctx.Request.Host)
resp = tokenToResponse(token) resp = tokenToResponse(token)
resp.Data2 = user.NeedUpdatePassword
} }
} else if form.Type == ResponseTypeSaml { // saml flow } else if form.Type == ResponseTypeSaml { // saml flow
res, redirectUrl, method, err := object.GetSamlResponse(application, user, form.SamlRequest, c.Ctx.Request.Host) res, redirectUrl, method, err := object.GetSamlResponse(application, user, form.SamlRequest, c.Ctx.Request.Host)
@ -159,7 +161,7 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob
c.ResponseError(err.Error(), nil) c.ResponseError(err.Error(), nil)
return return
} }
resp = &Response{Status: "ok", Msg: "", Data: res, Data2: map[string]string{"redirectUrl": redirectUrl, "method": method}} resp = &Response{Status: "ok", Msg: "", Data: res, Data2: map[string]interface{}{"redirectUrl": redirectUrl, "method": method, "needUpdatePassword": user.NeedUpdatePassword}}
if application.EnableSigninSession || application.HasPromptPage() { if application.EnableSigninSession || application.HasPromptPage() {
// The prompt page needs the user to be signed in // The prompt page needs the user to be signed in

View File

@ -510,7 +510,9 @@ func (c *ApiController) SetPassword() {
} }
targetUser.Password = newPassword targetUser.Password = newPassword
_, err = object.SetUserField(targetUser, "password", targetUser.Password) targetUser.NeedUpdatePassword = false
_, err = object.UpdateUser(userId, targetUser, []string{"password", "need_update_password"}, false)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return

View File

@ -203,7 +203,8 @@ type User struct {
LastSigninWrongTime string `xorm:"varchar(100)" json:"lastSigninWrongTime"` LastSigninWrongTime string `xorm:"varchar(100)" json:"lastSigninWrongTime"`
SigninWrongTimes int `json:"signinWrongTimes"` SigninWrongTimes int `json:"signinWrongTimes"`
ManagedAccounts []ManagedAccount `xorm:"managedAccounts blob" json:"managedAccounts"` ManagedAccounts []ManagedAccount `xorm:"managedAccounts blob" json:"managedAccounts"`
NeedUpdatePassword bool `json:"needUpdatePassword"`
} }
type Userinfo struct { type Userinfo struct {
@ -682,7 +683,7 @@ func UpdateUser(id string, user *User, columns []string, isAdmin bool) (bool, er
"eveonline", "fitbit", "gitea", "heroku", "influxcloud", "instagram", "intercom", "kakao", "lastfm", "mailru", "meetup", "eveonline", "fitbit", "gitea", "heroku", "influxcloud", "instagram", "intercom", "kakao", "lastfm", "mailru", "meetup",
"microsoftonline", "naver", "nextcloud", "onedrive", "oura", "patreon", "paypal", "salesforce", "shopify", "soundcloud", "microsoftonline", "naver", "nextcloud", "onedrive", "oura", "patreon", "paypal", "salesforce", "shopify", "soundcloud",
"spotify", "strava", "stripe", "type", "tiktok", "tumblr", "twitch", "twitter", "typetalk", "uber", "vk", "wepay", "xero", "yahoo", "spotify", "strava", "stripe", "type", "tiktok", "tumblr", "twitch", "twitter", "typetalk", "uber", "vk", "wepay", "xero", "yahoo",
"yammer", "yandex", "zoom", "custom", "yammer", "yandex", "zoom", "custom", "need_update_password",
} }
} }
if isAdmin { if isAdmin {

View File

@ -411,6 +411,10 @@ func CheckPermissionForUpdateUser(oldUser, newUser *User, isAdmin bool, lang str
item := GetAccountItemByName("Is deleted", organization) item := GetAccountItemByName("Is deleted", organization)
itemsChanged = append(itemsChanged, item) itemsChanged = append(itemsChanged, item)
} }
if oldUser.NeedUpdatePassword != newUser.NeedUpdatePassword {
item := GetAccountItemByName("Need update password", organization)
itemsChanged = append(itemsChanged, item)
}
if oldUser.Score != newUser.Score { if oldUser.Score != newUser.Score {
item := GetAccountItemByName("Score", organization) item := GetAccountItemByName("Score", organization)

View File

@ -414,6 +414,7 @@ class App extends Component {
<Layout id="parent-area"> <Layout id="parent-area">
<ManagementPage <ManagementPage
account={this.state.account} account={this.state.account}
application={this.state.application}
uri={this.state.uri} uri={this.state.uri}
themeData={this.state.themeData} themeData={this.state.themeData}
themeAlgorithm={this.state.themeAlgorithm} themeAlgorithm={this.state.themeAlgorithm}

View File

@ -108,8 +108,8 @@ class EntryPage extends React.Component {
<Route exact path="/signup/oauth/authorize" render={(props) => <SignupPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />} /> <Route exact path="/signup/oauth/authorize" render={(props) => <SignupPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />} />
<Route exact path="/login/oauth/authorize" render={(props) => <LoginPage {...this.props} application={this.state.application} type={"code"} mode={"signin"} onUpdateApplication={onUpdateApplication} {...props} />} /> <Route exact path="/login/oauth/authorize" render={(props) => <LoginPage {...this.props} application={this.state.application} type={"code"} mode={"signin"} onUpdateApplication={onUpdateApplication} {...props} />} />
<Route exact path="/login/saml/authorize/:owner/:applicationName" render={(props) => <LoginPage {...this.props} application={this.state.application} type={"saml"} mode={"signin"} onUpdateApplication={onUpdateApplication} {...props} />} /> <Route exact path="/login/saml/authorize/:owner/:applicationName" render={(props) => <LoginPage {...this.props} application={this.state.application} type={"saml"} mode={"signin"} onUpdateApplication={onUpdateApplication} {...props} />} />
<Route exact path="/forget" render={(props) => this.renderHomeIfLoggedIn(<SelfForgetPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />)} /> <Route exact path="/forget" render={(props) => <SelfForgetPage {...this.props} account={this.props.account} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />} />
<Route exact path="/forget/:applicationName" render={(props) => this.renderHomeIfLoggedIn(<ForgetPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />)} /> <Route exact path="/forget/:applicationName" render={(props) => <ForgetPage {...this.props} account={this.props.account} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />} />
<Route exact path="/prompt" render={(props) => this.renderLoginIfNotLoggedIn(<PromptPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />)} /> <Route exact path="/prompt" render={(props) => this.renderLoginIfNotLoggedIn(<PromptPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />)} />
<Route exact path="/prompt/:applicationName" render={(props) => this.renderLoginIfNotLoggedIn(<PromptPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />)} /> <Route exact path="/prompt/:applicationName" render={(props) => this.renderLoginIfNotLoggedIn(<PromptPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />)} />
<Route exact path="/result" render={(props) => this.renderHomeIfLoggedIn(<ResultPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />)} /> <Route exact path="/result" render={(props) => this.renderHomeIfLoggedIn(<ResultPage {...this.props} application={this.state.application} onUpdateApplication={onUpdateApplication} {...props} />)} />

View File

@ -328,6 +328,8 @@ function ManagementPage(props) {
return <Redirect to="/login" />; return <Redirect to="/login" />;
} else if (props.account === undefined) { } else if (props.account === undefined) {
return null; return null;
} else if (props.account.needUpdatePassword) {
return <Redirect to={"/forget/" + props.application.name} />;
} else { } else {
return component; return component;
} }

View File

@ -1026,6 +1026,19 @@ class UserEditPage extends React.Component {
</Col> </Col>
</Row> </Row>
); );
} else if (accountItem.name === "Need update password") {
return (
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("user:Need update password"), i18next.t("user:Need update password - Tooltip"))} :
</Col>
<Col span={(Setting.isMobile()) ? 22 : 2} >
<Switch disabled={(!this.state.user.phone) && (!this.state.user.email) && (!this.state.user.mfaProps)} checked={this.state.user.needUpdatePassword} onChange={checked => {
this.updateUserField("needUpdatePassword", checked);
}} />
</Col>
</Row>
);
} }
} }

View File

@ -153,21 +153,37 @@ class AuthCallback extends React.Component {
// OAuth // OAuth
const oAuthParams = Util.getOAuthGetParameters(innerParams); const oAuthParams = Util.getOAuthGetParameters(innerParams);
const concatChar = oAuthParams?.redirectUri?.includes("?") ? "&" : "?"; const concatChar = oAuthParams?.redirectUri?.includes("?") ? "&" : "?";
const signinUrl = localStorage.getItem("signinUrl");
AuthBackend.login(body, oAuthParams) AuthBackend.login(body, oAuthParams)
.then((res) => { .then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
const responseType = this.getResponseType(); const responseType = this.getResponseType();
if (responseType === "login") { if (responseType === "login") {
if (res.data2) {
sessionStorage.setItem("signinUrl", signinUrl);
Setting.goToLinkSoft(this, `/forget/${applicationName}`);
return;
}
Setting.showMessage("success", "Logged in successfully"); Setting.showMessage("success", "Logged in successfully");
// Setting.goToLinkSoft(this, "/"); // Setting.goToLinkSoft(this, "/");
const link = Setting.getFromLink(); const link = Setting.getFromLink();
Setting.goToLink(link); Setting.goToLink(link);
} else if (responseType === "code") { } else if (responseType === "code") {
if (res.data2) {
sessionStorage.setItem("signinUrl", signinUrl);
Setting.goToLinkSoft(this, `/forget/${applicationName}`);
return;
}
const code = res.data; const code = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}code=${code}&state=${oAuthParams.state}`); Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}code=${code}&state=${oAuthParams.state}`);
// Setting.showMessage("success", `Authorization code: ${res.data}`); // Setting.showMessage("success", `Authorization code: ${res.data}`);
} else if (responseType === "token" || responseType === "id_token") { } else if (responseType === "token" || responseType === "id_token") {
if (res.data2) {
sessionStorage.setItem("signinUrl", signinUrl);
Setting.goToLinkSoft(this, `/forget/${applicationName}`);
return;
}
const token = res.data; const token = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}${responseType}=${token}&state=${oAuthParams.state}&token_type=bearer`); Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}${responseType}=${token}&state=${oAuthParams.state}&token_type=bearer`);
} else if (responseType === "link") { } else if (responseType === "link") {
@ -181,6 +197,11 @@ class AuthCallback extends React.Component {
relayState: oAuthParams.relayState, relayState: oAuthParams.relayState,
}); });
} else { } else {
if (res.data2.needUpdatePassword) {
sessionStorage.setItem("signinUrl", signinUrl);
Setting.goToLinkSoft(this, `/forget/${applicationName}`);
return;
}
const SAMLResponse = res.data; const SAMLResponse = res.data;
const redirectUri = res.data2.redirectUrl; const redirectUri = res.data2.redirectUrl;
Setting.goToLink(`${redirectUri}?SAMLResponse=${encodeURIComponent(SAMLResponse)}&RelayState=${oAuthParams.relayState}`); Setting.goToLink(`${redirectUri}?SAMLResponse=${encodeURIComponent(SAMLResponse)}&RelayState=${oAuthParams.relayState}`);

View File

@ -35,8 +35,8 @@ class ForgetPage extends React.Component {
classes: props, classes: props,
applicationName: props.applicationName ?? props.match.params?.applicationName, applicationName: props.applicationName ?? props.match.params?.applicationName,
msg: null, msg: null,
name: "", name: props.account ? props.account.name : "",
username: "", username: props.account ? props.account.name : "",
phone: "", phone: "",
email: "", email: "",
dest: "", dest: "",
@ -44,7 +44,6 @@ class ForgetPage extends React.Component {
verifyType: "", // "email", "phone" verifyType: "", // "email", "phone"
current: 0, current: 0,
}; };
this.form = React.createRef(); this.form = React.createRef();
} }
@ -205,6 +204,7 @@ class ForgetPage extends React.Component {
initialValues={{ initialValues={{
application: application.name, application: application.name,
organization: application.organization, organization: application.organization,
username: this.state.name,
}} }}
style={{width: "300px"}} style={{width: "300px"}}
size="large" size="large"
@ -488,7 +488,7 @@ class ForgetPage extends React.Component {
<Row> <Row>
<Col span={24}> <Col span={24}>
<div style={{textAlign: "center", fontSize: "28px"}}> <div style={{textAlign: "center", fontSize: "28px"}}>
{i18next.t("forget:Retrieve password")} {i18next.t("forget:Reset password")}
</div> </div>
</Col> </Col>
</Row> </Row>

View File

@ -68,6 +68,8 @@ class LoginPage extends React.Component {
this.state.applicationName = props.match?.params?.casApplicationName; this.state.applicationName = props.match?.params?.casApplicationName;
} }
localStorage.setItem("signinUrl", window.location.href);
this.form = React.createRef(); this.form = React.createRef();
} }
@ -300,6 +302,12 @@ class LoginPage extends React.Component {
return; return;
} }
if (resp.data2) {
sessionStorage.setItem("signinUrl", window.location.href);
Setting.goToLinkSoft(ths, `/forget/${application.name}`);
return;
}
if (Setting.hasPromptPage(application)) { if (Setting.hasPromptPage(application)) {
AuthBackend.getAccount() AuthBackend.getAccount()
.then((res) => { .then((res) => {
@ -442,15 +450,27 @@ class LoginPage extends React.Component {
const responseType = values["type"]; const responseType = values["type"];
if (responseType === "login") { if (responseType === "login") {
if (res.data2) {
sessionStorage.setItem("signinUrl", window.location.href);
Setting.goToLink(this, `/forget/${this.state.applicationName}`);
}
Setting.showMessage("success", i18next.t("application:Logged in successfully")); Setting.showMessage("success", i18next.t("application:Logged in successfully"));
this.props.onLoginSuccess(); this.props.onLoginSuccess();
} else if (responseType === "code") { } else if (responseType === "code") {
this.postCodeLoginAction(res); this.postCodeLoginAction(res);
} else if (responseType === "token" || responseType === "id_token") { } else if (responseType === "token" || responseType === "id_token") {
if (res.data2) {
sessionStorage.setItem("signinUrl", window.location.href);
Setting.goToLink(this, `/forget/${this.state.applicationName}`);
}
const amendatoryResponseType = responseType === "token" ? "access_token" : responseType; const amendatoryResponseType = responseType === "token" ? "access_token" : responseType;
const accessToken = res.data; const accessToken = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}#${amendatoryResponseType}=${accessToken}&state=${oAuthParams.state}&token_type=bearer`); Setting.goToLink(`${oAuthParams.redirectUri}#${amendatoryResponseType}=${accessToken}&state=${oAuthParams.state}&token_type=bearer`);
} else if (responseType === "saml") { } else if (responseType === "saml") {
if (res.data2.needUpdatePassword) {
sessionStorage.setItem("signinUrl", window.location.href);
Setting.goToLink(this, `/forget/${this.state.applicationName}`);
}
if (res.data2.method === "POST") { if (res.data2.method === "POST") {
this.setState({ this.setState({
samlResponse: res.data, samlResponse: res.data,

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Nächster Schritt", "Next Step": "Nächster Schritt",
"Please input your username!": "Bitte gib deinen Benutzernamen ein!", "Please input your username!": "Bitte gib deinen Benutzernamen ein!",
"Reset": "Zurücksetzen", "Reset": "Zurücksetzen",
"Retrieve password": "Passwort abrufen", "Reset password": "Passwort abrufen",
"Unknown forget type": "Unbekannter Vergesslichkeitstyp", "Unknown forget type": "Unbekannter Vergesslichkeitstyp",
"Verify": "überprüfen" "Verify": "überprüfen"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Verwaltete Konten", "Managed accounts": "Verwaltete Konten",
"Modify password...": "Passwort ändern...", "Modify password...": "Passwort ändern...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "Neue E-Mail", "New Email": "Neue E-Mail",
"New Password": "Neues Passwort", "New Password": "Neues Passwort",
"New User": "Neuer Benutzer", "New User": "Neuer Benutzer",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Siguiente paso", "Next Step": "Siguiente paso",
"Please input your username!": "¡Por favor, ingrese su nombre de usuario!", "Please input your username!": "¡Por favor, ingrese su nombre de usuario!",
"Reset": "Restablecer", "Reset": "Restablecer",
"Retrieve password": "Recuperar contraseña", "Reset password": "Reset password",
"Unknown forget type": "Tipo de olvido desconocido", "Unknown forget type": "Tipo de olvido desconocido",
"Verify": "Verificar" "Verify": "Verificar"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Cuentas gestionadas", "Managed accounts": "Cuentas gestionadas",
"Modify password...": "Modificar contraseña...", "Modify password...": "Modificar contraseña...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "Nuevo correo electrónico", "New Email": "Nuevo correo electrónico",
"New Password": "Nueva contraseña", "New Password": "Nueva contraseña",
"New User": "Nuevo Usuario", "New User": "Nuevo Usuario",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Étape suivante", "Next Step": "Étape suivante",
"Please input your username!": "Veuillez saisir votre identifiant !", "Please input your username!": "Veuillez saisir votre identifiant !",
"Reset": "Réinitialiser", "Reset": "Réinitialiser",
"Retrieve password": "Récupérer le mot de passe", "Reset password": "Récupérer le mot de passe",
"Unknown forget type": "Type d'oubli inconnu", "Unknown forget type": "Type d'oubli inconnu",
"Verify": "Vérifier" "Verify": "Vérifier"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Comptes gérés", "Managed accounts": "Comptes gérés",
"Modify password...": "Modifier le mot de passe...", "Modify password...": "Modifier le mot de passe...",
"Multi-factor authentication": "Authentification multifacteur", "Multi-factor authentication": "Authentification multifacteur",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "Nouvelle adresse e-mail", "New Email": "Nouvelle adresse e-mail",
"New Password": "Nouveau mot de passe", "New Password": "Nouveau mot de passe",
"New User": "Nouveau compte", "New User": "Nouveau compte",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Langkah selanjutnya", "Next Step": "Langkah selanjutnya",
"Please input your username!": "Silakan masukkan nama pengguna Anda!", "Please input your username!": "Silakan masukkan nama pengguna Anda!",
"Reset": "Menyetel-ulang", "Reset": "Menyetel-ulang",
"Retrieve password": "Mengambil password", "Reset password": "Mengambil password",
"Unknown forget type": "Tipe yang tidak diketahui terlupakan", "Unknown forget type": "Tipe yang tidak diketahui terlupakan",
"Verify": "Memverifikasi" "Verify": "Memverifikasi"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Akun yang dikelola", "Managed accounts": "Akun yang dikelola",
"Modify password...": "Mengubah kata sandi...", "Modify password...": "Mengubah kata sandi...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "Email baru", "New Email": "Email baru",
"New Password": "Kata Sandi Baru", "New Password": "Kata Sandi Baru",
"New User": "Pengguna Baru", "New User": "Pengguna Baru",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "次のステップ", "Next Step": "次のステップ",
"Please input your username!": "ユーザー名を入力してください!", "Please input your username!": "ユーザー名を入力してください!",
"Reset": "リセット", "Reset": "リセット",
"Retrieve password": "パスワードの取得", "Reset password": "パスワードの取得",
"Unknown forget type": "未知の忘却タイプ", "Unknown forget type": "未知の忘却タイプ",
"Verify": "検証" "Verify": "検証"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "管理アカウント", "Managed accounts": "管理アカウント",
"Modify password...": "パスワードを変更する...", "Modify password...": "パスワードを変更する...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "新しいメール", "New Email": "新しいメール",
"New Password": "新しいパスワード", "New Password": "新しいパスワード",
"New User": "新しいユーザー", "New User": "新しいユーザー",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "다음 단계", "Next Step": "다음 단계",
"Please input your username!": "사용자 이름을 입력하세요!", "Please input your username!": "사용자 이름을 입력하세요!",
"Reset": "리셋", "Reset": "리셋",
"Retrieve password": "비밀번호를 복구하세요", "Reset password": "비밀번호를 복구하세요",
"Unknown forget type": "미지의 잊혀진 유형", "Unknown forget type": "미지의 잊혀진 유형",
"Verify": "검증하다" "Verify": "검증하다"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "관리 계정", "Managed accounts": "관리 계정",
"Modify password...": "비밀번호 수정하기...", "Modify password...": "비밀번호 수정하기...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "새 이메일", "New Email": "새 이메일",
"New Password": "새로운 비밀번호", "New Password": "새로운 비밀번호",
"New User": "새로운 사용자", "New User": "새로운 사용자",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Próxima Etapa", "Next Step": "Próxima Etapa",
"Please input your username!": "Por favor, insira seu nome de usuário!", "Please input your username!": "Por favor, insira seu nome de usuário!",
"Reset": "Redefinir", "Reset": "Redefinir",
"Retrieve password": "Recuperar senha", "Reset password": "Recuperar senha",
"Unknown forget type": "Tipo de recuperação desconhecido", "Unknown forget type": "Tipo de recuperação desconhecido",
"Verify": "Verificar" "Verify": "Verificar"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Contas gerenciadas", "Managed accounts": "Contas gerenciadas",
"Modify password...": "Modificar senha...", "Modify password...": "Modificar senha...",
"Multi-factor authentication": "Autenticação de vários fatores", "Multi-factor authentication": "Autenticação de vários fatores",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "Novo E-mail", "New Email": "Novo E-mail",
"New Password": "Nova Senha", "New Password": "Nova Senha",
"New User": "Novo Usuário", "New User": "Novo Usuário",

View File

@ -166,7 +166,7 @@
"Next Step": "Следующий шаг", "Next Step": "Следующий шаг",
"Please input your username!": "Пожалуйста, введите своё имя пользователя!", "Please input your username!": "Пожалуйста, введите своё имя пользователя!",
"Reset": "Сбросить", "Reset": "Сбросить",
"Retrieve password": "Восстановить пароль", "Reset password": "Восстановить пароль",
"Unknown forget type": "Неизвестный забытый тип", "Unknown forget type": "Неизвестный забытый тип",
"Verify": "Проверить" "Verify": "Проверить"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Управляемые аккаунты", "Managed accounts": "Управляемые аккаунты",
"Modify password...": "Изменить пароль...", "Modify password...": "Изменить пароль...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "Новое электронное письмо", "New Email": "Новое электронное письмо",
"New Password": "Новый пароль", "New Password": "Новый пароль",
"New User": "Новый пользователь", "New User": "Новый пользователь",

View File

@ -166,7 +166,7 @@
"Next Step": "Next Step", "Next Step": "Next Step",
"Please input your username!": "Please input your username!", "Please input your username!": "Please input your username!",
"Reset": "Reset", "Reset": "Reset",
"Retrieve password": "Retrieve password", "Reset password": "Reset password",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Verify" "Verify": "Verify"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Sonraki adım", "Next Step": "Sonraki adım",
"Please input your username!": "Lütfen kullanıcı adınızı girin", "Please input your username!": "Lütfen kullanıcı adınızı girin",
"Reset": "Sıfırla", "Reset": "Sıfırla",
"Retrieve password": "Şifre kurtar", "Reset password": "Şifre kurtar",
"Unknown forget type": "Unknown forget type", "Unknown forget type": "Unknown forget type",
"Verify": "Doğrula" "Verify": "Doğrula"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Managed accounts", "Managed accounts": "Managed accounts",
"Modify password...": "Modify password...", "Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "New Email", "New Email": "New Email",
"New Password": "New Password", "New Password": "New Password",
"New User": "New User", "New User": "New User",

View File

@ -166,7 +166,7 @@
"Next Step": "Наступний крок", "Next Step": "Наступний крок",
"Please input your username!": "Будь ласка, введіть своє ім'я користувача!", "Please input your username!": "Будь ласка, введіть своє ім'я користувача!",
"Reset": "Скинути", "Reset": "Скинути",
"Retrieve password": "Отримати пароль", "Reset password": "Отримати пароль",
"Unknown forget type": "Невідомий забутий тип", "Unknown forget type": "Невідомий забутий тип",
"Verify": "Підтвердити" "Verify": "Підтвердити"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Керовані облікові записи", "Managed accounts": "Керовані облікові записи",
"Modify password...": "Змінити пароль...", "Modify password...": "Змінити пароль...",
"Multi-factor authentication": "Багатофакторна аутентифікація", "Multi-factor authentication": "Багатофакторна аутентифікація",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "Нова електронна пошта", "New Email": "Нова електронна пошта",
"New Password": "Новий пароль", "New Password": "Новий пароль",
"New User": "Новий користувач", "New User": "Новий користувач",

View File

@ -166,7 +166,7 @@
"Next Step": "Bước tiếp theo", "Next Step": "Bước tiếp theo",
"Please input your username!": "Vui lòng nhập tên đăng nhập của bạn!", "Please input your username!": "Vui lòng nhập tên đăng nhập của bạn!",
"Reset": "Đặt lại", "Reset": "Đặt lại",
"Retrieve password": "Truy xuất mật khẩu", "Reset password": "Truy xuất mật khẩu",
"Unknown forget type": "Loại quên chưa biết", "Unknown forget type": "Loại quên chưa biết",
"Verify": "Xác thực" "Verify": "Xác thực"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "Quản lý tài khoản", "Managed accounts": "Quản lý tài khoản",
"Modify password...": "Sửa đổi mật khẩu...", "Modify password...": "Sửa đổi mật khẩu...",
"Multi-factor authentication": "Multi-factor authentication", "Multi-factor authentication": "Multi-factor authentication",
"Need update password": "Need update password",
"Need update password - Tooltip": "Force user update password after login",
"New Email": "Email mới", "New Email": "Email mới",
"New Password": "Mật khẩu mới", "New Password": "Mật khẩu mới",
"New User": "Người dùng mới", "New User": "Người dùng mới",

View File

@ -166,7 +166,7 @@
"Next Step": "下一步", "Next Step": "下一步",
"Please input your username!": "请输入您的用户名!", "Please input your username!": "请输入您的用户名!",
"Reset": "重置", "Reset": "重置",
"Retrieve password": "找回密码", "Reset password": "重置密码",
"Unknown forget type": "未知的忘记密码类型", "Unknown forget type": "未知的忘记密码类型",
"Verify": "验证" "Verify": "验证"
}, },
@ -1130,6 +1130,8 @@
"Managed accounts": "托管账户", "Managed accounts": "托管账户",
"Modify password...": "编辑密码...", "Modify password...": "编辑密码...",
"Multi-factor authentication": "多因素认证", "Multi-factor authentication": "多因素认证",
"Need update password": "需要更新密码",
"Need update password - Tooltip": "强制用户在登录后更新密码",
"New Email": "新邮箱", "New Email": "新邮箱",
"New Password": "新密码", "New Password": "新密码",
"New User": "添加用户", "New User": "添加用户",

View File

@ -102,6 +102,7 @@ class AccountTable extends React.Component {
{name: "Is admin", label: i18next.t("user:Is admin")}, {name: "Is admin", label: i18next.t("user:Is admin")},
{name: "Is forbidden", label: i18next.t("user:Is forbidden")}, {name: "Is forbidden", label: i18next.t("user:Is forbidden")},
{name: "Is deleted", label: i18next.t("user:Is deleted")}, {name: "Is deleted", label: i18next.t("user:Is deleted")},
{name: "Need update password", label: i18next.t("user:Need update password")},
{name: "Multi-factor authentication", label: i18next.t("user:Multi-factor authentication")}, {name: "Multi-factor authentication", label: i18next.t("user:Multi-factor authentication")},
{name: "WebAuthn credentials", label: i18next.t("user:WebAuthn credentials")}, {name: "WebAuthn credentials", label: i18next.t("user:WebAuthn credentials")},
{name: "Managed accounts", label: i18next.t("user:Managed accounts")}, {name: "Managed accounts", label: i18next.t("user:Managed accounts")},