it.infn.ct.security.utilities.LDAPCleaner.java Source code

Java tutorial

Introduction

Here is the source code for it.infn.ct.security.utilities.LDAPCleaner.java

Source

/***********************************************************************
 *  Copyright (c) 2011: 
 *  Istituto Nazionale di Fisica Nucleare (INFN), Italy
 *  Consorzio COMETA (COMETA), Italy
 * 
 *  See http://www.infn.it and and http://www.consorzio-cometa.it for details on
 *  the copyright holders.
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *  http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 ***********************************************************************/

package it.infn.ct.security.utilities;

import it.infn.ct.security.actions.MailException;
import it.infn.ct.security.entities.UserConfirmUpdate;
import it.infn.ct.security.entities.UserRequest;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Marco Fargetta <marco.fargetta@ct.infn.it>
 */
public class LDAPCleaner implements Runnable {
    private Log _log = LogFactory.getLog(LDAPCleaner.class);
    private SessionFactory factory;
    private int cycle[];
    private ResourceBundle rb;

    public LDAPCleaner(SessionFactory factory) {
        rb = ResourceBundle.getBundle("cleaner");

        this.factory = factory;

        try {
            String strCycles[] = rb.getString("NotifyCycle").split(",");
            cycle = new int[strCycles.length];

            for (int i = 0; i < strCycles.length; i++) {
                cycle[i] = Integer.parseInt(strCycles[i]);
            }
        } catch (MissingResourceException mre) {
            cycle = new int[3];
            cycle[0] = 20;
            cycle[1] = 10;
            cycle[2] = 5;
        }
    }

    public void run() {
        _log.info("Users cleaning cycle start");
        firstCheck(cycle[0]);
        for (int i = 1; i < cycle.length; i++) {
            followingChecks(cycle[i]);
        }
        stopUsers();
        _log.info("Users cleaning cycle stop");
    }

    private void firstCheck(int days) {
        _log.info("Search users starting the account extension cycle");
        List<LDAPUser> userLst = LDAPUtils.getIdPUserList();

        for (LDAPUser user : userLst) {
            Calendar cal = GregorianCalendar.getInstance();
            cal.add(Calendar.DAY_OF_YEAR, days);
            Calendar userCreation = GregorianCalendar.getInstance();
            userCreation.setTime(user.getCreationTime());

            if (cal.get(Calendar.DAY_OF_YEAR) == userCreation.get(Calendar.DAY_OF_YEAR)) {
                _log.info("Update account procedure for the user " + user.getGivenname() + " " + user.getSurname()
                        + "(" + user.getUsername() + ") started");

                UserConfirmUpdate ucu = new UserConfirmUpdate(user.getUsername(), cal.getTime(), false);

                Session ses = factory.openSession();
                ses.beginTransaction();
                if (ses.createCriteria(UserConfirmUpdate.class).add(Restrictions.eq("username", user.getUsername()))
                        .add(Restrictions.eq("updated", Boolean.FALSE)).list().isEmpty()) {
                    ses.save(ucu);
                }
                ses.getTransaction().commit();
                ses.close();

                sendUserRemainder(user, days);

            }
        }

    }

    private void followingChecks(int days) {
        _log.info("Check users who have not extended yet");
        Calendar cal = GregorianCalendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, days);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);

        Calendar calEnd = GregorianCalendar.getInstance();
        calEnd.setTime(cal.getTime());
        calEnd.add(Calendar.DAY_OF_YEAR, 1);

        Session ses = factory.openSession();

        List lstUserUpdates = ses.createCriteria(UserConfirmUpdate.class)
                .add(Restrictions.between("timelimit", cal.getTime(), calEnd.getTime()))
                .add(Restrictions.eq("updated", Boolean.FALSE)).list();

        for (UserConfirmUpdate ucu : (List<UserConfirmUpdate>) lstUserUpdates) {
            UserRequest ur = LDAPUtils.getUser(ucu.getUsername());

            sendUserRemainder(ur, days);
        }

        ses.close();

    }

    private void stopUsers() {
        _log.info("Disable users who do not confirm the account extension");
        Session session = factory.openSession();
        session.beginTransaction();

        Calendar cal = GregorianCalendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);

        Calendar calEnd = GregorianCalendar.getInstance();
        calEnd.setTime(cal.getTime());
        calEnd.add(Calendar.DAY_OF_YEAR, 1);

        Session ses = factory.openSession();

        List lstUserUpdates = ses.createCriteria(UserConfirmUpdate.class)
                .add(Restrictions.between("timelimit", cal.getTime(), calEnd.getTime()))
                .add(Restrictions.eq("updated", Boolean.FALSE)).list();

        for (UserConfirmUpdate ucu : (List<UserConfirmUpdate>) lstUserUpdates) {
            UserRequest ur = LDAPUtils.getUser(ucu.getUsername());
            LDAPUtils.disableUser(ucu.getUsername());
            sendUserRemainder(ur, 0);
        }

        ses.close();

        session.getTransaction().commit();
        session.close();

    }

    private void sendUserRemainder(UserRequest ur, int days) {
        javax.mail.Session session = null;
        try {
            Context initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            session = (javax.mail.Session) envCtx.lookup("mail/Users");

            Message mailMsg = new MimeMessage(session);
            mailMsg.setFrom(new InternetAddress(rb.getString("mailSender"), rb.getString("IdPAdmin")));

            InternetAddress mailTo[] = new InternetAddress[1];
            mailTo[0] = new InternetAddress(getGoodMail(ur),
                    ur.getTitle() + " " + ur.getGivenname() + " " + ur.getSurname());
            mailMsg.setRecipients(Message.RecipientType.TO, mailTo);

            if (rb.containsKey("mailCopy") && !rb.getString("mailCopy").isEmpty()) {

                String ccMail[] = rb.getString("mailCopy").split(";");
                InternetAddress mailCCopy[] = new InternetAddress[ccMail.length];
                for (int i = 0; i < ccMail.length; i++) {
                    mailCCopy[i] = new InternetAddress(ccMail[i]);
                }

                mailMsg.setRecipients(Message.RecipientType.CC, mailCCopy);
            }

            if (days > 0) {
                mailMsg.setSubject(
                        rb.getString("mailNotificationSubject").replace("_DAYS_", Integer.toString(days)));
                mailMsg.setText(rb.getString("mailNotificationBody")
                        .replaceAll("_USER_", ur.getTitle() + " " + ur.getGivenname() + " " + ur.getSurname())
                        .replace("_DAYS_", Integer.toString(days)));
            } else {
                mailMsg.setSubject(rb.getString("mailDeleteSubject").replace("_DAYS_", Integer.toString(days)));
                mailMsg.setText(rb.getString("mailDeleteBody")
                        .replaceAll("_USER_", ur.getTitle() + " " + ur.getGivenname() + " " + ur.getSurname())
                        .replace("_DAYS_", Integer.toString(days)));
            }
            Transport.send(mailMsg);

        } catch (Exception ex) {
            _log.error("Mail resource lookup error");
            _log.error(ex.getMessage());
        }
    }

    private String getGoodMail(UserRequest ur) throws MailException {
        String mail = ur.getPreferredMail();
        if (rb.containsKey("mailFilter") && !rb.getString("mailFilter").isEmpty()) {
            for (String filter : rb.getString("mailFilter").split(",")) {
                if (mail.contains(filter)) {
                    throw new MailException("Preferred mail from filtered provider");
                }

            }
        }

        return mail;
    }
}