X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Fclub%2Fwpia%2Fgigi%2Fpages%2Faccount%2Fdomain%2FPingConfigForm.java;fp=src%2Fclub%2Fwpia%2Fgigi%2Fpages%2Faccount%2Fdomain%2FPingConfigForm.java;h=95076a0df21664cb2a2307284603692063d0e144;hb=bccd4cc0dba0f89aa045b113bac46eb8cc1dab4e;hp=0000000000000000000000000000000000000000;hpb=c9ed09f0007fc2c813815be927a5a24b23dab83c;p=gigi.git diff --git a/src/club/wpia/gigi/pages/account/domain/PingConfigForm.java b/src/club/wpia/gigi/pages/account/domain/PingConfigForm.java new file mode 100644 index 00000000..95076a0d --- /dev/null +++ b/src/club/wpia/gigi/pages/account/domain/PingConfigForm.java @@ -0,0 +1,223 @@ +package club.wpia.gigi.pages.account.domain; + +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import club.wpia.gigi.Gigi; +import club.wpia.gigi.GigiApiException; +import club.wpia.gigi.dbObjects.Domain; +import club.wpia.gigi.dbObjects.DomainPingConfiguration; +import club.wpia.gigi.dbObjects.DomainPingType; +import club.wpia.gigi.localisation.Language; +import club.wpia.gigi.output.template.Form; +import club.wpia.gigi.output.template.IterableDataset; +import club.wpia.gigi.output.template.Template; +import club.wpia.gigi.ping.SSLPinger; +import club.wpia.gigi.util.RandomToken; +import club.wpia.gigi.util.SystemKeywords; + +public class PingConfigForm extends Form { + + public enum SSLType { + DIRECT, XMPP, XMPP_SERVER, SMTP, IMAP; + + @Override + public String toString() { + return super.toString().toLowerCase(); + } + } + + private Domain target; + + private String tokenName = RandomToken.generateToken(8); + + private String tokenValue = RandomToken.generateToken(16); + + private static final int MAX_SSL_TESTS = 4; + + public static final String[] AUTHORATIVE_EMAILS = new String[] { + "root", "hostmaster", "postmaster", "admin", "webmaster" + }; + + private int selectedMail = -1; + + private boolean doMail, doDNS, doHTTP, doSSL; + + private int[] ports = new int[MAX_SSL_TESTS]; + + private SSLType[] sslTypes = new SSLType[MAX_SSL_TESTS]; + + private static final Template t = new Template(PingConfigForm.class.getResource("PingConfigForm.templ")); + + public PingConfigForm(HttpServletRequest hsr, Domain target) throws GigiApiException { + super(hsr); + this.target = target; + if (target == null) { + return; + } + List configs = target.getConfiguredPings(); + int portpos = 0; + for (DomainPingConfiguration dpc : configs) { + switch (dpc.getType()) { + case EMAIL: + doMail = true; + for (int i = 0; i < AUTHORATIVE_EMAILS.length; i++) { + if (AUTHORATIVE_EMAILS[i].equals(dpc.getInfo())) { + selectedMail = i; + } + } + break; + case DNS: { + doDNS = true; + String[] parts = dpc.getInfo().split(":"); + tokenName = parts[0]; + tokenValue = parts[1]; + break; + } + case HTTP: { + doHTTP = true; + String[] parts = dpc.getInfo().split(":"); + tokenName = parts[0]; + tokenValue = parts[1]; + break; + } + case SSL: { + doSSL = true; + String[] parts = dpc.getInfo().split(":"); + tokenName = parts[0]; + tokenValue = parts[1]; + ports[portpos] = Integer.parseInt(parts[2]); + if (parts.length == 4) { + sslTypes[portpos] = SSLType.valueOf(parts[3].toUpperCase()); + } else { + sslTypes[portpos] = SSLType.DIRECT; + } + portpos++; + break; + } + } + } + } + + public void setTarget(Domain target) { + this.target = target; + } + + @Override + public SubmissionResult submit(HttpServletRequest req) throws GigiApiException { + target.clearPings(); + if (req.getParameter("emailType") != null && req.getParameter("email") != null) { + try { + String mail = AUTHORATIVE_EMAILS[Integer.parseInt(req.getParameter("email"))]; + target.addPing(DomainPingType.EMAIL, mail); + } catch (NumberFormatException e) { + throw new GigiApiException("A email address is required"); + } + } + if (req.getParameter("DNSType") != null) { + target.addPing(DomainPingType.DNS, tokenName + ":" + tokenValue); + } + if (req.getParameter("HTTPType") != null) { + target.addPing(DomainPingType.HTTP, tokenName + ":" + tokenValue); + } + if (req.getParameter("SSLType") != null) { + List types = Arrays.asList(SSLPinger.TYPES); + for (int i = 0; i < MAX_SSL_TESTS; i++) { + String type = req.getParameter("ssl-type-" + i); + String port = req.getParameter("ssl-port-" + i); + if (type == null || port == null || port.equals("")) { + continue; + } + int portInt = Integer.parseInt(port); + if ("direct".equals(type)) { + target.addPing(DomainPingType.SSL, tokenName + ":" + tokenValue + ":" + port); + } else if (types.contains(type)) { + target.addPing(DomainPingType.SSL, tokenName + ":" + tokenValue + ":" + portInt + ":" + type); + } + + } + } + Gigi.notifyPinger(null); + return new RedirectResult(req.getPathInfo()); + } + + @Override + protected void outputContent(PrintWriter out, Language l, Map vars) { + vars.put("notEmbedded", true); + outputEmbeddableContent(out, l, vars); + } + + protected void outputEmbeddableContent(PrintWriter out, Language l, Map vars) { + vars.put("httpPrefix", SystemKeywords.HTTP_CHALLENGE_PREFIX); + vars.put("dnsPrefix", SystemKeywords.DNS_PREFIX); + vars.put("tokenName", tokenName); + vars.put("tokenValue", tokenValue); + vars.put("authEmails", new IterableDataset() { + + int i = 0; + + @Override + public boolean next(Language l, Map vars) { + if (i >= AUTHORATIVE_EMAILS.length) { + return false; + } + vars.put("i", i); + vars.put("email", AUTHORATIVE_EMAILS[i]); + if (i == selectedMail) { + vars.put("checked", " checked=\"checked\""); + } else { + vars.put("checked", ""); + } + + i++; + return true; + } + }); + vars.put("mail", doMail ? " checked=\"checked\"" : ""); + vars.put("dns", doDNS ? " checked=\"checked\"" : ""); + vars.put("http", doHTTP ? " checked=\"checked\"" : ""); + vars.put("ssl", doSSL ? " checked=\"checked\"" : ""); + vars.put("ssl-services", new IterableDataset() { + + int counter = 0; + + @Override + public boolean next(Language l, Map vars) { + if (counter >= MAX_SSL_TESTS) { + return false; + } + vars.put("i", counter); + vars.put("port", ports[counter] == 0 ? "" : Integer.toString(ports[counter])); + final SSLType selectedType = sslTypes[counter]; + vars.put("ssl-types", new IterableDataset() { + + int i = 0; + + SSLType[] type = SSLType.values(); + + @Override + public boolean next(Language l, Map vars) { + if (i >= type.length) { + return false; + } + vars.put("name", type[i].toString()); + if (selectedType == type[i]) { + vars.put("selected", " selected=\"selected\""); + } else { + vars.put("selected", ""); + } + i++; + return true; + } + }); + counter++; + return true; + } + }); + t.output(out, l, vars); + } +}