de.bsvrz.puk.config.main.authentication
Class ConfigAuthentication

java.lang.Object
  extended by de.bsvrz.puk.config.main.authentication.ConfigAuthentication
All Implemented Interfaces:
Authentication

public class ConfigAuthentication
extends Object
implements Authentication

Diese Klasse stellt alle Methoden zur Verfügung, um die Benutzer eines Datenverteilers eindeutig zu identifizieren. Es werden weitere Methoden zur Verfügung gestellt, um die Benutzer zu verwalten (anlegen neuer Benutzer, Passwörter ändern, usw.).

Die Klasse verwaltet selbstständig die Datei, in der die Benutzer mit ihrem Passwörtern (normales Passwort und Einmal-Passwörter) und ihren Rechten gespeichert sind.

Der Klasse werden nur verschlüsselte Aufträge übergeben und sie entschlüsselt diese automatisch und führt die Aufträge aus, falls der Benutzer die nötigen Rechte besitzt.

Author:
Achim Wullenkord (AW), Kappich Systemberatung

Nested Class Summary
private  class ConfigAuthentication.ConfigAuthenticationEntityResolver
          Implementierung eines EntityResolvers, der Referenzen auf den Public-Identifier "-//K2S//DTD Verwaltung//DE" ersetzt durch die verwaltungsdaten.dtd Resource-Datei in diesem Package.
private  class ConfigAuthentication.SingleServingPassword
          Speichert alle Informationen zu einem "Einmal-Passwort" (Passwort, Index, "schon gebraucht")
private  class ConfigAuthentication.UserAccount
          Diese Klasse Speichert alle Informationen, die zu Benutzerkonto gehören.
 
Field Summary
private  DataModel _dataModel
          Wird benötigt um bei den entsprechenden Konfigurationsbereichen neue Benutzer anzulegen
private static Debug _debug
          DebugLogger für Debug-Ausgaben
private  FileLock _lockAuthenticationFile
           
private  LinkedList<String> _randomText
          Diese Liste speichert alle Texte, die mit getText() erzeugt wurden.
private  URI _uriBase
          Speichert die Basis der Verzeichnisse für die Konfigurationsbereiche.
private  Map<String,ConfigAuthentication.UserAccount> _userAccounts
          Als Schlüssel dient der Benutzername (String) als Value werden alle Informationen, die zu einem Benutzer gespeichert wurden, zurückgegeben.
private  Document _xmlDocument
          Repräsentiert die vollständige XML-Datei.
private  File _xmlFile
          XML-Datei, wird zum anlagen einer Sicherheitskopie gebraucht
 
Constructor Summary
ConfigAuthentication(File userFile, DataModel dataModel)
          Lädt alle Informationen aus der angegebenen Datei.
 
Method Summary
private  void changeUserPassword(String username, String userNameForPasswordChange, String newPassword)
          Setzt bei einem Benutzer das Passwort neu.
private  void changeUserRights(String username, String usernameChangeRights, boolean newUserRights)
           
private  void checkRandomText(byte[] randomText)
          Prüft, ob der übergebene Text in der Liste der zufällig erzeugten Texte _randomText vorhanden ist.
 void close()
          Diese Methode wird aufgerufen, wenn das System heruntergefahren wird.
private  void createNewUser(String username, String newUserName, String newUserPid, String newUserPassword, boolean admin, String configurationArea)
          Legt einen neuen Benutzer mit den übergebenen Parametern an.
private  void createSingleServingPassword(String username, String usernameSingleServingPasswort, String passwortSingleServingPasswort)
           
private  void createUserObject(String pidConfigurationArea, String username, String pid)
          Erzeugt ein Objekt vom Typ "typ.Benutzer".
private  void createUserXML(String newUserName, String newUserPassword, boolean admin)
          Erzeugt einen neuen Benutzer im speicher und speichert diesen in einer XML-Datei.
private  Element createXMLSingleServingPasswort(String newPassword, int passwortindex, String usable)
          Erzeugt ein XML Objekt, das einem Einmal-Passwort entspricht.
private  Element createXMLUserAccount(String name, String password, String admin)
          Erzeugt ein XML Objekt, das einem Benutzerkonto entspricht.
private  void deleteUser(String username, String encryptedUsername, String encryptedPassword)
           
private  Deserializer getDeserializer(byte[] encryptedMessage, String decryptenText, String authentificationProcessName)
          Erzeugt einen Desirialisierer auf den mit den üblichen Methoden zugegriffen werden kann.
