package net.jscanner.server.handler.impl; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Base64; import java.util.Random; import java.util.jar.JarFile; import net.jscanner.archive.Archive; import net.jscanner.archive.ArchiveScanner; import net.jscanner.archive.impl.ClassFile; import net.jscanner.archive.impl.JavaArchive; import net.jscanner.server.handler.RequestHandler; import net.sf.jmimemagic.Magic; import net.sf.jmimemagic.MagicException; import net.sf.jmimemagic.MagicMatchNotFoundException; import net.sf.jmimemagic.MagicParseException; /** * Represents the "/scan" directory on the web server. * * @author Desmond Jackson */ public class ScanHandler extends RequestHandler { @Override protected String execute() { return new ArchiveScanner(getArchive()).scan(postData); } /** * Gets the archive posted to the "/scan" directory. * * @return The archive posed to the "/scan" directory */ private Archive getArchive() { try { byte[] data = Base64.getDecoder().decode(postData.get("base64").get(0)); String suffix = Magic.getMagicMatch(data).getMimeType() .equalsIgnoreCase("application/zip") ? "jar" : "class"; File file = File.createTempFile(new Random().nextInt() + "", suffix); FileOutputStream fos = new FileOutputStream(file); fos.write(data); fos.close(); return suffix.equalsIgnoreCase("jar") ? new JavaArchive(new JarFile(file)) : new ClassFile(file); } catch (MagicParseException e) { e.printStackTrace(); } catch (MagicMatchNotFoundException e) { e.printStackTrace(); } catch (MagicException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }