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 Binary files /dev/null and b/hsarback/lib/commons-net2-2.0.jar 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 Binary files /dev/null and b/hsarback/lib/jpwgen-1.2.0.jar 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 class MailerProcessor extends AbstractProcessor { } 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 "< 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 @@ public class PacModuleImpl extends AbstractModuleImpl { 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 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 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 Processor createUpdateProcessor( + EntityManager em, T newEntity) throws ProcessorException { + throw new ProcessorException("pac.update not implemented"); + } + + @Override + public 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 @@ +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: + + + +Der Webspace des Paketes ist theoretisch ab sofort unter + 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 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 + \ No newline at end of file