This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 6109a2aaf07667e782ea586ca17592b17a409340
Author: DongLiang-0 <46414265+donglian...@users.noreply.github.com>
AuthorDate: Mon Sep 4 21:19:54 2023 +0800

    [fix](auth)fix after setting the user password to expire, changing the 
password again will not take effect (#23426)
    
    Create a jack user and set the password to expire after 10 days.
    `CREATE USER 'jack' IDENTIFIED BY '12345' PASSWORD_EXPIRE INTERVAL 10 DAY 
FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1 DAY;`
    
    After the password has expired, reset the password.
    `SET PASSWORD FOR 'jack' = PASSWORD('123');`
    
    
    Log in with a new password, ERROE ` Your password has expired. To log in 
you must change it using a client that supports expired passwords`
---
 .../doris/mysql/privilege/PasswordPolicy.java      |  8 +++++
 .../mysql/privilege/PasswordPolicyManager.java     |  7 +++++
 .../suites/account_p0/test_alter_user.groovy       | 34 +++++++++++++++++++++-
 3 files changed, 48 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PasswordPolicy.java 
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PasswordPolicy.java
index f76e90566a..4b374b98e4 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PasswordPolicy.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PasswordPolicy.java
@@ -139,6 +139,10 @@ public class PasswordPolicy implements Writable {
         }
     }
 
+    public ExpirePolicy getExpirePolicy() {
+        return expirePolicy;
+    }
+
     @Override
     public void write(DataOutput out) throws IOException {
         Text.writeString(out, GsonUtils.GSON.toJson(this));
@@ -209,6 +213,10 @@ public class PasswordPolicy implements Writable {
             this.passwordCreateTime = System.currentTimeMillis();
         }
 
+        public void setPasswordCreateTime() {
+            this.passwordCreateTime = System.currentTimeMillis();
+        }
+
         private String expirationSecondsToString() {
             if (expirationSecond == -1) {
                 return "DEFAULT";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PasswordPolicyManager.java
 
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PasswordPolicyManager.java
index af72072e0c..a8eb45dbd6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PasswordPolicyManager.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PasswordPolicyManager.java
@@ -22,6 +22,7 @@ import org.apache.doris.analysis.UserIdentity;
 import org.apache.doris.common.AuthenticationException;
 import org.apache.doris.common.io.Text;
 import org.apache.doris.common.io.Writable;
+import org.apache.doris.mysql.privilege.PasswordPolicy.ExpirePolicy;
 import org.apache.doris.persist.gson.GsonUtils;
 
 import com.google.common.collect.Lists;
@@ -93,6 +94,12 @@ public class PasswordPolicyManager implements Writable {
     public void updatePassword(UserIdentity curUser, byte[] password) {
         PasswordPolicy passwordPolicy = getOrCreatePolicy(curUser);
         passwordPolicy.updatePassword(password);
+
+        // Compatible with setting the password expiration time and changing 
the password again
+        ExpirePolicy expirePolicy = passwordPolicy.getExpirePolicy();
+        if (expirePolicy.passwordCreateTime != 0) {
+            expirePolicy.setPasswordCreateTime();
+        }
     }
 
     public List<List<String>> getPolicyInfo(UserIdentity userIdent) {
diff --git a/regression-test/suites/account_p0/test_alter_user.groovy 
b/regression-test/suites/account_p0/test_alter_user.groovy
index d97c1243a0..445e701092 100644
--- a/regression-test/suites/account_p0/test_alter_user.groovy
+++ b/regression-test/suites/account_p0/test_alter_user.groovy
@@ -139,7 +139,7 @@ suite("test_alter_user", "account") {
     }
     sql """set global validate_password_policy=NONE"""
 
-    // 5. text expire
+    // 5. test expire
     sql """create user test_auth_user4 identified by '12345' PASSWORD_EXPIRE 
INTERVAL 5 SECOND"""
     sql """grant all on *.* to test_auth_user4"""
     result1 = connect(user = 'test_auth_user4', password = '12345', url = 
context.config.jdbcUrl) {
@@ -160,5 +160,37 @@ suite("test_alter_user", "account") {
     result1 = connect(user = 'test_auth_user4', password = '12345', url = 
context.config.jdbcUrl) {
         sql 'select 1'
     }
+
+    // 7. test after expire, reset password
+    sql """drop user test_auth_user4"""
+    sql """create user test_auth_user4 identified by '12345' PASSWORD_EXPIRE 
INTERVAL 5 SECOND"""
+    sql """grant all on *.* to test_auth_user4"""
+    result1 = connect(user = 'test_auth_user4', password = '12345', url = 
context.config.jdbcUrl) {
+        sql 'select 1'
+    }
+    sleep(6000)
+    sql """set password for 'test_auth_user4' = password('123')"""
+    result2 = connect(user = 'test_auth_user4', password = '123', url = 
context.config.jdbcUrl) {
+        sql 'select 1'
+    }
+    sleep(6000)
+    try {
+        connect(user = 'test_auth_user4', password = '123', url = 
context.config.jdbcUrl) {}
+        assertTrue(false. "should not be able to login")
+    } catch (Exception e) {
+        assertTrue(e.getMessage().contains("Your password has expired. To log 
in you must change it using a client that supports expired passwords."), 
e.getMessage())
+    }
+
+    // 8. test password not expiration
+    sql """drop user test_auth_user4"""
+    sql """create user test_auth_user4 identified by '12345'"""
+    sql """grant all on *.* to test_auth_user4"""
+    result1 = connect(user = 'test_auth_user4', password = '12345', url = 
context.config.jdbcUrl) {
+        sql 'select 1'
+    }
+    sleep(1000)
+    result2 = connect(user = 'test_auth_user4', password = '12345', url = 
context.config.jdbcUrl) {
+        sql 'select 1'
+    }
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to