/*
************************************************************************
******************* CANADIAN ASTRONOMY DATA CENTRE *******************
************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
*
* (c) 2014. (c) 2014.
* Government of Canada Gouvernement du Canada
* National Research Council Conseil national de recherches
* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
* All rights reserved Tous droits réservés
*
* NRC disclaims any warranties, Le CNRC dénie toute garantie
* expressed, implied, or énoncée, implicite ou légale,
* statutory, of any kind with de quelque nature que ce
* respect to the software, soit, concernant le logiciel,
* including without limitation y compris sans restriction
* any warranty of merchantability toute garantie de valeur
* or fitness for a particular marchande ou de pertinence
* purpose. NRC shall not be pour un usage particulier.
* liable in any event for any Le CNRC ne pourra en aucun cas
* damages, whether direct or être tenu responsable de tout
* indirect, special or general, dommage, direct ou indirect,
* consequential or incidental, particulier ou général,
* arising from the use of the accessoire ou fortuit, résultant
* software. Neither the name de l'utilisation du logiciel. Ni
* of the National Research le nom du Conseil National de
* Council of Canada nor the Recherches du Canada ni les noms
* names of its contributors may de ses participants ne peuvent
* be used to endorse or promote être utilisés pour approuver ou
* products derived from this promouvoir les produits dérivés
* software without specific prior de ce logiciel sans autorisation
* written permission. préalable et particulière
* par écrit.
*
* This file is part of the Ce fichier fait partie du projet
* OpenCADC project. OpenCADC.
*
* OpenCADC is free software: OpenCADC est un logiciel libre ;
* you can redistribute it and/or vous pouvez le redistribuer ou le
* modify it under the terms of modifier suivant les termes de
* the GNU Affero General Public la “GNU Affero General Public
* License as published by the License” telle que publiée
* Free Software Foundation, par la Free Software Foundation
* either version 3 of the : soit la version 3 de cette
* License, or (at your option) licence, soit (à votre gré)
* any later version. toute version ultérieure.
*
* OpenCADC is distributed in the OpenCADC est distribué
* hope that it will be useful, dans l’espoir qu’il vous
* but WITHOUT ANY WARRANTY; sera utile, mais SANS AUCUNE
* without even the implied GARANTIE : sans même la garantie
* warranty of MERCHANTABILITY implicite de COMMERCIALISABILITÉ
* or FITNESS FOR A PARTICULAR ni d’ADÉQUATION À UN OBJECTIF
* PURPOSE. See the GNU Affero PARTICULIER. Consultez la Licence
* General Public License for Générale Publique GNU Affero
* more details. pour plus de détails.
*
* You should have received Vous devriez avoir reçu une
* a copy of the GNU Affero copie de la Licence Générale
* General Public License along Publique GNU Affero avec
* with OpenCADC. If not, see OpenCADC ; si ce n’est
* . pas le cas, consultez :
* .
*
* $Revision: 4 $
*
************************************************************************
*/
package ca.nrc.cadc.ac.admin;
import java.security.AccessControlException;
import java.util.Date;
import java.util.IllegalFormatException;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.security.auth.x500.X500Principal;
import org.apache.log4j.Logger;
import ca.nrc.cadc.ac.User;
import ca.nrc.cadc.ac.UserNotFoundException;
import ca.nrc.cadc.auth.HttpPrincipal;
import ca.nrc.cadc.net.TransientException;
import ca.nrc.cadc.util.PropertiesReader;
/**
* This class approves the specified pending user by moving the user
* from a pending user to an active user in the LDAP server.
* @author yeunga
*
*/
public class ApproveUser extends AbstractUserCommand
{
private static final Logger log = Logger.getLogger(ApproveUser.class);
private static final String EMAIL_CONFIG = "ac-admin-email.properties";
private static final String EMAIL_HOST = "smtp.host";
private static final String EMAIL_SENDER = "smtp.sender";
private static final String EMAIL_REPLYTO = "smtp.replyto";
private static final String EMAIL_BCC = "smtp.bcc";
private static final String EMAIL_SUBJECT = "mail.subject";
private static final String EMAIL_BODY = "mail.body";
private String dn;
/**
* Constructor
* @param userID Id of the pending user to be approved
*/
public ApproveUser(final String userID, final String dn)
{
super(userID);
this.dn = dn;
}
protected void execute()
throws AccessControlException, UserNotFoundException, TransientException
{
X500Principal dnPrincipal = null;
try
{
dnPrincipal = new X500Principal(dn);
}
catch (Exception e)
{
throw new IllegalArgumentException("Invalid DN format: " + dn);
}
boolean approved = false;
try
{
this.getUserPersistence().approveUserRequest(this.getPrincipal());
this.systemOut.println("User " + this.getPrincipal().getName() + " was approved successfully.");
approved = true;
}
catch (UserNotFoundException e)
{
this.systemOut.println("Could not find userRequest " + this.getPrincipal());
return;
}
User user = null;
try
{
user = this.getUserPersistence().getUser(this.getPrincipal());
}
catch (UserNotFoundException e)
{
this.systemOut.println("Could not set user DN");
return;
}
if (approved)
{
// email the user if configuration is available
emailUser(user);
}
user.getIdentities().add(dnPrincipal);
this.getUserPersistence().modifyUser(user);
String noWhiteSpaceDN = dn.replaceAll("\\s","");
this.systemOut.println("User " + this.getPrincipal().getName() + " now has DN " + noWhiteSpaceDN);
this.printUser(user);
}
private void emailUser(User user)
{
try
{
PropertiesReader pr = new PropertiesReader(EMAIL_CONFIG);
String host = pr.getFirstPropertyValue(EMAIL_HOST);
String sender = pr.getFirstPropertyValue(EMAIL_SENDER);
String replyto = pr.getFirstPropertyValue(EMAIL_REPLYTO);
String subject = pr.getFirstPropertyValue(EMAIL_SUBJECT);
String body = pr.getFirstPropertyValue(EMAIL_BODY);
String bcc = pr.getFirstPropertyValue(EMAIL_BCC);
log.debug("email host: " + host);
log.debug("email sender: " + sender);
log.debug("email replyto: " + replyto);
log.debug("email subject: " + subject);
log.debug("email bcc: " + bcc);
log.debug("email body: " + body);
if (host == null || sender == null || subject == null || body == null || replyto == null)
{
// do not email, missing configuration
log.warn("Missing email configuration, not emailing user");
return;
}
String recipient = null;
if (user.personalDetails != null)
{
recipient = user.personalDetails.email;
}
if (recipient == null)
{
log.warn("No user email address, not emailing");
return;
}
HttpPrincipal p = user.getIdentities(HttpPrincipal.class).iterator().next();
// try to put the userid in the body
String populatedBody = null;
try
{
populatedBody = String.format(body, p.getName());
}
catch (IllegalFormatException e)
{
log.info("userid not inserted into message body");
populatedBody = null;
}
if (populatedBody == null)
{
populatedBody = body;
}
log.debug("email body populated: " + populatedBody);
// add the carriage returns
populatedBody = populatedBody.replaceAll("#", "\n");
log.debug("body with carriage returns: " + populatedBody);
Properties props = new Properties();
props.put("mail.smtp.host", host);
Session session = Session.getInstance(props, null);
try
{
MimeMessage msg = new MimeMessage(session);
Address senderAddress = new InternetAddress(sender);
Address recipientAddress = new InternetAddress(recipient);
Address replytoAddress = new InternetAddress(replyto);
msg.setFrom(senderAddress);
msg.setRecipient(Message.RecipientType.TO, recipientAddress);
msg.setReplyTo(new Address[] {replytoAddress});
if (bcc != null)
{
Address bccAddress = new InternetAddress(bcc);
msg.addRecipient(Message.RecipientType.BCC, bccAddress);
}
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(populatedBody);
Transport.send(msg);
this.systemOut.println("Emailed approval message to user.");
}
catch (Exception e)
{
log.warn("Failed to send email address: " + e.getMessage(), e);
}
}
catch (Exception e)
{
log.warn("Failed to email user", e);
}
}
}