private  int getSerializerVersion(byte[] message)
          Ließt aus einem Byte-Array die ersten 4 Bytes aus und erzeugt daraus die benutztes Serializerversion
 byte[] getText()
          Erzeugt einen Zufallstext und gibt diesen als Byte-Array zurück.
private  boolean isAdmin(String username)
          Prüft ob der Benutzer Admin-Rechte besitzt.
private  EncryptDecryptProcedure isEncryptDecryptProcedureAllowed(String usedEncryptDecryptProcedure)
          Prüft, ob das Verfahren, das zum ver/entschlüsseln benutzt wurde, zugelassen ist.
 void isValidUser(String username, byte[] encryptedPassword, String authentificationText, String authentificationProcessName)
          Die Implementierung dieser Methode stellt die Authentifizierung des Benutzers sicher.
 void processTask(String usernameCustomer, byte[] encryptedMessage, String authentificationProcessName)
          Bearbeitet eine der folgenden Aufgaben:
- Neuer Benutzer anlegen
- Einmal-Passwort erzeugen
- Rechte eines Benutzers ändern
- Passwort eines Benuzters ändern
private  void readUserAccounts()
          Ließt alle Benutzer aus der XML-Datei ein und erzeugt entsprechende Java-Objekte.
private  byte[] removeFirst4Bytes(byte[] byteArray)
          Entfernt die ersten 4 Bytes eines Byte-Arrays und gibt ein neues Array zurück, bei dem genau die ersten 4 Bytes fehlen.
private  void saveXMLFile()
          Speichert alle Benutzerdaten in einer XML-Datei.
private  boolean userHasObject(String username, String pid)
          Prüft, ob es zu der Kombination Benutzername und Pid ein gültiges Objekt gibt.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_userAccounts

private final Map<String,ConfigAuthentication.UserAccount> _userAccounts
Als Schlüssel dient der Benutzername (String) als Value werden alle Informationen, die zu einem Benutzer gespeichert wurden, zurückgegeben.


_xmlFile

private final File _xmlFile
XML-Datei, wird zum anlagen einer Sicherheitskopie gebraucht


_debug

private static final Debug _debug
DebugLogger für Debug-Ausgaben


_xmlDocument

private final Document _xmlDocument
Repräsentiert die vollständige XML-Datei.


_uriBase

private URI _uriBase
Speichert die Basis der Verzeichnisse für die Konfigurationsbereiche.


_randomText

private final LinkedList<String> _randomText
Diese Liste speichert alle Texte, die mit getText() erzeugt wurden. Die Texte werden immer an das Ender der Liste eingefügt. Wird ein Text empfangen, wird dieser aus der Liste gelöscht.

Erreicht die eine bestimmte Größe, wird das erste Element gelöscht, da das erste Element am längsten in der Liste vorhanden ist.

Die Liste ist nicht synchronisiert.


_dataModel

private DataModel _dataModel
Wird benötigt um bei den entsprechenden Konfigurationsbereichen neue Benutzer anzulegen


_lockAuthenticationFile

private final FileLock _lockAuthenticationFile
Constructor Detail

ConfigAuthentication

public ConfigAuthentication(File userFile,
                            DataModel dataModel)
                     throws ParserConfigurationException
Lädt alle Informationen aus der angegebenen Datei. Ist die Datei nicht vorhanden, wird eine Datei mit allen Grundeinstellungen erzeugt.

Parameters:
userFile - XML-Datei, in der alle Benutzer gespeichert sind.
Throws:
ParserConfigurationException
Method Detail

readUserAccounts

private void readUserAccounts()
Ließt alle Benutzer aus der XML-Datei ein und erzeugt entsprechende Java-Objekte. Diese werden dann in der in der Hashtable gespeichert. Die Methode ist private, weil diese Funktionalität nur an dieser Stelle zur Verfügung gestellt werden soll.


isValidUser

public void isValidUser(String username,
                        byte[] encryptedPassword,
                        String authentificationText,
                        String authentificationProcessName)
                 throws Exception
Description copied from interface: Authentication
Die Implementierung dieser Methode stellt die Authentifizierung des Benutzers sicher. Dafür wird das original Passwort mit dem übergebenen authentificationText verschlüsselt und mit dem übergebenen verschlüsselten Passwort verglichen. Sind beide Passwörter gleich, und der übergebene Benutzername stimmt mit dem Benutzernamen des original Passworts überein, so war die Authentifkation erfolgreich.

