/*
 * Created on 02.02.2005
 */
package uebung05.aufgabe02;

import java.io.IOException;
import java.net.*;

import sun.misc.BASE64Encoder;

/**
 * Verbindet zu einer gegebenen URL und versucht, via "Basic Authentication Scheme"
 * Zugriff auf die Ressource zu bekommen. Hierfür werden sämtliche Permutation
 * vorgegebener Namen/Passworte durchgegangen
 * 
 * @author Tilman Walther
 */
public class AuthCheck {
	
	// die URL, auf die zugegriffen wird
	String resource = "http://www.inf.fu-berlin.de/inst/ag-nbi/lehre/0405/V_NP/geheim5/geheim.txt";
	
	// Namen / Passworte für die Login-Versuche
	final String[] nameDict = {"Alle", "Keiner", "Jeder"};
	final String[] passDict = {"gelb", "blau", "rot"};
	
	// Ein BASE64-Encoder zur Übermittlung des Logins
	BASE64Encoder encoder = new BASE64Encoder();
	
	public AuthCheck() throws IOException {
		
		// Verbindung herstellen
		System.out.println("Verbinde zu "+resource);
		URL page = new URL(resource);
		HttpURLConnection conn = (HttpURLConnection) page.openConnection();
		conn.connect();
		
		// prüfen, ob Authentifizierung verlangt wird
		if (conn.getResponseCode() == 401) {
			System.out.println("Realm: "+conn.getHeaderField("WWW-Authenticate")+"\n");
			
			// sämtliche Name-Passwort-Kombinationen durchprobieren
			for (int i = 0;i < nameDict.length; i++) {
				for (int j = 0; j < passDict.length; j++) {
					System.out.print("Login mit "+nameDict[i]+":"+passDict[j]+"... ");
					
					// Login-Daten für die Übermittlung codieren
					String login = encoder.encode((nameDict[i] + ":" + passDict[j]).getBytes());
					
					// Authentifizierung per "Basic Authentication Scheme"
					conn = (HttpURLConnection) page.openConnection();
					conn.setRequestProperty("Authorization", "Basic "+login);
					conn.connect();
					
					// Login erfolgreich?
					if (conn.getResponseCode() == 200) {
						System.out.println("erfolgreich!");
					}
					else {
						System.out.println("fehlgeschlagen");
					}
				}
			}
		}
		else {
			System.out.println("The resource is not available via 'Basic Authentication Scheme' ("+conn.getResponseCode()+").");
		}
	}
	
	public static void main(String[] args) throws IOException {
		new AuthCheck();
	}

}
