All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kapott.hbci.manager.HBCIKernelImpl Maven / Gradle / Ivy

There is a newer version: 4.0.0
Show newest version

/*  $Id: HBCIKernelImpl.java,v 1.1 2011/05/04 22:37:47 willuhn Exp $

    This file is part of HBCI4Java
    Copyright (C) 2001-2008  Stefan Palme

    HBCI4Java is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    HBCI4Java is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

package org.kapott.hbci.manager;

import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

import org.kapott.hbci.callback.HBCICallback;
import org.kapott.hbci.exceptions.CanNotParseMessageException;
import org.kapott.hbci.exceptions.HBCI_Exception;
import org.kapott.hbci.exceptions.InvalidUserDataException;
import org.kapott.hbci.passport.HBCIPassport;
import org.kapott.hbci.passport.HBCIPassportInternal;
import org.kapott.hbci.passport.HBCIPassportList;
import org.kapott.hbci.protocol.MSG;
import org.kapott.hbci.protocol.factory.MSGFactory;
import org.kapott.hbci.rewrite.Rewrite;
import org.kapott.hbci.security.Crypt;
import org.kapott.hbci.security.Sig;
import org.kapott.hbci.security.factory.CryptFactory;
import org.kapott.hbci.security.factory.SigFactory;
import org.kapott.hbci.status.HBCIMsgStatus;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public final class HBCIKernelImpl implements HBCIKernel
{
    public final static boolean SIGNIT=true;
    public final static boolean DONT_SIGNIT=false;
    public final static boolean CRYPTIT=true;
    public final static boolean DONT_CRYPTIT=false;
    public final static boolean NEED_SIG=true;
    public final static boolean DONT_NEED_SIG=false;
    public final static boolean NEED_CRYPT=true;
    public final static boolean DONT_NEED_CRYPT=false;
    
    private String hbciversion;      /* the HBCI version used by this kernel object */
    private MsgGen gen;              /* an instance of a message generator */
    private String currentMsgName;   /* name of job currently beeing created */
    
    private IHandlerData parentHandlerData;
    
    public HBCIKernelImpl(IHandlerData parentHandlerData,String hbciversion)
    {
        this.parentHandlerData=parentHandlerData;
        this.hbciversion=hbciversion;

        String xmlpath=HBCIUtils.getParam("kernel.kernel.xmlpath");
        InputStream syntaxStream=null;
        if (xmlpath==null) {
            xmlpath="";
        }

        ClassLoader cl=this.getClass().getClassLoader();
        String filename=xmlpath+"hbci-"+hbciversion+".xml";
        syntaxStream=cl.getResourceAsStream(filename);
        if (syntaxStream==null)
            throw new InvalidUserDataException(HBCIUtilsInternal.getLocMsg("EXCMSG_KRNL_CANTLOAD_SYN",filename));
        
        try {
            gen=new MsgGen(syntaxStream);
            currentMsgName=null;
        } catch (Exception e) {
            throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_MSGGEN_INIT"),e);
        }
    }
    
    public String getHBCIVersion()
    {
        return hbciversion;
    }
    
    public void setParentHandlerData(IHandlerData parentHandlerData)
    {
    	if (this.parentHandlerData!=null) {
    		throw new HBCI_Exception("*** can not overwrite existing handler object");
    	}
    	this.parentHandlerData=parentHandlerData;
    }
    
    public IHandlerData getParentHandlerData()
    {
        return this.parentHandlerData;
    }

    public String getHBCIVersion(int dummy)
    {
        String   ret="";
        NodeList nodes=gen.getSyntax().getElementById("MsgHeadUser").getElementsByTagName("value");
        int      len=nodes.getLength();
        
        for (int i=0;i contain descriptions for the message
                    with name "xxx" */
    public void rawNewMsg(String name)
    {
        if (name==null || name.length()==0)
            throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_EMPTY_MSGNAME"));

        currentMsgName=name;
        HBCIUtils.log("creating new raw message "+name,HBCIUtils.LOG_DEBUG2);
        gen.reset();
    }

    /*  Sets a parameter for the currently to be created message
        (mid-level API).

        The @p key is the path to the element to be set, with the message name
        of the current message removed, e.g. if you want to set the value
        of DialogInit.Idn.prodName, you have to specify Idn.prodName as @key.

        @param key Path in current message to the element to be set.
        @param value String-representation of the new value for that element */
    public void rawSet(String key, String value)
    {
        HBCIUtils.log("setting raw property "+currentMsgName+"."+key+" to \""+value+"\"",
                      HBCIUtils.LOG_DEBUG2);
        
        if (currentMsgName==null)
            throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_NORAWMSG"));
        if (key==null)
            throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_KEYNULL"));
        if (value==null)
            throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_VALUENULL",key));
        
        if (value.length()!=0) {
            gen.set(currentMsgName+"."+key,value);
        }
    }
    
    public HBCIMsgStatus rawDoIt(boolean signit,boolean cryptit,boolean needSig,boolean needCrypt)
    {
        HBCIPassportList     passports=new HBCIPassportList();
        HBCIPassportInternal passport=(HBCIPassportInternal)getParentHandlerData().getPassport();
        passports.addPassport(passport,HBCIPassport.ROLE_ISS);
        return rawDoIt(passports,signit,cryptit,needSig,needCrypt);
    }

    /*  Processes the current message (mid-level API).

        This method creates the message specified earlier by the methods rawNewJob() and
        rawSet(), signs and encrypts it using the values of @p inst, @p user, @p signit
        and @p crypit and sends it to server.

        After that it waits for the response, decrypts it, checks the signature of the
        received message and returns a Properties object, that contains as keys the
        pathnames of all elements of the received message, and as values the corresponding
        value of the element with that path

        bricht diese methode mit einer exception ab, so muss die aufrufende methode
        die nachricht komplett neu erzeugen.

        @param signit A boolean value specifying, if the message to be sent should be signed.
        @param cryptit A boolean value specifying, if the message to be sent should be encrypted.
        @return A Properties object that contains a path-value-pair for each dataelement of
                the received message. */
    public HBCIMsgStatus rawDoIt(HBCIPassportList passports,boolean signit,boolean cryptit,boolean needSig,boolean needCrypt)
    {
        HBCIMsgStatus ret=new HBCIMsgStatus();
        MSG           msg=null;
        
        try {
            HBCIPassportInternal mainPassport=passports.getMainPassport();

            HBCIUtils.log("generating raw message "+currentMsgName,HBCIUtils.LOG_DEBUG);
            HBCIUtilsInternal.getCallback().status(mainPassport,HBCICallback.STATUS_MSG_CREATE,currentMsgName);

            // plaintextnachricht erzeugen
            msg=gen.generate(currentMsgName);

            // alle daten für den rewriter setzen
            Rewrite.setData("passports",passports);
            Rewrite.setData("msgStatus",ret);
            Rewrite.setData("msgName",currentMsgName);
            Rewrite.setData("signIt",Boolean.valueOf(signit));
            Rewrite.setData("cryptIt",Boolean.valueOf(cryptit));
            Rewrite.setData("needSig",Boolean.valueOf(needSig));
            Rewrite.setData("needCrypt",Boolean.valueOf(needCrypt));

            // liste der rewriter erzeugen
            String rewriters_st=HBCIUtils.getParam("kernel.rewriter");
            ArrayList al=new ArrayList();
            StringTokenizer tok=new StringTokenizer(rewriters_st,",");
            while (tok.hasMoreTokens()) {
                String rewriterName=tok.nextToken().trim();
                if (rewriterName.length()!=0) {
                    Class cl=this.getClass().getClassLoader().loadClass("org.kapott.hbci.rewrite.R"+
                                                                        rewriterName);
                    Constructor con=cl.getConstructor((Class[])null);
                    Rewrite rewriter=(Rewrite)(con.newInstance((Object[])null));
                    al.add(rewriter);
                }
            }
            Rewrite[] rewriters=al.toArray(new Rewrite[al.size()]);
            
            // alle rewriter durchlaufen und plaintextnachricht patchen
            for (int i=0;i current=new Hashtable();
            msg.extractValues(current);
            Properties origs=new Properties();
            for (Enumeration e=current.keys();e.hasMoreElements();) {
                String key= e.nextElement();
                String value= current.get(key);
                origs.setProperty("orig_"+key,value);
            }
            ret.addData(origs);
            
            // zu versendene nachricht loggen
            String outstring=msg.toString(0);
            HBCIUtils.log("sending message: "+outstring,HBCIUtils.LOG_DEBUG2);

            // max. nachrichtengröße aus BPD überprüfen
            int maxmsgsize=mainPassport.getMaxMsgSizeKB();
            if (maxmsgsize!=0 && (outstring.length()>>10)>maxmsgsize) {
                String errmsg=HBCIUtilsInternal.getLocMsg("EXCMSG_MSGTOOLARGE",
                                                  new Object[] {Integer.toString(outstring.length()>>10),Integer.toString(maxmsgsize)});
                if (!HBCIUtilsInternal.ignoreError(null,"client.errors.ignoreMsgSizeErrors",errmsg))
                    throw new HBCI_Exception(errmsg);
            }
            
            // soll nachricht verschlüsselt werden?
            if (cryptit) {
                HBCIUtils.log("trying to encrypt message",HBCIUtils.LOG_DEBUG);
                HBCIUtilsInternal.getCallback().status(mainPassport,HBCICallback.STATUS_MSG_CRYPT,null);
                
                // nachricht verschlüsseln
                MSG   old=msg;
                Crypt crypt=CryptFactory.getInstance().createCrypt(getParentHandlerData(),old);
                try {
                    msg=crypt.cryptIt("Crypted");
                } finally {
                    CryptFactory.getInstance().unuseObject(crypt);
                    if (msg!=old) {
                        MSGFactory.getInstance().unuseObject(old);
                    }
                }
                
                if (!msg.getName().equals("Crypted")) {
                    String errmsg=HBCIUtilsInternal.getLocMsg("EXCMSG_CANTCRYPT");
                    if (!HBCIUtilsInternal.ignoreError(null,"client.errors.ignoreCryptErrors",errmsg))
                        throw new HBCI_Exception(errmsg);
                }

                // verschlüsselte nachricht patchen
                for (int i=0;i> getAllLowlevelJobs()
    {
        return getMsgGen().getLowlevelGVs();
    }

    public List getLowlevelJobParameterNames(String gvname,String version)
    {
        return getMsgGen().getGVParameterNames(gvname,version);
    }
    
    public List getLowlevelJobResultNames(String gvname,String version)
    {
        return getMsgGen().getGVResultNames(gvname,version);
    }

    public List getLowlevelJobRestrictionNames(String gvname,String version)
    {
        return getMsgGen().getGVRestrictionNames(gvname,version);
    }

    public MsgGen getMsgGen()
    {
        return gen;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy