]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/main/Signup.java
Factor Out sendmail (Abstraction for Email provider)
[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.email.EmailChecker;
20 import org.cacert.gigi.email.EmailProvider;
21 import org.cacert.gigi.output.DateSelector;
22 import org.cacert.gigi.output.Template;
23 import org.cacert.gigi.pages.Page;
24 import org.cacert.gigi.util.HTMLEncoder;
25 import org.cacert.gigi.util.Notary;
26 import org.cacert.gigi.util.PasswordStrengthChecker;
27 import org.cacert.gigi.util.RandomToken;
28 import org.cacert.gigi.util.ServerConstants;
29
30 public class Signup {
31         User buildup = new User();
32         Template t;
33         boolean general = true, country = true, regional = true, radius = true;
34         public Signup() {
35                 try {
36                         t = new Template(new InputStreamReader(
37                                         Signup.class.getResourceAsStream("Signup.templ"), "UTF-8"));
38                 } catch (UnsupportedEncodingException e) {
39                         e.printStackTrace();
40                 }
41                 buildup.setFname("");
42                 buildup.setMname("");
43                 buildup.setLname("");
44                 buildup.setSuffix("");
45                 buildup.setEmail("");
46                 buildup.setDob(new Date(0));
47         }
48         DateSelector myDoB = new DateSelector("day", "month", "year");
49
50         public void writeForm(PrintWriter out, Language l) {
51                 HashMap<String, Object> vars = new HashMap<String, Object>();
52                 vars.put("fname", HTMLEncoder.encodeHTML(buildup.getFname()));
53                 vars.put("mname", HTMLEncoder.encodeHTML(buildup.getMname()));
54                 vars.put("lname", HTMLEncoder.encodeHTML(buildup.getLname()));
55                 vars.put("suffix", HTMLEncoder.encodeHTML(buildup.getSuffix()));
56                 vars.put("dob", myDoB);
57                 vars.put("email", HTMLEncoder.encodeHTML(buildup.getEmail()));
58                 vars.put("general", general ? " checked=\"checked\"" : "");
59                 vars.put("country", country ? " checked=\"checked\"" : "");
60                 vars.put("regional", regional ? " checked=\"checked\"" : "");
61                 vars.put("radius", radius ? " checked=\"checked\"" : "");
62                 vars.put(
63                                 "helpOnNames",
64                                 String.format(
65                                                 l.getTranslation("Help on Names %sin the wiki%s"),
66                                                 "<a href=\"//wiki.cacert.org/FAQ/HowToEnterNamesInJoinForm\" target=\"_blank\">",
67                                                 "</a>"));
68                 t.output(out, l, vars);
69         }
70         private void update(HttpServletRequest r) {
71                 if (r.getParameter("fname") != null) {
72                         buildup.setFname(r.getParameter("fname"));
73                 }
74                 if (r.getParameter("lname") != null) {
75                         buildup.setLname(r.getParameter("lname"));
76                 }
77                 if (r.getParameter("mname") != null) {
78                         buildup.setMname(r.getParameter("mname"));
79                 }
80                 if (r.getParameter("suffix") != null) {
81                         buildup.setSuffix(r.getParameter("suffix"));
82                 }
83                 if (r.getParameter("email") != null) {
84                         buildup.setEmail(r.getParameter("email"));
85                 }
86                 general = "1".equals(r.getParameter("general"));
87                 country = "1".equals(r.getParameter("country"));
88                 regional = "1".equals(r.getParameter("regional"));
89                 radius = "1".equals(r.getParameter("radius"));
90                 myDoB.update(r);
91         }
92
93         public synchronized boolean submit(PrintWriter out, HttpServletRequest req) {
94                 update(req);
95                 boolean failed = false;
96                 out.println("<div class='formError'>");
97                 if (buildup.getFname().equals("") || buildup.getLname().equals("")) {
98                         outputError(out, req, "First and/or last names were blank.");
99                         failed = true;
100                 }
101                 if (!myDoB.isValid()) {
102                         outputError(out, req, "Invalid date of birth");
103                         failed = true;
104                 }
105                 if (!"1".equals(req.getParameter("cca_agree"))) {
106                         outputError(out, req,
107                                         "You have to agree to the CAcert Community agreement.");
108                         failed = true;
109                 }
110                 if (buildup.getEmail().equals("")) {
111                         outputError(out, req, "Email Address was blank");
112                         failed = true;
113                 }
114                 String pw1 = req.getParameter("pword1");
115                 String pw2 = req.getParameter("pword2");
116                 if (pw1 == null || pw1.equals("")) {
117                         outputError(out, req, "Pass Phrases were blank");
118                         failed = true;
119                 } else if (!pw1.equals(pw2)) {
120                         outputError(out, req, "Pass Phrases don't match");
121                         failed = true;
122                 }
123                 int pwpoints = PasswordStrengthChecker.checkpw(pw1, buildup);
124                 if (pwpoints < 3) {
125                         outputError(
126                                         out,
127                                         req,
128                                         "The Pass Phrase you submitted failed to contain enough"
129                                                         + " differing characters and/or contained words from"
130                                                         + " your name and/or email address.");
131                         failed = true;
132                 }
133                 if (failed) {
134                         out.println("</div>");
135                         return false;
136                 }
137                 try {
138                         PreparedStatement q1 = DatabaseConnection.getInstance().prepare(
139                                         "select * from `email` where `email`=? and `deleted`=0");
140                         PreparedStatement q2 = DatabaseConnection.getInstance().prepare(
141                                         "select * from `users` where `email`=? and `deleted`=0");
142                         q1.setString(1, buildup.getEmail());
143                         q2.setString(1, buildup.getEmail());
144                         ResultSet r1 = q1.executeQuery();
145                         ResultSet r2 = q2.executeQuery();
146                         if (r1.next() || r2.next()) {
147                                 outputError(out, req,
148                                                 "This email address is currently valid in the system.");
149                                 failed = true;
150                         }
151                         r1.close();
152                         r2.close();
153                         PreparedStatement q3 = DatabaseConnection
154                                         .getInstance()
155                                         .prepare(
156                                                         "select `domain` from `baddomains` where `domain`=RIGHT(?, LENGTH(`domain`))");
157                         q3.setString(1, buildup.getEmail());
158
159                         ResultSet r3 = q3.executeQuery();
160                         if (r3.next()) {
161                                 String domain = r3.getString(1);
162                                 out.print("<div>");
163                                 out.print(String.format(
164                                                 Page.translate(req,
165                                                                 "We don't allow signups from people using email addresses from %s"),
166                                                 domain));
167                                 out.println("</div>");
168                                 failed = true;
169                         }
170                         r3.close();
171                 } catch (SQLException e) {
172                         e.printStackTrace();
173                         failed = true;
174                 }
175                 String mailResult = EmailChecker.FAIL;
176                 try {
177                         mailResult = EmailChecker.checkEmailServer(0, buildup.getEmail());
178                 } catch (IOException e) {
179                 }
180                 if (!mailResult.equals(EmailChecker.OK)) {
181                         if (mailResult.startsWith("4")) {
182                                 outputError(
183                                                 out,
184                                                 req,
185                                                 "The mail server responsible for your domain indicated"
186                                                                 + " a temporary failure. This may be due to anti-SPAM measures, such"
187                                                                 + " as greylisting. Please try again in a few minutes.");
188                         } else {
189                                 outputError(
190                                                 out,
191                                                 req,
192                                                 "Email Address given was invalid, or a test connection"
193                                                                 + " couldn't be made to your server, or the server"
194                                                                 + " rejected the email address as invalid");
195                         }
196                         if (mailResult.equals(EmailChecker.FAIL)) {
197                                 outputError(out, req,
198                                                 "Failed to make a connection to the mail server");
199                         } else {
200                                 out.print("<div>");
201                                 out.print(mailResult);
202                                 out.println("</div>");
203                         }
204                         failed = true;
205                 }
206
207                 out.println("</div>");
208                 if (failed) {
209                         return false;
210                 }
211                 try {
212                         run(req, pw1);
213                 } catch (SQLException e) {
214                         e.printStackTrace();
215                 }
216                 return true;
217         }
218         private void outputError(PrintWriter out, ServletRequest req, String text) {
219                 out.print("<div>");
220                 out.print(Page.translate(req, text));
221                 out.println("</div>");
222         }
223
224         private void run(HttpServletRequest req, String password)
225                         throws SQLException {
226                 String hash = RandomToken.generateToken(16);
227
228                 buildup.insert(password);
229                 int memid = buildup.getId();
230                 PreparedStatement ps = DatabaseConnection.getInstance().prepare(
231                                 "insert into `email` set `email`=?,"
232                                                 + " `hash`=?, `created`=NOW(),`memid`=?");
233                 ps.setString(1, buildup.getEmail());
234                 ps.setString(2, hash);
235                 ps.setInt(3, memid);
236                 ps.execute();
237                 int emailid = DatabaseConnection.lastInsertId(ps);
238                 ps = DatabaseConnection
239                                 .getInstance()
240                                 .prepare(
241                                                 "insert into `alerts` set `memid`=?,"
242                                                                 + " `general`=?, `country`=?, `regional`=?, `radius`=?");
243                 ps.setInt(1, memid);
244                 ps.setString(2, general ? "1" : "0");
245                 ps.setString(3, country ? "1" : "0");
246                 ps.setString(4, regional ? "1" : "0");
247                 ps.setString(5, radius ? "1" : "0");
248                 ps.execute();
249                 Notary.writeUserAgreement(memid, "CCA", "account creation", "", true, 0);
250
251                 StringBuffer body = new StringBuffer();
252                 body.append(Page
253                                 .translate(
254                                                 req,
255                                                 "Thanks for signing up with CAcert.org, below is the link you need to open to verify your account. Once your account is verified you will be able to start issuing certificates till your hearts' content!"));
256                 body.append("\n\n");
257                 body.append("http://");
258                 body.append(ServerConstants.NORMAL_HOST_NAME);
259                 body.append("/verify.php?type=email&emailid=");
260                 body.append(emailid);
261                 body.append("&hash=");
262                 body.append(hash);
263                 body.append("\n\n");
264                 body.append(Page.translate(req, "Best regards"));
265                 body.append("\n");
266                 body.append(Page.translate(req, "CAcert.org Support!"));
267                 try {
268                         EmailProvider.getInstance().sendmail(buildup.getEmail(),
269                                         "[CAcert.org] " + Page.translate(req, "Mail Probe"),
270                                         body.toString(), "support@cacert.org", null, null, null,
271                                         null, false);
272                 } catch (IOException e) {
273                         e.printStackTrace();
274                 }
275
276         }
277 }