From ea8c5d59246644bb306d56a9140101e428473715 Mon Sep 17 00:00:00 2001
From: Peter Hormanns <peter.hormanns@hostsharing.net>
Date: Fri, 01 Jul 2011 17:26:29 +0200
Subject: [PATCH] Paket-Anlegen begonnen

---
 /dev/null                                                   |   41 ------
 hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java     |   28 +---
 hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl |   73 ++++++++++++
 hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java   |   94 +++++++++++++++
 hsarback/lib/jpwgen-1.2.0.jar                               |    0 
 hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java          |   76 ++++++++++++
 hsarback/lib/commons-net2-2.0.jar                           |    0 
 hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java         |    1 
 8 files changed, 253 insertions(+), 60 deletions(-)

diff --git a/hsarback/lib/commons-net2-2.0.jar b/hsarback/lib/commons-net2-2.0.jar
new file mode 100644
index 0000000..b65bfb7
--- /dev/null
+++ b/hsarback/lib/commons-net2-2.0.jar
Binary files differ
diff --git a/hsarback/lib/jpwgen-1.2.0.jar b/hsarback/lib/jpwgen-1.2.0.jar
new file mode 100644
index 0000000..08dfd9b
--- /dev/null
+++ b/hsarback/lib/jpwgen-1.2.0.jar
Binary files differ
diff --git a/hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java b/hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java
index 5c636c4..3084c41 100644
--- a/hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java
+++ b/hsarback/src/de/hsadmin/core/qserv/MailerProcessor.java
@@ -1,15 +1,11 @@
 package de.hsadmin.core.qserv;
 
-import java.util.Properties;
-
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
+import de.hsadmin.core.model.HSAdminException;
+import de.hsadmin.core.util.Config;
 
 public class MailerProcessor extends AbstractProcessor {
 
-	private static final long serialVersionUID = -8900943664576420041L;
+	private static final long serialVersionUID = 1L;
 
 	private String aTo;
 	private String aSubject;
@@ -22,20 +18,14 @@
 	}
 
 	public Object process() throws ProcessorException {
-		Properties aProps = new Properties();
-		aProps.setProperty("mail.smtp.host", "localhost");
-
-		Session aSess = Session.getInstance(aProps);
-		MimeMessage aMsg = new MimeMessage(aSess);
 		try {
-			aMsg.setFrom(new InternetAddress("robot@hostsharing.net"));
-			aMsg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(aTo));
-			aMsg.setSubject(aSubject);
-			aMsg.setText(aBody);
-			MailerShell.send(aMsg);
+			Config config = Config.getInstance();
+			String aFrom = config.getProperty("hsadmin.smtp.from", "unconfigured_from@example.com");
+			String aCC = config.getProperty("hsadmin.smtp.cc", "unconfigured_cc@example.com");
+			SmtpHelper.send(aFrom, aTo, aCC, aSubject, aBody);
 			return null;
-		} catch (MessagingException aExc) {
-			throw new ProcessorException(aExc);
+		} catch (HSAdminException e) {
+			throw new ProcessorException(e);
 		}
 	}
 }
