// --- BEGIN COPYRIGHT BLOCK ---
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 2 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// (C) 2007 Red Hat, Inc.
// All rights reserved.
// --- END COPYRIGHT BLOCK ---
package com.netscape.cms.listeners;
import java.io.IOException;
import java.util.Hashtable;
import com.netscape.certsrv.apps.CMS;
import com.netscape.certsrv.authority.ICertAuthority;
import com.netscape.certsrv.base.EBaseException;
import com.netscape.certsrv.base.EPropertyNotFound;
import com.netscape.certsrv.base.IConfigStore;
import com.netscape.certsrv.base.ISubsystem;
import com.netscape.certsrv.listeners.EListenersException;
import com.netscape.certsrv.logging.ILogger;
import com.netscape.certsrv.notification.ENotificationException;
import com.netscape.certsrv.notification.IEmailFormProcessor;
import com.netscape.certsrv.notification.IEmailTemplate;
import com.netscape.certsrv.notification.IMailNotification;
import com.netscape.certsrv.request.IRequest;
import com.netscape.certsrv.request.IRequestListener;
import com.netscape.certsrv.request.RequestId;
import com.netscape.cms.profile.input.SubjectNameInput;
import com.netscape.cms.profile.input.SubmitterInfoInput;
/**
* a listener for every request gets into the request queue.
*
* Here is a list of available $TOKENs for email notification templates:
*
* - $RequestorEmail
*
- $CertType
*
- $RequestType
*
- $RequestId
*
- $HttpHost
*
- $HttpPort
*
- $SenderEmail
*
- $RecipientEmail
*
*
*/
public class RequestInQListener implements IRequestListener {
protected static final String PROP_ENABLED = "enabled";
protected final static String PROP_SENDER_EMAIL = "senderEmail";
protected final static String PROP_RECVR_EMAIL = "recipientEmail";
public final static String PROP_EMAIL_TEMPLATE = "emailTemplate";
protected static final String PROP_EMAIL_SUBJECT = "emailSubject";
protected final static String PROP_NOTIFY_SUBSTORE = "notification";
protected final static String PROP_REQ_IN_Q_SUBSTORE = "requestInQ";
private boolean mEnabled = false;
private ILogger mLogger = CMS.getLogger();
private String mSenderEmail = null;
private String mRecipientEmail = null;
private String mEmailSubject = null;
private String mFormPath = null;
private IConfigStore mConfig = null;
private Hashtable mContentParams = new Hashtable();
private String mId = "RequestInQListener";
private ICertAuthority mSubsystem = null;
private String mHttpHost = null;
private String mAgentPort = null;
/**
* Constructor
*/
public RequestInQListener() {
}
/**
* initializes the listener from the configuration
*/
public void init(ISubsystem sub, IConfigStore config)
throws EListenersException, EPropertyNotFound, EBaseException {
mSubsystem = (ICertAuthority) sub;
mConfig = mSubsystem.getConfigStore();
IConfigStore nc = mConfig.getSubStore(PROP_NOTIFY_SUBSTORE);
IConfigStore rq = nc.getSubStore(PROP_REQ_IN_Q_SUBSTORE);
mEnabled = rq.getBoolean(PROP_ENABLED, false);
mSenderEmail = rq.getString(PROP_SENDER_EMAIL);
if (mSenderEmail == null) {
throw new EListenersException(CMS.getLogMessage("NO_NOTIFY_SENDER_EMAIL_CONFIG_FOUND"));
}
mRecipientEmail = rq.getString(PROP_RECVR_EMAIL);
if (mRecipientEmail == null) {
throw new EListenersException(CMS.getLogMessage("NO_NOTIFY_RECVR_EMAIL_CONFIG_FOUND"));
}
mEmailSubject = rq.getString(PROP_EMAIL_SUBJECT);
if (mEmailSubject == null) {
mEmailSubject = "Request in Queue";
}
mFormPath = rq.getString(PROP_EMAIL_TEMPLATE);
// make available http host and port for forming url in templates
mHttpHost = CMS.getAgentHost();
mAgentPort = CMS.getAgentPort();
if (mAgentPort == null)
log(ILogger.LL_FAILURE, CMS.getLogMessage("LISTENERS_REQUEST_PORT_NOT_FOUND"));
else
CMS.debug("RequestInQuListener: agentport = " + mAgentPort);
// register for this event listener
mSubsystem.registerPendingListener(this);
}
/**
* carries out the operation when the listener is triggered.
*
* @param r IRequest structure holding the request information
* @see com.netscape.certsrv.request.IRequest
*/
public void accept(IRequest r) {
if (mEnabled != true)
return;
// regardless of type of request...notify for everything
// no need for email resolver here...
IMailNotification mn = CMS.getMailNotification();
mn.setFrom(mSenderEmail);
mn.setTo(mRecipientEmail);
mn.setSubject(mEmailSubject + " (request id: " +
r.getRequestId() + ")");
/*
* get form file from disk
*/
IEmailTemplate template = CMS.getEmailTemplate(mFormPath);
/*
* parse and process the template
*/
if (template != null) {
if (!template.init()) {
log(ILogger.LL_FAILURE, CMS.getLogMessage("LISTENERS_TEMPLATE_NOT_INIT"));
return;
}
buildContentParams(r);
IEmailFormProcessor et = CMS.getEmailFormProcessor();
String c = et.getEmailContent(template.toString(), mContentParams);
if (template.isHTML()) {
mn.setContentType("text/html");
}
mn.setContent(c);
} else {
// log and mail
log(ILogger.LL_FAILURE,
CMS.getLogMessage("LISTENERS_TEMPLATE_NOT_GET"));
mn.setContent("Template not retrievable for Request in Queue notification");
}
try {
mn.sendNotification();
} catch (ENotificationException e) {
// already logged, lets audit
mLogger.log(ILogger.EV_AUDIT, null,
ILogger.S_OTHER,
ILogger.LL_FAILURE, CMS.getLogMessage("OPERATION_ERROR", e.toString()));
mLogger.log(ILogger.EV_SYSTEM, ILogger.S_OTHER,
ILogger.LL_FAILURE,
CMS.getLogMessage("LISTENERS_SEND_FAILED", e.toString()));
} catch (IOException e) {
log(ILogger.LL_FAILURE,
CMS.getLogMessage("LISTENERS_SEND_FAILED", e.toString()));
}
}
private void buildContentParams(IRequest r) {
mContentParams.clear();
mContentParams.put(IEmailFormProcessor.TOKEN_ID,
mConfig.getName());
Object val = null;
String profileId = r.getExtDataInString("profileId");
if (profileId == null) {
val = r.getExtDataInString(IRequest.HTTP_PARAMS, "csrRequestorEmail");
} else {
// use the submitter info if available, otherwise, use the
// subject name input email
val = r.getExtDataInString(SubmitterInfoInput.EMAIL);
if ((val == null) || (((String) val).compareTo("") == 0)) {
val = r.getExtDataInString(SubjectNameInput.VAL_EMAIL);
}
}
if (val != null)
mContentParams.put(IEmailFormProcessor.TOKEN_REQUESTOR_EMAIL,
val);
if (profileId == null) {
val = r.getExtDataInString(IRequest.HTTP_PARAMS, IRequest.CERT_TYPE);
} else {
val = profileId;
}
if (val != null) {
mContentParams.put(IEmailFormProcessor.TOKEN_CERT_TYPE,
val);
}
RequestId reqId = r.getRequestId();
mContentParams.put(IEmailFormProcessor.TOKEN_REQUEST_ID,
(Object) reqId.toString());
mContentParams.put(IEmailFormProcessor.TOKEN_ID, mId);
val = r.getRequestType();
if (val != null)
mContentParams.put(IEmailFormProcessor.TOKEN_REQUEST_TYPE,
val);
mContentParams.put(IEmailFormProcessor.TOKEN_HTTP_HOST,
(Object) mHttpHost);
mContentParams.put(IEmailFormProcessor.TOKEN_HTTP_PORT,
(Object) mAgentPort);
mContentParams.put(IEmailFormProcessor.TOKEN_SENDER_EMAIL,
(Object) mSenderEmail);
mContentParams.put(IEmailFormProcessor.TOKEN_RECIPIENT_EMAIL,
(Object) mRecipientEmail);
}
/**
* sets the configurable parameters
*
* @param name a String represents the name of the configuration parameter to be set
* @param val a String containing the value to be set for name
*/
public void set(String name, String val) {
if (name.equalsIgnoreCase(PROP_ENABLED)) {
if (val.equalsIgnoreCase("true")) {
mEnabled = true;
} else {
mEnabled = false;
}
} else if (name.equalsIgnoreCase(PROP_SENDER_EMAIL)) {
mSenderEmail = val;
} else if (name.equalsIgnoreCase(PROP_RECVR_EMAIL)) {
mRecipientEmail = val;
} else if (name.equalsIgnoreCase(PROP_EMAIL_SUBJECT)) {
mEmailSubject = val;
} else if (name.equalsIgnoreCase(PROP_EMAIL_TEMPLATE)) {
mFormPath = val;
} else {
log(ILogger.LL_FAILURE, CMS.getLogMessage("LISTENERS_CERT_ISSUED_SET"));
}
}
private void log(int level, String msg) {
if (mLogger == null)
return;
mLogger.log(ILogger.EV_SYSTEM, null, ILogger.S_OTHER,
level, msg);
}
}