+ loginSession(req, user);
+ req.getSession().setAttribute(CERT_SERIAL, serial);
+ req.getSession().setAttribute(CERT_ISSUER, x509Certificate.getIssuerDN());
+ req.getSession().setAttribute(LOGIN_METHOD, "Certificate");
+ }
+
+ public static String extractSerialFormCert(X509Certificate x509Certificate) {
+ return x509Certificate.getSerialNumber().toString(16).toUpperCase();
+ }
+
+ public static User fetchUserBySerial(String serial) {
+ if ( !serial.matches("[A-Fa-f0-9]+")) {
+ throw new Error("serial malformed.");
+ }
+ GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `memid` FROM `certs` WHERE `serial`=? AND `disablelogin`='0' AND `revoked` is NULL");
+ ps.setString(1, serial.toLowerCase());
+ GigiResultSet rs = ps.executeQuery();
+ User user = null;
+ if (rs.next()) {
+ user = User.getById(rs.getInt(1));
+ } else {
+ System.out.println("User with serial " + serial + " not found.");
+ }
+ rs.close();
+ return user;
+ }
+
+ public static X509Certificate getCertificateFromRequest(HttpServletRequest req) {
+ X509Certificate[] cert = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
+ X509Certificate uc = null;
+ if (cert != null && cert[0] != null) {
+ uc = cert[0];
+ }
+ return uc;
+ }
+
+ 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);
+ hs.setAttribute(Language.SESSION_ATTRIB_NAME, user.getPreferredLocale());
+ hs.setAttribute(AUTH_CONTEXT, new AuthorizationContext(user, user));
+ }
+
+ @Override
+ public boolean isPermitted(AuthorizationContext ac) {
+ return ac == null;