/********************************************************************************** * $URL:https://source.sakaiproject.org/svn/osp/trunk/presentation/tool/src/java/org/theospi/portfolio/presentation/control/RequestPresentationController.java $ *********************************************************************************** * * Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Sakai Foundation * * Licensed under the Educational Community 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.osedu.org/licenses/ECL-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.theospi.portfolio.presentation.control; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collection; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.metaobj.shared.model.Id; import org.sakaiproject.portal.api.PortalService; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.SiteService; import org.sakaiproject.site.api.ToolConfiguration; import org.sakaiproject.user.api.User; import org.sakaiproject.user.api.UserNotDefinedException; import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; import org.theospi.portfolio.presentation.model.Presentation; import org.theospi.portfolio.presentation.PresentationFunctionConstants; import org.sakaiproject.user.api.UserDirectoryService; import org.sakaiproject.util.ResourceLoader; import org.sakaiproject.util.Validator; import org.sakaiproject.email.api.EmailService; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.util.Web; public class RequestPresentationController extends AbstractPresentationController { protected final Log logger = LogFactory.getLog(getClass()); private UserDirectoryService userDirectoryService; private EmailService emailService; private PortalService portalService; private SiteService siteService; public final String MULTIPART_BOUNDARY = "======sakai-multi-part-boundary======"; public final String BOUNDARY_LINE = "\n\n--"+MULTIPART_BOUNDARY+"\n"; public final String TERMINATION_LINE = "\n\n--"+MULTIPART_BOUNDARY+"--\n\n"; public final String MIME_ADVISORY = "This message is for MIME-compliant mail readers."; public final String PLAIN_TEXT_HEADERS= "Content-Type: text/plain\n\n"; public final String HTML_HEADERS = "Content-Type: text/html; charset=ISO-8859-1\n\n"; public final String HTML_END = "\n </body>\n</html>\n"; @SuppressWarnings("unchecked") public ModelAndView handleRequest(Object requestModel, Map request, Map session, Map application, Errors errors) { boolean result = false; Hashtable<String, Object> model = new Hashtable<String, Object>(); String requestAccess = (String)request.get("requestAccess"); String grantAccess = (String)request.get("grantAccess"); String denyAccess = (String)request.get("denyAccess"); String customMessage = (String)request.get("customMessage"); String presentationId = (String)request.get("presentationId"); String requestingUserId = (String)request.get("requestingUserId"); ResourceLoader rl = new ResourceLoader("org.theospi.portfolio.presentation.bundle.Messages"); String requestAccessMessage = null; if (requestAccess != null) { logger.debug("*** requesting access called!!!"); int i=1; while ((presentationId = (String)request.get("presentation" + i++)) != null) { if (customMessage == null) { customMessage = ""; } result = requestAccess(presentationId, customMessage); } } else { if (grantAccess != null) { logger.debug("*** grant access called!!!"); result = grantAccess(presentationId, requestingUserId); if (result) { requestAccessMessage = rl.getString("share_request.approved"); model.put("requestAccessMessage", requestAccessMessage); return new ModelAndView("list", model); } } else { if (denyAccess != null) { logger.debug("*** deny access called!!!"); result = denyAccess(presentationId, requestingUserId); if (result) { requestAccessMessage = rl.getString("share_request.denied"); model.put("requestAccessMessage", requestAccessMessage); return new ModelAndView("list", model); } } } } return new ModelAndView("success", model); } private boolean requestAccess(String presentationId, String personalMessage) { String from = null; String requesterName = null; String requesterUserId = null; String to = null; String emailBody = null; from = userDirectoryService.getCurrentUser().getEmail(); requesterName = userDirectoryService.getCurrentUser().getDisplayName(); requesterUserId = userDirectoryService.getCurrentUser().getEid(); Id id = getIdManager().getId(presentationId); Presentation presentation = getPresentationManager().getPresentation(id, false); try { to = (userDirectoryService.getUser(presentation.getOwner().getId().getValue())).getEmail(); } catch (UserNotDefinedException e) { e.printStackTrace(); return false; } ResourceLoader rl = new ResourceLoader("org.theospi.portfolio.presentation.bundle.Messages"); String emailTitle = rl.getString("share_request.email.title"); String emailClosingAndSignature = rl.getString("share_request.dialog.closing_and_signature"); String emailPersonalMessage = rl.getString("share_request.dialog.personal_message"); String presentationToolId = presentation.getToolId(); String siteId = presentation.getSiteId(); Site site = null; try { site = siteService.getSite(siteId); } catch (IdUnusedException e) { e.printStackTrace(); return false; } String emailMessageTextContent = rl.getFormattedMessage("share_request.dialog.message_text_content_alternate", new Object[]{requesterName, presentation.getName(), site.getTitle()}); String emailInstructionsHeader = rl.getFormattedMessage("share_request.email.sharing_instructions_header", new Object[]{requesterName}); String emailInstructions1 = rl.getFormattedMessage("share_request.email.sharing_instructions_1", new Object[]{presentation.getName()}); String emailInstructions2 = rl.getString("share_request.email.sharing_instructions_2"); String emailInstructions3 = rl.getString("share_request.email.sharing_instructions_3"); String emailInstructions4 = rl.getFormattedMessage("share_request.email.sharing_instructions_4", new Object[]{requesterUserId}); String emailInstructions5 = rl.getFormattedMessage("share_request.email.sharing_instructions_5", new Object[]{requesterName}); String emailInstructions6 = rl.getString("share_request.email.sharing_instructions_6"); String serverUrl = ServerConfigurationService.getServerUrl(); String shareUrl = serverUrl + "/portal/directtool/" + presentationToolId + "/sharePresentation.osp?1=1&id=" + presentationId; emailBody = "<p>" + emailMessageTextContent + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p>" + emailClosingAndSignature + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p style='font-weight:bold;'>" + emailPersonalMessage + ":</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p>" + personalMessage + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p style='font-weight:bold;'>" + emailInstructionsHeader + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<ol>\n"; emailBody = emailBody + "<li>" + emailInstructions1 + "<br/p>\n"; emailBody = emailBody + "<a href='" + shareUrl + "'>" + shareUrl + "</a></li>\n"; emailBody = emailBody + "<li>" + emailInstructions2 + "</li>\n"; emailBody = emailBody + "<li>" + emailInstructions3 + "</li>\n"; emailBody = emailBody + "<li>" + emailInstructions4 + "</li>\n"; emailBody = emailBody + "<li>" + emailInstructions5 + "</li>\n"; emailBody = emailBody + "<li>" + emailInstructions6 + "</li>\n"; emailBody = emailBody + "</ol>\n"; sendEmail(from, to, emailTitle, emailBody); return true; } private boolean requestAccessWithAcceptAndDenyLinks(String presentationId, String personalMessage) { String from = null; String requesterName = null; String to = null; String emailBody = null; from = userDirectoryService.getCurrentUser().getEmail(); requesterName = userDirectoryService.getCurrentUser().getDisplayName(); Id id = getIdManager().getId(presentationId); Presentation presentation = getPresentationManager().getPresentation(id, false); try { to = (userDirectoryService.getUser(presentation.getOwner().getId().getValue())).getEmail(); } catch (UserNotDefinedException e) { e.printStackTrace(); return false; } ResourceLoader rl = new ResourceLoader("org.theospi.portfolio.presentation.bundle.Messages"); String emailTitle = rl.getString("share_request.email.title"); String emailMessageTextContent = rl.getFormattedMessage("share_request.dialog.message_text_content", new Object[]{requesterName, presentation.getName()}); String emailAcceptRequest = rl.getString("share_request.dialog.accept_request"); String emailDenyRequest = rl.getString("share_request.dialog.deny_request"); String emailClosingAndSignature = rl.getString("share_request.dialog.closing_and_signature"); String emailPersonalMessage = rl.getString("share_request.dialog.personal_message"); String ownerMyWorkspaceSiteId = siteService.getUserSiteId(presentation.getOwner().getId().getValue()); Site site = null; try { site = siteService.getSite(ownerMyWorkspaceSiteId); } catch (IdUnusedException e) { e.printStackTrace(); return false; } ToolConfiguration tc = site.getToolForCommonId("osp.presentation"); // does the site have the presentation tool? if (tc == null) { return false; } String encodeToolState = null; String pageId = tc.getPageId(); String presentationToolId = tc.getId(); String serverUrl = ServerConfigurationService.getServerUrl(); String baseUrl = serverUrl + "/portal/site/" + ownerMyWorkspaceSiteId + "/page/" + pageId; encodeToolState = encodeToolState(presentationToolId, "/requestPresentation.osp?grantAccess=1&presentationId=" + presentationId + "&requestingUserId=" + userDirectoryService.getCurrentUser().getId()); String acceptLink = baseUrl + "?" + encodeToolState; encodeToolState = encodeToolState(presentationToolId, "/requestPresentation.osp?denyAccess=1&presentationId=" + presentationId + "&requestingUserId=" + userDirectoryService.getCurrentUser().getId()); String denyLink = baseUrl + "?" + encodeToolState; emailBody = "<p>" + emailMessageTextContent + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p><a href='" + acceptLink + "'>" + emailAcceptRequest + "</a> | " + "<a href='" + denyLink + "'>" + emailDenyRequest + "</a></p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p>" + emailClosingAndSignature + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p style='font-weight:bold;'>" + emailPersonalMessage + ":</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p>" + personalMessage + "</p>\n"; sendEmail(from, to, emailTitle, emailBody); return true; } private boolean grantAccess(String presentationId, String requestingUserId) { String from = null; String ownerName = null; String to = null; String emailBody = null; String emailTitle = null; from = userDirectoryService.getCurrentUser().getEmail(); ownerName = userDirectoryService.getCurrentUser().getDisplayName(); String currentUserId = userDirectoryService.getCurrentUser().getId(); Id id = getIdManager().getId(presentationId); Presentation presentation = getPresentationManager().getPresentation(id, false); try { to = userDirectoryService.getUser(requestingUserId).getEmail(); } catch (UserNotDefinedException e) { e.printStackTrace(); return false; } if (! currentUserId.equals(presentation.getOwner().getId().getValue())) { return false; } if (! getAuthzManager().isAuthorized(getAgentManager().getAgent(requestingUserId), PresentationFunctionConstants.VIEW_PRESENTATION, presentation.getId())) { getAuthzManager().createAuthorization(getAgentManager().getAgent(requestingUserId), PresentationFunctionConstants.VIEW_PRESENTATION, presentation.getId()); emailTitle = "Presentation Request Approved"; ResourceLoader rl = new ResourceLoader("org.theospi.portfolio.presentation.bundle.Messages"); String emailMessageTextContent = rl.getFormattedMessage("share_request.email_body.accepted", new Object[]{ownerName}); String emailClosingAndSignature = rl.getString("share_request.dialog.closing_and_signature"); String serverUrl = ServerConfigurationService.getServerUrl(); String presentationUrl = serverUrl + "/osp-presentation-tool/viewPresentation.osp?id=" + presentationId; emailBody = "<p>" + emailMessageTextContent + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p>" + presentation.getName() + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p><a href='" + presentationUrl + "'>" + presentationUrl + "</a></p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p>" + emailClosingAndSignature + "</p>\n"; // send approved email sendEmail(from, to, emailTitle, emailBody); } return true; } private boolean denyAccess(String presentationId, String requestingUserId) { String from = null; String ownerName = null; String to = null; String emailBody = null; String emailTitle = null; from = userDirectoryService.getCurrentUser().getEmail(); ownerName = userDirectoryService.getCurrentUser().getDisplayName(); String currentUserId = userDirectoryService.getCurrentUser().getId(); Id id = getIdManager().getId(presentationId); Presentation presentation = getPresentationManager().getPresentation(id, false); if (! currentUserId.equals(presentation.getOwner().getId().getValue())) { return false; } try { to = userDirectoryService.getUser(requestingUserId).getEmail(); } catch (UserNotDefinedException e) { e.printStackTrace(); return false; } emailTitle = "Presentation Request Denied"; ResourceLoader rl = new ResourceLoader("org.theospi.portfolio.presentation.bundle.Messages"); String emailMessageTextContent = rl.getFormattedMessage("share_request.email_body.denied", new Object[]{ownerName}); String emailClosingAndSignature = rl.getString("share_request.dialog.closing_and_signature"); emailBody = "<p>" + emailMessageTextContent + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p>" + presentation.getName() + "</p>\n"; emailBody = emailBody + "<p> </p>\n"; emailBody = emailBody + "<p>" + emailClosingAndSignature + "</p>\n"; // send deny email sendEmail(from, to, emailTitle, emailBody); return true; } /** * Convenience method for sending email messages * @param fromEmail * @param toEmail * @param subject * @param emailBody */ private void sendEmail(String fromEmail, String toEmail, String subject, String emailBody) { Collection<User> receivers = null; receivers = userDirectoryService.findUsersByEmail(toEmail); if (! receivers.isEmpty()) { emailService.sendToUsers(receivers, getHeaders(toEmail, fromEmail, subject), formatMessage(subject, emailBody)); } } /** helper methods for formatting the message */ private String formatMessage(String subject, String message) { StringBuilder sb = new StringBuilder(); sb.append(MIME_ADVISORY); sb.append(BOUNDARY_LINE); sb.append(PLAIN_TEXT_HEADERS); sb.append(Validator.escapeHtmlFormattedText(message)); sb.append(BOUNDARY_LINE); sb.append(HTML_HEADERS); sb.append(htmlPreamble(subject)); sb.append(message); sb.append(HTML_END); sb.append(TERMINATION_LINE); return sb.toString(); } private String htmlPreamble(String subject) { StringBuilder sb = new StringBuilder(); sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n"); sb.append("\"http://www.w3.org/TR/html4/loose.dtd\">\n"); sb.append("<html>\n"); sb.append("<head><title>"); sb.append(subject); sb.append("</title></head>\n"); sb.append("<body>\n"); return sb.toString(); } private List<String> getHeaders(String emailTo, String emailFrom, String subject){ List<String> headers = new ArrayList<String>(); headers.add("MIME-Version: 1.0"); headers.add("Content-Type: multipart/alternative; boundary=\""+MULTIPART_BOUNDARY+"\""); headers.add("Subject: " + subject); headers.add("From: " + emailFrom); if (StringUtils.isNotBlank(emailTo)) { headers.add("To: " + emailTo); } return headers; } private String encodeToolState(String presentationToolId, String urlStub) { String result = ""; Map<String, String[]> toolState = portalService.encodeToolState(presentationToolId, urlStub); Set<String> keySet = toolState.keySet(); for(String key: keySet) { System.out.println("key = " + key); result = result + key; String[] values = toolState.get(key); for(int i=0; i < values.length; i++) { System.out.println("value = " + values[i]); // result = result + "=" + Web.escapeUrl(values[i]); result = result + "=" + URLEncoder.encode(values[i]); } } return result; } public UserDirectoryService getUserDirectoryService() { return userDirectoryService; } public void setUserDirectoryService(UserDirectoryService userDirectoryService) { this.userDirectoryService = userDirectoryService; } public EmailService getEmailService() { return emailService; } public void setEmailService(EmailService emailService) { this.emailService = emailService; } public PortalService getPortalService() { return portalService; } public void setPortalService(PortalService portalService) { this.portalService = portalService; } public SiteService getSiteService() { return siteService; } public void setSiteService(SiteService siteService) { this.siteService = siteService; } }