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

de.bund.bva.isyfact.sicherheit.impl.XmlAccess Maven / Gradle / Ivy

There is a newer version: 3.2.1
Show newest version
/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 * The Federal Office of Administration (Bundesverwaltungsamt, BVA)
 * licenses this file to you 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.bund.bva.isyfact.sicherheit.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import de.bund.bva.isyfact.sicherheit.Rolle;
import de.bund.bva.isyfact.sicherheit.common.exception.RollenRechteMappingException;
import de.bund.bva.isyfact.sicherheit.common.konstanten.SicherheitFehlerSchluessel;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

import de.bund.bva.isyfact.logging.IsyLogger;
import de.bund.bva.isyfact.logging.IsyLoggerFactory;
import de.bund.bva.isyfact.sicherheit.Recht;

/**
 * Diese Klasse ließt ein RollenRechte-XML ein und gibt es aus.
 *
 * @deprecated since IsyFact 3.0.0 in favor of the isy-security module.
 */
@Deprecated
public class XmlAccess {

    /** Logger. */
    private static final IsyLogger LOG = IsyLoggerFactory.getLogger(XmlAccess.class);

    /**
     * In einem ersten Schritt wird eine Übersicht über alle Rechte erstellt.
     */
    private HashMap rechtIdZuRecht = new HashMap();

    /**
     * Name des XML-Elementes in Recht über das die Properties angesprochen werden.
     */
    private static final String PROPERTIES = "properties";

    /**
     * Name des XML-Attributes der Id einer Rolle.
     */
    private static final String PROPERTY_NAME = "PropertyName";

    /**
     * Name des XML-Attributes der Id einer Rolle.
     */
    private static final String PROPERTY_VALUE = "PropertyValue";

    /**
     * Name des XML-Elementes in Recht über das die RechtId angesprochen wird.
     */
    private static final String RECHT_ID = "rechtId";

    /**
     * Name des XML-Attributes der Id einer RechteId.
     */
    private static final String ID_IN_RECHTE_ID = "Id";

    /**
     * Name des XML-Attributes der Id einer Rolle.
     */
    private static final String ROLLE_ID = "RolleId";

    /**
     * Name des XML-Attributes des Namen einer Rolle.
     */
    private static final String ROLLE_NAME = "RolleName";

    /**
     * Name der XML-Elementes über die Rollen von einer Anwendung aus angesprochen werden.
     */
    private static final String ROLLEN = "rollen";

    /**
     * Name der XML-Elementes über die Rechte von einer Anwendung aus angesprochen werden.
     */
    private static final String RECHTE = "rechte";

    /**
     * Name des XML-Attributes der Id einer Anwendung.
     */
    private static final String ANWENDUNGS_ID = "AnwendungsId";

    /**
     * Parst die Datei an dem übergebenen Pfad und macht daraus ein RollenRechteMapping mit dem ein
     * Berechtigungsmanager über das Mapping von Rollen zu Rechten innerhalbe einer Anwendung informiert wird.
     *
     * @param filename
     *            Vollständiger Pfad zur Datei mit den Rechten
     * @return Die eingelesene Datei als Rollen zu Rechte Mapping
     * @throws RollenRechteMappingException
     *             Bei allen Verarbeitungsfehlern
     */
    public RollenRechteMapping parseRollenRechteFile(String filename) {
        LOG.debug("Lese Rollen-Rechte-Mapping aus {}.", filename);
        Document dom;
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        documentBuilderFactory.setExpandEntityReferences(false);
        try (InputStream stream = XmlAccess.class.getResourceAsStream(filename)) {
            documentBuilderFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
            documentBuilderFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            dom = documentBuilder.parse(stream);
            RollenRechteMapping result = parseDocument(dom);
            result.setAlleDefiniertenRechte(this.rechtIdZuRecht.values());
            return result;
        } catch (ParserConfigurationException pce) {
            throw new RollenRechteMappingException(
                SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT, pce,
                "XML-Parser Fehler");
        } catch (SAXException se) {
            throw new RollenRechteMappingException(
                SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT, se,
                "SAX-Exception");
        } catch (IOException ioe) {
            throw new RollenRechteMappingException(
                SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT, ioe,
                "IO-Exception");
        }
    }

    /**
     * In dieser Methode wird die AnwendungsId aus dem Document extrahiert und ins Mapping gesetzt. Das Parse
     * der Mappinginformationen von Rollen zu Rechten wird aufgerufen.
     *
     * @param doc
     *            Das geparste Document
     * @return Das vollständige RollenRechteMapping
     * @throws RollenRechteMappingException
     *             Falls die AnwendungsId fehlt oder es bei den aufgerufenen Methoden zu Fehlern kommt
     */
    private RollenRechteMapping parseDocument(Document doc) {
        RollenRechteMapping ergebnis = new RollenRechteMapping();
        Element anwendung = doc.getDocumentElement();
        String anwendungsId = anwendung.getAttribute(ANWENDUNGS_ID);
        if (anwendungsId.equals("")) {
            throw new RollenRechteMappingException(
                SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                "Es ist keine AnwendungsId gesetzt");
        }
        erstelleRechteUebersicht(anwendung);
        ergebnis.setAnwendungsId(anwendungsId);
        ergebnis.setRollenRechteMapping(getRollenRechtMapping(anwendung));
        return ergebnis;
    }

