package test;

import java.io.FileInputStream;
import java.security.AccessController;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.servlet.http.Cookie;
import com.iplanet.am.util.SystemProperties;
import com.iplanet.sso.SSOToken;
import com.sun.identity.authentication.AuthContext;
import com.sun.identity.authentication.service.AuthUtils;
import com.sun.identity.authentication.spi.AuthLoginException;
import com.sun.identity.idm.AMIdentity;
import com.sun.identity.idm.AMIdentityRepository;
import com.sun.identity.idm.IdType;
import com.sun.identity.security.AdminTokenAction;

public class RemoteCreateUserTest {
	private static final String REALM_NAME = "test";

	public static void main(String[] args) throws Exception {
		Properties props = new Properties();
		props.load(new FileInputStream("/home/dave/opensso-client/AMConfig-client.properties"));
		SystemProperties.initializeProperties(props);

		SSOToken adminToken = (SSOToken)AccessController.doPrivileged(AdminTokenAction.getInstance());

		String userId = UUID.randomUUID().toString();
		String email = "dave@goodtech.co.uk";
		String pass = "foobar";
		AMIdentityRepository idRepo = new AMIdentityRepository(adminToken, REALM_NAME);
		Map attrs = new HashMap();
		attrs.put("sn", Collections.singleton("Holroyd"));
		attrs.put("givenname", Collections.singleton("David"));
		attrs.put("password", Collections.singleton(pass));
		attrs.put("mail", Collections.singleton(email));
		AMIdentity ident = idRepo.createIdentity(IdType.USER, userId, attrs);

		// now, log the user in,
		AuthUtils authUtils = new AuthUtils();
		AuthContext authContext = new AuthContext(REALM_NAME);
		login(authContext, email, pass);
		String cookieDomain = "localhost"; // TODO: configurable domain
		Cookie cookie = authUtils.getCookieString(authContext, cookieDomain);
		System.out.println("Set-Cookie: domain="+cookie.getDomain()+" path="+cookie.getPath()+" name="+cookie.getName()+" value="+cookie.getValue());
	}

	private static void login(AuthContext authContext, String name, String pass) throws AuthLoginException {
		authContext.login();
		Callback[] callbacks = authContext.getRequirements();
		for (int i = 0; i < callbacks.length; i++) {
			if (callbacks[i] instanceof NameCallback) {
				((NameCallback)callbacks[i]).setName(name);
			} else if (callbacks[i] instanceof PasswordCallback) {
				((PasswordCallback)callbacks[i]).setPassword(pass.toCharArray());
			}
		}
		authContext.submitRequirements(callbacks);
		if (authContext.getStatus() != AuthContext.Status.SUCCESS) {
			throw new RuntimeException("login failed: "+authContext.getErrorMessage());
		}
	}
}