diff --git a/hsarback/src/de/hsadmin/core/qserv/MailerShell.java b/hsarback/src/de/hsadmin/core/qserv/MailerShell.java
deleted file mode 100644
index d036b6a..0000000
--- a/hsarback/src/de/hsadmin/core/qserv/MailerShell.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package de.hsadmin.core.qserv;
-
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
-
-public class MailerShell {
-	
-	private static boolean bExecute = true; // really execute or just store
-											// command and stdin?
-	private static MimeMessage aMessage; // stored message
-
-	/**
-	 * Set mode of real mailer or just storing the messages for testing
-	 * purposes.
-	 * 
-	 * @param bExec
-	 *            specifies whether messages are really send (true) or just
-	 *            stored (false)
-	 */
-	public static void setExecute(boolean bExec) {
-		bExecute = bExec;
-	}
-
-	/**
-	 * Returns and clears the last command which should have been executed.
-	 * 
-	 * @return Last command, plus "<<EOF\n" + stdin + "EOF" if stdin was given.
-	 */
-	public static MimeMessage popLastMessage() {
-		MimeMessage aLastMessage = aMessage;
-		aMessage = null;
-		return aLastMessage;
-	}
-
-	public static void send(MimeMessage aMsg) throws MessagingException {
-		if (bExecute)
-			javax.mail.Transport.send(aMsg);
-		aMessage = aMsg;
-	}
-
-}
diff --git a/hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java b/hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java
new file mode 100644
index 0000000..83ba6c3
--- /dev/null
+++ b/hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java
@@ -0,0 +1,76 @@
+package de.hsadmin.core.qserv;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.net.InetAddress;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+
+import org.apache.commons.net.smtp.SMTPClient;
+import org.apache.commons.net.smtp.SMTPReply;
+import org.apache.commons.net.smtp.SimpleSMTPHeader;
+
+import de.hsadmin.core.model.HSAdminException;
+import de.hsadmin.core.util.Config;
+
+public class SmtpHelper {
+
+	public static void send(String fromAddress, String toAddress, String subject, String text) 
+			throws HSAdminException {
+		send(fromAddress, toAddress, null, subject, text);
+	}
+	
+	public static void send(String fromAddress, String toAddress, String ccAddress, String subject, String text) 
+			throws HSAdminException {
+		try {
+			SMTPClient client = new SMTPClient();
+			String canonicalHostName = InetAddress.getLocalHost().getHostName();
+			String smtpHost = Config.getInstance().getProperty("smtp.host");
+			if ("unittest".equals(smtpHost)) { // Nur fuer Unit-Tests
+				if (subject.toLowerCase().contains("error")) {
+					throw new HSAdminException("Konnte Mail nicht senden");
+				}
+				System.out.println("------------------------");
+				System.out.println("From: " + fromAddress);
+				System.out.println("To: " + toAddress);
+				System.out.println("Subject: " + subject);
+				System.out.println("\n" + text);
+				return;
+			}
+			client.connect(smtpHost, 25);
+			int reply = client.getReplyCode();
+			if (!SMTPReply.isPositiveCompletion(reply)) {
+				throw new HSAdminException("Konnte Mail Server nicht erreichen");
+			}
+			client.login(canonicalHostName);
+			client.setSender(fromAddress.trim());
+			client.addRecipient(toAddress.trim());
+			if (ccAddress != null && ccAddress.trim().length() > 3) {
+				client.addRecipient(ccAddress.trim());
+			}
+			Writer sendMessageData = client.sendMessageData();
+			if (sendMessageData == null) {
+				throw new HSAdminException("Konnte Mail nicht senden (SMTP-Relay-Problem)");
+			}
+			PrintWriter wr = new PrintWriter(sendMessageData);
+			SimpleSMTPHeader header = new SimpleSMTPHeader(fromAddress, toAddress,
+					subject);
+			wr.write(header.toString());
+			wr.write(text);
+			wr.close();
+			if (!client.completePendingCommand()) {
+				throw new HSAdminException("Konnte Mail nicht senden");
+			}
+			client.logout();
+			client.disconnect();
+		} catch (UnknownHostException e) {
+			throw new HSAdminException(e);
+		} catch (SocketException e) {
+			throw new HSAdminException(e);
+		} catch (IOException e) {
+			throw new HSAdminException(e);
+		}
+	}
+
+}
diff --git a/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java b/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java
index 0eea9ea..f2d6064 100644
--- a/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java
+++ b/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java
@@ -96,6 +96,7 @@
 		Long maxUid = (Long) em.createQuery("SELECT MAX(u.userId) FROM UnixUsers u").getSingleResult();
 		if (maxUid >= nUID) nUID = maxUid + 1;
 		admin.setUserId(nUID);
+		users.add(admin);
 		return super.add(newEntity);
 	}
 
