mirror of
https://repository.entgra.net/community/device-mgt-plugins.git
synced 2025-09-16 23:42:15 +00:00
device adapters updated
This commit is contained in:
parent
2b6816d7ed
commit
edaacd4989
@ -20,7 +20,7 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
import org.osgi.service.http.HttpService;
|
import org.osgi.service.http.HttpService;
|
||||||
import org.osgi.service.http.NamespaceException;
|
import org.osgi.service.http.NamespaceException;
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.internal.EventAdapterServiceDataHolder;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.internal.InputAdapterServiceDataHolder;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapter;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapter;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener;
|
||||||
@ -180,7 +180,7 @@ public final class HTTPEventAdapter implements InputEventAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
HttpService httpService = EventAdapterServiceDataHolder.getHTTPService();
|
HttpService httpService = InputAdapterServiceDataHolder.getHTTPService();
|
||||||
if (httpService == null) {
|
if (httpService == null) {
|
||||||
throw new InputEventAdapterRuntimeException(
|
throw new InputEventAdapterRuntimeException(
|
||||||
"HttpService not available, Error in registering endpoint " + endpoint);
|
"HttpService not available, Error in registering endpoint " + endpoint);
|
||||||
@ -195,7 +195,7 @@ public final class HTTPEventAdapter implements InputEventAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void unregisterDynamicEndpoint(String adapterName) {
|
private void unregisterDynamicEndpoint(String adapterName) {
|
||||||
HttpService httpService = EventAdapterServiceDataHolder.getHTTPService();
|
HttpService httpService = InputAdapterServiceDataHolder.getHTTPService();
|
||||||
String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain();
|
String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain();
|
||||||
String endpoint;
|
String endpoint;
|
||||||
if (MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equals(tenantDomain)) {
|
if (MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equals(tenantDomain)) {
|
||||||
|
|||||||
@ -26,14 +26,15 @@ import org.wso2.carbon.device.mgt.iot.input.adapter.ContentTransformer;
|
|||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.DefaultContentTransformer;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.DefaultContentTransformer;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.DefaultContentValidator;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.DefaultContentValidator;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.http.exception.HTTPContentInitializationException;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.http.exception.HTTPContentInitializationException;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.input.adapter.http.jwt.JWTAuthenticator;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.input.adapter.http.oauth.OAuthAuthenticator;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.http.oauth.OAuthTokenValidaterStubFactory;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.http.oauth.OAuthTokenValidaterStubFactory;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.http.util.AuthenticationInfo;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.http.util.AuthenticationInfo;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.http.util.HTTPEventAdapterConstants;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.http.util.HTTPEventAdapterConstants;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.internal.EventAdapterServiceDataHolder;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.internal.InputAdapterServiceDataHolder;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.ContentValidator;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.ContentValidator;
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.mqtt.exception.MQTTContentInitializationException;
|
|
||||||
import org.wso2.carbon.identity.oauth2.stub.OAuth2TokenValidationServiceStub;
|
import org.wso2.carbon.identity.oauth2.stub.OAuth2TokenValidationServiceStub;
|
||||||
import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationRequestDTO;
|
import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationRequestDTO;
|
||||||
import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationRequestDTO_OAuth2AccessToken;
|
import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationRequestDTO_OAuth2AccessToken;
|
||||||
@ -60,20 +61,21 @@ import java.util.regex.Pattern;
|
|||||||
*/
|
*/
|
||||||
public class HTTPMessageServlet extends HttpServlet {
|
public class HTTPMessageServlet extends HttpServlet {
|
||||||
|
|
||||||
private static final String AUTHORIZATION_HEADER = "Authorization";
|
|
||||||
private static final String AUTH_MESSAGE_STORE_AUTHENTICATION_INFO = "AUTH_MESSAGE_STORE_AUTHENTICATION_INFO";
|
private static final String AUTH_MESSAGE_STORE_AUTHENTICATION_INFO = "AUTH_MESSAGE_STORE_AUTHENTICATION_INFO";
|
||||||
private static final String AUTH_FAILURE_RESPONSE = "_AUTH_FAILURE_";
|
private static final String AUTH_FAILURE_RESPONSE = "_AUTH_FAILURE_";
|
||||||
private static final Pattern PATTERN = Pattern.compile("[B|b]earer\\s");
|
|
||||||
private static final String TOKEN_TYPE = "bearer";
|
|
||||||
private static String cookie;
|
|
||||||
private static Log log = LogFactory.getLog(HTTPMessageServlet.class);
|
private static Log log = LogFactory.getLog(HTTPMessageServlet.class);
|
||||||
private GenericObjectPool stubs;
|
|
||||||
private static Map<String, String> contentValidationProperties;
|
private static Map<String, String> contentValidationProperties;
|
||||||
private static ContentValidator contentValidator;
|
private static ContentValidator contentValidator;
|
||||||
private static ContentTransformer contentTransformer;
|
private static ContentTransformer contentTransformer;
|
||||||
private InputEventAdapterListener eventAdaptorListener;
|
private InputEventAdapterListener eventAdaptorListener;
|
||||||
private int tenantId;
|
private int tenantId;
|
||||||
private String exposedTransports;
|
private String exposedTransports;
|
||||||
|
private static JWTAuthenticator jwtAuthenticator;
|
||||||
|
private static OAuthAuthenticator oAuthAuthenticator;
|
||||||
|
|
||||||
public HTTPMessageServlet(InputEventAdapterListener eventAdaptorListener, int tenantId,
|
public HTTPMessageServlet(InputEventAdapterListener eventAdaptorListener, int tenantId,
|
||||||
InputEventAdapterConfiguration eventAdapterConfiguration) {
|
InputEventAdapterConfiguration eventAdapterConfiguration) {
|
||||||
@ -81,7 +83,6 @@ public class HTTPMessageServlet extends HttpServlet {
|
|||||||
this.tenantId = tenantId;
|
this.tenantId = tenantId;
|
||||||
this.exposedTransports = eventAdapterConfiguration.getProperties().get(
|
this.exposedTransports = eventAdapterConfiguration.getProperties().get(
|
||||||
HTTPEventAdapterConstants.EXPOSED_TRANSPORTS);
|
HTTPEventAdapterConstants.EXPOSED_TRANSPORTS);
|
||||||
this.stubs = new GenericObjectPool(new OAuthTokenValidaterStubFactory(eventAdapterConfiguration));
|
|
||||||
HTTPMessageServlet.contentValidationProperties = new HashMap<>();
|
HTTPMessageServlet.contentValidationProperties = new HashMap<>();
|
||||||
String contentValidationParams = eventAdapterConfiguration.getProperties().get(
|
String contentValidationParams = eventAdapterConfiguration.getProperties().get(
|
||||||
HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_PARAMS);
|
HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_PARAMS);
|
||||||
@ -134,143 +135,9 @@ public class HTTPMessageServlet extends HttpServlet {
|
|||||||
throw new HTTPContentInitializationException("Access of the instance in not allowed.", e);
|
throw new HTTPContentInitializationException("Access of the instance in not allowed.", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private String getBearerToken(HttpServletRequest request) {
|
jwtAuthenticator = new JWTAuthenticator();
|
||||||
String authorizationHeader = request.getHeader(AUTHORIZATION_HEADER);
|
oAuthAuthenticator = new OAuthAuthenticator(eventAdapterConfiguration);
|
||||||
if (authorizationHeader != null) {
|
|
||||||
Matcher matcher = PATTERN.matcher(authorizationHeader);
|
|
||||||
if (matcher.find()) {
|
|
||||||
authorizationHeader = authorizationHeader.substring(matcher.end());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return authorizationHeader;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AuthenticationInfo checkAuthentication(HttpServletRequest req) {
|
|
||||||
AuthenticationInfo authenticationInfo = (AuthenticationInfo) req.getSession().getAttribute(
|
|
||||||
AUTH_MESSAGE_STORE_AUTHENTICATION_INFO);
|
|
||||||
if (authenticationInfo != null) {
|
|
||||||
return authenticationInfo;
|
|
||||||
}
|
|
||||||
String bearerToken = getBearerToken(req);
|
|
||||||
if (bearerToken == null) {
|
|
||||||
return authenticationInfo;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
authenticationInfo = validateToken(bearerToken);
|
|
||||||
boolean success = authenticationInfo.isAuthenticated();
|
|
||||||
if (success) {
|
|
||||||
req.getSession().setAttribute(AUTH_MESSAGE_STORE_AUTHENTICATION_INFO, authenticationInfo);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("checkAuthentication() fail: " + e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return authenticationInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method gets a string accessToken and validates it
|
|
||||||
*
|
|
||||||
* @param token which need to be validated.
|
|
||||||
* @return AuthenticationInfo with the validated results.
|
|
||||||
*/
|
|
||||||
private AuthenticationInfo validateToken(String token) {
|
|
||||||
OAuth2TokenValidationServiceStub tokenValidationServiceStub = null;
|
|
||||||
try {
|
|
||||||
Object stub = this.stubs.borrowObject();
|
|
||||||
if (stub != null) {
|
|
||||||
tokenValidationServiceStub = (OAuth2TokenValidationServiceStub) stub;
|
|
||||||
if (cookie != null) {
|
|
||||||
tokenValidationServiceStub._getServiceClient().getOptions().setProperty(
|
|
||||||
HTTPConstants.COOKIE_STRING, cookie);
|
|
||||||
}
|
|
||||||
return getAuthenticationInfo(token, tokenValidationServiceStub);
|
|
||||||
} else {
|
|
||||||
log.warn("Stub initialization failed.");
|
|
||||||
}
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
log.error("Error on connecting with the validation endpoint.", e);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("Error occurred in borrowing an validation stub from the pool.", e);
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if (tokenValidationServiceStub != null) {
|
|
||||||
this.stubs.returnObject(tokenValidationServiceStub);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("Error occurred while returning the object back to the oauth token validation service " +
|
|
||||||
"stub pool.", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AuthenticationInfo authenticationInfo = new AuthenticationInfo();
|
|
||||||
authenticationInfo.setAuthenticated(false);
|
|
||||||
authenticationInfo.setTenantId(-1);
|
|
||||||
return authenticationInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This creates an AuthenticationInfo object that is used for authorization. This method will validate the token
|
|
||||||
* and
|
|
||||||
* sets the required parameters to the object.
|
|
||||||
*
|
|
||||||
* @param token that needs to be validated.
|
|
||||||
* @param tokenValidationServiceStub stub that is used to call the external service.
|
|
||||||
* @return AuthenticationInfo This contains the information related to authenticated client.
|
|
||||||
* @throws RemoteException that triggers when failing to call the external service..
|
|
||||||
*/
|
|
||||||
private AuthenticationInfo getAuthenticationInfo(String token,
|
|
||||||
OAuth2TokenValidationServiceStub tokenValidationServiceStub)
|
|
||||||
throws RemoteException, UserStoreException {
|
|
||||||
AuthenticationInfo authenticationInfo = new AuthenticationInfo();
|
|
||||||
OAuth2TokenValidationRequestDTO validationRequest = new OAuth2TokenValidationRequestDTO();
|
|
||||||
OAuth2TokenValidationRequestDTO_OAuth2AccessToken accessToken =
|
|
||||||
new OAuth2TokenValidationRequestDTO_OAuth2AccessToken();
|
|
||||||
accessToken.setTokenType(TOKEN_TYPE);
|
|
||||||
accessToken.setIdentifier(token);
|
|
||||||
validationRequest.setAccessToken(accessToken);
|
|
||||||
boolean authenticated;
|
|
||||||
OAuth2TokenValidationResponseDTO tokenValidationResponse;
|
|
||||||
tokenValidationResponse = tokenValidationServiceStub.validate(validationRequest);
|
|
||||||
if (tokenValidationResponse == null) {
|
|
||||||
authenticationInfo.setAuthenticated(false);
|
|
||||||
return authenticationInfo;
|
|
||||||
}
|
|
||||||
authenticated = tokenValidationResponse.getValid();
|
|
||||||
if (authenticated) {
|
|
||||||
String authorizedUser = tokenValidationResponse.getAuthorizedUser();
|
|
||||||
String username = MultitenantUtils.getTenantAwareUsername(authorizedUser);
|
|
||||||
String tenantDomain = MultitenantUtils.getTenantDomain(authorizedUser);
|
|
||||||
authenticationInfo.setUsername(username);
|
|
||||||
authenticationInfo.setTenantDomain(tenantDomain);
|
|
||||||
RealmService realmService = EventAdapterServiceDataHolder.getRealmService();
|
|
||||||
int tenantId = realmService.getTenantManager().getTenantId(authenticationInfo.getTenantDomain());
|
|
||||||
authenticationInfo.setTenantId(tenantId);
|
|
||||||
} else {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Token validation failed for token: " + token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ServiceContext serviceContext = tokenValidationServiceStub._getServiceClient()
|
|
||||||
.getLastOperationContext().getServiceContext();
|
|
||||||
cookie = (String) serviceContext.getProperty(HTTPConstants.COOKIE_STRING);
|
|
||||||
authenticationInfo.setAuthenticated(authenticated);
|
|
||||||
return authenticationInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private String inputStreamToString(InputStream in) throws IOException {
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
||||||
byte[] buff = new byte[1024];
|
|
||||||
int i;
|
|
||||||
while ((i = in.read(buff)) > 0) {
|
|
||||||
out.write(buff, 0, i);
|
|
||||||
}
|
|
||||||
out.close();
|
|
||||||
return out.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -361,8 +228,7 @@ public class HTTPMessageServlet extends HttpServlet {
|
|||||||
private String payload;
|
private String payload;
|
||||||
private int tenantId;
|
private int tenantId;
|
||||||
|
|
||||||
public HTTPRequestProcessor(InputEventAdapterListener inputEventAdapterListener,
|
public HTTPRequestProcessor(InputEventAdapterListener inputEventAdapterListener, String payload, int tenantId) {
|
||||||
String payload, int tenantId) {
|
|
||||||
this.inputEventAdapterListener = inputEventAdapterListener;
|
this.inputEventAdapterListener = inputEventAdapterListener;
|
||||||
this.payload = payload;
|
this.payload = payload;
|
||||||
this.tenantId = tenantId;
|
this.tenantId = tenantId;
|
||||||
@ -372,11 +238,9 @@ public class HTTPMessageServlet extends HttpServlet {
|
|||||||
try {
|
try {
|
||||||
PrivilegedCarbonContext.startTenantFlow();
|
PrivilegedCarbonContext.startTenantFlow();
|
||||||
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId);
|
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId);
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Event received in HTTP Event Adapter - " + payload);
|
log.debug("Event received in HTTP Event Adapter - " + payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (payload.trim() != null) {
|
if (payload.trim() != null) {
|
||||||
inputEventAdapterListener.onEvent(payload);
|
inputEventAdapterListener.onEvent(payload);
|
||||||
} else {
|
} else {
|
||||||
@ -388,7 +252,37 @@ public class HTTPMessageServlet extends HttpServlet {
|
|||||||
PrivilegedCarbonContext.endTenantFlow();
|
PrivilegedCarbonContext.endTenantFlow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private AuthenticationInfo checkAuthentication(HttpServletRequest req) {
|
||||||
|
AuthenticationInfo authenticationInfo = (AuthenticationInfo) req.getSession().getAttribute(
|
||||||
|
AUTH_MESSAGE_STORE_AUTHENTICATION_INFO);
|
||||||
|
if (authenticationInfo != null) {
|
||||||
|
return authenticationInfo;
|
||||||
|
}
|
||||||
|
if (jwtAuthenticator.isJWTHeaderExist(req)) {
|
||||||
|
authenticationInfo = jwtAuthenticator.authenticate(req);
|
||||||
|
} else {
|
||||||
|
authenticationInfo = oAuthAuthenticator.authenticate(req);
|
||||||
|
}
|
||||||
|
if (authenticationInfo != null) {
|
||||||
|
boolean success = authenticationInfo.isAuthenticated();
|
||||||
|
if (success) {
|
||||||
|
req.getSession().setAttribute(AUTH_MESSAGE_STORE_AUTHENTICATION_INFO, authenticationInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return authenticationInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String inputStreamToString(InputStream in) throws IOException {
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
byte[] buff = new byte[1024];
|
||||||
|
int i;
|
||||||
|
while ((i = in.read(buff)) > 0) {
|
||||||
|
out.write(buff, 0, i);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
return out.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* 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.iot.input.adapter.http.jwt;
|
||||||
|
|
||||||
|
import com.nimbusds.jose.JOSEException;
|
||||||
|
import com.nimbusds.jose.JWSVerifier;
|
||||||
|
import com.nimbusds.jose.crypto.RSASSAVerifier;
|
||||||
|
import com.nimbusds.jwt.SignedJWT;
|
||||||
|
import org.apache.axiom.util.base64.Base64Utils;
|
||||||
|
import org.apache.axis2.transport.http.HTTPConstants;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.wso2.carbon.core.util.KeyStoreManager;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.input.adapter.http.util.AuthenticationInfo;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.input.adapter.internal.InputAdapterServiceDataHolder;
|
||||||
|
import org.wso2.carbon.user.api.TenantManager;
|
||||||
|
import org.wso2.carbon.user.api.UserStoreException;
|
||||||
|
import org.wso2.carbon.user.api.UserStoreManager;
|
||||||
|
import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
|
||||||
|
import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.security.interfaces.RSAPublicKey;
|
||||||
|
import java.text.ParseException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This authenticator authenticates HTTP requests using JWT header.
|
||||||
|
*/
|
||||||
|
public class JWTAuthenticator {
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(JWTAuthenticator.class);
|
||||||
|
public static final String SIGNED_JWT_AUTH_USERNAME = "Username";
|
||||||
|
private static final String JWT_ASSERTION_HEADER = "X-JWT-Assertion";
|
||||||
|
|
||||||
|
public boolean isJWTHeaderExist(HttpServletRequest request) {
|
||||||
|
String authorizationHeader = request.getHeader(JWT_ASSERTION_HEADER);
|
||||||
|
if((authorizationHeader != null) && !authorizationHeader.isEmpty()){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationInfo authenticate(HttpServletRequest request) {
|
||||||
|
AuthenticationInfo authenticationInfo = new AuthenticationInfo();
|
||||||
|
//Get the filesystem keystore default primary certificate
|
||||||
|
KeyStoreManager keyStoreManager = KeyStoreManager.getInstance(MultitenantConstants.SUPER_TENANT_ID);
|
||||||
|
try {
|
||||||
|
keyStoreManager.getDefaultPrimaryCertificate();
|
||||||
|
String authorizationHeader = request.getHeader(HTTPConstants.HEADER_AUTHORIZATION);
|
||||||
|
String headerData = decodeAuthorizationHeader(authorizationHeader);
|
||||||
|
JWSVerifier verifier =
|
||||||
|
new RSASSAVerifier((RSAPublicKey) keyStoreManager.getDefaultPublicKey());
|
||||||
|
SignedJWT jwsObject = SignedJWT.parse(headerData);
|
||||||
|
if (jwsObject.verify(verifier)) {
|
||||||
|
String username = jwsObject.getJWTClaimsSet().getStringClaim(SIGNED_JWT_AUTH_USERNAME);
|
||||||
|
String tenantDomain = MultitenantUtils.getTenantDomain(username);
|
||||||
|
username = MultitenantUtils.getTenantAwareUsername(username);
|
||||||
|
TenantManager tenantManager = InputAdapterServiceDataHolder.getRealmService().
|
||||||
|
getTenantManager();
|
||||||
|
int tenantId = tenantManager.getTenantId(tenantDomain);
|
||||||
|
if (tenantId == -1) {
|
||||||
|
log.error("tenantDomain is not valid. username : " + username + ", tenantDomain " +
|
||||||
|
": " + tenantDomain);
|
||||||
|
} else {
|
||||||
|
UserStoreManager userStore = InputAdapterServiceDataHolder.getRealmService().
|
||||||
|
getTenantUserRealm(tenantId).getUserStoreManager();
|
||||||
|
if (userStore.isExistingUser(username)) {
|
||||||
|
authenticationInfo.setTenantId(tenantId);
|
||||||
|
authenticationInfo.setUsername(username);
|
||||||
|
authenticationInfo.setTenantDomain(tenantDomain);
|
||||||
|
authenticationInfo.setAuthenticated(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (UserStoreException e) {
|
||||||
|
log.error("Error occurred while obtaining the user.", e);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
log.error("Error occurred while parsing the JWT header.", e);
|
||||||
|
} catch (JOSEException e) {
|
||||||
|
log.error("Error occurred while verifying the JWT header.", e);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error occurred while verifying the JWT header.", e);
|
||||||
|
}
|
||||||
|
return authenticationInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String decodeAuthorizationHeader(String authorizationHeader) {
|
||||||
|
|
||||||
|
if(authorizationHeader == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] splitValues = authorizationHeader.trim().split(" ");
|
||||||
|
byte[] decodedBytes = Base64Utils.decode(splitValues[1].trim());
|
||||||
|
if (decodedBytes != null) {
|
||||||
|
return new String(decodedBytes);
|
||||||
|
} else {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Error decoding authorization header.");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* 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.iot.input.adapter.http.oauth;
|
||||||
|
|
||||||
|
import org.apache.axis2.context.ServiceContext;
|
||||||
|
import org.apache.axis2.transport.http.HTTPConstants;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.commons.pool.impl.GenericObjectPool;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.input.adapter.http.util.AuthenticationInfo;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.input.adapter.internal.InputAdapterServiceDataHolder;
|
||||||
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
||||||
|
import org.wso2.carbon.identity.oauth2.stub.OAuth2TokenValidationServiceStub;
|
||||||
|
import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationRequestDTO;
|
||||||
|
import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationRequestDTO_OAuth2AccessToken;
|
||||||
|
import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationResponseDTO;
|
||||||
|
import org.wso2.carbon.user.api.UserStoreException;
|
||||||
|
import org.wso2.carbon.user.core.service.RealmService;
|
||||||
|
import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.rmi.RemoteException;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticate use oauth validator
|
||||||
|
*/
|
||||||
|
public class OAuthAuthenticator {
|
||||||
|
private static String cookie;
|
||||||
|
private GenericObjectPool stubs;
|
||||||
|
|
||||||
|
private static final Pattern PATTERN = Pattern.compile("[B|b]earer\\s");
|
||||||
|
private static final String TOKEN_TYPE = "bearer";
|
||||||
|
private static final String AUTHORIZATION_HEADER = "Authorization";
|
||||||
|
private static Log log = LogFactory.getLog(OAuthAuthenticator.class);
|
||||||
|
|
||||||
|
public OAuthAuthenticator(InputEventAdapterConfiguration eventAdapterConfiguration) {
|
||||||
|
this.stubs = new GenericObjectPool(new OAuthTokenValidaterStubFactory(eventAdapterConfiguration));
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationInfo authenticate(HttpServletRequest req) {
|
||||||
|
AuthenticationInfo authenticationInfo = new AuthenticationInfo();
|
||||||
|
String bearerToken = getBearerToken(req);
|
||||||
|
if (bearerToken == null) {
|
||||||
|
return authenticationInfo;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
authenticationInfo = validateToken(bearerToken);
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("checkAuthentication() fail: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return authenticationInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getBearerToken(HttpServletRequest request) {
|
||||||
|
String authorizationHeader = request.getHeader(AUTHORIZATION_HEADER);
|
||||||
|
if (authorizationHeader != null) {
|
||||||
|
Matcher matcher = PATTERN.matcher(authorizationHeader);
|
||||||
|
if (matcher.find()) {
|
||||||
|
authorizationHeader = authorizationHeader.substring(matcher.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return authorizationHeader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This creates an AuthenticationInfo object that is used for authorization. This method will validate the token
|
||||||
|
* and
|
||||||
|
* sets the required parameters to the object.
|
||||||
|
*
|
||||||
|
* @param token that needs to be validated.
|
||||||
|
* @param tokenValidationServiceStub stub that is used to call the external service.
|
||||||
|
* @return AuthenticationInfo This contains the information related to authenticated client.
|
||||||
|
* @throws RemoteException that triggers when failing to call the external service..
|
||||||
|
*/
|
||||||
|
private AuthenticationInfo getAuthenticationInfo(String token,
|
||||||
|
OAuth2TokenValidationServiceStub tokenValidationServiceStub)
|
||||||
|
throws RemoteException, UserStoreException {
|
||||||
|
AuthenticationInfo authenticationInfo = new AuthenticationInfo();
|
||||||
|
OAuth2TokenValidationRequestDTO validationRequest = new OAuth2TokenValidationRequestDTO();
|
||||||
|
OAuth2TokenValidationRequestDTO_OAuth2AccessToken accessToken =
|
||||||
|
new OAuth2TokenValidationRequestDTO_OAuth2AccessToken();
|
||||||
|
accessToken.setTokenType(TOKEN_TYPE);
|
||||||
|
accessToken.setIdentifier(token);
|
||||||
|
validationRequest.setAccessToken(accessToken);
|
||||||
|
boolean authenticated;
|
||||||
|
OAuth2TokenValidationResponseDTO tokenValidationResponse;
|
||||||
|
tokenValidationResponse = tokenValidationServiceStub.validate(validationRequest);
|
||||||
|
if (tokenValidationResponse == null) {
|
||||||
|
authenticationInfo.setAuthenticated(false);
|
||||||
|
return authenticationInfo;
|
||||||
|
}
|
||||||
|
authenticated = tokenValidationResponse.getValid();
|
||||||
|
if (authenticated) {
|
||||||
|
String authorizedUser = tokenValidationResponse.getAuthorizedUser();
|
||||||
|
String username = MultitenantUtils.getTenantAwareUsername(authorizedUser);
|
||||||
|
String tenantDomain = MultitenantUtils.getTenantDomain(authorizedUser);
|
||||||
|
authenticationInfo.setUsername(username);
|
||||||
|
authenticationInfo.setTenantDomain(tenantDomain);
|
||||||
|
RealmService realmService = InputAdapterServiceDataHolder.getRealmService();
|
||||||
|
int tenantId = realmService.getTenantManager().getTenantId(authenticationInfo.getTenantDomain());
|
||||||
|
authenticationInfo.setTenantId(tenantId);
|
||||||
|
} else {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Token validation failed for token: " + token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ServiceContext serviceContext = tokenValidationServiceStub._getServiceClient()
|
||||||
|
.getLastOperationContext().getServiceContext();
|
||||||
|
cookie = (String) serviceContext.getProperty(HTTPConstants.COOKIE_STRING);
|
||||||
|
authenticationInfo.setAuthenticated(authenticated);
|
||||||
|
return authenticationInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method gets a string accessToken and validates it
|
||||||
|
*
|
||||||
|
* @param token which need to be validated.
|
||||||
|
* @return AuthenticationInfo with the validated results.
|
||||||
|
*/
|
||||||
|
private AuthenticationInfo validateToken(String token) {
|
||||||
|
OAuth2TokenValidationServiceStub tokenValidationServiceStub = null;
|
||||||
|
try {
|
||||||
|
Object stub = this.stubs.borrowObject();
|
||||||
|
if (stub != null) {
|
||||||
|
tokenValidationServiceStub = (OAuth2TokenValidationServiceStub) stub;
|
||||||
|
if (cookie != null) {
|
||||||
|
tokenValidationServiceStub._getServiceClient().getOptions().setProperty(
|
||||||
|
HTTPConstants.COOKIE_STRING, cookie);
|
||||||
|
}
|
||||||
|
return getAuthenticationInfo(token, tokenValidationServiceStub);
|
||||||
|
} else {
|
||||||
|
log.warn("Stub initialization failed.");
|
||||||
|
}
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
log.error("Error on connecting with the validation endpoint.", e);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error occurred in borrowing an validation stub from the pool.", e);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (tokenValidationServiceStub != null) {
|
||||||
|
this.stubs.returnObject(tokenValidationServiceStub);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("Error occurred while returning the object back to the oauth token validation service " +
|
||||||
|
"stub pool.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AuthenticationInfo authenticationInfo = new AuthenticationInfo();
|
||||||
|
authenticationInfo.setAuthenticated(false);
|
||||||
|
authenticationInfo.setTenantId(-1);
|
||||||
|
return authenticationInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -32,16 +32,16 @@ import org.wso2.carbon.user.core.service.RealmService;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @scr.component name="org.wso2.carbon.event.input.adapter.extension.EventAdapterServiceComponent" immediate="true"
|
* @scr.component name="org.wso2.carbon.event.input.adapter.extension.InputAdapterServiceComponent" immediate="true"
|
||||||
* @scr.reference name="user.realmservice.default"
|
* @scr.reference name="user.realmservice.default"
|
||||||
* interface="org.wso2.carbon.user.core.service.RealmService" cardinality="1..1"
|
* interface="org.wso2.carbon.user.core.service.RealmService" cardinality="1..1"
|
||||||
* policy="dynamic" bind="setRealmService" unbind="unsetRealmService"
|
* policy="dynamic" bind="setRealmService" unbind="unsetRealmService"
|
||||||
* @scr.reference name="http.service" interface="org.osgi.service.http.HttpService"
|
* @scr.reference name="http.service" interface="org.osgi.service.http.HttpService"
|
||||||
* cardinality="1..1" policy="dynamic" bind="setHttpService" unbind="unsetHttpService"
|
* cardinality="1..1" policy="dynamic" bind="setHttpService" unbind="unsetHttpService"
|
||||||
*/
|
*/
|
||||||
public class EventAdapterServiceComponent {
|
public class InputAdapterServiceComponent {
|
||||||
|
|
||||||
private static final Log log = LogFactory.getLog(EventAdapterServiceComponent.class);
|
private static final Log log = LogFactory.getLog(InputAdapterServiceComponent.class);
|
||||||
|
|
||||||
protected void activate(ComponentContext context) {
|
protected void activate(ComponentContext context) {
|
||||||
try {
|
try {
|
||||||
@ -63,19 +63,19 @@ public class EventAdapterServiceComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void setRealmService(RealmService realmService) {
|
protected void setRealmService(RealmService realmService) {
|
||||||
EventAdapterServiceDataHolder.registerRealmService(realmService);
|
InputAdapterServiceDataHolder.registerRealmService(realmService);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void unsetRealmService(RealmService realmService) {
|
protected void unsetRealmService(RealmService realmService) {
|
||||||
EventAdapterServiceDataHolder.registerRealmService(null);
|
InputAdapterServiceDataHolder.registerRealmService(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setHttpService(HttpService httpService) {
|
protected void setHttpService(HttpService httpService) {
|
||||||
EventAdapterServiceDataHolder.registerHTTPService(httpService);
|
InputAdapterServiceDataHolder.registerHTTPService(httpService);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void unsetHttpService(HttpService httpService) {
|
protected void unsetHttpService(HttpService httpService) {
|
||||||
EventAdapterServiceDataHolder.registerHTTPService(null);
|
InputAdapterServiceDataHolder.registerHTTPService(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -20,17 +20,17 @@ import org.wso2.carbon.user.core.service.RealmService;
|
|||||||
/**
|
/**
|
||||||
* common place to hold some OSGI service references.
|
* common place to hold some OSGI service references.
|
||||||
*/
|
*/
|
||||||
public final class EventAdapterServiceDataHolder {
|
public final class InputAdapterServiceDataHolder {
|
||||||
|
|
||||||
private static RealmService realmService;
|
private static RealmService realmService;
|
||||||
private static HttpService httpService;
|
private static HttpService httpService;
|
||||||
|
|
||||||
private EventAdapterServiceDataHolder() {
|
private InputAdapterServiceDataHolder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void registerRealmService(
|
public static void registerRealmService(
|
||||||
RealmService realmService) {
|
RealmService realmService) {
|
||||||
EventAdapterServiceDataHolder.realmService = realmService;
|
InputAdapterServiceDataHolder.realmService = realmService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RealmService getRealmService() {
|
public static RealmService getRealmService() {
|
||||||
@ -39,7 +39,7 @@ public final class EventAdapterServiceDataHolder {
|
|||||||
|
|
||||||
public static void registerHTTPService(
|
public static void registerHTTPService(
|
||||||
HttpService httpService) {
|
HttpService httpService) {
|
||||||
EventAdapterServiceDataHolder.httpService = httpService;
|
InputAdapterServiceDataHolder.httpService = httpService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpService getHTTPService() {
|
public static HttpService getHTTPService() {
|
||||||
@ -17,7 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.input.adapter.xmpp;
|
package org.wso2.carbon.device.mgt.iot.input.adapter.xmpp;
|
||||||
|
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.mqtt.util.MQTTEventAdapterConstants;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.input.adapter.xmpp.util.XMPPEventAdapterConstants;
|
import org.wso2.carbon.device.mgt.iot.input.adapter.xmpp.util.XMPPEventAdapterConstants;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapter;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapter;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
||||||
|
|||||||
@ -15,19 +15,19 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util.MQTTAdapterPublisher;
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util.MQTTEventAdapterConstants;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util.MQTTBrokerConnectionConfiguration;
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util.MQTTAdapterPublisher;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util.MQTTBrokerConnectionConfiguration;
|
||||||
import org.wso2.carbon.event.output.adapter.core.EventAdapterUtil;
|
import org.wso2.carbon.event.output.adapter.core.EventAdapterUtil;
|
||||||
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapter;
|
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapter;
|
||||||
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterConfiguration;
|
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterConfiguration;
|
||||||
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException;
|
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException;
|
||||||
import org.wso2.carbon.event.output.adapter.core.exception.TestConnectionNotSupportedException;
|
import org.wso2.carbon.event.output.adapter.core.exception.TestConnectionNotSupportedException;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util.MQTTEventAdapterConstants;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
@ -15,10 +15,10 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util.MQTTEventAdapterConstants;
|
||||||
import org.wso2.carbon.event.output.adapter.core.*;
|
import org.wso2.carbon.event.output.adapter.core.*;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util.MQTTEventAdapterConstants;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -15,12 +15,12 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.internal;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.internal;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.osgi.service.component.ComponentContext;
|
import org.osgi.service.component.ComponentContext;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.MQTTEventAdapterFactory;
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.MQTTEventAdapterFactory;
|
||||||
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterFactory;
|
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterFactory;
|
||||||
|
|
||||||
|
|
||||||
@ -15,7 +15,7 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This holds the constants related to MQTT input adapter.
|
* This holds the constants related to MQTT input adapter.
|
||||||
@ -15,7 +15,7 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
@ -15,7 +15,7 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
public class MQTTBrokerConnectionConfiguration {
|
public class MQTTBrokerConnectionConfiguration {
|
||||||
|
|
||||||
@ -15,7 +15,7 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
|
|
||||||
public final class MQTTEventAdapterConstants {
|
public final class MQTTEventAdapterConstants {
|
||||||
@ -16,7 +16,7 @@
|
|||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class represents the data that are required to register
|
* This class represents the data that are required to register
|
||||||
@ -15,19 +15,19 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util.XMPPAdapterPublisher;
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util.XMPPEventAdapterConstants;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util.XMPPServerConnectionConfiguration;
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util.XMPPAdapterPublisher;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util.XMPPServerConnectionConfiguration;
|
||||||
import org.wso2.carbon.event.output.adapter.core.EventAdapterUtil;
|
import org.wso2.carbon.event.output.adapter.core.EventAdapterUtil;
|
||||||
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapter;
|
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapter;
|
||||||
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterConfiguration;
|
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterConfiguration;
|
||||||
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException;
|
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException;
|
||||||
import org.wso2.carbon.event.output.adapter.core.exception.TestConnectionNotSupportedException;
|
import org.wso2.carbon.event.output.adapter.core.exception.TestConnectionNotSupportedException;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util.XMPPEventAdapterConstants;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
@ -15,10 +15,10 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util.XMPPEventAdapterConstants;
|
||||||
import org.wso2.carbon.event.output.adapter.core.*;
|
import org.wso2.carbon.event.output.adapter.core.*;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util.XMPPEventAdapterConstants;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -15,12 +15,12 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.internal;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.internal;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.osgi.service.component.ComponentContext;
|
import org.osgi.service.component.ComponentContext;
|
||||||
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.XMPPEventAdapterFactory;
|
import org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.XMPPEventAdapterFactory;
|
||||||
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterFactory;
|
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterFactory;
|
||||||
|
|
||||||
|
|
||||||
@ -15,7 +15,7 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
@ -15,7 +15,7 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
|
|
||||||
public final class XMPPEventAdapterConstants {
|
public final class XMPPEventAdapterConstants {
|
||||||
@ -15,7 +15,7 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.util;
|
package org.wso2.carbon.device.mgt.iot.output.adapter.xmpp.i18n.util;
|
||||||
|
|
||||||
public class XMPPServerConnectionConfiguration {
|
public class XMPPServerConnectionConfiguration {
|
||||||
|
|
||||||
@ -0,0 +1,128 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
|
<artifactId>iot-base-plugin-feature</artifactId>
|
||||||
|
<version>2.1.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>org.wso2.carbon.device.mgt.iot.adapter.feature</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<version>2.1.0-SNAPSHOT</version>
|
||||||
|
<name>WSO2 Carbon - IoT Device Management Feature</name>
|
||||||
|
<url>http://wso2.org</url>
|
||||||
|
<description>This feature contains the adapter bundles required for IoT Server</description>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
|
<artifactId>org.wso2.carbon.device.mgt.iot.output.adapter.mqtt</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
|
<artifactId>org.wso2.carbon.device.mgt.iot.output.adapter.xmpp</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
|
<artifactId>org.wso2.carbon.device.mgt.iot.input.adapter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-resources</id>
|
||||||
|
<phase>generate-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>src/main/resources</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>resources</directory>
|
||||||
|
<includes>
|
||||||
|
<include>build.properties</include>
|
||||||
|
<include>p2.inf</include>
|
||||||
|
</includes>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.wso2.maven</groupId>
|
||||||
|
<artifactId>carbon-p2-plugin</artifactId>
|
||||||
|
<version>${carbon.p2.plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>p2-feature-generation</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>p2-feature-gen</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<id>org.wso2.carbon.device.mgt.iot.adapter</id>
|
||||||
|
<propertiesFile>../../../features/etc/feature.properties</propertiesFile>
|
||||||
|
<adviceFile>
|
||||||
|
<properties>
|
||||||
|
<propertyDef>org.wso2.carbon.p2.category.type:server</propertyDef>
|
||||||
|
<propertyDef>org.eclipse.equinox.p2.type.group:false</propertyDef>
|
||||||
|
</properties>
|
||||||
|
</adviceFile>
|
||||||
|
<bundles>
|
||||||
|
<bundleDef>
|
||||||
|
org.wso2.carbon.devicemgt-plugins:org.wso2.carbon.device.mgt.iot.output.adapter.mqtt:${carbon.devicemgt.plugins.version}
|
||||||
|
</bundleDef>
|
||||||
|
<bundleDef>
|
||||||
|
org.wso2.carbon.devicemgt-plugins:org.wso2.carbon.device.mgt.iot.output.adapter.xmpp:${carbon.devicemgt.plugins.version}
|
||||||
|
</bundleDef>
|
||||||
|
<bundleDef>
|
||||||
|
org.wso2.carbon.devicemgt-plugins:org.wso2.carbon.device.mgt.iot.input.adapter:${carbon.devicemgt.plugins.version}
|
||||||
|
</bundleDef>
|
||||||
|
</bundles>
|
||||||
|
<importFeatures>
|
||||||
|
<importFeatureDef>
|
||||||
|
org.wso2.carbon.event.output.adapter.server:${carbon.analytics.common.version}
|
||||||
|
</importFeatureDef>
|
||||||
|
<importFeatureDef>
|
||||||
|
org.wso2.carbon.event.input.adapter.server:${carbon.analytics.common.version}
|
||||||
|
</importFeatureDef>
|
||||||
|
<importFeatureDef>
|
||||||
|
org.wso2.carbon.identity.jwt.client.extension:${carbon.devicemgt.version}
|
||||||
|
</importFeatureDef>
|
||||||
|
</importFeatures>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
custom = true
|
||||||
@ -0,0 +1 @@
|
|||||||
|
instructions.configure = \
|
||||||
@ -41,10 +41,6 @@
|
|||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>org.wso2.carbon.device.mgt.iot</artifactId>
|
<artifactId>org.wso2.carbon.device.mgt.iot</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
|
||||||
<artifactId>org.wso2.carbon.device.mgt.iot.output.adapter.mqtt</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.json.wso2</groupId>
|
<groupId>org.json.wso2</groupId>
|
||||||
<artifactId>json</artifactId>
|
<artifactId>json</artifactId>
|
||||||
@ -58,11 +54,6 @@
|
|||||||
<groupId>org.igniterealtime.smack.wso2</groupId>
|
<groupId>org.igniterealtime.smack.wso2</groupId>
|
||||||
<artifactId>smackx</artifactId>
|
<artifactId>smackx</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>net.sf.ehcache.wso2</groupId>
|
|
||||||
<artifactId>ehcache</artifactId>
|
|
||||||
<version>1.5.0.wso2v3</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@ -144,9 +135,6 @@
|
|||||||
<bundleDef>
|
<bundleDef>
|
||||||
org.wso2.carbon.devicemgt-plugins:org.wso2.carbon.device.mgt.iot:${carbon.devicemgt.plugins.version}
|
org.wso2.carbon.devicemgt-plugins:org.wso2.carbon.device.mgt.iot:${carbon.devicemgt.plugins.version}
|
||||||
</bundleDef>
|
</bundleDef>
|
||||||
<bundleDef>
|
|
||||||
org.wso2.carbon.devicemgt-plugins:org.wso2.carbon.device.mgt.iot.output.adapter.mqtt:${carbon.devicemgt.plugins.version}
|
|
||||||
</bundleDef>
|
|
||||||
<bundleDef>
|
<bundleDef>
|
||||||
org.json.wso2:json:${commons-json.version}
|
org.json.wso2:json:${commons-json.version}
|
||||||
</bundleDef>
|
</bundleDef>
|
||||||
@ -165,9 +153,6 @@
|
|||||||
</importFeatureDef>
|
</importFeatureDef>
|
||||||
<importFeatureDef>org.wso2.carbon.device.mgt.server:${carbon.devicemgt.version}
|
<importFeatureDef>org.wso2.carbon.device.mgt.server:${carbon.devicemgt.version}
|
||||||
</importFeatureDef>
|
</importFeatureDef>
|
||||||
<importFeatureDef>
|
|
||||||
org.wso2.carbon.event.output.adapter.server:${carbon.analytics.common.version}
|
|
||||||
</importFeatureDef>
|
|
||||||
</importFeatures>
|
</importFeatures>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
|||||||
@ -35,6 +35,7 @@
|
|||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
<module>org.wso2.carbon.device.mgt.iot.feature</module>
|
<module>org.wso2.carbon.device.mgt.iot.feature</module>
|
||||||
|
<module>org.wso2.carbon.device.mgt.iot.adapter.feature</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
10
pom.xml
10
pom.xml
@ -336,6 +336,16 @@
|
|||||||
<artifactId>org.wso2.carbon.device.mgt.iot.output.adapter.mqtt</artifactId>
|
<artifactId>org.wso2.carbon.device.mgt.iot.output.adapter.mqtt</artifactId>
|
||||||
<version>${carbon.devicemgt.plugins.version}</version>
|
<version>${carbon.devicemgt.plugins.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
|
<artifactId>org.wso2.carbon.device.mgt.iot.output.adapter.xmpp</artifactId>
|
||||||
|
<version>${carbon.devicemgt.plugins.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
|
<artifactId>org.wso2.carbon.device.mgt.iot.input.adapter</artifactId>
|
||||||
|
<version>${carbon.devicemgt.plugins.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>org.wso2.carbon.device.mgt.iot.api</artifactId>
|
<artifactId>org.wso2.carbon.device.mgt.iot.api</artifactId>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user