/* * LinShare is an open source filesharing software, part of the LinPKI software * suite, developed by Linagora. * * Copyright (C) 2015 LINAGORA * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version, provided you comply with the Additional Terms applicable for * LinShare software by Linagora pursuant to Section 7 of the GNU Affero General * Public License, subsections (b), (c), and (e), pursuant to which you must * notably (i) retain the display of the “LinShare™” trademark/logo at the top * of the interface window, the display of the “You are using the Open Source * and free version of LinShare™, powered by Linagora © 2009–2015. Contribute to * Linshare R&D by subscribing to an Enterprise offer!” infobox and in the * e-mails sent with the Program, (ii) retain all hypertext links between * LinShare and linshare.org, between linagora.com and Linagora, and (iii) * refrain from infringing Linagora intellectual property rights over its * trademarks and commercial brands. Other Additional Terms apply, see * <http://www.linagora.com/licenses/> for more details. * * 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 Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License and * its applicable Additional Terms for LinShare along with this program. If not, * see <http://www.gnu.org/licenses/> for the GNU Affero General Public License * version 3 and <http://www.linagora.com/licenses/> for the Additional Terms * applicable to LinShare software. */ package org.linagora.linshare.core.service.impl; import java.util.List; import org.linagora.linshare.core.business.service.DomainBusinessService; import org.linagora.linshare.core.business.service.DomainPermissionBusinessService; import org.linagora.linshare.core.business.service.MailConfigBusinessService; import org.linagora.linshare.core.business.service.MailContentBusinessService; import org.linagora.linshare.core.business.service.MailFooterBusinessService; import org.linagora.linshare.core.business.service.MailLayoutBusinessService; import org.linagora.linshare.core.domain.constants.Language; import org.linagora.linshare.core.domain.constants.MailContentType; import org.linagora.linshare.core.domain.entities.AbstractDomain; import org.linagora.linshare.core.domain.entities.MailConfig; import org.linagora.linshare.core.domain.entities.MailContent; import org.linagora.linshare.core.domain.entities.MailContentLang; import org.linagora.linshare.core.domain.entities.MailFooter; import org.linagora.linshare.core.domain.entities.MailFooterLang; import org.linagora.linshare.core.domain.entities.MailLayout; import org.linagora.linshare.core.domain.entities.User; import org.linagora.linshare.core.exception.BusinessErrorCode; import org.linagora.linshare.core.exception.BusinessException; import org.linagora.linshare.core.service.MailConfigService; import com.google.common.collect.Lists; public class MailConfigServiceImpl implements MailConfigService { private final DomainBusinessService domainBusinessService; private final MailConfigBusinessService mailConfigBusinessService; private final MailContentBusinessService mailContentBusinessService; private final MailFooterBusinessService mailFooterBusinessService; private final MailLayoutBusinessService mailLayoutBusinessService; private final DomainPermissionBusinessService permissionService; public MailConfigServiceImpl( final DomainBusinessService domainBusinessService, final MailConfigBusinessService mailConfigBusinessService, final MailContentBusinessService mailContentBusinessService, final MailFooterBusinessService mailFooterBusinessService, final MailLayoutBusinessService mailLayoutBusinessService, final DomainPermissionBusinessService domainPermissionBusinessService) { super(); this.domainBusinessService = domainBusinessService; this.mailConfigBusinessService = mailConfigBusinessService; this.mailContentBusinessService = mailContentBusinessService; this.mailFooterBusinessService = mailFooterBusinessService; this.mailLayoutBusinessService = mailLayoutBusinessService; this.permissionService = domainPermissionBusinessService; } @Override public List<MailConfig> findAllConfigs(User actor, String domainId) throws BusinessException { List<MailConfig> configs = Lists.newArrayList(); for (AbstractDomain d : getParentDomains(domainId)) { if (d.getUuid().equals(actor.getDomainId())) { configs.addAll(d.getMailConfigs()); } else { for (MailConfig c : d.getMailConfigs()) { if (c.isVisible()) { configs.add(c); } } } } return configs; } @Override public MailConfig findConfigByUuid(User actor, String uuid) throws BusinessException { MailConfig ret = mailConfigBusinessService.findByUuid(uuid); if (ret != null && !hasRights(actor, ret)) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot see this mail config : " + ret.getUuid()); return ret; } @Override public MailConfig createConfig(User actor, MailConfig config) throws BusinessException { if (!permissionService.isAdminforThisDomain(actor, config.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot create a mail config in this domain " + actor.getDomainId()); return mailConfigBusinessService.create(config.getDomain(), config); } @Override public MailConfig updateConfig(User actor, MailConfig config) throws BusinessException { if (!permissionService.isAdminforThisDomain(actor, config.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail config in this domain " + actor.getDomainId()); return mailConfigBusinessService.update(config); } @Override public MailConfig deleteConfig(User actor, String uuid) throws BusinessException { MailConfig config = mailConfigBusinessService.findByUuid(uuid); if (!permissionService.isAdminforThisDomain(actor, config.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot delete a mail config in this domain " + actor.getDomainId()); mailConfigBusinessService.delete(config); return config; } @Override public List<MailContent> findAllContents(User actor, String domainId) throws BusinessException { List<MailContent> contents = Lists.newArrayList(); for (AbstractDomain d : getParentDomains(domainId)) { if (d.getUuid().equals(actor.getDomainId())) { contents.addAll(d.getMailContents()); } else { for (MailContent c : d.getMailContents()) { if (c.isVisible()) { contents.add(c); } } } } return contents; } @Override public MailContent findContentByUuid(User actor, String uuid) throws BusinessException { MailContent ret = mailContentBusinessService.findByUuid(uuid); if (ret != null && !hasRights(actor, ret)) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot see this mail content : " + ret.getUuid()); return ret; } @Override public MailContent findContentFromDomain(User actor, String domainId, Language lang, MailContentType type) throws BusinessException { MailContent ret = mailContentBusinessService.find(domainId, lang, type); if (ret != null && !hasRights(actor, ret)) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot see this mail content : " + ret.getUuid()); return ret; } @Override public MailContent createContent(User actor, MailContent content) throws BusinessException { if (!permissionService.isAdminforThisDomain(actor, content.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot create a mail content in this domain " + actor.getDomainId()); return mailContentBusinessService.create(content.getDomain(), content); } @Override public MailContent updateContent(User actor, MailContent content) throws BusinessException { if (!permissionService.isAdminforThisDomain(actor, content.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail content in this domain " + actor.getDomainId()); return mailContentBusinessService.update(content); } @Override public MailContent deleteContent(User actor, String uuid) throws BusinessException { MailContent val = mailContentBusinessService.findByUuid(uuid); if (!permissionService.isAdminforThisDomain(actor, val.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot delete a mail content in this domain " + actor.getDomainId()); mailContentBusinessService.delete(val); return val; } @Override public MailContentLang findContentLangByUuid(User actor, String uuid) throws BusinessException { MailContentLang ret = mailConfigBusinessService .findContentLangByUuid(uuid); if (ret != null && !hasRights(actor, ret.getMailConfig())) { throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot see this mail config : " + ret.getMailConfig().getUuid()); } return ret; } @Override public MailContentLang createContentLang(User actor, MailContentLang contentLang) throws BusinessException { MailConfig config = contentLang.getMailConfig(); if (!permissionService.isAdminforThisDomain(actor, config.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail config in this domain " + actor.getDomainId()); return mailConfigBusinessService.createContentLang(contentLang); } @Override public MailContentLang updateContentLang(User actor, MailContentLang contentLang) throws BusinessException { MailConfig config = contentLang.getMailConfig(); if (!permissionService.isAdminforThisDomain(actor, config.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail config in this domain " + actor.getDomainId()); return mailConfigBusinessService.updateContentLang(contentLang); } @Override public void deleteContentLang(User actor, String uuid) throws BusinessException { try { MailContentLang contentLang = findContentLangByUuid(actor, uuid); mailConfigBusinessService.deleteContentLang(contentLang); } catch (BusinessException e) { throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail config in this domain " + actor.getDomainId()); } } @Override public List<MailFooter> findAllFooters(User actor, String domainId) throws BusinessException { List<MailFooter> footers = Lists.newArrayList(); for (AbstractDomain d : getParentDomains(domainId)) { if (d.getUuid().equals(actor.getDomainId())) { footers.addAll(d.getMailFooters()); } else { for (MailFooter c : d.getMailFooters()) { if (c.getVisible()) { footers.add(c); } } } } return footers; } @Override public MailFooter findFooterByUuid(User actor, String uuid) throws BusinessException { MailFooter ret = mailFooterBusinessService.findByUuid(uuid); if (ret != null && !hasRights(actor, ret)) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot see this mail footer : " + ret.getUuid()); return ret; } @Override public MailFooter createFooter(User actor, MailFooter footer) throws BusinessException { if (!permissionService.isAdminforThisDomain(actor, footer.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot create a mail footer in this domain " + actor.getDomainId()); return mailFooterBusinessService.create(footer.getDomain(), footer); } @Override public MailFooter updateFooter(User actor, MailFooter footer) throws BusinessException { if (!permissionService.isAdminforThisDomain(actor, footer.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail footer in this domain " + actor.getDomainId()); return mailFooterBusinessService.update(footer); } @Override public MailFooter deleteFooter(User actor, String uuid) throws BusinessException { MailFooter val = mailFooterBusinessService.findByUuid(uuid); if (!permissionService.isAdminforThisDomain(actor, val.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot delete a mail footer in this domain " + actor.getDomainId()); mailFooterBusinessService.delete(val); return val; } @Override public MailFooterLang findFooterLangByUuid(User actor, String uuid) throws BusinessException { MailFooterLang ret = mailConfigBusinessService .findFooterLangByUuid(uuid); if (ret != null && !hasRights(actor, ret.getMailConfig())) { throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot see this mail config : " + ret.getMailConfig().getUuid()); } return ret; } @Override public MailFooterLang createFooterLang(User actor, MailFooterLang footerLang) throws BusinessException { MailConfig config = footerLang.getMailConfig(); if (!permissionService.isAdminforThisDomain(actor, config.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail config in this domain " + actor.getDomainId()); return mailConfigBusinessService.createFooterLang(footerLang); } @Override public MailFooterLang updateFooterLang(User actor, MailFooterLang footerLang) throws BusinessException { MailConfig config = footerLang.getMailConfig(); if (!permissionService.isAdminforThisDomain(actor, config.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail config in this domain " + actor.getDomainId()); return mailConfigBusinessService.updateFooterLang(footerLang); } @Override public void deleteFooterLang(User actor, String uuid) throws BusinessException { try { MailFooterLang footerLang = findFooterLangByUuid(actor, uuid); mailConfigBusinessService.deleteFooterLang(footerLang); } catch (BusinessException e) { throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail config in this domain " + actor.getDomainId()); } } @Override public List<MailLayout> findAllLayouts(User actor, String domainId) throws BusinessException { List<MailLayout> layouts = Lists.newArrayList(); for (AbstractDomain d : getParentDomains(domainId)) { if (d.getUuid().equals(actor.getDomainId())) { layouts.addAll(d.getMailLayouts()); } else { for (MailLayout c : d.getMailLayouts()) { if (c.isVisible()) { layouts.add(c); } } } } return layouts; } @Override public MailLayout findLayoutByUuid(User actor, String uuid) throws BusinessException { MailLayout ret = mailLayoutBusinessService.findByUuid(uuid); if (ret != null && !hasRights(actor, ret)) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot see this mail layout : " + ret.getUuid()); return ret; } @Override public MailLayout createLayout(User actor, MailLayout layout) throws BusinessException { if (!permissionService.isAdminforThisDomain(actor, layout.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot create a mail layout in this domain " + actor.getDomainId()); return mailLayoutBusinessService.create(layout.getDomain(), layout); } @Override public MailLayout updateLayout(User actor, MailLayout layout) throws BusinessException { if (!permissionService.isAdminforThisDomain(actor, layout.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot update a mail layout in this domain " + actor.getDomainId()); return mailLayoutBusinessService.update(layout); } @Override public MailLayout deleteLayout(User actor, String uuid) throws BusinessException { MailLayout val = mailLayoutBusinessService.findByUuid(uuid); if (!permissionService.isAdminforThisDomain(actor, val.getDomain())) throw new BusinessException(BusinessErrorCode.FORBIDDEN, "Actor " + actor + " cannot delete a mail layout in this domain " + actor.getDomainId()); mailLayoutBusinessService.delete(val); return val; } @Override public boolean hasRights(User actor, MailConfig config) { // if (!permissionService.isAdminforThisDomain(actor, config.getDomain())) { // if (config.isVisible()) { // return isInParentDomains(actor.getDomain(), config.getDomain()); // } else { // return actor.getDomain().equals(config.getDomain()); // } // } return true; } @Override public boolean hasRights(User actor, MailContent content) { return true; // if (content.isVisible()) { // return isInParentDomains(actor.getDomain(), content.getDomain()); // } else { // return actor.getDomain().equals(content.getDomain()); // } } @Override public boolean hasRights(User actor, MailFooter footer) { return true; // if (footer.getVisible()) { // return isInParentDomains(actor.getDomain(), footer.getDomain()); // } else { // return actor.getDomain().equals(footer.getDomain()); // } } @Override public boolean hasRights(User actor, MailLayout layout) { return true; // if (layout.isVisible()) { // return isInParentDomains(actor.getDomain(), layout.getDomain()); // } else { // return actor.getDomain().equals(layout.getDomain()); // } } /* * Helpers */ private List<AbstractDomain> getParentDomains(String id) throws BusinessException { AbstractDomain domain = domainBusinessService.find(id); if (domain == null) throw new BusinessException(BusinessErrorCode.DOMAIN_DO_NOT_EXIST, "Invalid domain identifier."); return getParentDomains(domain); } private List<AbstractDomain> getParentDomains(AbstractDomain src) { List<AbstractDomain> parents = Lists.newArrayList(); AbstractDomain parent = src; while (parent != null) { parents.add(parent); parent = parent.getParentDomain(); } return parents; } }