/*
 * $Id: NewUserAction.java,v 1.45 2008/02/12 09:33:47 korowa Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: NewUserAction.java,v $
 * Revision 1.45  2008/02/12 09:33:47  korowa
 * Eine Möglichkeit für den Benutzer hinzugefügt die Emailsart auszuwählen(HTML oder Plaintext)
 *
 * Revision 1.44  2007/08/28 12:15:58  korowa
 * Export- und Importfunktionen hinzugefügt
 *
 * Revision 1.43  2006/10/04 03:14:59  marbobo
 * + Vollständige Unterstützung für Templates implementiert
 * + Alles von Virtoweb auf ProCoBa umgestellt
 *
 * Revision 1.42  2006/05/12 08:09:10  korowa
 * +showTree zum Userprofil hinzugefügt. Dieser parameter regelt die Anzeige des Explorerfensters beim VKC-Anmeldung. Lässt sich im Userprofil umschalten.
 *
 * Revision 1.41  2006/03/06 15:12:00  jonyp
 * + Bugfix (wg. Oracle)
 *
 * Revision 1.40  2006/02/27 16:16:21  marbobo
 * + Systemsichten hinzugefügt
 * + SysLinks angepasst
 * + Benutzer können falls gewünscht Dokumentqueries anlegen
 *
 * Revision 1.39  2005/12/15 15:28:51  marbobo
 * + Benutzername und Passwort für Mailserver implementiert
 *
 * Revision 1.38  2005/07/28 19:57:25  marbobo
 * + Template-Pfade angepasst
 *
 * Revision 1.37  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.36  2005/02/20 16:56:23  marbobo
 * + Beim Speichern der Entities in die Datenbank wird sichergestellt
 *    dass Unicode-Zeichen in Kodierterform (als &#xxxxx;) gespeichert werden
 *
 * Revision 1.35  2005/02/15 19:24:49  marbobo
 * + Unicode-Konforme E-Mails
 *
 * Revision 1.34  2005/02/14 14:01:46  bigmac
 * Applikationsweites CSS konfigurierbar gemacht + Refactorings
 *
 * Revision 1.33  2005/02/10 14:45:06  marbobo
 * + Unicode-Anzeige bei Emails
 *
 * Revision 1.32  2005/01/20 15:25:49  marbobo
 * + Anpassungen an den Methoden getRootURL() und getContextName()
 *
 * Revision 1.31  2004/12/05 19:28:56  marbobo
 * + Änderungen aufgrund des gelöschten VKCUser-Konstruktos
 *
 * Revision 1.30  2004/11/22 14:42:14  vchris
 * Standardwert für MessagingTimePeriod wird jetzt in VKCUser Object festgelegt
 *
 * Revision 1.29  2004/11/10 15:02:50  koppy
 * Projektweite Überarbeitung von Error-Logs, Stacktraces,..
 *
 * Revision 1.28  2004/10/24 22:50:57  marbobo
 * + In der Email Benutzerkonto-Status betreffende Informationen anzeigen
 *
 * Revision 1.27  2004/09/20 10:18:47  koppy
 * Mailgenerierung überarbeitet
 *
 * Revision 1.26  2004/09/16 13:10:55  marbobo
 * + Auf VKCRequestProcessor umgestellt
 *
 * Revision 1.25  2004/09/01 13:52:32  marbobo
 * + Menüsprache wählbar
 * + Redirectadresse angepasst
 *
 * Revision 1.24  2004/08/07 00:34:43  marbobo
 * + Bugfix für Zeitangaben und Refactorings
 *
 * Revision 1.23  2004/06/27 17:01:06  marbobo
 * + Quellcode maintenance
 *
 * Revision 1.22  2004/06/15 20:20:20  marbobo
 * Refactoring
 *
 * Revision 1.21  2004/05/28 10:43:33  teng
 * *** empty log message ***
 *
 * Revision 1.20  2004/03/11 20:17:14  bigmac
 * Anpassungen an VKCUserSerializer
 *
 * Revision 1.19  2004/03/09 18:40:36  bigmac
 * Anpassungen an VKCSysParameterSerializer
 *
 * Revision 1.18  2004/03/08 16:29:23  teng
 * MailUtils.java und MailImage.java werden in vkc.misc.mail geschoben
 *
 * Revision 1.17  2004/03/05 19:54:41  teng
 * vkc.misc.VKCMailTemplateParser wird durch vkc.misc.TemplateParser ersetzt
 *
 * Revision 1.16  2004/02/26 15:47:16  teng
 * Funktion MailUtils.sendSMTPMail(senderAddr, recepient, subject, asciiText, htmlText, null, null, images, smtpServer) ist geaendert. Parameter images enthaelt nun MailImage-Objekt statt String[]
 *
 * Revision 1.15  2004/01/28 13:22:04  marbobo
 * Standartquota 50MB
 *
 * Revision 1.14  2004/01/26 13:55:25  marbobo
 * +Benutzer- und Gruppenverwaltung für dedizierte Administratoren
 *
 * Revision 1.13  2004/01/12 17:16:35  teng
 * Alte VKCTemplateParser wird durch die Klasse VKCMailTemplateParser ersetzt.
 * VKCMailTemplateParser ist die Unterklasse der VKCTemplateParser und nur benutzt von Email-Benachrichtigung. 
 * VKCTemplateParser kann dann fuer allgemeinen Zweck genutzt werden.
 *
 * Revision 1.12  2003/12/16 11:27:19  bigmac
 * Formular auf request-scope umgebaut
 *
 * Revision 1.11  2003/12/11 16:29:35  teng
 * *** empty log message ***
 *
 * Revision 1.10  2003/12/11 16:15:08  teng
 * Mailing mit Bild zum neuen Templatedateien angepasst
 *
 * Revision 1.9  2003/11/28 15:03:42  jonyp
 * changes due to new schema
 *
 * Revision 1.8  2003/11/13 09:24:12  lawern
 * ShowEmail und MessagingEnabled per default auf true gesetzt.
 *
 * Revision 1.7  2003/10/23 12:57:48  marbobo
 * Mailing auf Templates umgestellt
 *
 * Revision 1.6  2003/10/06 09:56:26  marbobo
 * Bugfix
 *
 * Revision 1.5  2003/09/25 14:57:34  marbobo
 * +Benutzer gültig von bis verbessert
 *
 * Revision 1.4  2003/09/25 01:42:35  marbobo
 * +Benutzer gültig von bis
 *
 * Revision 1.3  2003/09/18 15:47:16  jonyp
 * changes from WebShare.properties to WebShare.getSysParameter
 *
 * Revision 1.2  2003/09/08 16:59:03  marbobo
 * *** empty log message ***
 *
 * Revision 1.1  2003/08/18 21:11:47  marbobo
 * Package verschoben
 *
 * Revision 1.1  2003/08/10 21:51:18  bigmac
 * *** empty log message ***
 *
 * Revision 1.32  2003/08/02 16:53:33  bigmac
 * *** empty log message ***
 *
 * Revision 1.31  2003/07/31 10:44:15  marbobo
 * text geändert
 *
 * Revision 1.30  2003/07/31 09:31:03  marbobo
 * Beim Passwort generieren wird der Benutzername mit einbezogen
 *
 * Revision 1.29  2003/07/31 00:31:02  marbobo
 * Benutzerkonte aktivieren im Userobjekt wird gesetzt
 *
 * Revision 1.28  2003/07/24 11:46:09  marbobo
 * BugFix
 *
 * Revision 1.25  2003/07/24 11:03:57  marbobo
 * +Kommentierung von Methoden und des Quellcodes
 * -unnötige Imports entfernt
 * +verschicken von Zugangsdaten beim Benutzeranlegen
 * bugfix in MD5-Passwörter vergleich
 *
 */
