package kubach.workers; import com.esotericsoftware.kryonet.Client; import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.Listener; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import javax.swing.SwingWorker; import kubach.ConfigManager; import kubach.Constants; import kubach.ac.CCLoader; import kubach.gui.WhiteListChecker; import kubach.packet.PacketAddItemToWL; import kubach.packet.PacketBadWLItems; import kubach.packet.PacketCaptchaImage; import kubach.packet.PacketChangePassword; import kubach.packet.PacketChangePasswordResponse; import kubach.packet.PacketFilesList; import kubach.packet.PacketFilesListRequest; import kubach.packet.PacketLogin; import kubach.packet.PacketLoginResponse; import kubach.packet.PacketRegister; import kubach.packet.PacketRegistered; import kubach.packet.PacketRequestCaptcha; import kubach.packet.PacketWLData; import kubach.packet.PacketWLRequestRealm; import kubach.workers.WLCheckWorker.WLCheckState; /** * Doing check in whitelist * * @author Cr0s */ public class WLCheckWorker extends SwingWorker<Void, WLCheckState> { public WhiteListChecker wc; public String username, session; public WLCheckWorker(WhiteListChecker wc, String username, String session) { //System.setSecurityManager(new NullSecurityManager()); this.wc = wc; this.username = username; this.session = session; System.setSecurityManager(null); } @Override protected Void doInBackground() throws Exception { final int BUFFER_SIZE = 64000; Client client = new Client(BUFFER_SIZE, BUFFER_SIZE); client.getKryo().register(PacketLogin.class); client.getKryo().register(PacketLoginResponse.class); client.getKryo().register(PacketRequestCaptcha.class); client.getKryo().register(PacketCaptchaImage.class); client.getKryo().register(byte[].class); client.getKryo().register(PacketRegister.class); client.getKryo().register(PacketRegistered.class); client.getKryo().register(PacketFilesListRequest.class); client.getKryo().register(PacketFilesList.class); client.getKryo().register(String[].class); client.getKryo().register(PacketChangePassword.class); client.getKryo().register(PacketChangePasswordResponse.class); client.getKryo().register(PacketWLRequestRealm.class); client.getKryo().register(PacketWLData.class); client.getKryo().register(PacketAddItemToWL.class); client.getKryo().register(PacketBadWLItems.class); client.addListener(new Listener() { @Override public void received(Connection connection, Object object) { if (object instanceof PacketWLRequestRealm) { PacketWLRequestRealm p = (PacketWLRequestRealm) object; doCheckStep(connection, p.realm); } else if (object instanceof PacketBadWLItems) { publish(new WLCheckState((PacketBadWLItems) object)); connection.close(); } } }); client.start(); try { client.connect(5000, Constants.SERVER_HOST, Constants.SERVER_PORT); } catch (Exception e) { e.printStackTrace(); return null; } PacketWLRequestRealm pwlrr = new PacketWLRequestRealm(); pwlrr.username = this.username; pwlrr.session = this.session; client.sendTCP(pwlrr); return null; } private void doCheckStep(Connection cnn, String realm) { CCLoader loader = new CCLoader(); final int BUFFER_SIZE = 4096; BufferedInputStream bis = null; try { String addr = ConfigManager.getInstance().getProperties().getProperty("nativecheckurl"); URL url = new URL(addr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("User-Agent", "User-Agent: Kubach v" + Constants.VERSION); int totalDataRead = 0; bis = new BufferedInputStream(connection.getInputStream()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (BufferedOutputStream bos = new BufferedOutputStream(baos, BUFFER_SIZE)) { byte[] data = new byte[BUFFER_SIZE]; int i = 0; while ((i = bis.read(data)) != -1) { totalDataRead = totalDataRead + i; baos.write(data, 0, i); } loader.setClassContent(baos.toByteArray()); try { Class clazz = loader.findClass("kubach.ac.NativeCheck"); try { try { Object obj = clazz.newInstance(); PacketWLData response = new PacketWLData(); response.data = (String) clazz.getDeclaredMethod("doCheck", String.class).invoke(obj, realm); response.prefix = ConfigManager.getInstance().getClientPrefix(); response.session = this.session; response.username = this.username; cnn.sendTCP(response); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { ex.printStackTrace(); } } catch (NoSuchMethodException | SecurityException ex) { ex.printStackTrace(); } } catch (ClassNotFoundException ex) { ex.printStackTrace(); } } } catch (IOException ex) { ex.printStackTrace(); } finally { try { if (bis != null) { bis.close(); } } catch (IOException ex) { ex.printStackTrace(); } } } public class WLCheckState { public PacketBadWLItems p; public WLCheckState(PacketBadWLItems p) { this.p = p; } } @Override protected void process(List<WLCheckState> l) { for (WLCheckState state : l) { this.wc.parseCheckResult(state); } } }