/*
 * $Id: LoginForm.java,v 1.22 2007/08/09 14:38:54 marbobo Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: LoginForm.java,v $
 * Revision 1.22  2007/08/09 14:38:54  marbobo
 * - 2 falsch zugeordnete LDAP- Parameter entfernt
 * + Löschen und Aktivieren von Lizenzen hinzugefügt
 *
 * Revision 1.21  2006/11/11 18:20:45  marbobo
 * + Gast-User License-Anerkennung korrigiert
 *
 * Revision 1.20  2005/09/01 13:11:52  marbobo
 * + Einige Anpassung zur SysLink
 *
 * Revision 1.19  2004/11/01 15:56:31  vchris
 * + Erweiterung für LDAP Support:
 *   Verhalten der LDAP-Felder auf der Login.jsp angepasst
 *
 * Revision 1.18  2004/10/28 19:43:35  marbobo
 * + Ein bischen aufgeräumt
 * + Anpassung wegen Loginseite
 *
 * Revision 1.17  2004/10/28 17:45:50  marbobo
 * + kleiner Fix
 *
 * Revision 1.16  2004/10/28 14:16:03  marbobo
 * + kleine Anpassung
 *
 * Revision 1.15  2004/10/25 14:20:44  vchris
 * *** empty log message ***
 *
 * Revision 1.14  2004/10/22 15:29:21  jonyp
 * added support for ldap user
 *
 * Revision 1.13  2004/10/14 15:45:33  jonyp
 * added support for LDAP authentification
 *
 * Revision 1.12  2004/10/12 11:51:02  marbobo
 * + Externer-Linkaufruf-Unterstützung für Gast-Benutzer implementiert
 *
 * Revision 1.11  2004/06/27 17:39:28  marbobo
 * + Quellcode maintenance
 *
 * Revision 1.10  2004/03/30 20:33:44  marbobo
 * Externer-Link-Aufruf überarbeitet
 *
 * Revision 1.9  2004/03/09 18:40:36  bigmac
 * Anpassungen an VKCSysParameterSerializer
 *
 * Revision 1.8  2004/03/09 13:52:56  marbobo
 * jsp-Code von Login.jsp nach LoginForm verlagert
 *
 * Revision 1.7  2004/02/18 14:50:55  marbobo
 * /sysLink.do anpassung
 *
 * Revision 1.6  2003/11/11 11:55:31  teng
 * *** empty log message ***
 *
 * Revision 1.5  2003/08/04 13:54:02  marbobo
 * "Passwort ändern" vom "Login" getrennt
 *
 * Revision 1.4  2003/07/31 13:59:28  bigmac
 * Compilerwarnungen beseitigt
 *
 * Revision 1.3  2003/07/31 09:31:03  marbobo
 * Beim Passwort generieren wird der Benutzername mit einbezogen
 *
 * Revision 1.2  2003/07/31 00:41:09  marbobo
 * +Überprüftung ob der Benutzerkonto gültig ist
 * +Passwortändern-Dialog hinzugefügt
 *
 * Revision 1.1  2002/10/22 17:52:01  koppy
 * Initiale Version
 *
 */

package vkc.view.form;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

import vkc.db.serializer.VKCSysParameterSerializer;
import vkc.exception.DBException;
import vkc.util.StringUtils;

import vkc.ldap.db.serializer.VKCLdapServerSerializer;


/**
 * Form bean für die Login-Seite
 * <ul>
 * <li><b>password</b> - Passwort
 * <li><b>username</b> - Benutzername
 * </ul>
 *
 * @author koppy
 */

public final class LoginForm extends ActionForm {
    //private boolean useLdap = Integer.parseInt( WebShare.getSysParameterValue( "LDAP", "EnableLdapSupport", "0" ) ) != 0 ? true : false;
	// geändert: LDAP-Anmeldung standardmäßig deaktivieren. Vorhandenes VKC soll nicht beeinträchtigt werden
	private boolean useLdap = false;

    private HashMap ldapServers = null;

    private Integer selectedLdapServerId = null;

    private String username 		= "";
    private String password 		= "";
    private String linkType 		= null;
    private String loginType 		= null;
    private String objectId 		= null;
    private String agent			= "";
    private String ldapServerBaseDN = null;

    /**
     * Reset der Eingabefelder auf Defaultwerte
     *
     * @param mapping The mapping used to select this instance
     * @param request The servlet request we are processing
     */
    public void reset(ActionMapping mapping, HttpServletRequest request) {
    	if (request.getParameter("linkType") != null && request.getParameter("objectId") != null) {
    		linkType = request.getParameter("linkType");
    		objectId = request.getParameter("objectId");
    	} else {
    	    linkType 		= null;
    	    objectId 		= null;
    	}
    	
    	if (request.getParameter("loginType") != null) {
            loginType = request.getParameter("loginType");
    	} else {
            loginType = null;
    	}

        if (request.getHeader("user-agent") != null) {
            agent = request.getHeader("user-agent").toLowerCase();
        }
    	
    	selectedLdapServerId = null;
    }

    /**
     * Validierung der Eingabefelder
     *
     * @param mapping The mapping used to select this instance
     * @param request The servlet request we are processing
     */
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        
        if (request.getParameter("action.login") != null) { 
		    if (StringUtils.isEmpty(getUsername())) {
		        errors.add("username", new ActionError("error.username.required"));
		    }
		
		    if (StringUtils.isEmpty(getPassword())) {
		        errors.add("password", new ActionError("error.password.required"));
		    }
        }
        
        setUseLdap(request.getParameter("useLdap") != null); 
        
		return errors;
    }

	public String getPassword() {
		return password;
	}

	public String getUsername() {
		return username;
	}

	public void setPassword(String s) {
		password = StringUtils.normalize(s);
	}

	public void setUsername(String s) {
		username = StringUtils.normalize(s);
	}

	public String getLinkType() {
		return linkType;
	}

	public String getObjectId() {
		return objectId;
	}

	public void setLinkType(String s) {
		linkType = StringUtils.normalize(s);
	}

	public void setObjectId(String s) {
		objectId = StringUtils.normalize(s);
	}

	public String getAgent() {
		return agent;
	}

	public void setAgent(String s) {
		agent = StringUtils.normalize(s);
	}

	public String getSysLink() {
		return "/sysLink.do?linkType=" + getLinkType() + "&objectId=" + getObjectId() + (getLoginType() != null ? "&loginType=" + getLoginType() : "");
	}

	public boolean isEnableUserRegistration() throws DBException {
		String enableUserRegistration = VKCSysParameterSerializer.retrieveValue("LOGIN", "EnableUserRegistration");
		
		if (Integer.parseInt(enableUserRegistration ) == 1) {
			return true;
		} 

		return false;
	}

	public boolean isEnableGuestLogin() throws DBException {
		String enableGuestLogin = VKCSysParameterSerializer.retrieveValue("LOGIN", "EnableGuestLogin");
		
		if (Integer.parseInt(enableGuestLogin) == 1) {
			return true;
		} 

		return false;
	}

	public boolean isCompatibleBrowser() {	
		if (getAgent().indexOf("mozilla") >= 0) {
			// netscape or ms
			if ((getAgent().indexOf("mozilla/4") >= 0 && !(getAgent().indexOf("compatible") >= 0 && getAgent().indexOf("msie") >= 0)) || 
			    (getAgent().indexOf("mozilla/4") >= 0 && (getAgent().indexOf("compatible") == 0 && getAgent().indexOf("msie") == 0 ))) {
				// incompatible 
				return false;
			}
		}
		
		return true;
	}

	public boolean isSysLink() {	
		return getLinkType() != null && getObjectId() != null;
	}
	
	public HashMap getGuestLoginLinkParams() {
	    HashMap params = new HashMap();
	    
	    if (isSysLink()) {
	        params.put("linkType", getLinkType());
	        params.put("objectId", getObjectId());
	        
	        if (getLoginType() != null) {
		        params.put("loginType", getLoginType());
	        }
	    }
	    
	    return params;
	}
	
	public boolean getUseLdap() {
	    return useLdap;
	}

    public void setUseLdap(boolean b) {
        useLdap = b;
    }
	
    public HashMap getLdapServers() throws DBException {
        if (ldapServers == null) {
    	    ldapServers = VKCLdapServerSerializer.getAllActiveLdapServers();           
        }
        
        return ldapServers;
    }
    
	public List getLdapServerList() throws DBException {    
	    return new ArrayList(getLdapServers().values());
	}

	public Integer getSelectedLdapServerId() {
        return selectedLdapServerId;
    }

	public void setSelectedLdapServerId(Integer ldapServerId) {
        selectedLdapServerId = ldapServerId;
    }

	public String getLdapServerBaseDN() {
        return ldapServerBaseDN;
    }

	public void setLdapServerBaseDN(String ldapServerBaseDN) {
        this.ldapServerBaseDN = ldapServerBaseDN;
    }

	public String getLoginType() {
		return loginType;
	}

	public void setLoginType(String loginType) {
		this.loginType = loginType;
	}
}