Skip to content

Commit ca3b353

Browse files
author
MFrikken
committed
Implemented create and read functionalities for vulnerability models
1 parent 4db4361 commit ca3b353

File tree

29 files changed

+569
-184
lines changed

29 files changed

+569
-184
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
# SAGE-Java
22
This is the official Java fork of the originally Rust-based SAGE CLI
3+
4+
Run with `mvn javafx:run`

src/main/java/com/sage/Main.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
package com.sage;
22

3-
import java.io.File;
4-
3+
import com.sage.controller.MainController;
4+
import com.sage.controller.VulnerabilityController;
55
import com.sage.controller.WeaknessController;
6-
import com.sage.model.weakness.WeaknessDto;
7-
6+
import com.sage.utility.FileReaderUtility;
7+
import javafx.application.Application;
88
import javafx.scene.Scene;
99
import javafx.scene.image.Image;
1010
import javafx.scene.layout.StackPane;
1111
import javafx.scene.web.WebEngine;
1212
import javafx.scene.web.WebView;
13-
import javafx.application.Application;
1413
import javafx.stage.Stage;
1514
import netscape.javascript.JSObject;
1615

17-
public class Main extends Application{
16+
import java.io.File;
17+
import java.util.logging.Logger;
18+
19+
public class Main extends Application {
20+
static final Logger LOGGER = Logger.getLogger(Main.class.getName());
21+
1822
public static void main(String[] args) {
1923
launch(args);
2024
}
@@ -27,24 +31,22 @@ public void start(Stage stage) throws Exception {
2731
File htmlFile = new File(getClass().getResource("/html/index.html").getFile());
2832
webEngine.load(htmlFile.toURI().toString());
2933

30-
JSObject window = (JSObject) webEngine.executeScript("window");
31-
window.setMember("javaApp", new JavaBridge());
34+
// Wait until WebView is fully loaded before injecting WeaknessController
35+
webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
36+
if (newState == javafx.concurrent.Worker.State.SUCCEEDED) {
37+
JSObject window = (JSObject) webEngine.executeScript("window");
38+
window.setMember("mainController", MainController.getInstance());
39+
window.setMember("weaknessController", WeaknessController.getInstance());
40+
window.setMember("vulnerabilityController", VulnerabilityController.getInstance());
41+
window.setMember("fileReader", FileReaderUtility.getInstance());
42+
}
43+
});
3244

3345
StackPane root = new StackPane(webView);
3446
Scene scene = new Scene(root, 1500, 900);
3547
stage.setScene(scene);
3648
stage.setTitle("Sage UI");
3749
stage.getIcons().add(new Image(getClass().getResourceAsStream("/icons/sage-icon.png")));
3850
stage.show();
39-
40-
WeaknessDto weakness = new WeaknessDto("semgrep_id", "eslint.detect-eval-with-expression", "eslint.detect-eval-with-expression", "https://semgrep.dev/r/gitlab.eslint.detect-eval-with-expression");
41-
if (WeaknessController.getInstance().save(weakness))
42-
System.out.println("Fetching...\nFetched" + WeaknessController.getInstance().fetchById("0").toString());
43-
}
44-
45-
class JavaBridge {
46-
public void showMessage(String message) {
47-
System.out.println("Message from JS: " + message);
48-
}
4951
}
5052
}

src/main/java/com/sage/controller/Controller.java

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.sage.controller;
2+
3+
import java.util.HashMap;
4+
import java.util.logging.Logger;
5+
import java.util.List;
6+
7+
import com.sage.service.FileService;
8+
import com.sage.service.VulnerabilityService;
9+
10+
public class MainController {
11+
private static final Logger LOGGER = Logger.getLogger(MainController.class.getName());
12+
13+
private static MainController instance;
14+
private static FileService fileService;
15+
private static VulnerabilityService vulnerabilityService;
16+
17+
private MainController() {
18+
19+
fileService = new FileService();
20+
vulnerabilityService = new VulnerabilityService();
21+
}
22+
23+
public static MainController getInstance() {
24+
if (instance == null)
25+
instance = new MainController();
26+
return instance;
27+
}
28+
29+
public HashMap<String, Integer> process(String filePath) {
30+
System.out.println("Processing file: " + filePath);
31+
if (fileService.processFile(filePath))
32+
return vulnerabilityService.getStatistics();
33+
LOGGER.severe(String.format("[MainController] Failed to process SAST-Report-File: %s", filePath));
34+
throw new InternalError("File: " + filePath + " could not be processed\n");
35+
}
36+
37+
public void fetchAllVulnerabilities() {
38+
vulnerabilityService.getAll();
39+
}
40+
}
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
package com.sage.controller;
22