package vkc.administration.action;

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

import javax.servlet.ServletException;
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.administration.form.NewUserForm;
import vkc.db.entities.VKCUser;
import vkc.db.serializer.VKCLanguageSerializer;
import vkc.db.serializer.VKCSysParameterSerializer;
import vkc.db.serializer.VKCUserSerializer;
import vkc.misc.MailUtils;
import vkc.misc.TemplateParser;
import vkc.misc.VKCLogManager;
import vkc.util.DateUtils;
import vkc.util.ServletUtils;
import vkc.util.StringUtils;
import vkc.util.VKCCoder;
import vkc.util.VKCStringUtils;
import vkc.view.WebShare;
import vkc.view.bean.ResourceInfo;


public final class NewUserAction extends Action {
	private ActionForward DEFAULT_FORWARD = new ActionForward("/templates/${template.name}/administration/newUser.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 ServletException {
        NewUserForm form = (NewUserForm)f;

        VKCUser user = form.getUser();
        
        if (!user.hasAdminPrivileges() && !user.getManageOwnUsers()) {
            request.setAttribute(WebShare.INFO_KEY, "vkc.info.access_denied");
            
            return INFO_FORWARD;
        }

		if (request.getParameter("action.create.user") != null) {
			return handleCreateAction(form, request);
		} else if (request.getParameter("action.back") != null) {
			return handleBackAction(form, request);
		}
		
		return DEFAULT_FORWARD;
    }
    
    private ActionForward handleBackAction(NewUserForm form, HttpServletRequest request) {
		// TODO Auto-generated method stub
		return new ActionForward("/templates/${template.name}/administration/userList.jsp");
	}

	private ActionForward handleCreateAction(NewUserForm form, HttpServletRequest request) throws ServletException {
		try{
			VKCUser user = form.getUser();
			
			// 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.setShowTree(false);
			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.setAllowManageSystemViewType(form.isAllowManageSystemViewType());
			newUser.setSystemViewTypeId(form.getSelectedSystemViewTypeId());
	        newUser.setAccountValid(form.isAccountActive());
	
			if (newUser.getAccountValid()) {
				String from = form.getValidFrom();
				String until = form.getValidUntil();
	
				if (!StringUtils.isEmpty(from)) {
					Date d = DateUtils.parseDate(from);
					newUser.setValidFrom(new Timestamp(d.getTime()));
				} else {
				    newUser.setValidFrom(null);
				}
	
				if (!StringUtils.isEmpty(until)) {
					Date d = DateUtils.parseDate(until);
					Calendar c = Calendar.getInstance();
					c.setTime(d);
					c.set(Calendar.HOUR_OF_DAY, 23);
					c.set(Calendar.MINUTE, 59);
					c.set(Calendar.SECOND, 59);
					newUser.setValidUntil(new Timestamp(c.getTimeInMillis()));
				} else {
				    newUser.setValidUntil(null);
				}
			} else {
				newUser.setValidFrom(null);
				newUser.setValidUntil(null);
			}
	
			newUser.setCreatorId(user.getUserId());
			newUser.setLastChangerId(user.getUserId());
			newUser.setPasswordChanged(false);
	        newUser.setLanguage(VKCLanguageSerializer.getLanguage(form.getSelectedLanguageId()));
	
			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 failes: " + e.getMessage(), 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);
			request.setAttribute(WebShare.INFO_KEY, "vkc.administration.newuser.created");
			
			return new ActionForward("/editUser.do?initialize=true&userId=" + newUser.getUserId(), false);
		} catch(Exception ex) {
			throw new ServletException(ex);
		}
    }
}