Skip to content

Commit 45a2a63

Browse files
committed
Switch authentication storage to UUIDs
1 parent 1885aca commit 45a2a63

23 files changed

+375
-238
lines changed

src/main/java/uk/org/whoami/authme/AuthMe.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,15 +193,17 @@ public DataSource getAuthDatabase() {
193193

194194
private void onReload(Player[] players) {
195195
for (Player player : players) {
196+
String uuid = player.getUniqueId().toString();
196197
String name = player.getName().toLowerCase();
197198
String ip = player.getAddress().getAddress().getHostAddress();
198199

199-
boolean authAvail = database.isAuthAvailable(name);
200+
boolean authAvail = database.isAuthAvailable(uuid);
200201

201202
if (authAvail) {
202203
if (settings.isSessionsEnabled()) {
203-
PlayerAuth auth = database.getAuth(name);
204-
if (auth.getNickname().equals(name) && auth.getIp().equals(ip)) {
204+
PlayerAuth auth = database.getAuth(uuid);
205+
if (auth != null && auth.getUuid().equals(uuid) && auth.getIp().equals(ip)) {
206+
auth.setUsername(name);
205207
PlayerCache.getInstance().addPlayer(auth);
206208
player.sendMessage(m._("valid_session"));
207209
break;
@@ -227,10 +229,10 @@ private void onReload(Player[] players) {
227229
int msgInterval = settings.getWarnMessageInterval();
228230
BukkitScheduler sched = this.getServer().getScheduler();
229231
if (time != 0) {
230-
int id = sched.scheduleSyncDelayedTask(this, new TimeoutTask(this, name), time);
231-
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id);
232+
int id = sched.scheduleSyncDelayedTask(this, new TimeoutTask(this, uuid), time);
233+
LimboCache.getInstance().getLimboPlayer(uuid).setTimeoutTaskId(id);
232234
}
233-
sched.scheduleSyncDelayedTask(this, new MessageTask(this, name, msg, msgInterval));
235+
sched.scheduleSyncDelayedTask(this, new MessageTask(this, uuid, msg, msgInterval));
234236
}
235237
}
236238

src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,34 @@
1818

1919
public class PlayerAuth {
2020

21-
private String nickname;
21+
private final String uuid;
22+
private String username;
2223
private String hash;
2324
private String ip;
2425
private long lastLogin;
2526

26-
public PlayerAuth(String nickname, String hash, String ip, long lastLogin) {
27-
this.nickname = nickname;
27+
public PlayerAuth(String uuid, String username, String hash, String ip, long lastLogin) {
28+
this.uuid = uuid;
29+
this.username = username;
2830
this.hash = hash;
2931
this.ip = ip;
3032
this.lastLogin = lastLogin;
3133
}
3234

33-
public String getIp() {
34-
return ip;
35+
public String getUuid() {
36+
return uuid;
3537
}
3638

37-
public String getNickname() {
38-
return nickname;
39+
public String getUsername() {
40+
return username;
41+
}
42+
43+
public void setUsername(String username) {
44+
this.username = username;
45+
}
46+
47+
public String getIp() {
48+
return ip;
3949
}
4050

4151
public String getHash() {
@@ -64,14 +74,14 @@ public boolean equals(Object obj) {
6474
return false;
6575
}
6676
PlayerAuth other = (PlayerAuth) obj;
67-
68-
return other.getIp().equals(this.ip) && other.getNickname().equals(this.nickname);
77+
78+
return other.getIp().equals(this.ip) && other.getUuid().equals(this.uuid);
6979
}
7080

7181
@Override
7282
public int hashCode() {
7383
int hashCode = 7;
74-
hashCode = 71 * hashCode + (this.nickname != null ? this.nickname.hashCode() : 0);
84+
hashCode = 71 * hashCode + (this.uuid != null ? this.uuid.hashCode() : 0);
7585
hashCode = 71 * hashCode + (this.ip != null ? this.ip.hashCode() : 0);
7686
return hashCode;
7787
}

src/main/java/uk/org/whoami/authme/cache/auth/PlayerCache.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,24 @@ private PlayerCache() {
2828
}
2929

3030
public void addPlayer(PlayerAuth auth) {
31-
cache.put(auth.getNickname(), auth);
31+
cache.put(auth.getUuid(), auth);
3232
}
3333

3434
public void updatePlayer(PlayerAuth auth) {
35-
cache.remove(auth.getNickname());
36-
cache.put(auth.getNickname(), auth);
35+
cache.remove(auth.getUuid());
36+
cache.put(auth.getUuid(), auth);
3737
}
3838

39-
public void removePlayer(String user) {
40-
cache.remove(user);
39+
public void removePlayer(String uuid) {
40+
cache.remove(uuid);
4141
}
4242

43-
public boolean isAuthenticated(String user) {
44-
return cache.containsKey(user);
43+
public boolean isAuthenticated(String uuid) {
44+
return cache.containsKey(uuid);
4545
}
4646

47-
public PlayerAuth getAuth(String user) {
48-
return cache.get(user);
47+
public PlayerAuth getAuth(String uuid) {
48+
return cache.get(uuid);
4949
}
5050

5151
public static PlayerCache getInstance() {

src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,26 @@ private LimboCache() {
3232
}
3333

3434
public void addLimboPlayer(Player player) {
35+
String uuid = player.getUniqueId().toString();
3536
String name = player.getName().toLowerCase();
3637
Location loc = player.getLocation();
3738
ItemStack[] inv = player.getInventory().getContents();
3839
ItemStack[] arm = player.getInventory().getArmorContents();
3940
//int gameMode = player.getGameMode().getValue();
4041

41-
cache.put(player.getName().toLowerCase(), new LimboPlayer(name, loc, inv, arm));
42+
cache.put(uuid, new LimboPlayer(uuid, name, loc, inv, arm));
4243
}
4344

44-
public void deleteLimboPlayer(String name) {
45-
cache.remove(name);
45+
public void deleteLimboPlayer(String uuid) {
46+
cache.remove(uuid);
4647
}
4748

48-
public LimboPlayer getLimboPlayer(String name) {
49-
return cache.get(name);
49+
public LimboPlayer getLimboPlayer(String uuid) {
50+
return cache.get(uuid);
5051
}
5152

52-
public boolean hasLimboPlayer(String name) {
53-
return cache.containsKey(name);
53+
public boolean hasLimboPlayer(String uuid) {
54+
return cache.containsKey(uuid);
5455
}
5556

5657
public static LimboCache getInstance() {

src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,27 @@
2121

2222
public class LimboPlayer {
2323

24+
private final String uuid;
2425
private String name;
2526
private ItemStack[] inventory;
2627
private ItemStack[] armour;
2728
private Location loc;
2829
private int timeoutTaskId = -1;
2930
private int gameMode = 0;
3031

31-
public LimboPlayer(String name, Location loc, ItemStack[] inventory, ItemStack[] armour) {
32+
public LimboPlayer(String uuid, String name, Location loc, ItemStack[] inventory, ItemStack[] armour) {
33+
this.uuid = uuid;
3234
this.name = name;
3335
this.loc = loc;
3436
this.inventory = inventory;
3537
this.armour = armour;
3638
this.gameMode = gameMode;
3739
}
3840

41+
public String getUuid() {
42+
return uuid;
43+
}
44+
3945
public String getName() {
4046
return name;
4147
}

src/main/java/uk/org/whoami/authme/commands/AdminCommand.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717
package uk.org.whoami.authme.commands;
1818

19+
import java.nio.charset.StandardCharsets;
1920
import java.security.NoSuchAlgorithmException;
2021
import java.util.Date;
22+
import java.util.UUID;
2123

2224
import org.bukkit.command.Command;
2325
import org.bukkit.command.CommandExecutor;
@@ -93,14 +95,15 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
9395

9496
try {
9597
String name = args[1].toLowerCase();
98+
String uuid = getOfflineUuid(args[1]);
9699
String hash = PasswordSecurity.getHash(settings.getPasswordHash(), args[2]);
97100

98-
if (database.isAuthAvailable(name)) {
101+
if (database.isAuthAvailable(uuid)) {
99102
sender.sendMessage(m._("user_regged"));
100103
return true;
101104
}
102105

103-
PlayerAuth auth = new PlayerAuth(name, hash, "198.18.0.1", 0);
106+
PlayerAuth auth = new PlayerAuth(uuid, name, hash, "198.18.0.1", 0);
104107
if (!database.saveAuth(auth)) {
105108
sender.sendMessage(m._("error"));
106109
return true;
@@ -119,18 +122,20 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
119122

120123
try {
121124
String name = args[1].toLowerCase();
125+
String uuid = getOfflineUuid(args[1]);
122126
String hash = PasswordSecurity.getHash(settings.getPasswordHash(), args[2]);
123127

124128
PlayerAuth auth = null;
125-
if (PlayerCache.getInstance().isAuthenticated(name)) {
126-
auth = PlayerCache.getInstance().getAuth(name);
127-
} else if (database.isAuthAvailable(name)) {
128-
auth = database.getAuth(name);
129+
if (PlayerCache.getInstance().isAuthenticated(uuid)) {
130+
auth = PlayerCache.getInstance().getAuth(uuid);
131+
} else if (database.isAuthAvailable(uuid)) {
132+
auth = database.getAuth(uuid);
129133
} else {
130134
sender.sendMessage(m._("unknown_user"));
131135
return true;
132136
}
133137
auth.setHash(hash);
138+
auth.setUsername(name);
134139

135140
if (!database.updatePassword(auth)) {
136141
sender.sendMessage(m._("error"));
@@ -150,19 +155,24 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
150155
}
151156

152157
String name = args[1].toLowerCase();
158+
String uuid = getOfflineUuid(args[1]);
153159

154-
if (!database.removeAuth(name)) {
160+
if (!database.removeAuth(uuid)) {
155161
sender.sendMessage(m._("error"));
156162
return true;
157163
}
158164

159-
PlayerCache.getInstance().removePlayer(name);
165+
PlayerCache.getInstance().removePlayer(uuid);
160166
sender.sendMessage("unregistered");
161167

162168
ConsoleLogger.info(args[1] + " unregistered");
163169
} else {
164170
sender.sendMessage("Usage: /authme reload|register playername password|changepassword playername password|unregister playername");
165171
}
166172
return true;
173+
}
174+
175+
private String getOfflineUuid(String playerName) {
176+
return UUID.nameUUIDFromBytes(("OfflinePlayer:" + playerName).getBytes(StandardCharsets.UTF_8)).toString();
167177
}
168178
}

src/main/java/uk/org/whoami/authme/commands/ChangePasswordCommand.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
5353
}
5454

5555
Player player = (Player) sender;
56+
String uuid = player.getUniqueId().toString();
5657
String name = player.getName().toLowerCase();
5758
String ip = player.getAddress().getAddress().getHostAddress();
5859

59-
if (!PlayerCache.getInstance().isAuthenticated(name)) {
60+
if (!PlayerCache.getInstance().isAuthenticated(uuid)) {
6061
player.sendMessage(m._("not_logged_in"));
6162
return true;
6263
}
@@ -69,9 +70,10 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
6970
try {
7071
String hashnew = PasswordSecurity.getHash(settings.getPasswordHash(), args[1]);
7172

72-
if (PasswordSecurity.comparePasswordWithHash(args[0], PlayerCache.getInstance().getAuth(name).getHash())) {
73-
PlayerAuth auth = PlayerCache.getInstance().getAuth(name);
73+
if (PasswordSecurity.comparePasswordWithHash(args[0], PlayerCache.getInstance().getAuth(uuid).getHash())) {
74+
PlayerAuth auth = PlayerCache.getInstance().getAuth(uuid);
7475
auth.setHash(hashnew);
76+
auth.setUsername(name);
7577
if (!database.updatePassword(auth)) {
7678
player.sendMessage(m._("error"));
7779
return true;

src/main/java/uk/org/whoami/authme/commands/LoginCommand.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
6262
}
6363

6464
Player player = (Player) sender;
65+
String uuid = player.getUniqueId().toString();
6566
String name = player.getName().toLowerCase();
6667
String ip = player.getAddress().getAddress().getHostAddress();
6768

@@ -76,7 +77,7 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
7677
}
7778

7879

79-
if (PlayerCache.getInstance().isAuthenticated(name)) {
80+
if (PlayerCache.getInstance().isAuthenticated(uuid)) {
8081
player.sendMessage(m._("logged_in"));
8182
return true;
8283
}
@@ -86,12 +87,17 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
8687
return true;
8788
}
8889

89-
if (!database.isAuthAvailable(player.getName().toLowerCase())) {
90+
if (!database.isAuthAvailable(uuid)) {
9091
player.sendMessage(m._("user_unknown"));
9192
return true;
9293
}
93-
94-
String hash = database.getAuth(name).getHash();
94+
95+
PlayerAuth authData = database.getAuth(uuid);
96+
if (authData == null) {
97+
player.sendMessage(m._("user_unknown"));
98+
return true;
99+
}
100+
String hash = authData.getHash();
95101

96102
try {
97103
if (PasswordSecurity.comparePasswordWithHash(args[0], hash)) {
@@ -102,18 +108,18 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin
102108
return true;
103109
}
104110
//Login Event End
105-
PlayerAuth auth = new PlayerAuth(name, hash, ip, new Date().getTime());
111+
PlayerAuth auth = new PlayerAuth(uuid, name, hash, ip, new Date().getTime());
106112
database.updateSession(auth);
107113
PlayerCache.getInstance().addPlayer(auth);
108-
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
114+
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(uuid);
109115
if (limbo != null) {
110116
player.getInventory().setContents(limbo.getInventory());
111117
player.getInventory().setArmorContents(limbo.getArmour());
112118
if (settings.isTeleportToSpawnEnabled()) {
113119
player.teleport(limbo.getLoc());
114120
}
115121
sender.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId());
116-
LimboCache.getInstance().deleteLimboPlayer(name);
122+
LimboCache.getInstance().deleteLimboPlayer(uuid);
117123
}
118124
player.sendMessage(m._("login"));
119125
ConsoleLogger.info(player.getDisplayName() + " logged in!");

0 commit comments

Comments
 (0)