3+
import com.sage.service.VulnerabilityService;
4+
35
public class VulnerabilityController {
4-
6+
private static VulnerabilityController instance;
7+
private static VulnerabilityService vulnerabilityService;
8+
9+
private VulnerabilityController() {
10+
vulnerabilityService = new VulnerabilityService();
11+
}
12+
13+
public static VulnerabilityController getInstance() {
14+
if (instance == null)
15+
instance = new VulnerabilityController();
16+
return instance;
17+
}
518
}

src/main/java/com/sage/dao/Dao.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.util.logging.Logger;
44

55
import com.sage.utility.JPAManager;
6-
76
import jakarta.persistence.EntityManager;
87
import jakarta.persistence.EntityTransaction;
98

@@ -20,7 +19,7 @@ protected Dao() {
2019

2120
abstract boolean create(T entity);
2221

23-
abstract T receive(K key);
22+
abstract T read(K key);
2423

2524
abstract T update(K key, T newEntity);
2625

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package com.sage.dao;
22

3-
import java.sql.Connection;
4-
import java.sql.DriverManager;
5-
import java.sql.SQLException;
6-
import java.sql.Statement;
3+
import com.sage.utility.FileReaderUtility;
4+
5+
import java.io.File;
6+
import java.io.FileNotFoundException;
7+
import java.sql.*;
78
import java.util.logging.Logger;
89

910
abstract class DatabaseManager {
1011
private static final Logger LOGGER = Logger.getLogger(DatabaseManager.class.getName());
1112

12-
private static final String JDBC_DRIVER = "org.h2.Driver";
13-
private static final String DB_URL = "jdbc:h2:mem:sage_java";
13+
private static DatabaseManager instance;
14+
15+
private static final String JDBC_DRIVER = "org.h2.Driver";
16+
private static final String DB_URL = "jdbc:h2:mem:sage_java;DB_CLOSE_DELAY=-1";
1417

1518
// TODO: provide credentials in secure environment
1619
private static final String USER = "sage";
@@ -23,7 +26,8 @@ public static Connection establishConnection() {
2326
return connection;
2427
try {
2528
Class.forName(JDBC_DRIVER);
26-
return DriverManager.getConnection(DB_URL, USER, PASSWORD);
29+
connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);
30+
return connection;
2731
} catch (SQLException | ClassNotFoundException e) {
2832
LOGGER.severe("[DatabaseManager] Error while trying to connect to database: " + e.getMessage());
2933
}
@@ -40,15 +44,4 @@ public static boolean closeConnection() {
4044
}
4145
return true;
4246
}
43-
44-
public static boolean initializeDatabase() {
45-
try (Connection connection = establishConnection()) {
46-
Statement stmt = connection.createStatement();
47-
stmt.execute("RUNSCRIPT FROM 'classpath:init.sql'");
48-
return true;
49-
} catch (SQLException e) {
50-
LOGGER.severe("[DatabaseManager] Error while initializing database: " + e.getMessage());
51-
}
52-
return false;
53-
}
5447
}

src/main/java/com/sage/dao/VulnerabilityDao.java

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,45 @@
22

33
import com.sage.model.vulnerability.VulnerabilityModel;
44

