From 9db330646e505d60c9c0f2164101ac9668be4930 Mon Sep 17 00:00:00 2001 From: Xephi59 Date: Sun, 15 May 2016 17:52:54 +0200 Subject: [PATCH] Try to fix #419 --- .../executable/email/RecoverEmailCommand.java | 10 ++-- .../authme/datasource/CacheDataSource.java | 32 ++++++----- .../fr/xephi/authme/datasource/MySQL.java | 43 +++++++------- .../fr/xephi/authme/datasource/SQLite.java | 56 ++++++++++++------- 4 files changed, 81 insertions(+), 60 deletions(-) diff --git a/src/main/java/fr/xephi/authme/command/executable/email/RecoverEmailCommand.java b/src/main/java/fr/xephi/authme/command/executable/email/RecoverEmailCommand.java index aba08584..cb9a4163 100644 --- a/src/main/java/fr/xephi/authme/command/executable/email/RecoverEmailCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/email/RecoverEmailCommand.java @@ -1,5 +1,11 @@ package fr.xephi.authme.command.executable.email; +import java.util.List; + +import javax.inject.Inject; + +import org.bukkit.entity.Player; + import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.cache.auth.PlayerAuth; @@ -13,10 +19,6 @@ import fr.xephi.authme.security.RandomString; import fr.xephi.authme.security.crypts.HashedPassword; import fr.xephi.authme.settings.properties.EmailSettings; import fr.xephi.authme.util.StringUtils; -import org.bukkit.entity.Player; - -import javax.inject.Inject; -import java.util.List; public class RecoverEmailCommand extends PlayerCommand { diff --git a/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java b/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java index 7765e61d..12729fc1 100644 --- a/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java @@ -1,5 +1,11 @@ package fr.xephi.authme.datasource; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + import com.google.common.base.Optional; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -8,17 +14,12 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.ThreadFactoryBuilder; + import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.security.crypts.HashedPassword; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - /** */ public class CacheDataSource implements DataSource { @@ -41,7 +42,8 @@ public class CacheDataSource implements DataSource { .build()) ); cachedAuths = CacheBuilder.newBuilder() - .refreshAfterWrite(8, TimeUnit.MINUTES) + .refreshAfterWrite(5, TimeUnit.MINUTES) + .expireAfterAccess(15, TimeUnit.MINUTES) .build(new CacheLoader>() { @Override public Optional load(String key) { @@ -110,7 +112,7 @@ public class CacheDataSource implements DataSource { } @Override - public boolean updatePassword(String user, HashedPassword password) { + public synchronized boolean updatePassword(String user, HashedPassword password) { user = user.toLowerCase(); boolean result = source.updatePassword(user, password); if (result) { @@ -120,7 +122,7 @@ public class CacheDataSource implements DataSource { } @Override - public boolean updateSession(PlayerAuth auth) { + public synchronized boolean updateSession(PlayerAuth auth) { boolean result = source.updateSession(auth); if (result) { cachedAuths.refresh(auth.getNickname()); @@ -129,7 +131,7 @@ public class CacheDataSource implements DataSource { } @Override - public boolean updateQuitLoc(final PlayerAuth auth) { + public synchronized boolean updateQuitLoc(final PlayerAuth auth) { boolean result = source.updateQuitLoc(auth); if (result) { cachedAuths.refresh(auth.getNickname()); @@ -199,17 +201,17 @@ public class CacheDataSource implements DataSource { } @Override - public boolean isLogged(String user) { + public synchronized boolean isLogged(String user) { return PlayerCache.getInstance().isAuthenticated(user); } @Override - public void setLogged(final String user) { + public synchronized void setLogged(final String user) { source.setLogged(user.toLowerCase()); } @Override - public void setUnlogged(final String user) { + public synchronized void setUnlogged(final String user) { source.setUnlogged(user.toLowerCase()); } @@ -225,7 +227,7 @@ public class CacheDataSource implements DataSource { } @Override - public boolean updateRealName(String user, String realName) { + public synchronized boolean updateRealName(String user, String realName) { boolean result = source.updateRealName(user, realName); if (result) { cachedAuths.refresh(user); @@ -234,7 +236,7 @@ public class CacheDataSource implements DataSource { } @Override - public boolean updateIp(String user, String ip) { + public synchronized boolean updateIp(String user, String ip) { boolean result = source.updateIp(user, ip); if (result) { cachedAuths.refresh(user); diff --git a/src/main/java/fr/xephi/authme/datasource/MySQL.java b/src/main/java/fr/xephi/authme/datasource/MySQL.java index 4f6317bc..9e274e5e 100644 --- a/src/main/java/fr/xephi/authme/datasource/MySQL.java +++ b/src/main/java/fr/xephi/authme/datasource/MySQL.java @@ -1,20 +1,5 @@ package fr.xephi.authme.datasource; -import com.google.common.annotations.VisibleForTesting; -import com.zaxxer.hikari.HikariDataSource; -import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException; -import fr.xephi.authme.ConsoleLogger; -import fr.xephi.authme.cache.auth.PlayerAuth; -import fr.xephi.authme.security.HashAlgorithm; -import fr.xephi.authme.security.crypts.HashedPassword; -import fr.xephi.authme.security.crypts.XFBCRYPT; -import fr.xephi.authme.settings.NewSetting; -import fr.xephi.authme.settings.Settings; -import fr.xephi.authme.settings.properties.DatabaseSettings; -import fr.xephi.authme.settings.properties.HooksSettings; -import fr.xephi.authme.settings.properties.SecuritySettings; -import fr.xephi.authme.util.StringUtils; - import java.sql.Blob; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -26,6 +11,22 @@ import java.sql.Types; import java.util.ArrayList; import java.util.List; +import com.google.common.annotations.VisibleForTesting; +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.security.HashAlgorithm; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.security.crypts.XFBCRYPT; +import fr.xephi.authme.settings.NewSetting; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.StringUtils; + /** */ public class MySQL implements DataSource { @@ -535,7 +536,7 @@ public class MySQL implements DataSource { } @Override - public boolean updatePassword(String user, HashedPassword password) { + public synchronized boolean updatePassword(String user, HashedPassword password) { user = user.toLowerCase(); try (Connection con = getConnection()) { boolean useSalt = !col.SALT.isEmpty(); @@ -756,7 +757,7 @@ public class MySQL implements DataSource { } @Override - public boolean isLogged(String user) { + public synchronized boolean isLogged(String user) { String sql = "SELECT " + col.IS_LOGGED + " FROM " + tableName + " WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, user); @@ -770,7 +771,7 @@ public class MySQL implements DataSource { } @Override - public void setLogged(String user) { + public synchronized void setLogged(String user) { String sql = "UPDATE " + tableName + " SET " + col.IS_LOGGED + "=? WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setInt(1, 1); @@ -782,7 +783,7 @@ public class MySQL implements DataSource { } @Override - public void setUnlogged(String user) { + public synchronized void setUnlogged(String user) { String sql = "UPDATE " + tableName + " SET " + col.IS_LOGGED + "=? WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setInt(1, 0); @@ -822,7 +823,7 @@ public class MySQL implements DataSource { } @Override - public boolean updateRealName(String user, String realName) { + public synchronized boolean updateRealName(String user, String realName) { String sql = "UPDATE " + tableName + " SET " + col.REAL_NAME + "=? WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, realName); @@ -836,7 +837,7 @@ public class MySQL implements DataSource { } @Override - public boolean updateIp(String user, String ip) { + public synchronized boolean updateIp(String user, String ip) { String sql = "UPDATE " + tableName + " SET " + col.IP + "=? WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, ip); diff --git a/src/main/java/fr/xephi/authme/datasource/SQLite.java b/src/main/java/fr/xephi/authme/datasource/SQLite.java index dfc74740..fe670813 100644 --- a/src/main/java/fr/xephi/authme/datasource/SQLite.java +++ b/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -1,14 +1,5 @@ package fr.xephi.authme.datasource; -import com.google.common.annotations.VisibleForTesting; -import fr.xephi.authme.ConsoleLogger; -import fr.xephi.authme.cache.auth.PlayerAuth; -import fr.xephi.authme.security.crypts.HashedPassword; -import fr.xephi.authme.settings.NewSetting; -import fr.xephi.authme.settings.Settings; -import fr.xephi.authme.settings.properties.DatabaseSettings; -import fr.xephi.authme.util.StringUtils; - import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -18,6 +9,16 @@ import java.sql.Statement; import java.util.ArrayList; import java.util.List; +import com.google.common.annotations.VisibleForTesting; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.settings.NewSetting; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.util.StringUtils; + /** */ public class SQLite implements DataSource { @@ -65,7 +66,6 @@ public class SQLite implements DataSource { Class.forName("org.sqlite.JDBC"); ConsoleLogger.info("SQLite driver loaded"); this.con = DriverManager.getConnection("jdbc:sqlite:plugins/AuthMe/" + database + ".db"); - } private synchronized void setup() throws SQLException { @@ -131,7 +131,13 @@ public class SQLite implements DataSource { @Override public void reload() { - // TODO 20160309: Implement reloading + close(con); + try { + this.connect(); + this.setup(); + } catch (ClassNotFoundException | SQLException ex) { + ConsoleLogger.logException("Error during SQLite initialization:", ex); + } } @Override @@ -239,7 +245,7 @@ public class SQLite implements DataSource { } @Override - public boolean updatePassword(String user, HashedPassword password) { + public synchronized boolean updatePassword(String user, HashedPassword password) { user = user.toLowerCase(); PreparedStatement pst = null; try { @@ -266,7 +272,7 @@ public class SQLite implements DataSource { } @Override - public boolean updateSession(PlayerAuth auth) { + public synchronized boolean updateSession(PlayerAuth auth) { PreparedStatement pst = null; try { pst = con.prepareStatement("UPDATE " + tableName + " SET " + col.IP + "=?, " + col.LAST_LOGIN + "=?, " + col.REAL_NAME + "=? WHERE " + col.NAME + "=?;"); @@ -322,7 +328,7 @@ public class SQLite implements DataSource { } @Override - public boolean updateQuitLoc(PlayerAuth auth) { + public synchronized boolean updateQuitLoc(PlayerAuth auth) { PreparedStatement pst = null; try { pst = con.prepareStatement("UPDATE " + tableName + " SET " + col.LASTLOC_X + "=?, " + col.LASTLOC_Y + "=?, " + col.LASTLOC_Z + "=?, " + col.LASTLOC_WORLD + "=? WHERE " + col.NAME + "=?;"); @@ -342,7 +348,7 @@ public class SQLite implements DataSource { } @Override - public boolean updateEmail(PlayerAuth auth) { + public synchronized boolean updateEmail(PlayerAuth auth) { String sql = "UPDATE " + tableName + " SET " + col.EMAIL + "=? WHERE " + col.NAME + "=?;"; try (PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, auth.getEmail()); @@ -376,6 +382,16 @@ public class SQLite implements DataSource { } } + private void close(Connection con) { + if (con != null) { + try { + con.close(); + } catch (SQLException ex) { + logSqlException(ex); + } + } + } + private void close(ResultSet rs) { if (rs != null) { try { @@ -443,7 +459,7 @@ public class SQLite implements DataSource { } @Override - public boolean isLogged(String user) { + public synchronized boolean isLogged(String user) { PreparedStatement pst = null; ResultSet rs = null; try { @@ -462,7 +478,7 @@ public class SQLite implements DataSource { } @Override - public void setLogged(String user) { + public synchronized void setLogged(String user) { PreparedStatement pst = null; try { pst = con.prepareStatement("UPDATE " + tableName + " SET " + col.IS_LOGGED + "=? WHERE LOWER(" + col.NAME + ")=?;"); @@ -477,7 +493,7 @@ public class SQLite implements DataSource { } @Override - public void setUnlogged(String user) { + public synchronized void setUnlogged(String user) { PreparedStatement pst = null; if (user != null) try { @@ -521,7 +537,7 @@ public class SQLite implements DataSource { } @Override - public boolean updateRealName(String user, String realName) { + public synchronized boolean updateRealName(String user, String realName) { String sql = "UPDATE " + tableName + " SET " + col.REAL_NAME + "=? WHERE " + col.NAME + "=?;"; try (PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, realName); @@ -535,7 +551,7 @@ public class SQLite implements DataSource { } @Override - public boolean updateIp(String user, String ip) { + public synchronized boolean updateIp(String user, String ip) { String sql = "UPDATE " + tableName + " SET " + col.IP + "=? WHERE " + col.NAME + "=?;"; try (PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, ip);