forked from community/device-mgt-plugins
parent
73eb590a7c
commit
50d8aedade
@ -0,0 +1,34 @@
|
|||||||
|
package org.wso2.carbon.device.mgt.input.adapter.extension;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This hold the input adapter extension service.
|
||||||
|
*/
|
||||||
|
public interface InputAdapterExtensionService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return content validator for the given type.
|
||||||
|
* @param type type of the content validator
|
||||||
|
* @return content validator for the given type.
|
||||||
|
*/
|
||||||
|
ContentValidator getContentValidator(String type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return default content validator for the given type.
|
||||||
|
* @return default content validator for the given type.
|
||||||
|
*/
|
||||||
|
ContentValidator getDefaultContentValidator();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return content transformer for the given type.
|
||||||
|
* @param type of the content transfomer
|
||||||
|
* @return content transformer for the given type.
|
||||||
|
*/
|
||||||
|
ContentTransformer getContentTransformer(String type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return default content transformer for the given type.
|
||||||
|
* @return default content transformer for the given type.
|
||||||
|
*/
|
||||||
|
ContentTransformer getDefaultContentTransformer();
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package org.wso2.carbon.device.mgt.input.adapter.extension;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.internal.InputAdapterServiceDataHolder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This hold the input adapter extension service implementation.
|
||||||
|
*/
|
||||||
|
public class InputAdapterExtensionServiceImpl implements InputAdapterExtensionService {
|
||||||
|
private static final String DEFAULT = "default";
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContentValidator getContentValidator(String type) {
|
||||||
|
return InputAdapterServiceDataHolder.getInstance().getContentValidatorMap().get(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContentValidator getDefaultContentValidator() {
|
||||||
|
return InputAdapterServiceDataHolder.getInstance().getContentValidatorMap().get(DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContentTransformer getContentTransformer(String type) {
|
||||||
|
return InputAdapterServiceDataHolder.getInstance().getContentTransformerMap().get(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContentTransformer getDefaultContentTransformer() {
|
||||||
|
return InputAdapterServiceDataHolder.getInstance().getContentTransformerMap().get(DEFAULT);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* 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.input.adapter.extension.internal;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.osgi.service.component.ComponentContext;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionServiceImpl;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.transformer.DefaultContentTransformer;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.validator.DefaultContentValidator;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.validator.HTTPContentValidator;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.validator.MQTTContentValidator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @scr.component name="input.adapter.extension.adapterService.component" immediate="true"
|
||||||
|
* @scr.reference name="InputAdapterServiceComponent.service"
|
||||||
|
* interface="org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator"
|
||||||
|
* cardinality="0..n"
|
||||||
|
* policy="dynamic"
|
||||||
|
* bind="setContentValidator"
|
||||||
|
* unbind="unsetContentValidator"
|
||||||
|
* * @scr.reference name="InputAdapterServiceComponent.service"
|
||||||
|
* interface="org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer"
|
||||||
|
* cardinality="0..n"
|
||||||
|
* policy="dynamic"
|
||||||
|
* bind="setContentTransformer"
|
||||||
|
* unbind="unsetContentTransformer"
|
||||||
|
*/
|
||||||
|
public class InputAdapterServiceComponent {
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(
|
||||||
|
InputAdapterServiceComponent.class);
|
||||||
|
|
||||||
|
protected void activate(ComponentContext context) {
|
||||||
|
try {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Successfully deployed the input adapter extension service");
|
||||||
|
}
|
||||||
|
|
||||||
|
InputAdapterServiceDataHolder.getInstance().addContentTransformer(new DefaultContentTransformer());
|
||||||
|
InputAdapterServiceDataHolder.getInstance().addContentValidator(new DefaultContentValidator());
|
||||||
|
InputAdapterServiceDataHolder.getInstance().addContentValidator(new HTTPContentValidator());
|
||||||
|
InputAdapterServiceDataHolder.getInstance().addContentValidator(new MQTTContentValidator());
|
||||||
|
|
||||||
|
context.getBundleContext().registerService(InputAdapterExtensionService.class,
|
||||||
|
new InputAdapterExtensionServiceImpl(), null);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
log.error("Can not create the input adapter service ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setContentValidator(ContentValidator contentValidator) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Setting ContentValidator Service");
|
||||||
|
}
|
||||||
|
InputAdapterServiceDataHolder.getInstance().addContentValidator(contentValidator);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void unsetContentValidator(ContentValidator contentValidator) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Un-setting ContentValidator Service");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setContentTransformer(ContentTransformer contentTransformer) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Setting contentTransformer Service");
|
||||||
|
}
|
||||||
|
InputAdapterServiceDataHolder.getInstance().addContentTransformer(contentTransformer);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void unsetContentValidator(ContentTransformer contentTransformer) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Un-setting ContentTransformer Service");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.extension.internal;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* common place to hold some OSGI service references.
|
||||||
|
*/
|
||||||
|
public class InputAdapterServiceDataHolder {
|
||||||
|
|
||||||
|
private static InputAdapterServiceDataHolder inputAdapterServiceDataHolder = new InputAdapterServiceDataHolder();
|
||||||
|
private static Map<String, ContentValidator> contentValidatorMap = new HashMap<>();
|
||||||
|
private static Map<String, ContentTransformer> contentTransformerMap = new HashMap<>();
|
||||||
|
|
||||||
|
private InputAdapterServiceDataHolder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static InputAdapterServiceDataHolder getInstance() {
|
||||||
|
return inputAdapterServiceDataHolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, ContentValidator> getContentValidatorMap() {
|
||||||
|
return contentValidatorMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addContentValidator(ContentValidator contentValidator) {
|
||||||
|
InputAdapterServiceDataHolder.contentValidatorMap.put(contentValidator.getType(), contentValidator);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, ContentTransformer> getContentTransformerMap() {
|
||||||
|
return contentTransformerMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addContentTransformer(ContentTransformer contentTransformer) {
|
||||||
|
InputAdapterServiceDataHolder.contentTransformerMap.put(contentTransformer.getType(), contentTransformer);
|
||||||
|
}
|
||||||
|
}
|
10
components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentTransformer.java → components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/transformer/DefaultContentTransformer.java
10
components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentTransformer.java → components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/transformer/DefaultContentTransformer.java
11
components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentValidator.java → components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/DefaultContentValidator.java
11
components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentValidator.java → components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/DefaultContentValidator.java
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, 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.input.adapter.extension.validator;
|
||||||
|
|
||||||
|
import com.jayway.jsonpath.JsonPath;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.json.simple.JSONArray;
|
||||||
|
import org.json.simple.parser.JSONParser;
|
||||||
|
import org.json.simple.parser.ParseException;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentInfo;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class HTTPContentValidator implements ContentValidator {
|
||||||
|
private static final Log log = LogFactory.getLog(HTTPContentValidator.class);
|
||||||
|
private static String JSON_ARRAY_START_CHAR = "[";
|
||||||
|
private static String CDMF_SCOPE_PREFIX = "cdmf";
|
||||||
|
private static String CDMF_SCOPE_SEPERATOR = "/";
|
||||||
|
private static String CDMF_HTTP_CONTENT_VALIDATOR = "iot-http";
|
||||||
|
public static final String DEVICE_ID_JSON_PATH = "event.metaData.deviceId";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return CDMF_HTTP_CONTENT_VALIDATOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContentInfo validate(Object msgPayload, Map<String, Object> dynamicParams) {
|
||||||
|
String deviceId = (String) dynamicParams.get("deviceId");
|
||||||
|
String msg = (String) msgPayload;
|
||||||
|
String deviceIdJsonPath = DEVICE_ID_JSON_PATH;
|
||||||
|
boolean status;
|
||||||
|
if (msg.startsWith(JSON_ARRAY_START_CHAR)) {
|
||||||
|
status = processMultipleEvents(msg, deviceId, deviceIdJsonPath);
|
||||||
|
} else {
|
||||||
|
status = processSingleEvent(msg, deviceId, deviceIdJsonPath);
|
||||||
|
}
|
||||||
|
return new ContentInfo(status, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean processSingleEvent(String msg, String deviceIdFromTopic, String deviceIdJsonPath) {
|
||||||
|
Object res = JsonPath.read(msg, deviceIdJsonPath);
|
||||||
|
String deviceIdFromContent = (res != null) ? res.toString() : "";
|
||||||
|
if (deviceIdFromContent.equals(deviceIdFromTopic)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean processMultipleEvents(String msg, String deviceIdFromTopic, String deviceIdJsonPath) {
|
||||||
|
try {
|
||||||
|
JSONParser jsonParser = new JSONParser();
|
||||||
|
JSONArray jsonArray = (JSONArray) jsonParser.parse(msg);
|
||||||
|
boolean status = false;
|
||||||
|
for (int i = 0; i < jsonArray.size(); i++) {
|
||||||
|
status = processSingleEvent(jsonArray.get(i).toString(), deviceIdFromTopic, deviceIdJsonPath);
|
||||||
|
if (!status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
} catch (ParseException e) {
|
||||||
|
log.error("Invalid input " + msg, e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
18
components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTContentValidator.java → components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/MQTTContentValidator.java
18
components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTContentValidator.java → components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/MQTTContentValidator.java
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, 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.input.adapter.http.authorization;
|
||||||
|
|
||||||
|
import feign.Feign;
|
||||||
|
import feign.FeignException;
|
||||||
|
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.wso2.carbon.device.mgt.input.adapter.http.authorization.client.OAuthRequestInterceptor;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.AuthorizationRequest;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.DeviceAccessAuthorizationAdminService;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.DeviceAuthorizationResult;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.DeviceIdentifier;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.util.AuthenticationInfo;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.util.PropertyUtils;
|
||||||
|
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This authorizer crossvalidates the request with device id and device type.
|
||||||
|
*/
|
||||||
|
public class DeviceAuthorizer {
|
||||||
|
|
||||||
|
private static DeviceAccessAuthorizationAdminService deviceAccessAuthorizationAdminService;
|
||||||
|
private static final String CDMF_SERVER_BASE_CONTEXT = "/api/device-mgt/v1.0";
|
||||||
|
private static final String DEVICE_MGT_SERVER_URL = "deviceMgtServerUrl";
|
||||||
|
private static Log logger = LogFactory.getLog(DeviceAuthorizer.class);
|
||||||
|
|
||||||
|
public DeviceAuthorizer(Map<String, String> globalProperties) {
|
||||||
|
try {
|
||||||
|
deviceAccessAuthorizationAdminService = Feign.builder()
|
||||||
|
.requestInterceptor(new OAuthRequestInterceptor(globalProperties))
|
||||||
|
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
|
||||||
|
.target(DeviceAccessAuthorizationAdminService.class, getDeviceMgtServerUrl(globalProperties)
|
||||||
|
+ CDMF_SERVER_BASE_CONTEXT);
|
||||||
|
} catch (InputEventAdapterException e) {
|
||||||
|
logger.error("Invalid value for deviceMgtServerUrl in globalProperties.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isAuthorized(AuthenticationInfo authenticationInfo, String deviceId, String deviceType) {
|
||||||
|
|
||||||
|
if (deviceId != null && !deviceId.isEmpty() && deviceType != null && !deviceType.isEmpty()) {
|
||||||
|
|
||||||
|
AuthorizationRequest authorizationRequest = new AuthorizationRequest();
|
||||||
|
authorizationRequest.setTenantDomain(authenticationInfo.getTenantDomain());
|
||||||
|
authorizationRequest.setUsername(authenticationInfo.getUsername());
|
||||||
|
DeviceIdentifier deviceIdentifier = new DeviceIdentifier();
|
||||||
|
deviceIdentifier.setId(deviceId);
|
||||||
|
deviceIdentifier.setType(deviceType);
|
||||||
|
List<DeviceIdentifier> deviceIdentifiers = new ArrayList<>();
|
||||||
|
deviceIdentifiers.add(deviceIdentifier);
|
||||||
|
authorizationRequest.setDeviceIdentifiers(deviceIdentifiers);
|
||||||
|
try {
|
||||||
|
DeviceAuthorizationResult deviceAuthorizationResult =
|
||||||
|
deviceAccessAuthorizationAdminService.isAuthorized(authorizationRequest);
|
||||||
|
List<DeviceIdentifier> devices = deviceAuthorizationResult.getAuthorizedDevices();
|
||||||
|
if (devices != null && devices.size() > 0) {
|
||||||
|
DeviceIdentifier authorizedDevice = devices.get(0);
|
||||||
|
if (authorizedDevice.getId().equals(deviceId) && authorizedDevice.getType().equals(deviceType)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (FeignException e) {
|
||||||
|
logger.error(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDeviceMgtServerUrl(Map<String, String> properties) throws InputEventAdapterException {
|
||||||
|
String deviceMgtServerUrl = PropertyUtils.replaceProperty(properties.get(DEVICE_MGT_SERVER_URL));
|
||||||
|
if (deviceMgtServerUrl == null || deviceMgtServerUrl.isEmpty()) {
|
||||||
|
logger.error("deviceMgtServerUrl can't be empty ");
|
||||||
|
}
|
||||||
|
return deviceMgtServerUrl;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.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.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.AccessTokenInfo;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.ApiApplicationKey;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.ApiApplicationRegistrationService;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.ApiRegistrationProfile;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.TokenIssuerService;
|
||||||
|
import org.wso2.carbon.device.mgt.input.adapter.http.util.PropertyUtils;
|
||||||
|
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a request interceptor to add oauth token header.
|
||||||
|
*/
|
||||||
|
public class OAuthRequestInterceptor implements RequestInterceptor {
|
||||||
|
|
||||||
|
private AccessTokenInfo tokenInfo;
|
||||||
|
private long 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 = "websocket-app";
|
||||||
|
private static final String PASSWORD_GRANT_TYPE = "password";
|
||||||
|
private static final String REFRESH_GRANT_TYPE = "refresh_token";
|
||||||
|
private static final String REQUIRED_SCOPE = "perm:authorization:verify";
|
||||||
|
private ApiApplicationRegistrationService apiApplicationRegistrationService;
|
||||||
|
private TokenIssuerService tokenIssuerService;
|
||||||
|
|
||||||
|
private static Log logger = LogFactory.getLog(OAuthRequestInterceptor.class);
|
||||||
|
|
||||||
|
private static final String CONNECTION_USERNAME = "username";
|
||||||
|
private static final String CONNECTION_PASSWORD = "password";
|
||||||
|
private static final String TOKEN_ENDPOINT = "tokenUrl";
|
||||||
|
private static final String TOKEN_REFRESH_TIME_OFFSET = "tokenRefreshTimeOffset";
|
||||||
|
private static final String TOKEN_SCOPES = "scopes";
|
||||||
|
private static final String DEVICE_MGT_SERVER_URL = "deviceMgtServerUrl";
|
||||||
|
private static final String TOKEN_ENDPOINT_CONTEXT = "tokenUrl";
|
||||||
|
private static String username;
|
||||||
|
private static String password;
|
||||||
|
private static String tokenEndpoint;
|
||||||
|
private static String deviceMgtServerUrl;
|
||||||
|
private static String scopes;
|
||||||
|
private static Map<String, String> globalProperties;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an interceptor that authenticates all requests.
|
||||||
|
*/
|
||||||
|
public OAuthRequestInterceptor(Map<String, String> globalProperties) {
|
||||||
|
this.globalProperties = globalProperties;
|
||||||
|
try {
|
||||||
|
deviceMgtServerUrl = getDeviceMgtServerUrl(globalProperties);
|
||||||
|
refreshTimeOffset = getRefreshTimeOffset(globalProperties) * 1000;
|
||||||
|
username = getUsername(globalProperties);
|
||||||
|
password = getPassword(globalProperties);
|
||||||
|
tokenEndpoint = getTokenEndpoint(globalProperties);
|
||||||
|
apiApplicationRegistrationService = Feign.builder().requestInterceptor(
|
||||||
|
new BasicAuthRequestInterceptor(username, password))
|
||||||
|
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
|
||||||
|
.target(ApiApplicationRegistrationService.class,
|
||||||
|
deviceMgtServerUrl + API_APPLICATION_REGISTRATION_CONTEXT);
|
||||||
|
} catch (InputEventAdapterException e) {
|
||||||
|
logger.error("Invalid url: deviceMgtServerUrl" + deviceMgtServerUrl + " or tokenEndpoint:" + tokenEndpoint,
|
||||||
|
e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(RequestTemplate template) {
|
||||||
|
if (tokenInfo == null) {
|
||||||
|
//had to do on demand initialization due to start up error.
|
||||||
|
ApiRegistrationProfile apiRegistrationProfile = new ApiRegistrationProfile();
|
||||||
|
apiRegistrationProfile.setApplicationName(APPLICATION_NAME);
|
||||||
|
apiRegistrationProfile.setIsAllowedToAllDomains(false);
|
||||||
|
apiRegistrationProfile.setIsMappingAnExistingOAuthApp(false);
|
||||||
|
apiRegistrationProfile.setTags(DEVICE_MANAGEMENT_SERVICE_TAG);
|
||||||
|
ApiApplicationKey apiApplicationKey = apiApplicationRegistrationService.register(apiRegistrationProfile);
|
||||||
|
String consumerKey = apiApplicationKey.getConsumerKey();
|
||||||
|
String consumerSecret = apiApplicationKey.getConsumerSecret();
|
||||||
|
tokenIssuerService = Feign.builder().requestInterceptor(
|
||||||
|
new BasicAuthRequestInterceptor(consumerKey, consumerSecret))
|
||||||
|
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
|
||||||
|
.target(TokenIssuerService.class, tokenEndpoint);
|
||||||
|
tokenInfo = tokenIssuerService.getToken(PASSWORD_GRANT_TYPE, username, password, REQUIRED_SCOPE);
|
||||||
|
tokenInfo.setExpires_in(System.currentTimeMillis() + (tokenInfo.getExpires_in() * 1000));
|
||||||
|
}
|
||||||
|
synchronized(this) {
|
||||||
|
if (System.currentTimeMillis() + refreshTimeOffset > tokenInfo.getExpires_in()) {
|
||||||
|
tokenInfo = tokenIssuerService.getToken(REFRESH_GRANT_TYPE, tokenInfo.getRefresh_token());
|
||||||
|
tokenInfo.setExpires_in(System.currentTimeMillis() + tokenInfo.getExpires_in());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String headerValue = "Bearer " + tokenInfo.getAccess_token();
|
||||||
|
template.header("Authorization", headerValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getUsername(Map<String, String> globalProperties) {
|
||||||
|
String username = globalProperties.get(CONNECTION_USERNAME);
|
||||||
|
if (username == null || username.isEmpty()) {
|
||||||
|
logger.error("username can't be empty ");
|
||||||
|
}
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getPassword(Map<String, String> globalProperties) {
|
||||||
|
String password = globalProperties.get(CONNECTION_PASSWORD);;
|
||||||
|
if (password == null || password.isEmpty()) {
|
||||||
|
logger.error("password can't be empty ");
|
||||||
|
}
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDeviceMgtServerUrl(Map<String, String> globalProperties) throws InputEventAdapterException {
|
||||||
|
String deviceMgtServerUrl = globalProperties.get(DEVICE_MGT_SERVER_URL);
|
||||||
|
if (deviceMgtServerUrl == null || deviceMgtServerUrl.isEmpty()) {
|
||||||
|
logger.error("deviceMgtServerUrl can't be empty ");
|
||||||
|
}
|
||||||
|
return PropertyUtils.replaceProperty(deviceMgtServerUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getTokenEndpoint(Map<String, String> globalProperties) throws InputEventAdapterException {
|
||||||
|
String tokenEndpoint = globalProperties.get(TOKEN_ENDPOINT_CONTEXT);
|
||||||
|
if ( tokenEndpoint.isEmpty()) {
|
||||||
|
logger.error("tokenEndpoint can't be empty ");
|
||||||
|
}
|
||||||
|
return PropertyUtils.replaceProperty(tokenEndpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private long getRefreshTimeOffset(Map<String, String> globalProperties) {
|
||||||
|
long refreshTimeOffset = 100;
|
||||||
|
try {
|
||||||
|
refreshTimeOffset = Long.parseLong(globalProperties.get(TOKEN_REFRESH_TIME_OFFSET));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
logger.error("refreshTimeOffset should be a number", e);
|
||||||
|
}
|
||||||
|
return refreshTimeOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This hold access token info that returned from the api call
|
||||||
|
*/
|
||||||
|
public class AccessTokenInfo {
|
||||||
|
public String token_type;
|
||||||
|
public long expires_in;
|
||||||
|
public String refresh_token;
|
||||||
|
public String access_token;
|
||||||
|
|
||||||
|
public String getToken_type() {
|
||||||
|
return token_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setToken_type(String token_type) {
|
||||||
|
this.token_type = token_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getExpires_in() {
|
||||||
|
return expires_in;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExpires_in(long expires_in) {
|
||||||
|
this.expires_in = expires_in;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRefresh_token() {
|
||||||
|
return refresh_token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRefresh_token(String refresh_token) {
|
||||||
|
this.refresh_token = refresh_token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccess_token() {
|
||||||
|
return access_token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccess_token(String access_token) {
|
||||||
|
this.access_token = access_token;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, 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.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This holds api application consumer key and secret.
|
||||||
|
*/
|
||||||
|
public class ApiApplicationKey {
|
||||||
|
private String client_id;
|
||||||
|
private String client_secret;
|
||||||
|
|
||||||
|
public String getConsumerKey() {
|
||||||
|
return this.client_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClient_id(String consumerKey) {
|
||||||
|
this.client_id = consumerKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getConsumerSecret() {
|
||||||
|
return this.client_secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClient_secret(String consumerSecret) {
|
||||||
|
this.client_secret = consumerSecret;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.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);
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.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;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DTO of the authorization request
|
||||||
|
*/
|
||||||
|
public class AuthorizationRequest {
|
||||||
|
|
||||||
|
String tenantDomain;
|
||||||
|
String username;
|
||||||
|
List<DeviceIdentifier> deviceIdentifiers;
|
||||||
|
List<String> permissions;
|
||||||
|
|
||||||
|
public String getTenantDomain() {
|
||||||
|
return tenantDomain;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTenantDomain(String tenantDomain) {
|
||||||
|
this.tenantDomain = tenantDomain;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DeviceIdentifier> getDeviceIdentifiers() {
|
||||||
|
return deviceIdentifiers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeviceIdentifiers(List<DeviceIdentifier> deviceIdentifiers) {
|
||||||
|
this.deviceIdentifiers = deviceIdentifiers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getPermissions() {
|
||||||
|
return permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPermissions(List<String> permissions) {
|
||||||
|
this.permissions = permissions;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, 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.input.adapter.http.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;
|
||||||
|
|
||||||
|
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Path("/admin/authorization")
|
||||||
|
/**
|
||||||
|
* This interface provided the definition of the device - user access verification service.
|
||||||
|
*/
|
||||||
|
public interface DeviceAccessAuthorizationAdminService {
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
DeviceAuthorizationResult isAuthorized(AuthorizationRequest authorizationRequest);
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* 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.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a DeviceAuthorizationResult including a list of authorized devices and a list of unauthorized devices.
|
||||||
|
*/
|
||||||
|
public class DeviceAuthorizationResult {
|
||||||
|
|
||||||
|
private List<DeviceIdentifier> authorizedDevices = new ArrayList<>();
|
||||||
|
private List<DeviceIdentifier> unauthorizedDevices = new ArrayList<>();
|
||||||
|
|
||||||
|
public List<DeviceIdentifier> getAuthorizedDevices() {
|
||||||
|
return authorizedDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAuthorizedDevices(List<DeviceIdentifier> authorizedDevices) {
|
||||||
|
this.authorizedDevices = authorizedDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUnauthorizedDevices(
|
||||||
|
List<DeviceIdentifier> unauthorizedDevices) {
|
||||||
|
this.unauthorizedDevices = unauthorizedDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAuthorizedDevice(DeviceIdentifier deviceIdentifier) {
|
||||||
|
authorizedDevices.add(deviceIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DeviceIdentifier> getUnauthorizedDevices() {
|
||||||
|
return unauthorizedDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addUnauthorizedDevice(DeviceIdentifier deviceIdentifier) {
|
||||||
|
unauthorizedDevices.add(deviceIdentifier);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* 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.device.mgt.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DTO of the device identifier
|
||||||
|
*/
|
||||||
|
public class DeviceIdentifier implements Serializable{
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
public DeviceIdentifier() {}
|
||||||
|
|
||||||
|
public DeviceIdentifier(String id, String type) {
|
||||||
|
this.id = id;
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type.toLowerCase();
|
||||||
|
}
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class represents an OAuth application populated with necessary data.
|
||||||
|
*/
|
||||||
|
public class OAuthApplicationInfo {
|
||||||
|
|
||||||
|
public String client_id;
|
||||||
|
public String client_name;
|
||||||
|
public String callback_url;
|
||||||
|
public String client_secret;
|
||||||
|
|
||||||
|
public String getClient_id() {
|
||||||
|
return client_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClient_id(String client_id) {
|
||||||
|
this.client_id = client_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClient_name() {
|
||||||
|
return client_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClient_name(String client_name) {
|
||||||
|
this.client_name = client_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCallback_url() {
|
||||||
|
return callback_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCallback_url(String callback_url) {
|
||||||
|
this.callback_url = callback_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClient_secret() {
|
||||||
|
return client_secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClient_secret(String client_secret) {
|
||||||
|
this.client_secret = client_secret;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This holds the data related to registration.
|
||||||
|
*/
|
||||||
|
public class RegisterInfo {
|
||||||
|
|
||||||
|
private boolean isRegistered;
|
||||||
|
private String msg;
|
||||||
|
|
||||||
|
public boolean isRegistered() {
|
||||||
|
return isRegistered;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsRegistered(boolean isRegistered) {
|
||||||
|
this.isRegistered = isRegistered;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMsg() {
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMsg(String msg) {
|
||||||
|
this.msg = msg;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class represents the data that are required to register
|
||||||
|
* the oauth application.
|
||||||
|
*/
|
||||||
|
public class RegistrationProfile {
|
||||||
|
|
||||||
|
public String callbackUrl;
|
||||||
|
public String clientName;
|
||||||
|
public String tokenScope;
|
||||||
|
public String owner;
|
||||||
|
public String grantType;
|
||||||
|
public String applicationType;
|
||||||
|
|
||||||
|
public String getCallbackUrl() {
|
||||||
|
return callbackUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCallbackUrl(String callBackUrl) {
|
||||||
|
this.callbackUrl = callBackUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClientName() {
|
||||||
|
return clientName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClientName(String clientName) {
|
||||||
|
this.clientName = clientName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTokenScope() {
|
||||||
|
return tokenScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTokenScope(String tokenScope) {
|
||||||
|
this.tokenScope = tokenScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOwner() {
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOwner(String owner) {
|
||||||
|
this.owner = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGrantType() {
|
||||||
|
return grantType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGrantType(String grantType) {
|
||||||
|
this.grantType = grantType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getApplicationType() {
|
||||||
|
return applicationType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApplicationType(String applicationType) {
|
||||||
|
this.applicationType = applicationType;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed 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.input.adapter.http.authorization.client.dto;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.QueryParam;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This hold the api defintion that is used as a contract with netflix feign.
|
||||||
|
*/
|
||||||
|
public interface TokenIssuerService {
|
||||||
|
|
||||||
|
@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);
|
||||||
|
|
||||||
|
@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, @QueryParam("scope") String scopes);
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
||||||
|
AccessTokenInfo getToken(@QueryParam("grant_type") String grant, @QueryParam("refresh_token") String refreshToken);
|
||||||
|
}
|
@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016, 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.input.adapter.http.util;
|
|
||||||
|
|
||||||
import com.jayway.jsonpath.JsonPath;
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.json.simple.JSONArray;
|
|
||||||
import org.json.simple.parser.JSONParser;
|
|
||||||
import org.json.simple.parser.ParseException;
|
|
||||||
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentInfo;
|
|
||||||
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class HTTPContentValidator implements ContentValidator {
|
|
||||||
private static final Log log = LogFactory.getLog(HTTPContentValidator.class);
|
|
||||||
private static String JSON_ARRAY_START_CHAR = "[";
|
|
||||||
private static String CDMF_SCOPE_PREFIX = "cdmf";
|
|
||||||
private static String CDMF_SCOPE_SEPERATOR = "/";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ContentInfo validate(Object msgPayload, Map<String, Object> dynamicParams) {
|
|
||||||
String deviceId = (String) dynamicParams.get("deviceId");
|
|
||||||
String deviceType = (String) dynamicParams.get("deviceType");
|
|
||||||
String msg = (String) msgPayload;
|
|
||||||
String deviceIdJsonPath = HTTPEventAdapterConstants.DEVICE_ID_JSON_PATH;
|
|
||||||
boolean status;
|
|
||||||
if (status = isValidDevice(deviceId, deviceType, dynamicParams)) {
|
|
||||||
if (msg.startsWith(JSON_ARRAY_START_CHAR)) {
|
|
||||||
status = processMultipleEvents(msg, deviceId, deviceIdJsonPath);
|
|
||||||
} else {
|
|
||||||
status = processSingleEvent(msg, deviceId, deviceIdJsonPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new ContentInfo(status, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean processSingleEvent(String msg, String deviceIdFromTopic, String deviceIdJsonPath) {
|
|
||||||
Object res = JsonPath.read(msg, deviceIdJsonPath);
|
|
||||||
String deviceIdFromContent = (res != null) ? res.toString() : "";
|
|
||||||
if (deviceIdFromContent.equals(deviceIdFromTopic)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean processMultipleEvents(String msg, String deviceIdFromTopic, String deviceIdJsonPath) {
|
|
||||||
try {
|
|
||||||
JSONParser jsonParser = new JSONParser();
|
|
||||||
JSONArray jsonArray = (JSONArray) jsonParser.parse(msg);
|
|
||||||
boolean status = false;
|
|
||||||
for (int i = 0; i < jsonArray.size(); i++) {
|
|
||||||
status = processSingleEvent(jsonArray.get(i).toString(), deviceIdFromTopic, deviceIdJsonPath);
|
|
||||||
if (!status) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
} catch (ParseException e) {
|
|
||||||
log.error("Invalid input " + msg, e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isValidDevice(String deviceId, String deviceType, Map<String, Object> dynamicParams) {
|
|
||||||
List<String> scopes = (List<String>) dynamicParams.get(HTTPEventAdapterConstants.SCOPE_TAG);
|
|
||||||
if (scopes != null) {
|
|
||||||
for (String scope : scopes) {
|
|
||||||
if (scope.startsWith(CDMF_SCOPE_PREFIX)) {
|
|
||||||
String deviceIdInfo[] = scope.split(CDMF_SCOPE_SEPERATOR);
|
|
||||||
if (deviceIdInfo.length == 3) {
|
|
||||||
if (deviceId.equals(deviceIdInfo[2]) && deviceType.equals(deviceIdInfo[1])) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, 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.input.adapter.http.util;
|
||||||
|
|
||||||
|
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
|
||||||
|
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class PropertyUtils {
|
||||||
|
|
||||||
|
//This method is only used if the mb features are within DAS.
|
||||||
|
public static String replaceProperty(String urlWithPlaceholders) throws InputEventAdapterException {
|
||||||
|
String regex = "\\$\\{(.*?)\\}";
|
||||||
|
Pattern pattern = Pattern.compile(regex);
|
||||||
|
Matcher matchPattern = pattern.matcher(urlWithPlaceholders);
|
||||||
|
while (matchPattern.find()) {
|
||||||
|
String sysPropertyName = matchPattern.group(1);
|
||||||
|
String sysPropertyValue = System.getProperty(sysPropertyName);
|
||||||
|
if (sysPropertyValue != null && !sysPropertyName.isEmpty()) {
|
||||||
|
urlWithPlaceholders = urlWithPlaceholders.replaceAll("\\$\\{(" + sysPropertyName + ")\\}", sysPropertyValue);
|
||||||
|
} else {
|
||||||
|
throw new InputEventAdapterException("System property - " + sysPropertyName
|
||||||
|
+ " is not defined, hence cannot resolve : " + urlWithPlaceholders);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return urlWithPlaceholders;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue