/* * 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.device.mgt.core.app.mgt; import org.apache.axis2.AxisFault; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.ConfigurationContextFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.common.Application; import org.wso2.carbon.device.mgt.common.Credential; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.app.mgt.AppManagerConnector; import org.wso2.carbon.device.mgt.common.app.mgt.AppManagerConnectorException; import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; import org.wso2.carbon.device.mgt.common.spi.DeviceMgtService; import org.wso2.carbon.device.mgt.core.DeviceManagementConstants; import org.wso2.carbon.device.mgt.core.DeviceManagementRepository; import org.wso2.carbon.device.mgt.core.app.mgt.config.AppManagementConfig; import org.wso2.carbon.device.mgt.core.app.mgt.oauth.ServiceAuthenticator; import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager; import org.wso2.carbon.device.mgt.core.config.identity.IdentityConfigurations; import org.wso2.carbon.identity.oauth.stub.OAuthAdminServiceException; import org.wso2.carbon.identity.oauth.stub.OAuthAdminServiceStub; import org.wso2.carbon.identity.oauth.stub.dto.OAuthConsumerAppDTO; import java.rmi.RemoteException; import java.util.List; /** * Implements AppManagerConnector interface */ public class RemoteAppManagerConnector implements AppManagerConnector { private ConfigurationContext configCtx; private ServiceAuthenticator authenticator; private String oAuthAdminServiceUrl; private DeviceManagementRepository pluginRepository; private static final String GET_APP_LIST_URL = "store/apis/assets/mobileapp?domain=carbon.super&page=1"; private static final Log log = LogFactory.getLog(RemoteAppManagerConnector.class); public RemoteAppManagerConnector(AppManagementConfig appManagementConfig, DeviceManagementRepository pluginRepository) { IdentityConfigurations identityConfig = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(). getDeviceManagementConfigRepository().getIdentityConfigurations(); this.authenticator = new ServiceAuthenticator(identityConfig.getAdminUsername(), identityConfig.getAdminPassword()); this.oAuthAdminServiceUrl = identityConfig.getServerUrl() + DeviceManagementConstants.AppManagement.OAUTH_ADMIN_SERVICE; try { this.configCtx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null); } catch (AxisFault e) { throw new IllegalArgumentException("Error occurred while initializing Axis2 Configuration Context. " + "Please check if an appropriate axis2.xml is provided", e); } this.pluginRepository = pluginRepository; } @Override public Application[] getApplicationList(String domain, int pageNumber, int size) throws AppManagerConnectorException { return new Application[0]; } @Override public void updateApplicationStatus(DeviceIdentifier deviceId, Application application, String status) throws AppManagerConnectorException{ } @Override public String getApplicationStatus(DeviceIdentifier deviceId, Application application) throws AppManagerConnectorException { return null; } @Override public Credential getClientCredentials() throws AppManagerConnectorException { OAuthConsumerAppDTO appInfo = this.getAppInfo(); Credential credential = new Credential(); credential.setConsumerKey(appInfo.getOauthConsumerKey()); credential.setConsumerSecret(appInfo.getOauthConsumerSecret()); return credential; } @Override public void installApplication(Operation operation, List<DeviceIdentifier> deviceIdentifiers) throws AppManagerConnectorException { for(DeviceIdentifier deviceIdentifier:deviceIdentifiers){ DeviceMgtService dms = this.getPluginRepository().getDeviceManagementProvider(deviceIdentifier.getType()); dms.installApplication(operation,deviceIdentifiers); } } private OAuthConsumerAppDTO getAppInfo() throws AppManagerConnectorException { OAuthConsumerAppDTO appInfo = null; try { OAuthAdminServiceStub oAuthAdminServiceStub = new OAuthAdminServiceStub(configCtx, oAuthAdminServiceUrl); authenticator.authenticate(oAuthAdminServiceStub._getServiceClient()); try { appInfo = oAuthAdminServiceStub.getOAuthApplicationDataByAppName( DeviceManagementConstants.AppManagement.OAUTH_APPLICATION_NAME); } //application doesn't exist. Due to the way getOAuthApplicationDataByAppName has been //implemented, it throws an AxisFault if the App doesn't exist. Hence the catch. catch (AxisFault fault) { oAuthAdminServiceStub.registerOAuthApplicationData(this.getRequestDTO()); appInfo = oAuthAdminServiceStub.getOAuthApplicationDataByAppName( DeviceManagementConstants.AppManagement.OAUTH_APPLICATION_NAME); } } catch (RemoteException e) { handleException("Error occurred while retrieving app info", e); } catch (OAuthAdminServiceException e) { handleException("Error occurred while invoking OAuth admin service stub", e); } return appInfo; } private OAuthConsumerAppDTO getRequestDTO() { OAuthConsumerAppDTO appDTO = new OAuthConsumerAppDTO(); appDTO.setApplicationName(DeviceManagementConstants.AppManagement.OAUTH_APPLICATION_NAME); appDTO.setGrantTypes( DeviceManagementConstants.AppManagement.OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS); appDTO.setOAuthVersion(DeviceManagementConstants.AppManagement.OAUTH_VERSION_2); return appDTO; } private void handleException(String msg, Exception e) throws AppManagerConnectorException { log.error(msg, e); throw new AppManagerConnectorException(msg, e); } public DeviceManagementRepository getPluginRepository() { return pluginRepository; } }