Konnte das original Passwort nicht benutzt werden, muss geprüft werden, ob es ein Einmal-Passwort gibt. Das Einmal-Passwort muss das derzeit aktuell gültige sein und muss mit dem übergebenen verschlüsseltem Passwort übereinstimmen. Gibt es ein entsprechendes Einmal-Passwort, so ist es für immer zu sperren.

Konnte kein Passwort gefunden werden, wird eine IllegalArgumentException geworfen.

Specified by:
isValidUser in interface Authentication
Parameters:
username - Benutzername, der zu dem übergebenen verschlüsselten Passwort gehört
encryptedPassword - Passwort, das mit dem übergebenen Text authentificationText verschlüsselt wurde
authentificationText - Text, der benutzt wurde um das übergebene Passwort encryptedPassword zu verschlüsseln
authentificationProcessName - Name des Verschlüsslungsverfahren, das benutzt wurde. Mit diesem Verfahren wird das Originalpasswort verschlüsselt
Throws:
Exception - Fehler beim schreiben der neuen Informationen oder ein technisches Problem beim verschlüsseln der Daten
IllegalArgumentException - Dem Benutzernamen konnte das Passwort nicht zugeorndet werden oder der Benutzer war unbekannt

getText

public byte[] getText()
Description copied from interface: Authentication
Erzeugt einen Zufallstext und gibt diesen als Byte-Array zurück.

Specified by:
getText in interface Authentication
Returns:
Zufallstext

close

public void close()
Description copied from interface: Authentication
Diese Methode wird aufgerufen, wenn das System heruntergefahren wird. Es ist ein Zustand herzustellen, der es ermöglicht das System wieder zu starten.

Specified by:
close in interface Authentication

checkRandomText

private void checkRandomText(byte[] randomText)
                      throws ConfigurationTaskException
Prüft, ob der übergebene Text in der Liste der zufällig erzeugten Texte _randomText vorhanden ist. Kann der Text nicht gefunden werden, wird eine Exception geworfen. Konnte der Text gefunden werden, wird der Text aus der Liste entfernt.

Parameters:
randomText - Text, der in der Liste der verschickten Texte zu finden sein muss
Throws:
ConfigurationTaskException - Der übergebene Text konnte in der Liste der verschickten Texte nicht gefunden werden

processTask

public void processTask(String usernameCustomer,
                        byte[] encryptedMessage,
                        String authentificationProcessName)
                 throws RequestException,
                        ConfigurationTaskException
Description copied from interface: Authentication
Bearbeitet eine der folgenden Aufgaben:
- Neuer Benutzer anlegen
- Einmal-Passwort erzeugen
- Rechte eines Benutzers ändern
- Passwort eines Benuzters ändern

Specified by:
processTask in interface Authentication
Parameters:
usernameCustomer - Benutzer, der den Auftrag erteilt
encryptedMessage - verschlüsselte Aufgabe, die ausgeführt werden soll
authentificationProcessName - Verschlüsslungsverfahren mit der encryptedMessage erstellt wurde
Throws:
RequestException - Der Auftrag konnte aufgrund eines technischen Fehlers nicht ausgeführt werden (defektes Speichermedium, Fehler im Dateisystem, usw.). Erst wenn dieser Fehler behoben ist, können weitere Aufträge ausgeführt werden.
ConfigurationTaskException - Der Auftrag, der durch die Konfiguration ausgeführt werden sollte, konnte nicht durchgeführt werden, weil bestimmte Parameter nicht erfüllt waren. Welche Parameter dies genau sind, hängt vom jeweiligen Auftrag ab, so kann zum Beispiel ein Passwort fehlerhaft gewesen sein oder der Benutzer besitzt nicht die nötigen Rechte um einen Auftrag dieser Art anzustoßen. Wenn der Auftrag erneut übermittelt werden würden, mit den richtigen Parametern, könnte er ausgeführt werden.

createSingleServingPassword

private void createSingleServingPassword(String username,
                                         String usernameSingleServingPasswort,
                                         String passwortSingleServingPasswort)
                                  throws RequestException,
                                         ConfigurationTaskException
Parameters:
username - Benutzer, der den Auftrag angestossen hat
usernameSingleServingPasswort - Benutzer für den das Einmal-Passwort gedacht ist
passwortSingleServingPasswort - Einmal-Passwort
Throws:
RequestException - Technischer Fehler, der Auftrag konnte nicht bearbeitet werden.
ConfigurationTaskException - Die Konfiguration weigert sich den Auftrag auszuführen weil z.b. das Passwort falsch war, der Benutzer nicht die nötigen Rechte besitzt usw..

isEncryptDecryptProcedureAllowed

private EncryptDecryptProcedure isEncryptDecryptProcedureAllowed(String usedEncryptDecryptProcedure)
                                                          throws ConfigurationTaskException
Prüft, ob das Verfahren, das zum ver/entschlüsseln benutzt wurde, zugelassen ist. Ist das Verfahren nicht zugelassen oder es kann nicht zugeordnet werden, wird eine ConfigurationTaskException geworfen.

Parameters:
usedEncryptDecryptProcedure - Benutztes Verfahren als String
Returns:
Verfahren
Throws:
ConfigurationTaskException

isAdmin

private boolean isAdmin(String username)
Prüft ob der Benutzer Admin-Rechte besitzt.

Parameters:
username - Benutzername, der geprüft werden soll ob Admin-Rechte vorhanden sind
Returns:
true = Der Benutzer darf die Eigenschaften anderer Benutzer ändern und Einmal-Passwörter anlegen; false = Der Benutzer darf nur sein eigenes Passwort ändern

createNewUser

private void createNewUser(String username,
                           String newUserName,
                           String newUserPid,
                           String newUserPassword,
                           boolean admin,
                           String configurationArea)
                    throws ConfigurationTaskException,
                           RequestException
Legt einen neuen Benutzer mit den übergebenen Parametern an.

Parameters:
username - Benutzer, der den Auftrag erteilt
newUserName - Name des neuen Benutzers
newUserPassword - Passwort des neuen Benutzers
admin - Rechte des neuen Benutzers (true = Adminrechte; false = normaler Benutzerrechte)
newUserPid - Pid, die der neue Benutzer erhalten soll. Wird ein Leerstring ("") übergeben, so bekommt der Benutzer keine expliziete Pid
configurationArea - Pid des Konfigurationsbereichs, in dem der neue Benutzer angelegt werden soll
Throws:
ConfigurationTaskException - Der neue Benutzer durfte nicht anglegt werden (Keine Rechte, Bentuzer bereits vorhanden)
RequestException - technischer Fehler beim Zugriff auf die XML-Datei

createUserObject

private void createUserObject(String pidConfigurationArea,
                              String username,
                              String pid)
                       throws ConfigurationChangeException
Erzeugt ein Objekt vom Typ "typ.Benutzer".

Parameters:
pidConfigurationArea - Pid des Konfiguratinsbereichs, in dem der neue Benutzer angelegt werden soll
username - Name des Objekts
pid - Pid des Objekts
Throws:
ConfigurationChangeException - Fehler beim erzeugen des neuen Benutzers

createUserXML

private void createUserXML(String newUserName,
                           String newUserPassword,
                           boolean admin)
                    throws FileNotFoundException,
                           TransformerException
Erzeugt einen neuen Benutzer im speicher und speichert diesen in einer XML-Datei.

Parameters:
newUserName - Benutzername
newUserPassword - Passwort
admin - Adminrechte ja/nein
Throws:
FileNotFoundException
TransformerException

userHasObject

private boolean userHasObject(String username,
                              String pid)
Prüft, ob es zu der Kombination Benutzername und Pid ein gültiges Objekt gibt. Ein gültiges Objekt bedeutet, dass Pid und Benutzername übereinstimmen.

Parameters:
username - Benutzername
pid - Pid des Benutzers
Returns:
true = Es gibt ein aktuell gültiges Objekt; false = Es gibt kein aktuell gültiges Objekt
Throws:
IllegalStateException - Es gibt ein Objekt mit der angegebenen Pid, aber der Name des Objekts ist anders, als der übergebene Name

getSerializerVersion

private final int getSerializerVersion(byte[] message)
Ließt aus einem Byte-Array die ersten 4 Bytes aus und erzeugt daraus die benutztes Serializerversion

Parameters:
message - Nachricht, die ersten 4 Bytes werden ausgelesen
Returns:
Integer, der aus den ersten 4 Bytes der Nachricht ausgelesen wird

removeFirst4Bytes

private final byte[] removeFirst4Bytes(byte[] byteArray)
Entfernt die ersten 4 Bytes eines Byte-Arrays und gibt ein neues Array zurück, bei dem genau die ersten 4 Bytes fehlen.

Parameters:
byteArray - Array, aus dem die ersten 4 Bytes entfernt werden
Returns:
Array, bei dem die ersten 4 Bytes des Ursprungs-Arrays fehlen

changeUserPassword

