Hallo zusammen,
Ich wende mich heute mit einem vielleicht etwas abstrusen Problem an Euch.
Ich wurde heute mit einer Nutzeranfrage konfrontiert, die ein älteres System betrifft (das in Kürze ersetzt werden soll).
Zur Grundthematik
Es handelt sich um ein agentenbasiertes Simulationssystem, bei welchem die einzelnen aktiven Simulationsentitäten (Agenten) verschiedene Aktionen ausführen können. Hat sich ein Agent für eine Aktion (z.B. eine Bewegung) entschieden, so fragt er bei einem ActionHandler nach, ob diese Aktion ausgeführt werden kann. Dieser ActionHandler führt dann entweder diese Aktion aus oder lehnt sie ab. Der Agent wird darüber über eine Response informiert und kann bei Bedarf entsprechend darauf reagieren.
Zur Problematik
Besagter Nutzer hat nun beklagt, dass der Aufruf am ActionHandler nicht abgesichert sei. Gemäß API übernimmt die Methode die Bewegungsanfrage und eine Entität, die als Anfragesteller angenommen (!) wird (Sprich: Ein Agent übergibt seinen Bewegungswunsch und sich selbst).
Nicht abgesichert bedeuetet in diesem Falle aber, dass der Agent jedoch auch einen x-beliebigen anderen Agenten übergeben könnte, für welche andere Bewegungsregeln gelten
(Konstruiertes Beispiel: Agent A ist eine Turmfigur beim Schach; A stellt eine Bewegungsanfrage, übergibt jedoch den Agenten B, der eine Springerfigur darstellt - somit könnte sich A die Bewegungsroutine von B erschleichen.
Man möchte jetzt vielleicht fragen, warum das ein Problem ist. (das war auch meine erste Überlegung) - immerhin sagt die Dokumentation der API ganz deutlich, was erwartet wird und auch was die Konsequenzen einer Falschangabe sind. Ein Designer, der bewusst diese Regeln verletzt, muss theoretisch auch mit den Konsequenzen leben. Aber nun gut: Es könnte ja auch ein fehlerhafte Aufruf besagter Methode sein, der somit unbemerkt bliebe.
Ich weiß auch nicht, warum die entsprechende Design-Entscheidung damals so getroffen wurde.
Meine Frage
Hat Jemand eine Idee für mich, wie dieser simple Aufruf abgesichert werden könnte?
Architekturtechnisch ist es so, dass die Methoden des ActionHandler public sind - also von jeder Implementierung eines Agenten aufgerufen werden könnten. Eine reine Zusammenfassung der Methode in einer abstrakten Oberklasse ist also hier nicht zielführend.
Aufgrund von möglichen Kompatibilitätsproblemen ist eine Anpassung der API des Handlers kritisch zu betrachten (gerade in Anbetracht der Tatsache, dass das Projekt ohnehin ersetzt werden soll)
Nun ist die Frage, ob ich irgendwie die Identität des Aufrufers sicher stellen bzw. überprüfen kann? (dem besagten Nutzer reicht es, wenn in diesem Fall z.B. eine Exception fliegt)
Alternativ: Gibt es eine Möglichkeit, den entsprechenden Methodenparameter quasi automatisch zu injecten? Also, dass man die Methode nur mit einem Parameter (der Bewegungsanfrage) aufruft und dann beispielswiese das aufrufende Objekt automatisch einsetzt?
Oder hat jemand vielleicht noch eine andere Idee, die ich jetzt gar nicht im Hinterkopf habe?
Ich wende mich heute mit einem vielleicht etwas abstrusen Problem an Euch.
Ich wurde heute mit einer Nutzeranfrage konfrontiert, die ein älteres System betrifft (das in Kürze ersetzt werden soll).
Zur Grundthematik
Es handelt sich um ein agentenbasiertes Simulationssystem, bei welchem die einzelnen aktiven Simulationsentitäten (Agenten) verschiedene Aktionen ausführen können. Hat sich ein Agent für eine Aktion (z.B. eine Bewegung) entschieden, so fragt er bei einem ActionHandler nach, ob diese Aktion ausgeführt werden kann. Dieser ActionHandler führt dann entweder diese Aktion aus oder lehnt sie ab. Der Agent wird darüber über eine Response informiert und kann bei Bedarf entsprechend darauf reagieren.
Zur Problematik
Besagter Nutzer hat nun beklagt, dass der Aufruf am ActionHandler nicht abgesichert sei. Gemäß API übernimmt die Methode die Bewegungsanfrage und eine Entität, die als Anfragesteller angenommen (!) wird (Sprich: Ein Agent übergibt seinen Bewegungswunsch und sich selbst).
Nicht abgesichert bedeuetet in diesem Falle aber, dass der Agent jedoch auch einen x-beliebigen anderen Agenten übergeben könnte, für welche andere Bewegungsregeln gelten
(Konstruiertes Beispiel: Agent A ist eine Turmfigur beim Schach; A stellt eine Bewegungsanfrage, übergibt jedoch den Agenten B, der eine Springerfigur darstellt - somit könnte sich A die Bewegungsroutine von B erschleichen.
Man möchte jetzt vielleicht fragen, warum das ein Problem ist. (das war auch meine erste Überlegung) - immerhin sagt die Dokumentation der API ganz deutlich, was erwartet wird und auch was die Konsequenzen einer Falschangabe sind. Ein Designer, der bewusst diese Regeln verletzt, muss theoretisch auch mit den Konsequenzen leben. Aber nun gut: Es könnte ja auch ein fehlerhafte Aufruf besagter Methode sein, der somit unbemerkt bliebe.
Ich weiß auch nicht, warum die entsprechende Design-Entscheidung damals so getroffen wurde.
Meine Frage
Hat Jemand eine Idee für mich, wie dieser simple Aufruf abgesichert werden könnte?
Architekturtechnisch ist es so, dass die Methoden des ActionHandler public sind - also von jeder Implementierung eines Agenten aufgerufen werden könnten. Eine reine Zusammenfassung der Methode in einer abstrakten Oberklasse ist also hier nicht zielführend.
Aufgrund von möglichen Kompatibilitätsproblemen ist eine Anpassung der API des Handlers kritisch zu betrachten (gerade in Anbetracht der Tatsache, dass das Projekt ohnehin ersetzt werden soll)
Nun ist die Frage, ob ich irgendwie die Identität des Aufrufers sicher stellen bzw. überprüfen kann? (dem besagten Nutzer reicht es, wenn in diesem Fall z.B. eine Exception fliegt)
Alternativ: Gibt es eine Möglichkeit, den entsprechenden Methodenparameter quasi automatisch zu injecten? Also, dass man die Methode nur mit einem Parameter (der Bewegungsanfrage) aufruft und dann beispielswiese das aufrufende Objekt automatisch einsetzt?
Oder hat jemand vielleicht noch eine andere Idee, die ich jetzt gar nicht im Hinterkopf habe?