5+
import java.sql.Clob;
6+
import java.util.ArrayList;
7+
import java.util.HashMap;
8+
import java.util.List;
9+
510
public class VulnerabilityDao extends Dao<VulnerabilityModel, Integer> {
611

7-
private static VulnerabilityDao instance ;
8-
12+
private static VulnerabilityDao instance;
13+
914
private VulnerabilityDao() {
1015
super();
1116
}
1217

1318
public static VulnerabilityDao instance() {
1419
if (instance == null)
1520
instance = new VulnerabilityDao();
16-
21+
1722
return instance;
1823
}
1924

2025
@Override
21-
boolean create(VulnerabilityModel entity) {
22-
String query = "INSERT INTO vulnerabilities (id, category, name, description, cve, severity, location_file, location_line_start, location_line_end) VALUES " + entity.asMap() + ";";
23-
return true;
26+
public boolean create(VulnerabilityModel entity) {
27+
try {
28+
tx.begin();
29+
em.persist(entity);
30+
tx.commit();
31+
return true;
32+
} catch (Exception e) {
33+
LOGGER.severe("[VulnerabilityDao] Error while inserting new vulnerability entity into database: " + e.getMessage());
34+
return false;
35+
}
2436
}
2537

2638
@Override
27-
VulnerabilityModel receive(Integer key) {
28-
// TODO Auto-generated method stub
29-
throw new UnsupportedOperationException("Unimplemented method 'receive'");
39+
public VulnerabilityModel read(Integer key) {
40+
tx.begin();
41+
VulnerabilityModel vulnerabilityModel = em.find(VulnerabilityModel.class, key);
42+
tx.commit();
43+
return vulnerabilityModel;
3044
}
3145

3246
@Override
@@ -41,6 +55,45 @@ boolean delete(Integer key) {
4155
throw new UnsupportedOperationException("Unimplemented method 'delete'");
4256
}
4357

44-
45-
58+
public List<VulnerabilityModel> readAll() {
59+
String query = "SELECT * FROM vulnerabilities;";
60+
61+
List<Object[]> results = em.createNativeQuery(query).getResultList();
62+
List<VulnerabilityModel> vulnerabilityModels = new ArrayList<VulnerabilityModel>();
63+
64+
for (Object[] row : results) {
65+
for (int i = 0; i < row.length; i++) {
66+
System.out.println(row[i]);
67+
}
68+
VulnerabilityModel vulnerabilityModel = new VulnerabilityModel(
69+
((Number) row[0]).intValue(),
70+
(String) row[1],
71+
(String) row[2],
72+
((Clob) row[3]).toString(),
73+
(String) row[4],
74+
(String) row[5],
75+
(String) row[6],
76+
(String) row[7]
77+
);
78+
vulnerabilityModels.add(vulnerabilityModel);
79+
}
80+
81+
return vulnerabilityModels;
82+
}
83+
84+
public HashMap<String, Integer> getSeverities() {
85+
String query = "SELECT severity, COUNT(*) AS count FROM vulnerabilities GROUP BY severity";
86+
87+
List<Object[]> results = em.createNativeQuery(query).getResultList();
88+
HashMap<String, Integer> severities = new HashMap<>();
89+
90+
for (Object[] row : results) {
91+
String severity = (String) row[0];
92+
Number count = (Number) row[1];
93+
severities.put(severity, count.intValue());
94+
}
95+
96+
return severities;
97+
}
98+
4699
}

src/main/java/com/sage/dao/WeaknessDao.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public boolean create(WeaknessModel entity) {
2828
}
2929

3030
@Override
31-
public WeaknessModel receive(Integer key) {
31+
public WeaknessModel read(Integer key) {
3232
try {
3333
return em.find(WeaknessModel.class, key);
3434
} catch (Exception e) {

src/main/java/com/sage/model/vulnerability/Vulnerability.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import java.util.List;
44
import com.sage.model.weakness.WeaknessDto;
55

6+
/**
7+
* This class represents a Vulnerability as it is in the SAST-Report file.
8+
*/
9+
610
public class Vulnerability {
711
private final Integer id; // autoincremented id for identification in db
812
private final Category category;

0 commit comments

Comments
 (0)