    /**
     * Durchläuft alle Nodes und ruft für jedes Recht die Methode leseRecht auf. Alle gelesenen Rechte werden
     * dann in der HashMap rechtIdZuRecht gesetzt.
     *
     * @param anwendung
     *            Das Basis-Element der eingelesenen XML-Datein
     * @throws RollenRechteMappingException
     *             Wenn es beim lesen eines Rechtes zu Fehlern kommt
     */
    private void erstelleRechteUebersicht(Element anwendung) {
        Node child = anwendung.getFirstChild();
        while (child != null) {
            if (child.getNodeName().contains(RECHTE)) {
                Element recht = (Element) child;
                Recht rechtObjekt = leseRecht(recht);
                this.rechtIdZuRecht.put(rechtObjekt.getId(), rechtObjekt);
            }
            child = child.getNextSibling();
        }
    }

    /**
     * Wandelt ein Element das ein Recht hat in eine Instanz des Interfaces Recht um.
     *
     * @param recht
     *            Element das ein Recht ist
     * @return Das Transofmierte Recht
     * @throws RollenRechteMappingException
     *             Wenn das Recht nicht den Erwartungen entspricht
     */
    private Recht leseRecht(Element recht) {
        String rechtId = null;
        HashMap properties = new HashMap();
        Node child = recht.getFirstChild();
        while (child != null) {
            if (child.getNodeName().contains(RECHT_ID)) {
                if (rechtId != null) {
                    throw new RollenRechteMappingException(
                        SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                        "Es wurde eine Rolle mit zwei Referenzen auf RechteIds gefunden");
                }
                Element rechtIdElement = (Element) child;
                rechtId = rechtIdElement.getAttribute(ID_IN_RECHTE_ID);
                if (rechtId == null || rechtId.equals("")) {
                    throw new RollenRechteMappingException(
                        SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                        "Es wurde eine RechtId ohne Id gefunden");
                }
            }
            if (child.getNodeName().contains(PROPERTIES)) {
                Element property = (Element) child;
                String propertyName = property.getAttribute(PROPERTY_NAME);
                if (propertyName == null || propertyName.equals("")) {
                    throw new RollenRechteMappingException(
                        SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                        "Es wurde ein Property ohne Name gefunden");
                }
                String propertyValue = property.getAttribute(PROPERTY_VALUE);
                if (propertyValue == null || propertyValue.equals("")) {
                    throw new RollenRechteMappingException(
                        SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                        "Es wurde ein Property ohne Value gefunden");
                }
                properties.put(propertyName, propertyValue);
            }

            child = child.getNextSibling();
        }
        if (rechtId == null) {
            throw new RollenRechteMappingException(
                SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                "Recht ohne RechtId gefunden");
        }
        if (properties.size() == 0) {
            return new RechtImpl(rechtId, null);
        }
        return new RechtImpl(rechtId, properties);
    }

    /**
     * Liest alle definierten Rollen aus speichert für diese die RollenId und ruft jeweils das Mapping aller
     * Rechte für diese Rolle auf.
     *
     * @param anwendung
     *            Das Top-Element des RollenRechteMapping
     * @return Eine HashMaps mit Rechten zu Rollen
     * @throws RollenRechteMappingException
     *             Falls bei einem Eintrag die RollenId fehlt, oder keine Rolle definiert wurde
     */
    private HashMap> getRollenRechtMapping(Element anwendung) {
        boolean mindestensEineRolleGefunden = false;
        HashMap> rollenRechte = new HashMap>();
        Node child = anwendung.getFirstChild();
        while (child != null) {
            if (child.getNodeName().contains(ROLLEN)) {
                mindestensEineRolleGefunden = true;
                Element rolle = (Element) child;
                String rolleId = rolle.getAttribute(ROLLE_ID);
                if (rolleId == null || rolleId.equals("")) {
                    throw new RollenRechteMappingException(
                        SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                        "Id der Rolle fehlt");
                }
                String rolleName = rolle.getAttribute(ROLLE_NAME);
                RolleImpl neueRolle = new RolleImpl(rolleId, rolleName);
                List rechte = getRechteFuerRolle(rolle);
                rollenRechte.put(neueRolle, rechte);
            }
            child = child.getNextSibling();
        }
        if (!mindestensEineRolleGefunden) {
            throw new RollenRechteMappingException(
                SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                "Es wurde keine einzige Rolle gefunden");
        }
        return rollenRechte;
    }

    /**
     * Liest aus dem Element einer Rolle alle Rechte aus.
     *
     * @param rolle
     *            Das Element für eine Rolle
     * @return Eine Liste aller Rechte für diese Rolle
     * @throws RollenRechteMappingException
     *             Falls eine unbekannte RechtId gefunden wird
     */
    private List getRechteFuerRolle(Element rolle) {
        List alleRechte = new ArrayList();
        Node child = rolle.getFirstChild();
        while (child != null) {
            if (child.getNodeName().contains(RECHT_ID)) {
                Element rechtId = (Element) child;
                String idVonRechtId = rechtId.getAttribute(ID_IN_RECHTE_ID);
                if (idVonRechtId.equals("")) {
                    throw new RollenRechteMappingException(
                        SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                        "Recht hat keine Id");
                }
                Recht neuesRecht = this.rechtIdZuRecht.get(idVonRechtId);
                if (neuesRecht == null) {
                    throw new RollenRechteMappingException(
                        SicherheitFehlerSchluessel.MSG_AUTORISIERUNG_ROLLENRECHTEMAPPING_FEHLERHAFT,
                        "Das Recht mit Id: " + idVonRechtId + " ist unbekannt");
                }
                alleRechte.add(neuesRecht);
            }
            child = child.getNextSibling();
        }

        return alleRechte;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy