/*
 * $Id: LoginChangePasswordAction.java,v 1.36 2007/08/08 12:14:55 marbobo Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: LoginChangePasswordAction.java,v $
 * Revision 1.36  2007/08/08 12:14:55  marbobo
 * + License-Funktionalität komplett umgeschrieben
 * + Bugfix bzgl. Beschreibungsfelder von Entitäten
 * + Bugfix mailing
 *
 * Revision 1.35  2006/10/04 03:14:35  marbobo
 * + Vollständige Unterstützung für Templates implementiert
 * + Alles von Virtoweb auf ProCoBa umgestellt
 *
 * Revision 1.34  2006/04/29 18:39:45  marbobo
 * + Refactoriengs und eine Ausgaben vereinheitlicht
 *
 * Revision 1.33  2006/02/27 16:16:06  marbobo
 * + Systemsichten hinzugefügt
 * + SysLinks angepasst
 * + Benutzer können falls gewünscht Dokumentqueries anlegen
 *
 * Revision 1.32  2005/12/16 11:50:17  lawern
 * *** empty log message ***
 *
 * Revision 1.31  2005/10/03 17:34:20  marbobo
 * + Nur zur Projektsicht leiten wenn Projektmanagment aktiv ist
 *
 * Revision 1.30  2005/09/01 08:31:58  korowa
 * Es werden mehrere URL angeboten, welche direkten Zugriff auf Dateien
 *  und automatisches Anmelden als Gast erlauben.
 *
 * Revision 1.29  2005/03/16 15:48:47  jonyp
 * getLastnameLabel for user tracking infos
 *
 * Revision 1.28  2005/03/16 15:10:13  jonyp
 * *** empty log message ***
 *
 * Revision 1.27  2005/02/14 14:01:53  bigmac
 * Applikationsweites CSS konfigurierbar gemacht + Refactorings
 *
 * Revision 1.26  2004/10/28 19:44:00  marbobo
 * + Anpassung wegen Loginseite
 *
 * Revision 1.25  2004/09/05 19:17:28  marbobo
 * + Redirectanpassung ( Loginseite )
 * + Bugfix
 *
 * Revision 1.24  2004/08/08 01:40:49  marbobo
 * + Refactorings und Behandlung von Fehlermeldungen
 *
 * Revision 1.23  2004/08/02 12:37:25  marbobo
 * + Bugfix
 *
 * Revision 1.1  2003/08/04 13:54:54  marbobo
 * Initiale Version
 *
 */
package vkc.view.action;

import java.security.MessageDigest;
import java.sql.Timestamp;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import vkc.db.entities.VKCCategory;
import vkc.db.entities.VKCUser;
import vkc.db.serializer.VKCSysParameterSerializer;

import vkc.db.serializer.VKCUserSerializer;
import vkc.misc.VKCLogManager;
import vkc.util.VKCCoder;
import vkc.view.PageId;
import vkc.view.WebShare;
import vkc.view.bean.UserTrackingInfo;
import vkc.view.form.LoginChangePasswordForm;
import vkc.view.form.SysLinkForm;

/**
 * Action-Klasse zum Ändern des Passworts eines 
 * Benutzer-Objektes
 *
 * @author marbobo
 */
public final class LoginChangePasswordAction extends Action {
	private ActionForward DEFAULT_FORWARD =	new ActionForward("/templates/${template.name}/common/ChangePassword.jsp");

	/**
	 * Hier werden die entsprechenden Aktionen eingeleitet
	 */
	public ActionForward execute(ActionMapping mapping, 
	        					 ActionForm f,
	        					 HttpServletRequest request, 
	        					 HttpServletResponse response)
	throws Exception {
		LoginChangePasswordForm form = (LoginChangePasswordForm) f;
        VKCUser user = form.getUser();

        if (user == null) {
			return new ActionForward(WebShare.getLoginPage(), true);
        }

	    // Dispatches the Action
		if (request.getParameter("action.change.password") != null) {
			return handleChangePasswordAction(form, request);
		}

		if (request.getParameter("action.back") != null) {
			request.getSession().removeAttribute(Globals.ERROR_KEY);
			request.getSession().removeAttribute(WebShare.TEMP_USER_KEY);
			
			return new ActionForward(WebShare.getLoginPage(), false);
		}

		// Not Action
		return DEFAULT_FORWARD;
	}

