Skip to content

Commit 4c10f5d

Browse files
committed
1.3 Release
Add discord 2fa feature, add converter with inital support for jpremium
1 parent 661766c commit 4c10f5d

File tree

21 files changed

+738
-147
lines changed

21 files changed

+738
-147
lines changed

pom.xml

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>ad1tya2</groupId>
88
<artifactId>AdiAuth</artifactId>
9-
<version>1.2</version>
9+
<version>1.3</version>
1010
<packaging>jar</packaging>
1111

1212
<name>AdiAuth</name>
@@ -40,14 +40,6 @@
4040
</goals>
4141
<configuration>
4242
<minimizeJar>true</minimizeJar>
43-
<filters>
44-
<filter>
45-
<artifact>com.h2database:h2</artifact>
46-
<includes>
47-
<includes>**</includes>
48-
</includes>
49-
</filter>
50-
</filters>
5143
<createDependencyReducedPom>false</createDependencyReducedPom>
5244
</configuration>
5345
</execution>
@@ -120,6 +112,11 @@
120112
<id>spigot-repo</id>
121113
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
122114
</repository>
115+
<repository>
116+
<id>dv8tion</id>
117+
<name>m2-dv8tion</name>
118+
<url>https://m2.dv8tion.net/releases</url>
119+
</repository>
123120
</repositories>
124121

125122
<dependencies>
@@ -153,6 +150,18 @@
153150
<version>1.8.8-R0.1-SNAPSHOT</version>
154151
<scope>provided</scope>
155152
</dependency>
153+
<dependency>
154+
<groupId>net.dv8tion</groupId>
155+
<artifactId>JDA</artifactId>
156+
<version>4.3.0_277</version>
157+
<scope>provided</scope>
158+
</dependency>
159+
<dependency>
160+
<groupId>net.luckperms</groupId>
161+
<artifactId>api</artifactId>
162+
<version>5.3</version>
163+
<scope>provided</scope>
164+
</dependency>
156165
</dependencies>
157166

158167
</project>

src/main/java/ad1tya2/adiauth/Bungee/AdiAuth.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import ad1tya2.adiauth.Bungee.data.servers;
66
import ad1tya2.adiauth.Bungee.data.storage;
77
import ad1tya2.adiauth.Bungee.events.Handler;
8+
import ad1tya2.adiauth.Bungee.events.discord;
89
import net.md_5.bungee.api.plugin.Plugin;
910

1011
import java.util.Arrays;
@@ -27,6 +28,7 @@ public void onEnable() {
2728
database.load();
2829
storage.load();
2930
servers.load();
31+
discord.load();
3032

3133
getProxy().getPluginManager().registerListener(this, new Handler());
3234
getProxy().getLogger().setFilter(new Filter() {
@@ -52,6 +54,8 @@ public boolean isLoggable(LogRecord record) {
5254
getProxy().getPluginManager().registerCommand(this, new changepass());
5355
getProxy().getPluginManager().registerCommand(this, new unregister());
5456
getProxy().getPluginManager().registerCommand(this, new forcechangepass());
57+
getProxy().getPluginManager().registerCommand(this, new twofactor());
58+
getProxy().getPluginManager().registerCommand(this, new converter());
5559
servers.serversStatusChecker();
5660

5761
}
@@ -60,6 +64,7 @@ public static void reload(){
6064
Config.load();
6165
storage.load();
6266
servers.load();
67+
discord.load();
6368
}
6469

6570
public static void runAsync(Runnable task){

src/main/java/ad1tya2/adiauth/Bungee/Config.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@
66
import net.md_5.bungee.api.Title;
77
import net.md_5.bungee.api.chat.TextComponent;
88
import net.md_5.bungee.api.config.ServerInfo;
9-
import net.md_5.bungee.api.plugin.Plugin;
109
import net.md_5.bungee.config.Configuration;
1110
import net.md_5.bungee.config.ConfigurationProvider;
1211
import net.md_5.bungee.config.YamlConfiguration;
1312

1413
import java.io.*;
1514
import java.util.ArrayList;
1615
import java.util.List;
17-
import java.util.Locale;
1816
import java.util.logging.Level;
1917

2018
public class Config {
@@ -38,9 +36,14 @@ public static class Messages {
3836
public static String registerError, loginAndRegisterSuccess, alreadyLoggedIn, loginNotRegistered,
3937
loginWrongPass, loginError, alreadyRegistered, noServersAvailable, registerMessage,
4038
loginMessage, logoutMessage, changePassError, genericPremiumError, successfulChangePass,
41-
tooManyAccounts, loginRegisterBossBar, authTimeExceeded;
39+
tooManyAccounts, loginRegisterBossBar, authTimeExceeded, discordRegisterMessage, discordLoginMessage;
4240
public static Title loginAndRegisterSuccessTitle, registerTitle, loginTitle;
4341
}
42+
public static class Discord {
43+
public static String bot_token, loginButtonChannel, activityStatus, buttonMessage, buttonText, roleToGive;
44+
public static boolean enabled, compulsory_for_enabled, roleToGiveEnabled;
45+
public static List<String> compulsory_for;
46+
}
4447
public enum MYSQL {
4548
username,
4649
password,
@@ -121,6 +124,23 @@ public static void load() {
121124
break;
122125
}
123126

127+
Configuration discord = config.getSection("discord");
128+
129+
//Discord config
130+
Discord.bot_token = discord.getString("bot-token");
131+
Discord.compulsory_for = discord.getStringList("compulsory-for");
132+
Discord.enabled = discord.getBoolean("enabled");
133+
Discord.compulsory_for_enabled = AdiAuth.instance.getProxy().getPluginManager().getPlugin("LuckPerms") != null
134+
&& Discord.compulsory_for.size() != 0 ;
135+
Discord.loginButtonChannel = discord.getString("loginButtonChannel");
136+
Discord.activityStatus = discord.getString("activityStatus");
137+
Discord.roleToGive = discord.getString("roleToGive");
138+
Discord.roleToGiveEnabled = !(Discord.roleToGive.equals(""));
139+
Discord.buttonMessage = discord.getString("buttonMessage");
140+
Discord.buttonText = discord.getString("buttonText");
141+
142+
Messages.discordRegisterMessage = getMsgString("discordRegisterMessage");
143+
Messages.discordLoginMessage = getMsgString("discordLoginMessage");
124144
}
125145
catch (Exception e){
126146
e.printStackTrace();
@@ -132,6 +152,9 @@ public static void load() {
132152
private static String getMsgString(String name){
133153
return tools.getColoured(config.getString("messages."+name));
134154
}
155+
private static String getUncolouredMsg(String name){
156+
return config.getString("messages."+name);
157+
}
135158
private static Title createTitle(String msg){
136159
Title title = ProxyServer.getInstance().createTitle().title(
137160
new TextComponent(tools.getColoured(msg)));

src/main/java/ad1tya2/adiauth/Bungee/UserProfile.java

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package ad1tya2.adiauth.Bungee;
22

3+
import ad1tya2.adiauth.Bungee.data.servers;
4+
import ad1tya2.adiauth.Bungee.events.discord;
35
import ad1tya2.adiauth.Bungee.utils.BossBar;
4-
import ad1tya2.adiauth.Bungee.utils.tools;
6+
import ad1tya2.adiauth.Bungee.utils.pluginMessaging;
7+
import ad1tya2.adiauth.PluginMessages;
8+
import net.md_5.bungee.api.config.ServerInfo;
59
import net.md_5.bungee.api.connection.ProxiedPlayer;
6-
import net.md_5.bungee.protocol.DefinedPacket;
7-
import net.md_5.bungee.protocol.ProtocolConstants;
10+
import net.md_5.bungee.api.connection.Server;
811

912
import java.util.UUID;
1013
import java.util.concurrent.ScheduledFuture;
@@ -18,6 +21,9 @@ public class UserProfile {
1821
public String lastIp;
1922
private ScheduledFuture<?> titleTask;
2023
public boolean fullJoined = false;
24+
public String discordId;
25+
public boolean discordLoginPending = false;
26+
public Integer twoFactorCode;
2127
//Full joined is set when a person completely logs into the server for the first time
2228

2329
public long sessionEnd = 1L;
@@ -34,6 +40,8 @@ public void startSession(ProxiedPlayer p){
3440
titleTask = null;
3541
}
3642
sessionEnd = System.currentTimeMillis() + Config.SessionTime*60000L;
43+
discordLoginPending = false;
44+
twoFactorCode = null;
3745
}
3846

3947
public void endSession(){
@@ -42,11 +50,19 @@ public void endSession(){
4250

4351
public boolean isLogged()
4452
{
45-
return isPremium() || System.currentTimeMillis()<sessionEnd;
53+
if(is2faLoginNeeded() && System.currentTimeMillis()>sessionEnd){
54+
return false;
55+
} else if(isPremium()){
56+
return true;
57+
} else {
58+
return System.currentTimeMillis()<sessionEnd;
59+
}
60+
4661
}
4762

63+
4864
public boolean isRegistered(){
49-
return password != null;
65+
return isPremium() || password != null;
5066
}
5167

5268
public void startLoginProcess(){
@@ -74,8 +90,39 @@ public void run() {
7490
String.valueOf((int) timeLeft[0])), timeLeft[0] /maxTime, p);
7591
} else {
7692
p.disconnect(Config.Messages.authTimeExceeded);
93+
discordLoginPending = false;
7794
}
7895
}
7996
}, 2, 1, TimeUnit.SECONDS);
8097
}
98+
99+
public boolean is2faLoginNeeded(){
100+
return discordId != null || discord.isCompulsory(this);
101+
}
102+
103+
public boolean is2faRegistered(){
104+
return discordId != null;
105+
}
106+
107+
public void loggedInPlayer(ProxiedPlayer p){
108+
p.sendTitle(Config.Messages.loginAndRegisterSuccessTitle);
109+
p.sendMessage(Config.Messages.loginAndRegisterSuccess);
110+
startSession(p);
111+
Server server = p.getServer();
112+
if(server != null && Config.lobbies.contains(server.getInfo())){
113+
pluginMessaging.sendMessageBungee(p, PluginMessages.loggedIn, server.getInfo());
114+
}else {
115+
ServerInfo hub = servers.getHubServer();
116+
if(hub == null){
117+
p.disconnect(Config.Messages.noServersAvailable);
118+
return;
119+
}
120+
p.connect(hub);
121+
}
122+
}
123+
124+
public String getTwoFactorCode(){
125+
twoFactorCode = twoFactorCode == null? (int)(Math.random()*9000)+1000: twoFactorCode;
126+
return String.valueOf(twoFactorCode);
127+
}
81128
}

src/main/java/ad1tya2/adiauth/Bungee/commands/changepass.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import ad1tya2.adiauth.Bungee.Config;
44
import ad1tya2.adiauth.Bungee.UserProfile;
55
import ad1tya2.adiauth.Bungee.data.storage;
6-
import ad1tya2.adiauth.Bungee.utils.tools;
6+
import ad1tya2.adiauth.Bungee.utils.passwordUtils;
77
import net.md_5.bungee.api.CommandSender;
88
import net.md_5.bungee.api.connection.ProxiedPlayer;
99
import net.md_5.bungee.api.plugin.Command;
@@ -25,13 +25,13 @@ public void execute(CommandSender sender, String[] args) {
2525
if(profile.isPremium()){
2626
p.sendMessage(Config.Messages.genericPremiumError);
2727
}
28-
String oldPass = tools.getSha256(args[0]);
29-
String newPass = tools.getSha256(args[1]);
28+
String oldPass = args[0];
29+
String newPass = passwordUtils.getSha256(args[1]);
3030

31-
if(oldPass != profile.password){
32-
p.sendMessage(Config.Messages.changePassError);
33-
} else if(newPass == oldPass){
31+
if(newPass == oldPass){
3432
p.sendMessage(Config.Messages.successfulChangePass);
33+
} else if(!passwordUtils.comparePass(profile, oldPass)){
34+
p.sendMessage(Config.Messages.changePassError);
3535
} else {
3636
profile.password = newPass;
3737
storage.updatePlayer(profile);
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package ad1tya2.adiauth.Bungee.commands;
2+
3+
import ad1tya2.adiauth.Bungee.AdiAuth;
4+
import ad1tya2.adiauth.Bungee.data.storage;
5+
import ad1tya2.adiauth.Bungee.utils.Uuids;
6+
import net.md_5.bungee.api.ChatColor;
7+
import net.md_5.bungee.api.CommandSender;
8+
import net.md_5.bungee.api.plugin.Command;
9+
10+
import java.sql.*;
11+
12+
public class converter extends Command {
13+
public converter(){
14+
super("adiauthconverter", "adiauth.admin", "aaconverter", "adiconvert");
15+
}
16+
@Override
17+
public void execute(CommandSender sender, String[] args) {
18+
try {
19+
String host=null, database=null, dbUsername=null, dbPassword=null;
20+
for (String arg : args) {
21+
try {
22+
String[] rawArg = arg.split("=");
23+
String key = rawArg[0];
24+
String value = rawArg[1];
25+
switch (key){
26+
case "host":
27+
host = value;
28+
break;
29+
case "database":
30+
database = value;
31+
break;
32+
case "username":
33+
dbUsername = value;
34+
break;
35+
case "password":
36+
dbPassword = value;
37+
break;
38+
default:
39+
break;
40+
}
41+
} catch (Exception ignored) {
42+
}
43+
}
44+
if (args[0].equalsIgnoreCase("jpremium")) {
45+
sender.sendMessage("Trying to connect!");
46+
Connection conn = DriverManager.getConnection("jdbc:mysql://"+host+"/"+database+"?" +
47+
"user="+dbUsername+"&password="+dbPassword);
48+
Statement stmt = conn.createStatement();
49+
sender.sendMessage(ChatColor.GREEN+"Connected!" +
50+
"\nQuerying Records...");
51+
ResultSet jpremRecords =
52+
stmt.executeQuery("SELECT uniqueId, premiumId, lastNickname, hashedPassword,lastAddress FROM user_profiles");
53+
Connection currentDb = ad1tya2.adiauth.Bungee.data.database.getConnection();
54+
PreparedStatement newRecords = currentDb.prepareStatement(
55+
"REPLACE INTO auth_users(uuid, lastIp , password, username, premiumUuid, fullJoined) " +
56+
"VALUES(?, ?, ?, ?, ?, ?)"
57+
);
58+
int count = 0;
59+
while (jpremRecords.next()){
60+
String username = jpremRecords.getString("lastNickname");
61+
62+
63+
64+
String uuid = Uuids.getUUidFromUndashedString(jpremRecords.getString("uniqueId")).toString();
65+
String premiumId = jpremRecords.getString("premiumId") == null? null:
66+
Uuids.getUUidFromUndashedString(jpremRecords.getString("premiumId")).toString();
67+
String lastIp = jpremRecords.getString("lastAddress");
68+
String password = jpremRecords.getString("hashedPassword");
69+
70+
if(username == null || (premiumId == null && password == null) || storage.getPlayerMemory(username) != null){
71+
//Skip record if player already exists in database
72+
//Or if premium id and password are both null. indicating that the player has never joined the server
73+
continue;
74+
}
75+
if(password != null){
76+
password = password.replace("SHA256$", "JPREMIUM");
77+
}
78+
newRecords.setString(1, uuid);
79+
newRecords.setString(2, lastIp);
80+
newRecords.setString(3, password);
81+
newRecords.setString(4, username);
82+
newRecords.setString(5, premiumId);
83+
newRecords.setBoolean(6, true);
84+
newRecords.addBatch();
85+
count++;
86+
}
87+
sender.sendMessage(ChatColor.YELLOW+"Starting import..... This may take a while depending on the size of your database!\n" +
88+
count+" Records!");
89+
newRecords.executeBatch();
90+
sender.sendMessage(ChatColor.BLUE+"Database successfully imported!");
91+
sender.sendMessage(ChatColor.GREEN+"Reloading all data!");
92+
AdiAuth.reload();
93+
sender.sendMessage(ChatColor.GREEN+"Successfully reloaded!");
94+
jpremRecords.close();
95+
stmt.close();
96+
conn.close();
97+
newRecords.close();
98+
} else {
99+
sender.sendMessage(ChatColor.RED+"Invalid converter!");
100+
}
101+
} catch (Exception e){
102+
e.printStackTrace();
103+
sender.sendMessage(ChatColor.RED+"Error, please look in the console for info!");
104+
}
105+
}
106+
}

0 commit comments

Comments
 (0)