private void changeUserPassword(String username,
                                String userNameForPasswordChange,
                                String newPassword)
                         throws ConfigurationTaskException,
                                RequestException
Setzt bei einem Benutzer das Passwort neu. Dies kann entweder ein Admin bei einem anderen Benutzerkonto oder ein Benutzer bei seinem eigenen Benutzerkonto.

Ist für einen Benutzer nur das Objekt des Benutzers in der Konfiguration vorhanden, aber das Benutzerkonto fehlt, wird das Benutzerkonto mit createNewUser(java.lang.String, java.lang.String, java.lang.String, java.lang.String, boolean, java.lang.String) angelegt. Das neue Benutzerkonto besitzt dabei keine Adminrechte. Das neue Benutzerkonto wird dabei das Passwort erhalten, das neu gesetzt werden sollte.

Gibt es zwar ein Benutzerkonto, aber kein Objekt in der Konfiguration, wird ein Fehler ausgegeben.

Sind weder Objekt noch Benutzerkonto vorhanden wird ein Fehler ausgegeben.

Parameters:
username - Benutzer, der den Auftrag zum ändern des Passworts erteilt hat
userNameForPasswordChange - Benutzer, dessen Passwort geändert werden soll
newPassword - neues Passwort
Throws:
ConfigurationTaskException - Der Benutzer ist unbekannt oder es gibt zu dem Benutzer kein entsprechendes Objekt oder der Benutzer darf das Passwort nicht ändern (kein Admin oder der Besitzer des Passwords).
RequestException - Fehler beim Zugriff auf die XML-Datei

changeUserRights

private void changeUserRights(String username,
                              String usernameChangeRights,
                              boolean newUserRights)
                       throws ConfigurationTaskException,
                              RequestException
Parameters:
username - Benutzer, der den Auftrag erteilt hat (dieser muss Adminrechte besitzen)
usernameChangeRights - Benutzer, dessen Rechte geändert werden soll
newUserRights - Neue Rechte des Benutzers (true = Admin-Rechte, false = normaler Benutzerrechte
Throws:
ConfigurationTaskException - Der Benutzer ist unbekannt oder der Auftraggeber besitzt nicht die nötigen Rechte
RequestException - Fehler beim Zugriff auf die XML-Datei

getDeserializer

private final Deserializer getDeserializer(byte[] encryptedMessage,
                                           String decryptenText,
                                           String authentificationProcessName)
                                    throws Exception
Erzeugt einen Desirialisierer auf den mit den üblichen Methoden zugegriffen werden kann. Dafür wird der übergebene, verschlüsselte Text entschlüsselt.

Parameters:
encryptedMessage - Verschlüsselte Nachricht, diese wird entschlüsselt
decryptenText - Text, mit dem die verschlüsselte Nachricht entschlüsselt wird
authentificationProcessName - Verfahren, mit dem die Nachricht verschlüsselt wurde
Returns:
Deserialisierer
Throws:
Exception - Fehler beim entschlüsseln oder beim erstellen des Desirialisierers

deleteUser

private void deleteUser(String username,
                        String encryptedUsername,
                        String encryptedPassword)
                 throws IllegalStateException
Throws:
IllegalStateException

saveXMLFile

private void saveXMLFile()
                  throws TransformerException,
                         FileNotFoundException
Speichert alle Benutzerdaten in einer XML-Datei.

Throws:
TransformerException
FileNotFoundException

createXMLSingleServingPasswort

private Element createXMLSingleServingPasswort(String newPassword,
                                               int passwortindex,
                                               String usable)
Erzeugt ein XML Objekt, das einem Einmal-Passwort entspricht.

Parameters:
newPassword - Passwort des neuen Einmal-Passworts
passwortindex - Index des Einmal-Passworts
usable - ja = Das Einmal-Passwort ist noch zu benutzen; nein = Das Einmal-Passwort kann nicht mehr benutzt werden
Returns:
XML-Objekt, das einem Einmal-Passwort entspricht

createXMLUserAccount

private Element createXMLUserAccount(String name,
                                     String password,
                                     String admin)
Erzeugt ein XML Objekt, das einem Benutzerkonto entspricht. Einmal-Passwörter müssen mit der entsprechenden Methode erzeugt werden.

Parameters:
name - Name des Benutzers
password - Passwort des Benutzers (in Klarschrift)
admin - ja = Der Benutzer besitzt Admin-Rechte; nein = Der Benutzer besitzt keine Admin-Rechte
Returns:
XML Objekt, das einem Benutzerkonto entspricht