/*
 * $Id: RegisterNewUserAction.java,v 1.39 2008/02/12 09:33:58 korowa Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: RegisterNewUserAction.java,v $
 * Revision 1.39  2008/02/12 09:33:58  korowa
 * Eine Möglichkeit für den Benutzer hinzugefügt die Emailsart auszuwählen(HTML oder Plaintext)
 *
 * Revision 1.38  2006/10/04 03:14:32  marbobo
 * + Vollständige Unterstützung für Templates implementiert
 * + Alles von Virtoweb auf ProCoBa umgestellt
 *
 * Revision 1.37  2006/05/12 08:09:11  korowa
 * +showTree zum Userprofil hinzugefügt. Dieser parameter regelt die Anzeige des Explorerfensters beim VKC-Anmeldung. Lässt sich im Userprofil umschalten.
 *
 * Revision 1.36  2006/03/06 15:12:02  jonyp
 * + Bugfix (wg. Oracle)
 *
 * Revision 1.35  2005/12/15 15:28:52  marbobo
 * + Benutzername und Passwort für Mailserver implementiert
 *
 * Revision 1.34  2005/07/28 19:57:26  marbobo
 * + Template-Pfade angepasst
 *
 * Revision 1.33  2005/04/12 12:56:06  korowa
 * Neuer path für Velocity Engine gesetzt, Head.txt enthält jetzt die gemeinsame Eigenschaften
 * (header,css-Teil und importiertes Bild)die früher in jeder Mail- HTML-Datei  standen.
 *
 * Revision 1.32  2005/02/20 16:59:11  marbobo
 * + Beim Speichern der Entities in die Datenbank wird sichergestellt
 *    dass Unicode-Zeichen in Kodierterform (als &#xxxxx;) gespeichert werden
 *
 * Revision 1.31  2005/02/15 19:24:49  marbobo
 * + Unicode-Konforme E-Mails
 *
 * Revision 1.30  2005/02/14 14:01:53  bigmac
 * Applikationsweites CSS konfigurierbar gemacht + Refactorings
 *
 * Revision 1.29  2005/02/10 14:45:07  marbobo
 * + Unicode-Anzeige bei Emails
 *
 * Revision 1.28  2005/01/20 15:25:52  marbobo
 * + Anpassungen an den Methoden getRootURL() und getContextName()
 *
 * Revision 1.27  2004/12/05 19:28:56  marbobo
 * + Änderungen aufgrund des gelöschten VKCUser-Konstruktos
 *
 * Revision 1.26  2004/11/10 15:02:44  koppy
 * Projektweite Überarbeitung von Error-Logs, Stacktraces,..
 *
 * Revision 1.25  2004/10/28 19:44:00  marbobo
 * + Anpassung wegen Loginseite
 *
 * Revision 1.24  2004/10/24 22:50:57  marbobo
 * + In der Email Benutzerkonto-Status betreffende Informationen anzeigen
 *
 * Revision 1.23  2004/09/20 10:19:11  koppy
 * Mailgenerierung überarbeitet
 *
 * Revision 1.22  2004/08/08 01:40:49  marbobo
 * + Refactorings und Behandlung von Fehlermeldungen
 *
 * Revision 1.21  2004/07/26 13:31:41  marbobo
 * + Fehlermeldung korrigiert
 *
 * Revision 1.20  2004/07/26 01:28:46  marbobo
 * + Überprüfung des Systemparameters angepasst
 *
 * Revision 1.19  2004/06/15 20:21:32  marbobo
 * Refactoring
 *
 * Revision 1.1  2003/10/29 13:48:25  marbobo
 * Initiale Version
 *
 */
package vkc.view.action;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.util.HashMap;

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

import org.apache.commons.lang.RandomStringUtils;
import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import vkc.db.entities.VKCUser;
import vkc.db.serializer.VKCLanguageSerializer;
import vkc.db.serializer.VKCSysParameterSerializer;
import vkc.db.serializer.VKCUserSerializer;
import vkc.exception.DBException;
import vkc.misc.MailUtils;
import vkc.misc.TemplateParser;
import vkc.misc.VKCLogManager;
import vkc.util.DateUtils;
import vkc.util.ServletUtils;
import vkc.util.VKCCoder;
import vkc.util.VKCStringUtils;
import vkc.view.WebShare;
import vkc.view.bean.ResourceInfo;
import vkc.view.form.RegisterNewUserForm;


public final class RegisterNewUserAction extends Action {

	private ActionForward DEFAULT_FORWARD = 
		new ActionForward( "/templates/${template.name}/common/RegisterNewUser.jsp" );

	private ActionForward INFO_FORWARD = 
		new ActionForward( "/templates/${template.name}/common/InfoPage.jsp" );

    public ActionForward execute( ActionMapping mapping, 
    							  ActionForm f,
        						  HttpServletRequest request, 
        						  HttpServletResponse response )
    throws Exception {
        if ( VKCSysParameterSerializer.retrieveIntValue( "LOGIN", "EnableUserRegistration", 0 ) == 0 ) {
			request.setAttribute( WebShare.INFO_KEY, "vkc.info.action_not_allowed" );
            
			return INFO_FORWARD;
        }

        RegisterNewUserForm form = (RegisterNewUserForm) f;

        if ( request.getParameter( "action.back" ) != null ) {
			return new ActionForward( WebShare.getLoginPage(), true );
        } 

        if ( request.getParameter( "action.create.user" ) != null ) {
            return handleCreateNewUserAction( form, request );
        }

        return mapping.getInputForward();
    }