diff --git a/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java b/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java
new file mode 100644
index 0000000..ca4018e
--- /dev/null
+++ b/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java
@@ -0,0 +1,94 @@
+package de.hsadmin.mods.pac;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Random;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+
+import net.sf.jtpl.Template;
+import de.hsadmin.core.model.AbstractEntity;
+import de.hsadmin.core.qserv.CompoundProcessor;
+import de.hsadmin.core.qserv.EntityProcessorFactory;
+import de.hsadmin.core.qserv.MailerProcessor;
+import de.hsadmin.core.qserv.Processor;
+import de.hsadmin.core.qserv.ProcessorException;
+import de.hsadmin.core.qserv.ShellProcessor;
+import de.hsadmin.core.qserv.TemplateProcessor;
+import de.hsadmin.core.qserv.WaitingTasksProcessor;
+import de.hsadmin.mods.user.UnixUser;
+import de.rrze.jpwgen.flags.PwGeneratorFlagBuilder;
+import de.rrze.jpwgen.impl.PwGenerator;
+
+public class PacProcessorFactory implements EntityProcessorFactory {
+
+	private static PwGeneratorFlagBuilder flagBuilder = new PwGeneratorFlagBuilder();
+	private static Random random = new Random();
+	
+	static {
+		flagBuilder.setIncludeCapitals();
+		flagBuilder.setIncludeNumerals();
+//		flagBuilder.setIncludeReducedSymbols();
+		flagBuilder.setFilterAmbiguous();
+	}
+	
+	@Override
+	public <T extends AbstractEntity> Processor createCreateProcessor(
+			EntityManager em, T entity) throws ProcessorException {
+		Pac pac = (Pac) entity;
+		String inetAddr = pac.getCurINetAddr().getInetAddr();
+		String pacName = pac.getName();
+		String customerEMail = pac.getCustomer().getContractualContact().getEmail();
+		UnixUser unixUser = null;
+		Set<UnixUser> unixUserSet = pac.getUnixUser();
+		if (unixUserSet.size() == 1) {
+			unixUser = unixUserSet.iterator().next();
+		}
+		Processor hostsAppender = new ShellProcessor("echo '" + inetAddr + "  " + pacName +".hostsharing.net  " + pacName + "\n' >>/etc/hosts");
+		Processor interfacesAppender = new ShellProcessor("echo 'auto eth0:" + pacName + "\n" +
+				"iface eth0:" + pacName + " inet static\n" +
+				"\taddress " + inetAddr + "\n" +
+				"\tnetmask 255.255.255.0\n\n' >>/etc/network/interfaces");
+		Processor sudoersAppender = new ShellProcessor("echo '" + pacName + " ALL = (%" + pacName + ") NOPASSWD: ALL\n' >> /etc/sudoers");
+		String password = PwGenerator.generatePassword(7, flagBuilder.build(), 100, random);
+		Processor newUsersProc = new ShellProcessor(
+				"newusers", pacName + ":" + password  + ":"
+						+ unixUser.getUserId() + ":" + unixUser.getPac().getName()
+						+ ":" + unixUser.getComment() + ":" + unixUser.getHomedir()
+						+ ":" + unixUser.getShell() + "\n");
+		try {
+			InputStream stream = TemplateProcessor.class.getClassLoader().getResourceAsStream("/de/hsadmin/mods/pac/email_new_pac_account.jtpl");
+			Template template = new Template(new InputStreamReader(stream));
+			template.assign("PAC", pacName);
+			template.assign("PASSWORD", password);
+			template.assign("CUST_EMAIL", customerEMail);
+			template.parse("main");
+			Processor emailPasswordProc = new WaitingTasksProcessor(
+					new MailerProcessor(
+							customerEMail, 
+							"Zugangsdaten des neue Hostsharing Pakets " + pacName, 
+							template.out())
+				);
+			return new CompoundProcessor(hostsAppender, interfacesAppender, sudoersAppender, newUsersProc, emailPasswordProc);
+		} catch (IllegalArgumentException e) {
+			throw new ProcessorException(e);
+		} catch (IOException e) {
+			throw new ProcessorException(e);
+		}
+	}
+
+	@Override
+	public <T extends AbstractEntity> Processor createUpdateProcessor(
+			EntityManager em, T newEntity) throws ProcessorException {
+		throw new ProcessorException("pac.update not implemented");
+	}
+
+	@Override
+	public <T extends AbstractEntity> Processor createDeleteProcessor(
+			EntityManager em, T entity) throws ProcessorException {
+		throw new ProcessorException("pac.delete not implemented");
+	}
+
+}
diff --git a/hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl b/hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl
new file mode 100644
index 0000000..aca9c11
--- /dev/null
+++ b/hsarback/src/de/hsadmin/mods/pac/email_new_pac_account.jtpl
@@ -0,0 +1,73 @@
+<!-- BEGIN: main -->Das neue Hostsharing Paket {PAC} ist eingerichtet. Zugangsdaten:
+
+        Hostname (HTTP, FTP, SSH, POP3, IMAP):  {PAC}.hostsharing.net
+        Benutzernamen (Paket-Admin-Account):    {PAC}
+        Passwort:                               {PASSWORD}
+
+Wir bitten zu ber�cksichtigen, dass man mit diesem Passwort sehr viel
+Macht �ber das Paket hat, so ist damit z.B. die Bestellung von Domains
+m�glich. Bitte daher die u.g. Sicherheitshinweise beachten und den
+Paketadmin-Account {PAC} nicht mit unsicheren (unverschl�sselten)
+Protokollen wie POP3 oder FTP ohne TLS verwenden!
+
+E-Mail-Benachrichtigungen f�r den Paket-Admin gehen direkt an den
+o.g. Account. �ber den E-Mail-Alias {PAC} k�nnen diese E-Mails
+an externe E-Mail-Adressen weitergeleitet werden. Initial ist
+eine Weiterleitung an {CUST_EMAIL} eingetragen.
+
+Wir empfehlen, Domains nicht unter dem Paketadmin {PAC} sondern z.B.
+unter einem User "{PAC}-doms" anzulegen, um die Paket- und Domain-
+Verwaltung zu trennen. Dies gilt insbesondere, wenn die Domain-Inhalte
+per FTP gepflegt werden sollen.
+
+Weitere Accounts (neben dem Paketadmin-Account {PAC}) k�nnen nach einem
+Login per SSH mit dem Kommandozeilen-Programm hsadmin eingerichtet
+werden (in K�rze auch per Web-Client). Dokumentation finden Sie unter:
+
+        <http://www.hostsharing.net/dokumentation.html>
+
+Der Webspace des Paketes ist theoretisch ab sofort unter
+<http://{PAC}.hostsharing.net/> erreichbar, allerdings kann es durch
+DNS-Caches Verz�gerungen geben. Das DocumentRoot ist ~{PAC}/web, wobei
+~{PAC}/cgi als /cgi-bin in den Webspace eingeblendet wird. In SW Paketen
+darf dieses CGI auch nur f�r administrative Zwecke verwendet werden.
+
+Die vorgenannte Paket-Subdomain ist jedoch eher zum Testen und Ausprobieren
+gedacht und hat mit dem folgenden Domain-Webspace nichts zu tun, der wird
+unter ~{PAC}/doms/ angelegt, sobald eine Domain aufgeschaltet wird. Dort gibt
+es dann f�r jede Domain ein separates Verzeichnis.
+
+Das Verfahren zum Bestellen von Domains ist auf unserer Website unter
+http://www.hostsharing.net/dokumentation/einstieg-bei-hostsharing/domain-bestellen.html
+beschrieben. Ein Web-Interface hierf�r ist in Entwicklung.
+
+Bei evtl. auftretenden Problemen mit dem Server bitte zun�chst auf
+unserer Status-Website <http://status.hostsharing.net/> nachsehen,
+insbesondere auch auf der dortigen Seite "Aktionen", ob die Hostmaster
+bereits aktiv sind. Falls nicht, k�nnen die Hostmaster bei dringenden
+Problemen �ber die Rufnummer +49 40 209331331 erreicht werden.
+Bitte ggf. lange klingeln lassen, aber nicht mehr anrufen,
+wenn die Hostmaster laut Status-Seite "Aktionen" bereits dabei sind,
+das Problem zu beheben, da dies die Arbeiten dann nur verz�gern w�rde.
+Auch ist diese Rufnummer keine Support-Rufnummer, telefonische
+Support-Anfragen k�nnen grunds�tzlich nicht beantwortet werden.
+
+Weitere Fragen beantworten wir gerne per E-Mail, am liebsten auf der
+passenden �ffentlichen Mailingliste (in den meisten F�llen wohl
+support@). Einen �beblick �ber unsere Mailinglisten bietet die Website:
+http://www.hostsharing.net/forum/mailinglisten.html
+
+Viel Erfolg mit dem neuen Paket bei Hostsharing!
+
+        die Hostsharing Hostmaster
+
+P.S. Diese E-Mail wurde automatisch erstellt und ist daher allgemein
+formuliert.
+
+-- 
+Hostsharing Service | http://www.hostsharing.net
+Telefon: +49 40 209331311 | Fax: +49 40 209331312
+Hostsharing eG | Glockengie�erwall 17 | D-20095 Hamburg
+Registergericht Hamburg, GnR 1007 | USt.-ID-Nr.: DE218602793
+vertretungsberechtigter Vorstand: Michael Hierweck, Uwe M�ller
+<!-- END: main -->
\ No newline at end of file

--
Gitblit v1.9.3