package com.netifera.platform.net.tools.auth; import java.io.IOException; import java.util.Iterator; import com.netifera.platform.api.iterables.IndexedIterable; import com.netifera.platform.api.probe.IProbe; import com.netifera.platform.api.tools.ITool; import com.netifera.platform.api.tools.IToolContext; import com.netifera.platform.api.tools.ToolException; import com.netifera.platform.net.internal.tools.auth.Activator; import com.netifera.platform.net.services.auth.AuthenticationListener; import com.netifera.platform.net.services.auth.CredentialsVerifier; import com.netifera.platform.net.services.credentials.Credential; public abstract class AuthenticationBruteforcer implements ITool, AuthenticationListener { private IndexedIterable<Credential> credentials; private Iterator<Credential> credentialsIterator; private CredentialsVerifier verifier; protected IToolContext context; protected long realm; protected abstract CredentialsVerifier createCredentialsVerifier(); public abstract IndexedIterable<Credential> defaultCredentials(); // public abstract boolean isAuthenticableWith(Credential credential); public void toolRun(IToolContext context) throws ToolException { this.context = context; // XXX hardcode local probe as realm IProbe probe = Activator.getInstance().getProbeManager().getLocalProbe(); realm = probe.getEntity().getId(); setupToolOptions(); context.setTotalWork(credentials.itemCount()); context.info("Trying "+credentials.itemCount()+" credentials..."); try { verifier = createCredentialsVerifier(); verifier.tryCredentials(credentialsIterator, this); } catch (IOException e) { context.exception("I/O Error", e); } catch (InterruptedException e) { context.warning("Interrupted"); Thread.currentThread().interrupt(); } finally { // verifier.close(); context.done(); } } @SuppressWarnings("unchecked") protected void setupToolOptions() { credentials = (IndexedIterable<Credential>) context.getConfiguration().get("credentials"); if (credentials == null) credentials = defaultCredentials(); credentialsIterator = credentials.iterator(); } public void authenticationError(Credential credential, Throwable e) { String msg = e.getLocalizedMessage(); if (msg == null) msg = e.getMessage(); if (msg == null) msg = e.toString(); context.debug("Retrying '"+credential+"' after error: "+msg); verifier.retryCredential(credential); } public void authenticationFailed(Credential credential) { context.debug("Invalid credential: "+credential); context.worked(1); } public void authenticationSucceeded(Credential credential) { context.info("Found valid credential: "+credential); context.worked(1); } }