    private ActionForward handleCreateNewUserAction( RegisterNewUserForm form, HttpServletRequest request)
    throws DBException, 
       	   UnsupportedEncodingException, 
       	   NoSuchAlgorithmException {
        // Hole neue Benutzerdaten aus der Form
        String username = VKCStringUtils.filterUnicodeChars( form.getUsername() );
        String firstname = VKCStringUtils.filterUnicodeChars( form.getFirstname() );
        String lastname = VKCStringUtils.filterUnicodeChars( form.getLastname() );
        String email = form.getEmail();

        //zufälliges MD5-Passwort erzeugen
        String password = RandomStringUtils.randomAlphanumeric( 8 );
        byte[] md5Bytes = ( username + password ).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" );

        //Neuen Benutzer anlegen
		VKCUser newUser = new VKCUser();
		newUser.setEmail( email );
		newUser.setUser( username );
		newUser.setPassword( md5Password );
		newUser.setFirstname( firstname );
		newUser.setLastname( lastname );

        //restliche Benutzerdaten setzen
        newUser.setTitle( "" );
        newUser.setCompany( "" );
        newUser.setDepartment( "" );
        newUser.setCity( "" );
        newUser.setZip( "" );
        newUser.setStreet( "" );
        newUser.setPhone( "" );
        newUser.setFax( "" );
        newUser.setMobile( "" );
        newUser.setHomepageURL( "" );
        newUser.setContactURL( "" );
        newUser.setShowEmail( true );
        newUser.setMessagingEnabled( true );
        newUser.setMessagingTimePeriod( new Integer( "15" ) );
        newUser.setPasswordChanged( false );
        newUser.setAdminPrivileges( false );
        newUser.setManageOwnGroups( false );
		newUser.setManageOwnUsers( false );
		newUser.setManageOwnProxies( false );
        newUser.setCreated( new Timestamp( System.currentTimeMillis() ) );
        newUser.setLastChanged( new Timestamp( System.currentTimeMillis() ) );
        newUser.setAccountValid( true );
        newUser.setValidFrom( null );
        newUser.setValidUntil( null );
        newUser.setCreatorId( new Integer( 1 ) );
        newUser.setLastChangerId( new Integer( 1 ) );
        newUser.setLanguage( VKCLanguageSerializer.getLanguageByShortName( "de" ) );
        newUser.setShowTree(false);

        try {
            // Neuem Benutzer die Zugangsdaten zuschicken
			String senderAddr  = VKCSysParameterSerializer.retrieveValue( "MAIL", "AdminEmail", "" );
			String smtpServer  = VKCSysParameterSerializer.retrieveValue( "MAIL", "MailServer", "" );
			String smtpUsername  = VKCSysParameterSerializer.retrieveValue( "MAIL", "MailUsername", "" );
			String smtpPassword  = VKCSysParameterSerializer.retrieveValue( "MAIL", "MailPassword", "" );
			String vkc_rootURL = WebShare.getRootURL() + WebShare.getContextPath();
            String subject     = WebShare.resources.getMessage( newUser.getLanguage().getLocale(), "vkc.newuser" );
            String recepient   = VKCStringUtils.decodeXmlEntities( newUser.getEmail() );

			TemplateParser asciiTemplate = TemplateParser.getTemplateParser();
			TemplateParser htmlTemplate = TemplateParser.getTemplateParser();

			HashMap context = new HashMap();
			context.put("adminEmail", senderAddr );
			context.put("homepage", vkc_rootURL );
			context.put("newuser", newUser );
			context.put("fullname", VKCStringUtils.filterUnicodeChars( newUser.getFirstname() + " " + newUser.getLastname() ) );
			context.put("password", password );
			context.put("dateutils", new DateUtils() );
			context.put("resources", new ResourceInfo( WebShare.resources, newUser.getLanguage().getLocale() ) );
			context.put("vkcstringutils", new VKCStringUtils() );
			context.put("template", newUser.getTemplate().getName());
			
			asciiTemplate.setContextData( context );
			htmlTemplate.setContextData( context );
			String asciiPath = "templates/${template.name}/velocitytemplates/mail/newuser_notification.plain";
			String htmlPath = "templates/${template.name}/velocitytemplates/mail/newuser_notification.html";
			String asciiText = asciiTemplate.createString(ServletUtils.replacePathVars(asciiPath, newUser));
			String htmlText = htmlTemplate.createString(ServletUtils.replacePathVars(htmlPath, newUser));

			
				            
			MailUtils m = new MailUtils(newUser);
			if(newUser.isEnableHtmlNotification())m.sendSMTPMailWithVKCLogo( senderAddr, recepient, subject, asciiText, htmlText, null, null, smtpServer, smtpUsername, smtpPassword );
            else m.sendSMTPMail( senderAddr, recepient, subject, asciiText,null , null, null, smtpServer, smtpUsername, smtpPassword );
        } catch ( Exception e ) {
            VKCLogManager.errorLog( this, "1", " - email sending failed!", e);
            
            ActionErrors errors = new ActionErrors();
            errors.add( "mailmessage.failure", new ActionError( "vkc.administration.newuser.mailfailure" ) );
            request.setAttribute( Globals.ERROR_KEY, errors );
			
            return DEFAULT_FORWARD;
        }

        // Neuen Benutzer in die Datenbank speichern
        VKCUserSerializer.saveUser( newUser );
        newUser.setCreatorId( newUser.getUserId() );
        newUser.setLastChangerId( newUser.getUserId() );
        VKCUserSerializer.saveUser( newUser );

        request.setAttribute( WebShare.INFO_KEY, "login.newuser.created" );

        return DEFAULT_FORWARD;
    }
}