]> WPIA git - gigi.git/blobdiff - src/org/cacert/gigi/pages/main/Signup.java
Make "RegisterPage" a "Form"
[gigi.git] / src / org / cacert / gigi / pages / main / Signup.java
index 060f82ba20e383ccf39968cf986615370bbc1a7f..2a7ea912ad05d7a0564e361b8855ff858f6a4195 100644 (file)
@@ -1,5 +1,6 @@
 package org.cacert.gigi.pages.main;
 
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
@@ -8,6 +9,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Map;
 
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
@@ -15,15 +17,19 @@ import javax.servlet.http.HttpServletRequest;
 import org.cacert.gigi.Language;
 import org.cacert.gigi.User;
 import org.cacert.gigi.database.DatabaseConnection;
+import org.cacert.gigi.email.EmailProvider;
 import org.cacert.gigi.output.DateSelector;
+import org.cacert.gigi.output.Form;
 import org.cacert.gigi.output.Template;
 import org.cacert.gigi.pages.Page;
 import org.cacert.gigi.util.HTMLEncoder;
+import org.cacert.gigi.util.Notary;
+import org.cacert.gigi.util.PasswordStrengthChecker;
+import org.cacert.gigi.util.RandomToken;
+import org.cacert.gigi.util.ServerConstants;
 
