Ja, es ist in der Tat so, dass der Login-Dialog von Jameica selbst kommt. In Java kann man mittels "java.net.Authenticator.setDefault(<Authenticator>);" die Instanz eines Objektes vom Typ "java.net.Authenticator" hinterlegen, welches anschliessend innerhalb der Java-Instanz global immer dann zum Zug kommt, wenn mit den Java-Bordmitteln (also z.Bsp. per java.net.URLConnection) eine Verbindung aufgebaut wird, in welcher in irgend einer Form eine Authentifizierung noetig ist. Java nutzt diese Funktionalitaet offensichtlich auch fuer Proxies mit Authentifizierung. Das Setzen des Authenticators geschieht im de.willuhn.jameica.services.AuthenticateService. Dieser setzt einen Authenticator vom Typ "JameicaAuthenticator". Wenn dann ein Login noetig ist, wird dessen Methode "getPasswordAuthentication" aufgerufen.
Ich gehe daher mal davon aus, dass die von den Non-HBCI-Implementierungen ausgeloesten HTTP-Requests nicht ueber die Klassen aus java.net gehen sondern ueber irgendwas anderes. Apache HTTP-Client vielleicht?
In dem Fall muesste man evaluieren, in welcher Form dort ebenfalls eine Authentifizierung hinterlegt werden kann, die dann an den Jameica-Authenticator delegiert wird. In Apache HTTP-Client hat sich in den letzten Versionen die API hierfuer mehrfach geaendert.
@Sebastian: Nutzen deine Plugins intern Apache HTTP Client? Wenn ja, welche Version ist das?
Dann koennte man mal in der API-Doc dieser Version schauen, wie das da umzusetzen ist.
An die ggf. in Jameica gespeicherten Loginsdaten ranzukommen (insofern die Option "Login speichern" in dem Dialog aktiviert wurde), ist aber vermutlich nicht ganz trivial. Sie werden verschluesselt in einem Wallet gespeichert. Fuer den Zugriff darauf braeuchte man aber noch den korrekten Key. Der ist wie folgt zusammengesetzt: "<host>:<port>:<prompt>".
Im konkreten Fall ist das vermutlich "<proxyhost>:<proxyport>:null". Der Prompt (das ist der Hinweis-Text zum Login, der vom Server uebertragen wurde) muss null sein, weil er sonst im Logindialog mit angezeigt worden waere.
Man muesste also herausfinden, wie man in Apache HTTP Client an Host, Port und ggf. Prompt des Proxy-Servers rankommt, der da gerade die Authentifizierung anfordert. In den Code-Beispielen, die ich gefunden habe (
https://hc.apache.org/httpcomponents-cl ... ation.java) wird Host und Port bereits vorher angegeben. Das waere aber eine ziemlich unschoene Loesung, weil der User das dann vorher irgendwo hinterlegen muesste. Hinzu kommt, dass der Prompt dann auch immer noch nicht bekannt ist.
Ah, hier haben wir ein Beispiel fuer interaktive Authentifizierung:
http://svn.apache.org/viewvc/httpcompon ... iew=markup
Muesste dann also in etwa so erfolgen (ungetestet):
Code: Alles auswählen
private final static ScriptingAuth auth = new ScriptingAuth();
...
HttpClient client = new HttpClient();
client.getParams().setParameter(CredentialsProvider.PROVIDER, auth);
public class ScriptingAuth implements CredentialsProvider
{
private static Wallet wallet = null;
static
{
try
{
wallet = new Wallet(HttpAuthDialog.class);
}
catch (Exception e)
{
Logger.error("unable to create wallet, unable to reuse jameica logins",e);
}
}
public Credentials getCredentials(AuthScheme scheme, String host, int port, boolean proxy) throws CredentialsNotAvailableException
{
String prompt = null;
if (scheme instanceof RFC2617Scheme)
prompt = ((RFC2617Scheme) scheme).getRealm();
String walletKey = host + ":" + port + ":" + prompt;
Login login = (Login) wallet.get(walletKey);
if (login == null)
{
// Keine gespeicherten Login-Daten. User fragen
LoginDialog d = new LoginDialog(LoginDialog.POSITION_CENTER);
String text = "Bitte geben Sie Benutzername und Passwort ein für " + host + ":" + port;
if (prompt != null)
text += "\n" + prompt;
d.setText(text);
login = (Login) d.open();
}
return new UsernamePasswordCredentials(login.getUsername(),new String(login.getPassword());
}
}