/** * OpenKM, Open Document Management System (http://www.openkm.com) * Copyright (c) 2006-2011 Paco Avila & Josep Llort * * No bytes were intentionally harmed during the development of this application. * * 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; either version 2 of the License, or * (at your option) any later version. * * 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. */ package com.openkm.module.base; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.ValueFormatException; import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.nodetype.NoSuchNodeTypeException; import javax.jcr.version.VersionException; import org.apache.jackrabbit.core.NodeImpl; import org.apache.jackrabbit.core.SessionImpl; import org.apache.jackrabbit.core.security.AccessManager; import org.apache.jackrabbit.spi.Path; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.openkm.bean.Document; import com.openkm.bean.Mail; import com.openkm.bean.Permission; import com.openkm.core.Config; import com.openkm.core.DatabaseException; import com.openkm.core.UserQuotaExceededException; import com.openkm.jcr.JCRUtils; public class BaseMailModule { private static Logger log = LoggerFactory.getLogger(BaseMailModule.class); /** * Create a new mail */ public static Node create(Session session, Node parentNode, String name, long size, String from, String[] reply, String[] to, String[] cc, String[] bcc, Calendar sentDate, Calendar receivedDate, String subject, String content, String mimeType) throws javax.jcr.ItemExistsException, javax.jcr.PathNotFoundException, NoSuchNodeTypeException, javax.jcr.lock.LockException, VersionException, ConstraintViolationException, javax.jcr.RepositoryException, IOException, DatabaseException, UserQuotaExceededException { // Create and add a new mail node Node mailNode = parentNode.addNode(name, Mail.TYPE); mailNode.setProperty(Mail.SIZE, size); mailNode.setProperty(Mail.FROM, from); mailNode.setProperty(Mail.REPLY, reply); mailNode.setProperty(Mail.TO, to); mailNode.setProperty(Mail.CC, cc); mailNode.setProperty(Mail.BCC, bcc); mailNode.setProperty(Mail.SENT_DATE, sentDate); mailNode.setProperty(Mail.RECEIVED_DATE, receivedDate); mailNode.setProperty(Mail.SUBJECT, subject); mailNode.setProperty(Mail.CONTENT, content); mailNode.setProperty(Mail.MIME_TYPE, mimeType); // Get parent node auth info Value[] usersReadParent = parentNode.getProperty(Permission.USERS_READ).getValues(); String[] usersRead = JCRUtils.usrValue2String(usersReadParent, session.getUserID()); Value[] usersWriteParent = parentNode.getProperty(Permission.USERS_WRITE).getValues(); String[] usersWrite = JCRUtils.usrValue2String(usersWriteParent, session.getUserID()); Value[] usersDeleteParent = parentNode.getProperty(Permission.USERS_DELETE).getValues(); String[] usersDelete = JCRUtils.usrValue2String(usersDeleteParent, session.getUserID()); Value[] usersSecurityParent = parentNode.getProperty(Permission.USERS_SECURITY).getValues(); String[] usersSecurity = JCRUtils.usrValue2String(usersSecurityParent, session.getUserID()); Value[] rolesReadParent = parentNode.getProperty(Permission.ROLES_READ).getValues(); String[] rolesRead = JCRUtils.rolValue2String(rolesReadParent); Value[] rolesWriteParent = parentNode.getProperty(Permission.ROLES_WRITE).getValues(); String[] rolesWrite = JCRUtils.rolValue2String(rolesWriteParent); Value[] rolesDeleteParent = parentNode.getProperty(Permission.ROLES_DELETE).getValues(); String[] rolesDelete = JCRUtils.rolValue2String(rolesDeleteParent); Value[] rolesSecurityParent = parentNode.getProperty(Permission.ROLES_SECURITY).getValues(); String[] rolesSecurity = JCRUtils.rolValue2String(rolesSecurityParent); // Set auth info mailNode.setProperty(Permission.USERS_READ, usersRead); mailNode.setProperty(Permission.USERS_WRITE, usersWrite); mailNode.setProperty(Permission.USERS_DELETE, usersDelete); mailNode.setProperty(Permission.USERS_SECURITY, usersSecurity); mailNode.setProperty(Permission.ROLES_READ, rolesRead); mailNode.setProperty(Permission.ROLES_WRITE, rolesWrite); mailNode.setProperty(Permission.ROLES_DELETE, rolesDelete); mailNode.setProperty(Permission.ROLES_SECURITY, rolesSecurity); parentNode.save(); return mailNode; } /** * Get mail properties */ public static Mail getProperties(Session session, Node mailNode) throws javax.jcr.PathNotFoundException, javax.jcr.RepositoryException { log.debug("getProperties({}, {})", session, mailNode); Mail mail = new Mail(); // Properties Value[] replyValues = mailNode.getProperty(Mail.REPLY).getValues(); String[] reply = JCRUtils.value2String(replyValues); Value[] toValues = mailNode.getProperty(Mail.TO).getValues(); String[] to = JCRUtils.value2String(toValues); Value[] ccValues = mailNode.getProperty(Mail.CC).getValues(); String[] cc = JCRUtils.value2String(ccValues); Value[] bccValues = mailNode.getProperty(Mail.BCC).getValues(); String[] bcc = JCRUtils.value2String(bccValues); mail.setPath(mailNode.getPath()); mail.setUuid(mailNode.getUUID()); mail.setReply(reply); mail.setTo(to); mail.setCc(cc); mail.setBcc(bcc); mail.setFrom(mailNode.getProperty(Mail.FROM).getString()); mail.setSize(mailNode.getProperty(Mail.SIZE).getLong()); mail.setSentDate(mailNode.getProperty(Mail.SENT_DATE).getDate()); mail.setReceivedDate(mailNode.getProperty(Mail.RECEIVED_DATE).getDate()); mail.setSubject(mailNode.getProperty(Mail.SUBJECT).getString()); mail.setContent(mailNode.getProperty(Mail.CONTENT).getString()); mail.setMimeType(mailNode.getProperty(Mail.MIME_TYPE).getString()); // Get attachments ArrayList<Document> attachments = new ArrayList<Document>(); for (NodeIterator nit = mailNode.getNodes(); nit.hasNext(); ) { Node node = nit.nextNode(); if (node.isNodeType(Document.TYPE)) { Document attachment = BaseDocumentModule.getProperties(session, node); attachments.add(attachment); } } mail.setAttachments(attachments); // Get permissions if (Config.SYSTEM_READONLY) { mail.setPermissions(Permission.NONE); } else { AccessManager am = ((SessionImpl) session).getAccessManager(); Path path = ((NodeImpl)mailNode).getPrimaryPath(); //Path path = ((SessionImpl)session).getHierarchyManager().getPath(((NodeImpl)folderNode).getId()); if (am.isGranted(path, org.apache.jackrabbit.core.security.authorization.Permission.READ)) { mail.setPermissions(Permission.READ); } if (am.isGranted(path, org.apache.jackrabbit.core.security.authorization.Permission.ADD_NODE)) { mail.setPermissions((byte) (mail.getPermissions() | Permission.WRITE)); } if (am.isGranted(path, org.apache.jackrabbit.core.security.authorization.Permission.REMOVE_NODE)) { mail.setPermissions((byte) (mail.getPermissions() | Permission.DELETE)); } if (am.isGranted(path, org.apache.jackrabbit.core.security.authorization.Permission.MODIFY_AC)) { mail.setPermissions((byte) (mail.getPermissions() | Permission.SECURITY)); } } log.debug("Permisos: {} => {}", mailNode.getPath(), mail.getPermissions()); log.debug("getProperties[session]: {}", mail); return mail; } /** * Copy recursively */ public static void copy(Session session, Node srcMailNode, Node dstFolderNode) throws ValueFormatException, javax.jcr.PathNotFoundException, javax.jcr.RepositoryException, IOException, DatabaseException, UserQuotaExceededException { log.debug("copy({}, {}, {})", new Object[] { session, srcMailNode, dstFolderNode }); String name = srcMailNode.getName(); long size = srcMailNode.getProperty(Mail.SIZE).getLong(); String from = srcMailNode.getProperty(Mail.FROM).getString(); String[] reply = JCRUtils.value2String(srcMailNode.getProperty(Mail.REPLY).getValues()); String[] to = JCRUtils.value2String(srcMailNode.getProperty(Mail.TO).getValues()); String[] cc = JCRUtils.value2String(srcMailNode.getProperty(Mail.CC).getValues()); String[] bcc = JCRUtils.value2String(srcMailNode.getProperty(Mail.BCC).getValues()); Calendar sentDate = srcMailNode.getProperty(Mail.SENT_DATE).getDate(); Calendar receivedDate = srcMailNode.getProperty(Mail.RECEIVED_DATE).getDate(); String subject = srcMailNode.getProperty(Mail.SUBJECT).getString(); String content = srcMailNode.getProperty(Mail.CONTENT).getString(); String mimeType = srcMailNode.getProperty(Mail.MIME_TYPE).getString(); Node mNode = BaseMailModule.create(session, dstFolderNode, name, size, from, reply, to, cc, bcc, sentDate, receivedDate, subject, content, mimeType); // Get attachments for (NodeIterator nit = srcMailNode.getNodes(); nit.hasNext(); ) { Node node = nit.nextNode(); if (node.isNodeType(Document.TYPE)) { BaseDocumentModule.copy(session, node, mNode); } } log.debug("copy: void"); } }