import static org.cacert.gigi.Gigi.*;
import java.io.IOException;
+import java.io.PrintWriter;
import java.security.cert.X509Certificate;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import org.cacert.gigi.User;
+import org.cacert.gigi.GigiApiException;
import org.cacert.gigi.database.DatabaseConnection;
+import org.cacert.gigi.database.GigiPreparedStatement;
+import org.cacert.gigi.database.GigiResultSet;
+import org.cacert.gigi.dbObjects.Group;
+import org.cacert.gigi.dbObjects.User;
import org.cacert.gigi.localisation.Language;
+import org.cacert.gigi.output.template.Form;
import org.cacert.gigi.util.PasswordHash;
public class LoginPage extends Page {
+ public class LoginForm extends Form {
+
+ public LoginForm(HttpServletRequest hsr) {
+ super(hsr);
+ }
+
+ @Override
+ public boolean submit(PrintWriter out, HttpServletRequest req) throws GigiApiException {
+ tryAuthWithUnpw(req);
+ return false;
+ }
+
+ @Override
+ protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
+ getDefaultTemplate().output(out, l, vars);
+ }
+
+ }
+
public static final String LOGIN_RETURNPATH = "login-returnpath";
public LoginPage(String title) {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- resp.getWriter().println("<form method='POST' action='/login'>" + "<input type='text' name='username'>" + "<input type='password' name='password'> <input type='submit' value='login'></form>");
+ new LoginForm(req).output(resp.getWriter(), getLanguage(req), new HashMap<String, Object>());
}
@Override
tryAuthWithCertificate(req, cert[0]);
}
if (req.getMethod().equals("POST")) {
- tryAuthWithUnpw(req);
+ try {
+ Form.getForm(req, LoginForm.class).submit(resp.getWriter(), req);
+ } catch (GigiApiException e) {
+ }
}
}
private void tryAuthWithUnpw(HttpServletRequest req) {
String un = req.getParameter("username");
String pw = req.getParameter("password");
- try {
- PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `password`, `id` FROM `users` WHERE `email`=? AND locked='0' AND verified='1'");
- ps.setString(1, un);
- ResultSet rs = ps.executeQuery();
- if (rs.next()) {
- if (PasswordHash.verifyHash(pw, rs.getString(1))) {
- loginSession(req, new User(rs.getInt(2)));
+ GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `password`, `id` FROM `users` WHERE `email`=? AND verified='1'");
+ ps.setString(1, un);
+ GigiResultSet rs = ps.executeQuery();
+ if (rs.next()) {
+ String dbHash = rs.getString(1);
+ String hash = PasswordHash.verifyHash(pw, dbHash);
+ if (hash != null) {
+ if ( !hash.equals(dbHash)) {
+ GigiPreparedStatement gps = DatabaseConnection.getInstance().prepare("UPDATE `users` SET `password`=? WHERE `email`=?");
+ gps.setString(1, hash);
+ gps.setString(2, un);
+ gps.executeUpdate();
}
+ loginSession(req, User.getById(rs.getInt(2)));
}
- rs.close();
- } catch (SQLException e) {
- e.printStackTrace();
}
+ rs.close();
}
public static User getUser(HttpServletRequest req) {
private void tryAuthWithCertificate(HttpServletRequest req, X509Certificate x509Certificate) {
String serial = x509Certificate.getSerialNumber().toString(16).toUpperCase();
- try {
- PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `memid` FROM `certs` WHERE `serial`=? AND `disablelogin`='0' AND `revoked` = " + "'0000-00-00 00:00:00'");
- ps.setString(1, serial);
- ResultSet rs = ps.executeQuery();
- if (rs.next()) {
- loginSession(req, new User(rs.getInt(1)));
- }
- rs.close();
- } catch (SQLException e) {
- e.printStackTrace();
+ GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `memid` FROM `certs` WHERE `serial`=? AND `disablelogin`='0' AND `revoked` is NULL");
+ ps.setString(1, serial);
+ GigiResultSet rs = ps.executeQuery();
+ if (rs.next()) {
+ loginSession(req, User.getById(rs.getInt(1)));
+ req.getSession().setAttribute(CERT_SERIAL, serial);
+ req.getSession().setAttribute(CERT_ISSUER, x509Certificate.getIssuerDN());
}
+ rs.close();
}
+ private static final Group LOGIN_BLOCKED = Group.getByString("blockedlogin");
+
private void loginSession(HttpServletRequest req, User user) {
+ if (user.isInGroup(LOGIN_BLOCKED)) {
+ return;
+ }
req.getSession().invalidate();
HttpSession hs = req.getSession();
hs.setAttribute(LOGGEDIN, true);