-public class Signup {
+public class Signup implements Form {
        User buildup = new User();
-       String password;
-       String password2;
        Template t;
        boolean general = true, country = true, regional = true, radius = true;
        public Signup() {
@@ -42,7 +48,8 @@ public class Signup {
        }
        DateSelector myDoB = new DateSelector("day", "month", "year");
 
-       public void writeForm(PrintWriter out, Language l) {
+       public void output(PrintWriter out, Language l,
+                       Map<String, Object> outerVars) {
                HashMap<String, Object> vars = new HashMap<String, Object>();
                vars.put("fname", HTMLEncoder.encodeHTML(buildup.getFname()));
                vars.put("mname", HTMLEncoder.encodeHTML(buildup.getMname()));
@@ -85,7 +92,7 @@ public class Signup {
                myDoB.update(r);
        }
 
-       public boolean submit(PrintWriter out, HttpServletRequest req) {
+       public synchronized boolean submit(PrintWriter out, HttpServletRequest req) {
                update(req);
                boolean failed = false;
                out.println("<div class='formError'>");
@@ -97,6 +104,11 @@ public class Signup {
                        outputError(out, req, "Invalid date of birth");
                        failed = true;
                }
+               if (!"1".equals(req.getParameter("cca_agree"))) {
+                       outputError(out, req,
+                                       "You have to agree to the CAcert Community agreement.");
+                       failed = true;
+               }
                if (buildup.getEmail().equals("")) {
                        outputError(out, req, "Email Address was blank");
                        failed = true;
@@ -110,7 +122,20 @@ public class Signup {
                        outputError(out, req, "Pass Phrases don't match");
                        failed = true;
                }
-               // TODO check password strength
+               int pwpoints = PasswordStrengthChecker.checkpw(pw1, buildup);
+               if (pwpoints < 3) {
+                       outputError(
+                                       out,
+                                       req,
+                                       "The Pass Phrase you submitted failed to contain enough"
+                                                       + " differing characters and/or contained words from"
+                                                       + " your name and/or email address.");
+                       failed = true;
+               }
+               if (failed) {
+                       out.println("</div>");
+                       return false;
+               }
                try {
                        PreparedStatement q1 = DatabaseConnection.getInstance().prepare(
                                        "select * from `email` where `email`=? and `deleted`=0");
@@ -149,12 +174,114 @@ public class Signup {
                        e.printStackTrace();
                        failed = true;
                }
+               String mailResult = EmailProvider.FAIL;
+               try {
+                       mailResult = EmailProvider.getInstance().checkEmailServer(0,
+                                       buildup.getEmail());
+               } catch (IOException e) {
+               }
+               if (!mailResult.equals(EmailProvider.OK)) {
+                       if (mailResult.startsWith("4")) {
+                               outputError(
+                                               out,
+                                               req,
+                                               "The mail server responsible for your domain indicated"
+                                                               + " a temporary failure. This may be due to anti-SPAM measures, such"
+                                                               + " as greylisting. Please try again in a few minutes.");
+                       } else {
+                               outputError(
+                                               out,
+                                               req,
+                                               "Email Address given was invalid, or a test connection"
+                                                               + " couldn't be made to your server, or the server"
+                                                               + " rejected the email address as invalid");
+                       }
+                       if (mailResult.equals(EmailProvider.FAIL)) {
+                               outputError(out, req,
+                                               "Failed to make a connection to the mail server");
+                       } else {
+                               out.print("<div>");
+                               out.print(mailResult);
+                               out.println("</div>");
+                       }
+                       failed = true;
+               }
+
                out.println("</div>");
-               return failed;
+               if (failed) {
+                       return false;
+               }
+               try {
+                       run(req, pw1);
+               } catch (SQLException e) {
+                       e.printStackTrace();
+               }
+               return true;
        }
        private void outputError(PrintWriter out, ServletRequest req, String text) {
                out.print("<div>");
                out.print(Page.translate(req, text));
                out.println("</div>");
        }
+
+       private void run(HttpServletRequest req, String password)
+                       throws SQLException {
+               try {
+                       DatabaseConnection.getInstance().beginTransaction();
+                       String hash = RandomToken.generateToken(16);
+
+                       buildup.setDob(myDoB.getDate());
+                       buildup.insert(password);
+                       int memid = buildup.getId();
+                       PreparedStatement ps = DatabaseConnection.getInstance().prepare(
+                                       "insert into `email` set `email`=?,"
+                                                       + " `hash`=?, `created`=NOW(),`memid`=?");
+                       ps.setString(1, buildup.getEmail());
+                       ps.setString(2, hash);
+                       ps.setInt(3, memid);
+                       ps.execute();
+                       int emailid = DatabaseConnection.lastInsertId(ps);
+                       ps = DatabaseConnection
+                                       .getInstance()
+                                       .prepare(
+                                                       "insert into `alerts` set `memid`=?,"
+                                                                       + " `general`=?, `country`=?, `regional`=?, `radius`=?");
+                       ps.setInt(1, memid);
+                       ps.setString(2, general ? "1" : "0");
+                       ps.setString(3, country ? "1" : "0");
+                       ps.setString(4, regional ? "1" : "0");
+                       ps.setString(5, radius ? "1" : "0");
+                       ps.execute();
+                       Notary.writeUserAgreement(memid, "CCA", "account creation", "",
+                                       true, 0);
+
+                       StringBuffer body = new StringBuffer();
+                       body.append(Page
+                                       .translate(
+                                                       req,
+                                                       "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!"));
+                       body.append("\n\n");
+                       body.append(ServerConstants.NORMAL_HOST_NAME);
+                       body.append("/verify?type=email&id=");
+                       body.append(emailid);
+                       body.append("&hash=");
+                       body.append(hash);
+                       body.append("\n\n");
+                       body.append(Page.translate(req, "Best regards"));
+                       body.append("\n");
+                       body.append(Page.translate(req, "CAcert.org Support!"));
+                       try {
+                               EmailProvider.getInstance().sendmail(buildup.getEmail(),
+                                               "[CAcert.org] " + Page.translate(req, "Mail Probe"),
+                                               body.toString(), "support@cacert.org", null, null,
+                                               null, null, false);
+                       } catch (IOException e) {
+                               e.printStackTrace();
+                       }
+                       DatabaseConnection.getInstance().commitTransaction();
+               } finally {
+                       DatabaseConnection.getInstance().quitTransaction();
+               }
+
+       }
 }