diff --git a/multibanking-persistence-jpa/src/test/java/de/adorsys/multibanking/jpa/repository/BankAccessRepositoryJpaTest.java b/multibanking-persistence-jpa/src/test/java/de/adorsys/multibanking/jpa/repository/BankAccessRepositoryJpaTest.java index 282c94140..b7e8ac141 100644 --- a/multibanking-persistence-jpa/src/test/java/de/adorsys/multibanking/jpa/repository/BankAccessRepositoryJpaTest.java +++ b/multibanking-persistence-jpa/src/test/java/de/adorsys/multibanking/jpa/repository/BankAccessRepositoryJpaTest.java @@ -17,7 +17,6 @@ import java.util.Collections; import java.util.HashMap; -import java.util.Optional; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +40,7 @@ public void test() { assertThat(repository.findByUserId(bankAccess.getUserId())).isNotEmpty(); BankAccessEntity bankAccessEntity = repository.findByUserIdAndId(bankAccess.getUserId(), bankAccess.getId()) - .orElseThrow(() -> new IllegalStateException("bankaccess is null")); + .orElseThrow(() -> new IllegalStateException("bankaccess is null")); assertThat(bankAccessEntity.getTanTransportTypes()).isNotEmpty(); @@ -61,12 +60,8 @@ public BankAccessEntity createBankAccess() { entity.setTanTransportTypes(new HashMap<>()); entity.getTanTransportTypes().put(BankApi.HBCI, Collections.singletonList(TanTransportType.builder() - .id("SMS_OTP") - .build())); - - entity.getTanTransportTypes().put(BankApi.FIGO, Collections.singletonList(TanTransportType.builder() - .id("PUSH_OTP") - .build())); + .id("SMS_OTP") + .build())); repository.save(entity); diff --git a/multibanking-server/pom.xml b/multibanking-server/pom.xml index ab09858f6..63d3891bd 100644 --- a/multibanking-server/pom.xml +++ b/multibanking-server/pom.xml @@ -52,11 +52,6 @@ onlinebanking-hbci4java 5.5.35-SNAPSHOT - - de.adorsys.multibanking - onlinebanking-ing - 5.5.35-SNAPSHOT - de.adorsys.multibanking onlinebanking-bankinggateway diff --git a/multibanking-server/src/main/java/de/adorsys/multibanking/config/AdapterConfig.java b/multibanking-server/src/main/java/de/adorsys/multibanking/config/AdapterConfig.java index d531e8638..74405e0d6 100644 --- a/multibanking-server/src/main/java/de/adorsys/multibanking/config/AdapterConfig.java +++ b/multibanking-server/src/main/java/de/adorsys/multibanking/config/AdapterConfig.java @@ -1,10 +1,7 @@ package de.adorsys.multibanking.config; import de.adorsys.multibanking.bg.BankingGatewayAdapter; -import de.adorsys.multibanking.domain.BankApi; -import de.adorsys.multibanking.figo.FigoBanking; import de.adorsys.multibanking.hbci.HbciBanking; -import de.adorsys.multibanking.ing.IngAdapter; import lombok.extern.slf4j.Slf4j; import org.kapott.hbci.manager.HBCIProduct; import org.springframework.beans.factory.annotation.Value; @@ -45,16 +42,11 @@ public class AdapterConfig { @Value("${fints.bpdCacheExpirationMs:86400000}") //one day private long fintsBpdCacheExpirationMs; - private IngAdapter ingAdapter; private BankingGatewayAdapter bankingGatewayAdapter; private HbciBanking hbci4JavaBanking; - private FigoBanking figoBanking = new FigoBanking(BankApi.FIGO); - private FigoBanking figoBankingAlternative = new FigoBanking(BankApi.FIGO_ALTERNATIVE); @PostConstruct public void postConstruct() { - ingAdapter = new IngAdapter(ingBaseUrl, keyStoreUrl, keyStorePassword, ingQwacAlias, - ingQsealAlias); bankingGatewayAdapter = new BankingGatewayAdapter(bankingGatewayBaseUrl, bankingAdapterBaseUrl, dumpDownloadFiles); @@ -66,11 +58,6 @@ public void postConstruct() { } } - @Bean - public IngAdapter ingAdapter() { - return ingAdapter; - } - @Bean public BankingGatewayAdapter bankingGatewayAdapter() { return bankingGatewayAdapter; @@ -81,13 +68,4 @@ public HbciBanking hbci4JavaBanking() { return hbci4JavaBanking; } - @Bean - public FigoBanking figoBanking() { - return figoBanking; - } - - @Bean - public FigoBanking figoBankingAlternative() { - return figoBankingAlternative; - } } diff --git a/multibanking-server/src/main/java/de/adorsys/multibanking/service/BankAccountService.java b/multibanking-server/src/main/java/de/adorsys/multibanking/service/BankAccountService.java index 05dec34cd..234cb9d66 100644 --- a/multibanking-server/src/main/java/de/adorsys/multibanking/service/BankAccountService.java +++ b/multibanking-server/src/main/java/de/adorsys/multibanking/service/BankAccountService.java @@ -7,7 +7,6 @@ import de.adorsys.multibanking.domain.response.AccountInformationResponse; import de.adorsys.multibanking.domain.spi.OnlineBankingService; import de.adorsys.multibanking.domain.transaction.LoadAccounts; -import de.adorsys.multibanking.exception.BankAccessAlreadyExistException; import de.adorsys.multibanking.exception.InvalidBankAccessException; import de.adorsys.multibanking.exception.ResourceNotFoundException; import de.adorsys.multibanking.metrics.MetricsCollector; @@ -19,11 +18,9 @@ import org.springframework.stereotype.Service; import java.util.Collection; -import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import java.util.stream.Stream; import static de.adorsys.multibanking.domain.ScaStatus.FINALISED; @@ -82,13 +79,7 @@ public List loadBankAccountsOnline(BankEntity bankEntity, Ban List bankAccounts = loadBankAccountsOnline(expectedConsentStatus, bankAccess, onlineBankingService, bankApiUser, bankEntity); - if (onlineBankingService.bankApi() == BankApi.FIGO) { - filterAccounts(bankAccess, onlineBankingService, bankAccounts); - } - - return Optional.ofNullable(bankAccounts) - .map(Collection::stream) - .orElseGet(Stream::empty) + return Optional.ofNullable(bankAccounts).stream().flatMap(Collection::stream) .map(source -> { BankAccountEntity target = new BankAccountEntity(); BeanUtils.copyProperties(source, target); @@ -123,29 +114,4 @@ private List loadBankAccountsOnline(ScaStatus expectedConsentStatus throw e; } } - - private void filterAccounts(BankAccessEntity bankAccess, OnlineBankingService onlineBankingService, - List bankAccounts) { - List userBankAccounts = bankAccountRepository.findByUserId(bankAccess.getUserId()); - //filter out previous created accounts - Iterator accountIterator = bankAccounts.iterator(); - while (accountIterator.hasNext()) { - BankAccount newAccount = accountIterator.next(); - userBankAccounts.stream() - .filter(bankAccountEntity -> { - String newAccountExternalID = newAccount.getExternalIdMap().get(onlineBankingService.bankApi()); - String existingAccountExternalID = - bankAccountEntity.getExternalIdMap().get(onlineBankingService.bankApi()); - return newAccountExternalID.equals(existingAccountExternalID); - }) - .findFirst() - .ifPresent(bankAccountEntity -> accountIterator.remove()); - } - //all accounts created in the past - if (bankAccounts.isEmpty()) { - throw new BankAccessAlreadyExistException(); - } - bankAccess.setBankName(bankAccounts.get(0).getBankName()); - } - } diff --git a/multibanking-server/src/main/java/de/adorsys/multibanking/service/OnlineBankingServiceProducer.java b/multibanking-server/src/main/java/de/adorsys/multibanking/service/OnlineBankingServiceProducer.java index f051eccb5..c5e30029f 100755 --- a/multibanking-server/src/main/java/de/adorsys/multibanking/service/OnlineBankingServiceProducer.java +++ b/multibanking-server/src/main/java/de/adorsys/multibanking/service/OnlineBankingServiceProducer.java @@ -4,9 +4,7 @@ import de.adorsys.multibanking.domain.BankApi; import de.adorsys.multibanking.domain.BankEntity; import de.adorsys.multibanking.domain.spi.OnlineBankingService; -import de.adorsys.multibanking.figo.FigoBanking; import de.adorsys.multibanking.hbci.HbciBanking; -import de.adorsys.multibanking.ing.IngAdapter; import de.adorsys.multibanking.pers.spi.repository.BankRepositoryIf; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; @@ -16,11 +14,8 @@ @Service public class OnlineBankingServiceProducer { - private final IngAdapter ingAdapter; private final BankingGatewayAdapter bankingGatewayAdapter; private final HbciBanking hbci4JavaBanking; - private final FigoBanking figoBanking; - private final FigoBanking figoBankingAlternative; private final BankRepositoryIf bankRepository; @Value("${defaultBankApi:HBCI}") private String defaultBankApi; @@ -44,12 +39,6 @@ public OnlineBankingService getBankingService(BankApi bankApi) { switch (bankApi) { case HBCI: return hbci4JavaBanking; - case FIGO: - return figoBanking; - case ING: - return ingAdapter; - case FIGO_ALTERNATIVE: - return figoBankingAlternative; case XS2A: return bankingGatewayAdapter; } diff --git a/multibanking-server/src/main/java/de/adorsys/multibanking/web/model/BankApiTO.java b/multibanking-server/src/main/java/de/adorsys/multibanking/web/model/BankApiTO.java index 67abf060e..3ca0606ba 100755 --- a/multibanking-server/src/main/java/de/adorsys/multibanking/web/model/BankApiTO.java +++ b/multibanking-server/src/main/java/de/adorsys/multibanking/web/model/BankApiTO.java @@ -20,5 +20,5 @@ @Schema(name = "BankApi", description = "The banking access backend") public enum BankApiTO { - HBCI, FIGO, XS2A, FIGO_ALTERNATIVE, ING + HBCI, XS2A } diff --git a/multibanking-server/src/test/java/de/adorsys/multibanking/service/DirectAccessControllerTest.java b/multibanking-server/src/test/java/de/adorsys/multibanking/service/DirectAccessControllerTest.java index e808c9f3d..bc700dbea 100644 --- a/multibanking-server/src/test/java/de/adorsys/multibanking/service/DirectAccessControllerTest.java +++ b/multibanking-server/src/test/java/de/adorsys/multibanking/service/DirectAccessControllerTest.java @@ -18,7 +18,6 @@ import de.adorsys.multibanking.exception.domain.Messages; import de.adorsys.multibanking.hbci.HbciBanking; import de.adorsys.multibanking.hbci.model.HbciConsent; -import de.adorsys.multibanking.ing.IngAdapter; import de.adorsys.multibanking.pers.spi.repository.BankRepositoryIf; import de.adorsys.multibanking.pers.spi.repository.ConsentRepositoryIf; import de.adorsys.multibanking.web.DirectAccessControllerV2; @@ -58,7 +57,6 @@ import static de.adorsys.multibanking.domain.exception.MultibankingError.INVALID_CONSENT_STATUS; import static de.adorsys.multibanking.domain.exception.MultibankingError.INVALID_SCA_METHOD; import static de.adorsys.multibanking.service.TestUtil.createBooking; -import static de.adorsys.multibanking.web.model.ScaApproachTO.OAUTH; import static de.adorsys.multibanking.web.model.ScaStatusTO.*; import static org.assertj.core.api.Assertions.assertThat; import static org.kapott.hbci.manager.HBCIVersion.HBCI_300; @@ -188,48 +186,6 @@ public void consent_authorisation_bankinggateway_decoupled() { assertThat(jsonPath.getString("scaStatus")).isIn(FINALISED.toString()); } - @Ignore("uses real data - please setup ENV") - @Test - public void consent_authorisation_ing() { - ConsentTO consentTO = createConsentTO(); - - prepareBank(new IngAdapter(ingBaseUrl, keyStoreUrl, keyStorePassword, ingQwacAlias, ingQsealAlias), - consentTO.getPsuAccountIban(), false); - - //1. create consent - JsonPath jsonPath = request.body(consentTO) - .header("Correlation-ID", "TEST123") - .post(getRemoteMultibankingUrl() + "/api/v1/consents") - .then().assertThat().statusCode(HttpStatus.CREATED.value()) - .and().extract().jsonPath(); - - assertThat(jsonPath.getString("_links.redirectUrl")).isNotBlank(); - - BankAccessTO bankAccess = createBankAccess(); - bankAccess.setConsentId(jsonPath.getString("consentId")); - - //2. get consent authorisation status - jsonPath = request.get(jsonPath.getString("_links.authorisationStatus.href")) - .then().assertThat().statusCode(HttpStatus.OK.value()) - .and().extract().jsonPath(); - - assertThat(jsonPath.getString("scaApproach")).isEqualTo(OAUTH.toString()); - - //3. load bookings - DirectAccessControllerV2.LoadBookingsRequest LoadBookingsRequest = - new DirectAccessControllerV2.LoadBookingsRequest(); - LoadBookingsRequest.setBankAccess(bankAccess); - LoadBookingsRequest.setAuthorisationCode("8b6cd77a-aa44-4527-ab08-a58d70cca286"); - - jsonPath = request - .body(LoadBookingsRequest) - .post(getRemoteMultibankingUrl() + "/api/v2/direct/bookings") - .then().assertThat().statusCode(HttpStatus.OK.value()) - .and().extract().jsonPath(); - - assertThat(jsonPath.getString("bookings")).isNotBlank(); - } - @Ignore("uses real data - please setup ENV") @Test public void consent_authorisation_bankinggateway() { diff --git a/multibanking-server/src/test/java/de/adorsys/multibanking/service/FigoPaymentTest.java b/multibanking-server/src/test/java/de/adorsys/multibanking/service/FigoPaymentTest.java deleted file mode 100644 index 498326403..000000000 --- a/multibanking-server/src/test/java/de/adorsys/multibanking/service/FigoPaymentTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package de.adorsys.multibanking.service; - -import de.adorsys.multibanking.domain.*; -import de.adorsys.multibanking.figo.FigoBanking; -import de.adorsys.multibanking.pers.spi.repository.UserRepositoryIf; -import lombok.extern.slf4j.Slf4j; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit4.SpringRunner; - -import java.math.BigDecimal; -import java.util.List; - -import static de.adorsys.multibanking.domain.ScaStatus.FINALISED; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -@Ignore -public class FigoPaymentTest { - - @Autowired - private BookingService bookingService; - @Autowired - private BankAccountService bankAccountService; - @Autowired - private PaymentService paymentService; - @Autowired - private UserRepositoryIf userRepository; - - @MockBean - private OnlineBankingServiceProducer bankingServiceProducer; - - @BeforeClass - public static void beforeClass() { - TestConstants.setup(); - - // System.setProperty("FIGO_CLIENT_ID", ""); - // System.setProperty("FIGO_SECRET", ""); - System.setProperty("FIGO_TECH_USER", "figo-user"); - System.setProperty("FIGO_TECH_USER_CREDENTIAL", "test123"); - } - - @Before - public void beforeTest() { - MockitoAnnotations.initMocks(this); - when(bankingServiceProducer.getBankingService(anyString())).thenReturn(new FigoBanking(BankApi.FIGO)); - when(bankingServiceProducer.getBankingService(BankApi.FIGO)).thenReturn(new FigoBanking(BankApi.FIGO)); - when(bankingServiceProducer.getBankingService(BankApi.HBCI)).thenReturn(new FigoBanking(BankApi.FIGO)); - } - - @Test - public void testFigoPayment() throws Exception { - UserEntity userEntity = TestUtil.getUserEntity("test-user-id"); - userRepository.save(userEntity); - - BankAccessEntity bankAccessEntity = TestUtil.getBankAccessEntity("test-user-id", "test-access-id", - System.getProperty("blz")); - bankAccessEntity.setCategorizeBookings(false); - bankAccessEntity.setStoreAnalytics(false); - - List bankAccountEntities = bankAccountService.loadBankAccountsOnline(null, bankAccessEntity, - null); - BankAccountEntity bankAccountEntitity = bankAccountEntities.stream() - .filter(bankAccountEntity -> bankAccountEntity.getAccountNumber().equals("12324463")) - .findFirst().get(); - - bookingService.syncBookings(FINALISED, null, bankAccessEntity, bankAccountEntitity, BankApi.FIGO); - - SinglePaymentEntity paymentEntity = new SinglePaymentEntity(); - paymentEntity.setReceiverIban("receiver_iban_needed_here"); - paymentEntity.setReceiver("Alexander Geist"); - paymentEntity.setAmount(new BigDecimal(1)); - paymentEntity.setPurpose("test"); - - paymentService.createSinglePayment(bankAccessEntity, null, paymentEntity); - paymentService.submitSinglePayment(paymentEntity, bankAccessEntity, null, "tan_needed_here"); - } -} diff --git a/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciBulkPaymentTest.java b/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciBulkPaymentTest.java index a36340ad6..40d4d3da3 100644 --- a/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciBulkPaymentTest.java +++ b/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciBulkPaymentTest.java @@ -49,7 +49,6 @@ public static void beforeClass() { public void beforeTest() { MockitoAnnotations.initMocks(this); when(bankingServiceProducer.getBankingService(anyString())).thenReturn(new HbciBanking(null, 0, 0, 0)); - when(bankingServiceProducer.getBankingService(BankApi.FIGO)).thenReturn(new HbciBanking(null, 0, 0, 0)); when(bankingServiceProducer.getBankingService(BankApi.HBCI)).thenReturn(new HbciBanking(null, 0, 0, 0)); bankRepository.findByBankCode(System.getProperty("blz")).orElseGet(() -> { diff --git a/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciSinglePaymentTest.java b/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciSinglePaymentTest.java index 8e7e24c4f..00e424356 100644 --- a/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciSinglePaymentTest.java +++ b/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciSinglePaymentTest.java @@ -58,7 +58,6 @@ public void beforeTest() throws IOException { MockitoAnnotations.initMocks(this); when(bankingServiceProducer.getBankingService(anyString())).thenReturn(hbci4JavaBanking); - when(bankingServiceProducer.getBankingService(BankApi.FIGO)).thenReturn(hbci4JavaBanking); when(bankingServiceProducer.getBankingService(BankApi.HBCI)).thenReturn(hbci4JavaBanking); bankRepository.findByBankCode(System.getProperty("blz")).orElseGet(() -> { diff --git a/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciStandingOrderTest.java b/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciStandingOrderTest.java index 1db628238..85aef6332 100644 --- a/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciStandingOrderTest.java +++ b/multibanking-server/src/test/java/de/adorsys/multibanking/service/HbciStandingOrderTest.java @@ -51,7 +51,6 @@ public static void beforeClass() { public void beforeTest() { MockitoAnnotations.initMocks(this); when(bankingServiceProducer.getBankingService(anyString())).thenReturn(new HbciBanking(null, 0, 0, 0)); - when(bankingServiceProducer.getBankingService(BankApi.FIGO)).thenReturn(new HbciBanking(null, 0, 0, 0)); when(bankingServiceProducer.getBankingService(BankApi.HBCI)).thenReturn(new HbciBanking(null, 0, 0, 0)); bankRepository.findByBankCode(System.getProperty("blz")).orElseGet(() -> { diff --git a/multibanking-server/src/test/java/de/adorsys/multibanking/service/ImportBanks.java b/multibanking-server/src/test/java/de/adorsys/multibanking/service/ImportBanks.java index 5e1c9eae8..007a8b9b7 100755 --- a/multibanking-server/src/test/java/de/adorsys/multibanking/service/ImportBanks.java +++ b/multibanking-server/src/test/java/de/adorsys/multibanking/service/ImportBanks.java @@ -173,11 +173,7 @@ private static void merge() throws IOException { } bankEntity.setBic(bankInfo.getBic()); - if (bankInfo.getPinTanVersion() != null) { - bankEntity.setBankApi(BankApi.HBCI); - } else { - bankEntity.setBankApi(BankApi.FIGO); - } + bankEntity.setBankApi(BankApi.HBCI); }); } diff --git a/multibanking-server/src/test/java/de/adorsys/multibanking/service/SyncTest.java b/multibanking-server/src/test/java/de/adorsys/multibanking/service/SyncTest.java index e7848c730..c81396973 100644 --- a/multibanking-server/src/test/java/de/adorsys/multibanking/service/SyncTest.java +++ b/multibanking-server/src/test/java/de/adorsys/multibanking/service/SyncTest.java @@ -69,7 +69,6 @@ public void beforeTest() throws IOException { MockitoAnnotations.initMocks(this); when(bankingServiceProducer.getBankingService(anyString())).thenReturn(hbci4JavaBanking); - when(bankingServiceProducer.getBankingService(BankApi.FIGO)).thenReturn(hbci4JavaBanking); when(bankingServiceProducer.getBankingService(BankApi.HBCI)).thenReturn(hbci4JavaBanking); if (rulesFile.exists()) { diff --git a/onlinebanking-facade/src/main/java/de/adorsys/multibanking/domain/BankApi.java b/onlinebanking-facade/src/main/java/de/adorsys/multibanking/domain/BankApi.java index bdeb53448..46b6e53ff 100755 --- a/onlinebanking-facade/src/main/java/de/adorsys/multibanking/domain/BankApi.java +++ b/onlinebanking-facade/src/main/java/de/adorsys/multibanking/domain/BankApi.java @@ -17,5 +17,5 @@ package de.adorsys.multibanking.domain; public enum BankApi { - HBCI, FIGO, XS2A, ING, FIGO_ALTERNATIVE + HBCI, XS2A } diff --git a/onlinebanking-figo/pom.xml b/onlinebanking-figo/pom.xml deleted file mode 100755 index 9d721b8d4..000000000 --- a/onlinebanking-figo/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - - de.adorsys.multibanking - multibanking - 5.5.35-SNAPSHOT - - - onlinebanking-figo - jar - - - - de.adorsys.multibanking - onlinebanking-facade - 5.5.35-SNAPSHOT - - - org.slf4j - slf4j-api - - - me.figo - sdk - 3.2.0 - - - org.apache.commons - commons-lang3 - - - de.adorsys.envutils - envutils4j - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - io.rest-assured - rest-assured - test - - - - - - - maven-compiler-plugin - - - - diff --git a/onlinebanking-figo/readme.md b/onlinebanking-figo/readme.md deleted file mode 100644 index 2233605de..000000000 --- a/onlinebanking-figo/readme.md +++ /dev/null @@ -1,8 +0,0 @@ -# Onlinebanking Figo - -## Introduction - -The *Figo* is a standardized banking interface to access e.g. banking accounts and transaction data. - -The *Onlinebanking Figo* is an implementation of the *Onlinebanking Facade* and therefore provides methods to get -authorized access to the API, load bookings, accounts, etc. \ No newline at end of file diff --git a/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoBanking.java b/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoBanking.java deleted file mode 100755 index 4ea511fd6..000000000 --- a/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoBanking.java +++ /dev/null @@ -1,445 +0,0 @@ -package de.adorsys.multibanking.figo; - -import de.adorsys.multibanking.domain.*; -import de.adorsys.multibanking.domain.exception.MultibankingException; -import de.adorsys.multibanking.domain.request.TransactionRequest; -import de.adorsys.multibanking.domain.response.*; -import de.adorsys.multibanking.domain.spi.OnlineBankingService; -import de.adorsys.multibanking.domain.spi.StrongCustomerAuthorisable; -import de.adorsys.multibanking.domain.transaction.*; -import me.figo.FigoConnection; -import me.figo.FigoException; -import me.figo.FigoSession; -import me.figo.internal.*; -import me.figo.models.Account; -import me.figo.models.AccountBalance; -import me.figo.models.BankLoginSettings; -import org.adorsys.envutils.EnvProperties; -import org.apache.commons.lang3.RandomStringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.net.URLDecoder; -import java.security.SecureRandom; -import java.util.*; -import java.util.stream.Collectors; - -import static de.adorsys.multibanking.domain.exception.MultibankingError.INVALID_PIN; -import static de.adorsys.multibanking.domain.exception.MultibankingError.INVALID_TAN; -import static de.adorsys.multibanking.domain.utils.Utils.getSecureRandom; - -/** - * Created by alexg on 17.05.17. - */ -public class FigoBanking implements OnlineBankingService { - - private static final String MAIL_SUFFIX = "@admb.de"; - private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#%^*()" + - "-_=+[{]},<>"; - private static SecureRandom random = getSecureRandom(); - private FigoConnection figoConnection; - private Logger logger = LoggerFactory.getLogger(getClass()); - - private String figoTechUser; - private String figoTechUserCredential; - - private BankApi bankApi; - - public FigoBanking(BankApi bankApi) { - this.bankApi = bankApi; - - String clientId = EnvProperties.getEnvOrSysProp("FIGO_CLIENT_ID", true); - String secret = EnvProperties.getEnvOrSysProp("FIGO_SECRET", true); - String timeout = EnvProperties.getEnvOrSysProp("FIGO_TIMEOUT", "0"); - String connectionUrl = EnvProperties.getEnvOrSysProp("FIGO_CONNECTION_URL", "https://api.figo.me"); - - if (bankApi == BankApi.FIGO_ALTERNATIVE) { - clientId = EnvProperties.getEnvOrSysProp("FIGO_ALTERNATIVE_CLIENT_ID", clientId); - secret = EnvProperties.getEnvOrSysProp("FIGO_ALTERNATIVE_SECRETT", secret); - timeout = EnvProperties.getEnvOrSysProp("FIGO_ALTERNATIVE_TIMEOUT", timeout); - connectionUrl = EnvProperties.getEnvOrSysProp("FIGO_ALTERNATIVE_CONNECTION_URL", connectionUrl); - logger = LoggerFactory.getLogger("figo.FigoBankingAlternative"); - } - - if (clientId == null || secret == null) { - logger.warn("missing env properties FIGO_CLIENT_ID and/or FIGO_SECRET"); - } else { - figoConnection = new FigoConnection(clientId, secret, "http://nowhere.here", Integer.parseInt(timeout), - connectionUrl); - } - - figoTechUser = EnvProperties.getEnvOrSysProp("FIGO_TECH_USER", true); - figoTechUserCredential = EnvProperties.getEnvOrSysProp("FIGO_TECH_USER_CREDENTIAL", true); - if (figoTechUser == null || figoTechUserCredential == null) { - logger.warn("missing env properties FIGO_TECH_USER and/or FIGO_TECH_USER_CREDENTIAL"); - } - } - - @Override - public BankApi bankApi() { - return bankApi; - } - - @Override - public boolean externalBankAccountRequired() { - return true; - } - - @Override - public boolean bankSupported(String bankCode) { - if (figoConnection == null) { - throw new IllegalArgumentException("figo connection not available, check env properties FIGO_CLIENT_ID " + - "and/or FIGO_SECRET"); - } - return true; - } - - @Override - public boolean bookingsCategorized() { - return false; - } - - @Override - public PaymentResponse executePayment(TransactionRequest paymentRequest) { - return null; - } - - @Override - public boolean userRegistrationRequired() { - return true; - } - - @Override - public BankApiUser registerUser(String userId) { - if (figoConnection == null) { - throw new IllegalArgumentException("figo connection not available, check env properties FIGO_CLIENT_ID " + - "and/or FIGO_SECRET"); - } - - String password = RandomStringUtils.random(20, 0, 0, false, false, CHARACTERS.toCharArray(), random); - String apiUserId = userId + RandomStringUtils.randomAlphanumeric(10); - String email = apiUserId + MAIL_SUFFIX; - - try { - figoConnection.addUser(userId, email, password, "de"); - } catch (IOException | FigoException e) { - throw new IllegalStateException(e); - } - - BankApiUser bankApiUser = new BankApiUser(); - bankApiUser.setApiUserId(apiUserId); - bankApiUser.setApiPassword(password); - bankApiUser.setBankApi(bankApi()); - - return bankApiUser; - } - - @Override - public void removeUser(BankApiUser bankApiUser) { - try { - TokenResponse tokenResponse = figoConnection.credentialLogin(bankApiUser.getApiUserId() + MAIL_SUFFIX, - bankApiUser.getApiPassword()); - FigoSession session = createSession(tokenResponse.getAccessToken()); - session.removeUser(); - } catch (IOException | FigoException e) { - throw new IllegalStateException(e); - } - } - - @Override - public AccountInformationResponse loadBankAccounts(TransactionRequest loadAccountInformationRequest) { - - BankApiUser bankApiUser = loadAccountInformationRequest.getBankApiUser(); - BankAccess bankAccess = loadAccountInformationRequest.getBankAccess(); - - try { - TokenResponse tokenResponse = figoConnection.credentialLogin(bankApiUser.getApiUserId() + MAIL_SUFFIX, - bankApiUser.getApiPassword()); - FigoSession session = createSession(tokenResponse.getAccessToken()); - - TaskTokenResponse response = session.setupNewAccount( - bankAccess.getBankCode(), - "de", - createCredentials( -// loadAccountInformationRequest.getCredentials().getCustomerId(), -// loadAccountInformationRequest.getCredentials().getUserId(), -// loadAccountInformationRequest.getCredentials().getPin() - ), - Collections.singletonList("standingOrders"), - false, - true - ); - - String taskToken = response.getTaskToken(); - while (checkState(session, taskToken) == Status.SYNC) { - Thread.sleep(1000); - } - - updateTanTransportTypes(bankAccess, session.getAccounts()); - - return AccountInformationResponse.builder() - .bankAccounts(session.getAccounts().stream() - .map(account -> FigoMapping.mapBankAccount(account, bankApi)) - .collect(Collectors.toList())) - .build(); - } catch (IOException | FigoException | InterruptedException e) { - throw new IllegalStateException(e); - } - } - - public Bank getBankLoginSettings(String bankCode) { - FigoSession figoSession = loginTechUser(); - - BankLoginSettings figoBankLoginSettings; - try { - figoBankLoginSettings = figoSession.queryApi("/rest/catalog/banks/de/" + bankCode, null, "GET", - BankLoginSettings.class); - } catch (IOException | FigoException e) { - throw new IllegalStateException(e); - } - Bank bank = new Bank(); - bank.setName(figoBankLoginSettings.getBankName()); - - de.adorsys.multibanking.domain.BankLoginSettings loginSettings = - new de.adorsys.multibanking.domain.BankLoginSettings(); - bank.setLoginSettings(loginSettings); - - loginSettings.setAdvice(figoBankLoginSettings.getAdvice()); - loginSettings.setAuth_type(figoBankLoginSettings.getAuthType()); - loginSettings.setIcon(figoBankLoginSettings.getIcon()); -// loginSettings.setSupported(figoBankLoginSettings.isSupported()); - loginSettings.setCredentials(new ArrayList<>()); - - figoBankLoginSettings.getCredentials().forEach(credential -> { - BankLoginCredentialInfo bankLoginCredential = new BankLoginCredentialInfo(); - bankLoginCredential.setLabel(credential.getLabel()); - bankLoginCredential.setMasked(credential.isMasked()); - bankLoginCredential.setOptional(credential.isOptional()); - - loginSettings.getCredentials().add(bankLoginCredential); - }); - - return bank; - } - - private BalancesReport getBalance(FigoSession figoSession, String accountId) { - try { - Account account = figoSession.getAccount(accountId); - AccountBalance accountBalance = account.getBalance(); - return new BalancesReport().readyBalance(Balance.builder().amount(accountBalance.getBalance()).build()); - } catch (IOException | FigoException e) { - throw new IllegalStateException(e); - } - } - - @Override - public void removeBankAccount(BankAccount bankAccount, BankApiUser bankApiUser) { - try { - TokenResponse tokenResponse = figoConnection.credentialLogin(bankApiUser.getApiUserId() + MAIL_SUFFIX, - bankApiUser.getApiPassword()); - FigoSession session = createSession(tokenResponse.getAccessToken()); - - session.removeAccount(bankAccount.getExternalIdMap().get(bankApi())); - } catch (IOException | FigoException e) { - throw new IllegalStateException(e); - } - } - - @Override - public TransactionsResponse loadTransactions(TransactionRequest loadTransactionsRequest) { - BankApiUser bankApiUser = loadTransactionsRequest.getBankApiUser(); - BankAccount bankAccount = loadTransactionsRequest.getTransaction().getPsuAccount(); - - try { - TokenResponse tokenResponse = figoConnection.credentialLogin(bankApiUser.getApiUserId() + "@admb.de", - bankApiUser.getApiPassword()); - FigoSession session = createSession(tokenResponse.getAccessToken()); - - TaskTokenResponse response = session.queryApi("/rest/sync", - new SyncTokenRequest( - RandomStringUtils.randomAlphanumeric(5), - null, - Collections.singletonList("standingOrders"), - Collections.singletonList(bankAccount.getExternalIdMap().get(bankApi())), - true, // disable_notifications - 0, // if_not_synced_since - false // auto_continue - ), - "POST", TaskTokenResponse.class); - - Status status = waitForFinish(session, response.getTaskToken()); - if (status == Status.PIN) { -// submitPin(response.getTaskToken(), loadBookingsRequest.getCredentials().getPin(), session); - } - - List bookings = session.getTransactions(bankAccount.getExternalIdMap().get(bankApi())) - .stream() - .map(transaction -> FigoMapping.mapBooking(transaction, bankApi)) - .collect(Collectors.toList()); - - updateTanTransportTypes(loadTransactionsRequest.getBankAccess(), session.getAccounts()); - - return TransactionsResponse.builder() - .bookings(bookings) - .build(); - - } catch (IOException | FigoException | InterruptedException e) { - throw new IllegalStateException(e); - } - } - - @Override - public StandingOrdersResponse loadStandingOrders(TransactionRequest loadStandingOrdersRequest) { - throw new UnsupportedOperationException(); - } - - @Override - public LoadBalancesResponse loadBalances(TransactionRequest request) { - throw new UnsupportedOperationException(); - } - - @Override - public StrongCustomerAuthorisable getStrongCustomerAuthorisation() { - throw new UnsupportedOperationException(); - } - - private TaskStatusResponse submitPin(String taskToken, String pin, FigoSession session) throws FigoException, - InterruptedException, IOException { - TaskStatusResponse response = session.queryApi("/task/progress?id=" + taskToken, - new TaskStatusRequest(taskToken, pin), "POST", TaskStatusResponse.class); - Status status = waitForFinish(session, taskToken); - - if (status != Status.OK && status != Status.TAN) { - throw new MultibankingException(INVALID_PIN, response.getMessage()); - } - return response; - } - - private void submitTan(String taskToken, String tan, FigoSession session) throws FigoException, - InterruptedException, IOException { - TaskStatusRequest taskStatusRequest = new TaskStatusRequest(taskToken); - taskStatusRequest.setResponse(tan); - - session.queryApi("/task/progress?id=" + taskToken, taskStatusRequest, "POST", TaskStatusResponse.class); - Status status = waitForFinish(session, taskToken); - - if (status != Status.OK) { - throw new MultibankingException(INVALID_TAN, Collections.emptyList()); - } - } - - private void updateTanTransportTypes(BankAccess bankAccess, List accounts) { - List tanTransportTypes = accounts - .stream() - .map(Account::getSupportedTanSchemes) - .flatMap(Collection::stream) - .map(FigoMapping::mapTanTransportTypes) - .collect(Collectors.toList()); - if (bankAccess.getTanTransportTypes() == null) { - bankAccess.setTanTransportTypes(new HashMap<>()); - } - - bankAccess.getTanTransportTypes().put(bankApi(), tanTransportTypes); - } - - private Status waitForFinish(FigoSession session, String taskToken) throws IOException, FigoException, - InterruptedException { - Status status; - while ((status = checkState(session, taskToken)) == Status.SYNC) { - Thread.sleep(1000); - } - - return status; - } - - private Status checkState(FigoSession figoSession, String taskToken) throws IOException, FigoException { - TaskStatusResponse taskStatus; - try { - taskStatus = figoSession.getTaskState(taskToken); - logger.info("figo.getTaskState {} {}", taskStatus.getAccountId(), taskStatus.getMessage()); - } catch (IOException | FigoException e) { - throw new IllegalStateException(e); - } - - return resolveStatus(taskStatus); - } - - private Status resolveStatus(TaskStatusResponse taskStatus) throws IOException, FigoException { - if (!taskStatus.isEnded() && !taskStatus.isErroneous() && !taskStatus.isWaitingForPin() - && !taskStatus.isWaitingForResponse()) { - return Status.SYNC; - } - - if (taskStatus.isWaitingForPin()) { - return Status.PIN; - } - - if (taskStatus.isWaitingForResponse()) { - return Status.TAN; - } - - if (taskStatus.isErroneous()) { - if (taskStatus.getError().getCode() == 10000 || taskStatus.getError().getCode() == 10001) { - throw new MultibankingException(INVALID_PIN, taskStatus.getError().getMessage()); - } - throw new IllegalStateException(taskStatus.getError().getMessage()); - } - - return Status.OK; - } - - String extractTaskToken(URL url) throws UnsupportedEncodingException { - String query = url.getQuery(); - String[] pairs = query.split("&"); - for (String pair : pairs) { - if (pair.startsWith("id=")) { - String id = pair.substring(3); - return URLDecoder.decode(id, "UTF-8"); - } - } - return null; - } - - /** - * Erzeugt eine ZB-Session mit dem technischen Figo-User. - */ - private FigoSession loginTechUser() { - String username = figoTechUser + MAIL_SUFFIX; - String accessToken; - - try { - accessToken = figoConnection.credentialLogin(username, figoTechUserCredential).getAccessToken(); - } catch (Exception e) { - //login not possible, try create technical user - try { - figoConnection.addUser(figoTechUser, username, figoTechUserCredential, "de"); - accessToken = figoConnection.credentialLogin(username, figoTechUserCredential).getAccessToken(); - } catch (Exception e1) { - throw new IllegalStateException(e); - } - } - - return createSession(accessToken); - } - - private FigoSession createSession(String accessToken) { - return new FigoSession(accessToken, figoConnection.getTimeout(), figoConnection.getApiEndpoint()); - } - - private List createCredentials(String... credentials) { - return Arrays.stream(credentials) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } - - public enum Status { - OK, - SYNC, - PIN, - TAN, - ERROR - } -} diff --git a/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoMapping.java b/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoMapping.java deleted file mode 100644 index d7a9aeab7..000000000 --- a/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoMapping.java +++ /dev/null @@ -1,133 +0,0 @@ -package de.adorsys.multibanking.figo; - -import de.adorsys.multibanking.domain.*; -import de.adorsys.multibanking.domain.transaction.SinglePayment; -import de.adorsys.multibanking.domain.utils.Utils; -import me.figo.models.Account; -import me.figo.models.Challenge; -import me.figo.models.TanScheme; -import me.figo.models.Transaction; -import org.apache.commons.lang3.StringUtils; - -import java.time.ZoneId; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -/** - * Created by alexg on 13.09.17. - */ -public class FigoMapping { - - private static final Map FIGO_CYCLE = new HashMap<>(); - private static final Map FIGO_TRANSFER = new HashMap<>(); - - static { - FIGO_CYCLE.put(Frequency.WEEKLY, "weekly"); - FIGO_CYCLE.put(Frequency.MONTHLY, "monthly"); - FIGO_CYCLE.put(Frequency.TWO_MONTHLY, "two monthly"); - FIGO_CYCLE.put(Frequency.QUARTERLY, "quarterly"); - FIGO_CYCLE.put(Frequency.HALF_YEARLY, "half yearly"); - FIGO_CYCLE.put(Frequency.YEARLY, "yearly"); - - FIGO_TRANSFER.put(SinglePayment.TransactionType.SINGLE_PAYMENT, "SEPA transfer"); - FIGO_TRANSFER.put(SinglePayment.TransactionType.STANDING_ORDER, "SEPA standing order"); - } - - public static BankAccount mapBankAccount(Account account, BankApi bankApi) { - return new BankAccount() - .externalId(bankApi, account.getAccountId()) - .owner(account.getOwner()) - .accountNumber(account.getAccountNumber()) - .name(account.getName()) - .bankName(account.getBankName()) - .bic(account.getBIC()) - .blz(account.getBankCode()) - .iban(account.getIBAN()) - .type(BankAccountType.fromFigoType(account.getType())) - .balances(new BalancesReport() - .readyBalance(Balance.builder().amount(account.getBalance().getBalance()).build())); - } - - public static Booking mapBooking(Transaction transaction, BankApi bankApi) { - Booking booking = new Booking(); - booking.setExternalId(transaction.getTransactionId()); - booking.setBankApi(bankApi); - booking.setBookingDate(transaction.getBookingDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); - booking.setValutaDate(transaction.getValueDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); - booking.setAmount(transaction.getAmount()); - booking.setUsage(transaction.getPurposeText()); - booking.setText(transaction.getBookingText()); - booking.setTransactionCode(transaction.getTransactionCode()); - booking.setOtherAccount(mapBookingAccount(transaction)); - booking.setCreditorId(Utils.extractCreditorId(transaction.getPurposeText())); - booking.setMandateReference(Utils.extractMandateReference(transaction.getPurposeText())); - return booking; - } - - public static BankAccount mapBookingAccount(Transaction transaction) { - BankAccount bankAccount = new BankAccount(); - bankAccount.setName(transaction.getName()); - bankAccount.setBankName(transaction.getBankName()); - bankAccount.setCurrency(transaction.getCurrency()); - bankAccount.setAccountNumber(transaction.getAccountNumber()); - bankAccount.setBlz(transaction.getBankCode()); - bankAccount.setIban(Utils.extractIban(transaction.getPurposeText())); - return bankAccount; - } - - public static TanTransportType mapTanTransportTypes(TanScheme tanScheme) { - return TanTransportType.builder() - .id(tanScheme.getTan_scheme_id()) - .name(tanScheme.getName()) -// .medium(tanScheme.getMedium_name()) - .build(); - } - - public static me.figo.models.Payment mapToFigoPayment(String accountId, SinglePayment payment) { - me.figo.models.Payment figoPayment = new me.figo.models.Payment(); - figoPayment.setAccountId(accountId); - - if (!StringUtils.isEmpty(payment.getReceiverIban())) { - figoPayment.setIban(payment.getReceiverIban()); - } else { - figoPayment.setBankCode(payment.getReceiverBankCode()); - figoPayment.setAccountNumber(payment.getReceiverAccountNumber()); - } - - figoPayment.setAmount(payment.getAmount()); - figoPayment.setCurrency(payment.getCurrency()); - figoPayment.setType(FIGO_TRANSFER.get(payment.getTransactionType())); - figoPayment.setName(payment.getReceiver()); - figoPayment.setPurpose(payment.getPurpose()); - - // Mögliche Dauerauftragsattribute -// if (payment.getExecutionDay() > -1) { -// figoPayment.setExecution_day(payment.getExecutionDay()); -// } -// -// if (payment.getFirstExecutionDate() != null) { -// figoPayment.setFirst_execution_date(Date.from( -// payment.getFirstExecutionDate().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())); -// } -// -// if (payment.getLastExecutionDate() != null) { -// figoPayment.setLast_execution_date(Date.from( -// payment.getLastExecutionDate().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())); -// } -// -// if (payment.getCycle() != null) { -// figoPayment.setInterval(FIGO_CYCLE.get(payment.getCycle())); -// } - - return figoPayment; - } - - public static ChallengeData mapToChallenge(Challenge challenge) { - ChallengeData challengeData = new ChallengeData(); - challengeData.setData(Collections.singletonList(challenge.getData())); - challengeData.setOtpFormat(challenge.getFormat()); - challengeData.setAdditionalInformation(challenge.getTitle()); - return challengeData; - } -} diff --git a/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoTanSubmit.java b/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoTanSubmit.java deleted file mode 100644 index 530760daa..000000000 --- a/onlinebanking-figo/src/main/java/de/adorsys/multibanking/figo/FigoTanSubmit.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.adorsys.multibanking.figo; - -import lombok.Builder; -import lombok.Data; - -/** - * Created by alexg on 16.11.17. - */ -@Data -@Builder -public class FigoTanSubmit { - - private String accessToken; - private String taskToken; -} diff --git a/onlinebanking-figo/src/test/java/de/adorsys/multibanking/figo/FigoBankingTest.java b/onlinebanking-figo/src/test/java/de/adorsys/multibanking/figo/FigoBankingTest.java deleted file mode 100644 index 8ba213108..000000000 --- a/onlinebanking-figo/src/test/java/de/adorsys/multibanking/figo/FigoBankingTest.java +++ /dev/null @@ -1,122 +0,0 @@ -package de.adorsys.multibanking.figo; - -import de.adorsys.multibanking.domain.BankAccess; -import de.adorsys.multibanking.domain.BankApi; -import lombok.val; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; - -/** - * Created on 2019-07-24. - * - * @author mafo - */ -public class FigoBankingTest { - - private static final String FIGO_TEST_USER = "demo"; - private static final String FIGO_TEST_PIN = "demo"; - private static final String FIGO_TEST_BANKCODE = "90090042"; - - private FigoBanking service; - - @Before - public void init() { - service = new FigoBanking(BankApi.FIGO); - } - - @Ignore("Use System Variables e.g. from de.adorsys.multibanking.service.FigoPaymentTest") - @Test - public void registerUser_should_successfully_run() { - val result = service.registerUser(FIGO_TEST_USER); - - assertThat(result, allOf( - hasProperty("apiUserId", notNullValue()), - hasProperty("apiPassword", notNullValue()), - hasProperty("bankApi", is(BankApi.FIGO)) - )); - } - - @Ignore("Use System Variables e.g. from de.adorsys.multibanking.service.FigoPaymentTest") - @Test - public void registerUser_should_successfully_run_twice() { - service.registerUser(FIGO_TEST_USER); - val result2 = service.registerUser(FIGO_TEST_USER); - - assertThat(result2, allOf( - hasProperty("apiUserId", notNullValue()), - hasProperty("apiPassword", notNullValue()), - hasProperty("bankApi", is(BankApi.FIGO)) - )); - - } - - @Ignore("Use System Variables e.g. from de.adorsys.multibanking.service.FigoPaymentTest") - @Test - public void removeUser_should_successfully_run_after_registerUser() { - val result = service.registerUser(FIGO_TEST_USER); - - service.removeUser(result); - - // success - } - - @Ignore("Use System Variables e.g. from de.adorsys.multibanking.service.FigoPaymentTest") - @Test - public void loadBankAccounts_should_successfully_run_after_registerUser() { - val bankaccess = getFigoTestUser(); - val result = service.registerUser(FIGO_TEST_USER); - -// val request = new LoadAccountInformationRequest(); -// request.setBankAccess(bankaccess); -// request.setBankApiUser(result); -// request.setBankCode(FIGO_TEST_BANKCODE); -// -// val response = service.loadBankAccounts(request); -// -// assertThat(response, allOf( -// hasProperty("bankAccounts", hasSize(3)) -// )); - } - - @Ignore("Use System Variables e.g. from de.adorsys.multibanking.service.FigoPaymentTest") - @Test - public void loadBookings_should_successfully_run_after_registerUser() { - val bankaccess = getFigoTestUser(); - val result = service.registerUser(FIGO_TEST_USER); -// val request = new LoadAccountInformationRequest(); -// request.setBankAccess(bankaccess); -// request.setBankApiUser(result); -// request.setBankCode(FIGO_TEST_BANKCODE); - -// val result2 = service.loadBankAccounts(request); -// val request2 = new LoadBookingsRequest(); -// request2.setBankAccess(bankaccess); -// request2.setBankApiUser(result); -// request2.setBankCode(FIGO_TEST_BANKCODE); -// request2.setCredentials(Credentials.builder().pin(FIGO_TEST_PIN).build()); -// request2.setBankAccount(result2.getBankAccounts().get(0)); - -// val response = service.loadBookings(request2); - -// assertThat(response, allOf( -// hasProperty("bookings", hasSize(85)), -// hasProperty("standingOrders", hasSize(0)), -// hasProperty("bankAccountBalance", allOf( -// hasProperty("readyBalance", allOf( -// hasProperty("amount", is(new BigDecimal(3250.31))) -// )) -// )) -// )); - } - - private BankAccess getFigoTestUser() { - val bankAccess = new BankAccess(); - bankAccess.setBankCode(FIGO_TEST_BANKCODE); - return bankAccess; - } - -} diff --git a/onlinebanking-ing/pom.xml b/onlinebanking-ing/pom.xml deleted file mode 100644 index 12522c7d3..000000000 --- a/onlinebanking-ing/pom.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - multibanking - de.adorsys.multibanking - 5.5.35-SNAPSHOT - - 4.0.0 - - onlinebanking-ing - - - - de.adorsys.multibanking - onlinebanking-facade - 5.5.35-SNAPSHOT - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.apache.httpcomponents - httpclient - - - commons-logging - commons-logging - 1.1.1 - - - org.slf4j - slf4j-api - - - org.iban4j - iban4j - - - org.mapstruct - mapstruct - - - org.projectlombok - lombok - provided - - - - - junit - junit - test - - - org.bouncycastle - bcpkix-jdk15on - 1.57 - test - - - - diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngAdapter.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngAdapter.java deleted file mode 100644 index 8ae1dce6e..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngAdapter.java +++ /dev/null @@ -1,269 +0,0 @@ -package de.adorsys.multibanking.ing; - -import de.adorsys.multibanking.domain.BalancesReport; -import de.adorsys.multibanking.domain.BankAccount; -import de.adorsys.multibanking.domain.BankApi; -import de.adorsys.multibanking.domain.BankApiUser; -import de.adorsys.multibanking.domain.exception.MultibankingException; -import de.adorsys.multibanking.domain.request.TransactionRequest; -import de.adorsys.multibanking.domain.response.*; -import de.adorsys.multibanking.domain.spi.OnlineBankingService; -import de.adorsys.multibanking.domain.spi.StrongCustomerAuthorisable; -import de.adorsys.multibanking.domain.transaction.*; -import de.adorsys.multibanking.ing.api.Account; -import de.adorsys.multibanking.ing.api.AccountsResponse; -import de.adorsys.multibanking.ing.api.Balance; -import de.adorsys.multibanking.ing.api.BalancesResponse; -import de.adorsys.multibanking.ing.http.ApacheHttpClient; -import de.adorsys.multibanking.ing.http.HttpClient; -import de.adorsys.multibanking.ing.http.Pkcs12KeyStore; -import de.adorsys.multibanking.ing.http.StringUri; -import de.adorsys.multibanking.ing.model.Response; -import de.adorsys.multibanking.ing.oauth.ClientAuthentication; -import de.adorsys.multibanking.ing.oauth.ClientAuthenticationFactory; -import de.adorsys.multibanking.ing.oauth.IngOauth2Service; -import de.adorsys.multibanking.ing.oauth.Oauth2Api; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.HttpClientBuilder; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import java.net.URL; -import java.security.PrivateKey; -import java.security.cert.X509Certificate; -import java.util.*; - -import static de.adorsys.multibanking.domain.BankApi.ING; -import static de.adorsys.multibanking.domain.exception.MultibankingError.INTERNAL_ERROR; -import static de.adorsys.multibanking.domain.exception.MultibankingError.INVALID_ACCOUNT_REFERENCE; -import static de.adorsys.multibanking.ing.http.ResponseHandlers.jsonResponseHandler; - -@RequiredArgsConstructor -@Slf4j -public class IngAdapter implements OnlineBankingService { - - private static final String ACCOUNTS_ENDPOINT = "/v2/accounts"; - private static final String TRANSACTIONS_ENDPOINT = "/v2/accounts/{{accountId}}/transactions"; - private static final String BALANCES_ENDPOINT = "/v3/accounts/{{accountId}}/balances"; - - @NonNull - private final String ingBaseUrl; - @NonNull - private final String keystoreUrl; - @NonNull - private final String keystorePassword; - @NonNull - private final String qwacAlias; - @NonNull - private final String qsealAlias; - - @Getter(lazy = true, value = AccessLevel.PRIVATE) - private final Pkcs12KeyStore keyStore = createKeyStore(); - @Getter(lazy = true, value = AccessLevel.PRIVATE) - private final HttpClient httpClient = createHttpClient(); - @Getter(lazy = true, value = AccessLevel.PRIVATE) - private final IngOauth2Service oauth2Service = createOauthService(); - @Getter(lazy = true, value = AccessLevel.PRIVATE) - private final IngSessionHandler ingSessionHandler = new IngSessionHandler(getOauth2Service()); - @Getter(lazy = true, value = AccessLevel.PRIVATE) - private final IngScaHandler ingScaHandler = new IngScaHandler(getIngSessionHandler()); - - private IngMapper ingMapper = new IngMapperImpl(); - - @Override - public BankApi bankApi() { - return ING; - } - - @Override - public boolean externalBankAccountRequired() { - return false; - } - - @Override - public boolean userRegistrationRequired() { - return true; - } - - @Override - public BankApiUser registerUser(String userId) { - BankApiUser bankApiUser = new BankApiUser(); - bankApiUser.setBankApi(bankApi()); - return bankApiUser; - } - - @Override - public void removeUser(BankApiUser bankApiUser) { - //noop - } - - @Override - public AccountInformationResponse loadBankAccounts(TransactionRequest request) { - IngSessionData ingSessionData = (IngSessionData) request.getBankApiConsentData(); - getIngSessionHandler().checkIngSession((IngSessionData) request.getBankApiConsentData(), - request.getAuthorisationCode()); - - ClientAuthentication clientAuthentication = - getOauth2Service().getClientAuthentication(ingSessionData.getAccessToken()); - - Response response = getHttpClient().get(ingBaseUrl + ACCOUNTS_ENDPOINT) - .send(clientAuthentication, jsonResponseHandler(AccountsResponse.class)); - - return AccountInformationResponse.builder() - .bankAccounts(ingMapper.toBankAccounts(response.getBody().getAccounts())) - .build(); - } - - @Override - public void removeBankAccount(BankAccount bankAccount, BankApiUser bankApiUser) { - //noop - } - - @Override - public TransactionsResponse loadTransactions(TransactionRequest loadTransactionsRequest) { - IngSessionData ingSessionData = (IngSessionData) loadTransactionsRequest.getBankApiConsentData(); - getIngSessionHandler().checkIngSession(ingSessionData, loadTransactionsRequest.getAuthorisationCode()); - - ClientAuthentication clientAuthentication = - getOauth2Service().getClientAuthentication(ingSessionData.getAccessToken()); - - String resourceId = - Optional.ofNullable(loadTransactionsRequest.getTransaction().getPsuAccount().getExternalIdMap().get(bankApi())) - .orElseGet(() -> getAccountResourceId(loadTransactionsRequest.getBankAccess().getIban(), - clientAuthentication).toString()); - - Map queryParams = new LinkedHashMap<>(); - queryParams.put("dateFrom", loadTransactionsRequest.getTransaction().getDateFrom()); - queryParams.put("dateTo", loadTransactionsRequest.getTransaction().getDateTo()); - - String uri = StringUri.withQuery( - ingBaseUrl + TRANSACTIONS_ENDPOINT.replace("{{accountId}}", Objects.requireNonNull(resourceId)), - queryParams - ); - - Response transactionsResponse = getHttpClient().get(uri) - .send(clientAuthentication, - jsonResponseHandler(de.adorsys.multibanking.ing.api.TransactionsResponse.class)); - - return TransactionsResponse.builder() - .bookings(ingMapper.mapToBookings(transactionsResponse.getBody().getTransactions().getBooked())) - .balancesReport(getBalancesReport(clientAuthentication, resourceId)) - .build(); - } - - @Override - public StandingOrdersResponse loadStandingOrders(TransactionRequest loadStandingOrdersRequest) { - throw new UnsupportedOperationException(); - } - - @Override - public LoadBalancesResponse loadBalances(TransactionRequest request) { - throw new UnsupportedOperationException(); - } - - private BalancesReport getBalancesReport(ClientAuthentication clientAuthentication, String resourceId) { - String uri = StringUri.withQuery( - ingBaseUrl + BALANCES_ENDPOINT.replace("{{accountId}}", Objects.requireNonNull(resourceId)), - new HashMap<>() - ); - - BalancesResponse balancesResponse = getHttpClient().get(uri) - .send(clientAuthentication, jsonResponseHandler(BalancesResponse.class)) - .getBody(); - - BalancesReport balancesReport = new BalancesReport(); - for (Balance balance : balancesResponse.getBalances()) { - switch (balance.getBalanceType()) { - case "EXPECTED": - balancesReport.setUnreadyBalance(ingMapper.toBalance(balance)); - break; - case "CLOSINGBOOKED": - balancesReport.setReadyBalance(ingMapper.toBalance(balance)); - break; - default: - // ignore - break; - } - } - - return balancesReport; - } - - private UUID getAccountResourceId(String iban, ClientAuthentication clientAuthentication) { - return getHttpClient().get(ingBaseUrl + ACCOUNTS_ENDPOINT) - .send(clientAuthentication, jsonResponseHandler(AccountsResponse.class)) - .getBody().getAccounts() - .stream() - .filter(accountDetails -> accountDetails.getIban().equals(iban)) - .findAny() - .map(Account::getResourceId) - .orElseThrow(() -> new MultibankingException(INVALID_ACCOUNT_REFERENCE)); - } - - @Override - public boolean bankSupported(String bankCode) { - return true; - } - - @Override - public boolean bookingsCategorized() { - return false; - } - - @Override - public PaymentResponse executePayment(TransactionRequest paymentRequest) { - throw new UnsupportedOperationException(); - } - - @Override - public StrongCustomerAuthorisable getStrongCustomerAuthorisation() { - return getIngScaHandler(); - } - - private IngOauth2Service createOauthService() { - try { - Oauth2Api oauth2Api = new Oauth2Api(ingBaseUrl, getHttpClient()); - - X509Certificate qsealCertificate = getKeyStore().getQsealCertificate(qsealAlias); - PrivateKey qsealPrivateKey = getKeyStore().getQsealPrivateKey(qsealAlias); - ClientAuthenticationFactory clientAuthenticationFactory = new ClientAuthenticationFactory(qsealCertificate, - qsealPrivateKey); - return new IngOauth2Service(oauth2Api, clientAuthenticationFactory); - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new MultibankingException(INTERNAL_ERROR, e.getMessage()); - } - } - - private ApacheHttpClient createHttpClient() { - try { - SSLContext sslContext = getKeyStore().getSslContext(qwacAlias); - SSLSocketFactory socketFactory = sslContext.getSocketFactory(); - SSLConnectionSocketFactory sslSocketFactory = - new SSLConnectionSocketFactory(socketFactory, null, null, (HostnameVerifier) null); - - HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().disableDefaultUserAgent(); - httpClientBuilder.setSSLSocketFactory(sslSocketFactory); - return new ApacheHttpClient(httpClientBuilder.build()); - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new MultibankingException(INTERNAL_ERROR, e.getMessage()); - } - } - - private Pkcs12KeyStore createKeyStore() { - try { - return new Pkcs12KeyStore(new URL(keystoreUrl), keystorePassword.toCharArray()); - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new MultibankingException(INTERNAL_ERROR, e.getMessage()); - } - } -} - diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngMapper.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngMapper.java deleted file mode 100644 index 49dbae154..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngMapper.java +++ /dev/null @@ -1,112 +0,0 @@ -package de.adorsys.multibanking.ing; - -import de.adorsys.multibanking.domain.Balance; -import de.adorsys.multibanking.domain.BankAccount; -import de.adorsys.multibanking.domain.BankApi; -import de.adorsys.multibanking.domain.Booking; -import de.adorsys.multibanking.domain.response.CreateConsentResponse; -import de.adorsys.multibanking.domain.response.UpdateAuthResponse; -import de.adorsys.multibanking.ing.api.Account; -import de.adorsys.multibanking.ing.api.Transaction; -import org.iban4j.Iban; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; - -import java.math.BigDecimal; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; - -import static de.adorsys.multibanking.domain.BankApi.ING; -import static de.adorsys.multibanking.domain.BankApi.XS2A; - -@Mapper -interface IngMapper { - - @Mapping(target = "consentId", expression = "java( java.util.UUID.randomUUID().toString() )") - @Mapping(target = "authorisationId", expression = "java( java.util.UUID.randomUUID().toString() )") - @Mapping(target = "bankApiConsentData", expression = "java( bankApiConsentData )") - @Mapping(target = "redirectId", ignore = true) - @Mapping(target = "authorisationCodeResponse", ignore = true) - @Mapping(target = "messages", ignore = true) - @Mapping(target = "oauthRedirectUrl", ignore = true) - @Mapping(target = "scaApproach", constant = "OAUTH") - CreateConsentResponse toCreateConsentResponse(IngSessionData bankApiConsentData, String redirectUrl); - - @Mapping(target = "challenge", ignore = true) - @Mapping(target = "scaMethods", ignore = true) - @Mapping(target = "authorisationCodeResponse", ignore = true) - @Mapping(target = "messages", ignore = true) - @Mapping(target = "bankApiConsentData", ignore = true) - UpdateAuthResponse toUpdateAuthResponse(IngSessionData ingSessionData, - @MappingTarget UpdateAuthResponse updateAuthResponse); - - List mapToBookings(List transactions); - - @Mapping(source = "valueDate", target = "valutaDate") - @Mapping(source = "transactionAmount.amount", target = "amount") - @Mapping(source = "transactionAmount.currency", target = "currency") - @Mapping(source = "endToEndId", target = "externalId") - @Mapping(source = "remittanceInformationUnstructured.reference", target = "usage") - default Booking toBooking(Transaction transactionDetails) { - Booking booking = new Booking(); - booking.setBankApi(ING); - booking.setBookingDate(transactionDetails.getBookingDate()); - booking.setValutaDate(transactionDetails.getValueDate()); - booking.setAmount(new BigDecimal(transactionDetails.getTransactionAmount().getAmount())); - booking.setCurrency(transactionDetails.getTransactionAmount().getCurrency()); - booking.setExternalId(transactionDetails.getEndToEndId()); - booking.setUsage(transactionDetails.getRemittanceInformationUnstructured()); - booking.setTransactionCode(transactionDetails.getRemittanceInformationStructured() == null ? null : - transactionDetails.getRemittanceInformationStructured().getReferenceType()); - - BankAccount bankAccount = new BankAccount(); - if (transactionDetails.getCreditorName() != null || transactionDetails.getCreditorAccount() != null) { - bankAccount.setOwner(transactionDetails.getCreditorName()); - bankAccount.setIban(transactionDetails.getCreditorAccount().getIban()); - } else if (transactionDetails.getDebtorName() != null || transactionDetails.getDebtorAccount() != null) { - bankAccount.setOwner(transactionDetails.getDebtorName()); - bankAccount.setIban(transactionDetails.getDebtorAccount().getIban()); - } - booking.setOtherAccount(bankAccount); - - return booking; - } - - @Mapping(target = "amount", source = "balanceAmount.amount") - @Mapping(target = "date", source = "referenceDate") - @Mapping(target = "currency", source = "balanceAmount.currency") - Balance toBalance(de.adorsys.multibanking.ing.api.Balance balance); - - List toBankAccounts(List accountDetails); - - @Mapping(target = "country", ignore = true) - @Mapping(target = "bankName", ignore = true) - @Mapping(target = "owner", ignore = true) - @Mapping(target = "syncStatus", ignore = true) - @Mapping(target = "lastSync", ignore = true) - @Mapping(target = "balances", ignore = true) - @Mapping(target = "externalIdMap", expression = "java(getExternalIdMap(accountDetails.getResourceId().toString()))") - @Mapping(target = "blz", expression = "java(getBlz(accountDetails))") - @Mapping(target = "accountNumber", expression = "java(getAccountNumber(accountDetails))") - @Mapping(target = "type", ignore = true) - @Mapping(target = "bic", ignore = true) - BankAccount toBankAccount(Account accountDetails); - - default Map getExternalIdMap(String accountResourceId) { - Map externalIdMap = new EnumMap<>(BankApi.class); - externalIdMap.put(XS2A, accountResourceId); - return externalIdMap; - } - - default String getBlz(Account accountDetails) { - return Iban.valueOf(accountDetails.getIban()).getBankCode(); - } - - default String getAccountNumber(Account accountDetails) { - return Iban.valueOf(accountDetails.getIban()).getAccountNumber(); - } - -} - diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngScaHandler.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngScaHandler.java deleted file mode 100644 index 9a31f1c48..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngScaHandler.java +++ /dev/null @@ -1,98 +0,0 @@ -package de.adorsys.multibanking.ing; - -import de.adorsys.multibanking.domain.Consent; -import de.adorsys.multibanking.domain.ConsentStatus; -import de.adorsys.multibanking.domain.ScaStatus; -import de.adorsys.multibanking.domain.request.SelectPsuAuthenticationMethodRequest; -import de.adorsys.multibanking.domain.request.TransactionAuthorisationRequest; -import de.adorsys.multibanking.domain.request.TransactionRequest; -import de.adorsys.multibanking.domain.request.UpdatePsuAuthenticationRequest; -import de.adorsys.multibanking.domain.response.AuthorisationCodeResponse; -import de.adorsys.multibanking.domain.response.CreateConsentResponse; -import de.adorsys.multibanking.domain.response.PaymentStatusResponse; -import de.adorsys.multibanking.domain.response.UpdateAuthResponse; -import de.adorsys.multibanking.domain.spi.StrongCustomerAuthorisable; -import de.adorsys.multibanking.domain.transaction.PaymentStatusReqest; -import lombok.RequiredArgsConstructor; - -import static de.adorsys.multibanking.domain.BankApi.ING; -import static de.adorsys.multibanking.domain.ScaApproach.OAUTH; -import static de.adorsys.multibanking.domain.ScaStatus.STARTED; - -@RequiredArgsConstructor -public class IngScaHandler implements StrongCustomerAuthorisable { - - private final IngSessionHandler ingSessionHandler; - private IngMapper ingMapper = new IngMapperImpl(); - - @Override - public CreateConsentResponse createConsent(Consent consentTemplate, boolean redirectPreferred, - String tppRedirectUri, Object bankApiConsentData) { - IngSessionData ingSessionData = new IngSessionData(); - ingSessionData.setStatus(STARTED); - ingSessionData.setTppRedirectUri(tppRedirectUri); - - return ingMapper.toCreateConsentResponse(ingSessionData, - ingSessionHandler.getAuthorisationUri(tppRedirectUri).toString()); - } - - @Override - public Consent getConsent(String consentId, Object bankApiConsentData) { - return null; - } - - @Override - public ConsentStatus getConsentStatus(String consentId, Object bankApiConsentData) { - return null; // TODO - } - - @Override - public UpdateAuthResponse updatePsuAuthentication(UpdatePsuAuthenticationRequest updatePsuAuthentication) { - throw new UnsupportedOperationException(); - } - - @Override - public UpdateAuthResponse authorizeConsent(TransactionAuthorisationRequest transactionAuthorisationRequest) { - throw new UnsupportedOperationException(); - } - - @Override - public UpdateAuthResponse selectPsuAuthenticationMethod(SelectPsuAuthenticationMethodRequest selectPsuAuthenticationMethod) { - throw new UnsupportedOperationException(); - } - - @Override - public void revokeConsent(String consentId, Object bankApiConsentData) { - //noop - } - - @Override - public UpdateAuthResponse getAuthorisationStatus(String consentId, String authorisationId, - Object bankApiConsentData) { - IngSessionData ingSessionData = (IngSessionData) bankApiConsentData; - return ingMapper.toUpdateAuthResponse(ingSessionData, new UpdateAuthResponse(ING, OAUTH, - ingSessionData.getStatus())); - } - - @Override - public void validateConsent(String consentId, String authorisationId, ScaStatus expectedConsentStatus, - Object bankApiConsentData) { - //noop - } - - @Override - public void afterExecute(Object bankApiConsentData, AuthorisationCodeResponse authorisationCodeResponse) { - //noop - } - - @Override - public void submitAuthorisationCode(Object bankApiConsentData, String authorisationCode) { - IngSessionData ingSessionData = (IngSessionData) bankApiConsentData; - ingSessionHandler.checkIngSession(ingSessionData, authorisationCode); - } - - @Override - public PaymentStatusResponse getPaymentStatus(TransactionRequest request) { - throw new UnsupportedOperationException(); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngSessionData.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngSessionData.java deleted file mode 100644 index bd2c4e947..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngSessionData.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.adorsys.multibanking.ing; - -import de.adorsys.multibanking.domain.ScaStatus; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -class IngSessionData { - - private String tppRedirectUri; - private ScaStatus status; - private String accessToken; - private LocalDateTime expirationTime; - private String refreshToken; -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngSessionHandler.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngSessionHandler.java deleted file mode 100644 index b27e3c577..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/IngSessionHandler.java +++ /dev/null @@ -1,76 +0,0 @@ -package de.adorsys.multibanking.ing; - -import de.adorsys.multibanking.domain.Message; -import de.adorsys.multibanking.domain.exception.MultibankingException; -import de.adorsys.multibanking.ing.api.TokenResponse; -import de.adorsys.multibanking.ing.oauth.IngOauth2Service; -import de.adorsys.multibanking.ing.oauth.Oauth2Service; -import lombok.RequiredArgsConstructor; - -import java.net.URI; -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import static de.adorsys.multibanking.domain.exception.MultibankingError.MISSING_AUTHORISATION_CODE; -import static de.adorsys.multibanking.domain.exception.MultibankingError.TOKEN_EXPIRED; - -@RequiredArgsConstructor -public class IngSessionHandler { - - private final IngOauth2Service oauth2Service; - - public void checkIngSession(IngSessionData ingSessionData, String authorisationCode) { - TokenResponse tokenResponse = null; - if (ingSessionData.getAccessToken() == null) { - tokenResponse = Optional.ofNullable(authorisationCode) - .map(this::getUserToken) - .orElseThrow(() -> { - URI authorizationRequestUri = getAuthorisationUri(ingSessionData.getTppRedirectUri()); - Message message = new Message(); - message.setParamsMap(Collections.singletonMap("redirectUrl", authorizationRequestUri.toString())); - return new MultibankingException(MISSING_AUTHORISATION_CODE, 401, null, Collections.singletonList(message)); - }); - } else if (LocalDateTime.now().isAfter(ingSessionData.getExpirationTime())) { - tokenResponse = Optional.ofNullable(ingSessionData.getRefreshToken()) - .map(this::refreshToken) - .orElseThrow(() -> { - URI authorizationRequestUri = getAuthorisationUri(ingSessionData.getTppRedirectUri()); - Message message = new Message(); - message.setParamsMap(Collections.singletonMap("redirectUrl", authorizationRequestUri.toString())); - return new MultibankingException(TOKEN_EXPIRED, 401, null, Collections.singletonList(message)); - }); - } - - Optional.ofNullable(tokenResponse) - .ifPresent(response -> { - ingSessionData.setAccessToken(response.getAccessToken()); - ingSessionData.setRefreshToken(response.getRefreshToken()); - ingSessionData.setExpirationTime(LocalDateTime.now().plusSeconds(response.getExpiresInSeconds())); - }); - } - - URI getAuthorisationUri(String tppRedirectUri) { - Oauth2Service.Parameters params = new Oauth2Service.Parameters(Collections.singletonMap("redirect_uri" - , tppRedirectUri)); - return oauth2Service.getAuthorizationRequestUri(params); - } - - private TokenResponse refreshToken(String refreshToken) { - Map parametersMap = new HashMap<>(); - parametersMap.put("grant_type", "refresh_token"); - parametersMap.put("refresh_token", refreshToken); - - return oauth2Service.getToken(new Oauth2Service.Parameters(parametersMap)); - } - - private TokenResponse getUserToken(String authorisationCode) { - Map parametersMap = new HashMap<>(); - parametersMap.put("grant_type", "authorization_code"); - parametersMap.put("code", authorisationCode); - - return oauth2Service.getToken(new Oauth2Service.Parameters(parametersMap)); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Account.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Account.java deleted file mode 100644 index 8a21a2225..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Account.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.UUID; - -public class Account { - private UUID resourceId; - - private String iban; - - private String name; - - private String currency; - - @JsonProperty("_links") - private AccountLinks links; - - public UUID getResourceId() { - return resourceId; - } - - public void setResourceId(UUID resourceId) { - this.resourceId = resourceId; - } - - public String getIban() { - return iban; - } - - public void setIban(String iban) { - this.iban = iban; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getCurrency() { - return currency; - } - - public void setCurrency(String currency) { - this.currency = currency; - } - - public AccountLinks getLinks() { - return links; - } - - public void setLinks(AccountLinks links) { - this.links = links; - } -} - diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountLinks.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountLinks.java deleted file mode 100644 index 481f304ee..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountLinks.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -public class AccountLinks { - private HrefType balances; - - private HrefType transactions; - - public HrefType getBalances() { - return balances; - } - - public void setBalances(HrefType balances) { - this.balances = balances; - } - - public HrefType getTransactions() { - return transactions; - } - - public void setTransactions(HrefType transactions) { - this.transactions = transactions; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountReferenceIban.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountReferenceIban.java deleted file mode 100644 index 2e11682f7..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountReferenceIban.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -public class AccountReferenceIban { - private String iban; - - private String currency; - - public String getIban() { - return iban; - } - - public void setIban(String iban) { - this.iban = iban; - } - - public String getCurrency() { - return currency; - } - - public void setCurrency(String currency) { - this.currency = currency; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountsResponse.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountsResponse.java deleted file mode 100644 index e4be0b5a7..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AccountsResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import java.util.List; - -public class AccountsResponse { - private List accounts; - - public List getAccounts() { - return accounts; - } - - public void setAccounts(List accounts) { - this.accounts = accounts; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Amount.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Amount.java deleted file mode 100644 index 13034b5a4..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Amount.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -public class Amount { - private String currency; - - private Double amount; - - public String getCurrency() { - return currency; - } - - public void setCurrency(String currency) { - this.currency = currency; - } - - public Double getAmount() { - return amount; - } - - public void setAmount(Double amount) { - this.amount = amount; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/ApplicationTokenResponse.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/ApplicationTokenResponse.java deleted file mode 100644 index ca5f37386..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/ApplicationTokenResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class ApplicationTokenResponse extends TokenResponse { - @JsonProperty("client_id") - private String clientId; - - public final String getClientId() { - return clientId; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AuthorizationURLResponse.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AuthorizationURLResponse.java deleted file mode 100644 index 766d04e67..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/AuthorizationURLResponse.java +++ /dev/null @@ -1,10 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import lombok.Data; - -@Data -public class AuthorizationURLResponse { - - private String location; - -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Balance.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Balance.java deleted file mode 100644 index 82c8dc584..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Balance.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import java.time.LocalDate; -import java.time.OffsetDateTime; - -public class Balance { - private String balanceType; - - private Amount balanceAmount; - - private OffsetDateTime lastChangeDateTime; - - private LocalDate referenceDate; - - public String getBalanceType() { - return balanceType; - } - - public void setBalanceType(String balanceType) { - this.balanceType = balanceType; - } - - public Amount getBalanceAmount() { - return balanceAmount; - } - - public void setBalanceAmount(Amount balanceAmount) { - this.balanceAmount = balanceAmount; - } - - public OffsetDateTime getLastChangeDateTime() { - return lastChangeDateTime; - } - - public void setLastChangeDateTime(OffsetDateTime lastChangeDateTime) { - this.lastChangeDateTime = lastChangeDateTime; - } - - public LocalDate getReferenceDate() { - return referenceDate; - } - - public void setReferenceDate(LocalDate referenceDate) { - this.referenceDate = referenceDate; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/BalancesResponse.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/BalancesResponse.java deleted file mode 100644 index 690cb54eb..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/BalancesResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import java.util.List; - -public class BalancesResponse { - private AccountReferenceIban account; - - private List balances; - - public AccountReferenceIban getAccount() { - return account; - } - - public void setAccount(AccountReferenceIban account) { - this.account = account; - } - - public List getBalances() { - return balances; - } - - public void setBalances(List balances) { - this.balances = balances; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/CounterpartyAccount.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/CounterpartyAccount.java deleted file mode 100644 index d6d39f7d3..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/CounterpartyAccount.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -public class CounterpartyAccount { - private String iban; - - private String bban; - - private String bic; - - public String getIban() { - return iban; - } - - public void setIban(String iban) { - this.iban = iban; - } - - public String getBban() { - return bban; - } - - public void setBban(String bban) { - this.bban = bban; - } - - public String getBic() { - return bic; - } - - public void setBic(String bic) { - this.bic = bic; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/HrefType.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/HrefType.java deleted file mode 100644 index 65ca79d74..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/HrefType.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -public class HrefType { - private String href; - - public String getHref() { - return href; - } - - public void setHref(String href) { - this.href = href; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/LinksNext.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/LinksNext.java deleted file mode 100644 index cdee1f9b2..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/LinksNext.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -public class LinksNext { - private HrefType next; - - public HrefType getNext() { - return next; - } - - public void setNext(HrefType next) { - this.next = next; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TokenResponse.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TokenResponse.java deleted file mode 100644 index a217246c3..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TokenResponse.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -@Data -public class TokenResponse { - @JsonProperty("access_token") - private String accessToken; - - @JsonProperty("token_type") - private String tokenType; - - @JsonProperty("expires_in") - private Long expiresInSeconds; - - @JsonProperty("refresh_token") - private String refreshToken; - - @JsonProperty("client_id") - private String clientId; - - private String scope; - - public String getAccessToken() { - return accessToken; - } - - public String getTokenType() { - return tokenType; - } - - public Long getExpiresInSeconds() { - return expiresInSeconds; - } - - public String getRefreshToken() { - return refreshToken; - } - - public String getScope() { - return scope; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Transaction.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Transaction.java deleted file mode 100644 index fcd85706c..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Transaction.java +++ /dev/null @@ -1,136 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import java.time.LocalDate; -import java.time.OffsetDateTime; - -public class Transaction { - private String transactionId; - - private String endToEndId; - - private LocalDate bookingDate; - - private LocalDate valueDate; - - private OffsetDateTime executionDateTime; - - private Amount transactionAmount; - - private String creditorName; - - private CounterpartyAccount creditorAccount; - - private String debtorName; - - private CounterpartyAccount debtorAccount; - - private String transactionType; - - private String remittanceInformationUnstructured; - - private TransactionRemittanceInformationStructured remittanceInformationStructured; - - public String getTransactionId() { - return transactionId; - } - - public void setTransactionId(String transactionId) { - this.transactionId = transactionId; - } - - public String getEndToEndId() { - return endToEndId; - } - - public void setEndToEndId(String endToEndId) { - this.endToEndId = endToEndId; - } - - public LocalDate getBookingDate() { - return bookingDate; - } - - public void setBookingDate(LocalDate bookingDate) { - this.bookingDate = bookingDate; - } - - public LocalDate getValueDate() { - return valueDate; - } - - public void setValueDate(LocalDate valueDate) { - this.valueDate = valueDate; - } - - public OffsetDateTime getExecutionDateTime() { - return executionDateTime; - } - - public void setExecutionDateTime(OffsetDateTime executionDateTime) { - this.executionDateTime = executionDateTime; - } - - public Amount getTransactionAmount() { - return transactionAmount; - } - - public void setTransactionAmount(Amount transactionAmount) { - this.transactionAmount = transactionAmount; - } - - public String getCreditorName() { - return creditorName; - } - - public void setCreditorName(String creditorName) { - this.creditorName = creditorName; - } - - public CounterpartyAccount getCreditorAccount() { - return creditorAccount; - } - - public void setCreditorAccount(CounterpartyAccount creditorAccount) { - this.creditorAccount = creditorAccount; - } - - public String getDebtorName() { - return debtorName; - } - - public void setDebtorName(String debtorName) { - this.debtorName = debtorName; - } - - public CounterpartyAccount getDebtorAccount() { - return debtorAccount; - } - - public void setDebtorAccount(CounterpartyAccount debtorAccount) { - this.debtorAccount = debtorAccount; - } - - public String getTransactionType() { - return transactionType; - } - - public void setTransactionType(String transactionType) { - this.transactionType = transactionType; - } - - public String getRemittanceInformationUnstructured() { - return remittanceInformationUnstructured; - } - - public void setRemittanceInformationUnstructured(String remittanceInformationUnstructured) { - this.remittanceInformationUnstructured = remittanceInformationUnstructured; - } - - public TransactionRemittanceInformationStructured getRemittanceInformationStructured() { - return remittanceInformationStructured; - } - - public void setRemittanceInformationStructured(TransactionRemittanceInformationStructured remittanceInformationStructured) { - this.remittanceInformationStructured = remittanceInformationStructured; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TransactionRemittanceInformationStructured.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TransactionRemittanceInformationStructured.java deleted file mode 100644 index 096cf45db..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TransactionRemittanceInformationStructured.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -public class TransactionRemittanceInformationStructured { - private String referenceType; - - private String referenceIssuer; - - private String reference; - - public String getReferenceType() { - return referenceType; - } - - public void setReferenceType(String referenceType) { - this.referenceType = referenceType; - } - - public String getReferenceIssuer() { - return referenceIssuer; - } - - public void setReferenceIssuer(String referenceIssuer) { - this.referenceIssuer = referenceIssuer; - } - - public String getReference() { - return reference; - } - - public void setReference(String reference) { - this.reference = reference; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Transactions.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Transactions.java deleted file mode 100644 index c5c77754e..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/Transactions.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; - -public class Transactions { - private List booked; - - private List pending; - - private List info; - - @JsonProperty("_links") - private LinksNext links; - - public List getBooked() { - return booked; - } - - public void setBooked(List booked) { - this.booked = booked; - } - - public List getPending() { - return pending; - } - - public void setPending(List pending) { - this.pending = pending; - } - - public List getInfo() { - return info; - } - - public void setInfo(List info) { - this.info = info; - } - - public LinksNext getLinks() { - return links; - } - - public void setLinks(LinksNext links) { - this.links = links; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TransactionsResponse.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TransactionsResponse.java deleted file mode 100644 index dc800d96e..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/api/TransactionsResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.adorsys.multibanking.ing.api; - -public class TransactionsResponse { - private AccountReferenceIban account; - - private Transactions transactions; - - public AccountReferenceIban getAccount() { - return account; - } - - public void setAccount(AccountReferenceIban account) { - this.account = account; - } - - public Transactions getTransactions() { - return transactions; - } - - public void setTransactions(Transactions transactions) { - this.transactions = transactions; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ApacheHttpClient.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ApacheHttpClient.java deleted file mode 100644 index 6d93e0991..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ApacheHttpClient.java +++ /dev/null @@ -1,143 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import de.adorsys.multibanking.ing.model.Response; -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; -import org.apache.http.NameValuePair; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.*; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.io.EmptyInputStream; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.util.EntityUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; -import java.io.UnsupportedEncodingException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -public class ApacheHttpClient implements HttpClient { - private static final String GET = "GET"; - private static final String POST = "POST"; - private static final String PUT = "PUT"; - private static final String DELETE = "DELETE"; - - private final CloseableHttpClient httpClient; - - public ApacheHttpClient(CloseableHttpClient httpClient) { - this.httpClient = httpClient; - } - - @Override - public Request.Builder get(String uri) { - return new RequestBuilderImpl(this, GET, uri); - } - - @Override - public Request.Builder post(String uri) { - return new RequestBuilderImpl(this, POST, uri); - } - - @Override - public Request.Builder put(String uri) { - return new RequestBuilderImpl(this, PUT, uri); - } - - @Override - public Request.Builder delete(String uri) { - return new RequestBuilderImpl(this, DELETE, uri); - } - - @Override - public Response send(Request.Builder requestBuilder, ResponseHandler responseHandler) { - return execute(createRequest(requestBuilder), requestBuilder.headers(), responseHandler); - } - - private HttpUriRequest createRequest(Request.Builder requestBuilder) { - switch (requestBuilder.method()) { - case GET: - return new HttpGet(requestBuilder.uri()); - case POST: - HttpPost post = new HttpPost(requestBuilder.uri()); - if (requestBuilder.jsonBody() != null) { - post.setEntity(new StringEntity(requestBuilder.jsonBody(), ContentType.APPLICATION_JSON)); - } else if (requestBuilder.emptyBody()) { - post.setEntity(new StringEntity("{}", ContentType.APPLICATION_JSON)); - } else if (requestBuilder.urlEncodedBody() != null) { - List list = requestBuilder.urlEncodedBody().entrySet().stream() - .map(entry -> new BasicNameValuePair(entry.getKey(), entry.getValue())) - .collect(Collectors.toList()); - try { - post.setEntity(new UrlEncodedFormEntity(list)); - } catch (UnsupportedEncodingException e) { - throw new UncheckedIOException(e); - } - } - return post; - case PUT: - HttpPut put = new HttpPut(requestBuilder.uri()); - put.setEntity(new StringEntity(requestBuilder.jsonBody(), ContentType.APPLICATION_JSON)); - return put; - case DELETE: - return new HttpDelete(requestBuilder.uri()); - default: - throw new UnsupportedOperationException(requestBuilder.method()); - } - } - - @Override - public String content(Request.Builder requestBuilder) { - HttpUriRequest request = createRequest(requestBuilder); - if (request instanceof HttpEntityEnclosingRequest) { - HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); - - try { - return entity != null ? EntityUtils.toString(entity) : ""; - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - return ""; - } - - private Response execute(HttpUriRequest request, Map headers, ResponseHandler responseHandler) { - headers.forEach(request::addHeader); - - try (CloseableHttpResponse response = httpClient.execute(request)) { - int statusCode = response.getStatusLine().getStatusCode(); - HttpEntity entity = response.getEntity(); - Map responseHeadersMap = toHeadersMap(response.getAllHeaders()); - ResponseHeaders responseHeaders = ResponseHeaders.fromMap(responseHeadersMap); - InputStream content = entity != null ? entity.getContent() : EmptyInputStream.INSTANCE; - - T responseBody = responseHandler.apply(statusCode, content, responseHeaders); - return new Response<>(statusCode, responseBody, responseHeaders); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - private Map toHeadersMap(Header[] headers) { - if (Objects.isNull(headers)) { - return new HashMap<>(); - } - - // Don't override this to Stream API until staying on JDK 8, as JDK 8 has an issue for such a case - // https://stackoverflow.com/questions/40039649/why-does-collectors-tomap-report-value-instead-of-key-on-duplicate-key-error - Map headersMap = new HashMap<>(); - - for (Header header : headers) { - headersMap.put(header.getName(), header.getValue()); - } - - return headersMap; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/HttpClient.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/HttpClient.java deleted file mode 100644 index b849607fa..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/HttpClient.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import de.adorsys.multibanking.ing.model.Response; - -import java.io.InputStream; - -public interface HttpClient { - - Request.Builder get(String uri); - - Request.Builder post(String uri); - - Request.Builder put(String uri); - - Request.Builder delete(String uri); - - Response send(Request.Builder requestBuilder, ResponseHandler responseHandler); - - String content(Request.Builder requestBuilder); - - @FunctionalInterface - interface ResponseHandler { - T apply(int statusCode, InputStream responseBody, ResponseHeaders responseHeaders); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Pkcs12KeyStore.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Pkcs12KeyStore.java deleted file mode 100644 index ed31b9496..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Pkcs12KeyStore.java +++ /dev/null @@ -1,111 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import javax.net.ssl.KeyManager; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import java.io.IOException; -import java.net.URL; -import java.security.*; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -/** - * A PKCS #12 {@code java.security.KeyStore} that holds certificates and keys - * used for signing http messages (QSEAL) and client tls authentication (QWAC). - * By default a key store is expected to have two bags named "default_qwac" and - * "default_qseal" and an empty password. - *

- * A key store file may be created using {@code openssl} and {@code keytool} - * command line tools. First create a p12 file for each certificate/key pair - * with a specific alias. - *

- * openssl pkcs12 -export -out <p12_file> -in <cert_file> -inkey <key_file> -name <alias>
- * 
- * And then combine all p12 files into one. - *
- * keytool -importkeystore -srckeystore <src_p12> -destkeystore <dest_p12> -srcstorepass ''
- * -deststorepass ''
- * 
- */ -public class Pkcs12KeyStore { - private static final String KEY_STORE_TYPE = "PKCS12"; - - private static final String DEFAULT_QWAC_ALIAS = "default_qwac"; - private static final String DEFAULT_QSEAL_ALIAS = "default_qseal"; - - private final KeyStore keyStore; - private final char[] password; - private final String defaultQwacAlias; - private final String defaultQsealAlias; - - public Pkcs12KeyStore(URL url, char[] password) - throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { - - this(url, password, DEFAULT_QWAC_ALIAS, DEFAULT_QSEAL_ALIAS); - } - - public Pkcs12KeyStore(URL url, char[] password, String defaultQwacAlias, String defaultQsealAlias) - throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { - - this.keyStore = KeyStore.getInstance(KEY_STORE_TYPE); - this.password = password; - this.defaultQwacAlias = defaultQwacAlias; - this.defaultQsealAlias = defaultQsealAlias; - keyStore.load(url.openStream(), password); - } - - public SSLContext getSslContext() - throws NoSuchAlgorithmException, KeyStoreException, UnrecoverableEntryException, KeyManagementException, - IOException, CertificateException { - - return getSslContext(null); - } - - public SSLContext getSslContext(String qwacAlias) - throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, - UnrecoverableEntryException, KeyManagementException { - - if (qwacAlias == null) { - qwacAlias = defaultQwacAlias; - } - - KeyStore qwacKeyStore = KeyStore.getInstance(KEY_STORE_TYPE); - qwacKeyStore.load(null, password); - KeyStore.Entry entry = keyStore.getEntry(qwacAlias, new KeyStore.PasswordProtection(password)); - qwacKeyStore.setEntry("", entry, new KeyStore.PasswordProtection(password)); - - SSLContext sslContext = SSLContext.getInstance("TLS"); - KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - keyManagerFactory.init(qwacKeyStore, password); - KeyManager[] keyManagers = keyManagerFactory.getKeyManagers(); - sslContext.init(keyManagers, null, null); - return sslContext; - } - - public X509Certificate getQsealCertificate() throws KeyStoreException { - return getQsealCertificate(null); - } - - public X509Certificate getQsealCertificate(String qsealAlias) throws KeyStoreException { - if (qsealAlias == null) { - qsealAlias = defaultQsealAlias; - } - return (X509Certificate) keyStore.getCertificate(qsealAlias); - } - - public PrivateKey getQsealPrivateKey() - throws UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException { - - return getQsealPrivateKey(null); - } - - public PrivateKey getQsealPrivateKey(String qsealAlias) - throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException { - - if (qsealAlias == null) { - qsealAlias = defaultQsealAlias; - } - - return (PrivateKey) keyStore.getKey(qsealAlias, password); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Psd2DateTimeDeserializer.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Psd2DateTimeDeserializer.java deleted file mode 100644 index 504d793ca..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Psd2DateTimeDeserializer.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; - -import java.io.IOException; -import java.time.OffsetDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; - -public class Psd2DateTimeDeserializer extends JsonDeserializer { - - private DateTimeFormatter psd2Formatter = new DateTimeFormatterBuilder() - // date/time - .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME) - // offset (hh:mm - "+00:00" when it's zero) - .optionalStart().appendOffset("+HH:MM", "+00:00").optionalEnd() - // offset (hhmm - "+0000" when it's zero) - .optionalStart().appendOffset("+HHMM", "+0000").optionalEnd() - // offset (hh - "Z" when it's zero) - .optionalStart().appendOffset("+HH", "Z").optionalEnd() - // create formatter - .toFormatter(); - - @Override - public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { - String text = parser.getText(); - - if (text == null || text.isEmpty()) { - return null; - } - - return OffsetDateTime.parse(text, psd2Formatter); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Request.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Request.java deleted file mode 100644 index 7b3f871a0..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/Request.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import de.adorsys.multibanking.ing.http.HttpClient; -import de.adorsys.multibanking.ing.model.Response; - -import java.util.Map; -import java.util.function.UnaryOperator; - -public interface Request { - - interface Builder { - - String method(); - - String uri(); - - Builder jsonBody(String body); - - String jsonBody(); - - Builder emptyBody(boolean empty); - - boolean emptyBody(); - - Builder urlEncodedBody(Map formData); - - Map urlEncodedBody(); - - Builder headers(Map headers); - - Map headers(); - - Builder header(String name, String value); - - Response send(Interceptor interceptor, HttpClient.ResponseHandler responseHandler); - - default Response send(HttpClient.ResponseHandler responseHandler) { - return send(x -> x, responseHandler); - } - - String content(); - - @FunctionalInterface - interface Interceptor extends UnaryOperator { - } - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/RequestBuilderImpl.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/RequestBuilderImpl.java deleted file mode 100644 index 29a725e2c..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/RequestBuilderImpl.java +++ /dev/null @@ -1,92 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import de.adorsys.multibanking.ing.model.Response; - -import java.util.LinkedHashMap; -import java.util.Map; - -public class RequestBuilderImpl implements Request.Builder { - private final HttpClient httpClient; - private String method; - private String uri; - private Map headers = new LinkedHashMap<>(); - private String body; - private boolean emptyBody; - private Map formData; - - RequestBuilderImpl(HttpClient httpClient, String method, String uri) { - this.httpClient = httpClient; - this.method = method; - this.uri = uri; - } - - @Override - public String method() { - return method; - } - - @Override - public String uri() { - return uri; - } - - @Override - public Request.Builder headers(Map headers) { - this.headers = headers; - return this; - } - - @Override - public Map headers() { - return headers; - } - - @Override - public Request.Builder header(String name, String value) { - headers.put(name, value); - return this; - } - - @Override - public Request.Builder jsonBody(String body) { - this.body = body; - return this; - } - - @Override - public String jsonBody() { - return body; - } - - @Override - public Request.Builder emptyBody(boolean emptyBody) { - this.emptyBody = emptyBody; - return this; - } - - @Override - public boolean emptyBody() { - return emptyBody; - } - - @Override - public Request.Builder urlEncodedBody(Map formData) { - this.formData = formData; - return this; - } - - @Override - public Map urlEncodedBody() { - return formData; - } - - @Override - public Response send(Interceptor interceptor, HttpClient.ResponseHandler responseHandler) { - return httpClient.send(interceptor != null ? interceptor.apply(this) : this, responseHandler); - } - - @Override - public String content() { - return httpClient.content(this); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/RequestHeaders.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/RequestHeaders.java deleted file mode 100644 index ba04a268a..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/RequestHeaders.java +++ /dev/null @@ -1,112 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -public class RequestHeaders { - public static final String X_REQUEST_ID = "X-Request-ID"; - public static final String CONSENT_ID = "Consent-ID"; - public static final String DIGEST = "Digest"; - public static final String PSU_ID = "PSU-ID"; - public static final String PSU_CORPORATE_ID = "PSU-Corporate-ID"; - public static final String TPP_REDIRECT_URI = "TPP-Redirect-URI"; - public static final String DATE = "Date"; - public static final String SIGNATURE = "Signature"; - public static final String TPP_SIGNATURE_CERTIFICATE = "TPP-Signature-Certificate"; - public static final String PSU_IP_ADDRESS = "PSU-IP-Address"; - public static final String PSU_ID_TYPE = "PSU-ID-Type"; - public static final String PSU_CORPORATE_ID_TYPE = "PSU-Corporate-ID-Type"; - public static final String TPP_REDIRECT_PREFERRED = "TPP-Redirect-Preferred"; - public static final String TPP_NOK_REDIRECT_URI = "TPP-Nok-Redirect-URI"; - public static final String TPP_EXPLICIT_AUTHORISATION_PREFERRED = "TPP-Explicit-Authorisation-Preferred"; - public static final String PSU_IP_PORT = "PSU-IP-Port"; - public static final String PSU_ACCEPT = "PSU-Accept"; - public static final String PSU_ACCEPT_CHARSET = "PSU-Accept-Charset"; - public static final String PSU_ACCEPT_ENCODING = "PSU-Accept-Encoding"; - public static final String PSU_ACCEPT_LANGUAGE = "PSU-Accept-Language"; - public static final String PSU_USER_AGENT = "PSU-User-Agent"; - public static final String PSU_HTTP_METHOD = "PSU-Http-Method"; - public static final String PSU_DEVICE_ID = "PSU-Device-ID"; - public static final String PSU_GEO_LOCATION = "PSU-Geo-Location"; - // technical - public static final String ACCEPT = "Accept"; - public static final String CONTENT_TYPE = "Content-Type"; - public static final String AUTHORIZATION = "Authorization"; - public static final String CORRELATION_ID = "Correlation-ID"; - // gateway - public static final String X_GTW_ASPSP_ID = "X-GTW-ASPSP-ID"; - public static final String X_GTW_BANK_CODE = "X-GTW-Bank-Code"; - - private static Map headerNamesLowerCased = new HashMap<>(); - - static { - headerNamesLowerCased.put(X_GTW_ASPSP_ID.toLowerCase(), X_GTW_ASPSP_ID); - headerNamesLowerCased.put(X_GTW_BANK_CODE.toLowerCase(), X_GTW_BANK_CODE); - headerNamesLowerCased.put(X_REQUEST_ID.toLowerCase(), X_REQUEST_ID); - headerNamesLowerCased.put(PSU_IP_ADDRESS.toLowerCase(), PSU_IP_ADDRESS); - headerNamesLowerCased.put(DIGEST.toLowerCase(), DIGEST); - headerNamesLowerCased.put(SIGNATURE.toLowerCase(), SIGNATURE); - headerNamesLowerCased.put(TPP_SIGNATURE_CERTIFICATE.toLowerCase(), TPP_SIGNATURE_CERTIFICATE); - headerNamesLowerCased.put(PSU_ID.toLowerCase(), PSU_ID); - headerNamesLowerCased.put(PSU_ID_TYPE.toLowerCase(), PSU_ID_TYPE); - headerNamesLowerCased.put(PSU_CORPORATE_ID.toLowerCase(), PSU_CORPORATE_ID); - headerNamesLowerCased.put(PSU_CORPORATE_ID_TYPE.toLowerCase(), PSU_CORPORATE_ID_TYPE); - headerNamesLowerCased.put(CONSENT_ID.toLowerCase(), CONSENT_ID); - headerNamesLowerCased.put(TPP_REDIRECT_PREFERRED.toLowerCase(), TPP_REDIRECT_PREFERRED); - headerNamesLowerCased.put(TPP_REDIRECT_URI.toLowerCase(), TPP_REDIRECT_URI); - headerNamesLowerCased.put(TPP_NOK_REDIRECT_URI.toLowerCase(), TPP_NOK_REDIRECT_URI); - headerNamesLowerCased.put(TPP_EXPLICIT_AUTHORISATION_PREFERRED.toLowerCase(), TPP_EXPLICIT_AUTHORISATION_PREFERRED); - headerNamesLowerCased.put(PSU_IP_PORT.toLowerCase(), PSU_IP_PORT); - headerNamesLowerCased.put(PSU_ACCEPT.toLowerCase(), PSU_ACCEPT); - headerNamesLowerCased.put(PSU_ACCEPT_CHARSET.toLowerCase(), PSU_ACCEPT_CHARSET); - headerNamesLowerCased.put(PSU_ACCEPT_ENCODING.toLowerCase(), PSU_ACCEPT_ENCODING); - headerNamesLowerCased.put(PSU_ACCEPT_LANGUAGE.toLowerCase(), PSU_ACCEPT_LANGUAGE); - headerNamesLowerCased.put(PSU_USER_AGENT.toLowerCase(), PSU_USER_AGENT); - headerNamesLowerCased.put(PSU_HTTP_METHOD.toLowerCase(), PSU_HTTP_METHOD); - headerNamesLowerCased.put(PSU_DEVICE_ID.toLowerCase(), PSU_DEVICE_ID); - headerNamesLowerCased.put(PSU_GEO_LOCATION.toLowerCase(), PSU_GEO_LOCATION); - headerNamesLowerCased.put(ACCEPT.toLowerCase(), ACCEPT); - headerNamesLowerCased.put(AUTHORIZATION.toLowerCase(), AUTHORIZATION); - headerNamesLowerCased.put(CORRELATION_ID.toLowerCase(), CORRELATION_ID); - } - - private Map headers; - - private RequestHeaders(Map headers) { - this.headers = headers; - } - - public static RequestHeaders fromMap(Map headersMap) { - Map headers = new HashMap<>(); - headersMap.forEach((name, value) -> { - String headerNameInLowerCase = name.toLowerCase(); - if (headerNamesLowerCased.keySet().contains(headerNameInLowerCase)) { - headers.put(headerNamesLowerCased.get(headerNameInLowerCase), value); - } - }); - return new RequestHeaders(headers); - } - - public Map toMap() { - return new HashMap<>(headers); - } - - public boolean isAcceptJson() { - return Optional.ofNullable(headers.get(ACCEPT)) - .map(a -> a.toLowerCase().startsWith("application/json")) - .orElse(false); - } - - public Optional get(String headerName) { - return Optional.ofNullable(headers.get(headerNamesLowerCased.get(headerName.toLowerCase()))); - } - - public Optional getAspspId() { - return get(X_GTW_ASPSP_ID); - } - - public Optional getBankCode() { - return get(X_GTW_BANK_CODE); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ResponseHandlers.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ResponseHandlers.java deleted file mode 100644 index dd1741774..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ResponseHandlers.java +++ /dev/null @@ -1,153 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import de.adorsys.multibanking.domain.exception.MultibankingException; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.time.OffsetDateTime; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static de.adorsys.multibanking.domain.exception.MultibankingError.INTERNAL_ERROR; - -public class ResponseHandlers { - - private static final String APPLICATION_JSON = "application/json"; - private static final Pattern CHARSET_PATTERN = Pattern.compile("charset=([^;]+)"); - - private static final JsonMapper jsonMapper = new JsonMapper(); - - private ResponseHandlers() { - } - - public static HttpClient.ResponseHandler jsonResponseHandler(Class klass) { - return (statusCode, responseBody, responseHeaders) -> { - if (statusCode == 204) { - return null; - } - - String contentType = responseHeaders.getHeader(RequestHeaders.CONTENT_TYPE); - - if (contentType != null && !contentType.startsWith(APPLICATION_JSON)) { - throw new MultibankingException(INTERNAL_ERROR, String.format( - "Content type %s is not acceptable, has to start with %s", contentType, APPLICATION_JSON)); - } - - if (statusCode == 200 || statusCode == 201) { - return jsonMapper.readValue(responseBody, klass); - } - - throw responseException(statusCode, new PushbackInputStream(responseBody), responseHeaders); - }; - } - - private static MultibankingException responseException(int statusCode, - PushbackInputStream responseBody, - ResponseHeaders responseHeaders) { - if (isEmpty(responseBody)) { - return new MultibankingException(INTERNAL_ERROR, statusCode, "empty response"); - } - String originalResponse = toString(responseBody, responseHeaders); - return new MultibankingException(INTERNAL_ERROR, statusCode, originalResponse); - } - - private static boolean isEmpty(PushbackInputStream responseBody) { - try { - int nextByte = responseBody.read(); - if (nextByte == -1) { - return true; - } - responseBody.unread(nextByte); - return false; - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - public static HttpClient.ResponseHandler stringResponseHandler() { - return (statusCode, responseBody, responseHeaders) -> { - if (statusCode == 200) { - return toString(responseBody, responseHeaders); - } - - throw responseException(statusCode, new PushbackInputStream(responseBody), responseHeaders); - }; - } - - private static String toString(InputStream responseBody, ResponseHeaders responseHeaders) { - try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - byte[] buffer = new byte[1024]; - int length; - while ((length = responseBody.read(buffer)) != -1) { - baos.write(buffer, 0, length); - } - - String charset = StandardCharsets.UTF_8.name(); - String contentType = responseHeaders.getHeader(RequestHeaders.CONTENT_TYPE); - if (contentType != null) { - Matcher matcher = CHARSET_PATTERN.matcher(contentType); - if (matcher.find()) { - charset = matcher.group(1); - } - } - - return baos.toString(charset); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - public static class JsonMapper { - private final ObjectMapper objectMapper; - - JsonMapper() { - objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.registerModule(buildPsd2DateTimeDeserializerModule()); - } - - public String writeValueAsString(Object value) { - try { - return objectMapper.writeValueAsString(value); - } catch (JsonProcessingException e) { - throw new UncheckedIOException(e); - } - } - - public T readValue(InputStream inputStream, Class klass) { - try { - return objectMapper.readValue(inputStream, klass); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - public T readValue(String s, Class klass) { - try { - return objectMapper.readValue(s, klass); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - public T convertValue(Object value, Class klass) { - return objectMapper.convertValue(value, klass); - } - - private SimpleModule buildPsd2DateTimeDeserializerModule() { - SimpleModule dateTimeModule = new SimpleModule(); - dateTimeModule.addDeserializer(OffsetDateTime.class, new Psd2DateTimeDeserializer()); - return dateTimeModule; - } - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ResponseHeaders.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ResponseHeaders.java deleted file mode 100644 index bd58247f0..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/ResponseHeaders.java +++ /dev/null @@ -1,58 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import java.util.*; - -public class ResponseHeaders { - private static final String LOCATION = "Location"; - private static final String X_REQUEST_ID = "X-Request-ID"; - public static final String ASPSP_SCA_APPROACH = "ASPSP-SCA-Approach"; - private static final String CONTENT_TYPE = "Content-Type"; - - private static Map headerNamesLowerCased = new HashMap<>(); - static { - headerNamesLowerCased.put(LOCATION.toLowerCase(), LOCATION); - headerNamesLowerCased.put(X_REQUEST_ID.toLowerCase(), X_REQUEST_ID); - headerNamesLowerCased.put(ASPSP_SCA_APPROACH.toLowerCase(), ASPSP_SCA_APPROACH); - headerNamesLowerCased.put(CONTENT_TYPE.toLowerCase(), CONTENT_TYPE); - } - - private Map headers; - - private ResponseHeaders(Map headers) { - this.headers = headers; - } - - public static ResponseHeaders fromMap(Map headersMap) { - if (Objects.isNull(headersMap) || headersMap.isEmpty()) { - return emptyResponseHeaders(); - } - - Map headers = new HashMap<>(); - - Set headerNamesLowerCased = ResponseHeaders.headerNamesLowerCased.keySet(); - - headersMap.forEach((name, value) -> { - String headerNameInLowerCase = name.toLowerCase(); - if (isHeaderExistInBGSpecification(headerNamesLowerCased, headerNameInLowerCase)) { - headers.put(ResponseHeaders.headerNamesLowerCased.get(headerNameInLowerCase), value); - } - }); - return new ResponseHeaders(headers); - } - - public static ResponseHeaders emptyResponseHeaders() { - return new ResponseHeaders(Collections.emptyMap()); - } - - private static boolean isHeaderExistInBGSpecification(Set headerNames, String headerName) { - return headerNames.contains(headerName); - } - - public Map getHeadersMap() { - return new HashMap<>(headers); - } - - public String getHeader(String headerName) { - return headers.get(headerName); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/StringUri.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/StringUri.java deleted file mode 100644 index 4036c88f8..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/http/StringUri.java +++ /dev/null @@ -1,73 +0,0 @@ -package de.adorsys.multibanking.ing.http; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -public class StringUri { - private static final String SPACE = " "; - private static final String ENCODED_SPACE = "%20"; - - public static String fromElements(String... elements) { - return Arrays.stream(elements) - .map(StringUri::trimUri) - .map(StringUri::formatUri) - .collect(Collectors.joining("/")); - } - - private static String trimUri(String str) { - if (str == null || str.isEmpty()) { - return ""; - } - str = str.startsWith("/") ? str.substring(1) : str; - return str.endsWith("/") ? str.substring(0, str.length() - 1) : str; - } - - public static String withQuery(String uri, Map requestParams) { - if (requestParams.isEmpty()) { - return uri; - } - - String requestParamsString = requestParams.entrySet().stream() - .filter(entry -> entry.getKey() != null && entry.getValue() != null) - .map(entry -> entry.getKey() + "=" + entry.getValue()) - .collect(Collectors.joining("&")); - - if (requestParamsString.isEmpty()) { - return uri; - } - return uri + "?" + requestParamsString; - } - - public static String withQuery(String uri, String paramName, String paramValue) { - if (paramName == null || paramName.isEmpty() - || paramValue == null || paramValue.isEmpty()) { - return uri; - } - - return uri + "?" + paramName + "=" + paramValue; - } - - public static Map getQueryParamsFromUri(String uri) { - Map queryParams = new HashMap<>(); - - if (!uri.contains("?")) { - return queryParams; - } - - String paramsString = uri.split("\\?")[1]; - String[] paramsWithValues = paramsString.split("&"); - - for (String paramWithValueString : paramsWithValues) { - String[] paramAndValue = paramWithValueString.split("="); - queryParams.put(paramAndValue[0], paramAndValue[1]); - } - - return queryParams; - } - - private static String formatUri(String uri) { - return uri.replace(SPACE, ENCODED_SPACE); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/ErrorResponse.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/ErrorResponse.java deleted file mode 100644 index 309525bf0..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/ErrorResponse.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.adorsys.multibanking.ing.model; - -import com.fasterxml.jackson.annotation.JsonProperty; -import de.adorsys.multibanking.ing.model.Links; -import de.adorsys.multibanking.ing.model.TppMessage; - -import java.util.List; - -// verified that structure is compatible with -// Error400_NG_PIS -// Error401_NG_PIS -// Error403_NG_PIS -// Error404_NG_PIS -// Error405_NG_PIS -// Error400_NG_AIS -// Error401_NG_AIS -// Error403_NG_AIS -// Error404_NG_AIS -// Error405_NG_AIS -// Error406_NG_AIS -// Error409_NG_AIS -// Error429_NG_AIS -public class ErrorResponse { - private List tppMessages; - @JsonProperty("_links") - private Links links; - - public List getTppMessages() { - return tppMessages; - } - - public void setTppMessages(List tppMessages) { - this.tppMessages = tppMessages; - } - - public Links getLinks() { - return links; - } - - public void setLinks(Links links) { - this.links = links; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Link.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Link.java deleted file mode 100644 index 80754ef2d..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Link.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.adorsys.multibanking.ing.model; - -public class Link { - private String href; - - public Link() { - } - - public Link(String href) { - this.href = href; - } - - public String getHref() { - return href; - } - - public void setHref(String href) { - this.href = href; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Links.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Links.java deleted file mode 100644 index 09784d0a8..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Links.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright 2018-2018 adorsys GmbH & Co KG - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package de.adorsys.multibanking.ing.model; - -public class Links { - private Link scaRedirect; - private Link scaOAuth; - private Link updatePsuIdentification; - private Link updateProprietaryData; - private Link updatePsuAuthentication; - private Link selectAuthenticationMethod; - private Link self; - private Link status; - private Link account; - private Link viewBalances; - private Link viewTransactions; - private Link first; - private Link next; - private Link previous; - private Link last; - private Link download; - private Link startAuthorisation; - private Link startAuthorisationWithPsuIdentification; - private Link startAuthorisationWithPsuAuthentication; - private Link startAuthorisationWithAuthenticationMethodSelection; - private Link startAuthorisationWithTransactionAuthorisation; - private Link scaStatus; - private Link authoriseTransaction; - - public Link getScaRedirect() { - return scaRedirect; - } - - public void setScaRedirect(Link scaRedirect) { - this.scaRedirect = scaRedirect; - } - - public Link getScaOAuth() { - return scaOAuth; - } - - public void setScaOAuth(Link scaOAuth) { - this.scaOAuth = scaOAuth; - } - - public Link getUpdatePsuIdentification() { - return updatePsuIdentification; - } - - public void setUpdatePsuIdentification(Link updatePsuIdentification) { - this.updatePsuIdentification = updatePsuIdentification; - } - - public Link getUpdateProprietaryData() { - return updateProprietaryData; - } - - public void setUpdateProprietaryData(Link updateProprietaryData) { - this.updateProprietaryData = updateProprietaryData; - } - - public Link getUpdatePsuAuthentication() { - return updatePsuAuthentication; - } - - public void setUpdatePsuAuthentication(Link updatePsuAuthentication) { - this.updatePsuAuthentication = updatePsuAuthentication; - } - - public Link getSelectAuthenticationMethod() { - return selectAuthenticationMethod; - } - - public void setSelectAuthenticationMethod(Link selectAuthenticationMethod) { - this.selectAuthenticationMethod = selectAuthenticationMethod; - } - - public Link getSelf() { - return self; - } - - public void setSelf(Link self) { - this.self = self; - } - - public Link getStatus() { - return status; - } - - public void setStatus(Link status) { - this.status = status; - } - - public Link getAccount() { - return account; - } - - public void setAccount(Link account) { - this.account = account; - } - - public Link getViewBalances() { - return viewBalances; - } - - public void setViewBalances(Link viewBalances) { - this.viewBalances = viewBalances; - } - - public Link getViewTransactions() { - return viewTransactions; - } - - public void setViewTransactions(Link viewTransactions) { - this.viewTransactions = viewTransactions; - } - - public Link getFirst() { - return first; - } - - public void setFirst(Link first) { - this.first = first; - } - - public Link getNext() { - return next; - } - - public void setNext(Link next) { - this.next = next; - } - - public Link getPrevious() { - return previous; - } - - public void setPrevious(Link previous) { - this.previous = previous; - } - - public Link getLast() { - return last; - } - - public void setLast(Link last) { - this.last = last; - } - - public Link getDownload() { - return download; - } - - public void setDownload(Link download) { - this.download = download; - } - - public Link getStartAuthorisation() { - return startAuthorisation; - } - - public void setStartAuthorisation(Link startAuthorisation) { - this.startAuthorisation = startAuthorisation; - } - - public Link getStartAuthorisationWithPsuIdentification() { - return startAuthorisationWithPsuIdentification; - } - - public void setStartAuthorisationWithPsuIdentification(Link startAuthorisationWithPsuIdentification) { - this.startAuthorisationWithPsuIdentification = startAuthorisationWithPsuIdentification; - } - - public Link getStartAuthorisationWithPsuAuthentication() { - return startAuthorisationWithPsuAuthentication; - } - - public void setStartAuthorisationWithPsuAuthentication(Link startAuthorisationWithPsuAuthentication) { - this.startAuthorisationWithPsuAuthentication = startAuthorisationWithPsuAuthentication; - } - - public Link getStartAuthorisationWithAuthenticationMethodSelection() { - return startAuthorisationWithAuthenticationMethodSelection; - } - - public void setStartAuthorisationWithAuthenticationMethodSelection(Link startAuthorisationWithAuthenticationMethodSelection) { - this.startAuthorisationWithAuthenticationMethodSelection = startAuthorisationWithAuthenticationMethodSelection; - } - - public Link getStartAuthorisationWithTransactionAuthorisation() { - return startAuthorisationWithTransactionAuthorisation; - } - - public void setStartAuthorisationWithTransactionAuthorisation(Link startAuthorisationWithTransactionAuthorisation) { - this.startAuthorisationWithTransactionAuthorisation = startAuthorisationWithTransactionAuthorisation; - } - - public Link getScaStatus() { - return scaStatus; - } - - public void setScaStatus(Link scaStatus) { - this.scaStatus = scaStatus; - } - - public Link getAuthoriseTransaction() { - return authoriseTransaction; - } - - public void setAuthoriseTransaction(Link authoriseTransaction) { - this.authoriseTransaction = authoriseTransaction; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Response.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Response.java deleted file mode 100644 index 4af24eff9..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/Response.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.adorsys.multibanking.ing.model; - -import de.adorsys.multibanking.ing.http.ResponseHeaders; - -import java.util.function.Function; - -public class Response { - private final int statusCode; - private final T body; - private final ResponseHeaders headers; - - public Response(int statusCode, T body, ResponseHeaders headers) { - this.statusCode = statusCode; - this.body = body; - this.headers = headers; - } - - public int getStatusCode() { - return statusCode; - } - - public T getBody() { - return body; - } - - public ResponseHeaders getHeaders() { - return headers; - } - - public Response map(Function bodyMapper) { - return new Response<>(statusCode, bodyMapper.apply(body), headers); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/TppMessage.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/TppMessage.java deleted file mode 100644 index c1a22b27b..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/model/TppMessage.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.adorsys.multibanking.ing.model; - -public class TppMessage { - // required - private String category; - private String code; - // optional - private String path; - private String text; - - public String getCategory() { - return category; - } - - public void setCategory(String category) { - this.category = category; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/ClientAuthentication.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/ClientAuthentication.java deleted file mode 100644 index 4f322117b..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/ClientAuthentication.java +++ /dev/null @@ -1,90 +0,0 @@ -package de.adorsys.multibanking.ing.oauth; - -import de.adorsys.multibanking.ing.http.Request; - -import java.net.MalformedURLException; -import java.net.URL; -import java.security.MessageDigest; -import java.security.Signature; -import java.security.SignatureException; -import java.time.Instant; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; -import java.util.Base64; -import java.util.Locale; - -public class ClientAuthentication implements Request.Builder.Interceptor { - - // java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME doesn't pad single digit day-of-month with a zero - private static final DateTimeFormatter RFC_1123_DATE_TIME_FORMATTER = - DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O", Locale.US) - .withZone(ZoneOffset.UTC); - - private final Signature signature; - private final MessageDigest digest; - private final String tppSignatureCertificate; - private String keyId; - private String accessToken; - - ClientAuthentication(Signature signature, MessageDigest digest, String tppSignatureCertificate, - String keyId, String accessToken) { - this.signature = signature; - this.digest = digest; - this.tppSignatureCertificate = tppSignatureCertificate; - this.keyId = keyId; - this.accessToken = accessToken; - } - - @Override - public Request.Builder apply(Request.Builder requestBuilder) { - String date = RFC_1123_DATE_TIME_FORMATTER.format(Instant.now()); - String digest = "SHA-256=" + base64(digest(requestBuilder.content())); - String signingString = "(request-target): " + requestTarget(requestBuilder) + "\n" - + "date: " + date + "\n" - + "digest: " + digest; - String signature = "keyId=\"" + keyId - + "\",algorithm=\"rsa-sha256\",headers=\"(request-target) date digest\"," + - "signature=\"" + base64(sign(signingString)) + "\""; - - if (accessToken == null) { - requestBuilder.header("Authorization", "Signature " + signature); - } else { - requestBuilder - .header("Signature", signature) - .header("Authorization", "Bearer " + accessToken); - } - - requestBuilder - .header("Date", date) - .header("Digest", digest) - .header("TPP-Signature-Certificate", tppSignatureCertificate); - - return requestBuilder; - } - - private String base64(byte[] data) { - return Base64.getEncoder().encodeToString(data); - } - - private byte[] digest(String content) { - digest.update(content.getBytes()); - return digest.digest(); - } - - private String requestTarget(Request.Builder requestBuilder) { - try { - return requestBuilder.method().toLowerCase() + " " + new URL(requestBuilder.uri()).getFile(); - } catch (MalformedURLException e) { - throw new IllegalArgumentException(e); - } - } - - private byte[] sign(String signingString) { - try { - signature.update(signingString.getBytes()); - return signature.sign(); - } catch (SignatureException e) { - throw new IllegalStateException(e); - } - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/ClientAuthenticationFactory.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/ClientAuthenticationFactory.java deleted file mode 100644 index d77ca4a63..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/ClientAuthenticationFactory.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.adorsys.multibanking.ing.oauth; - -import de.adorsys.multibanking.ing.api.TokenResponse; - -import javax.security.auth.x500.X500Principal; -import java.security.*; -import java.security.cert.CertificateEncodingException; -import java.security.cert.X509Certificate; -import java.util.Base64; - -public class ClientAuthenticationFactory { - private final Signature signature; - private final MessageDigest digest; - private final String tppSignatureCertificate; - private final String keyId; - - public ClientAuthenticationFactory(X509Certificate certificate, PrivateKey privateKey) throws NoSuchAlgorithmException, InvalidKeyException, CertificateEncodingException { - signature = Signature.getInstance("SHA256withRSA"); - signature.initSign(privateKey); - digest = MessageDigest.getInstance("SHA-256"); - tppSignatureCertificate = base64(certificate.getEncoded()); - keyId = keyId(certificate); - } - - private String keyId(X509Certificate certificate) { - return "SN=" + certificate.getSerialNumber().toString(16) - + ",CA=" + issuerNameRfc2253(certificate); - } - - private String issuerNameRfc2253(X509Certificate qSealCertificate) { - X500Principal issuerX500Principal = qSealCertificate.getIssuerX500Principal(); - return issuerX500Principal.getName(X500Principal.RFC2253); - } - - private String base64(byte[] data) { - return Base64.getEncoder().encodeToString(data); - } - - ClientAuthentication newClientAuthenticationForApplicationToken() { - return newClientAuthentication(keyId, null); - } - - ClientAuthentication newClientAuthentication(TokenResponse applicationToken) { - return newClientAuthentication(applicationToken.getClientId(), applicationToken.getAccessToken()); - } - - ClientAuthentication newClientAuthentication(String clientId, String accessToken) { - return new ClientAuthentication(signature, digest, tppSignatureCertificate, clientId, accessToken); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/IngOauth2Service.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/IngOauth2Service.java deleted file mode 100644 index ae46f41b6..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/IngOauth2Service.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.adorsys.multibanking.ing.oauth; - -import de.adorsys.multibanking.ing.api.AuthorizationURLResponse; -import de.adorsys.multibanking.ing.api.TokenResponse; -import de.adorsys.multibanking.ing.http.StringUri; - -import java.net.URI; -import java.time.LocalDateTime; - -public class IngOauth2Service { - - private final Oauth2Api oauth2Api; - private final ClientAuthenticationFactory clientAuthenticationFactory; - - private TokenResponse applicationToken; - private LocalDateTime applicationTokenExpirationTime; - - public IngOauth2Service(Oauth2Api oauth2Api, ClientAuthenticationFactory clientAuthenticationFactory) { - this.oauth2Api = oauth2Api; - this.clientAuthenticationFactory = clientAuthenticationFactory; - } - - public URI getAuthorizationRequestUri(Oauth2Service.Parameters parameters) { - ClientAuthentication clientAuthentication = - clientAuthenticationFactory.newClientAuthentication(getApplicationToken()); - AuthorizationURLResponse authorizationUrlResponse = oauth2Api.getAuthorizationUrl(clientAuthentication, - parameters.getRedirectUri()) - .getBody(); - - return URI.create(StringUri.withQuery(authorizationUrlResponse.getLocation(), parameters.asMap())); - } - - private TokenResponse getApplicationToken() { - if (applicationToken != null && LocalDateTime.now().isBefore(applicationTokenExpirationTime)) { - return applicationToken; - } - - ClientAuthentication clientAuthentication = - clientAuthenticationFactory.newClientAuthenticationForApplicationToken(); - applicationToken = oauth2Api.getApplicationToken(clientAuthentication).getBody(); - applicationTokenExpirationTime = LocalDateTime.now().plusSeconds(applicationToken.getExpiresInSeconds()); - return applicationToken; - } - - private String getClientId() { - return getApplicationToken().getClientId(); - } - - public TokenResponse getToken(Oauth2Service.Parameters parameters) { - ClientAuthentication clientAuthentication = - clientAuthenticationFactory.newClientAuthentication(getApplicationToken()); - return oauth2Api.getCustomerToken(parameters, clientAuthentication) - .getBody(); - } - - public ClientAuthentication getClientAuthentication(String accessToken) { - return clientAuthenticationFactory.newClientAuthentication(getClientId(), accessToken); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/Oauth2Api.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/Oauth2Api.java deleted file mode 100644 index 59e939b83..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/Oauth2Api.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.adorsys.multibanking.ing.oauth; - -import de.adorsys.multibanking.ing.api.AuthorizationURLResponse; -import de.adorsys.multibanking.ing.api.TokenResponse; -import de.adorsys.multibanking.ing.http.HttpClient; -import de.adorsys.multibanking.ing.http.Request; -import de.adorsys.multibanking.ing.http.StringUri; -import de.adorsys.multibanking.ing.model.Response; - -import static de.adorsys.multibanking.ing.http.ResponseHandlers.jsonResponseHandler; -import static java.util.Collections.singletonMap; - -public class Oauth2Api { - private static final String TOKEN_ENDPOINT = "/oauth2/token"; - private static final String AUTHORIZATION_ENDPOINT = "/oauth2/authorization-server-url"; - - private final String baseUri; - private final HttpClient httpClient; - - public Oauth2Api(String baseUri, HttpClient httpClient) { - this.baseUri = baseUri; - this.httpClient = httpClient; - } - - Response getApplicationToken(Request.Builder.Interceptor clientAuthentication) { - // When using eIDAS certificates supporting PSD2 the scope parameter is not required. - // The scopes will be derived automatically from the PSD2 roles in the certificate. - // When using eIDAS certificates supporting PSD2, the response will contain the client ID of your application, - // this client ID has to be used in the rest of the session when the client ID or key ID is required. - return httpClient.post(baseUri + TOKEN_ENDPOINT) - .urlEncodedBody(singletonMap("grant_type", "client_credentials")) - .send(clientAuthentication, jsonResponseHandler(TokenResponse.class)); - } - - Response getCustomerToken(Oauth2Service.Parameters parameters, - Request.Builder.Interceptor clientAuthentication) { - - return httpClient.post(baseUri + TOKEN_ENDPOINT) - .urlEncodedBody(parameters.asMap()) - .send(clientAuthentication, jsonResponseHandler(TokenResponse.class)); - } - - Response getAuthorizationUrl(Request.Builder.Interceptor clientAuthentication, - String redirectUri) { - return httpClient.get(StringUri.withQuery(baseUri + AUTHORIZATION_ENDPOINT, "redirect_uri", redirectUri)) - .send(clientAuthentication, jsonResponseHandler(AuthorizationURLResponse.class)); - } -} diff --git a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/Oauth2Service.java b/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/Oauth2Service.java deleted file mode 100644 index dfe6ffeca..000000000 --- a/onlinebanking-ing/src/main/java/de/adorsys/multibanking/ing/oauth/Oauth2Service.java +++ /dev/null @@ -1,83 +0,0 @@ -package de.adorsys.multibanking.ing.oauth; - -import de.adorsys.multibanking.ing.api.TokenResponse; - -import java.io.IOException; -import java.net.URI; -import java.util.Map; - -public interface Oauth2Service { - // https://tools.ietf.org/html/rfc6749#section-4.1.1 - URI getAuthorizationRequestUri(Map headers, Parameters parameters) throws IOException; - - TokenResponse getToken(Map headers, Parameters parameters) throws IOException; - - class Parameters { - - private final Map parameters; - - public Parameters(Map parameters) { - this.parameters = parameters; - } - - public Map asMap() { - return parameters; - } - - public String get(String key) { - return parameters.get(key); - } - - public void set(String key, String value) { - parameters.put(key, value); - } - - public String getAuthorizationCode() { - return get("code"); - } - - public void setAuthorizationCode(String value) { - set("code", value); - } - - public String getRedirectUri() { - return get("redirect_uri"); - } - - public void setRedirectUri(String value) { - set("redirect_uri", value); - } - - public String getClientId() { - return get("client_id"); - } - - public void setClientId(String value) { - set("client_id", value); - } - - public String getGrantType() { - return get("grant_type"); - } - - public void setGrantType(String value) { - set("grant_type", value); - } - - public String getCodeVerifier() { - return get("code_verifier"); - } - - public void setCodeVerifier(String value) { - set("code_verifier", value); - } - - public String getState() { - return get("state"); - } - - public void setState(String value) { - set("state", value); - } - } -} diff --git a/onlinebanking-ing/src/test/java/de/adorsys/multibanking/ing/IngAdapterIT.java b/onlinebanking-ing/src/test/java/de/adorsys/multibanking/ing/IngAdapterIT.java deleted file mode 100644 index a1a2e2bac..000000000 --- a/onlinebanking-ing/src/test/java/de/adorsys/multibanking/ing/IngAdapterIT.java +++ /dev/null @@ -1,84 +0,0 @@ -package de.adorsys.multibanking.ing; - -import de.adorsys.multibanking.domain.request.TransactionRequest; -import de.adorsys.multibanking.domain.request.TransactionRequestFactory; -import de.adorsys.multibanking.domain.transaction.LoadAccounts; -import de.adorsys.multibanking.ing.http.ApacheHttpClient; -import de.adorsys.multibanking.ing.http.Pkcs12KeyStore; -import de.adorsys.multibanking.ing.oauth.ClientAuthenticationFactory; -import de.adorsys.multibanking.ing.oauth.IngOauth2Service; -import de.adorsys.multibanking.ing.oauth.Oauth2Api; -import de.adorsys.multibanking.ing.oauth.Oauth2Service; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.HttpClientBuilder; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import java.net.URI; -import java.net.URL; -import java.security.*; -import java.security.cert.CertificateEncodingException; -import java.security.cert.X509Certificate; -import java.util.HashMap; - -@Ignore -public class IngAdapterIT { - - private static final String BASE_URL = "https://api.sandbox.ing.com"; - private static final String KEYSTORE_FILENAME = "example_eidas.p12"; - private static final String QWAC_ALIAS = "example_eidas_client_tls"; - private static final String QSEAL_ALIAS = "example_eidas_client_signing"; - private static final String AUTHORISATION_CODE = "8b6cd77a-aa44-4527-ab08-a58d70cca286"; - - private static IngAdapter ingAdapter; - - @BeforeClass - public static void prepareAdapter() throws Exception { - URL keyStoreUrl = IngAdapterIT.class.getClassLoader().getResource(KEYSTORE_FILENAME).toURI().toURL(); - ingAdapter = new IngAdapter(BASE_URL, keyStoreUrl.toString(), "", QWAC_ALIAS, - QSEAL_ALIAS); - } - - @Test - public void testAis() throws Exception { - URL keyStoreUrl = IngAdapterIT.class.getClassLoader().getResource(KEYSTORE_FILENAME).toURI().toURL(); - Pkcs12KeyStore keyStore = new Pkcs12KeyStore(keyStoreUrl, "".toCharArray()); - Oauth2Api oauth2Api = new Oauth2Api(BASE_URL, createHttpClient(keyStore)); - ClientAuthenticationFactory clientAuthenticationFactory = clientAuthenticationFactory(keyStore); - IngOauth2Service oauth2Service = new IngOauth2Service(oauth2Api, clientAuthenticationFactory); - - URI authorizationRequestUri = - oauth2Service.getAuthorizationRequestUri(new Oauth2Service.Parameters(new HashMap<>())); - - assert authorizationRequestUri.toString().startsWith("https://developer.ing.com/openbanking/get-started"); - - TransactionRequest loadAccountsRequest = - TransactionRequestFactory.create(new LoadAccounts(), null, null, null, null); - loadAccountsRequest.setAuthorisationCode(AUTHORISATION_CODE); - - ingAdapter.loadBankAccounts(loadAccountsRequest); - } - - private ClientAuthenticationFactory clientAuthenticationFactory(Pkcs12KeyStore keyStore) throws KeyStoreException, - NoSuchAlgorithmException, UnrecoverableKeyException, InvalidKeyException, CertificateEncodingException { - X509Certificate qsealCertificate = keyStore.getQsealCertificate(QSEAL_ALIAS); - PrivateKey qsealPrivateKey = keyStore.getQsealPrivateKey(QSEAL_ALIAS); - return new ClientAuthenticationFactory(qsealCertificate, qsealPrivateKey); - } - - private ApacheHttpClient createHttpClient(Pkcs12KeyStore keyStore) throws Exception { - SSLContext sslContext = keyStore.getSslContext(QWAC_ALIAS); - SSLSocketFactory socketFactory = sslContext.getSocketFactory(); - SSLConnectionSocketFactory sslSocketFactory = - new SSLConnectionSocketFactory(socketFactory, null, null, (HostnameVerifier) null); - - HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().disableDefaultUserAgent(); - httpClientBuilder.setSSLSocketFactory(sslSocketFactory); - return new ApacheHttpClient(httpClientBuilder.build()); - } - -} diff --git a/onlinebanking-ing/src/test/java/de/adorsys/multibanking/ing/KeyStoreUtil.java b/onlinebanking-ing/src/test/java/de/adorsys/multibanking/ing/KeyStoreUtil.java deleted file mode 100644 index c83f92359..000000000 --- a/onlinebanking-ing/src/test/java/de/adorsys/multibanking/ing/KeyStoreUtil.java +++ /dev/null @@ -1,65 +0,0 @@ -package de.adorsys.multibanking.ing; - -import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.openssl.PEMKeyPair; -import org.bouncycastle.openssl.PEMParser; -import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; - -import java.io.*; -import java.security.*; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.util.Collection; - -/** - * Utility class for building up a keystore which can be used in - * SSL communication. - */ -public class KeyStoreUtil { - - static { - if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { - Security.addProvider(new BouncyCastleProvider()); - } - } - - static PrivateKey loadPrivateKey(String keyPath) throws IOException, GeneralSecurityException { - try (Reader reader = new FileReader(keyPath); - PEMParser parser = new PEMParser(reader)) { - Object readObject; - while ((readObject = parser.readObject()) != null) { - if (readObject instanceof PEMKeyPair) { - PEMKeyPair keyPair = (PEMKeyPair) readObject; - return generatePrivateKey(keyPair.getPrivateKeyInfo()); - } else if (readObject instanceof PrivateKeyInfo) { - return generatePrivateKey((PrivateKeyInfo) readObject); - } - } - } - throw new GeneralSecurityException("Cannot generate private key from file: " + keyPath); - } - - private static PrivateKey generatePrivateKey(PrivateKeyInfo keyInfo) throws IOException { - return new JcaPEMKeyConverter().getPrivateKey(keyInfo); - } - - private static void addCA(KeyStore keyStore, String caPath) throws IOException, KeyStoreException, - CertificateException { - for (Certificate cert : loadCertificates(caPath)) { - X509Certificate crt = (X509Certificate) cert; - String alias = crt.getSubjectX500Principal().getName(); - keyStore.setCertificateEntry(alias, crt); - } - } - - private static Certificate[] loadCertificates(String certPath) throws IOException, CertificateException { - try (InputStream is = new FileInputStream(certPath)) { - CertificateFactory certificateFactory = CertificateFactory.getInstance("X509"); - Collection certs = certificateFactory.generateCertificates(is); - return certs.toArray(new Certificate[certs.size()]); - } - } -} diff --git a/onlinebanking-ing/src/test/resources/example_eidas.p12 b/onlinebanking-ing/src/test/resources/example_eidas.p12 deleted file mode 100644 index 33299f6ef..000000000 Binary files a/onlinebanking-ing/src/test/resources/example_eidas.p12 and /dev/null differ diff --git a/pom.xml b/pom.xml index e953d439d..7f14aa4c3 100755 --- a/pom.xml +++ b/pom.xml @@ -65,9 +65,7 @@ multibanking-persistence-jpa onlinebanking-facade onlinebanking-mapper - onlinebanking-figo onlinebanking-hbci4java - onlinebanking-ing onlinebanking-bankinggateway multibanking-pers-spi