/* CloudTrail Viewer, is a Java desktop application for reading AWS CloudTrail logs files. Copyright (C) 2017 Mark P. Haskins This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package io.haskins.java.cloudtrailviewer.service; import io.haskins.java.cloudtrailviewer.model.aws.AwsAccount; import io.haskins.java.cloudtrailviewer.model.dao.ResultSetRow; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; /** * DAO class that handles AWS Account database interacation * <p> * Created by markhaskins on 05/01/2017. */ @Service public class AccountService { private final DatabaseService databaseService; @Autowired public AccountService(DatabaseService databaseService) { this.databaseService = databaseService; } /** * Returns an AwsAccount object for the given account number * * @param acctNum AWS account number * @return Will return NULL if not found. */ public AwsAccount getAccountByAcctNum(String acctNum) { AwsAccount account = null; String query = "SELECT * FROM aws_credentials WHERE aws_acct LIKE '" + acctNum + "'"; List<ResultSetRow> rows = databaseService.executeCursorStatement(query); if (rows.size() == 1) { ResultSetRow row = rows.get(0); account = getAccountFromResultSetRow(row); } return account; } /** * Returns an AwsAccount object for the given account name * * @param name use defined name of AWS Account * @return Will return NULL if not found. */ public AwsAccount getAccountByName(String name) { AwsAccount account = null; String query = "SELECT * FROM aws_credentials WHERE aws_name LIKE '" + name + "'"; List<ResultSetRow> rows = databaseService.executeCursorStatement(query); if (rows.size() == 1) { ResultSetRow row = rows.get(0); account = getAccountFromResultSetRow(row); } return account; } /** * Delete the account with the name * * @param name name of account to delete */ public void deleteAccountByName(String name) { String query = "DELETE FROM aws_credentials WHERE aws_name = '" + name + "'"; databaseService.doExecute(query); } /** * returns all Account that have a bucket associated with them * * @return Collection of AWS Accounts that have a bucket configured */ public List<AwsAccount> getAllAccountsWithBucket() { return executeQuery("SELECT * FROM aws_credentials WHERE LENGTH(aws_bucket) > 1"); } /** * returns all accounts if they are active. * * @param onlyActive Flag to indicate if Active or Inactive AWS Accounts should be returned * @return Collection of AWS Accounts objects */ public List<AwsAccount> getAllAccounts(boolean onlyActive) { StringBuilder query = new StringBuilder(); query.append("SELECT * FROM aws_credentials"); if (onlyActive) { query.append(" WHERE active = 1"); } return executeQuery(query.toString()); } //////////////////////////////////////////////////////////////////////////// ///// private methods //////////////////////////////////////////////////////////////////////////// private List<AwsAccount> executeQuery(String query) { List<AwsAccount> accounts = new ArrayList<>(); List<ResultSetRow> rows = databaseService.executeCursorStatement(query); for (ResultSetRow row : rows) { accounts.add(getAccountFromResultSetRow(row)); } return accounts; } private AwsAccount getAccountFromResultSetRow(ResultSetRow row) { return new AwsAccount( (Integer) row.get("id"), (String) row.get("aws_name"), (String) row.get("aws_acct"), (String) row.get("alias"), (String) row.get("aws_bucket"), (String) row.get("aws_key"), (String) row.get("aws_secret"), (String) row.get("aws_prefix"), (String) row.get("profile") ); } public void updateAccount(AwsAccount account) { if (account.getId() == 0) { StringBuilder query = new StringBuilder(); query.append("INSERT INTO aws_credentials"); query.append(" (aws_name, "); if (account.getAcctNumber() != null && account.getAcctNumber().length() > 0) { query.append(" aws_acct, "); } if (account.getAcctAlias()!= null && account.getAcctAlias().length() > 0) { query.append(" alias, "); } if (account.getBucket() != null && account.getBucket().length() > 0) { query.append(" aws_bucket, "); } query.append(" aws_key, aws_secret, profile, aws_prefix, active)"); query.append(" VALUES ("); query.append("'").append(account.getName()).append("'").append(","); if (account.getAcctNumber() != null && account.getAcctNumber().length() > 0) { query.append("'").append(account.getAcctNumber()).append("',"); } if (account.getAcctAlias() != null && account.getAcctAlias().length() > 0) { query.append("'").append(account.getAcctAlias()).append("',"); } if (account.getBucket() != null && account.getBucket().length() > 0) { query.append("'").append(account.getBucket()).append("'").append(","); } query.append("'").append(account.getKey()).append("'").append(","); query.append("'").append(account.getSecret()).append("'").append(","); query.append("'").append(account.getProfile()).append("'").append(","); query.append("''").append(","); query.append("1"); query.append(")"); int id = databaseService.doInsertUpdate(query.toString()); account.setId(id); } else { StringBuilder updateQuery = new StringBuilder(); updateQuery.append("UPDATE aws_credentials SET"); updateQuery.append(" aws_name = '").append(account.getName()).append("',"); if (account.getBucket()!= null && account.getBucket().length() > 0) { updateQuery.append(" aws_bucket = '").append(account.getBucket()).append("',"); } if (account.getAcctNumber()!= null && account.getAcctNumber().length() > 0) { updateQuery.append(" aws_acct = '").append(account.getAcctNumber()).append("',"); } if (account.getAcctAlias()!= null && account.getAcctAlias().length() > 0) { updateQuery.append(" alias = '").append(account.getAcctAlias()).append("',"); } updateQuery.append(" aws_key = '").append(account.getKey()).append("',"); updateQuery.append(" aws_secret = '").append(account.getSecret()).append("',"); updateQuery.append(" profile = '").append(account.getProfile()).append("'"); updateQuery.append(" WHERE id = ").append(account.getId()); databaseService.doInsertUpdate(updateQuery.toString()); } } public void deleteAccount(AwsAccount account) { String query = "DELETE FROM aws_credentials WHERE id = " + account.getId(); databaseService.doInsertUpdate(query); } }