	/**
	 * Diese Methode ändert das Passwort eines Benutzers
	 */
	public ActionForward handleChangePasswordAction(LoginChangePasswordForm form, HttpServletRequest request) throws Exception {
		LoginChangePasswordForm loginForm = form;
		VKCUser user = loginForm.getUser();

		String username = user.getUser();
		String newpassword = loginForm.getNewpassword().trim();
		byte[] md5Bytes = (username + newpassword).getBytes("ISO-8859-1");

		MessageDigest digest = MessageDigest.getInstance("MD5");
		digest.reset();
		digest.update(md5Bytes);
		byte[] fingerPrint = digest.digest();
		fingerPrint = VKCCoder.base64Encode(fingerPrint);
		String md5Password = new String(fingerPrint, "ISO-8859-1");
		user.setPassword(md5Password);
		user.setPasswordChanged(true);
		user.setPasswordChangedTs(new Timestamp(System.currentTimeMillis()));
        VKCUserSerializer.saveUser(user);

		HttpSession session = request.getSession();

 		//Zur aktuellen Nachrichtenseite weiterleiten
        if (VKCSysParameterSerializer.retrieveIntValue("NEWS", "EnableNews", 0) != 0) {
	        if (user.hasUnreadNews()) {
				request.getSession().removeAttribute(Globals.ERROR_KEY);
	            request.getSession().setAttribute(WebShare.TEMP_USER_KEY, user);
	            
	            return new ActionForward("/showRecentNewsFrameset.do", false);
	        }
        }

		// Session-Timeout setzen
        if (user.getSessionTimeout() != null && user.getSessionTimeout().intValue() != 0) {
            session.setMaxInactiveInterval(user.getSessionTimeout().intValue() * 60);
        }

        // Eingeloggten User in der Session speichern
        vkc.util.ServletUtils.removeSessionAttributes(session);
        Timestamp loginTime = new Timestamp(System.currentTimeMillis());
        user.setMostRecentLogin(loginTime);
        session.setAttribute(WebShare.USER_KEY, user);
        session.setAttribute(WebShare.LOCALE_KEY, user.getLanguage().getLocale());

        // Sprache wechseln
        setLocale(request, user.getLanguage().getLocale());

        String log = "User '" + user.getUser();
        log += "' logged in (" + "userId = " +  user.getUserId();
		log += ", session timeout = " + (session.getMaxInactiveInterval() / 60) + "min)";

        // track users login time
        VKCUserSerializer.saveMostRecentLogin(user.getUserId()); 

        VKCLogManager.infoLog(this, log);

        UserTrackingInfo bean = new UserTrackingInfo(user.getUserId(),
                                                     user.getLastnameLabel(), 
                									 request.getSession(), 
                									 request.getRemoteAddr(), 
                									 new Date(loginTime.getTime()));

        session.setAttribute(WebShare.USER_TRACKING_KEY, bean);
        session.setAttribute(WebShare.SYSTEMVIEWTYPEID_KEY, user.getSystemViewTypeId());

        //externer Linkaufruf
        if (loginForm.isSysLink()) {
            return new ActionForward(loginForm.getSysLink());
        }

        //Procoba-Start
        if (PageId.FUNCTIONAL_VIEW.equals(user.getSystemViewTypeId()) && VKCSysParameterSerializer.isProjectManagementEnabled()) {
			return new ActionForward(SysLinkForm.getProcobaFunctionalSysLink());
        }

		if (PageId.PROJECT_VIEW.equals(user.getSystemViewTypeId()) && VKCSysParameterSerializer.isProjectManagementEnabled()) {
			return new ActionForward(SysLinkForm.getProcobaProjectSysLink());
		} 

		//by default: startCategory is root
		Integer startCategoryId = new Integer(VKCCategory.ROOT_CATEGORY_ID); 
	    
		// if user has another take it...
		if (user.getHomeCategoryId() != null && user.getHomeCategoryId().intValue() > VKCCategory.ROOT_CATEGORY_ID) {
			startCategoryId = user.getHomeCategoryId();
		}
	
		return new ActionForward(SysLinkForm.getCategorySysLink(startCategoryId, SysLinkForm.LOGINTYPE_NORMAL_USER), true);
	}
}