1 package club.wpia.gigi.pages.account.domain;
3 import java.io.PrintWriter;
4 import java.util.Arrays;
8 import javax.servlet.http.HttpServletRequest;
10 import club.wpia.gigi.Gigi;
11 import club.wpia.gigi.GigiApiException;
12 import club.wpia.gigi.dbObjects.Domain;
13 import club.wpia.gigi.dbObjects.DomainPingConfiguration;
14 import club.wpia.gigi.dbObjects.DomainPingType;
15 import club.wpia.gigi.localisation.Language;
16 import club.wpia.gigi.output.template.Form;
17 import club.wpia.gigi.output.template.IterableDataset;
18 import club.wpia.gigi.output.template.Template;
19 import club.wpia.gigi.ping.SSLPinger;
20 import club.wpia.gigi.util.RandomToken;
21 import club.wpia.gigi.util.SystemKeywords;
23 public class PingConfigForm extends Form {
26 DIRECT, XMPP, XMPP_SERVER, SMTP, IMAP;
29 public String toString() {
30 return super.toString().toLowerCase();
34 private Domain target;
36 private String tokenName = RandomToken.generateToken(8);
38 private String tokenValue = RandomToken.generateToken(16);
40 private static final int MAX_SSL_TESTS = 4;
42 public static final String[] AUTHORATIVE_EMAILS = new String[] {
43 "root", "hostmaster", "postmaster", "admin", "webmaster"
46 private int selectedMail = -1;
48 private boolean doMail, doDNS, doHTTP, doSSL;
50 private int[] ports = new int[MAX_SSL_TESTS];
52 private SSLType[] sslTypes = new SSLType[MAX_SSL_TESTS];
54 private static final Template t = new Template(PingConfigForm.class.getResource("PingConfigForm.templ"));
56 public PingConfigForm(HttpServletRequest hsr, Domain target) throws GigiApiException {
62 List<DomainPingConfiguration> configs = target.getConfiguredPings();
64 for (DomainPingConfiguration dpc : configs) {
65 switch (dpc.getType()) {
68 for (int i = 0; i < AUTHORATIVE_EMAILS.length; i++) {
69 if (AUTHORATIVE_EMAILS[i].equals(dpc.getInfo())) {
76 String[] parts = dpc.getInfo().split(":");
78 tokenValue = parts[1];
83 String[] parts = dpc.getInfo().split(":");
85 tokenValue = parts[1];
90 String[] parts = dpc.getInfo().split(":");
92 tokenValue = parts[1];
93 ports[portpos] = Integer.parseInt(parts[2]);
94 if (parts.length == 4) {
95 sslTypes[portpos] = SSLType.valueOf(parts[3].toUpperCase());
97 sslTypes[portpos] = SSLType.DIRECT;
106 public void setTarget(Domain target) {
107 this.target = target;
111 public SubmissionResult submit(HttpServletRequest req) throws GigiApiException {
113 if (req.getParameter("emailType") != null && req.getParameter("email") != null) {
115 String mail = AUTHORATIVE_EMAILS[Integer.parseInt(req.getParameter("email"))];
116 target.addPing(DomainPingType.EMAIL, mail);
117 } catch (NumberFormatException e) {
118 throw new GigiApiException("A email address is required");
121 if (req.getParameter("DNSType") != null) {
122 target.addPing(DomainPingType.DNS, tokenName + ":" + tokenValue);
124 if (req.getParameter("HTTPType") != null) {
125 target.addPing(DomainPingType.HTTP, tokenName + ":" + tokenValue);
127 if (req.getParameter("SSLType") != null) {
128 List<String> types = Arrays.asList(SSLPinger.TYPES);
129 for (int i = 0; i < MAX_SSL_TESTS; i++) {
130 String type = req.getParameter("ssl-type-" + i);
131 String port = req.getParameter("ssl-port-" + i);
132 if (type == null || port == null || port.equals("")) {
135 int portInt = Integer.parseInt(port);
136 if ("direct".equals(type)) {
137 target.addPing(DomainPingType.SSL, tokenName + ":" + tokenValue + ":" + port);
138 } else if (types.contains(type)) {
139 target.addPing(DomainPingType.SSL, tokenName + ":" + tokenValue + ":" + portInt + ":" + type);
144 Gigi.notifyPinger(null);
145 return new RedirectResult(req.getPathInfo());
149 protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
150 vars.put("notEmbedded", true);
151 outputEmbeddableContent(out, l, vars);
154 protected void outputEmbeddableContent(PrintWriter out, Language l, Map<String, Object> vars) {
155 vars.put("httpPrefix", SystemKeywords.HTTP_CHALLENGE_PREFIX);
156 vars.put("dnsPrefix", SystemKeywords.DNS_PREFIX);
157 vars.put("tokenName", tokenName);
158 vars.put("tokenValue", tokenValue);
159 vars.put("authEmails", new IterableDataset() {
164 public boolean next(Language l, Map<String, Object> vars) {
165 if (i >= AUTHORATIVE_EMAILS.length) {
169 vars.put("email", AUTHORATIVE_EMAILS[i]);
170 if (i == selectedMail) {
171 vars.put("checked", " checked=\"checked\"");
173 vars.put("checked", "");
180 vars.put("mail", doMail ? " checked=\"checked\"" : "");
181 vars.put("dns", doDNS ? " checked=\"checked\"" : "");
182 vars.put("http", doHTTP ? " checked=\"checked\"" : "");
183 vars.put("ssl", doSSL ? " checked=\"checked\"" : "");
184 vars.put("ssl-services", new IterableDataset() {
189 public boolean next(Language l, Map<String, Object> vars) {
190 if (counter >= MAX_SSL_TESTS) {
193 vars.put("i", counter);
194 vars.put("port", ports[counter] == 0 ? "" : Integer.toString(ports[counter]));
195 final SSLType selectedType = sslTypes[counter];
196 vars.put("ssl-types", new IterableDataset() {
200 SSLType[] type = SSLType.values();
203 public boolean next(Language l, Map<String, Object> vars) {
204 if (i >= type.length) {
207 vars.put("name", type[i].toString());
208 if (selectedType == type[i]) {
209 vars.put("selected", " selected=\"selected\"");
211 vars.put("selected", "");
221 t.output(out, l, vars);