From ba47af3186237930f011585396b6fd795b5df79c Mon Sep 17 00:00:00 2001 From: ayyoob Date: Wed, 18 May 2016 19:33:04 +0530 Subject: [PATCH 1/2] added api application registration filter --- .../pom.xml | 10 ++ ...ApiApplicationRegistrationServiceImpl.java | 5 +- .../api/filter/ApiPermissionFilter.java | 118 ++++++++++++++++++ .../extension/api/filter/Permission.java | 60 +++++++++ .../api/filter/PermissionConfiguration.java | 41 ++++++ .../extension/api/util/APIUtil.java | 13 ++ .../src/main/webapp/META-INF/permissions.xml | 6 +- .../src/main/webapp/WEB-INF/web.xml | 10 ++ .../jaggeryapps/devicemgt/app/modules/init.js | 2 +- 9 files changed, 259 insertions(+), 6 deletions(-) create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/ApiPermissionFilter.java create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/Permission.java create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/PermissionConfiguration.java diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml index b1c7c57bcbd..14379e2e3b2 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml @@ -157,6 +157,16 @@ org.wso2.carbon.apimgt.application.extension provided + + org.wso2.carbon + org.wso2.carbon.user.core + provided + + + org.wso2.carbon + org.wso2.carbon.user.api + provided + diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/ApiApplicationRegistrationServiceImpl.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/ApiApplicationRegistrationServiceImpl.java index 7c24b40ffdd..cc0bb20a9f7 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/ApiApplicationRegistrationServiceImpl.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/ApiApplicationRegistrationServiceImpl.java @@ -59,6 +59,7 @@ public class ApiApplicationRegistrationServiceImpl implements ApiApplicationRegi } String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm() .getRealmConfiguration().getAdminUserName(); + username = username + "@" + APIUtil.getTenantDomainOftheUser(); PrivilegedCarbonContext.getThreadLocalCarbonContext().setUsername(username); APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService(); ApiApplicationKey apiApplicationKey = apiManagementProviderService.generateAndRetrieveApplicationKeys( @@ -81,7 +82,7 @@ public class ApiApplicationRegistrationServiceImpl implements ApiApplicationRegi @POST public Response register(RegistrationProfile registrationProfile) { try { - String username = APIUtil.getAuthenticatedUser(); + String username = APIUtil.getAuthenticatedUser() + "@" + APIUtil.getTenantDomainOftheUser(); APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService(); if (registrationProfile.isMappingAnExistingOAuthApp()) { JSONObject jsonStringObject = new JSONObject(); @@ -116,7 +117,7 @@ public class ApiApplicationRegistrationServiceImpl implements ApiApplicationRegi @DELETE public Response unregister(@QueryParam("applicationName") String applicationName) { try { - String username = APIUtil.getAuthenticatedUser(); + String username = APIUtil.getAuthenticatedUser() + "@" + APIUtil.getTenantDomainOftheUser(); APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService(); apiManagementProviderService.removeAPIApplication(applicationName, username); return Response.status(Response.Status.ACCEPTED).build(); diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/ApiPermissionFilter.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/ApiPermissionFilter.java new file mode 100644 index 00000000000..1395566b70b --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/ApiPermissionFilter.java @@ -0,0 +1,118 @@ +package org.wso2.carbon.apimgt.application.extension.api.filter; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.apimgt.application.extension.api.util.APIUtil; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.user.api.UserRealm; +import org.wso2.carbon.user.api.UserStoreException; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** + * this filter check for permission for the request + */ +public class ApiPermissionFilter implements Filter{ + private static final Log log = LogFactory.getLog(ApiPermissionFilter.class); + private static final String UI_EXECUTE = "ui.execute"; + private static final String PERMISSION_CONFIG_PATH = File.separator + "META-INF" + File.separator + + "permissions.xml"; + private static final String PERMISSION_PREFIX = "/permission/admin"; + private static List permissions; + private static final String WEBAPP_CONTEXT = "/api-application-registration"; + @Override + public void init(FilterConfig filterConfig) throws ServletException { + InputStream permissionStream = filterConfig.getServletContext().getResourceAsStream(PERMISSION_CONFIG_PATH); + if (permissionStream != null) { + try { + JAXBContext cdmContext = JAXBContext.newInstance(PermissionConfiguration.class); + Unmarshaller unmarshaller = cdmContext.createUnmarshaller(); + PermissionConfiguration permissionConfiguration = (PermissionConfiguration) + unmarshaller.unmarshal(permissionStream); + permissions = permissionConfiguration.getPermissions(); + } catch (JAXBException e) { + log.error("invalid permissions.xml", e); + } + + } + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + if (servletRequest instanceof HttpServletRequest) { + String uri = ((HttpServletRequest)servletRequest).getRequestURI(); + boolean status = false; + if (uri.contains("register/tenants")) { + String urlPermission = getPermission("/register/tenants/*"); + if (urlPermission != null) { + status = isUserAuthorized(PERMISSION_PREFIX + urlPermission, UI_EXECUTE); + } + } else { + String urlPermission = getPermission(uri); + if (urlPermission != null) { + status = isUserAuthorized(PERMISSION_PREFIX + urlPermission, UI_EXECUTE); + } + } + if (status) { + filterChain.doFilter(servletRequest, servletResponse); + } else { + HttpServletResponse res = (HttpServletResponse) servletResponse; + res.setStatus(HttpServletResponse.SC_FORBIDDEN); + return; + } + } else { + HttpServletResponse res = (HttpServletResponse) servletResponse; + res.setStatus(HttpServletResponse.SC_FORBIDDEN); + return; + } + } + + @Override + public void destroy() { + //do nothing + } + + private static String getPermission(String url) { + if (permissions != null) { + for (int i = 0; i < permissions.size(); i++) { + Permission permission = permissions.get(i); + if ((WEBAPP_CONTEXT + permission.getUrl()).equals(url)) { + return permission.getPath(); + } + } + } + return null; + } + + /** + * Check whether the client is authorized with the given permission and action. + * @param permission Carbon permission that requires for the use + * @param action Carbon permission action that requires for the given permission. + * @return boolean - true if user is authorized else return false. + */ + private boolean isUserAuthorized(String permission, String action) { + PrivilegedCarbonContext context = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + String username = context.getUsername(); + try { + UserRealm userRealm = APIUtil.getRealmService().getTenantUserRealm(PrivilegedCarbonContext + .getThreadLocalCarbonContext().getTenantId()); + return userRealm.getAuthorizationManager().isUserAuthorized(username, permission, action); + } catch (UserStoreException e) { + String errorMsg = String.format("Unable to authorize the user : %s", username, e); + log.error(errorMsg, e); + return false; + } + } + +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/Permission.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/Permission.java new file mode 100644 index 00000000000..069e94473cd --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/Permission.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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.wso2.carbon.apimgt.application.extension.api.filter; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * This class represents the information related to permission. + */ +@XmlRootElement (name = "Permission") +public class Permission { + + private String path; // permission string + private String url; // url of the resource + private String method; // http method + + public String getPath() { + return path; + } + + @XmlElement (name = "path", required = true) + public void setPath(String path) { + this.path = path; + } + + public String getUrl() { + return url; + } + + @XmlElement (name = "url", required = true) + public void setUrl(String url) { + this.url = url; + } + + public String getMethod() { + return method; + } + + @XmlElement (name = "method", required = true) + public void setMethod(String method) { + this.method = method; + } +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/PermissionConfiguration.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/PermissionConfiguration.java new file mode 100644 index 00000000000..22a416873aa --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/PermissionConfiguration.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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.wso2.carbon.apimgt.application.extension.api.filter; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +/** + * This class represents the information related to permission configuration. + */ +@XmlRootElement (name = "PermissionConfiguration") +public class PermissionConfiguration { + + private List permissions; + + public List getPermissions() { + return permissions; + } + + @XmlElement (name = "Permission", required = true) + public void setPermissions(List permissions) { + this.permissions = permissions; + } +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java index b15bcd1944f..299ff01c3df 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.apimgt.application.extension.APIManagementProviderService; import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.user.core.service.RealmService; /** * This class provides utility functions used by REST-API. @@ -57,4 +58,16 @@ public class APIUtil { } return apiManagementProviderService; } + + public static RealmService getRealmService() { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + RealmService realmService = + (RealmService) ctx.getOSGiService(RealmService.class, null); + if (realmService == null) { + String msg = "Device Management service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + return realmService; + } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/META-INF/permissions.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/META-INF/permissions.xml index 213141cc67b..1feabf39250 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/META-INF/permissions.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/META-INF/permissions.xml @@ -30,21 +30,21 @@ Register tenant specific application - /device-mgt + /device-mgt/admin /register/tenants/* POST super_admin_user Register application - /device-mgt/api/application/add + /device-mgt/user/api/application /register POST application_user Delete application - /device-mgt/api/application/remove + /device-mgt/user/api/application /unregister DELETE application_user diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/WEB-INF/web.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/WEB-INF/web.xml index 7aaaf3002db..549bf4c1bd4 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/WEB-INF/web.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/WEB-INF/web.xml @@ -49,4 +49,14 @@ managed-api-enabled false + + + ApiPermissionFilter + org.wso2.carbon.apimgt.application.extension.api.filter.ApiPermissionFilter + + + ApiPermissionFilter + /* + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/init.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/init.js index 9474dd26976..8d2b0c197f1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/init.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/init.js @@ -29,6 +29,6 @@ var utility = require("/app/modules/utility.js")["utility"]; var permissions = { '/permission/admin/device-mgt/user': ['ui.execute'], - '/permission/admin/device-mgt/api/application': ['ui.execute'] + '/permission/admin/manage/api/subscribe': ['ui.execute'] }; userModule.addRole("internal/devicemgt-user", ["admin"], permissions); From 7eb111078a23f372fe25b59911dffffe1981aa40 Mon Sep 17 00:00:00 2001 From: charitha Date: Thu, 19 May 2016 00:07:40 +0530 Subject: [PATCH 2/2] Fix for https://wso2.org/jira/browse/IOTS-110 MT issue --- .../core/RegistryBasedResourceLoader.java | 8 +- ...EmailSenderAxis2ConfigContextObserver.java | 61 +------------ .../internal/EmailSenderServiceComponent.java | 73 +--------------- .../sender/core/internal/EmailUtils.java | 87 +++++++++++++++++++ 4 files changed, 94 insertions(+), 135 deletions(-) create mode 100644 components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailUtils.java diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/RegistryBasedResourceLoader.java b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/RegistryBasedResourceLoader.java index 7ba350e07c9..8b12607fc61 100644 --- a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/RegistryBasedResourceLoader.java +++ b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/RegistryBasedResourceLoader.java @@ -27,7 +27,7 @@ import org.wso2.carbon.context.RegistryType; import org.wso2.carbon.registry.api.Registry; import org.wso2.carbon.registry.api.RegistryException; -import java.io.*; +import java.io.InputStream; public class RegistryBasedResourceLoader extends ResourceLoader { @@ -46,12 +46,12 @@ public class RegistryBasedResourceLoader extends ResourceLoader { if (registry == null) { throw new IllegalStateException("No valid registry instance is attached to the current carbon context"); } - if (!registry.resourceExists(EMAIL_CONFIG_BASE_LOCATION + "/" + name + ".vm")) { + if (!registry.resourceExists(EMAIL_CONFIG_BASE_LOCATION + "/" + name)) { throw new ResourceNotFoundException("Resource '" + name + "' does not exist"); } org.wso2.carbon.registry.api.Resource resource = - registry.get(EMAIL_CONFIG_BASE_LOCATION + "/" + name + ".vm"); - + registry.get(EMAIL_CONFIG_BASE_LOCATION + "/" + name); + resource.setMediaType("text/plain"); return resource.getContentStream(); } catch (RegistryException e) { throw new ResourceNotFoundException("Error occurred while retrieving resource", e); diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderAxis2ConfigContextObserver.java b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderAxis2ConfigContextObserver.java index 4bd0cc5ccac..0a4cea270ca 100644 --- a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderAxis2ConfigContextObserver.java +++ b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderAxis2ConfigContextObserver.java @@ -21,22 +21,11 @@ package org.wso2.carbon.email.sender.core.internal; import org.apache.axis2.context.ConfigurationContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.context.CarbonContext; -import org.wso2.carbon.context.RegistryType; import org.wso2.carbon.email.sender.core.EmailSenderConfigurationFailedException; -import org.wso2.carbon.registry.api.Collection; -import org.wso2.carbon.registry.api.Registry; -import org.wso2.carbon.registry.api.RegistryException; -import org.wso2.carbon.registry.api.Resource; import org.wso2.carbon.utils.Axis2ConfigurationContextObserver; -import org.wso2.carbon.utils.CarbonUtils; -import java.io.File; -import java.io.FilenameFilter; +class EmailSenderAxis2ConfigContextObserver implements Axis2ConfigurationContextObserver { -public class EmailSenderAxis2ConfigContextObserver implements Axis2ConfigurationContextObserver { - - private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "email-templates"; private static final Log log = LogFactory.getLog(EmailSenderAxis2ConfigContextObserver.class); @Override @@ -47,7 +36,7 @@ public class EmailSenderAxis2ConfigContextObserver implements Axis2Configuration @Override public void createdConfigurationContext(ConfigurationContext configurationContext) { try { - this.setupEmailTemplates(); + EmailUtils.setupEmailTemplates(); } catch (EmailSenderConfigurationFailedException e) { log.error("Error occurred while setting up email templates", e); } @@ -63,50 +52,4 @@ public class EmailSenderAxis2ConfigContextObserver implements Axis2Configuration } - private void setupEmailTemplates() throws EmailSenderConfigurationFailedException { - File templateDir = - new File(CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + "resources" - + File.separator + "email-templates"); - if (!templateDir.exists()) { - if (log.isDebugEnabled()) { - log.debug("The directory that is expected to use as the container for all email templates is not " + - "available. Therefore, no template is uploaded to the registry"); - } - } - if (templateDir.canRead()) { - File[] templates = templateDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - return name.endsWith(".vm"); - } - }); - try { - Registry registry = - CarbonContext.getThreadLocalCarbonContext().getRegistry(RegistryType.SYSTEM_CONFIGURATION); - if (!registry.resourceExists(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH)) { - Collection collection = registry.newCollection(); - registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH, collection); - for (File template : templates) { - Resource resource = registry.newResource(); - resource.setContent(template); - registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource); - } - } else { - for (File template : templates) { - if (!registry.resourceExists( - EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName())) { - Resource resource = registry.newResource(); - resource.setContent(template); - registry.put( - EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource); - } - } - } - } catch (RegistryException e) { - throw new EmailSenderConfigurationFailedException("Error occurred while setting up email templates", e); - } - } - } - } diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderServiceComponent.java b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderServiceComponent.java index 38b8e451dd1..3d4e3933ed7 100644 --- a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderServiceComponent.java +++ b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderServiceComponent.java @@ -17,28 +17,16 @@ */ package org.wso2.carbon.email.sender.core.internal; -import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.service.component.ComponentContext; import org.wso2.carbon.email.sender.core.EmailSenderConfig; -import org.wso2.carbon.email.sender.core.EmailSenderConfigurationFailedException; import org.wso2.carbon.email.sender.core.service.EmailSenderService; import org.wso2.carbon.email.sender.core.service.EmailSenderServiceImpl; -import org.wso2.carbon.registry.api.Collection; -import org.wso2.carbon.registry.api.Registry; -import org.wso2.carbon.registry.api.RegistryException; -import org.wso2.carbon.registry.api.Resource; import org.wso2.carbon.registry.core.service.RegistryService; import org.wso2.carbon.utils.Axis2ConfigurationContextObserver; -import org.wso2.carbon.utils.CarbonUtils; import org.wso2.carbon.utils.ConfigurationContextService; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FilenameFilter; -import java.io.IOException; - /** * @scr.component name="org.wso2.carbon.email.sender.EmailSenderServiceComponent" immediate="true" * @scr.reference name="registry.service" @@ -56,7 +44,6 @@ import java.io.IOException; */ public class EmailSenderServiceComponent { - private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "/email-templates"; private static Log log = LogFactory.getLog(EmailSenderServiceComponent.class); @SuppressWarnings("unused") @@ -69,7 +56,7 @@ public class EmailSenderServiceComponent { EmailSenderConfig.init(); /* Setting up default email templates */ - this.setupEmailTemplates(); + EmailUtils.setupEmailTemplates(); /* Registering declarative service instances exposed by EmailSenderServiceComponent */ this.registerServices(componentContext); @@ -98,64 +85,6 @@ public class EmailSenderServiceComponent { componentContext.getBundleContext().registerService(EmailSenderService.class, emailServiceProvider, null); } - private void setupEmailTemplates() throws EmailSenderConfigurationFailedException { - File templateDir = - new File(CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + - "resources" + File.separator + "email-templates"); - if (!templateDir.exists()) { - if (log.isDebugEnabled()) { - log.debug("The directory that is expected to use as the container for all email templates is not " + - "available. Therefore, no template is uploaded to the registry"); - } - } - if (templateDir.canRead()) { - File[] templates = templateDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - return name.endsWith(".vm"); - } - }); - try { - Registry registry = - EmailSenderDataHolder.getInstance().getRegistryService().getConfigSystemRegistry(); - if (!registry.resourceExists(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH)) { - Collection collection = registry.newCollection(); - registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH, collection); - for (File template : templates) { - Resource resource = registry.newResource(); - String contents = FileUtils.readFileToString(template); - resource.setContent(contents.getBytes()); - registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource); - } - } else { - /* Existence of a given resource is not checked consciously, before performing registry.put() below. - * The rationale is that, the only less expensive way that one can check if a resource exists is - * that through registry.resourceExists(), which only checks if 'some' resource exists at the given - * registry path. However, this does not capture scenarios where there can be updated contents to - * the same resource of which the path hasn't changed after it has been initialized for the first - * time. Therefore, whenever the server starts-up, all email templates are updated just to avoid - * the aforementioned problem */ - for (File template : templates) { - Resource resource = registry.newResource(); - String contents = FileUtils.readFileToString(template); - resource.setContent(contents.getBytes()); - registry.put( - EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource); - } - } - } catch (RegistryException e) { - throw new EmailSenderConfigurationFailedException("Error occurred while setting up email templates", e); - } catch (FileNotFoundException e) { - throw new EmailSenderConfigurationFailedException("Error occurred while writing template file " + - "contents as an input stream of a resource", e); - } catch (IOException e) { - throw new EmailSenderConfigurationFailedException("Error occurred while serializing file " + - "contents to a string", e); - } - } - } - /** * Sets Registry Service. * diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailUtils.java b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailUtils.java new file mode 100644 index 00000000000..8088d95503f --- /dev/null +++ b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailUtils.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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.wso2.carbon.email.sender.core.internal; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.email.sender.core.EmailSenderConfigurationFailedException; +import org.wso2.carbon.registry.api.Collection; +import org.wso2.carbon.registry.api.Registry; +import org.wso2.carbon.registry.api.RegistryException; +import org.wso2.carbon.registry.api.Resource; +import org.wso2.carbon.utils.CarbonUtils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FilenameFilter; +import java.io.IOException; + +class EmailUtils { + + private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "/email-templates"; + private static Log log = LogFactory.getLog(EmailSenderServiceComponent.class); + + static void setupEmailTemplates() throws EmailSenderConfigurationFailedException { + File templateDir = + new File(CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + + "resources" + File.separator + "email-templates"); + if (!templateDir.exists()) { + if (log.isDebugEnabled()) { + log.debug("The directory that is expected to use as the container for all email templates is not " + + "available. Therefore, no template is uploaded to the registry"); + } + } + if (templateDir.canRead()) { + File[] templates = templateDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + name = name.toLowerCase(); + return name.endsWith(".vm"); + } + }); + try { + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + Registry registry = + EmailSenderDataHolder.getInstance().getRegistryService().getConfigSystemRegistry(tenantId); + if (!registry.resourceExists(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH)) { + Collection collection = registry.newCollection(); + registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH, collection); + for (File template : templates) { + Resource resource = registry.newResource(); + resource.setMediaType("text/plain"); + String contents = FileUtils.readFileToString(template); + resource.setContent(contents); + registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + + template.getName().replace(".vm", ""), resource); + } + } + } catch (RegistryException e) { + throw new EmailSenderConfigurationFailedException("Error occurred while setting up email templates", e); + } catch (FileNotFoundException e) { + throw new EmailSenderConfigurationFailedException("Error occurred while writing template file " + + "contents as an input stream of a resource", e); + } catch (IOException e) { + throw new EmailSenderConfigurationFailedException("Error occurred while serializing file " + + "contents to a string", e); + } + } + } + +}