· 6 years ago · Feb 14, 2019, 08:30 PM
1package forumvalidatemctest;
2
3import java.io.IOException;
4import java.io.OutputStream;
5import java.net.InetSocketAddress;
6import java.util.HashMap;
7import java.util.Map;
8import java.util.Map.Entry;
9import java.util.UUID;
10
11import org.bukkit.command.Command;
12import org.bukkit.command.CommandExecutor;
13import org.bukkit.command.CommandSender;
14import org.bukkit.entity.Player;
15import org.bukkit.plugin.java.JavaPlugin;
16
17import com.sun.net.httpserver.HttpExchange;
18import com.sun.net.httpserver.HttpHandler;
19import com.sun.net.httpserver.HttpServer;
20
21import net.md_5.bungee.api.ChatColor;
22import net.md_5.bungee.api.chat.ClickEvent;
23import net.md_5.bungee.api.chat.ClickEvent.Action;
24import net.md_5.bungee.api.chat.ComponentBuilder;
25import net.md_5.bungee.api.chat.HoverEvent;
26import net.md_5.bungee.api.chat.TextComponent;
27
28@SuppressWarnings("restriction")
29public class Main extends JavaPlugin implements HttpHandler, CommandExecutor {
30
31 private static Main _instance;
32
33 private Map<String, UUID> validatingMembers;
34 private Map<UUID, Object> waitObjects;
35 private Map<UUID, ResponseType> responses;
36
37 private HttpServer server;
38
39 @Override
40 public void onEnable() {
41 _instance = this;
42 System.out.println("Starting...");
43 validatingMembers = new HashMap<String, UUID>();
44 waitObjects = new HashMap<UUID, Object>();
45 responses = new HashMap<UUID, ResponseType>();
46
47 server = null;
48 try {
49 server = HttpServer.create(new InetSocketAddress("127.0.0.1", 8000), 0);
50 } catch (IOException e) {
51 // TODO Auto-generated catch block
52 e.printStackTrace();
53 }
54 server.createContext("/verify", this);
55 server.setExecutor(null); // creates a default executor
56 server.start();
57
58 getCommand("validate").setExecutor(this);
59
60 System.out.println("Started!");
61 }
62
63 @Override
64 public void onDisable() {
65 for (Object obj : waitObjects.values()) {
66 synchronized (obj) {
67 obj.notify();
68 }
69 }
70 server.stop(0);
71 System.out.println("Stopped!");
72 }
73
74 @Override
75 public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
76 System.out.println("Received Command!");
77 if (!(sender instanceof Player))return false;
78 Player player = (Player) sender;
79
80 String forumAccountID = getValidatorByUUID(player.getUniqueId());
81 if (forumAccountID == "" || !waitObjects.containsKey(player.getUniqueId())) {
82 player.spigot().sendMessage(new TextComponent(ChatColor.GRAY+"Your validation has expired!"));
83 validatingMembers.remove(forumAccountID);
84 responses.remove(player.getUniqueId());
85 return true;
86 }
87
88 if (args[0].equalsIgnoreCase("accept")) {
89 System.out.println("Accept Command!");
90 if (!finishValidation(forumAccountID,player)) {
91 player.spigot().sendMessage(new TextComponent(ChatColor.RED+"Your validation has been unsuccessfull!"));
92 }else {
93 player.spigot().sendMessage(new TextComponent(ChatColor.GOLD+"Your validation has been successfull!"));
94 }
95 return true;
96 }
97 if (args[0].equalsIgnoreCase("decline")) {
98 System.out.println("Decline Command!");
99 declineValidation(forumAccountID,player);
100 player.spigot().sendMessage(new TextComponent(ChatColor.GOLD+"You declined the validation successfully!"));
101 return true;
102 }
103 return true;
104 }
105
106 @Override
107 public void handle(com.sun.net.httpserver.HttpExchange t) throws IOException {
108 System.out.println("Received Incomming message!");
109 ReponseData response = null;
110 System.out.println("Method: "+t.getRequestMethod());
111 if (t.getRequestMethod().equalsIgnoreCase("GET")) {
112 response = GetResponse(t);
113 }else {
114 response = new ReponseData(404, "Not Found");
115 }
116 System.out.println("Code: "+response.StatusCode);
117 System.out.println("Message: "+response.Message);
118 t.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
119 t.sendResponseHeaders(response.StatusCode, response.Message.length());
120 OutputStream os = t.getResponseBody();
121 os.write(response.Message.getBytes());
122 os.close();
123 }
124
125 private ReponseData GetResponse(HttpExchange t) {
126 Map<String, String> params = queryToMap(t.getRequestURI().getQuery());
127 if (!params.containsKey("ign") || !params.containsKey("accountID") || !params.containsKey("secretKey"))return new ReponseData(422, "Args Missing");
128 Player player = _instance.getServer().getPlayerExact(params.get("ign"));
129 if (player == null)return new ReponseData(422, "Player Offline");
130
131 String memberId = params.get("accountID");
132
133 if (validatingMembers.containsKey(memberId))return new ReponseData(422, "Already Requested");
134
135 //Check if secretKey is valid with the account ID. (Needs to be implemented later.
136
137 TextComponent validateString = new TextComponent("someone tries to validate hes/her forum account with this account.\n");
138 validateString.setColor(ChatColor.GRAY);
139
140 TextComponent validateAccept = new TextComponent("Accept");
141 validateAccept.setColor(ChatColor.GREEN);
142 validateAccept.setClickEvent(new ClickEvent(Action.RUN_COMMAND, "/validate accept"));
143 validateAccept.setHoverEvent(new HoverEvent(net.md_5.bungee.api.chat.HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Click to accept the validation!" ).color(ChatColor.GREEN).create() ));
144
145 TextComponent validateDecline = new TextComponent("Decline");
146 validateDecline.setColor(ChatColor.RED);
147 validateDecline.setClickEvent(new ClickEvent(Action.RUN_COMMAND, "/validate decline"));
148 validateDecline.setHoverEvent(new HoverEvent(net.md_5.bungee.api.chat.HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Click to decline the validation!" ).color(ChatColor.RED).create() ));
149
150 validateString.addExtra(validateAccept);
151 validateString.addExtra(" ");
152 validateString.addExtra(validateDecline);
153
154 UUID existingUUID = validatingMembers.get(memberId);
155 if (existingUUID != null) {
156 validatingMembers.remove(memberId, existingUUID);
157 }
158
159 UUID uuid = player.getUniqueId();
160 validatingMembers.put(memberId, uuid);
161
162 synchronized (player) {
163 player.spigot().sendMessage(validateString);
164 }
165
166 Object obj = new Object();
167 waitObjects.put(uuid, obj);
168 synchronized (obj) {
169 try {
170 obj.wait(60000);
171 } catch (InterruptedException e) {}
172 }
173
174 validatingMembers.remove(memberId, uuid);
175 waitObjects.remove(uuid);
176
177 if (!responses.containsKey(uuid)) {
178 responses.remove(uuid);
179 return new ReponseData(408, "Timeout");
180 }
181
182 switch (responses.get(uuid)) {
183 case Timeout:
184 responses.remove(uuid);
185 return new ReponseData(408, "Timeout");
186 case Accepted:
187 responses.remove(uuid);
188 return new ReponseData(200, "Verified");
189 case Declined:
190 responses.remove(uuid);
191 return new ReponseData(200, "Declined");
192 }
193
194 responses.remove(uuid);
195 return new ReponseData(408, "Timeout");
196 }
197
198 public Map<String, String> queryToMap(String query) {
199 Map<String, String> result = new HashMap<String, String>();
200 for (String param : query.split("&")) {
201 String[] entry = param.split("=");
202 if (entry.length > 1) {
203 result.put(entry[0], entry[1]);
204 }else{
205 result.put(entry[0], "");
206 }
207 }
208 return result;
209 }
210
211 public Map<String,UUID> getValidatingMembers() {
212 return this.validatingMembers;
213 }
214
215 public String getValidatorByUUID(UUID uniqueId) {
216 for (Entry<String, UUID> entry : validatingMembers.entrySet()) {
217 if (entry.getValue().toString().equals(uniqueId.toString())) {
218 return entry.getKey();
219 }
220 }
221 return "";
222 }
223
224 public boolean finishValidation(String forumAccountID, Player player) {
225 validatingMembers.remove(forumAccountID, player.getUniqueId());
226 responses.remove(player.getUniqueId());
227 if (waitObjects.containsKey(player.getUniqueId())) {
228 responses.put(player.getUniqueId(), ResponseType.Accepted);
229 Object obj = waitObjects.get(player.getUniqueId());
230 synchronized (obj) {
231 obj.notify();
232 }
233 waitObjects.remove(player.getUniqueId());
234 }
235 return true;
236 }
237
238 public void declineValidation(String forumAccountID, Player player) {
239 validatingMembers.remove(forumAccountID, player.getUniqueId());
240 responses.remove(player.getUniqueId());
241 if (waitObjects.containsKey(player.getUniqueId())) {
242 responses.put(player.getUniqueId(), ResponseType.Declined);
243 Object obj = waitObjects.get(player.getUniqueId());
244 synchronized (obj) {
245 obj.notify();
246 }
247 waitObjects.remove(player.getUniqueId());
248 }
249 }
250
251 private class ReponseData {
252 public int StatusCode;
253 public String Message;
254
255 public ReponseData(int statusCode, String message) {
256 StatusCode = statusCode;
257 Message = message;
258 }
259 }
260}