Repository: juddi Updated Branches: refs/heads/master d3710612f -> f7db6df07
JUDDI-861 implemented, but needs testing Project: http://git-wip-us.apache.org/repos/asf/juddi/repo Commit: http://git-wip-us.apache.org/repos/asf/juddi/commit/f7db6df0 Tree: http://git-wip-us.apache.org/repos/asf/juddi/tree/f7db6df0 Diff: http://git-wip-us.apache.org/repos/asf/juddi/diff/f7db6df0 Branch: refs/heads/master Commit: f7db6df0761e2114b6060f1bb9d3cf69c2784b73 Parents: d371061 Author: Alex <[email protected]> Authored: Mon Jan 19 19:53:33 2015 -0500 Committer: Alex <[email protected]> Committed: Mon Jan 19 19:53:33 2015 -0500 ---------------------------------------------------------------------- .../juddi/api/impl/AuthenticatedService.java | 1 - .../org/apache/juddi/api/impl/JUDDIApiImpl.java | 13 +- .../juddi/subscription/notify/SMTPNotifier.java | 7 +- .../notify/TemporaryMailContainer.java | 61 +++++++ .../notify/USERFRIENDLYSMTPNotifier.java | 173 +++++++++++++++---- .../src/main/resources/messages.properties | 1 + 6 files changed, 219 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/juddi/blob/f7db6df0/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java ---------------------------------------------------------------------- diff --git a/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java b/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java index 7a4c334..6d16d98 100644 --- a/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java +++ b/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java @@ -35,7 +35,6 @@ import org.apache.juddi.v3.auth.AuthenticatorFactory; import org.apache.juddi.v3.error.AuthTokenRequiredException; import org.apache.juddi.v3.error.AuthTokenExpiredException; import org.apache.juddi.v3.error.ErrorMessage; -import org.apache.juddi.v3.error.UnknownUserException; import org.uddi.v3_service.DispositionReportFaultMessage; /** http://git-wip-us.apache.org/repos/asf/juddi/blob/f7db6df0/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java ---------------------------------------------------------------------- diff --git a/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java b/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java index ca69eba..3395dc7 100644 --- a/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java +++ b/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java @@ -83,6 +83,8 @@ import org.apache.juddi.model.Tmodel; import org.apache.juddi.model.UddiEntityPublisher; import org.apache.juddi.replication.ReplicationNotifier; import org.apache.juddi.subscription.NotificationList; +import org.apache.juddi.subscription.notify.TemporaryMailContainer; +import org.apache.juddi.subscription.notify.USERFRIENDLYSMTPNotifier; import org.apache.juddi.v3.client.transport.Transport; import org.apache.juddi.v3.error.ErrorMessage; import org.apache.juddi.v3.error.FatalErrorException; @@ -1173,16 +1175,23 @@ public class JUDDIApiImpl extends AuthenticatedService implements JUDDIApiPortTy throw new UserMismatchException(new ErrorMessage("errors.AdminReqd")); } //new ValidateSubscription(publisher).validateDeleteSubscription(em, body); - + List<TemporaryMailContainer> notifications = new ArrayList<TemporaryMailContainer>(); List<String> subscriptionKeyList = subscriptionKey; for (String key : subscriptionKeyList) { if (key != null && key.length() > 0) { - Object obj = em.find(org.apache.juddi.model.Subscription.class, key); + org.apache.juddi.model.Subscription obj = em.find(org.apache.juddi.model.Subscription.class, key); + Publisher publisher = em.find(Publisher.class, obj.getAuthorizedName()); + notifications.add(new TemporaryMailContainer(obj, publisher, (Publisher) requestor)); em.remove(obj); } } tx.commit(); + for (TemporaryMailContainer t:notifications){ + USERFRIENDLYSMTPNotifier.notifySubscriptionDeleted(t); + } + notifications.clear(); + notifications=null; long procTime = System.currentTimeMillis() - startTime; serviceCounter.update(JUDDIQuery.ADMIN_DELETE_SUB, QueryStatus.SUCCESS, procTime); http://git-wip-us.apache.org/repos/asf/juddi/blob/f7db6df0/juddi-core/src/main/java/org/apache/juddi/subscription/notify/SMTPNotifier.java ---------------------------------------------------------------------- diff --git a/juddi-core/src/main/java/org/apache/juddi/subscription/notify/SMTPNotifier.java b/juddi-core/src/main/java/org/apache/juddi/subscription/notify/SMTPNotifier.java index 0bb301a..1b5138c 100644 --- a/juddi-core/src/main/java/org/apache/juddi/subscription/notify/SMTPNotifier.java +++ b/juddi-core/src/main/java/org/apache/juddi/subscription/notify/SMTPNotifier.java @@ -35,6 +35,7 @@ import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.juddi.api_v3.AccessPointType; @@ -63,13 +64,13 @@ import org.uddi.v3_service.DispositionReportFaultMessage; */ public class SMTPNotifier implements Notifier { - Log log = LogFactory.getLog(this.getClass()); + static final Log log = LogFactory.getLog(SMTPNotifier.class); String notificationEmailAddress = null; //String from = null; Session session = null; Properties properties = null; - private final static String[] mailProps = {"mail.smtp.from", "mail.smtp.host", "mail.smtp.port", + protected final static String[] mailProps = {"mail.smtp.from", "mail.smtp.host", "mail.smtp.port", "mail.smtp.socketFactory.class", "mail.smtp.socketFactory.fallback", "mail.smtp.starttls.enable", "mail.smtp.socketFactory.port","mail.smtp.auth","mail.smtp.user","mail.smtp.password","mail.debug"}; @@ -160,7 +161,7 @@ public class SMTPNotifier implements Notifier { message.setText(subscriptionResultXML, "UTF-8"); //message.setContent(subscriptionResultXML, "text/xml; charset=UTF-8;"); message.setSubject(ResourceConfig.getGlobalMessage("notifications.smtp.default.subject") + " " - + body.getSubscriptionResultsList().getSubscription().getSubscriptionKey()); + + StringEscapeUtils.escapeHtml(body.getSubscriptionResultsList().getSubscription().getSubscriptionKey())); Transport.send(message); } else throw new DispositionReportFaultMessage("Session is null!", null); http://git-wip-us.apache.org/repos/asf/juddi/blob/f7db6df0/juddi-core/src/main/java/org/apache/juddi/subscription/notify/TemporaryMailContainer.java ---------------------------------------------------------------------- diff --git a/juddi-core/src/main/java/org/apache/juddi/subscription/notify/TemporaryMailContainer.java b/juddi-core/src/main/java/org/apache/juddi/subscription/notify/TemporaryMailContainer.java new file mode 100644 index 0000000..e3f5205 --- /dev/null +++ b/juddi-core/src/main/java/org/apache/juddi/subscription/notify/TemporaryMailContainer.java @@ -0,0 +1,61 @@ +/* + * Copyright 2015 The Apache Software Foundation. + * + * 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 org.apache.juddi.subscription.notify; + +import org.apache.juddi.model.Publisher; +import org.apache.juddi.model.Subscription; + +/** + * + * @author alex + */ +public class TemporaryMailContainer { + + public TemporaryMailContainer(Subscription obj, Publisher publisher, Publisher deletedBy) { + + this.obj=obj; + this.publisher = publisher; + this.deletedBy=deletedBy; + } + private Subscription obj; + private Publisher publisher; + private Publisher deletedBy; + + + public Subscription getObj() { + return obj; + } + + public void setObj(Subscription obj) { + this.obj = obj; + } + + public Publisher getPublisher() { + return publisher; + } + + public void setPublisher(Publisher publisher) { + this.publisher = publisher; + } + + public Publisher getDeletedBy() { + return deletedBy; + } + + public void setDeletedBy(Publisher deletedBy) { + this.deletedBy = deletedBy; + } +} http://git-wip-us.apache.org/repos/asf/juddi/blob/f7db6df0/juddi-core/src/main/java/org/apache/juddi/subscription/notify/USERFRIENDLYSMTPNotifier.java ---------------------------------------------------------------------- diff --git a/juddi-core/src/main/java/org/apache/juddi/subscription/notify/USERFRIENDLYSMTPNotifier.java b/juddi-core/src/main/java/org/apache/juddi/subscription/notify/USERFRIENDLYSMTPNotifier.java index c6fffd1..443e102 100644 --- a/juddi-core/src/main/java/org/apache/juddi/subscription/notify/USERFRIENDLYSMTPNotifier.java +++ b/juddi-core/src/main/java/org/apache/juddi/subscription/notify/USERFRIENDLYSMTPNotifier.java @@ -19,9 +19,20 @@ package org.apache.juddi.subscription.notify; import java.io.StringWriter; import java.net.URISyntaxException; import java.rmi.RemoteException; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import javax.crypto.BadPaddingException; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; import javax.mail.Address; import javax.mail.Message.RecipientType; import javax.mail.Multipart; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; @@ -33,8 +44,12 @@ import org.apache.commons.lang.StringEscapeUtils; import org.apache.juddi.config.AppConfig; import org.apache.juddi.config.Property; import org.apache.juddi.config.ResourceConfig; +import org.apache.juddi.cryptor.CryptorFactory; import org.apache.juddi.jaxb.JAXBMarshaller; +import org.apache.juddi.mapping.MappingModelToApi; import org.apache.juddi.model.BindingTemplate; +import org.apache.juddi.model.Publisher; +import org.apache.juddi.model.Subscription; import org.uddi.api_v3.DispositionReport; import org.uddi.api_v3.Result; import org.uddi.sub_v3.SubscriptionFilter; @@ -54,9 +69,112 @@ import org.uddi.v3_service.DispositionReportFaultMessage; * The following properties can be set juddiv3.xml. * * @author Kurt Stam + * @author Alex O'Ree */ public class USERFRIENDLYSMTPNotifier extends SMTPNotifier { + public static void notifySubscriptionDeleted(TemporaryMailContainer container) { + try { + Publisher publisher=container.getPublisher(); + Publisher deletedBy = container.getDeletedBy(); + Subscription obj = container.getObj(); + + Properties properties = new Properties(); + Session session = null; + String mailPrefix = AppConfig.getConfiguration().getString(Property.JUDDI_EMAIL_PREFIX, Property.DEFAULT_JUDDI_EMAIL_PREFIX); + if (!mailPrefix.endsWith(".")) { + mailPrefix = mailPrefix + "."; + } + for (String key : mailProps) { + if (AppConfig.getConfiguration().containsKey(mailPrefix + key)) { + properties.put(key, AppConfig.getConfiguration().getProperty(mailPrefix + key)); + } else if (System.getProperty(mailPrefix + key) != null) { + properties.put(key, System.getProperty(mailPrefix + key)); + } + } + String emailaddress = publisher.getEmailAddress(); + boolean auth = (properties.getProperty("mail.smtp.auth", "false")).equalsIgnoreCase("true"); + if (auth) { + final String username = properties.getProperty("mail.smtp.user"); + String pwd = properties.getProperty("mail.smtp.password"); + //decrypt if possible + if (properties.getProperty("mail.smtp.password" + Property.ENCRYPTED_ATTRIBUTE, "false").equalsIgnoreCase("true")) { + try { + pwd = CryptorFactory.getCryptor().decrypt(pwd); + } catch (NoSuchPaddingException ex) { + log.error("Unable to decrypt settings", ex); + } catch (NoSuchAlgorithmException ex) { + log.error("Unable to decrypt settings", ex); + } catch (InvalidAlgorithmParameterException ex) { + log.error("Unable to decrypt settings", ex); + } catch (InvalidKeyException ex) { + log.error("Unable to decrypt settings", ex); + } catch (IllegalBlockSizeException ex) { + log.error("Unable to decrypt settings", ex); + } catch (BadPaddingException ex) { + log.error("Unable to decrypt settings", ex); + } + } + final String password = pwd; + log.debug("SMTP username = " + username + " from address = " + emailaddress); + Properties eMailProperties = properties; + eMailProperties.remove("mail.smtp.user"); + eMailProperties.remove("mail.smtp.password"); + session = Session.getInstance(properties, new javax.mail.Authenticator() { + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } else { + Properties eMailProperties = properties; + eMailProperties.remove("mail.smtp.user"); + eMailProperties.remove("mail.smtp.password"); + session = Session.getInstance(eMailProperties); + } + + MimeMessage message = new MimeMessage(session); + InternetAddress address = new InternetAddress(emailaddress); + Address[] to = {address}; + message.setRecipients(RecipientType.TO, to); + message.setFrom(new InternetAddress(properties.getProperty("mail.smtp.from", "jUDDI"))); + //Hello %s,<br><br>Your subscription UDDI subscription was deleted. Attached is what the subscription was. It was deleted by %s, %s at %s. This node is %s + //maybe nice to use a template rather then sending raw xml. + org.uddi.sub_v3.Subscription api = new org.uddi.sub_v3.Subscription(); + MappingModelToApi.mapSubscription(obj, api); + String subscriptionResultXML = JAXBMarshaller.marshallToString(api, JAXBMarshaller.PACKAGE_SUBSCR_RES); + Multipart mp = new MimeMultipart(); + + MimeBodyPart content = new MimeBodyPart(); + String msg_content = ResourceConfig.getGlobalMessage("notifications.smtp.subscriptionDeleted"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddTkk:mm:ssZ"); +//Hello %s,<br><br>Your subscription UDDI subscription was deleted. Attached is what the subscription was. It was deleted by %s, %s at %s. This node is %s + msg_content = String.format(msg_content, + StringEscapeUtils.escapeHtml(publisher.getPublisherName()), + StringEscapeUtils.escapeHtml(publisher.getAuthorizedName()), + StringEscapeUtils.escapeHtml(deletedBy.getPublisherName()), + StringEscapeUtils.escapeHtml(deletedBy.getAuthorizedName()), + StringEscapeUtils.escapeHtml(sdf.format(new Date())), + StringEscapeUtils.escapeHtml(AppConfig.getConfiguration().getString(Property.JUDDI_NODE_ID, "(unknown node id!)")) + ); + + content.setContent(msg_content, "text/html; charset=UTF-8;"); + mp.addBodyPart(content); + + MimeBodyPart attachment = new MimeBodyPart(); + attachment.setContent(subscriptionResultXML, "text/xml; charset=UTF-8;"); + attachment.setFileName("uddiNotification.xml"); + mp.addBodyPart(attachment); + + message.setContent(mp); + message.setSubject(ResourceConfig.getGlobalMessage("notifications.smtp.userfriendly.subject") + " " + + StringEscapeUtils.escapeHtml(obj.getSubscriptionKey())); + Transport.send(message); + + } catch (Throwable t) { + log.error(t); + } + } + public USERFRIENDLYSMTPNotifier(BindingTemplate bindingTemplate) throws URISyntaxException, Exception { super(bindingTemplate); publisherName = bindingTemplate.getAuthorizedName(); @@ -78,30 +196,31 @@ public class USERFRIENDLYSMTPNotifier extends SMTPNotifier { //maybe nice to use a template rather then sending raw xml. String subscriptionResultXML = JAXBMarshaller.marshallToString(body, JAXBMarshaller.PACKAGE_SUBSCR_RES); Multipart mp = new MimeMultipart(); - + MimeBodyPart content = new MimeBodyPart(); String msg_content = ResourceConfig.getGlobalMessage("notifications.smtp.userfriendly.body"); msg_content = String.format(msg_content, - StringEscapeUtils.escapeHtml(this.publisherName), - StringEscapeUtils.escapeHtml(AppConfig.getConfiguration().getString(Property.JUDDI_NODE_ID, "(unknown node id!)")), - GetSubscriptionType(body), - GetChangeSummary(body)); - + StringEscapeUtils.escapeHtml(this.publisherName), + StringEscapeUtils.escapeHtml(AppConfig.getConfiguration().getString(Property.JUDDI_NODE_ID, "(unknown node id!)")), + GetSubscriptionType(body), + GetChangeSummary(body)); + content.setContent(msg_content, "text/html; charset=UTF-8;"); mp.addBodyPart(content); - + MimeBodyPart attachment = new MimeBodyPart(); attachment.setContent(subscriptionResultXML, "text/xml; charset=UTF-8;"); attachment.setFileName("uddiNotification.xml"); mp.addBodyPart(attachment); - + message.setContent(mp); message.setSubject(ResourceConfig.getGlobalMessage("notifications.smtp.userfriendly.subject") + " " - + body.getSubscriptionResultsList().getSubscription().getSubscriptionKey()); + + body.getSubscriptionResultsList().getSubscription().getSubscriptionKey()); Transport.send(message); + } else { + throw new DispositionReportFaultMessage("Session is null!", null); } - else throw new DispositionReportFaultMessage("Session is null!", null); } catch (Exception e) { log.error(e.getMessage(), e); throw new DispositionReportFaultMessage(e.getMessage(), null); @@ -117,42 +236,34 @@ public class USERFRIENDLYSMTPNotifier extends SMTPNotifier { static String GetChangeSummary(NotifySubscriptionListener body) { SubscriptionResultsList r = body.getSubscriptionResultsList(); StringWriter sw = new StringWriter(); - + if (r.getAssertionStatusReport() != null) { JAXB.marshal(r.getAssertionStatusReport(), sw); - } - else if (r.getBindingDetail() != null) { + } else if (r.getBindingDetail() != null) { JAXB.marshal(r.getBindingDetail(), sw); - } - else if (r.getBusinessDetail() != null) { + } else if (r.getBusinessDetail() != null) { JAXB.marshal(r.getBusinessDetail(), sw); - } - else if (r.getBusinessList() != null) { + } else if (r.getBusinessList() != null) { JAXB.marshal(r.getBusinessList(), sw); - } - else if (r.getRelatedBusinessesList() != null) { + } else if (r.getRelatedBusinessesList() != null) { JAXB.marshal(r.getRelatedBusinessesList(), sw); - } - else if (r.getServiceDetail() != null) { + } else if (r.getServiceDetail() != null) { JAXB.marshal(r.getServiceDetail(), sw); - } - else if (r.getServiceList() != null) { + } else if (r.getServiceList() != null) { JAXB.marshal(r.getServiceList(), sw); - } - else if (r.getTModelDetail() != null) { + } else if (r.getTModelDetail() != null) { JAXB.marshal(r.getTModelDetail(), sw); - } - else if (r.getTModelList() != null) { + } else if (r.getTModelList() != null) { JAXB.marshal(r.getTModelList(), sw); } - - return "<pre>" +StringEscapeUtils.escapeHtml(sw.toString()) + "</pre>"; + + return "<pre>" + StringEscapeUtils.escapeHtml(sw.toString()) + "</pre>"; } static String GetSubscriptionType(NotifySubscriptionListener body) { if (body != null && body.getSubscriptionResultsList() != null - && body.getSubscriptionResultsList().getSubscription() != null - && body.getSubscriptionResultsList().getSubscription().getSubscriptionFilter() != null) { + && body.getSubscriptionResultsList().getSubscription() != null + && body.getSubscriptionResultsList().getSubscription().getSubscriptionFilter() != null) { SubscriptionFilter sub = body.getSubscriptionResultsList().getSubscription().getSubscriptionFilter(); if (sub.getFindBinding() != null) { return " binding search results"; http://git-wip-us.apache.org/repos/asf/juddi/blob/f7db6df0/juddi-core/src/main/resources/messages.properties ---------------------------------------------------------------------- diff --git a/juddi-core/src/main/resources/messages.properties b/juddi-core/src/main/resources/messages.properties index 5b52e16..a417c0d 100644 --- a/juddi-core/src/main/resources/messages.properties +++ b/juddi-core/src/main/resources/messages.properties @@ -282,6 +282,7 @@ notifications.smtp.default.subject=UDDI Subscription Notification for subscripti notifications.smtp.userfriendly.subject=UDDI Subscription Notification for subscription notifications.smtp.userfriendly.body=Hello %s,<br><br>You are currently registered to receive subscription updates in the UDDI Node <b>%s</b> for %s. A change was registered that triggered an update notification to be sent. The attachment contains the XML containing the details of the change.<br><br><b>Summary of changes</b>: <br><br>%s +notifications.smtp.subscriptionDeleted=Hello %s,<br><br>Your subscription UDDI subscription was deleted. Attached is what the subscription was. It was deleted by %s, %s at %s. This node is %s #username #node #search results or a specific item --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
