com.axelor.apps.account.ebics.web.EbicsController.java Source code

Java tutorial

Introduction

Here is the source code for com.axelor.apps.account.ebics.web.EbicsController.java

Source

/**
 * Axelor Business Solutions
 *
 * Copyright (C) 2016 Axelor (<http://axelor.com>).
 *
 * This program is free software: you can redistribute it and/or  modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.axelor.apps.account.ebics.web;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.security.GeneralSecurityException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.openssl.PEMReader;
import org.bouncycastle.openssl.PEMWriter;

import com.axelor.apps.account.db.EbicsBank;
import com.axelor.apps.account.db.EbicsUser;
import com.axelor.apps.account.db.repo.BankOrderFileFormatRepository;
import com.axelor.apps.account.db.repo.EbicsBankRepository;
import com.axelor.apps.account.db.repo.EbicsUserRepository;
import com.axelor.apps.account.ebics.certificate.CertificateManager;
import com.axelor.apps.account.ebics.service.EbicsCertificateService;
import com.axelor.apps.account.ebics.service.EbicsService;
import com.axelor.apps.account.exception.IExceptionMessage;
import com.axelor.auth.db.User;
import com.axelor.auth.db.repo.UserRepository;
import com.axelor.exception.AxelorException;
import com.axelor.exception.db.IException;
import com.axelor.i18n.I18n;
import com.axelor.meta.MetaFiles;
import com.axelor.meta.db.MetaFile;
import com.axelor.meta.schema.actions.ActionView;
import com.axelor.rpc.ActionRequest;
import com.axelor.rpc.ActionResponse;
import com.axelor.rpc.Context;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;

public class EbicsController {

    @Inject
    EbicsUserRepository ebicsUserRepo;

    @Inject
    EbicsService ebicsService;

    @Inject
    UserRepository userRepo;

    @Inject
    EbicsBankRepository bankRepo;

    @Inject
    EbicsCertificateService certificateService;

    @Transactional
    public void generateCertificate(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        if (ebicsUser.getStatusSelect() != EbicsUserRepository.STATUS_WAITING_CERTIFICATE_CONFIG
                && ebicsUser.getStatusSelect() != EbicsUserRepository.STATUS_CERTIFICATES_SHOULD_BE_RENEW) {
            return;
        }

        CertificateManager cm = new CertificateManager(ebicsUser);
        try {
            cm.create();
            ebicsUser.setStatusSelect(EbicsUserRepository.STATUS_WAITING_SENDING_SIGNATURE_CERTIFICATE);
            ebicsUserRepo.save(ebicsUser);
        } catch (GeneralSecurityException | IOException e) {
            e.printStackTrace();
        }
        response.setReload(true);

    }

    public void generateDn(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());
        User user = ebicsUser.getAssociatedUser();
        if (user != null) {
            response.setValue("dn", ebicsService.makeDN(ebicsUser.getName(), user.getEmail(), "France",
                    user.getActiveCompany().getCode()));
        } else {
            response.setValue("dn", ebicsService.makeDN(ebicsUser.getName(), null, "France", null));
        }

    }

    public void sendINIRequest(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        try {
            ebicsService.sendINIRequest(ebicsUser, null);
        } catch (AxelorException e) {
            response.setFlash(stripClass(e.getLocalizedMessage()));
        }

        response.setReload(true);

    }

    public void sendHIARequest(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        try {
            ebicsService.sendHIARequest(ebicsUser, null);
        } catch (AxelorException e) {
            response.setFlash(stripClass(e.getLocalizedMessage()));
        }

        response.setReload(true);
    }

    public void sendHPBRequest(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        try {
            X509Certificate[] certificates = ebicsService.sendHPBRequest(ebicsUser, null);
            confirmCertificates(ebicsUser, certificates, response);
        } catch (AxelorException e) {
            response.setFlash(stripClass(e.getLocalizedMessage()));
        }

        response.setReload(true);
    }

    private void confirmCertificates(EbicsUser user, X509Certificate[] certificates, ActionResponse response) {

        try {
            EbicsBank bank = user.getEbicsPartner().getEbicsBank();
            response.setView(ActionView.define("Confirm certificates")
                    .model("com.axelor.apps.account.db.EbicsCertificate")
                    .add("form", "ebics-certificate-confirmation-form").param("show-toolbar", "false")
                    .param("show-confirm", "false").param("popup-save", "false").param("popup", "true")
                    .context("ebicsBank", bank).context("url", bank.getUrl()).context("hostId", bank.getHostId())
                    .context("e002Hash", DigestUtils.sha1Hex(certificates[0].getEncoded()).toUpperCase())
                    .context("x002Hash", DigestUtils.sha1Hex(certificates[1].getEncoded()).toUpperCase())
                    .context("certificateE002", convertToPEMString(certificates[0]))
                    .context("certificateX002", convertToPEMString(certificates[1])).map());
        } catch (Exception e) {
            response.setFlash("Error in certificate confirmation ");
        }

    }

    public void sendSPRRequest(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        try {
            ebicsService.sendSPRRequest(ebicsUser, null);
        } catch (AxelorException e) {
            response.setFlash(stripClass(e.getLocalizedMessage()));
        }

        response.setReload(true);
    }

    public void sendFULRequest(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        try {

            EbicsBank ebicsBank = ebicsUser.getEbicsPartner().getEbicsBank();

            MetaFile testMetaFile = ebicsBank.getTestFile();

            if (ebicsBank.getTestMode() && testMetaFile != null) {
                ebicsService.sendFULRequest(ebicsUser, null, MetaFiles.getPath(testMetaFile).toFile(),
                        BankOrderFileFormatRepository.FILE_FORMAT_pain_001_001_02_SCT);
            } else {
                response.setFlash(I18n.get(IExceptionMessage.EBICS_TEST_MODE_NOT_ENABLED));
            }

        } catch (AxelorException e) {
            response.setFlash(stripClass(e.getLocalizedMessage()));
        }

        response.setReload(true);
    }

    public void sendFDLRequest(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        try {
            ebicsService.sendFDLRequest(ebicsUser, null, null, null,
                    BankOrderFileFormatRepository.FILE_FORMAT_pain_001_001_02_SCT);
        } catch (AxelorException e) {
            response.setFlash(stripClass(e.getLocalizedMessage()));
        }

        response.setReload(true);
    }

    public void sendHTDRequest(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        try {
            ebicsService.sendHTDRequest(ebicsUser, null, null, null);
        } catch (AxelorException e) {
            response.setFlash(stripClass(e.getLocalizedMessage()));
        }

        response.setReload(true);
    }

    public void sendPTKRequest(ActionRequest request, ActionResponse response) {

        EbicsUser ebicsUser = ebicsUserRepo.find(request.getContext().asType(EbicsUser.class).getId());

        try {
            ebicsService.sendPTKRequest(ebicsUser, null, null, null);
        } catch (AxelorException e) {
            response.setFlash(stripClass(e.getLocalizedMessage()));
        }

        response.setReload(true);
    }

    private String stripClass(String msg) {

        return msg.replace(AxelorException.class.getName() + ":", "");
    }

    public void addCertificates(ActionRequest request, ActionResponse response) throws AxelorException {

        Context context = request.getContext();

        EbicsBank bank = (EbicsBank) context.get("ebicsBank");

        bank = bankRepo.find(bank.getId());

        try {
            X509Certificate certificate = convertToCertificate((String) context.get("certificateE002"));
            certificateService.createCertificate(certificate, bank, "encryption");

            certificate = convertToCertificate((String) context.get("certificateX002"));
            certificateService.createCertificate(certificate, bank, "authentication");

        } catch (CertificateException | IOException e) {
            e.printStackTrace();
            throw new AxelorException(I18n.get("Error in adding bank certificate"), IException.CONFIGURATION_ERROR);
        }

        response.setCanClose(true);
    }

    private String convertToPEMString(X509Certificate x509Cert) throws IOException {

        StringWriter sw = new StringWriter();
        try (PEMWriter pw = new PEMWriter(sw)) {
            pw.writeObject(x509Cert);
        }

        return sw.toString();
    }

    private X509Certificate convertToCertificate(String pemString) throws IOException {

        X509Certificate cert = null;
        StringReader reader = new StringReader(pemString);
        PEMReader pr = new PEMReader(reader);
        cert = (X509Certificate) pr.readObject();
        pr.close();

        return cert;
    }

}