Advertisement
Evyatar12

VoteListener.java

Mar 11th, 2015
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.25 KB | None | 0 0
  1. /*** Eclipse Class Decompiler plugin, copyright (c) 2012 Chao Chen (cnfree2000@hotmail.com) ***/
  2. package com.vexsoftware.votifier.net;
  3.  
  4. import com.vexsoftware.votifier.Votifier;
  5. import com.vexsoftware.votifier.crypto.RSA;
  6. import com.vexsoftware.votifier.model.Vote;
  7. import com.vexsoftware.votifier.model.VoteListener;
  8. import com.vexsoftware.votifier.model.VotifierEvent;
  9. import java.io.BufferedWriter;
  10. import java.io.InputStream;
  11. import java.io.OutputStreamWriter;
  12. import java.net.InetSocketAddress;
  13. import java.net.ServerSocket;
  14. import java.net.Socket;
  15. import java.net.SocketException;
  16. import java.security.KeyPair;
  17. import java.util.logging.Level;
  18. import java.util.logging.Logger;
  19. import javax.crypto.BadPaddingException;
  20. import org.bukkit.Bukkit;
  21. import org.bukkit.Server;
  22. import org.bukkit.plugin.PluginManager;
  23. import org.bukkit.scheduler.BukkitScheduler;
  24.  
  25. public class VoteReceiver extends Thread {
  26.     private static final Logger LOG = Logger.getLogger("Votifier");
  27.     private final Votifier plugin;
  28.     private final String host;
  29.     private final int port;
  30.     private ServerSocket server;
  31.     private boolean running = true;
  32.  
  33.     public VoteReceiver(Votifier plugin, String host, int port)
  34.             throws Exception {
  35.         this.plugin = plugin;
  36.         this.host = host;
  37.         this.port = port;
  38.  
  39.         initialize();
  40.     }
  41.  
  42.     private void initialize() throws Exception {
  43.         try {
  44.             this.server = new ServerSocket();
  45.             this.server.bind(new InetSocketAddress(this.host, this.port));
  46.         } catch (Exception ex) {
  47.             LOG.log(Level.SEVERE,
  48.                     "Error initializing vote receiver. Please verify that the configured");
  49.  
  50.             LOG.log(Level.SEVERE,
  51.                     "IP address and port are not already in use. This is a common problem");
  52.  
  53.             LOG.log(Level.SEVERE,
  54.                     "with hosting services and, if so, you should check with your hosting provider.",
  55.                     ex);
  56.  
  57.             throw new Exception(ex);
  58.         }
  59.     }
  60.  
  61.     public void shutdown() {
  62.         this.running = false;
  63.         if (this.server == null)
  64.             return;
  65.         try {
  66.             this.server.close();
  67.         } catch (Exception ex) {
  68.             LOG.log(Level.WARNING, "Unable to shut down vote receiver cleanly.");
  69.         }
  70.     }
  71.  
  72.     public void run() {
  73.         while (this.running)
  74.             try {
  75.                 Socket socket = this.server.accept();
  76.                 socket.setSoTimeout(5000);
  77.                 BufferedWriter writer = new BufferedWriter(
  78.                         new OutputStreamWriter(socket.getOutputStream()));
  79.  
  80.                 InputStream in = socket.getInputStream();
  81.  
  82.                 writer.write(new StringBuilder().append("VOTIFIER ")
  83.                         .append(Votifier.getInstance().getVersion()).toString());
  84.                 writer.newLine();
  85.                 writer.flush();
  86.  
  87.                 byte[] block = new byte[256];
  88.                 in.read(block, 0, block.length);
  89.  
  90.                 block = RSA.decrypt(block, Votifier.getInstance().getKeyPair()
  91.                         .getPrivate());
  92.  
  93.                 int position = 0;
  94.  
  95.                 String opcode = readString(block, position);
  96.                 position += opcode.length() + 1;
  97.                 if (!(opcode.equals("VOTE"))) {
  98.                     throw new Exception("Unable to decode RSA");
  99.                 }
  100.  
  101.                 String serviceName = readString(block, position);
  102.                 position += serviceName.length() + 1;
  103.                 String username = readString(block, position);
  104.                 position += username.length() + 1;
  105.                 String address = readString(block, position);
  106.                 position += address.length() + 1;
  107.                 String timeStamp = readString(block, position);
  108.                 position += timeStamp.length() + 1;
  109.  
  110.                 Vote vote = new Vote();
  111.                 vote.setServiceName(serviceName);
  112.                 vote.setUsername(username);
  113.                 vote.setAddress(address);
  114.                 vote.setTimeStamp(timeStamp);
  115.  
  116.                 if (this.plugin.isDebug()) {
  117.                     LOG.info(new StringBuilder()
  118.                             .append("Received vote record -> ").append(vote)
  119.                             .toString());
  120.                 }
  121.  
  122.                 for (VoteListener listener : Votifier.getInstance()
  123.                         .getListeners()) {
  124.                     try {
  125.                         listener.voteMade(vote);
  126.                     } catch (Exception ex) {
  127.                         String vlName = listener.getClass().getSimpleName();
  128.                         LOG.log(Level.WARNING,
  129.                                 new StringBuilder()
  130.                                         .append("Exception caught while sending the vote notification to the '")
  131.                                         .append(vlName).append("' listener")
  132.                                         .toString(), ex);
  133.                     }
  134.  
  135.                 }
  136.  
  137.                 this.plugin
  138.                         .getServer()
  139.                         .getScheduler()
  140.                         .scheduleSyncDelayedTask(this.plugin,
  141.                                 new Runnable(vote) {
  142.                                     public void run() {
  143.                                         Bukkit.getServer()
  144.                                                 .getPluginManager()
  145.                                                 .callEvent(
  146.                                                         new VotifierEvent(
  147.                                                                 this.val$vote));
  148.                                     }
  149.                                 });
  150.                 writer.close();
  151.                 in.close();
  152.                 socket.close();
  153.             } catch (SocketException ex) {
  154.                 LOG.log(Level.WARNING,
  155.                         new StringBuilder()
  156.                                 .append("Protocol error. Ignoring packet - ")
  157.                                 .append(ex.getLocalizedMessage()).toString());
  158.             } catch (BadPaddingException ex) {
  159.                 LOG.log(Level.WARNING,
  160.                         "Unable to decrypt vote record. Make sure that that your public key");
  161.  
  162.                 LOG.log(Level.WARNING,
  163.                         "matches the one you gave the server list.", ex);
  164.             } catch (Exception ex) {
  165.                 LOG.log(Level.WARNING,
  166.                         "Exception caught while receiving a vote notification",
  167.                         ex);
  168.             }
  169.     }
  170.  
  171.     private String readString(byte[] data, int offset) {
  172.         StringBuilder builder = new StringBuilder();
  173.         for (int i = offset; i < data.length; ++i) {
  174.             if (data[i] == 10)
  175.                 break;
  176.             builder.append((char) data[i]);
  177.         }
  178.         return builder.toString();
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement