diff --git a/pom.xml b/pom.xml index d5e1dc6..8a7e883 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.security + spring-security-crypto + diff --git a/src/main/java/database/DatabaseHelper.java b/src/main/java/database/DatabaseHelper.java index d511d1d..fbf79c0 100644 --- a/src/main/java/database/DatabaseHelper.java +++ b/src/main/java/database/DatabaseHelper.java @@ -5,9 +5,10 @@ import com.j256.ormlite.support.ConnectionSource; public class DatabaseHelper { private static final String DATABASE_NAME = "monnethic"; - private static final String DATABASE_USER = ""; - private static final String DATABASE_PWD = ""; - private final static String DATABASE_URL = "jdbc:postgresql://host:port/"+DATABASE_NAME; + private static final String DATABASE_USER = "postgres"; + private static final String DATABASE_PWD = "L-*q~Ytaha{;u+7yJ8"; + //private final static String DATABASE_URL = "jdbc:postgresql://host:port/"+DATABASE_NAME; + private final static String DATABASE_URL = "jdbc:postgresql://37.187.101.44:5432/"+DATABASE_NAME; public ConnectionSource setupDatabaseConnection(){ try{ diff --git a/src/main/java/database/transaction/Transaction.java b/src/main/java/database/transaction/Transaction.java index 85aa124..08769ee 100644 --- a/src/main/java/database/transaction/Transaction.java +++ b/src/main/java/database/transaction/Transaction.java @@ -4,38 +4,36 @@ import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; import java.math.BigInteger; -import java.util.Date; @DatabaseTable(tableName = "T_TRANSACTION") public class Transaction { - @DatabaseField(columnName = "transactionId", generatedId = true, unique = true) - private int id; - @DatabaseField(columnName = "transactionDate") - private Date transactionDate; - @DatabaseField(columnName = "transactionDSrcAddress") + @DatabaseField + private int transactionId; + @DatabaseField(canBeNull = false) + private int userId; + @DatabaseField(canBeNull = false) + private long transactionDate; + @DatabaseField(columnName = "transactionFrom", canBeNull = false) private String sourceAddress; - @DatabaseField(columnName = "transactionDestAddress") + @DatabaseField(columnName = "transactionTo", canBeNull = false) private String destAddress; - @DatabaseField(columnName = "transactionHash") + @DatabaseField(canBeNull = false) private String transactionHash; - @DatabaseField(columnName = "transactionBlockNumber") - private String blockNumber; - @DatabaseField(columnName = "transactionAmout") + @DatabaseField(canBeNull = false) private BigInteger amount; - @DatabaseField(columnName = "transactionUnit") + @DatabaseField(canBeNull = false) private String unit; public Transaction() { super(); } - public Transaction(Date transactionDate, String sourceAddress, String destAddress, String transactionHash, String blockNumber, BigInteger amount, String unit) { + public Transaction(long transactionDate, String sourceAddress, String destAddress, String transactionHash, BigInteger amount, String unit) { super(); this.transactionDate = transactionDate; this.sourceAddress = sourceAddress; this.destAddress = destAddress; this.transactionHash = transactionHash; - this.blockNumber = blockNumber; this.amount = amount; this.unit = unit; } @@ -72,19 +70,27 @@ public class Transaction { this.amount = amount; } - public int getId() { - return id; + public int getTransactionId() { + return transactionId; } - public void setId(int id) { - this.id = id; + public void setTransactionId(int id) { + this.transactionId = transactionId; } - public Date getTransactionDate() { + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public long getTransactionDate() { return transactionDate; } - public void setTransactionDate(Date transactionDate) { + public void setTransactionDate(long transactionDate) { this.transactionDate = transactionDate; } @@ -96,11 +102,4 @@ public class Transaction { this.unit = unit; } - public String getBlockNumber() { - return blockNumber; - } - - public void setBlockNumber(String blockNumber) { - this.blockNumber = blockNumber; - } } diff --git a/src/main/java/database/user/User.java b/src/main/java/database/user/User.java index 851f2a3..2de0261 100644 --- a/src/main/java/database/user/User.java +++ b/src/main/java/database/user/User.java @@ -6,11 +6,13 @@ import com.j256.ormlite.table.DatabaseTable; //Class User which represent an User in the postgresDB @DatabaseTable(tableName = "T_USER") public class User { + @DatabaseField + private int userId; @DatabaseField(canBeNull = false) private String name; @DatabaseField(canBeNull = false) private String firstname; - @DatabaseField(id = true) + @DatabaseField(canBeNull = false) private String email; @DatabaseField(canBeNull = false) private String password; @@ -22,6 +24,8 @@ public class User { private boolean verified; @DatabaseField(canBeNull = false) private boolean approved; + @DatabaseField(canBeNull = false) + private String user_hash; //Constructors //Default constructor for ORMLite @@ -35,9 +39,10 @@ public class User { this.password = password; } - public User(String name, String firstname, String email, String password, long creation_date, long modification_date, boolean verified, boolean approved) { + public User(String name, String firstname,String user_hash, String email, String password, long creation_date, long modification_date, boolean verified, boolean approved) { this.name = name; this.firstname = firstname; + this.user_hash = user_hash; this.email = email; this.password = password; this.creation_date = creation_date; @@ -48,10 +53,18 @@ public class User { //Getters and Setters + public int getUserId() { + return userId; + } + public String getName() { return name; } + public void setUser_hash(String user_hash){this.user_hash = user_hash;} + + public String getUser_hash(){return user_hash;} + public void setName(String name) { this.name = name; } diff --git a/src/main/java/database/user/UserDao.java b/src/main/java/database/user/UserDao.java index 307b0eb..8d33285 100644 --- a/src/main/java/database/user/UserDao.java +++ b/src/main/java/database/user/UserDao.java @@ -14,7 +14,7 @@ public class UserDao { private DatabaseHelper dbh = new DatabaseHelper(); private Dao userDao; - public Dao createUserDaoConnection(){ + private Dao createUserDaoConnection(){ try { return DaoManager.createDao(dbh.setupDatabaseConnection(),User.class); }catch (Exception e){ diff --git a/src/main/java/restImplementation/DatabaseImplementation.java b/src/main/java/restImplementation/DatabaseImplementation.java new file mode 100644 index 0000000..15f6ad4 --- /dev/null +++ b/src/main/java/restImplementation/DatabaseImplementation.java @@ -0,0 +1,66 @@ +package restImplementation; + +import database.user.User; +import database.user.UserDao; +import org.springframework.security.crypto.bcrypt.BCrypt; + +import java.time.Instant; + +public class DatabaseImplementation { + + public boolean saveUser(User user){ + UserDao userDao = new UserDao(); + try{ + User dbUser = userDao.getUser(user.getEmail()); + if(dbUser != null){ + return false; + }else { + user.setPassword(hashPassword(user.getPassword())); + + long now = Instant.now().toEpochMilli(); + + user.setCreation_date(now); + user.setModification_date(now); + user.setVerified(true); + user.setApproved(true); + + //TEMPORARY USER HASH IS + // name+email+password + user.setUser_hash(hashPassword(user.getName()+user.getEmail()+user.getPassword())); + userDao.addUser(user); + } + + } catch (Exception e){ + e.printStackTrace(); + } + return true; + } + + public String userLogger(User user){ + UserDao userDao = new UserDao(); + String response = ""; + try{ + User user1 = userDao.getUser(user.getEmail()); + if(user1 != null){ + String hash = user1.getPassword(); + + if(!BCrypt.checkpw(user.getPassword(), hash)){ + response = "NotAllowed"; + }else{ + response = "Ok"; + } + } else { + response = "NotExist"; + } + + } catch (Exception e){ + System.out.println(e); + } + return response; + } + + + private String hashPassword(String plainTextPassword){ + return BCrypt.hashpw(plainTextPassword,BCrypt.gensalt()); + } +} diff --git a/src/main/java/restService/DatabaseController.java b/src/main/java/restService/DatabaseController.java new file mode 100644 index 0000000..0e0c204 --- /dev/null +++ b/src/main/java/restService/DatabaseController.java @@ -0,0 +1,44 @@ +package restService; + +import database.user.User; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import restImplementation.DatabaseImplementation; + +import javax.validation.Valid; + +@RestController +public class DatabaseController { + + @PostMapping("/save") + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity saveUser(@Valid @RequestBody User user){ + DatabaseImplementation databaseImplementation = new DatabaseImplementation(); + boolean result = databaseImplementation.saveUser(user); + if(result){ + return ResponseEntity.status(HttpStatus.OK).body(""); + }else { + return ResponseEntity.status(HttpStatus.FOUND).body("User exist"); + } + } + + @PostMapping("/login") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity login(@Valid @RequestBody User user){ + DatabaseImplementation databaseImplementation = new DatabaseImplementation(); + String response = databaseImplementation.userLogger(user); + + if(response.equals("NotExist")){ + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found"); + }else if(response.equals("NotAllowed")){ + return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Wrong Password!"); + } else if(response.equals("")){ + return ResponseEntity.status(HttpStatus.NO_CONTENT).body("Error"); + } else { + return ResponseEntity.ok("Welcome"); + } + } + + +} diff --git a/src/test/java/crypto/CryptoTest.java b/src/test/java/crypto/CryptoTest.java new file mode 100644 index 0000000..1451071 --- /dev/null +++ b/src/test/java/crypto/CryptoTest.java @@ -0,0 +1,23 @@ +package crypto; + +import org.junit.Ignore; +import org.junit.Test; +import org.springframework.security.crypto.bcrypt.BCrypt; + +import java.time.Instant; +@Ignore +public class CryptoTest { + + @Test + public void testHash(){ + String password = "newPassword"; + System.out.println(hashPassword(password)); + + long now = Instant.now().toEpochMilli(); + System.out.println(now); + } + + private String hashPassword(String plainTextPassword) { + return BCrypt.hashpw(plainTextPassword, BCrypt.gensalt()); + } +} diff --git a/src/test/java/database/DatabaseHelperTest.java b/src/test/java/database/DatabaseHelperTest.java index 02dea81..07771d7 100644 --- a/src/test/java/database/DatabaseHelperTest.java +++ b/src/test/java/database/DatabaseHelperTest.java @@ -2,9 +2,11 @@ package database; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; +import org.junit.Ignore; import org.junit.Test; //Testing class for postgresql connection +@Ignore public class DatabaseHelperTest { private DatabaseHelper dbh = new DatabaseHelper(); diff --git a/src/test/java/restImplementation/UserLoggerTest.java b/src/test/java/restImplementation/UserLoggerTest.java new file mode 100644 index 0000000..8f21cb6 --- /dev/null +++ b/src/test/java/restImplementation/UserLoggerTest.java @@ -0,0 +1,21 @@ +package restImplementation; + +import database.user.User; +import org.junit.Ignore; +import org.junit.Test; + +@Ignore +public class UserLoggerTest { + @Test + public void testLoggerUser(){ + User user = new User(); + user.setPassword("newPassword"); + user.setEmail("thomas.marshal@gmail.com"); + + DatabaseImplementation databaseImplementation = new DatabaseImplementation(); + String res = databaseImplementation.userLogger(user); + System.out.println(res); + + + } +}