From 713517724e30af0656bb4f903ca51614c3f8d19f Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 31 Jul 2017 19:01:39 +0200 Subject: [PATCH] =?UTF-8?q?Module=20Server,=20packg=20module.account=20:?= =?UTF-8?q?=20cr=C3=A9ation=20impl=20IAccountDao=20nomm=C3=A9e=20FileAccou?= =?UTF-8?q?ntDao,=20suppr=20TODO=20associ=C3=A9s=20(fait);=20cr=C3=A9ation?= =?UTF-8?q?=20clss=20AccountEntry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/module/account/AccountEntry.java | 58 ++++++++++++ .../server/module/account/AccountService.java | 14 +-- .../server/module/account/FileAccountDao.java | 93 +++++++++++++++++++ .../server/module/account/IAccountDao.java | 7 +- 4 files changed, 161 insertions(+), 11 deletions(-) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountEntry.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountEntry.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountEntry.java new file mode 100644 index 00000000..9e7fcd05 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountEntry.java @@ -0,0 +1,58 @@ +package com.pqt.server.module.account; + +import com.pqt.core.entities.user_account.AccountLevel; + +import java.io.Serializable; + +public class AccountEntry implements Serializable{ + private String username, passwordHash, salt; + private AccountLevel level; + + public AccountEntry() { + } + + public AccountEntry(String username, String passwordHash, String salt, AccountLevel level) { + this.username = username; + this.passwordHash = passwordHash; + this.salt = salt; + this.level = level; + } + + String getUsername() { + return username; + } + + String getPasswordHash() { + return passwordHash; + } + + String getSalt() { + return salt; + } + + AccountLevel getLevel() { + return level; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + AccountEntry that = (AccountEntry) o; + + if (!username.equals(that.username)) return false; + if (!passwordHash.equals(that.passwordHash)) return false; + if (!salt.equals(that.salt)) return false; + return level == that.level; + } + + @Override + public int hashCode() { + int result = username.hashCode(); + result = 31 * result + passwordHash.hashCode(); + result = 31 * result + salt.hashCode(); + result = 31 * result + level.hashCode(); + return result; + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java index c7eb5548..f941abb6 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java @@ -9,18 +9,18 @@ public class AccountService { private IAccountDao dao; public AccountService() { - //TODO add dao instanciation + dao = new FileAccountDao(); } - public boolean isAccountConnected(Account acc) { - return dao.isAccountConnected(acc); + public boolean isAccountConnected(Account account) { + return dao.isAccountConnected(account); } - public boolean setAccountConnected(Account acc, boolean connected) { - return dao.setAccountConnected(acc, connected); + public boolean submitAccountCredentials(Account acc, boolean desiredState) { + return dao.submitAccountCredentials(acc, desiredState); } - public boolean isAccountRegistered(Account acc){ - return dao.isAccountRegistered(acc); + public boolean isAccountRegistered(Account account){ + return dao.isAccountRegistered(account); } } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java new file mode 100644 index 00000000..cd370aa0 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java @@ -0,0 +1,93 @@ +package com.pqt.server.module.account; + +import com.pqt.core.entities.user_account.Account; +import com.pqt.server.tools.io.ISerialFileManager; +import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; +import com.pqt.server.tools.security.IHashTool; +import com.pqt.server.tools.security.MD5HashTool; + +import java.util.*; + +//TODO écrire Javadoc +//TODO ajouter logs +public class FileAccountDao implements IAccountDao { + + private static final String ACCOUNT_FILE_NAME = "acc.pqt"; + + private Set accountEntries; + private Set connectedAccount; + private IHashTool hashTool; + private ISerialFileManager fileManager; + + public FileAccountDao() { + accountEntries = new HashSet<>(); + connectedAccount = new HashSet<>(); + hashTool = new MD5HashTool(); + fileManager = SimpleSerialFileManagerFactory.getFileManager(AccountEntry.class, ACCOUNT_FILE_NAME); + loadFromFile(); + } + + private AccountEntry lookupMatchingEntry(Account account, Collection entries){ + return entries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst().orElse(null); + } + + @Override + public boolean isAccountConnected(Account account) { + return lookupMatchingEntry(account, connectedAccount)!=null; + } + + @Override + public boolean submitAccountCredentials(Account acc, boolean desiredState) { + if(isAccountRegistered(acc)){ + if(desiredState!=isAccountConnected(acc)){ + if(desiredState) + return connect(acc); + else + return disconnect(acc); + } + } + + return false; + } + + private boolean connect(Account account){ + Optional entry = accountEntries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst(); + if(!entry.isPresent()) + return false; + else{ + String expectedUsername = entry.get().getUsername(); + String expectedPasswordHash = entry.get().getPasswordHash(); + String salt = entry.get().getSalt(); + + if(expectedUsername.equals(account.getUsername()) && hashTool.hashAndSalt(account.getPassword(), salt).equals(expectedPasswordHash)){ + connectedAccount.add(entry.get()); + return true; + }else + return false; + } + } + + private boolean disconnect(Account account){ + Optional entry = accountEntries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst(); + if(entry.isPresent() && connectedAccount.contains(entry.get())){ + connectedAccount.remove(entry.get()); + return true; + } + return false; + } + + @Override + public boolean isAccountRegistered(Account account) { + return lookupMatchingEntry(account, accountEntries)!=null; + } + + private void saveToFile(){ + fileManager.saveSetToFile(accountEntries); + } + + private void loadFromFile(){ + this.accountEntries = new HashSet<>(fileManager.loadSetFromFile()); + //TODO faire check des comptes au lieu de tout déconnecter? + this.connectedAccount.clear(); + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java index 2160d2df..480c9e5f 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java @@ -3,12 +3,11 @@ package com.pqt.server.module.account; import com.pqt.core.entities.user_account.Account; //TODO écrire Javadoc -//TODO créer implémentaiton public interface IAccountDao { - boolean isAccountConnected(Account acc); + boolean isAccountConnected(Account account); - boolean setAccountConnected(Account acc, boolean connected); + boolean submitAccountCredentials(Account acc, boolean desiredState); - boolean isAccountRegistered(Account acc); + boolean isAccountRegistered(Account account); }