From 83cdb1a7e023473bc8001fd635660868490b7c2d Mon Sep 17 00:00:00 2001 From: Dominique Blouin <dominique.blouin@telecom-paristech.fr> Date: Mon, 15 Jun 2015 07:42:51 +0000 Subject: [PATCH] change sql query with preparestatement; display diagram --- bin/config.xml | 2 +- crawler/bin/client.jar | Bin 23993 -> 26514 bytes crawler/bin/crawler.jar | Bin 23994 -> 26515 bytes crawler/bin/derby.log | 31 +- .../src/myutil/externalSearch/Message.java | 37 ++- crawler/src/web/crawler/Client.java | 98 ++++-- .../src/web/crawler/Data_visualisation.java | 176 ++++++++--- .../src/web/crawler/Database_creation.java | 94 +++++- crawler/src/web/crawler/Database_query.java | 175 ++++++++--- crawler/src/web/crawler/File_management.java | 201 ++++++++---- .../src/web/crawler/MultiThreadServer.java | 34 +- crawler/src/web/crawler/WebCrawler.java | 28 +- src/myutil/GoogleSearch.java | 34 +- src/myutil/externalSearch/Client.java | 16 +- src/myutil/externalSearch/Message.java | 37 ++- src/ui/window/JDialogSearchBox.java | 291 ++++++++++++------ 16 files changed, 901 insertions(+), 353 deletions(-) diff --git a/bin/config.xml b/bin/config.xml index 66b674926f..ebd7b06feb 100755 --- a/bin/config.xml +++ b/bin/config.xml @@ -65,7 +65,7 @@ <ExternalServer data="localhost:12345"/> -<LastWindowAttributes x="468" y="59" width="788" height="597" max="false" /> +<LastWindowAttributes x="358" y="70" width="792" height="597" max="false" /> </TURTLECONFIGURATION> diff --git a/crawler/bin/client.jar b/crawler/bin/client.jar index a757d749e3595c6efe45608fdcc32b24c7e34bdb..7a797df0f521b4ba6b0f9ab08560ea3f72d9a416 100644 GIT binary patch delta 24505 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 O`vn>bioE^*wEh>JoMq4e delta 21928 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 diff --git a/crawler/bin/crawler.jar b/crawler/bin/crawler.jar index d18b857d1739146b7e24ffc9418cb229da1dafa4..338302e499732d197f25d490fb9ad9cce4944b00 100755 GIT binary patch delta 24484 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 BW@-Qc delta 21928 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 diff --git a/crawler/bin/derby.log b/crawler/bin/derby.log index ebb67fadcb..9493992d9a 100755 --- a/crawler/bin/derby.log +++ b/crawler/bin/derby.log @@ -1,17 +1,14 @@ -Fri Jun 12 11:32:26 CEST 2015 : Could not listen on port 1527 on host 127.0.0.1: - java.net.BindException: Address already in use -An exception was thrown during network server startup. DRDA_ListenPort.S:Could not listen on port 1527 on host 127.0.0.1: - java.net.BindException: Address already in use -java.lang.reflect.InvocationTargetException - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - at java.lang.reflect.Method.invoke(Method.java:606) - at org.apache.derby.iapi.jdbc.DRDAServerStarter.run(Unknown Source) - at java.lang.Thread.run(Thread.java:745) -Caused by: java.lang.Exception: DRDA_ListenPort.S:Could not listen on port 1527 on host 127.0.0.1: - java.net.BindException: Address already in use - at org.apache.derby.impl.drda.NetworkServerControlImpl.consolePropertyMessageWork(Unknown Source) - at org.apache.derby.impl.drda.NetworkServerControlImpl.consolePropertyMessage(Unknown Source) - at org.apache.derby.impl.drda.NetworkServerControlImpl.blockingStart(Unknown Source) - ... 6 more +Mon Jun 15 00:29:33 CEST 2015 : Apache Derby Network Server - 10.8.3.0 - (1405108) started and ready to accept connections on port 1527 +---------------------------------------------------------------- +Mon Jun 15 00:29:34 CEST 2015: +Booting Derby version The Apache Software Foundation - Apache Derby - 10.8.3.0 - (1405108): instance a816c00e-014d-f431-2f30-000002d6fbe8 +on database directory /home/trhuy/TURTLE/crawler/bin/MyDatabase with class loader sun.misc.Launcher$AppClassLoader@3c7bf4c3 +Loaded from file:/home/trhuy/TURTLE/crawler/bin/derby.jar +java.vendor=Oracle Corporation +java.runtime.version=1.7.0_79-b14 +user.dir=/home/trhuy/TURTLE/crawler/bin +os.name=Linux +os.arch=amd64 +os.version=3.13.0-37-generic +derby.system.home=null +Database Class Loader started - derby.database.classpath='' diff --git a/crawler/src/myutil/externalSearch/Message.java b/crawler/src/myutil/externalSearch/Message.java index 5da8716d25..4fd15167ab 100644 --- a/crawler/src/myutil/externalSearch/Message.java +++ b/crawler/src/myutil/externalSearch/Message.java @@ -77,6 +77,10 @@ public class Message implements Serializable { public static String PIC_SRC = "server_visualisation.png"; public static String PIC_DES = "client_visualisation.png"; + public static String PIC_SRC_HIST = "server_visualisation_Hist.png"; + public static String PIC_SRC_STAT = "server_visualisation.png"; + public static String PIC_DES_STAT = "client_visualisation_Stat.png"; + public static String PIC_DES_HIST = "client_visualisation_Hist.png"; public static String ERR_CMD = "Message command is empty\n"; public static String ERR_CMD2 = "Wrong message command\n"; @@ -206,11 +210,19 @@ public class Message implements Serializable { } - public static byte[] convertImageToByte(){ + public static byte[] convertImageToByte(Message msg){ byte[] imgByte = null; + BufferedImage img; try { - BufferedImage img = ImageIO.read(new File(PIC_SRC)); + if(msg.getCmd().equals("stat")) + { + img = ImageIO.read(new File(PIC_SRC_STAT)); + } + else + { + img = ImageIO.read(new File(PIC_SRC_HIST)); + } try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { ImageIO.write(img, "png", baos); @@ -219,7 +231,8 @@ public class Message implements Serializable { } } catch (IOException e) { - System.out.println("Image can't not be found!"); + // TODO Auto-generated catch block + System.out.println("Image can't not be found!\n"); } System.out.println("Image has been converted successfully!"); @@ -228,20 +241,26 @@ public class Message implements Serializable { } //a function to convert a string byte to an image - public static void convertByteToImage(byte[] imgByte){ + public static void convertByteToImage(byte[] imgByte,Message msg){ if (imgByte != null){ InputStream inStream = new ByteArrayInputStream(imgByte); try { BufferedImage img = ImageIO.read(inStream); - - ImageIO.write(img, "png", new File(PIC_DES)); - //System.out.println("Image has been created successfully!"); - + if(msg.getCmd().equals(RESULT_STATISTIC)) + { + ImageIO.write(img, "png", new File(PIC_DES_STAT)); + } + else + { + ImageIO.write(img, "png", new File(PIC_DES_HIST)); + } + System.out.println("Image has been created successfully!\n"); } catch (IOException e) { - // System.out.println("Image can't not be created!"); + // TODO Auto-generated catch block + System.out.println("Image can't not be created!\n"); } } diff --git a/crawler/src/web/crawler/Client.java b/crawler/src/web/crawler/Client.java index b7bc9c2230..371e65530b 100644 --- a/crawler/src/web/crawler/Client.java +++ b/crawler/src/web/crawler/Client.java @@ -18,15 +18,27 @@ import org.apache.commons.io.FileUtils; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; - +/** + * + * @author Marie FORRAT & Angeliki AKTYPI & Dan Huynh VO + */ public class Client { - + /** + * + * @param cmd + * @param options + * @param values + * @return + */ public static Message createRequestMessage(String cmd, ArrayList<String> options, ArrayList<String> values) { Message requestMsg = new Message(cmd, options, values); System.out.println("\n" + Message.SUC_CREATE_REQ_MESSAGE); return requestMsg; } - + /** + * + * @param answerMsg + */ public static void analyseAnswerMessage(Message answerMsg) { //Analyse the message from the server, //Depends on the cmd, we can determine the values @@ -38,8 +50,6 @@ public class Client { } else if (cmd.equals(Message.RESULT_SEARCH)) { - //show GUI for search - //Call Huy's function ArrayList<Object> res = new ArrayList(); res = answerMsg.getContent(); System.out.println("\n"+res); @@ -47,8 +57,6 @@ public class Client { } else if (cmd.equals(Message.RESULT_DETAIL)) { - //show GUI for detail of a specific record - //Call Huy's function ArrayList<Object> res = new ArrayList(); res = answerMsg.getContent(); System.out.println("\n"+res); @@ -57,17 +65,26 @@ public class Client { else if (cmd.equals(Message.RESULT_STATISTIC)) { + ArrayList<Object> resultContent = new ArrayList(); + resultContent = answerMsg.getContent(); + byte[] imgByte = (byte[]) resultContent.get(0); + Message.convertByteToImage(imgByte,answerMsg); + + //Call Huy's function to load Image + } + + else if (cmd.equals(Message.RESULT_HISTOGRAM)) { + //Show picture-Use a function to convert binary to image - //Message.convertByteToImage(answerMsg.getImageByte()); - + //Message.convertByteToImage(answerMsg.getImageByte()); + ArrayList<Object> resultContent = new ArrayList(); resultContent = answerMsg.getContent(); byte[] imgByte = (byte[]) resultContent.get(0); - Message.convertByteToImage(imgByte); + Message.convertByteToImage(imgByte,answerMsg); //Call Huy's function to load Image - } - + } else { System.out.print(Message.ERR_CMD2); } @@ -78,10 +95,10 @@ public class Client { SSLSocket client = null; try { - SSLSocketFactory sslSocketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault(); - client = (SSLSocket)sslSocketFactory.createSocket("LocalHost",12345); + SSLSocketFactory sslSocketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault(); + client = (SSLSocket)sslSocketFactory.createSocket("LocalHost",12345); - client.setEnabledCipherSuites(client.getSupportedCipherSuites()); + client.setEnabledCipherSuites(client.getSupportedCipherSuites()); System.out.println("Client has been created successfully!"); @@ -108,23 +125,24 @@ public class Client { while (true) { if (cmd.equals(Message.CMD_SEARCH)) { - + options.add(Message.OPTION_KEY_WORDS); options.add(Message.OPTION_YEAR); + options.add(Message.OPTION_SCORE); options.add(Message.OPTION_SYSTEM); options.add(Message.OPTION_NUMBER); - - System.out.println("Insert the keyword, the year, " + + System.out.println("Insert the keyword, the year, the score " +"the system and the number of results that you wish."); - System.out.println("Example:buffer%overflow 2015 linux 10\n"); + System.out.println("Example:buffer-injection this-year linux 4-5 10\n"); String arguments = br.readLine(); String[] argument = arguments.split(" "); - - for (int i = 0; i < 4; i++) { + + for (int i = 0; i < 5; i++) { //System.out.println(argument[i]); values.add(argument[i]); - } + } break; } @@ -140,22 +158,40 @@ public class Client { //Creat a statistic image request else if (cmd.equals(Message.CMD_STATISTIC)) { - + options.add(Message.OPTION_KEY_WORDS); - - System.out.println("Insert the systems that you wish " - +"to be statistically examined."); + + System.out.println("Insert the systems that you wish " + +"to be statistically examined."); System.out.println("Example:linux apache chrome windows sql\n"); String arguments = br.readLine(); - String[] argument = arguments.split(" "); - + values.add(arguments); + //String[] argument = arguments.split(" "); + + /* for (int i = 0; i < argument.length; i++) { + //System.out.println(argument[i]); + values.add(argument[i]); + }*/ + break; + } + else if (cmd.equals(Message.CMD_HISTOGRAM)) { + + options.add(Message.OPTION_KEY_WORDS); + + System.out.println("Insert one system that you wish " + +"to be statistically examined."); + System.out.println("Example:linux\n"); + String arguments = br.readLine(); + /* String[] argument = arguments.split(" "); + for (int i = 0; i < argument.length; i++) { //System.out.println(argument[i]); values.add(argument[i]); - } + }*/ + values.add(arguments); break; - } - + } + else { System.out.print(Message.ERR_CMD2); break; diff --git a/crawler/src/web/crawler/Data_visualisation.java b/crawler/src/web/crawler/Data_visualisation.java index 5c11963958..d9c34af1b3 100644 --- a/crawler/src/web/crawler/Data_visualisation.java +++ b/crawler/src/web/crawler/Data_visualisation.java @@ -9,83 +9,175 @@ import com.panayotis.gnuplot.JavaPlot; import com.panayotis.gnuplot.plot.DataSetPlot; import com.panayotis.gnuplot.style.PlotStyle; import com.panayotis.gnuplot.style.Style; +import com.panayotis.gnuplot.terminal.ImageTerminal; import java.awt.AWTException; -import java.awt.Component; -import java.awt.Rectangle; -import java.awt.Robot; +import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.sql.Array; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; import javax.swing.JFrame; import javax.swing.JLabel; -import myutil.externalSearch.Message; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import org.mcavallo.opencloud.Cloud; import org.mcavallo.opencloud.Tag; import javax.imageio.ImageIO; import static javax.imageio.ImageIO.write; +import static javax.swing.WindowConstants.HIDE_ON_CLOSE; + +import myutil.externalSearch.Message; + + +/** + * Implement all the graphs that can be generated according to data in a database db, used in the constructor of the class + * @author Marie FORRAT & Angeliki AKTYPI + */ public class Data_visualisation { private web.crawler.Database_creation database; - + + /** + * + * @param db database you want to do the query on + */ public Data_visualisation(web.crawler.Database_creation db) { this.database = db; } - - public void Histogram() throws IOException, SQLException, AWTException { + + /** + * Generate an histogram graph by searching the number of time the vulnerability is conerning a keyword(parameter) since 3 years ago + * @param keyword the keyword you want to do statistic with + * @throws IOException + * @throws SQLException + * @throws AWTException + */ + public void Histogram(String keyword) throws IOException, SQLException, AWTException { ResultSet rs; String querySQL; - - querySQL = "SELECT * FROM VULNERABILITIES WHERE ACCESS_COMPLEXITY LIKE '%LOW%' "; - rs = database.executestatement(querySQL); + /** + * Do all the query necessary to have the data + */ + String thisyear = new SimpleDateFormat("yyyy").format(new Date()); + String year1 = Integer.toString(Integer.valueOf(thisyear)-1); + String year2 = Integer.toString(Integer.valueOf(thisyear)-2); + String year3 = Integer.toString(Integer.valueOf(thisyear)-3); + String year4 = Integer.toString(Integer.valueOf(thisyear)-4); + querySQL = "SELECT * FROM SOFTWARES WHERE NAME LIKE ? AND CVE_ID LIKE ?"; + + + PreparedStatement prep = this.database.getconn().prepareStatement(querySQL); + prep.setString(1,"%"+keyword+"%"); + prep.setString(2,"%"+year3+"%"); + rs = prep.executeQuery(); + int Records = 0; while (rs.next()) { - //System.out.println(Records); Records++; } - - querySQL = "SELECT * FROM VULNERABILITIES WHERE ACCESS_COMPLEXITY LIKE '%MEDIUM%' "; - rs = database.executestatement(querySQL); + PreparedStatement prep1 = this.database.getconn().prepareStatement(querySQL); + prep1.setString(1,"%"+keyword+"%"); + prep1.setString(2,"%"+year2+"%"); + rs = prep1.executeQuery(); + int Records1 = 0; while (rs.next()) { - // System.out.println(Records1); Records1++; } - querySQL = "SELECT * FROM VULNERABILITIES WHERE ACCESS_COMPLEXITY LIKE '%HIGH%' "; - rs = database.executestatement(querySQL); + PreparedStatement prep2 = this.database.getconn().prepareStatement(querySQL); + prep2.setString(1,"%"+keyword+"%"); + prep2.setString(2,"%"+year1+"%"); + rs = prep2.executeQuery(); + int Records2 = 0; while (rs.next()) { - // System.out.println(Records2); Records2++; } - + PreparedStatement prep3 = this.database.getconn().prepareStatement(querySQL); + prep3.setString(1,"%"+keyword+"%"); + prep3.setString(2,"%"+thisyear+"%"); + rs = prep3.executeQuery(); + + int Records3 = 0; + while (rs.next()) { + Records3++; + } +/** + * Preparation to save the plot after its generation + */ + ImageTerminal png = new ImageTerminal(); + File file = new File(Message.PIC_SRC_HIST); + try { + file.createNewFile(); + png.processOutput(new FileInputStream(file)); + } catch (FileNotFoundException ex) { + System.err.print(ex); + } catch (IOException ex) { + System.err.print(ex); + } + /** + * Generate the plot + */ JavaPlot p = new JavaPlot(); - int[][] pointpoint = {{0, 0}, {1, Records}, {2, Records1}, {3, Records2}, {4, 0}}; + p.setTerminal(png); + int y4=Integer.parseInt(year4); + int y3=Integer.parseInt(year3); + int y2=Integer.parseInt(year2); + int y1=Integer.parseInt(year1); + int y0=Integer.parseInt(thisyear); + int[][] pointpoint = {{y4, 0}, {y3, Records}, {y2, Records1}, {y1, Records2}, {y0, Records3}}; PlotStyle myPlotStyle = new PlotStyle(); - myPlotStyle.setStyle(Style.FSTEPS); + myPlotStyle.setStyle(Style.HISTEPS); + myPlotStyle.setLineType(3); DataSetPlot s = new DataSetPlot(pointpoint); - myPlotStyle.setLineWidth(1); + myPlotStyle.setLineWidth(2); s.setPlotStyle(myPlotStyle); - s.setTitle("Complexity of the vulnerabilities, 1 is low 2 is medium and 3 is high"); - + s.setTitle("Number of CVEs for "+keyword+" since 3 years ago"); + p.addPlot(s); - + p.getAxis("x").setBoundaries(2011, 2016); + double[][] pointpoint1 = {{2011, 0}, {2012.5, Records}, {2013.5, Records1}, {2014.5, Records2}, {2015.5, Records3}}; + PlotStyle myPlotStyle1 = new PlotStyle(); myPlotStyle1.setStyle(Style.IMPULSES); - DataSetPlot s1 = new DataSetPlot(pointpoint); - myPlotStyle.setLineWidth(1); + DataSetPlot s1 = new DataSetPlot(pointpoint1); + myPlotStyle1.setLineType(3); + myPlotStyle1.setLineWidth(2); s1.setPlotStyle(myPlotStyle1); + s1.setTitle(""); p.addPlot(s1); p.plot(); + + /** + * Save the plot + */ + try { + ImageIO.write(png.getImage(), "png", file); + } catch (IOException ex) { + System.err.print(ex); + } + } - - public void OpenCloud(ArrayList<String> argumentsfromclient) throws IOException, SQLException, AWTException { - + + /** + * Generate the opencloud graph, generate different size for keyword according to their importance in the database + * @param argumentsfromclient list of keyword to use for generating the graph + * @throws IOException + * @throws SQLException + * @throws AWTException + */ + public void OpenCloud(String argumentsfromclient) throws IOException, SQLException, AWTException { + ResultSet rs; String querySQL; JFrame frame = new JFrame(); @@ -93,19 +185,23 @@ public class Data_visualisation { JPanel panel = new JPanel(); Cloud cloud = new Cloud(); cloud.setMaxWeight(25.0); - - for (int i = 0; i < argumentsfromclient.size(); i++) { - querySQL = "SELECT * FROM SOFTWARES WHERE NAME LIKE '%" + argumentsfromclient.get(i) + "%' "; - rs = database.executestatement(querySQL); + ArrayList<String> arguments= new ArrayList <String>(Arrays.asList(argumentsfromclient.split(" "))); + for (int i = 0; i < arguments.size(); i++) { + querySQL = "SELECT * FROM SOFTWARES WHERE NAME LIKE ?"; + // rs = database.executestatement(querySQL); + + PreparedStatement prep = this.database.getconn().prepareStatement(querySQL); + prep.setString(1,"%"+arguments.get(i)+"%"); + rs = prep.executeQuery(); int Records = 0; while (rs.next()) { // System.out.println(Records1); Records++; } //System.out.println(argumentsfromclient.get(i) + Records); - cloud.addTag(new Tag(argumentsfromclient.get(i), Records)); + cloud.addTag(new Tag(arguments.get(i), Records)); } - + for (Tag tag : cloud.tags()) { final JLabel label = new JLabel(tag.getName()); label.setOpaque(false); @@ -118,12 +214,14 @@ public class Data_visualisation { frame.setSize(1000, 800); frame.setVisible(true); BufferedImage bi = getJframeScreenShot(frame); - write(bi, "png", new File(Message.PIC_SRC)); + write(bi, "png", new File(Message.PIC_SRC_STAT)); + frame.setDefaultCloseOperation(HIDE_ON_CLOSE);//TO not close the program while exiting the Jframe + frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));// TO close the jframe after the screeshot } - + private BufferedImage getJframeScreenShot(JFrame panel) { BufferedImage bi = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB); panel.paint(bi.getGraphics()); return bi; } -} +} \ No newline at end of file diff --git a/crawler/src/web/crawler/Database_creation.java b/crawler/src/web/crawler/Database_creation.java index f051c019b0..c250421ef7 100644 --- a/crawler/src/web/crawler/Database_creation.java +++ b/crawler/src/web/crawler/Database_creation.java @@ -3,6 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ + package web.crawler; import java.awt.AWTException; @@ -16,6 +17,10 @@ import java.sql.ResultSet; import java.sql.SQLException; import org.apache.derby.drda.NetworkServerControl; +/** + * All the function necessary for the creation of the database, creation of tables in the database and the storage of this databse + * @author Marie FORRAT & Angeliki AKTYPI + */ public class Database_creation { /* Global variables */ @@ -26,32 +31,78 @@ public class Database_creation { private int TotalRecordsInDatabase = 0; private static String DatabasePath = System.getProperty("user.dir"); + + /** + * Path to retrieve a former vulnerabilities table + */ public static File VulnerabilitesSqlFile = new File(DatabasePath + "//vulnerabilites.sql"); + + /** + *Path to retrieve a former reference table + */ public static File ReferencesSqlFile = new File(DatabasePath + "//references.sql"); + + /** + *Path to retrieve a former software table + */ public static File SoftwaresSqlFile = new File(DatabasePath + "//softwares.sql"); + /** + * Execute an SQL statement on the database. Be careful, this method does not protect of SQL injection + * @param SQLquery the query you want to execute on the database + * @return the result of the query + * @throws SQLException + */ public ResultSet executestatement(String SQLquery) throws SQLException { ResultSet rs = stmt.executeQuery(SQLquery); return rs; } + /** + * set method to set the total recods in the database + * @param n integer + */ public void setTotalRecordsInDatabase(int n) { TotalRecordsInDatabase = n; } - public int getTotalRecordsInDatabase() { + /** + * get method to get the number of total recods in the table vulnerabilities + * @return the total number of record in vulnerabilities table + * @throws SQLException + */ + public int getTotalRecordsInDatabase() throws SQLException { + + int TotalRecordsInDatabase = 0; + ResultSet rs = stmt.executeQuery("SELECT * FROM VULNERABILITIES"); + + while (rs.next()) { + TotalRecordsInDatabase++; + } return TotalRecordsInDatabase; } + /** + * Return the parameter connection of the databse + * @return connection + */ public Connection getconn() { return conn; } + /** + * + * @return + */ public java.sql.Statement getstmt() { return stmt; } + /** + * Print the table vulnerabilities int the output + * @throws SQLException + */ public void PrintDatabase() throws SQLException { int Records = 0; ResultSet rs = stmt.executeQuery("SELECT * FROM VULNERABILITIES"); @@ -70,6 +121,10 @@ public class Database_creation { } } + /** + * Clear outputs of the console + * @throws AWTException + */ public void ClearOutputs() throws AWTException { /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ /* Clear console */ @@ -82,20 +137,21 @@ public class Database_creation { /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ } - public int CountRowsInDatabase() throws SQLException { - int Records = 0; - ResultSet rs = stmt.executeQuery("SELECT * FROM VULNERABILITIES"); - // Count rows in the table VULNERABILITIES - while (rs.next()) { - Records++; - } - - return (Records); - } + /** + * Create the database + * @throws ClassNotFoundException + * @throws InstantiationException + * @throws IllegalAccessException + * @throws Exception + */ public void CreateDatabase() throws ClassNotFoundException, InstantiationException, IllegalAccessException, Exception { - String url = "jdbc:derby://localhost:1527/MyDatabase;create=true;user=root;password=1234"; + + /** + * Information for creating the database + */ + String url = "jdbc:derby://localhost:1527/MyDatabase;create=true;user=root;password=1234"; //String url = "jdbc:derby://localhost:1527/"; String dbName = "MyDatabase"; String driver = "org.apache.derby.jdbc.ClientDriver"; @@ -125,6 +181,10 @@ public class Database_creation { } } + /** + * Create 3 tables in the database, vulnerabilites, references, softwares + * @throws SQLException + */ public void CreateTable() throws SQLException { System.out.println("Creating tables in database..."); stmt = conn.createStatement(); @@ -154,7 +214,7 @@ public class Database_creation { + "AVAILABILITY_IMPACT VARCHAR(100)," + "GEN_DATE VARCHAR(100)," + "CWE_ID VARCHAR(100)," - + "SUMMARY VARCHAR(3000))"); + + "SUMMARY VARCHAR(5000))"); System.out.println("Table VULNERABILITIES created"); @@ -174,6 +234,10 @@ public class Database_creation { } + /** + * import previous table from a file to have a database already fill + * @throws SQLException + */ public void CreateDatabaseFromSQLFile() throws SQLException { PreparedStatement ps; @@ -208,6 +272,10 @@ public class Database_creation { ps.execute(); } + /** + * Sabe all the tables in a file to use them later + * @throws SQLException + */ public void StoreDatabaseInFile() throws SQLException { PreparedStatement ps; diff --git a/crawler/src/web/crawler/Database_query.java b/crawler/src/web/crawler/Database_query.java index 9f68fe8d22..5d57b338a4 100644 --- a/crawler/src/web/crawler/Database_query.java +++ b/crawler/src/web/crawler/Database_query.java @@ -13,19 +13,37 @@ import java.io.InputStreamReader; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; +import java.util.List; import javax.xml.transform.TransformerException; import static web.crawler.File_management.StoreResultsInFile; - +/** + * Do different query on a database, the database have to be passed in the constructor + * @author Marie FORRAT & Angeliki AKTYPI + */ public class Database_query { - -private web.crawler.Database_creation database; - + + private web.crawler.Database_creation database; + + /** + * Constructor of the class + * @param db the database to do query on + */ public Database_query(web.crawler.Database_creation db) { this.database = db; } + /** + * Make query on table software according to keyword from the console + * Be careful: this function is NOT protected against SQL injection + * @throws IOException + * @throws SQLException + * @throws AWTException + * @throws TransformerException + */ public void MakeQueryOnTheDatabase() throws IOException, SQLException, AWTException, TransformerException { // open up standard input @@ -38,7 +56,7 @@ private web.crawler.Database_creation database; /* Buffer */ br = new BufferedReader(new InputStreamReader(System.in)); - + // Asking the user to enter keywords System.out.print("\n\n\n"); System.out.print("Insert your query. "); System.out.print("Keywords must be separated by spaces\n" @@ -72,10 +90,7 @@ private web.crawler.Database_creation database; /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ - /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ - /* Clear console */ - /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ - /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ + /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ /* Print results in xml file */ @@ -88,49 +103,119 @@ private web.crawler.Database_creation database; } } + /** + * make query on database according to 4 keywords: keyword to search in the summary, years, keyword to search in the vulnerable system table, number of result + * This function is protected against sql injection because it is using prepared statement + * @param argumentsfromclient keyword 1, date, keyword 2, number of result + * @return xml file containing the result of the query + * @throws IOException + * @throws SQLException + * @throws AWTException + * @throws TransformerException + */ public File GetCVEwithKeywords(ArrayList<String> argumentsfromclient) throws IOException, SQLException, AWTException, TransformerException { int Records; + List<ResultSet> resultSets = new ArrayList<>(); ResultSet rs; ArrayList<String> query; String querySQL; - + String year = ""; + query = argumentsfromclient; + //for (int i=0; i<5; i++){ System.out.println(query.get(i)); } + + String thisyear = new SimpleDateFormat("yyyy").format(new Date()); + + if (query.get(1).equals("this-year")) { + year = thisyear; + } + + else if (query.get(1).equals("last-year")) { + year = Integer.toString(Integer.valueOf(thisyear)-1); + } + + else if (query.get(1).equals("all")) { + year = "%"; + } + + String[] score_limits={"0","0"} ; + + if (query.get(3).equals("all")) { + System.out.print("Vo day"); + score_limits[0] = "0"; + score_limits[1]="10"; + } + + else { + score_limits = query.get(3).split("-"); + } + System.out.print(query.get(0)); + String[] keywords = query.get(0).split("-"); + //for (int i=0; i<2; i++){ System.out.println(Integer.valueOf(score_limits[i])); } + /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ /* Construct query */ /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ - - /* Select columes from the tables */ - querySQL = "SELECT SOFTWARES.CVE_ID, SOFTWARES.\"NAME\", VULNERABILITIES.SUMMARY " - + "FROM ROOT.SOFTWARES INNER JOIN ROOT.VULNERABILITIES " - + "ON SOFTWARES.CVE_ID = VULNERABILITIES.CVE_ID "; + + /* Select columes from the tables */ + querySQL = "SELECT VULNERABILITIES.CVE_ID, SOFTWARES.\"NAME\", VULNERABILITIES.SUMMARY \n" + + "FROM ROOT.SOFTWARES \n" + + "\tINNER JOIN ROOT.VULNERABILITIES \n" + + "\t\tON SOFTWARES.CVE_ID = VULNERABILITIES.CVE_ID \n"; /* Including the arguments in the query */ - querySQL += "WHERE VULNERABILITIES.SUMMARY LIKE ? " - + "AND VULNERABILITIES.CVE_ID LIKE ? " + + //querySQL += "WHERE SOFTWARES.\"NAME\" LIKE ? "; + querySQL += "WHERE VULNERABILITIES.SUMMARY LIKE ? "; + + for (int i = 1; i < keywords.length; i++) { + //querySQL += "OR SOFTWARES.\"NAME\" LIKE ? "; + querySQL += "OR VULNERABILITIES.SUMMARY LIKE ? "; + } + + querySQL += "AND VULNERABILITIES.CVE_ID LIKE ? " + "AND SOFTWARES.\"NAME\" LIKE ? " + + "AND VULNERABILITIES.SCORE BETWEEN ? AND ? \n" + "FETCH FIRST ? ROWS ONLY"; - - //System.out.println(querySQL); - + + + System.out.println(querySQL); + PreparedStatement prep = this.database.getconn().prepareStatement(querySQL); - prep.setString(1, "%"+query.get(0)+"%"); - prep.setString(2, "%"+query.get(1)+"%"); - prep.setString(3, "%"+query.get(2)+"%"); - prep.setInt(4,Integer.valueOf(query.get(3))); - + + int i; + for (i = 0; i < keywords.length; i++) { + prep.setString(i+1, "%"+keywords[i]+"%"); + } + prep.setString(i+1, "%"+year+"%"); + prep.setString(i+2, "%"+query.get(2)+"%"); + prep.setInt(i+3, Integer.valueOf(score_limits[0])); + prep.setInt(i+4, Integer.valueOf(score_limits[1])); + prep.setInt(i+5,Integer.valueOf(query.get(4))); + + // Execute the query rs = prep.executeQuery(); /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ - //String xmlcontent = StoreResultsInFile(rs); + // Store the result in a xml file File xmlfile = StoreResultsInFile(rs); return xmlfile; } + /** + * Get all the information concerning one vulnerabilities, found by using its CVE ID + * This function is protected against sql injection because it is using prepared statement + * @param argumentfromclient a cve ID + * @return xml containing the result of the query + * @throws IOException + * @throws SQLException + * @throws AWTException + * @throws TransformerException + */ public File GetinfofromCVE(String argumentfromclient) throws IOException, SQLException, AWTException, TransformerException { int Records; - // open up standard input BufferedReader br; ResultSet rs; String query; @@ -148,30 +233,28 @@ private web.crawler.Database_creation database; /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ /* Select from the basic table */ querySQL = "SELECT ROOT.VULNERABILITIES.*, ROOT.REFERENCESS.REF_TYPE, " - + "ROOT.REFERENCESS.\"SOURCE\", ROOT.REFERENCESS.\"LINK\", " - + "ROOT.SOFTWARES.\"NAME\" \n" - + "FROM ROOT.REFERENCESS \n" - + "\tINNER JOIN ROOT.SOFTWARES \n" - + "\t\tON REFERENCESS.CVE_ID = SOFTWARES.CVE_ID \n" - + "\tINNER JOIN ROOT.VULNERABILITIES \n" - + "\t\tON REFERENCESS.CVE_ID = VULNERABILITIES.CVE_ID \n"; + + "ROOT.REFERENCESS.\"SOURCE\", ROOT.REFERENCESS.\"LINK\", " + + "ROOT.SOFTWARES.\"NAME\" \n" + + "FROM ROOT.REFERENCESS \n" + + "\tINNER JOIN ROOT.SOFTWARES \n" + + "\t\tON REFERENCESS.CVE_ID = SOFTWARES.CVE_ID \n" + + "\tINNER JOIN ROOT.VULNERABILITIES \n" + + "\t\tON REFERENCESS.CVE_ID = VULNERABILITIES.CVE_ID \n"; /* Including the keywords in the query */ querySQL += "WHERE VULNERABILITIES.CVE_ID LIKE ?"; - - //System.out.println(querySQL); - + + + PreparedStatement prep = this.database.getconn().prepareStatement(querySQL); - - prep.setString(1, "%"+query+"%"); - + + prep.setString(1, "%"+query+"%"); + + // Execute the query rs = prep.executeQuery(); - - //rs = this.database.executestatement(querySQL); - - //String xmlcontent = StoreResultsInFile(rs); + // Store the result in a xml file File xmlfile = StoreResultsInFile(rs); - + return xmlfile; } -} +} \ No newline at end of file diff --git a/crawler/src/web/crawler/File_management.java b/crawler/src/web/crawler/File_management.java index 01c5194062..8cce4aae88 100644 --- a/crawler/src/web/crawler/File_management.java +++ b/crawler/src/web/crawler/File_management.java @@ -8,9 +8,13 @@ package web.crawler; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; @@ -39,11 +43,22 @@ import org.xml.sax.SAXException; import org.apache.commons.io.FileUtils; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; - +/** + * Contain all the functions, which are using file + * @author Marie FORRAT & Angeliki AKTYPI + */ public class File_management { - public static void DownloadFile(String filename) { + /** + * Download the zipped xml file from the National Vulnerability Database's website (https://nvd.nist.gov/) + * if the file doesn't exist in the working directory of the project. + * After extracting the xml file delete the zipped one. + * @param filename name of the file on the website + */ + public static void DownloadFile(String filename) throws MalformedURLException, IOException { File file = new File(filename); @@ -54,37 +69,112 @@ public class File_management { return; } - /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ - /* Code for downloading the XML file */ try { - // Get URL content - URL FileUrl = new URL("https://nvd.nist.gov/feeds/xml/cve/" + filename); + //set the URL of the file to be downloaded + URL url = new URL("http://static.nvd.nist.gov/feeds/xml/cve/" + filename + ".zip"); + System.out.println("File: " + filename + " does not exists"); - System.out.println("Downloading file: " + FileUrl.toString()); - URLConnection FileConnection = FileUrl.openConnection(); - - try ( // Open the stream and put it into BufferedReader - BufferedReader br = new BufferedReader(new InputStreamReader(FileConnection.getInputStream()))) { - String inputLine; - // Save to this filename - file.createNewFile(); - - // Use FileWriter to write file - FileWriter fw = new FileWriter(file.getAbsoluteFile()); - try (BufferedWriter bw = new BufferedWriter(fw)) { - while ((inputLine = br.readLine()) != null) { - bw.write(inputLine); - } - } + System.out.println("Downloading file: " + url.toString()); + + //create the new connection + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + + //set up some the connection and connect + urlConnection.setRequestMethod("GET"); + urlConnection.setDoOutput(true); + urlConnection.connect(); + + //creat the zip file + String zip_filename = filename+".zip"; + File zip_file = new File(zip_filename); + + //write the downloaded data into the zip file + FileOutputStream fileOutput = new FileOutputStream(zip_file); + + //reading the data from the url + InputStream inputStream = urlConnection.getInputStream(); + + //total size of the file + int totalSize = urlConnection.getContentLength(); + //variable to store total downloaded bytes + int downloadedSize = 0; + + //create a buffer... + byte[] buffer = new byte[1024]; + int bufferLength = 0; //used to store a temporary size of the buffer + + //read through the input buffer and write the contents to the file + while ( (bufferLength = inputStream.read(buffer)) > 0 ) { + //add the data in the buffer to the file in the file output stream + fileOutput.write(buffer, 0, bufferLength); + //add up the size so we know how much is downloaded + downloadedSize += bufferLength; } + //close the output stream when done + fileOutput.close(); - System.out.println("File: " + filename + " has been downloaded\n"); + unZipFile(zip_filename); + //keep only the xml files (the extracted file from the zip) + zip_file.delete(); + + //catch some possible errors... } catch (MalformedURLException e) { + e.printStackTrace(); } catch (IOException e) { + e.printStackTrace(); } } + public static void unZipFile(String zipFile){ + + byte[] buffer = new byte[1024]; + + try{ + + //get the zip file content + ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile)); + //get the zipped file list entry + ZipEntry ze = zis.getNextEntry(); + + while(ze!=null){ + + String fileName = ze.getName(); + File newFile = new File(fileName); + + + System.out.println("Unzipping file: " + newFile.getAbsoluteFile()); + + + FileOutputStream fos = new FileOutputStream(newFile); + + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + + fos.close(); + ze = zis.getNextEntry(); + } + + zis.closeEntry(); + zis.close(); + + //System.out.println("Done"); + + } catch(IOException ex){ + ex.printStackTrace(); + } + } + + /** + * Store the result of one query on an xml file to be sent to a client + * @param rs result of a sql query + * @return the xml file + * @throws TransformerConfigurationException + * @throws TransformerException + * @throws IOException + */ public static File StoreResultsInFile(ResultSet rs) throws TransformerConfigurationException, TransformerException, IOException { @@ -140,14 +230,20 @@ public class File_management { System.out.println("The folder structure does not exist"); }else { String encode = "UTF-8"; - FileUtils.writeStringToFile(file, xmlContent, encode); + FileUtils.writeStringToFile(file, xmlContent, encode); } - + File xmlFile = FileUtils.getFile(file); - + return xmlFile; } + /** + * Parse a xml file, which contain CVE to retrieve all the information and fill a database with all the retrieve information + * The structure of the CVE has to be the same as the structure you can find in the cve from https://nvd.nist.gov/ + * @param filename name of the xml file you want to parse + * @param database database you want to fill with data from the file + */ public static void ParsingXML(String filename, web.crawler.Database_creation database) { LinkedList<String> list_id = new LinkedList<>(); LinkedList<String> list_pub_date = new LinkedList<>(); @@ -180,18 +276,19 @@ public class File_management { doc.getDocumentElement().normalize(); - // System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); + // For all the CVE that are in the file NodeList nList = doc.getElementsByTagName("entry"); - + for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); if (nNode.getNodeType() == Node.ELEMENT_NODE) { - + Element eElement = (Element) nNode; - //System.out.println("Vuln id : " + eElement.getAttribute("id")); + //Store all the information in several lists by chcekcing first if the information is available: + list_id.add(eElement.getAttribute("id")); if (eElement.getElementsByTagName("cvss:score").item(0) != null) { @@ -247,9 +344,9 @@ public class File_management { } else { list_cwe_id.add("not available"); } - + NodeList nList1 = eElement.getElementsByTagName("vuln:references"); - + for (int i = 0; i < nList1.getLength(); i++) { list_ref_cve.add(eElement.getAttribute("id")); @@ -273,9 +370,9 @@ public class File_management { } } - + NodeList nList2 = eElement.getElementsByTagName("vuln:product"); - + for (int j = 0; j < nList2.getLength(); j++) { list_soft_cve.add(eElement.getAttribute("id")); @@ -284,31 +381,27 @@ public class File_management { list_soft_name.add(eElement.getElementsByTagName("vuln:product").item(j).getTextContent()); } else { list_soft_name.add("not available"); - } + } } - + list_pub_date.add(eElement.getElementsByTagName("vuln:published-datetime").item(0).getTextContent()); list_mod_date.add(eElement.getElementsByTagName("vuln:last-modified-datetime").item(0).getTextContent()); list_sum.add(eElement.getElementsByTagName("vuln:summary").item(0).getTextContent()); } } - - System.out.println(list_id.size()); - System.out.println(list_ref_type.size()); - System.out.println(list_soft_name.size()); - System.out.println(list_id.get(list_id.size()-1)); - System.out.println(list_ref_cve.get(list_ref_cve.size()-1)); - System.out.println(list_soft_cve.get(list_soft_cve.size()-1)); - + + /** + * Insert all the information retrieve from the file (that are now store in several list) in the database + */ PreparedStatement preparedStmt = database.getconn().prepareStatement("INSERT INTO VULNERABILITIES(CVE_ID,PUB_DATE,MOD_DATE,SCORE,ACCESS_VECTOR,ACCESS_COMPLEXITY,AUTHENTICATION,CONFIDENTIALITY_IMPACT,INTEGRITY_IMPACT,AVAILABILITY_IMPACT,GEN_DATE,CWE_ID,SUMMARY)" + "VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?, ?)"); PreparedStatement preparedStmt1 = database.getconn().prepareStatement("INSERT INTO REFERENCESS(CVE_ID,REF_TYPE,SOURCE,LINK)" + "VALUES ( ?, ?, ?, ?)"); PreparedStatement preparedStmt2 = database.getconn().prepareStatement("INSERT INTO SOFTWARES(CVE_ID,NAME)" + "VALUES ( ?, ?)"); - + System.out.println("Inserting " + list_id.size() + " data into VULNERABILITIES table ..."); - + for (int i = 0; i < list_id.size(); i++) { - + preparedStmt.setString(1, list_id.get(i)); preparedStmt.setString(2, list_pub_date.get(i)); preparedStmt.setString(3, list_mod_date.get(i)); @@ -324,11 +417,11 @@ public class File_management { preparedStmt.setString(13, list_sum.get(i)); preparedStmt.executeUpdate(); } - + System.out.println("Inserting " + list_ref_type.size() + " data into REFERENCESS table ..."); - + for (int d = 0; d < list_ref_type.size(); d++) { - + preparedStmt1.setString(1, list_ref_cve.get(d)); preparedStmt1.setString(2, list_ref_type.get(d)); preparedStmt1.setString(3, list_ref_source.get(d)); @@ -337,9 +430,9 @@ public class File_management { } System.out.println("Inserting " + list_soft_name.size() + " data into SOFTWARES table ..."); - + for (int f = 0; f < list_soft_name.size(); f++) { - + preparedStmt2.setString(1, list_soft_cve.get(f)); preparedStmt2.setString(2, list_soft_name.get(f)); preparedStmt2.executeUpdate(); @@ -348,7 +441,7 @@ public class File_management { preparedStmt.close(); preparedStmt1.close(); preparedStmt2.close(); - + System.out.println("Number of vulnerabilities inserted in the database: " + list_id.size()); System.out.println(); database.setTotalRecordsInDatabase(database.getTotalRecordsInDatabase() + list_id.size()); @@ -356,4 +449,4 @@ public class File_management { } } -} +} \ No newline at end of file diff --git a/crawler/src/web/crawler/MultiThreadServer.java b/crawler/src/web/crawler/MultiThreadServer.java index 04979762aa..890bb35f34 100644 --- a/crawler/src/web/crawler/MultiThreadServer.java +++ b/crawler/src/web/crawler/MultiThreadServer.java @@ -20,13 +20,22 @@ import org.apache.commons.io.FileUtils; import web.crawler.WebCrawler; import myutil.externalSearch.Message; - +/** + * + * @author Marie FORRAT & Angeliki AKTYPI & Dan Huynh VO + */ public class MultiThreadServer { public static String ERR_SVDOWN = "ERR : Cannot run the server, shut down the previous one!"; + /** + * + * @param cmd + * @param msg + * @return + */ public static Message createImageAnswer(String cmd, Message msg) { - byte[] byteImg = Message.convertImageToByte(); + byte[] byteImg = Message.convertImageToByte(msg); Message answerMessage = new Message(); ArrayList<Object> content = new ArrayList(); content.add(byteImg); @@ -35,7 +44,17 @@ public class MultiThreadServer { System.out.println(Message.SUC_CREATE_ANS_MESSAGE); return answerMessage; } - + + /** + * + * @param msg + * @param database + * @return + * @throws IOException + * @throws SQLException + * @throws AWTException + * @throws TransformerException + */ public static Message analyseRequestMessage(Message msg, web.crawler.Database_query database) throws IOException, SQLException, AWTException, TransformerException { //System.out.println(msg.getCmd()); @@ -75,11 +94,18 @@ public class MultiThreadServer { if (msg.getCmd().equals(Message.CMD_STATISTIC)) { Data_visualisation datavis = new Data_visualisation(WebCrawler.database); - datavis.OpenCloud(msg.getValues()); + datavis.OpenCloud(msg.getValues().get(0)); //Set cmd for the answer message to sent back to the client cmd = msg.RESULT_STATISTIC; answerMessage = createImageAnswer(cmd, msg); } + if (msg.getCmd().equals(Message.CMD_HISTOGRAM)) { + Data_visualisation datavis = new Data_visualisation(WebCrawler.database); + datavis.Histogram(msg.getValues().get(0)); + //Set cmd for the answer message to sent back to the client + cmd = msg.RESULT_HISTOGRAM; + answerMessage = createImageAnswer(cmd, msg); + } return answerMessage; } diff --git a/crawler/src/web/crawler/WebCrawler.java b/crawler/src/web/crawler/WebCrawler.java index 2c682c796d..96ecbf4e8b 100644 --- a/crawler/src/web/crawler/WebCrawler.java +++ b/crawler/src/web/crawler/WebCrawler.java @@ -15,10 +15,17 @@ import static web.crawler.File_management.ParsingXML; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.SSLSocket; +import java.text.SimpleDateFormat; +import java.util.Date; - +/** + * Main program + * @author Marie FORRAT & Angeliki AKTYPI + */ public class WebCrawler { - + /** + *create the database + */ public static Database_creation database; /** @@ -32,13 +39,18 @@ public class WebCrawler { * */ public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException, IOException, AWTException, Exception { + /** + * The name of the file, for example "nvdcve-2.0-2015.xml", from https://nvd.nist.gov/, which data we want to inport in our database + */ + String thisyear = new SimpleDateFormat("yyyy").format(new Date()); String FileNames[] = { - "nvdcve-2.0-2012.xml", - "nvdcve-2.0-2013.xml", - "nvdcve-2.0-2014.xml" - // "nvdcve-2.0-2015.xml" + "nvdcve-2.0-"+thisyear+".xml", + "nvdcve-2.0-"+(Integer.valueOf(thisyear)-1)+".xml", + "nvdcve-2.0-"+(Integer.valueOf(thisyear)-2)+".xml", + "nvdcve-2.0-"+(Integer.valueOf(thisyear)-3)+".xml", }; + //Database_creation database = new Database_creation(); database = new Database_creation(); /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ @@ -57,7 +69,7 @@ public class WebCrawler { + database.VulnerabilitesSqlFile.toString() + "\n" + database.SoftwaresSqlFile.toString() + "\n"); - System.out.println("Total records insert in the database: " + database.CountRowsInDatabase() + "\n\n"); + System.out.println("Total records insert in the database: " + database.getTotalRecordsInDatabase()+ "\n\n"); } else { /* Read XML file and store the informations in the database */ for (String xmlFile : FileNames) { @@ -73,7 +85,7 @@ public class WebCrawler { /* Data Visualization */ /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ Data_visualisation datavisual = new Data_visualisation(database); - //datavisual.Histogram(); + // datavisual.Histogram("linux"); /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ diff --git a/src/myutil/GoogleSearch.java b/src/myutil/GoogleSearch.java index 5f2d108e51..a04a2192e9 100644 --- a/src/myutil/GoogleSearch.java +++ b/src/myutil/GoogleSearch.java @@ -63,21 +63,27 @@ public class GoogleSearch { public static final String charset = "UTF-8"; public static final String userAgent = "Eurecom"; - public static final String google = "http://www.google.com/search?hl=en&q="; - public static final String googleScholar="http://scholar.google.com/scholar?ht=en&q="; + public static final String google = "http://www.google.com/search?hl=en"; + public static final String googleScholar="http://scholar.google.com/scholar?ht=en"; public static final String ENCODING_ERROR = "encodeding_error"; public static final String IOEx = "IOExeption"; - public static final ArrayList<GoogleSearch> getGoogleResult(String search) { + public static final ArrayList<GoogleSearch> getGoogleResult(String search,String num) { ArrayList<GoogleSearch> r = new ArrayList<GoogleSearch>(); String title="" ; String url ="" ; String desc=""; GoogleSearch gs; - try{ - Document doc = Jsoup.connect(google + URLEncoder.encode(search, charset)).userAgent(userAgent).get(); + + + try{ + String keyword = "&q=" + URLEncoder.encode(search, charset); + String number = "&num=" + URLEncoder.encode(num, charset); + String googleurl = google + number + keyword; + + Document doc = Jsoup.connect(googleurl).userAgent(userAgent).get(); //get list of search result, each result begin with tag <li class="g"> Elements articles = doc.select("li.g"); @@ -136,7 +142,7 @@ public class GoogleSearch { } - public static final ArrayList<GoogleSearch> getGoogleScholarResult(String search){ + public static final ArrayList<GoogleSearch> getGoogleScholarResult(String search,String num){ ArrayList<GoogleSearch> r = new ArrayList<GoogleSearch>(); String title=""; String url=""; @@ -148,7 +154,10 @@ public class GoogleSearch { GoogleSearch gs; try{ - Document doc = Jsoup.connect(googleScholar + URLEncoder.encode(search, charset)).userAgent(userAgent).get(); + String keyword = "&q=" + URLEncoder.encode(search, charset); + String number = "&num=" + URLEncoder.encode(num, charset); + String googleScholarurl = googleScholar + number + keyword; + Document doc = Jsoup.connect(googleScholarurl).userAgent(userAgent).get(); //get list of search result, each result begin with tag <li class="g"> Element error = doc.select("span.gs_red").first(); @@ -205,17 +214,6 @@ public class GoogleSearch { } } } - - //TraceManager.addDev("title-->"+title); - //TraceManager.addDev("url-->"+url); - //TraceManager.addDev("desc-->"+desc); - //TraceManager.addDev("author-->"+authors); - //TraceManager.addDev("cited number-->"+citedNumber); - //TraceManager.addDev("cited link-->"+citedLinks); - //TraceManager.addDev("related link-->"+related); - - - gs.authors=authors; gs.title=title; gs.url=url; diff --git a/src/myutil/externalSearch/Client.java b/src/myutil/externalSearch/Client.java index e94970a3af..c193929e5b 100644 --- a/src/myutil/externalSearch/Client.java +++ b/src/myutil/externalSearch/Client.java @@ -62,10 +62,14 @@ public class Client { public Object parserAnswerMessage(Message answerMsg) { //Analyse the message from the server, //Depends on the cmd, we can determine the values + if (answerMsg ==null){ + return null; + } + String cmd = answerMsg.getCmd(); if (cmd == null) { - TraceManager.addDev("Wrong message format - no cmd"); + //TraceManager.addDev("Wrong message format - no cmd"); return null; } else if (cmd.equals(Message.RESULT_SEARCH)) { ArrayList<Record> lrecord = new ArrayList<>(); @@ -143,9 +147,13 @@ public class Client { // the content are image. byte[] encoded = (byte[]) answerMsg.getContent().get(0); return encoded; + } else if (cmd.equals(Message.RESULT_HISTOGRAM)) { + // the content are image. + byte[] encoded = (byte[]) answerMsg.getContent().get(0); + return encoded; - } else - TraceManager.addDev("The command is not supported\n"); + } else + //TraceManager.addDev("The command is not supported\n"); return null; } @@ -179,7 +187,7 @@ public class Client { sslClient = (SSLSocket)sslSocketFactory.createSocket(server,port); sslClient.setEnabledCipherSuites(sslClient.getSupportedCipherSuites()); - TraceManager.addDev("Client has been created successfully!"); + //TraceManager.addDev("Client has been created successfully!"); ObjectOutputStream outputStream = new ObjectOutputStream(sslClient.getOutputStream()); ObjectInputStream inputStream = new ObjectInputStream(sslClient.getInputStream()); diff --git a/src/myutil/externalSearch/Message.java b/src/myutil/externalSearch/Message.java index a6dfda2068..4fd15167ab 100644 --- a/src/myutil/externalSearch/Message.java +++ b/src/myutil/externalSearch/Message.java @@ -77,6 +77,10 @@ public class Message implements Serializable { public static String PIC_SRC = "server_visualisation.png"; public static String PIC_DES = "client_visualisation.png"; + public static String PIC_SRC_HIST = "server_visualisation_Hist.png"; + public static String PIC_SRC_STAT = "server_visualisation.png"; + public static String PIC_DES_STAT = "client_visualisation_Stat.png"; + public static String PIC_DES_HIST = "client_visualisation_Hist.png"; public static String ERR_CMD = "Message command is empty\n"; public static String ERR_CMD2 = "Wrong message command\n"; @@ -206,11 +210,19 @@ public class Message implements Serializable { } - public static byte[] convertImageToByte(){ + public static byte[] convertImageToByte(Message msg){ byte[] imgByte = null; + BufferedImage img; try { - BufferedImage img = ImageIO.read(new File(PIC_SRC)); + if(msg.getCmd().equals("stat")) + { + img = ImageIO.read(new File(PIC_SRC_STAT)); + } + else + { + img = ImageIO.read(new File(PIC_SRC_HIST)); + } try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { ImageIO.write(img, "png", baos); @@ -219,7 +231,8 @@ public class Message implements Serializable { } } catch (IOException e) { - System.out.println("Image can't not be found!"); + // TODO Auto-generated catch block + System.out.println("Image can't not be found!\n"); } System.out.println("Image has been converted successfully!"); @@ -228,20 +241,26 @@ public class Message implements Serializable { } //a function to convert a string byte to an image - public static void convertByteToImage(byte[] imgByte){ + public static void convertByteToImage(byte[] imgByte,Message msg){ if (imgByte != null){ InputStream inStream = new ByteArrayInputStream(imgByte); try { BufferedImage img = ImageIO.read(inStream); - - ImageIO.write(img, "png", new File(PIC_DES)); - //System.out.println("Image has been created successfully!"); - + if(msg.getCmd().equals(RESULT_STATISTIC)) + { + ImageIO.write(img, "png", new File(PIC_DES_STAT)); + } + else + { + ImageIO.write(img, "png", new File(PIC_DES_HIST)); + } + System.out.println("Image has been created successfully!\n"); } catch (IOException e) { - // System.out.println("Image can't not be created!"); + // TODO Auto-generated catch block + System.out.println("Image can't not be created!\n"); } } diff --git a/src/ui/window/JDialogSearchBox.java b/src/ui/window/JDialogSearchBox.java index 3affd3e827..446c97b230 100644 --- a/src/ui/window/JDialogSearchBox.java +++ b/src/ui/window/JDialogSearchBox.java @@ -69,6 +69,7 @@ import javax.swing.text.html.HTMLDocument; import myutil.CheckConnection; import myutil.externalSearch.Record; import ui.ConfigurationTTool; +import ui.IconManager; import ui.MalformedConfigurationException; import ui.TDiagramMouseManager; import myutil.externalSearch.Message; @@ -94,6 +95,7 @@ public class JDialogSearchBox extends javax.swing.JFrame { private javax.swing.JComboBox combobox_System; private javax.swing.JComboBox combobox_Year; private javax.swing.JComboBox combobox_Diagram; + private javax.swing.JComboBox combobox_Num; private javax.swing.JCheckBox databaseCb; private javax.swing.JTextPane detailText_db; private javax.swing.JTextPane detailText_google; @@ -104,6 +106,7 @@ public class JDialogSearchBox extends javax.swing.JFrame { private javax.swing.JButton jButton_Statistic; private javax.swing.JLabel jLabel_Status; private javax.swing.JLabel jLabel_System; + private javax.swing.JLabel jLabel_Number; private javax.swing.JLabel jLabel_Score; private javax.swing.JLabel jLabel_Year; private javax.swing.JPanel jPanel_DBTab; @@ -137,6 +140,7 @@ public class JDialogSearchBox extends javax.swing.JFrame { private TableSorter sortTable1; private String dbaddress; private int dbport; + private int tabCounter = 0; @@ -205,8 +209,10 @@ public class JDialogSearchBox extends javax.swing.JFrame { combobox_Score = new javax.swing.JComboBox(); combobox_System = new javax.swing.JComboBox();; combobox_Year = new javax.swing.JComboBox(); + combobox_Num = new javax.swing.JComboBox(); jLabel_System = new javax.swing.JLabel(); jLabel_Score = new javax.swing.JLabel(); + jLabel_Number = new javax.swing.JLabel(); jLabel_Year = new javax.swing.JLabel(); jButton_Setting = new javax.swing.JButton(); jButton_Statistic = new javax.swing.JButton(); @@ -219,15 +225,16 @@ public class JDialogSearchBox extends javax.swing.JFrame { jTextaddressDB = new JTextField(); combobox_Diagram = new javax.swing.JComboBox(); drawBt = new JButton(); - - String DIAGRAM_LIST[] = {"None","Statistic","Histogram","pie"}; + String NUM_LIST[] = {"10","15","20","30"}; + String DIAGRAM_LIST[] = {"None","Statistic","Histogram"}; String SYSTEM_LIST[] = {"all", "linux", "windows", "others"}; - String TIME_LIST[]= {"all", "last year", "last 3 years"}; + String TIME_LIST[]= {"all", "this-year","last-year"}; String SCORE_LIST[] = {"all", "5-7", "7-8", "8-9"}; String COLUMNTITLE_G[] ={"No", "Title", "Link"} ; String COLUMNTITLE_GS[]= {"No", "Title", "Author", "Link"}; String COLUMNTITLE_DB[]= {"No", "ID CVE", "Title"}; + detailText_google.setContentType("text/html"); detailText_db.setContentType("text/html"); detailText_googleScholar.setContentType("text/html"); @@ -245,6 +252,7 @@ public class JDialogSearchBox extends javax.swing.JFrame { rowsGoogleScholar=new ArrayList<Object[]>(); jLabel_System.setText("System"); + jLabel_Number.setText("Number of result"); jLabel_Score.setText("Score"); jLabel_Year.setText("Year"); jButton_Setting.setText("Setting"); @@ -335,7 +343,7 @@ public class JDialogSearchBox extends javax.swing.JFrame { jTabbedPane2.addTab(GOOGLE, jPanel_GoogleTab); - /// + /// detailText_googleScholar.setBounds(0, 0, 20, 5); detailText_googleScholar.setEditable(false); jScrollPane8.setViewportView(detailText_googleScholar); @@ -419,6 +427,8 @@ public class JDialogSearchBox extends javax.swing.JFrame { combobox_Diagram.setModel(new javax.swing.DefaultComboBoxModel(DIAGRAM_LIST)); + combobox_Num.setModel(new javax.swing.DefaultComboBoxModel(NUM_LIST)); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( @@ -434,38 +444,44 @@ public class JDialogSearchBox extends javax.swing.JFrame { .addGroup(layout.createSequentialGroup() .addComponent(googleCb) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(databaseCb) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(databaseCb) .addComponent(googleScholarCb) .addComponent(removeBt)) - .addGap(100, 100, 100))) + )) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jButton_Setting, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(combobox_Diagram, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel_Score) .addComponent(jLabel_Year) - .addComponent(jLabel_System)) + .addComponent(jLabel_System) + .addComponent(jLabel_Number) + .addComponent(combobox_Diagram )) .addGap(37, 37, 37) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(combobox_Score, 0, 142, Short.MAX_VALUE) .addComponent(combobox_Year, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(combobox_System, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(combobox_Num, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) )) .addGroup(layout.createSequentialGroup() .addComponent(jLabel_Status) .addGap(0, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() - .addComponent(searchBox) - .addGap(10, 10, 10) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(searchBt, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(drawBt, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addComponent(searchBox) + .addGap(10, 10, 10) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(searchBt, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(drawBt, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)) + + )) .addContainerGap()) ); layout.setVerticalGroup( @@ -473,33 +489,44 @@ public class JDialogSearchBox extends javax.swing.JFrame { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 116, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel_System, javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(googleCb) - .addComponent(databaseCb) - .addComponent(jButton_Setting) + .addComponent(combobox_System, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(googleScholarCb) - .addComponent(combobox_Diagram, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + //.addComponent(combobox_Diagram, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) ) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(removeBt)) .addGroup(layout.createSequentialGroup() - .addGap(35, 35, 35) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(combobox_Score, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel_Score)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(combobox_Year, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel_Year)))) - .addGap(24, 24, 24) - .addComponent(drawBt) + .addGap(35, 35, 35) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(combobox_Score, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel_Score)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(databaseCb) + .addComponent(jButton_Setting) + .addComponent(combobox_Year, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel_Year)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(combobox_Num, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel_Number)) + )) + .addGap(10, 10, 10) + + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(combobox_Diagram) + .addComponent(drawBt)) + .addGap(6, 6, 6) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(searchBox, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(searchBt)) @@ -543,10 +570,9 @@ public class JDialogSearchBox extends javax.swing.JFrame { JOptionPane.WARNING_MESSAGE); searchBt.setEnabled(false); drawBt.setEnabled(false); - } else - if (combobox_Diagram.getSelectedItem() != "None") - drawBt.setEnabled(true); - searchBt.setEnabled(true); + } else if (combobox_Diagram.getSelectedItem() != "None") + drawBt.setEnabled(true); + searchBt.setEnabled(true); if (!isPrintableString(searchBox.getText())) { JOptionPane.showMessageDialog(null, "Not printable character", "Warning", @@ -595,8 +621,7 @@ public class JDialogSearchBox extends javax.swing.JFrame { if (googleScholarCb.isSelected() && ListKeywords.getModel().getSize() > 0) { searchBt.setEnabled(true); drawBt.setEnabled(true); - }else - { + } else { //searchBt.setEnabled(false); drawBt.setEnabled(false); } @@ -735,7 +760,8 @@ public class JDialogSearchBox extends javax.swing.JFrame { null, new Object[]{"Save", "Cancel"}, "OK"); } ConfigurationTTool.ExternalServer = jTextaddressDB.getText(); - + dbaddress=jTextaddressDB.getText().split(":")[0]; + dbport=Integer.parseInt(jTextaddressDB.getText().split(":")[1]); try { ConfigurationTTool.saveConfiguration(); } catch (MalformedConfigurationException e) { @@ -760,8 +786,10 @@ public class JDialogSearchBox extends javax.swing.JFrame { @Override public void actionPerformed(ActionEvent actionEvent) { //System.out.print(combobox_Diagram.getSelectedItem()); - if (combobox_Diagram.getSelectedItem() == "statistic") + if (combobox_Diagram.getSelectedItem() == "Statistic") doStatistic(); + if (combobox_Diagram.getSelectedItem() == "Histogram") + doHistogram(); } }); @@ -787,16 +815,18 @@ public class JDialogSearchBox extends javax.swing.JFrame { combobox_Diagram.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { - if (combobox_Diagram.getSelectedItem() == "None" || searchBox.getText().length() <=0) - drawBt.setEnabled(false); - else if ((combobox_Diagram.getSelectedItem() != "None" && searchBox.getText().length() >0)) - drawBt.setEnabled(true); + if (combobox_Diagram.getSelectedItem() == "None" || searchBox.getText().length() <= 0) + drawBt.setEnabled(false); + else if ((combobox_Diagram.getSelectedItem() != "None" && searchBox.getText().length() > 0)) + drawBt.setEnabled(true); } }); pack(); }// + + private void WindowClosing(WindowEvent evt) { tdmm.clearSelectComponents(); this.dispose(); @@ -937,7 +967,7 @@ public class JDialogSearchBox extends javax.swing.JFrame { if (searchGoogle == 1) { jLabel_Status.setText("Retrieving data from Google"); - resultGoogle = GoogleSearch.getGoogleResult(searchBox.getText()); + resultGoogle = GoogleSearch.getGoogleResult(searchBox.getText(),(String)combobox_Num.getSelectedItem()); jLabel_Status.setText("Done"); if (resultGoogle == null) { @@ -963,7 +993,7 @@ public class JDialogSearchBox extends javax.swing.JFrame { if (searchGoogleScholar == 1) { jLabel_Status.setText("Retrieving data from Google Scholar"); //jLabel_Status.updateUI(); - resultGoogleScholar = GoogleSearch.getGoogleScholarResult(searchBox.getText()); + resultGoogleScholar = GoogleSearch.getGoogleScholarResult(searchBox.getText(),(String)combobox_Num.getSelectedItem()); jLabel_Status.setText("Done"); //jLabel_Status.updateUI(); if (resultGoogleScholar == null) { @@ -1000,35 +1030,15 @@ public class JDialogSearchBox extends javax.swing.JFrame { jLabel_Status.setText("Retrieving data from DB"); Message msg = new Message(Message.CMD_SEARCH); - //Message msg = new Message(Message.CMD_DETAIL); - //msg.addKeywordMessage("CVE-2013-0001"); - - /*ArrayList<String> options = new ArrayList(); - ArrayList<String> values = new ArrayList(); - - options.add("keyword"); - options.add("year"); - options.add("system"); - options.add(Message.OPTION_NUMBER); - - values.add("Stuxnet"); - values.add("2014"); - values.add("windows"); - values.add("10"); - msg.createRequestMessage(Message.CMD_SEARCH, options, values);*/ msg.addKeywordMessage(searchBox.getText()); - msg.addOptionValueMessage(Message.OPTION_YEAR, "2014"); + msg.addOptionValueMessage(Message.OPTION_YEAR, (String) combobox_Year.getSelectedItem()); msg.addOptionValueMessage(Message.OPTION_SYSTEM, (String) combobox_System.getSelectedItem()); - //msg.addOptionValueMessage(Message.OPTION_SCORE,(String)combobox_Score.getSelectedItem()); + msg.addOptionValueMessage(Message.OPTION_SCORE,(String)combobox_Score.getSelectedItem()); + msg.addOptionValueMessage(Message.OPTION_NUMBER,(String)combobox_Num.getSelectedItem()); - msg.addOptionValueMessage(Message.OPTION_NUMBER, Integer.toString(10)); - //create client - //Client client = new Client(); - //Message msg1 = new Message(Message.RESULT_SEARCH); Message returnMsg = sendMessage(msg); - //Message msg1 = new Message(Message.RESULT_SEARCH); ArrayList<Record> re = (ArrayList<Record>)parserMessage(returnMsg); putDBToTable(re); @@ -1191,30 +1201,38 @@ public class JDialogSearchBox extends javax.swing.JFrame { public void putGoogleToTable(ArrayList<GoogleSearch> a) { - int i = this.rowsGoogle.size()+1; - for (GoogleSearch gs : a){ - this.rowsGoogle.add(new Object[]{i, gs}); - i=i+1; - } + if (a!=null){ + int i = this.rowsGoogle.size()+1; + for (GoogleSearch gs : a){ + this.rowsGoogle.add(new Object[]{i, gs}); + i=i+1; + } + } + } public void putDBToTable(ArrayList<Record> a) { - int i = this.rowsGoogle.size()+1; - for (Record record : a){ - this.rowsDB.add(new Object[]{i, record}); - i=i+1; + if (a!=null){ + int i = this.rowsGoogle.size()+1; + for (Record record : a){ + this.rowsDB.add(new Object[]{i, record}); + i=i+1; + } } + } public void putGoogleScholarToTable(ArrayList<GoogleSearch> a) { - int i = this.rowsGoogleScholar.size()+1; - for (GoogleSearch gs : a){ - rowsGoogleScholar.add(new Object[]{i, gs}); - i=i+1; - } + if (a!=null) { + int i = this.rowsGoogleScholar.size() + 1; + for (GoogleSearch gs : a) { + rowsGoogleScholar.add(new Object[]{i, gs}); + i = i + 1; + } + } } @@ -1259,24 +1277,8 @@ public class JDialogSearchBox extends javax.swing.JFrame { public void doStatistic() { BufferedImage img= null; try { - //img = ImageIO.read(new File("test.jpg")); Message msg = new Message(Message.CMD_STATISTIC); - ArrayList<String> options = new ArrayList<>(); - ArrayList<String> values = new ArrayList<>(); - options.add(Message.CMD_STATISTIC); - - - String arguments = searchBox.getText(); - String[] argument = arguments.split(" "); - - for (int i = 0; i < argument.length; i++) { - //System.out.println(argument[i]); - values.add(argument[i]); - } - msg.setOptions(options); - msg.setValues(values); - - + msg.addKeywordMessage(this.searchBox.getText()); Message ret = sendMessage(msg); if (ret !=null) { @@ -1285,12 +1287,9 @@ public class JDialogSearchBox extends javax.swing.JFrame { ByteArrayInputStream in = new ByteArrayInputStream(b); img = ImageIO.read(in); ImageIcon icon = new ImageIcon(img); - Image scaleImage = icon.getImage().getScaledInstance(750, 200, Image.SCALE_DEFAULT); + Image scaleImage = icon.getImage().getScaledInstance(650, 300, java.awt.Image.SCALE_SMOOTH); icon = new ImageIcon(scaleImage); - JLabel imageLabel = new JLabel(icon); - JScrollPane scrollPane = new JScrollPane(imageLabel); - jTabbedPane2.addTab("HUY", scrollPane); - + addTab("Statistic",icon); } } } catch (IOException e) { @@ -1300,6 +1299,98 @@ public class JDialogSearchBox extends javax.swing.JFrame { } + private void doHistogram() { + BufferedImage img= null; + try { + Message msg = new Message(Message.CMD_HISTOGRAM); + msg.addKeywordMessage(this.searchBox.getText()); + Message ret = sendMessage(msg); + if (ret !=null) + { + byte[] b = (byte[])parserMessage(ret); + if(b != null) { + ByteArrayInputStream in = new ByteArrayInputStream(b); + img = ImageIO.read(in); + ImageIcon icon = new ImageIcon(img); + Image scaleImage = icon.getImage().getScaledInstance(700, 300, java.awt.Image.SCALE_SMOOTH); + icon = new ImageIcon(scaleImage); + addTab("Histogram",icon); + + } + } + } catch (IOException e) { + JOptionPane.showMessageDialog(null, "Cannot display diagram !!!", "Warning", + JOptionPane.WARNING_MESSAGE); + } + + } + + + private void removeTab(String name){ + for ( int i =0; i < jTabbedPane2.getTabCount(); i ++){ + if (jTabbedPane2.getTitleAt(i).equals(name)){ + jTabbedPane2.remove(i); + } + } + } + + private void addTab(String name,ImageIcon icon ){ + tabCounter ++; + JLabel imageLabel = new JLabel(icon); + JScrollPane scrollPane = new JScrollPane(imageLabel); + removeTab(name); + jTabbedPane2.addTab(name, scrollPane); + //jTabbedPane2.setTabComponentAt(3, tabCloseButton); + + int index = jTabbedPane2.indexOfTab(name); + JPanel pnlTab = new JPanel(new GridBagLayout()); + pnlTab.setOpaque(false); + JLabel lblTitle = new JLabel(name); + //JButton btnClose = new JButton("x"); + JButton btnClose = new JButton(); + + btnClose.setOpaque(false); + btnClose.setContentAreaFilled(false); + btnClose.setBorderPainted(false); + //btnClose.setPreferredSize(new Dimension(25, 25)); + btnClose.setMargin(new Insets(0, 0, 0, 0)); + btnClose.setIcon(IconManager.imgic26); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.weightx = 1; + + pnlTab.add(lblTitle, gbc); + + gbc.gridx++; + gbc.gridx++; + gbc.gridy--; + gbc.weightx = 0; + pnlTab.add(btnClose, gbc); + + jTabbedPane2.setTabComponentAt(index, pnlTab); + btnClose.setActionCommand("" +tabCounter); + + btnClose.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent actionEvent) { + JButton btn = (JButton) actionEvent.getSource(); + String s1 = btn.getActionCommand(); + for (int i = 1; i < jTabbedPane2.getTabCount(); i++) { + JPanel pnl = (JPanel) jTabbedPane2.getTabComponentAt(i); + if (pnl!=null) { + btn = (JButton) pnl.getComponent(1); + String s2 = btn.getActionCommand(); + if (s1.equals(s2)) { + jTabbedPane2.removeTabAt(i); + break; + } + } + } + } + }); + } + /** * -- GitLab