]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/main/Signup.java
Add the "fast email check"
[gigi.git] / src / org / cacert / gigi / pages / main / Signup.java
1 package org.cacert.gigi.pages.main;
2
3 import java.io.IOException;
4 import java.io.InputStreamReader;
5 import java.io.PrintWriter;
6 import java.io.UnsupportedEncodingException;
7 import java.sql.PreparedStatement;
8 import java.sql.ResultSet;
9 import java.sql.SQLException;
10 import java.util.Date;
11 import java.util.HashMap;
12
13 import javax.servlet.ServletRequest;
14 import javax.servlet.http.HttpServletRequest;
15
16 import org.cacert.gigi.Language;
17 import org.cacert.gigi.User;
18 import org.cacert.gigi.database.DatabaseConnection;
19 import org.cacert.gigi.output.DateSelector;
20 import org.cacert.gigi.output.Template;
21 import org.cacert.gigi.pages.Page;
22 import org.cacert.gigi.util.EmailChecker;
23 import org.cacert.gigi.util.HTMLEncoder;
24
25 public class Signup {
26         User buildup = new User();
27         String password;
28         String password2;
29         Template t;
30         boolean general = true, country = true, regional = true, radius = true;
31         public Signup() {
32                 try {
33                         t = new Template(new InputStreamReader(
34                                         Signup.class.getResourceAsStream("Signup.templ"), "UTF-8"));
35                 } catch (UnsupportedEncodingException e) {
36                         e.printStackTrace();
37                 }
38                 buildup.setFname("");
39                 buildup.setMname("");
40                 buildup.setLname("");
41                 buildup.setSuffix("");
42                 buildup.setEmail("");
43                 buildup.setDob(new Date(0));
44         }
45         DateSelector myDoB = new DateSelector("day", "month", "year");
46
47         public void writeForm(PrintWriter out, Language l) {
48                 HashMap<String, Object> vars = new HashMap<String, Object>();
49                 vars.put("fname", HTMLEncoder.encodeHTML(buildup.getFname()));
50                 vars.put("mname", HTMLEncoder.encodeHTML(buildup.getMname()));
51                 vars.put("lname", HTMLEncoder.encodeHTML(buildup.getLname()));
52                 vars.put("suffix", HTMLEncoder.encodeHTML(buildup.getSuffix()));
53                 vars.put("dob", myDoB);
54                 vars.put("email", HTMLEncoder.encodeHTML(buildup.getEmail()));
55                 vars.put("general", general ? " checked=\"checked\"" : "");
56                 vars.put("country", country ? " checked=\"checked\"" : "");
57                 vars.put("regional", regional ? " checked=\"checked\"" : "");
58                 vars.put("radius", radius ? " checked=\"checked\"" : "");
59                 vars.put(
60                                 "helpOnNames",
61                                 String.format(
62                                                 l.getTranslation("Help on Names %sin the wiki%s"),
63                                                 "<a href=\"//wiki.cacert.org/FAQ/HowToEnterNamesInJoinForm\" target=\"_blank\">",
64                                                 "</a>"));
65                 t.output(out, l, vars);
66         }
67         private void update(HttpServletRequest r) {
68                 if (r.getParameter("fname") != null) {
69                         buildup.setFname(r.getParameter("fname"));
70                 }
71                 if (r.getParameter("lname") != null) {
72                         buildup.setLname(r.getParameter("lname"));
73                 }
74                 if (r.getParameter("mname") != null) {
75                         buildup.setMname(r.getParameter("mname"));
76                 }
77                 if (r.getParameter("suffix") != null) {
78                         buildup.setSuffix(r.getParameter("suffix"));
79                 }
80                 if (r.getParameter("email") != null) {
81                         buildup.setEmail(r.getParameter("email"));
82                 }
83                 general = "1".equals(r.getParameter("general"));
84                 country = "1".equals(r.getParameter("country"));
85                 regional = "1".equals(r.getParameter("regional"));
86                 radius = "1".equals(r.getParameter("radius"));
87                 myDoB.update(r);
88         }
89
90         public boolean submit(PrintWriter out, HttpServletRequest req) {
91                 update(req);
92                 boolean failed = false;
93                 out.println("<div class='formError'>");
94                 if (buildup.getFname().equals("") || buildup.getLname().equals("")) {
95                         outputError(out, req, "First and/or last names were blank.");
96                         failed = true;
97                 }
98                 if (!myDoB.isValid()) {
99                         outputError(out, req, "Invalid date of birth");
100                         failed = true;
101                 }
102                 if (!"1".equals(req.getParameter("cca_agree"))) {
103                         outputError(out, req,
104                                         "You have to agree to the CAcert Community agreement.");
105                         failed = true;
106                 }
107                 if (buildup.getEmail().equals("")) {
108                         outputError(out, req, "Email Address was blank");
109                         failed = true;
110                 }
111                 String pw1 = req.getParameter("pword1");
112                 String pw2 = req.getParameter("pword2");
113                 if (pw1 == null || pw1.equals("")) {
114                         outputError(out, req, "Pass Phrases were blank");
115                         failed = true;
116                 } else if (!pw1.equals(pw2)) {
117                         outputError(out, req, "Pass Phrases don't match");
118                         failed = true;
119                 }
120                 // TODO check password strength
121                 if (failed) {
122                         out.println("</div>");
123                         return false;
124                 }
125                 try {
126                         PreparedStatement q1 = DatabaseConnection.getInstance().prepare(
127                                         "select * from `email` where `email`=? and `deleted`=0");
128                         PreparedStatement q2 = DatabaseConnection.getInstance().prepare(
129                                         "select * from `users` where `email`=? and `deleted`=0");
130                         q1.setString(1, buildup.getEmail());
131                         q2.setString(1, buildup.getEmail());
132                         ResultSet r1 = q1.executeQuery();
133                         ResultSet r2 = q2.executeQuery();
134                         if (r1.next() || r2.next()) {
135                                 outputError(out, req,
136                                                 "This email address is currently valid in the system.");
137                                 failed = true;
138                         }
139                         r1.close();
140                         r2.close();
141                         PreparedStatement q3 = DatabaseConnection
142                                         .getInstance()
143                                         .prepare(
144                                                         "select `domain` from `baddomains` where `domain`=RIGHT(?, LENGTH(`domain`))");
145                         q3.setString(1, buildup.getEmail());
146
147                         ResultSet r3 = q3.executeQuery();
148                         if (r3.next()) {
149                                 String domain = r3.getString(1);
150                                 out.print("<div>");
151                                 out.print(String.format(
152                                                 Page.translate(req,
153                                                                 "We don't allow signups from people using email addresses from %s"),
154                                                 domain));
155                                 out.println("</div>");
156                                 failed = true;
157                         }
158                         r3.close();
159                 } catch (SQLException e) {
160                         e.printStackTrace();
161                         failed = true;
162                 }
163                 String mailResult = EmailChecker.FAIL;
164                 try {
165                         mailResult = EmailChecker.checkEmailServer(0, buildup.getEmail());
166                 } catch (IOException e) {
167                 }
168                 if (!mailResult.equals(EmailChecker.OK)) {
169                         if (mailResult.startsWith("4")) {
170                                 outputError(
171                                                 out,
172                                                 req,
173                                                 "The mail server responsible for your domain indicated"
174                                                                 + " a temporary failure. This may be due to anti-SPAM measures, such"
175                                                                 + " as greylisting. Please try again in a few minutes.");
176                         } else {
177                                 outputError(
178                                                 out,
179                                                 req,
180                                                 "Email Address given was invalid, or a test connection"
181                                                                 + " couldn't be made to your server, or the server"
182                                                                 + " rejected the email address as invalid");
183                         }
184                         if (mailResult.equals(EmailChecker.FAIL)) {
185                                 outputError(out, req,
186                                                 "Failed to make a connection to the mail server");
187                         } else {
188                                 out.print("<div>");
189                                 out.print(mailResult);
190                                 out.println("</div>");
191                         }
192                         failed = true;
193                 }
194
195                 out.println("</div>");
196                 if (failed) {
197                         return false;
198                 }
199                 // TODO start getting to work
200                 return true;
201         }
202         private void outputError(PrintWriter out, ServletRequest req, String text) {
203                 out.print("<div>");
204                 out.print(Page.translate(req, text));
205                 out.println("</div>");
206         }
207 }