/*
 * $Id: UserPasswordChangeForm.java,v 1.6 2006/09/17 21:19:01 marbobo Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: UserPasswordChangeForm.java,v $
 * Revision 1.6  2006/09/17 21:19:01  marbobo
 * + virtowebView-Einträge und Methoden wegen Migration entfernt (nicht mehr nötig)
 *
 * Revision 1.5  2004/11/10 15:02:53  koppy
 * Projektweite Überarbeitung von Error-Logs, Stacktraces,..
 *
 * Revision 1.4  2004/11/02 21:42:31  marbobo
 * + Einige Funktionen für Gast-Benutzer gesperrt
 * + WebShare.LOGIN_PAGE mit WebShare.getLoginPage() ersetzt
 *
 * Revision 1.3  2004/08/08 15:16:00  marbobo
 * + Refactorings und Behandlung von Fehlermeldungen
 *
 * Revision 1.2  2004/04/26 10:44:41  marbobo
 * + Unterstützung für Virtoweb-Sicht eingebaut
 *
 * Revision 1.1  2004/03/25 13:57:06  marbobo
 * ModifyUserPasswordAction und Form umbenannt und komplett überarbeitet
 *
 * Revision 1.3  2003/12/24 10:12:10  bigmac
 * Projektweite Import-Optimierung
 *
 * Revision 1.2  2003/08/22 14:14:20  marbobo
 * Resourcennamen angepasst
 *
 * Revision 1.1  2003/08/18 21:12:16  marbobo
 * Package verschoben
 *
 * Revision 1.1  2003/08/07 10:38:24  marbobo
 * Initial Version
 *
 */

package vkc.profile.form;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.servlet.http.HttpServletRequest;

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

import vkc.misc.VKCLogManager;
import vkc.util.StringUtils;
import vkc.util.VKCCoder;
import vkc.view.form.BasicActionForm;

/**
 * Form bean zum Ändern des Benutzerpassworts
 *
 * @author marbobo
 */
public final class UserPasswordChangeForm extends BasicActionForm {
	private boolean passwordChanged = false;

	private String newpassword = "";
	private String oldpassword = "";
	private String repassword = "";

	/**
	 * 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 ) {
		super.reset( mapping, request );
	    
	    passwordChanged = false;

		newpassword = "";
		oldpassword = "";
		repassword = "";
	}

	/**
	 * 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();
        
		//Passwort ändern
		if ( request.getParameter( "action.change.user.password" ) != null ){
			if ( StringUtils.isEmpty( getOldpassword() ) ) {
				errors.add( "oldpassword.mismatch", new ActionError( "error.oldpassword.mismatch" ) );
			}
        
			if ( getNewpassword().length() < 6 || getRepassword().length() < 6 ) {
				errors.add( "shortpassword", new ActionError( "vkc.profile.error.password.tooshort" ) );
			}

			if ( !getNewpassword().equals( getRepassword() ) ) {
				errors.add( "mismatchpassword", new ActionError("vkc.profile.error.password.mismatch" ) );
			}
		
			String currentPassword = getUser().getPassword();
			
			if ( !StringUtils.isEmpty( currentPassword ) && !StringUtils.isEmpty( oldpassword ) ) {
				String userName = getUser().getUser();
				byte[] md5Bytes = null;

				try {
					md5Bytes = ( userName + oldpassword ).getBytes( "ISO-8859-1" );
				} catch ( UnsupportedEncodingException e ) {
				    VKCLogManager.errorLog(this, "", e.getMessage(), e);
				}
	
				MessageDigest digest = null;

				try {
					digest = MessageDigest.getInstance( "MD5" );
				} catch ( NoSuchAlgorithmException e1 ) {
				    VKCLogManager.errorLog(this, "", e1.getMessage(), e1);
				}

				digest.reset();
				digest.update( md5Bytes );
				byte[] fingerPrint = digest.digest();
				fingerPrint = VKCCoder.base64Encode( fingerPrint );
				String md5Password = null;
			
				try {
					md5Password = new String( fingerPrint, "ISO-8859-1" );
				} catch ( UnsupportedEncodingException e2 ) {
				    VKCLogManager.errorLog(this, "", e2.getMessage(), e2);
				}

				//Passwort stimmt nicht überein
				if ( !currentPassword.trim().equals( md5Password ) ) {
					errors.add( "oldpassword.mismatch", new ActionError( "error.oldpassword.mismatch" ) );
				}
			}
		}

		return errors;
	}

	public String getNewpassword() {
		return newpassword;
	}

	public String getOldpassword() {
		return oldpassword;
	}

	public String getRepassword() {
		return repassword;
	}

	public boolean isPasswordChanged() {
		return passwordChanged;
	}

	public void setNewpassword( String s ) {
		newpassword = StringUtils.normalize( s );
	}

	public void setOldpassword( String s ) {
		oldpassword = StringUtils.normalize( s );
	}

	public void setPasswordChanged( boolean b ) {
		passwordChanged = b;
	}

	public void setRepassword( String s ) {
		repassword = StringUtils.normalize( s );
	}
}