diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/pom.xml b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/pom.xml new file mode 100644 index 0000000000..2430a66d60 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/pom.xml @@ -0,0 +1,185 @@ + + + + + org.wso2.carbon.devicemgt-plugins + appm-connector + 3.0.9-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.carbon.appmgt.mdm.restconnector + bundle + WSO2 Carbon - App Manager WSO2 MDM REST Connector Component + http://maven.apache.org + + + wso2-maven2-repository + WSO2 Maven2 Repository + http://dist.wso2.org/maven2/ + + + wso2-maven2-snapshot-repository + WSO2 Maven2 Snapshot Repository + http://dist.wso2.org/snapshots/maven2/ + + + wso2-nexus + WSO2 internal Repository + http://maven.wso2.org/nexus/content/groups/wso2-public/ + + true + daily + ignore + + + + + + + + org.apache.felix + maven-scr-plugin + + + generate-scr-scrdescriptor + + scr + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.artifactId} + ${project.artifactId} + org.wso2.carbon.appmgt.mdm.restconnector.internal + + org.wso2.carbon.appmgt.mobile.utils.*, + org.wso2.carbon.appmgt.mobile.mdm.*, + org.wso2.carbon.appmgt.mobile.interfaces.*, + org.apache.commons.*, + org.wso2.carbon.user.core.service, + org.wso2.carbon.user.core.tenant, + org.wso2.carbon.user.api, + feign, + feign.auth, + feign.codec, + feign.gson, + *;resolution:=optional + + + !org.wso2.carbon.appmgt.mdm.restconnector.internal, + org.wso2.carbon.appmgt.mdm.restconnector.* + + + jsr311-api, + feign-jaxrs, + org.wso2.carbon.device.mgt.common + + + + + + + + + + commons-io.wso2 + commons-io + + + com.googlecode.json-simple.wso2 + json-simple + + + com.googlecode.plist + dd-plist + + + org.wso2.carbon + org.wso2.carbon.logging + + + org.apache.felix + org.apache.felix.scr + + + org.wso2.carbon + org.wso2.carbon.ndatasource.core + + + org.wso2.carbon.governance + org.wso2.carbon.governance.api + + + org.wso2.carbon.appmgt + org.wso2.carbon.appmgt.mobile + + + org.wso2.carbon.devicemgt + org.wso2.carbon.identity.jwt.client.extension + 2.0.6-SNAPSHOT + + + + io.github.openfeign + feign-core + 9.3.1 + + + io.github.openfeign + feign-jaxrs + 9.3.1 + + + io.github.openfeign + feign-gson + 9.3.1 + + + javax.ws.rs + jsr311-api + + + io.swagger + swagger-jaxrs + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + + + org.apache.ws.commons.axiom + axiom-api + + + org.apache.ws.commons.axiom + axiom-impl + + + + + + + diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/ApplicationOperationsImpl.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/ApplicationOperationsImpl.java new file mode 100644 index 0000000000..4f3580165e --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/ApplicationOperationsImpl.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector; + +import feign.Feign; +import feign.gson.GsonDecoder; +import feign.gson.GsonEncoder; +import feign.jaxrs.JAXRSContract; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.OAuthRequestInterceptor; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApplicationManagementAdminService; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApplicationWrapper; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.DeviceManagementAdminService; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.MobileApp; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.MobileAppTypes; +import org.wso2.carbon.appmgt.mdm.restconnector.config.AuthorizationConfigurationManager; +import org.wso2.carbon.appmgt.mobile.beans.ApplicationOperationAction; +import org.wso2.carbon.appmgt.mobile.beans.ApplicationOperationDevice; +import org.wso2.carbon.appmgt.mobile.beans.DeviceIdentifier; +import org.wso2.carbon.appmgt.mobile.interfaces.ApplicationOperations; +import org.wso2.carbon.appmgt.mobile.mdm.App; +import org.wso2.carbon.appmgt.mobile.mdm.Device; +import org.wso2.carbon.appmgt.mobile.utils.MobileApplicationException; +import org.wso2.carbon.appmgt.mobile.utils.MobileConfigurations; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +public class ApplicationOperationsImpl implements ApplicationOperations { + private static final String CDMF_SERVER_BASE_CONTEXT = "/api/device-mgt/v1.0"; + private static DeviceManagementAdminService deviceManagementAdminService; + private static final Log log = LogFactory.getLog(ApplicationOperationsImpl.class); + private static ApplicationManagementAdminService applicationManagementAdminService; + + /** + * Constructor. + */ + public ApplicationOperationsImpl() { + String authorizationConfigManagerServerURL = AuthorizationConfigurationManager.getInstance().getServerURL(); + OAuthRequestInterceptor oAuthRequestInterceptor = new OAuthRequestInterceptor(); + deviceManagementAdminService = Feign.builder() + .requestInterceptor(oAuthRequestInterceptor) + .contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder()) + .target(DeviceManagementAdminService.class, + authorizationConfigManagerServerURL + CDMF_SERVER_BASE_CONTEXT); + applicationManagementAdminService = Feign.builder() + .requestInterceptor(oAuthRequestInterceptor) + .contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder()) + .target(ApplicationManagementAdminService.class, + authorizationConfigManagerServerURL + CDMF_SERVER_BASE_CONTEXT); + } + + /** + * Install, uninstall, reinstall application in devices. + * + * @param applicationOperationAction {@link ApplicationOperationAction} object + * @return Activity id + * @throws MobileApplicationException on errors while trying to perform action in devices + */ + @Override + public String performAction(ApplicationOperationAction applicationOperationAction) + throws MobileApplicationException { + ApplicationWrapper applicationWrapper = new ApplicationWrapper(); + MobileApp mobileApp = new MobileApp(); + + String type = applicationOperationAction.getType(); + String[] params = applicationOperationAction.getParams(); + int tenantId = applicationOperationAction.getTenantId(); + + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId); + + List deviceIdentifiers = new ArrayList<>(); + List deviceList; + if (Constants.USER.equals(type)) { + String platform = applicationOperationAction.getApp().getPlatform(); + String userName; + for (String param : params) { + userName = param; + deviceList = deviceManagementAdminService.getDevices(userName, null).getList(); + + for (org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.Device device : deviceList) { + if (Constants.WEBAPP.equals(platform) || platform.equalsIgnoreCase(device.getType())) { + if (Constants.ACTIVE.equalsIgnoreCase(device.getEnrolmentInfo().getStatus().toString())) { + deviceIdentifiers.add(getDeviceIdentifierByDevice(device)); + } + } + } + } + } else if (Constants.ROLE.equals(type)) { + String userRole; + for (String param : applicationOperationAction.getParams()) { + userRole = param; + deviceList = deviceManagementAdminService.getDevices(null, userRole).getList(); + for (org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.Device device : deviceList) { + if (Constants.ACTIVE.equalsIgnoreCase(device.getEnrolmentInfo().getStatus().toString())) { + deviceIdentifiers.add(getDeviceIdentifierByDevice(device)); + } + } + } + } else if (Constants.DEVICE.equals(type)) { + DeviceIdentifier deviceIdentifier; + for (String param : params) { + deviceIdentifier = new DeviceIdentifier(); + if (isValidJSON(param)) { + JSONParser parser = new JSONParser(); + try { + JSONObject parsedObj = (JSONObject) parser.parse(param); + deviceIdentifier.setId((String) parsedObj.get(Constants.ID)); + String deviceType = (String) parsedObj.get(Constants.TYPE); + deviceIdentifier.setType(deviceType); + deviceIdentifiers.add(deviceIdentifier); + } catch (ParseException e) { + throw new MobileApplicationException("Device Identifier is not valid json object.", e); + } + } + } + } else { + throw new IllegalStateException("Invalid type is received from app store."); + } + + App app = applicationOperationAction.getApp(); + mobileApp.setId(app.getId()); + mobileApp.setType(MobileAppTypes.valueOf(app.getType().toUpperCase())); + mobileApp.setAppIdentifier(app.getAppIdentifier()); + mobileApp.setIconImage(app.getIconImage()); + mobileApp.setIdentifier(app.getIdentifier()); + mobileApp.setLocation(app.getLocation()); + mobileApp.setName(app.getName()); + mobileApp.setPackageName(app.getPackageName()); + mobileApp.setPlatform(app.getPlatform()); + mobileApp.setVersion(app.getVersion()); + Properties mobileAppProperties = new Properties(); + + if (Constants.IOS.equals(app.getPlatform())) { + if (Constants.ENTERPRISE.equals(app.getType())) { + mobileAppProperties.put(Constants.IOSConstants.IS_REMOVE_APP, true); + mobileAppProperties.put(Constants.IOSConstants.IS_PREVENT_BACKUP, true); + } else if (Constants.IOSConstants.PUBLIC.equals(app.getType())) { + mobileAppProperties.put(Constants.IOSConstants.I_TUNES_ID, app.getIdentifier()); + mobileAppProperties.put(Constants.IOSConstants.IS_REMOVE_APP, true); + mobileAppProperties.put(Constants.IOSConstants.IS_PREVENT_BACKUP, true); + } else if (Constants.WEBAPP.equals(app.getType())) { + mobileAppProperties.put(Constants.IOSConstants.LABEL, app.getName()); + mobileAppProperties.put(Constants.IOSConstants.IS_REMOVE_APP, true); + } + } else if (Constants.WEBAPP.equals(app.getPlatform())) { + mobileAppProperties.put(Constants.IOSConstants.LABEL, app.getName()); + mobileAppProperties.put(Constants.IOSConstants.IS_REMOVE_APP, true); + } + mobileApp.setProperties(mobileAppProperties); + applicationWrapper.setApplication(mobileApp); + Activity activity = null; + + if (deviceIdentifiers.size() > 0) { + applicationWrapper.setDeviceIdentifiers(deviceIdentifiers); + if (Constants.INSTALL.equals(applicationOperationAction.getAction())) { + activity = applicationManagementAdminService.installApplication(applicationWrapper); + } else if (Constants.UPDATE.equals(applicationOperationAction.getAction())) { + activity = applicationManagementAdminService.installApplication(applicationWrapper); + } else { + activity = applicationManagementAdminService.uninstallApplication(applicationWrapper); + } + } + + if (activity != null) { + return activity.getActivityId(); + } + return null; + } + + /** + * Get devices. + * + * @param applicationOperationDevice {@link ApplicationOperationAction} object + * @return list of {@link Device} objects + * @throws MobileApplicationException on errors while trying to get devices list + */ + @Override + public List getDevices(ApplicationOperationDevice applicationOperationDevice) + throws MobileApplicationException { + Map queryParamsMap = new HashMap<>(); + String platform = applicationOperationDevice.getPlatform(); + String platformVersion = applicationOperationDevice.getPlatformVersion(); + String userName = applicationOperationDevice.getCurrentUser().getUsername(); + queryParamsMap.put(Constants.PLATFORM, platform); + queryParamsMap.put(Constants.PLATFORM_VERSION, platformVersion); + queryParamsMap.put(Constants.USER, userName); + String type = applicationOperationDevice.getType(); + queryParamsMap.put(Constants.TYPE, type); + List deviceList = + deviceManagementAdminService.getDevices(userName, null).getList(); + + List processedDevices = new ArrayList<>(); + for (org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.Device device : deviceList) { + Device processedDevice = new Device(); + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(device.getDeviceIdentifier().toString()); + deviceIdentifier.setType(device.getType().toString()); + processedDevice.setDeviceIdentifier(deviceIdentifier); + processedDevice.setName(device.getName()); + processedDevice.setModel(device.getName()); + processedDevice.setType(device.getType()); + String imgUrl; + if (Constants.ANDROID.equalsIgnoreCase((device.getType().toString()))) { + imgUrl = String.format(getActiveMDMProperties().get(Constants.PROPERTY_IMAGE_URL), Constants.NEXUS); + } else if (Constants.IOS.equalsIgnoreCase((device.getType().toString()))) { + imgUrl = String.format(getActiveMDMProperties().get(Constants.PROPERTY_IMAGE_URL), Constants.IPHONE); + } else { + imgUrl = String.format(getActiveMDMProperties().get(Constants.PROPERTY_IMAGE_URL), Constants.NONE); + } + processedDevice.setImage(imgUrl); + processedDevice.setPlatform(device.getType().toString()); + processedDevices.add(processedDevice); + } + return processedDevices; + + } + + private HashMap getActiveMDMProperties() { + MobileConfigurations configurations = MobileConfigurations.getInstance(); + return configurations.getActiveMDMProperties(); + } + + private static DeviceIdentifier getDeviceIdentifierByDevice( + org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.Device device) { + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(device.getDeviceIdentifier()); + deviceIdentifier.setType(device.getType()); + + return deviceIdentifier; + } + + private boolean isValidJSON(String json) { + JSONParser parser = new JSONParser(); + try { + parser.parse(json); + } catch (ParseException e) { + return false; + } + return true; + } + + private void logError(String errorMessage, Throwable e) { + if (log.isDebugEnabled()) { + log.error(errorMessage, e); + } else { + log.error(errorMessage); + } + } +} \ No newline at end of file diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/Constants.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/Constants.java new file mode 100644 index 0000000000..1721fc1a78 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/Constants.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector; + +public class Constants { + public static final String PROPERTY_SERVER_URL = "ServerURL"; + public static final String PROPERTY_TOKEN_API_URL = "TokenApiURL"; + public static final String PROPERTY_IMAGE_URL = "ImageURL"; + public static final String PROPERTY_TOKEN_REFRESH_TIME_OFFSET = "TokenRefreshTimeOffset"; + public static final String PROPERTY_USERNAME = "Username"; + public static final String PROPERTY_PASSWORD = "Password"; + + public static final String USER = "user"; + public static final String ROLE = "role"; + public static final String USERS = USER + "s"; + public static final String ROLES = ROLE + "s"; + public static final String ANDROID = "android"; + public static final String IOS = "ios"; + public static final String WEBAPP = "webapp"; + public static final String PLATFORM = "platform"; + public static final String PLATFORM_VERSION = "platformVersion"; + public static final String PROPERTIES = "properties"; + public static final String TYPE = "type"; + public static final String TYPES = TYPE + "s"; + public static final String ID = "id"; + public static final String NAME = "name"; + public static final String USER_LIST = "userList"; + public static final String DEVICE_IDENTIFIER = "deviceIdentifier"; + public static final String DEVICE_IDENTIFIERS = DEVICE_IDENTIFIER + "s"; + public static final String DEVICES = "devices"; + public static final String APPLICATION = "application"; + public static final String NEXUS = "nexus"; + public static final String IPHONE = "iphone"; + public static final String NONE = "none"; + public static final String INSTALL = "install"; + public static final String UPDATE = "update"; + public static final String MOBILE_DEVICE = "mobileDevice"; + public static final String ENTERPRISE = "enterprise"; + public static final String ACTIVE = "active"; + public static final String DEVICE = "device"; + + + public class IOSConstants { + + private IOSConstants() { + throw new AssertionError(); + } + + public static final String IS_REMOVE_APP = "isRemoveApp"; + public static final String IS_PREVENT_BACKUP = "isPreventBackup"; + public static final String I_TUNES_ID = "iTunesId"; + public static final String LABEL = "label"; + public static final String PUBLIC = "public"; + public static final String OPCODE_INSTALL_ENTERPRISE_APPLICATION = + "INSTALL_ENTERPRISE_APPLICATION"; + public static final String OPCODE_INSTALL_STORE_APPLICATION = "INSTALL_STORE_APPLICATION"; + public static final String OPCODE_INSTALL_WEB_APPLICATION = "WEB_CLIP"; + public static final String OPCODE_REMOVE_APPLICATION = "REMOVE_APPLICATION"; + } + + public class AndroidConstants { + private AndroidConstants() { + throw new AssertionError(); + } + + public static final String OPCODE_INSTALL_APPLICATION = "INSTALL_APPLICATION"; + public static final String OPCODE_UPDATE_APPLICATION = "UPDATE_APPLICATION"; + public static final String OPCODE_UNINSTALL_APPLICATION = "UNINSTALL_APPLICATION"; + } + + public class WebAppConstants { + public static final String WEBAPP = "webapp"; + public static final String LABEL = "label"; + public static final String IS_REMOVE_APP = "isRemoveApp"; + public static final String NAME = "name"; + } + + public class RestConstants { + public static final String USERNAME = "username"; + public static final String PASSWORD = "password"; + public static final String AUTHORIZATION = "Authorization"; + public static final String BEARER = "Bearer "; + public static final String BASIC = "Basic "; + public static final String COLON = ":"; + public static final String GRANT_TYPE = "grant_type"; + public static final String CONTENT_TYPE = "Content-Type"; + public static final String ACCESS_TOKEN = "accessToken"; + public static final String ACCEPT = "Accept"; + public static final String APPLICATION_JSON = "application/json"; + public static final String APPLICATION_FORM_URL_ENCODED = "application/x-www-form-urlencoded"; + } + +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/OAuthRequestInterceptor.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/OAuthRequestInterceptor.java new file mode 100755 index 0000000000..889b81bede --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/OAuthRequestInterceptor.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client; + +import feign.Feign; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import feign.auth.BasicAuthRequestInterceptor; +import feign.gson.GsonDecoder; +import feign.gson.GsonEncoder; +import feign.jaxrs.JAXRSContract; +import org.wso2.carbon.appmgt.mdm.restconnector.Constants; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.AccessTokenInfo; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApiApplicationKey; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApiApplicationRegistrationService; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApiRegistrationProfile; +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.TokenIssuerService; +import org.wso2.carbon.appmgt.mdm.restconnector.config.AuthorizationConfigurationManager; +import org.wso2.carbon.appmgt.mdm.restconnector.internal.AuthorizationDataHolder; + +/** + * This is a request interceptor to add oauth token header. + */ +public class OAuthRequestInterceptor implements RequestInterceptor { + private AccessTokenInfo tokenInfo; + private String refreshTimeOffset; + private static final String API_APPLICATION_REGISTRATION_CONTEXT = "/api-application-registration"; + private static final String DEVICE_MANAGEMENT_SERVICE_TAG[] = {"device_management"}; + private static final String APPLICATION_NAME = "appm_restconnector_application"; + private static final String PASSWORD_GRANT_TYPE = "password"; + private static final String REFRESH_GRANT_TYPE = "refreshToken"; + private ApiApplicationRegistrationService apiApplicationRegistrationService; + private TokenIssuerService tokenIssuerService; + + /** + * Creates an interceptor that authenticates all requests. + */ + public OAuthRequestInterceptor() { + refreshTimeOffset = AuthorizationConfigurationManager.getInstance().getTokenRefreshTimeOffset(); + String username = AuthorizationConfigurationManager.getInstance().getUserName(); + String password = AuthorizationConfigurationManager.getInstance().getPassword(); + apiApplicationRegistrationService = Feign.builder().requestInterceptor( + new BasicAuthRequestInterceptor(username, password)) + .contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder()) + .target(ApiApplicationRegistrationService.class, + AuthorizationConfigurationManager.getInstance().getServerURL() + + API_APPLICATION_REGISTRATION_CONTEXT); + AuthorizationDataHolder.getInstance().setApiApplicationRegistrationService(apiApplicationRegistrationService); + + } + + @Override + public void apply(RequestTemplate template) { + if (tokenInfo == null) { + ApiRegistrationProfile apiRegistrationProfile = new ApiRegistrationProfile(); + apiRegistrationProfile.setApplicationName(APPLICATION_NAME); + apiRegistrationProfile.setIsAllowedToAllDomains(true); + apiRegistrationProfile.setIsMappingAnExistingOAuthApp(false); + apiRegistrationProfile.setTags(DEVICE_MANAGEMENT_SERVICE_TAG); + ApiApplicationKey apiApplicationKey = apiApplicationRegistrationService.register(apiRegistrationProfile); + String consumerKey = apiApplicationKey.getConsumerKey(); + String consumerSecret = apiApplicationKey.getConsumerSecret(); + String username = AuthorizationConfigurationManager.getInstance().getUserName(); + String password = AuthorizationConfigurationManager.getInstance().getPassword(); + tokenIssuerService = Feign.builder().requestInterceptor( + new BasicAuthRequestInterceptor(consumerKey, consumerSecret)) + .contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder()) + .target(TokenIssuerService.class, AuthorizationConfigurationManager.getInstance().getTokenApiURL()); + tokenInfo = tokenIssuerService.getToken(PASSWORD_GRANT_TYPE, username, password); + tokenInfo.setExpiresIn(System.currentTimeMillis() + tokenInfo.getExpiresIn()); + } + synchronized (this) { + if (System.currentTimeMillis() + Long.parseLong(refreshTimeOffset) > tokenInfo.getExpiresIn()) { + tokenInfo = tokenIssuerService.getToken(REFRESH_GRANT_TYPE, tokenInfo.getRefreshToken()); + tokenInfo.setExpiresIn(System.currentTimeMillis() + tokenInfo.getExpiresIn()); + } + } + String headerValue = Constants.RestConstants.BEARER + tokenInfo.getAccessToken(); + template.header(Constants.RestConstants.AUTHORIZATION, headerValue); + } +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/AccessTokenInfo.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/AccessTokenInfo.java new file mode 100755 index 0000000000..a776b9013c --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/AccessTokenInfo.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +/** + * This hold access token info that returned from the api call. + */ +public class AccessTokenInfo { + public String tokenType; + public long expiresIn; + public String refreshToken; + public String accessToken; + + public String getTokenType() { + return tokenType; + } + + public void setTokenType(String tokenType) { + this.tokenType = tokenType; + } + + public long getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(long expiresIn) { + this.expiresIn = expiresIn; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiApplicationKey.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiApplicationKey.java new file mode 100644 index 0000000000..32dcc8718e --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiApplicationKey.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +/** + * This holds api application consumer key and secret. + */ +public class ApiApplicationKey { + private String clientId; + private String clientSecret; + + public String getConsumerKey() { + return this.clientId; + } + + public void setClientId(String consumerKey) { + this.clientId = consumerKey; + } + + public String getConsumerSecret() { + return this.clientSecret; + } + + public void setClientSecret(String consumerSecret) { + this.clientSecret = consumerSecret; + } +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiApplicationRegistrationService.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiApplicationRegistrationService.java new file mode 100755 index 0000000000..65f5db187c --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiApplicationRegistrationService.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +/** + * This is the application registration service that exposed for apimApplicationRegistration. + */ + +@Path("/register") +public interface ApiApplicationRegistrationService { + + /** + * This method is used to register api application. + * + * @param registrationProfile contains the necessary attributes that are needed in order to register an app + */ + @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + ApiApplicationKey register(ApiRegistrationProfile registrationProfile); +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiRegistrationProfile.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiRegistrationProfile.java new file mode 100755 index 0000000000..15179e1a95 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApiRegistrationProfile.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + + +/** + * This class represents the data that are required to register the oauth application. + */ +public class ApiRegistrationProfile { + public String applicationName; + public String tags[]; + public boolean isAllowedToAllDomains; + public String consumerKey; + public String consumerSecret; + public boolean isMappingAnExistingOAuthApp; + + public String getApplicationName() { + return applicationName; + } + + public void setApplicationName(String applicationName) { + this.applicationName = applicationName; + } + + public String[] getTags() { + return tags; + } + + public void setTags(String[] tags) { + this.tags = tags; + } + + public boolean isAllowedToAllDomains() { + return isAllowedToAllDomains; + } + + public void setIsAllowedToAllDomains(boolean isAllowedToAllDomains) { + this.isAllowedToAllDomains = isAllowedToAllDomains; + } + + public boolean isMappingAnExistingOAuthApp() { + return isMappingAnExistingOAuthApp; + } + + public void setIsMappingAnExistingOAuthApp(boolean isMappingAnExistingOAuthApp) { + this.isMappingAnExistingOAuthApp = isMappingAnExistingOAuthApp; + } + + public String getConsumerKey() { + return consumerKey; + } + + public void setConsumerKey(String consumerKey) { + this.consumerKey = consumerKey; + } + + public String getConsumerSecret() { + return consumerSecret; + } + + public void setConsumerSecret(String consumerSecret) { + this.consumerSecret = consumerSecret; + } +} \ No newline at end of file diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationManagementAdminService.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationManagementAdminService.java new file mode 100644 index 0000000000..3b390a7a85 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationManagementAdminService.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +@Path("/admin/applications") + +/** + * This interface provided the definition of the application management service. + */ +public interface ApplicationManagementAdminService { + + /** + * Install application. + * + * @param applicationWrapper {@link ApplicationWrapper} object + * @return {@link Activity} object + */ + @POST + @Path("/install-application") + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + Activity installApplication(ApplicationWrapper applicationWrapper); + + /** + * Uninstall application. + * + * @param applicationWrapper {@link ApplicationWrapper} object + * @return {@link Activity} object + */ + @POST + @Path("/uninstall-application") + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + Activity uninstallApplication(ApplicationWrapper applicationWrapper); +} \ No newline at end of file diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationWrapper.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationWrapper.java new file mode 100644 index 0000000000..4e0d497d12 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationWrapper.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import org.wso2.carbon.appmgt.mobile.beans.DeviceIdentifier; + +import java.util.List; + +/** + * This DTO class is used to send application details and devices details to installation/uninstallation service. + */ +public class ApplicationWrapper { + private List userNameList; + private List roleNameList; + private List deviceIdentifiers; + private MobileApp application; + + public List getUserNameList() { + return userNameList; + } + + public void setUserNameList(List userNameList) { + this.userNameList = userNameList; + } + + public List getDeviceIdentifiers() { + return deviceIdentifiers; + } + + public void setDeviceIdentifiers( + List deviceIdentifiers) { + this.deviceIdentifiers = deviceIdentifiers; + } + + public List getRoleNameList() { + return roleNameList; + } + + public void setRoleNameList(List roleNameList) { + this.roleNameList = roleNameList; + } + + public MobileApp getApplication() { + return application; + } + + public void setApplication(MobileApp application) { + this.application = application; + } +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/BasePaginatedResult.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/BasePaginatedResult.java new file mode 100644 index 0000000000..0b17804dc5 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/BasePaginatedResult.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; + +/** + * Number of Resources returned. + */ +public class BasePaginatedResult { + @ApiModelProperty(value = "Number of total resources.", example = "2") + @JsonProperty("count") + private int count; + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } +} \ No newline at end of file diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Device.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Device.java new file mode 100644 index 0000000000..24916c1fa0 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Device.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import org.wso2.carbon.device.mgt.common.Feature; + +import java.io.Serializable; +import java.util.List; + +/** + * The DTO class of device. + */ +public class Device implements Serializable { + private static final long serialVersionUID = 1998101711L; + private int id; + private String name; + private String type; + private String description; + private String deviceIdentifier; + private EnrolmentInfo enrolmentInfo; + + public Device() { + } + + public Device(String name, String type, String description, String deviceId, EnrolmentInfo enrolmentInfo, + List features, List properties) { + this.name = name; + this.type = type; + this.description = description; + this.deviceIdentifier = deviceId; + this.enrolmentInfo = enrolmentInfo; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDeviceIdentifier() { + return deviceIdentifier; + } + + public void setDeviceIdentifier(String deviceIdentifier) { + this.deviceIdentifier = deviceIdentifier; + } + + public EnrolmentInfo getEnrolmentInfo() { + return enrolmentInfo; + } + + public void setEnrolmentInfo(EnrolmentInfo enrolmentInfo) { + this.enrolmentInfo = enrolmentInfo; + } + + public static class Property { + + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } + + @Override + public String toString() { + return "device [" + + "name=" + name + ";" + + "type=" + type + ";" + + "description=" + description + ";" + + "identifier=" + deviceIdentifier + ";" + + "EnrolmentInfo[" + + "owner=" + enrolmentInfo.getOwner() + ";" + + "ownership=" + enrolmentInfo.getOwnership() + ";" + + "status=" + enrolmentInfo.getStatus() + ";" + + "]" + + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof org.wso2.carbon.device.mgt.common.Device)) + return false; + + org.wso2.carbon.device.mgt.common.Device device = (org.wso2.carbon.device.mgt.common.Device) o; + + return getDeviceIdentifier().equals(device.getDeviceIdentifier()); + + } + + @Override + public int hashCode() { + return getDeviceIdentifier().hashCode(); + } +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceList.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceList.java new file mode 100644 index 0000000000..cbb8661751 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceList.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; + +import java.util.ArrayList; +import java.util.List; + +public class DeviceList extends BasePaginatedResult { + private List devices = new ArrayList<>(); + + @ApiModelProperty(value = "List of devices returned") + @JsonProperty("devices") + public List getList() { + return devices; + } + + public void setList(List devices) { + this.devices = devices; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + + sb.append(" count: ").append(getCount()).append(",\n"); + sb.append(" devices: [").append(devices).append("\n"); + sb.append("]}\n"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceManagementAdminService.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceManagementAdminService.java new file mode 100644 index 0000000000..0bed67b3ac --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceManagementAdminService.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + + +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +@Path("/devices") + +/** + * This interface provided the definition of the device management service. + */ +public interface DeviceManagementAdminService { + /** + * Get devices. + * + * @param user Username + * @param role Role of the user + * @return {@link DeviceList} object + */ + @GET + @Produces(MediaType.APPLICATION_JSON) + DeviceList getDevices(@QueryParam("user") String user, @QueryParam("role") String role); +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/EnrolmentInfo.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/EnrolmentInfo.java new file mode 100644 index 0000000000..66cd083049 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/EnrolmentInfo.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import java.io.Serializable; + +/** + * The DTO class for enrollment information. + */ +public class EnrolmentInfo implements Serializable { + private static final long serialVersionUID = 1998101712L; + + public enum Status { + CREATED, ACTIVE, INACTIVE, UNREACHABLE, UNCLAIMED, SUSPENDED, BLOCKED, REMOVED, DISENROLLMENT_REQUESTED + } + + public enum OwnerShip { + BYOD, COPE + } + + private int id; + private OwnerShip ownership; + private Status status; + private String owner; + private Long dateOfEnrolment; + private Long dateOfLastUpdate; + + public EnrolmentInfo() { + } + + public EnrolmentInfo(String owner, OwnerShip ownership, Status status) { + this.owner = owner; + this.ownership = ownership; + this.status = status; + } + + public Long getDateOfEnrolment() { + return dateOfEnrolment; + } + + public void setDateOfEnrolment(Long dateOfEnrolment) { + this.dateOfEnrolment = dateOfEnrolment; + } + + public Long getDateOfLastUpdate() { + return dateOfLastUpdate; + } + + public void setDateOfLastUpdate(Long dateOfLastUpdate) { + this.dateOfLastUpdate = dateOfLastUpdate; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + + public OwnerShip getOwnership() { + return ownership; + } + + public void setOwnership(OwnerShip ownership) { + this.ownership = ownership; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EnrolmentInfo) { + EnrolmentInfo tempInfo = (EnrolmentInfo) obj; + if (this.owner != null && this.ownership != null) { + if (this.owner.equals(tempInfo.getOwner()) && this.ownership.equals(tempInfo.getOwnership())) { + return true; + } + } + } + return false; + } + + @Override + public int hashCode() { + return owner.hashCode() ^ ownership.hashCode(); + } +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/MobileApp.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/MobileApp.java new file mode 100644 index 0000000000..18a7b853f8 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/MobileApp.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import java.util.Properties; + +/** + * This class represents the generic mobile Application information which is used by AppM. + */ +public class MobileApp { + + private String id; + private String name; + private MobileAppTypes type; + private String platform; + private String version; + private String identifier; + private String iconImage; + private String packageName; + private String appIdentifier; + private String location; + private Properties properties; + + public MobileAppTypes getType() { + return type; + } + + public void setType(MobileAppTypes type) { + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getIconImage() { + return iconImage; + } + + public void setIconImage(String iconImage) { + this.iconImage = iconImage; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getAppIdentifier() { + return appIdentifier; + } + + public void setAppIdentifier(String appIdentifier) { + this.appIdentifier = appIdentifier; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/MobileAppTypes.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/MobileAppTypes.java new file mode 100644 index 0000000000..f3127ab255 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/MobileAppTypes.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +/** + * This enum contains the mobile app types. + */ +public enum MobileAppTypes { + ENTERPRISE, WEBAPP, PUBLIC +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/TokenIssuerService.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/TokenIssuerService.java new file mode 100755 index 0000000000..81e44bb2cf --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/TokenIssuerService.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +/** + * This hold the api definition that is used as a contract with netflix feign. + */ +@Path("/token") +public interface TokenIssuerService { + + /** + * Get a token for password grant type. + * @param grant Token grant type + * @param username Username + * @param password Password + * @return {@link AccessTokenInfo} object + */ + @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + AccessTokenInfo getToken(@QueryParam("grant_type") String grant, @QueryParam("username") String username, + @QueryParam("password") String password); + + /** + * Get a token for refresh grant type. + * @param grant Token grant type + * @param refreshToken Refresh token + * @return {@link AccessTokenInfo} object + */ + @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + AccessTokenInfo getToken(@QueryParam("grant_type") String grant, @QueryParam("refreshToken") String refreshToken); +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/config/AuthorizationConfigurationManager.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/config/AuthorizationConfigurationManager.java new file mode 100644 index 0000000000..247cbfad78 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/config/AuthorizationConfigurationManager.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.config; + +import org.wso2.carbon.appmgt.mdm.restconnector.Constants; +import org.wso2.carbon.appmgt.mobile.utils.MobileConfigurations; + +import java.util.HashMap; + +public class AuthorizationConfigurationManager { + + private String tokenApiURL; + private String imageURL; + private String serverURL; + private String userName; + private String password; + private String tokenRefreshTimeOffset; + + private static AuthorizationConfigurationManager authorizationConfigurationManager = new + AuthorizationConfigurationManager(); + + private AuthorizationConfigurationManager() { + MobileConfigurations configurations = MobileConfigurations.getInstance(); + HashMap configProperties = configurations.getActiveMDMProperties(); + setTokenApiURL(configProperties.get(Constants.PROPERTY_TOKEN_API_URL)); + setImageURL(configProperties.get(Constants.PROPERTY_IMAGE_URL)); + setServerURL(configProperties.get(Constants.PROPERTY_SERVER_URL)); + setUserName(configProperties.get(Constants.PROPERTY_USERNAME)); + setPassword(configProperties.get(Constants.PROPERTY_PASSWORD)); + setTokenRefreshTimeOffset(configProperties.get(Constants.PROPERTY_TOKEN_REFRESH_TIME_OFFSET)); + } + + public static AuthorizationConfigurationManager getInstance() { + return authorizationConfigurationManager; + } + + public String getTokenApiURL() { + return tokenApiURL; + } + + public void setTokenApiURL(String tokenApiURL) { + this.tokenApiURL = tokenApiURL; + } + + public String getImageURL() { + return imageURL; + } + + public void setImageURL(String imageURL) { + this.imageURL = imageURL; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getServerURL() { + return serverURL; + } + + public void setServerURL(String serverURL) { + this.serverURL = serverURL; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public static AuthorizationConfigurationManager getAuthorizationConfigurationManager() { + return authorizationConfigurationManager; + } + + public static void setAuthorizationConfigurationManager( + AuthorizationConfigurationManager authorizationConfigurationManager) { + AuthorizationConfigurationManager.authorizationConfigurationManager = authorizationConfigurationManager; + } + + public String getTokenRefreshTimeOffset() { + return tokenRefreshTimeOffset; + } + + public void setTokenRefreshTimeOffset(String tokenRefreshTimeOffset) { + this.tokenRefreshTimeOffset = tokenRefreshTimeOffset; + } +} \ No newline at end of file diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/AuthorizationDataHolder.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/AuthorizationDataHolder.java new file mode 100644 index 0000000000..15a53b7ff0 --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/AuthorizationDataHolder.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.internal; + +import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApiApplicationRegistrationService; + +public class AuthorizationDataHolder { + private static AuthorizationDataHolder thisInstance = new AuthorizationDataHolder(); + + private ApiApplicationRegistrationService apiApplicationRegistrationService; + + private AuthorizationDataHolder() { + } + + public static AuthorizationDataHolder getInstance() { + return thisInstance; + } + + public ApiApplicationRegistrationService getApiApplicationRegistrationService() { + return apiApplicationRegistrationService; + } + + public void setApiApplicationRegistrationService( + ApiApplicationRegistrationService apiApplicationRegistrationService) { + this.apiApplicationRegistrationService = apiApplicationRegistrationService; + } +} diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/MDMComponent.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/MDMComponent.java new file mode 100644 index 0000000000..c75ed0981b --- /dev/null +++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/MDMComponent.java @@ -0,0 +1,61 @@ +/* + * + * Copyright (c) 2017, 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.appmgt.mdm.restconnector.internal; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.component.ComponentContext; +import org.wso2.carbon.appmgt.mdm.restconnector.ApplicationOperationsImpl; +import org.wso2.carbon.appmgt.mobile.interfaces.ApplicationOperations; + +/** + * @scr.component name="org.wso2.carbon.appmgt.mdm.restconnector" immediate="true" + */ +public class MDMComponent { + private static final Log log = LogFactory.getLog(MDMComponent.class); + private ServiceRegistration mdmServiceRegistration; + + protected void activate(ComponentContext context) { + BundleContext bundleContext = context.getBundleContext(); + if (log.isDebugEnabled()) { + log.debug("WSO2MDM MDM Component activated"); + } + try { + mdmServiceRegistration = bundleContext.registerService(ApplicationOperations.class.getName(), new + ApplicationOperationsImpl(), null); + } catch (Throwable e) { + log.error("Failed to activate org.wso2.carbon.appmgt.mdm.restconnector.internal." + + "MDMComponent : " + e); + } + } + + protected void deactivate(ComponentContext context) { + if (mdmServiceRegistration != null) { + mdmServiceRegistration.unregister(); + mdmServiceRegistration = null; + } + if (log.isDebugEnabled()) { + log.debug("WSO2MDM MDM Component deactivated"); + } + } +} \ No newline at end of file diff --git a/components/extensions/appm-connector/pom.xml b/components/extensions/appm-connector/pom.xml index 2e5b0ed9a0..41a0f2dae1 100644 --- a/components/extensions/appm-connector/pom.xml +++ b/components/extensions/appm-connector/pom.xml @@ -34,6 +34,7 @@ org.wso2.carbon.appmgt.mdm.osgiconnector + org.wso2.carbon.appmgt.mdm.restconnector diff --git a/features/extensions-feature/org.wso2.carbon.appmgt.mdm.restconnector.feature/pom.xml b/features/extensions-feature/org.wso2.carbon.appmgt.mdm.restconnector.feature/pom.xml new file mode 100644 index 0000000000..51506ea4fe --- /dev/null +++ b/features/extensions-feature/org.wso2.carbon.appmgt.mdm.restconnector.feature/pom.xml @@ -0,0 +1,97 @@ + + + + 4.0.0 + + + org.wso2.carbon.devicemgt-plugins + extensions-feature + 3.0.9-SNAPSHOT + ../pom.xml + + + org.wso2.carbon.appmgt.mdm.restconnector.feature + pom + 3.0.9-SNAPSHOT + WSO2 Carbon - App management MDM REST Connector + http://wso2.org + This feature contains the core bundles required for APP management MDM REST connection + + + + + org.wso2.carbon.devicemgt-plugins + org.wso2.carbon.appmgt.mdm.restconnector + 3.0.9-SNAPSHOT + + + org.apache.ws.commons.axiom + axiom-api + + + org.apache.ws.commons.axiom + axiom-impl + + + + + com.googlecode.plist + dd-plist + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + 4-p2-feature-generation + package + + p2-feature-gen + + + org.wso2.carbon.appmgt.mdm.restconnector + ../etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + + org.eclipse.equinox.p2.type.group:false + + + + + + org.wso2.carbon.devicemgt-plugins:org.wso2.carbon.appmgt.mdm.restconnector:${carbon.devicemgt.plugins.version} + + com.googlecode.plist:dd-plist:${googlecode.plist.version} + + + + + + + + + + + diff --git a/features/extensions-feature/pom.xml b/features/extensions-feature/pom.xml index 253b52d268..93339799d5 100644 --- a/features/extensions-feature/pom.xml +++ b/features/extensions-feature/pom.xml @@ -35,6 +35,7 @@ org.wso2.carbon.appmgt.mdm.osgiconnector.feature + org.wso2.carbon.appmgt.mdm.restconnector.feature org.wso2.carbon.device.mgt.adapter.feature org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization.feature org.wso2.extension.siddhi.execution.json.feature diff --git a/pom.xml b/pom.xml index 6ed8c37b36..c772e4c763 100644 --- a/pom.xml +++ b/pom.xml @@ -1248,7 +1248,7 @@ [2.0.0, 3.0.0) - 1.2.13 + 1.2.15 3.0.9-SNAPSHOT