diff --git a/modules/analytics/distribution/input-adapter-change.xml b/modules/analytics/distribution/input-adapter-change.xml index 854702e0..f716cd3e 100644 --- a/modules/analytics/distribution/input-adapter-change.xml +++ b/modules/analytics/distribution/input-adapter-change.xml @@ -9,9 +9,12 @@ 10000 2 100 - https://${iot.keymanager.host}:${iot.keymanager.https.port} + https://${iot.keymanager.host}:${iot.keymanager.https.port} admin admin + https://${iot.gateway.host}:${iot.gateway.https.port}/token + https://${iot.gateway.host}:${iot.gateway.https.port} + 100 @@ -22,8 +25,9 @@ 10000 60 https://${iot.keymanager.host}:${iot.keymanager.https.port}/client-registration/v0.11/register - https://${iot.gateway.host}:${iot.gateway.https.port}/token tcp://${mqtt.broker.host}:${mqtt.broker.port} + admin + admin ]]> \ No newline at end of file diff --git a/modules/analytics/distribution/output-adapter-change.xml b/modules/analytics/distribution/output-adapter-change.xml index 9f4a0aa4..6db841ef 100644 --- a/modules/analytics/distribution/output-adapter-change.xml +++ b/modules/analytics/distribution/output-adapter-change.xml @@ -12,6 +12,8 @@ https://${iot.keymanager.host}:${iot.keymanager.https.port}/client-registration/v0.11/register https://${iot.gateway.host}:${iot.gateway.https.port}/token tcp://${mqtt.broker.host}:${mqtt.broker.port} + admin + admin @@ -22,7 +24,7 @@ 10000 org.wso2.carbon.device.mgt.output.adapter.websocket.authentication.OAuthAuthenticator - https://${iot.keymanager.host}:${iot.keymanager.https.port} + https://${iot.keymanager.host}:${iot.keymanager.https.port} 2 100 org.wso2.carbon.device.mgt.output.adapter.websocket.authorization.DeviceAuthorizer diff --git a/modules/analytics/distribution/src/assembly/bin.xml b/modules/analytics/distribution/src/assembly/bin.xml index 71f18629..532763ce 100644 --- a/modules/analytics/distribution/src/assembly/bin.xml +++ b/modules/analytics/distribution/src/assembly/bin.xml @@ -47,6 +47,9 @@ **/repository/conf/security/cipher-text.properties **/repository/conf/security/Owasp.CsrfGuard.Carbon.properties **/repository/conf/security/cipher-tool.properties + **/repository/deployment/server/jaggeryapps/portal/modules/oauth/plugins/token-handler-utils.js + **/repository/deployment/server/jaggeryapps/portal/modules/oauth/plugins/token-handlers.js + **/repository/conf/security/authenticators.xml @@ -402,6 +405,15 @@ true 644 + + + src/repository/conf/security/authenticators.xml + + ${pom.artifactId}-${pom.version}/repository/conf/security/ + + true + 644 + @@ -723,10 +735,6 @@ src/repository/conf/security/Owasp.CsrfGuard.Carbon.properties ${pom.artifactId}-${pom.version}/repository/conf/security - - src/repository/conf/etc/jwt.properties - ${pom.artifactId}-${pom.version}/repository/conf/etc - src/repository/conf/analytics/spark/spark-udf-config.xml ${pom.artifactId}-${pom.version}/repository/conf/analytics/spark @@ -798,10 +806,25 @@ true 644 + + src/repository/jaggeryapps/portal/modules/oauth/token-handler-utils.js + + ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/portal/modules/oauth + + 755 + + + src/repository/jaggeryapps/portal/modules/oauth/token-handlers.js + + ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/portal/modules/oauth + + 755 + + - ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/deployment/server/carbonapps/org_wso2_carbon_analytics_cdmf-1.0.0.car + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/resources/devicetypes/device_management/org_wso2_carbon_analytics_cdmf-1.0.0.car ${pom.artifactId}-${pom.version}/repository/deployment/server/carbonapps/ 644 diff --git a/modules/analytics/distribution/src/repository/conf/etc/jwt.properties b/modules/analytics/distribution/src/repository/conf/etc/jwt.properties deleted file mode 100644 index 3c384655..00000000 --- a/modules/analytics/distribution/src/repository/conf/etc/jwt.properties +++ /dev/null @@ -1,57 +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. -# - -#issuer of the JWT -iss=wso2.org/products/iot - -TokenEndpoint=https://${iot.keymanager.host}:${iot.keymanager.https.port}/oauth2/token - -#audience of JWT claim -#comma seperated values -aud=devicemgt - -#expiration time of JWT (number of minutes from the current time) -exp=1000 - -#issued at time of JWT (number of minutes from the current time) -iat=0 - -#nbf time of JWT (number of minutes from current time) -nbf=0 - -#skew between IDP and issuer(seconds) -skew=0 - -# JWT Id -#jti=token123 - -#KeyStore to cryptographic credentials -#KeyStore=repository/resources/security/wso2carbon.jks - -#Password of the KeyStore -#KeyStorePassword=wso2carbon - -#Alias of the SP's private key -#PrivateKeyAlias=wso2carbon - -#Private key password to retrieve the private key used to sign -#AuthnRequest and LogoutRequest messages -#PrivateKeyPassword=wso2carbon - -#this will be used as the default IDP config if there isn't any config available for tenants. -default-jwt-client=true diff --git a/modules/analytics/distribution/src/repository/conf/security/authenticators.xml b/modules/analytics/distribution/src/repository/conf/security/authenticators.xml new file mode 100644 index 00000000..2afca49f --- /dev/null +++ b/modules/analytics/distribution/src/repository/conf/security/authenticators.xml @@ -0,0 +1,78 @@ + + + + + + + + + + 5 + + + + + 10 + + /carbon/admin/login.jsp + carbonServer + https://localhost:9443/samlsso + urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + https://localhost:9443/acs + + + + + + + + + + + + + + + + + + + + + 5 + + + + + + \ No newline at end of file diff --git a/modules/analytics/distribution/src/repository/jaggeryapps/portal/modules/oauth/token-handler-utils.js b/modules/analytics/distribution/src/repository/jaggeryapps/portal/modules/oauth/token-handler-utils.js new file mode 100644 index 00000000..c6a8aab5 --- /dev/null +++ b/modules/analytics/distribution/src/repository/jaggeryapps/portal/modules/oauth/token-handler-utils.js @@ -0,0 +1,598 @@ +/* + * 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. + */ + +var utils = function () { + var log = new Log("/modules/oauth/token-handler-utils.js"); + + var configs = require('/configs/portal.js').config(); + var constants = require("/modules/constants.js"); + var carbon = require("carbon"); + + //noinspection JSUnresolvedVariable + var Base64 = Packages.org.apache.commons.codec.binary.Base64; + //noinspection JSUnresolvedVariable + var String = Packages.java.lang.String; + + var publicMethods = {}; + var privateMethods = {}; + + publicMethods["encode"] = function (payload) { + return String(Base64.encodeBase64(String(payload).getBytes())); + }; + + publicMethods["decode"] = function (payload) { + return String(Base64.decodeBase64(String(payload).getBytes())); + }; + + /** + * Check whether this application is oauth enable or not + * @returns boolean if oauth enable + */ + publicMethods["checkOAuthEnabled"] = function () { + if (constants.AUTHORIZATION_TYPE_OAUTH === configs["authorization"]["activeMethod"]) { + return true; + } + return false; + }; + + /** + * Set access token into xml http request header + * @param xhr xml http request + * @returns {*} xhr which has access token it's header + */ + publicMethods["setAccessToken"] = function (xhr, callback) { + var accessToken; + if (publicMethods.checkOAuthEnabled()) { + try { + accessToken = parse(session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER_FOR_PORTAL))["accessToken"]; + xhr.setRequestHeader(constants.AUTHORIZATION_HEADER, constants.BEARER_PREFIX + accessToken); + } catch (exception) { + log.error("Access token hasn't been set yet, " + exception); + } finally { + callback(xhr); + } + } + callback(xhr); + }; + + /** + * Get access token of current logged user + * @param callBack response with access token + */ + publicMethods["getAccessToken"] = function (callBack) { + var accessToken = null; + if (publicMethods.checkOAuthEnabled()) { + try { + accessToken = parse(session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER_FOR_PORTAL))["accessToken"]; + } catch (exception) { + log.error("Access token hasn't been set yet, " + exception); + } finally { + callBack(accessToken); + } + } + callBack(accessToken); + }; + + /** + * Create error message which adhere to xml http response object + * @param statusCode response status code + * @param status response status + * @param responseText response message + * @returns {{statusCode: *, status: *, responseText: *}} + */ + publicMethods["createXHRObject"] = function (statusCode, status, responseText) { + return {"statusCode": statusCode, "status": status, "responseText": responseText}; + }; + + /** + * check whether user already logged to system before invoking any apis + * @param callBack + */ + publicMethods["isUserAuthorized"] = function (callBack) { + if (session.get("Loged") !== constants.LOGIN_MESSAGE) { + callBack(false); + } else { + callBack(true); + } + }; + + /** + * Get identity provider uir + * @returns {*} + */ + publicMethods["getIdPServerURL"] = function () { + return configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["tokenServiceURL"]; + }; + + /** + * Get an Access token pair based on client secret + * @param encodedClientKeys {{clientId:"", clientSecret:""}} + * @param scope eg: PRODUCTION + * @param idPServer identity provider url + * @returns {{accessToken: *, refreshToken: *}} + */ + publicMethods["getTokenWithClientSecretType"] = function (encodedClientKeys, scope, idPServer) { + var xhr = new XMLHttpRequest(); + var tokenEndpoint = idPServer; + xhr.open(constants.HTTP_POST, tokenEndpoint, false); + xhr.setRequestHeader(constants.CONTENT_TYPE_IDENTIFIER, constants.APPLICATION_X_WWW_FOR_URLENCODED); + xhr.setRequestHeader(constants.AUTHORIZATION_HEADER, constants.BASIC_PREFIX + encodedClientKeys); + xhr.send("grant_type=client_credentials&scope=" + scope); + var tokenPair = {}; + if (xhr.status == constants.HTTP_ACCEPTED) { + var data = parse(xhr.responseText); + tokenPair.refreshToken = data.refresh_token; + tokenPair.accessToken = data.access_token; + } else if (xhr.status == constants.HTTP_USER_NOT_AUTHENTICATED) { + log.error("Error in obtaining token with client secret grant type, You are not authenticated yet"); + return null; + } else { + log.error("Error in obtaining token with client secret grant type, This might be a problem with client meta " + + "data which required for client secret grant type"); + return null; + } + return tokenPair; + }; + + + /** + * This will create client id and client secret for a given application + * @param properties "callbackUrl": "", + * "clientName": "", + * "owner": "", + * "applicationType": "", + * "grantType": "", + * "saasApp" :"", + * "dynamicClientRegistrationEndPoint" : "" + * + * @returns {{clientId:*, clientSecret:*}} + */ + publicMethods["getDynamicClientAppCredentials"] = function (username) { + // setting up dynamic client application properties + var dcAppProperties = { + "applicationType": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["appType"], + "clientName": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["clientName"], + "owner": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["owner"], + "tokenScope": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["tokenScope"], + "grantType": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["grantType"], + "callbackUrl": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["callbackUrl"], + "saasApp" : configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["saasApp"] + }; + + var tenantDomain = carbon.server.tenantDomain({username: username}); + if (!tenantDomain) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving tenant " + + "based client application credentials. Unable to obtain a valid tenant domain for provided username "+ + username +"- getDynamicClientAppCredentials(x)"); + return null; + } else { + var cachedTenantBasedClientAppCredentials = privateMethods. + getCachedTenantBasedClientAppCredentials(tenantDomain); + if (cachedTenantBasedClientAppCredentials) { + return cachedTenantBasedClientAppCredentials; + } else { + // calling dynamic client app registration service endpoint + var requestURL = configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"] + ["dynamicClientAppRegistrationServiceURL"]; + var requestPayload = dcAppProperties; + var token = publicMethods.encode(configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"] + ["appRegistration"]["owner"] + ":" + configs["authorization"]["methods"]["oauth"]["attributes"] + ["oauthProvider"]["appRegistration"]["password"]); + var xhr = new XMLHttpRequest(); + xhr.open("POST", requestURL, false); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("Authorization", "Basic "+ token); + xhr.send(stringify(requestPayload)); + var dynamicClientAppCredentials = {}; + if (xhr["status"] == 201 || xhr["status"] == 200 && xhr["responseText"]) { + var responsePayload = parse(xhr["responseText"]); + var clientId = responsePayload["client_id"]; + var clientSecret = responsePayload["client_secret"]; + if(typeof clientId == "undefined"){ + clientId = responsePayload["clientId"]; + } + if(typeof clientSecret == "undefined"){ + clientSecret = responsePayload["clientSecret"]; + } + dynamicClientAppCredentials["clientId"] = clientId; + dynamicClientAppCredentials["clientSecret"] = clientSecret; + privateMethods. + setCachedTenantBasedClientAppCredentials(tenantDomain, dynamicClientAppCredentials); + } else if (xhr["status"] == 400) { + log.error("{/modules/oauth/token-handler-utils.js - getDynamicClientAppCredentials()} " + + "Bad request. Invalid data provided as dynamic client application properties."); + dynamicClientAppCredentials = null; + } else { + log.error("{/modules/oauth/token-handler-utils.js - getDynamicClientAppCredentials()} " + + "Error in retrieving dynamic client credentials."); + dynamicClientAppCredentials = null; + } + // returning dynamic client credentials + return dynamicClientAppCredentials; + } + } + }; + + /** + * If gateway is enable, apiManagerClientAppRegistrationServiceURL is used to create oauth application + * @param username username of current logged user + * @returns {{clientId:*, clientSecret:*}} + */ + publicMethods["getTenantBasedClientAppCredentials"] = function (username) { + if (!username) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving tenant " + + "based client app credentials. No username " + + "as input - getTenantBasedClientAppCredentials(x)"); + return null; + } else { + //noinspection JSUnresolvedFunction, JSUnresolvedVariable + var tenantDomain = carbon.server.tenantDomain({username: username}); + + if (!tenantDomain) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving tenant " + + "based client application credentials. Unable to obtain a valid tenant domain for provided " + + "username - getTenantBasedClientAppCredentials(x, y)"); + return null; + } else { + var cachedTenantBasedClientAppCredentials = privateMethods. + getCachedTenantBasedClientAppCredentials(tenantDomain); + if (cachedTenantBasedClientAppCredentials) { + return cachedTenantBasedClientAppCredentials; + } else { + var adminUsername = configs["authorization"]["methods"]["oauth"]["attributes"]["adminUser"]; + var adminUserTenantId = configs["authorization"]["methods"]["oauth"]["attributes"] + ["adminUserTenantId"]; + //claims required for jwtAuthenticator. + var claims = {"http://wso2.org/claims/enduserTenantId": adminUserTenantId, + "http://wso2.org/claims/enduser": adminUsername}; + var jwtToken = publicMethods.getJwtToken(adminUsername, claims); + // register a tenant based client app at API Manager + var applicationName = configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"] + ["appRegistration"]["clientName"] + "_" + tenantDomain; + var requestURL = configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"] + ["appRegistration"]["apiManagerClientAppRegistrationServiceURL"] + + "?tenantDomain=" + tenantDomain + "&applicationName=" + applicationName; + var xhr = new XMLHttpRequest(); + xhr.open("POST", requestURL, false); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("X-JWT-Assertion", "" + jwtToken); + xhr.send(); + if ((xhr["status"] == 201 || xhr["status"] == 200) && xhr["responseText"]) { + var responsePayload = parse(xhr["responseText"]); + var tenantBasedClientAppCredentials = {}; + var clientId = responsePayload["client_id"]; + var clientSecret = responsePayload["client_secret"]; + if(typeof clientId == "undefined"){ + clientId = responsePayload["clientId"]; + } + if(typeof clientSecret == "undefined"){ + clientSecret = responsePayload["clientSecret"]; + } + tenantBasedClientAppCredentials["clientId"] = clientId; + tenantBasedClientAppCredentials["clientSecret"] = clientSecret; + privateMethods. + setCachedTenantBasedClientAppCredentials(tenantDomain, tenantBasedClientAppCredentials); + return tenantBasedClientAppCredentials; + } else { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving tenant " + + "based client application credentials from API " + + "Manager - getTenantBasedClientAppCredentials(x, y)"); + return null; + } + } + } + } + }; + + /** + * Caching oauth application credentials + * @param tenantDomain tenant domain where application is been created + * @param clientAppCredentials {{clientId:*, clientSecret:*}} + */ + privateMethods["setCachedTenantBasedClientAppCredentials"] = function (tenantDomain, clientAppCredentials) { + var cachedTenantBasedClientAppCredentialsMap = application.get(constants["CACHED_CREDENTIALS_PORTAL_APP"]); + if (!cachedTenantBasedClientAppCredentialsMap) { + cachedTenantBasedClientAppCredentialsMap = {}; + cachedTenantBasedClientAppCredentialsMap[tenantDomain] = clientAppCredentials; + application.put(constants["CACHED_CREDENTIALS_PORTAL_APP"], cachedTenantBasedClientAppCredentialsMap); + } else if (!cachedTenantBasedClientAppCredentialsMap[tenantDomain]) { + cachedTenantBasedClientAppCredentialsMap[tenantDomain] = clientAppCredentials; + } + }; + + /** + * Get oauth application credentials from cache + * @param tenantDomain tenant domain where application is been created + * @returns {{clientId:*, clientSecret:*}} + */ + privateMethods["getCachedTenantBasedClientAppCredentials"] = function (tenantDomain) { + var cachedTenantBasedClientAppCredentialsMap = application.get(constants["CACHED_CREDENTIALS_PORTAL_APP"]); + if (!cachedTenantBasedClientAppCredentialsMap || + !cachedTenantBasedClientAppCredentialsMap[tenantDomain]) { + return null; + } else { + return cachedTenantBasedClientAppCredentialsMap[tenantDomain]; + } + }; + + /** + * Get access token and refresh token using password grant type + * @param username username of the logged user + * @param password password of the logged user + * @param encodedClientAppCredentials {{clientId:*, clientSecret:*}} + * @param scopes scopes list + * @returns {{accessToken: *, refreshToken: *}} + */ + publicMethods["getTokenPairAndScopesByPasswordGrantType"] = function (username, password + , encodedClientAppCredentials, scopes) { + if (!username || !password || !encodedClientAppCredentials || !scopes) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving access token by password " + + "grant type. No username, password, encoded client app credentials or scopes are " + + "found - getTokenPairAndScopesByPasswordGrantType(a, b, c, d)"); + return null; + } else { + // calling oauth provider token service endpoint + var requestURL = configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"] + ["tokenServiceURL"]; + var requestPayload = "grant_type=password&username=" + + username + "&password=" + password + "&scope=" + scopes; + + var xhr = new XMLHttpRequest(); + xhr.open("POST", requestURL, false); + xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + xhr.setRequestHeader("Authorization", "Basic " + encodedClientAppCredentials); + xhr.send(requestPayload); + + if (xhr["status"] == 200 && xhr["responseText"]) { + var responsePayload = parse(xhr["responseText"]); + var tokenData = {}; + tokenData["accessToken"] = responsePayload["access_token"]; + tokenData["refreshToken"] = responsePayload["refresh_token"]; + tokenData["scopes"] = responsePayload["scope"]; + return tokenData; + } else { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving access token " + + "by password grant type - getTokenPairAndScopesByPasswordGrantType(a, b, c, d)"); + return null; + } + } + }; + + /** + * Get access token and refresh token using SAML grant type + * @param assertion + * @param encodedClientAppCredentials + * @param scopes + * @returns {{accessToken: *, refreshToken: *}} + */ + publicMethods["getTokenPairAndScopesByJWTGrantType"] = function (username, encodedClientAppCredentials, scopes) { + if (!username || !encodedClientAppCredentials || !scopes) { + log.error("{/app/modules/oauth/token-handler-utils.js} Error in retrieving access token by jwt " + + "grant type. No assertion, encoded client app credentials or scopes are " + + "found - getTokenPairAndScopesByJWTGrantType(x, y, z)"); + return null; + } else { + var JWTClientManagerServicePackagePath = + "org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService"; + //noinspection JSUnresolvedFunction, JSUnresolvedVariable + var JWTClientManagerService = carbon.server.osgiService(JWTClientManagerServicePackagePath); + //noinspection JSUnresolvedFunction + var jwtClient = JWTClientManagerService.getJWTClient(); + // returning access token by JWT grant type + var tokenInfo = jwtClient.getAccessToken(encodedClientAppCredentials, + username, scopes); + var tokenData = {}; + tokenData["accessToken"] = tokenInfo.getAccessToken(); + tokenData["refreshToken"] = tokenInfo.getRefreshToken(); + tokenData["scopes"] = tokenInfo.getScopes(); + return tokenData; + } + }; + + /** + * Get access token and refresh token using SAML grant type + * @param assertion + * @param encodedClientAppCredentials + * @param scopes + * @returns {{accessToken: *, refreshToken: *}} + */ + publicMethods["getTokenPairAndScopesBySAMLGrantType"] = function (assertion, encodedClientAppCredentials, scopes) { + if (!assertion || !encodedClientAppCredentials || !scopes) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving access token by saml " + + "grant type. No assertion, encoded client app credentials or scopes are " + + "found - getTokenPairAndScopesBySAMLGrantType(x, y, z)"); + return null; + } else { + + var assertionXML = publicMethods.decode(assertion); + /* + TODO: make assertion extraction with proper parsing. + Since Jaggery XML parser seem to add formatting which causes signature verification to fail. + */ + var assertionStartMarker = " org.wso2.carbon.devicemgt-plugins:org.wso2.extension.siddhi.execution.json.feature:${carbon.device.mgt.plugin.version} + + org.wso2.carbon.identity:org.wso2.carbon.identity.authenticator.mutualssl.feature:${identity.carbon.auth.mutual.ssl.version} + diff --git a/modules/core/distribution/identity_config_change.xml b/modules/core/distribution/identity_config_change.xml index 2b56094e..ddcc0cef 100644 --- a/modules/core/distribution/identity_config_change.xml +++ b/modules/core/distribution/identity_config_change.xml @@ -7,7 +7,7 @@ //s:Server/s:OAuth/s:OAuthCallbackHandlers - ]]> + ]]> @@ -25,7 +25,7 @@ urn:ietf:params:oauth:grant-type:jwt-bearer - org.wso2.carbon.identity.oauth2.grant.jwt.JWTBearerGrantHandler + org.wso2.carbon.device.mgt.oauth.extensions.handlers.grant.ExtendedJWTGrantHandler org.wso2.carbon.identity.oauth2.grant.jwt.JWTGrantValidator ]]> diff --git a/modules/core/distribution/input-adapter-change.xml b/modules/core/distribution/input-adapter-change.xml index 854702e0..f716cd3e 100644 --- a/modules/core/distribution/input-adapter-change.xml +++ b/modules/core/distribution/input-adapter-change.xml @@ -9,9 +9,12 @@ 10000 2 100 - https://${iot.keymanager.host}:${iot.keymanager.https.port} + https://${iot.keymanager.host}:${iot.keymanager.https.port} admin admin + https://${iot.gateway.host}:${iot.gateway.https.port}/token + https://${iot.gateway.host}:${iot.gateway.https.port} + 100 @@ -22,8 +25,9 @@ 10000 60 https://${iot.keymanager.host}:${iot.keymanager.https.port}/client-registration/v0.11/register - https://${iot.gateway.host}:${iot.gateway.https.port}/token tcp://${mqtt.broker.host}:${mqtt.broker.port} + admin + admin ]]> \ No newline at end of file diff --git a/modules/core/distribution/output-adapter-change.xml b/modules/core/distribution/output-adapter-change.xml index 9f4a0aa4..6db841ef 100644 --- a/modules/core/distribution/output-adapter-change.xml +++ b/modules/core/distribution/output-adapter-change.xml @@ -12,6 +12,8 @@ https://${iot.keymanager.host}:${iot.keymanager.https.port}/client-registration/v0.11/register https://${iot.gateway.host}:${iot.gateway.https.port}/token tcp://${mqtt.broker.host}:${mqtt.broker.port} + admin + admin @@ -22,7 +24,7 @@ 10000 org.wso2.carbon.device.mgt.output.adapter.websocket.authentication.OAuthAuthenticator - https://${iot.keymanager.host}:${iot.keymanager.https.port} + https://${iot.keymanager.host}:${iot.keymanager.https.port} 2 100 org.wso2.carbon.device.mgt.output.adapter.websocket.authorization.DeviceAuthorizer diff --git a/modules/core/distribution/pom.xml b/modules/core/distribution/pom.xml index ecb942e9..6b74d4c3 100644 --- a/modules/core/distribution/pom.xml +++ b/modules/core/distribution/pom.xml @@ -140,7 +140,11 @@ (org.wso2.carbon.identity.oauth.callback.DefaultCallbackHandler) org.wso2.carbon.apimgt.keymgt.util.APIManagerOAuthCallbackHandler - + + /Server/SSOService/UseAuthenticatedUserDomainCrypto + (false) + true + diff --git a/modules/core/distribution/src/assembly/bin.xml b/modules/core/distribution/src/assembly/bin.xml index fb448067..47826d10 100644 --- a/modules/core/distribution/src/assembly/bin.xml +++ b/modules/core/distribution/src/assembly/bin.xml @@ -73,7 +73,7 @@ **/lib/httpmime* **/lib/encoder* **/plugins/jaxb* - **/security/authenticators.xml + **/repository/conf/security/authenticators.xml **/user-mgt.xml **/plugins/org.wso2.carbon.localentry.ui* @@ -115,6 +115,11 @@ **/repository/conf/security/Owasp.CsrfGuard.Carbon.properties **/repository/components/plugins/httpclient_4.3.2.wso2v1.jar **/conf/tomcat/carbon/WEB-INF/web.xml + **/repository/components/plugins/org.wso2.carbon.hostobjects.sso_4.5.4.jar + **/bin/wso2server.sh + **/bin/wso2server.bat + **/repository/deployment/server/jaggeryapps/portal/modules/oauth/plugins/token-handler-utils.js + **/repository/deployment/server/jaggeryapps/portal/modules/oauth/plugins/token-handlers.js @@ -128,18 +133,6 @@ */** - - target/wso2carbon-core-${carbon.kernel.version} - ${pom.artifactId}-${pom.version} - - **/*.sh - - - bin/wso2server.sh - bin/wso2server.bat - - 755 - @@ -414,7 +407,7 @@ ${pom.artifactId}-${pom.version}/repository/deployment/server/carbonapps - + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/resources @@ -755,6 +748,29 @@ **/* + + + + ../scripts/mobile-qsg/resources + + ${pom.artifactId}-${pom.version}/samples/mobile-qsg + + + **/** + + + + + ../scripts/mobile-qsg/target + + ${pom.artifactId}-${pom.version}/repository/deployment/server/webapps + + + **/** + + + + @@ -797,6 +813,20 @@ 755 + + src/repository/jaggeryapps/portal/modules/oauth/token-handler-utils.js + + ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/portal/modules/oauth + + 755 + + + src/repository/jaggeryapps/portal/modules/oauth/token-handlers.js + + ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/portal/modules/oauth + + 755 + @@ -953,6 +983,14 @@ ${pom.artifactId}-${pom.version}/repository/conf 644 + + + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/conf/apim-integration.xml + + ${pom.artifactId}-${pom.version}/repository/conf + 644 + src/repository/conf/api-manager.xml @@ -986,7 +1024,7 @@ --> - src/repository/conf/cdm-config.xml + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/conf/cdm-config.xml ${pom.artifactId}-${pom.version}/repository/conf true @@ -1305,9 +1343,9 @@ - ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/deployment/server/carbonapps/org_wso2_carbon_analytics_cdmf-1.0.0.car + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/resources/devicetypes/device_management/org_wso2_carbon_analytics_cdmf-1.0.0.car - ${pom.artifactId}-${pom.version}/repository/deployment/server/carbonapps/ + ${pom.artifactId}-${pom.version}/repository/resources/devicetypes/device_management/ 644 @@ -1441,5 +1479,43 @@ 755 + + + src/repository/cloud/portal/common.css + + ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/portal/css + + + + + + src/repository/cloud/portal/portal.js + + ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/portal/js + + + + + + src/repository/cloud/portal/global-navigation.jag + + ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/portal/theme/templates + + + + + + ../scripts/mobile-qsg/target/mobile-qsg.jar + + ${pom.artifactId}-${pom.version}/samples/mobile-qsg + + + + ../scripts/mobile-qsg/target/org.wso2.carbon.appmgt.oauth.core-1.2.5.jar + + ${pom.artifactId}-${pom.version}/repository/components/dropins + + + diff --git a/modules/core/distribution/src/repository/bin/wso2server.bat b/modules/core/distribution/src/repository/bin/wso2server.bat index 17b473c3..6a5b22e8 100644 --- a/modules/core/distribution/src/repository/bin/wso2server.bat +++ b/modules/core/distribution/src/repository/bin/wso2server.bat @@ -162,7 +162,7 @@ set CARBON_CLASSPATH=.\lib;%CARBON_CLASSPATH% set JAVA_ENDORSED=".\lib\endorsed";"%JAVA_HOME%\jre\lib\endorsed";"%JAVA_HOME%\lib\endorsed" -set CMD_LINE_ARGS=-Xbootclasspath/a:%CARBON_XBOOTCLASSPATH% -Xms256m -Xmx1024m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="%CARBON_HOME%\repository\logs\heap-dump.hprof" -Dcom.sun.management.jmxremote -classpath %CARBON_CLASSPATH% %JAVA_OPTS% -Djava.endorsed.dirs=%JAVA_ENDORSED% -Dcarbon.registry.root=/ -Dcarbon.home="%CARBON_HOME%" -Dlogger.server.name="IoT-Core" -Dwso2.server.standalone=true -Djava.command="%JAVA_HOME%\bin\java" -Djava.opts="%JAVA_OPTS%" -Djava.io.tmpdir="%CARBON_HOME%\tmp" -Dcatalina.base="%CARBON_HOME%\lib\tomcat" -Dwso2.carbon.xml=%CARBON_HOME%\repository\conf\carbon.xml -Dwso2.registry.xml="%CARBON_HOME%\repository\conf\registry.xml" -Dwso2.user.mgt.xml="%CARBON_HOME%\repository\conf\user-mgt.xml" -Dwso2.transports.xml="%CARBON_HOME%\repository\conf\mgt-transports.xml" -Djava.util.logging.config.file="%CARBON_HOME%\repository\conf\etc\logging-bridge.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcarbon.config.dir.path="%CARBON_HOME%\repository\conf" -Dcomponents.repo="%CARBON_HOME%\repository\components" -Dconf.location="%CARBON_HOME%\repository\conf" -Dcom.atomikos.icatch.file="%CARBON_HOME%\lib\transactions.properties" -Dcom.atomikos.icatch.hide_init_file_path="true" -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -Dcom.sun.jndi.ldap.connect.pool.authentication=simple -Dcom.sun.jndi.ldap.connect.pool.timeout=3000 -Dorg.terracotta.quartz.skipUpdateCheck=true -Dcarbon.classpath=%CARBON_CLASSPATH% -Dfile.encoding=UTF8 -Dorg.wso2.ignoreHostnameVerification=true -Dorg.opensaml.httpclient.https.disableHostnameVerification=true -Diot.analytics.host="localhost" -Diot.analytics.https.port="9445" -Dmqtt.broker.host="localhost" -Dmqtt.broker.port="1886" -Diot.core.host="localhost" -Diot.core.https.port="9443" -Diot.keymanager.host="localhost" -Diot.keymanager.https.port="9443" -Diot.gateway.host="localhost" -Diot.gateway.https.port="8243" -Diot.gateway.http.port="8280" +set CMD_LINE_ARGS=-Xbootclasspath/a:%CARBON_XBOOTCLASSPATH% -Xms256m -Xmx1024m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="%CARBON_HOME%\repository\logs\heap-dump.hprof" -Dcom.sun.management.jmxremote -classpath %CARBON_CLASSPATH% %JAVA_OPTS% -Djava.endorsed.dirs=%JAVA_ENDORSED% -Dcarbon.registry.root=/ -Dcarbon.home="%CARBON_HOME%" -Dlogger.server.name="IoT-Core" -Dwso2.server.standalone=true -Djava.command="%JAVA_HOME%\bin\java" -Djava.opts="%JAVA_OPTS%" -Djava.io.tmpdir="%CARBON_HOME%\tmp" -Dcatalina.base="%CARBON_HOME%\lib\tomcat" -Dwso2.carbon.xml=%CARBON_HOME%\repository\conf\carbon.xml -Dwso2.registry.xml="%CARBON_HOME%\repository\conf\registry.xml" -Dwso2.user.mgt.xml="%CARBON_HOME%\repository\conf\user-mgt.xml" -Dwso2.transports.xml="%CARBON_HOME%\repository\conf\mgt-transports.xml" -Djava.util.logging.config.file="%CARBON_HOME%\repository\conf\etc\logging-bridge.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcarbon.config.dir.path="%CARBON_HOME%\repository\conf" -Dcomponents.repo="%CARBON_HOME%\repository\components" -Dconf.location="%CARBON_HOME%\repository\conf" -Dcom.atomikos.icatch.file="%CARBON_HOME%\lib\transactions.properties" -Dcom.atomikos.icatch.hide_init_file_path="true" -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -Dcom.sun.jndi.ldap.connect.pool.authentication=simple -Dcom.sun.jndi.ldap.connect.pool.timeout=3000 -Dorg.terracotta.quartz.skipUpdateCheck=true -Dcarbon.classpath=%CARBON_CLASSPATH% -Dfile.encoding=UTF8 -Dorg.wso2.ignoreHostnameVerification=true -Dorg.opensaml.httpclient.https.disableHostnameVerification=true -Diot.analytics.host="localhost" -Diot.analytics.https.port="9445" -Diot.manager.host="localhost" -Diot.manager.https.port="9445" -Dmqtt.broker.host="localhost" -Dmqtt.broker.port="1886" -Diot.core.host="localhost" -Diot.core.https.port="9443" -Diot.keymanager.host="localhost" -Diot.keymanager.https.port="9443" -Diot.gateway.host="localhost" -Diot.gateway.https.port="8243" -Diot.gateway.http.port="8280" -Diot.apimpublisher.host="localhost" -Diot.apimpublisher.https.port="9443" -Diot.apimstore.host="localhost" -Diot.apimstore.https.port="8243" :runJava echo JAVA_HOME environment variable is set to %JAVA_HOME% diff --git a/modules/core/distribution/src/repository/bin/wso2server.sh b/modules/core/distribution/src/repository/bin/wso2server.sh index 656b52a2..329a6ecf 100755 --- a/modules/core/distribution/src/repository/bin/wso2server.sh +++ b/modules/core/distribution/src/repository/bin/wso2server.sh @@ -309,6 +309,8 @@ do -Dorg.opensaml.httpclient.https.disableHostnameVerification=true \ -Diot.analytics.host="localhost" \ -Diot.analytics.https.port="9445" \ + -Diot.manager.host="localhost" \ + -Diot.manager.https.port="9443" \ -Dmqtt.broker.host="localhost" \ -Dmqtt.broker.port="1886" \ -Diot.core.host="localhost" \ @@ -318,6 +320,10 @@ do -Diot.gateway.host="localhost" \ -Diot.gateway.https.port="8243" \ -Diot.gateway.http.port="8280" \ + -Diot.apimpublisher.host="localhost" \ + -Diot.apimpublisher.https.port="9443" \ + -Diot.apimstore.host="localhost" \ + -Diot.apimstore.https.port="9443" \ org.wso2.carbon.bootstrap.Bootstrap $* status=$? done diff --git a/modules/core/distribution/src/repository/cloud/portal/common.css b/modules/core/distribution/src/repository/cloud/portal/common.css new file mode 100644 index 00000000..091a6501 --- /dev/null +++ b/modules/core/distribution/src/repository/cloud/portal/common.css @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2015, 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. + */ + +.truncate { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/** + * Validation messages + */ +.required { + color: #e74c3c; +} + +.required-error { + background: #a94442; + border: 1px solid #a94442; + padding: 6px 12px; + color: #fff; +} + +/** + * Theme overrides + */ +.breadcrumb li .fw-home { + float: left; + padding-top: 2px; + margin-right: 5px; +} + +/** + * Auth menu + */ +.auth .hidden-xs { + line-height: 38px; +} + +.auth-xs { + color: #fff; +} + +.auth-xs ul { + list-style: none; + padding: 0; + margin: 0; + line-height: 28px; + background-color: #2a80b9; +} + +.auth-xs li { + color: #ccc; +} + +.auth-xs li a { + display: block; + color: #fff; +} + +.auth-xs li a:hover { + background-color: #499dd5; +} + +ul.dropdown-menu.more-actions-button { + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; + width: 40px; + background: #F9F9F9; + border-bottom: 1px solid #EFEFEF; + min-width: 45px; + +} + +ul.dropdown-menu.more-actions-button > li { + height: 40px; + width: 40px; + border: 1px; +} + +ul.dropdown-menu.more-actions-button > li > button { + border-bottom: 1px solid #e4e4e4; + border-top: 1px solid darkred; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: none; + box-shadow: none; + border: 0px; +} + +.btn-custom { + border-width: 1px; +} + + +.cloud-menu .popover { + border-radius: 0px; + width: 24em; + left: -21.1em !important; + max-width: 32em; + background-color: #006690 +} +.cloud-menu .popover-title,.navbar-header .popover-title { + background-color: #006690; + font-size: 16px; + border-bottom: none; + font-weight: 400; +} +.cloud-menu .popover.bottom>.arrow{ + margin-left:-2px; +} +.cloud-menu .popover.bottom>.arrow:after,.navbar-header .popover.bottom>.arrow:after{ + border-bottom-color: #006690; +} +.cloud-block { + float: left; + width: 8.2em; + height: 8.2em; + background-color: #fff; + margin: 0.5em 0em 0.5em 0.5em; + text-align: center; + vertical-align: middle; +} +.cloud-name { + font-size:14px; + margin-top: .5em; + font-weight: 400; +} +.cloud-menu-popover { + position: relative; + float: right; + padding: 0px 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; + color: #fff; + cursor: pointer; +} +#cloud-menu-popover-xs { + color: #fff; + line-height:24px; + border: none; + margin-right: 15px!important; +} +.navbar-toggle{ + border:none; + border-radius: 0px; +} +.navbar-header .popover { + border-radius: 0px; + width: 21em; + max-width:32em; + background-color: #006690; +} +.navbar-header .popover .popover-content{ + padding:0px; +} +.cloud-menu .popover-content { + padding: 0px; +} +.cloud-actions { + background-color: #005578; + float: left; + position: absolute; + width: 100%; + left: 0px; + overflow:hidden; +} +.cloud-actions h3 { + font-size: 16px; + font-weight: 400; + padding-left: 14px; + margin-top: 10px; +} +.cloud-block-invert { + color: #fff; + float: left; + width: 8.2em; + height: 8.2em; + background-color: #1f1f1f; + margin: 0.5em 0em 0.5em 0.5em; + text-align: center; + cursor: pointer; +} + +.cloud-block-default { + color: #006690; + background-color: #fff; + cursor: pointer; +} +.cloud-actions a:hover { + color: #d7d5d5; + background-color: #3d3d3d; + text-decoration: none +} +.cloud-apps a { + text-decoration: none; + color: #006690 !important; + cursor: pointer +} +.cloud-apps a:hover { + text-decoration: none; + color: #006690; + background-color: #c5c5c5; +} +.cloud-apps .cloud-actions a { + color: #fff +} + +.add-padding-top-3x { + padding-top: 15px !important; +} + +.nav li a{ + color: #fff; +} + +.cloud-menu-content li a{ + color:inherit; +} + +html{ + height: 100%; +} + +body{ + height: calc(100% - 50px); +} \ No newline at end of file diff --git a/modules/core/distribution/src/repository/cloud/portal/global-navigation.jag b/modules/core/distribution/src/repository/cloud/portal/global-navigation.jag new file mode 100644 index 00000000..84e47f93 --- /dev/null +++ b/modules/core/distribution/src/repository/cloud/portal/global-navigation.jag @@ -0,0 +1,329 @@ +<% +/* + * Copyright (c) 2015, 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. + */ +%> +<% +var query = request.getQueryString(); +var dest = encodeURIComponent(originalURI + (query ? '?' + query : '')); +var configs = require('/configs/portal.js').config(); +var isCloud = configs.isCloud; +%> +
+ + + +
+
Navigate to Cloud
+ +
+ + <% } else { %> +
+ <% if (user) { %> + +
+ +
+ +
+
+ <% } else { %> + + <%= i18n.localize("login.label")%> + + <% } %> +
+ <% } %> + +
\ No newline at end of file diff --git a/modules/core/distribution/src/repository/cloud/portal/portal.js b/modules/core/distribution/src/repository/cloud/portal/portal.js new file mode 100644 index 00000000..5b09f436 --- /dev/null +++ b/modules/core/distribution/src/repository/cloud/portal/portal.js @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2015, 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. + */ +$(function () { + + var dashboardsApi = ues.utils.tenantPrefix() + 'apis/dashboards'; + var dashboards = []; + var isStillLoading = false; + var nextStart = 0; + var hasMore = true; + + /** + * Page count. + * @const + */ + var PAGE_COUNT = 10; + + // Pre-compiling handlebar templates + var dashboardsListHbs = Handlebars.compile($("#ues-dashboards-list-hbs").html()); + var dashboardThumbnailHbs = Handlebars.compile($("#ues-dashboard-thumbnail-hbs").html()); + var dashboardConfirmHbs = Handlebars.compile($("#ues-dashboard-confirm-hbs").html()); + var dashboardsEmptyHbs = Handlebars.compile($("#ues-dashboards-empty-hbs").html()); + Handlebars.registerPartial('ues-dashboard-thumbnail-hbs', dashboardThumbnailHbs); + + /** + * Find the dashboard using dashboard id. + * @param id + * @return {object} + * @private + * */ + var findDashboard = function (id) { + var i; + var dashboard; + var length = dashboards.length; + for (i = 0; i < length; i++) { + dashboard = dashboards[i]; + if (dashboard.id === id) { + return dashboard; + } + } + }; + + /** + * Delete the selected dashboard + * @param el:-selected dashboard element + * @private + * */ + var deleteDashboard = function (el) { + var button = Ladda.create(el[0]); + button.start(); + var id = el.closest('.ues-dashboard').data('id'); + $.ajax({ + url: dashboardsApi + '/' + id, + method: 'DELETE', + async : false, + success: function () { + button.stop(); + location.reload(); + }, + error: function () { + button.stop(); + } + }); + }; + + /** + * Load the list of dashboards available. + * @private + * */ + var loadDashboards = function () { + isStillLoading = true; + + if (!hasMore) { + isStillLoading = false; + $('.ues-dashboard').each(function (i, obj) { + if ($(this).find('.ues-dashboard-share').length) { + $(this).addClass("shared"); + } + }); + return; + } + ues.store.assets('dashboard', { + start: nextStart, + count: PAGE_COUNT + }, function (err, data) { + var dashboardsEl = $('#ues-portal').find('.ues-dashboards'); + hasMore = data.length; + if (!hasMore && nextStart === 0) { + dashboardsEl.append(dashboardsEmptyHbs()); + return; + } + + nextStart += PAGE_COUNT; + dashboards = dashboards.concat(data); + dashboardsEl.append(dashboardsListHbs(data)); + + var win = $(window); + var doc = $(document); + isStillLoading = false; + if (doc.height() > win.height()) { + return; + } + + loadDashboards(); + + $(".disable").on('click', function (event) { + event.preventDefault(); + }); + }); + }; + + /** + * Initialize the UI functionality such as binding events. + * @private + * */ + var initUI = function () { + var portal = $('#ues-portal'); + portal.on('click', '.ues-dashboards .ues-dashboard-trash-handle', function (e) { + e.preventDefault(); + var thiz = $(this); + var dashboardEl = thiz.closest('.ues-dashboard'); + var id = dashboardEl.data('id'); + var dashboard = findDashboard(id); + dashboardEl.html(dashboardConfirmHbs(dashboard)); + }); + + portal.on('click', '.ues-dashboards .ues-dashboard-trash-confirm', function (e) { + e.preventDefault(); + deleteDashboard($(this)); + }); + + portal.on('click', '.ues-dashboards .ues-dashboard-trash-cancel', function (e) { + e.preventDefault(); + var thiz = $(this); + var dashboardEl = thiz.closest('.ues-dashboard'); + var id = dashboardEl.data('id'); + var dashboard = findDashboard(id); + dashboardEl.html(dashboardThumbnailHbs(dashboard)); + }); + + portal.on('click', '.ues-view:not(.disable)', function(e) { + e.preventDefault(); + window.open($(this).attr('href'), '_blank'); + }); + + $('#filter-dashboards a').on('click', function () { + $('#filter').html($(this).text()); + var filter = $(this).data('filter'); + + $('.ues-dashboard-container').each(function (i, obj) { + if (filter === "All") { + $(this).show(); + } else { + if ($(this).find('.ues-dashboard-share').length) { + filter === "Shared" ? $(this).show() : $(this).hide(); + } else { + filter === "Shared" ? $(this).hide() : $(this).show(); + } + } + }); + }); + + $(window).scroll(function () { + var win = $(window); + var doc = $(document); + if (win.scrollTop() + win.height() < doc.height() - 100) { + return; + } + + if (!isStillLoading) { + loadDashboards(); + } + }); + }; + + $(document).ready(function () { + if($('#cloud-menu-popover').length) { + $('#cloud-menu-popover i.fw-tiles').popover({ + html: true, + trigger:'click', + title: function() { + return $("#popover-head").html(); + }, + content: function() { + return $("#popover-content").html(); + } + }); + } + }); + initUI(); + loadDashboards(); +}); \ No newline at end of file diff --git a/modules/core/distribution/src/repository/conf/api-manager.xml b/modules/core/distribution/src/repository/conf/api-manager.xml index 81cca534..1341e29f 100755 --- a/modules/core/distribution/src/repository/conf/api-manager.xml +++ b/modules/core/distribution/src/repository/conf/api-manager.xml @@ -253,10 +253,10 @@ am_application_scope - + + /oauth2/token - - - - - - jdbc/DM_DS - - - - - org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.MQTTBasedPushNotificationProvider - org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.XMPPBasedPushNotificationProvider - - - - - https://localhost:9443 - admin - admin - - - org.wso2.carbon.policy.mgt - false - 60000 - 5 - 8 - 20 - - - - Simple - - - true - 60000 - org.wso2.carbon.device.mgt.core.task.impl.DeviceDetailsRetrieverTask - - - - 20 - 20 - 20 - 20 - - \ No newline at end of file diff --git a/modules/core/distribution/src/repository/conf/etc/webapp-publisher-config.xml b/modules/core/distribution/src/repository/conf/etc/webapp-publisher-config.xml index 0784d2a4..59a239ac 100644 --- a/modules/core/distribution/src/repository/conf/etc/webapp-publisher-config.xml +++ b/modules/core/distribution/src/repository/conf/etc/webapp-publisher-config.xml @@ -35,6 +35,6 @@ default - devicetype-publisher + device-manager \ No newline at end of file diff --git a/modules/core/distribution/src/repository/conf/identity/service-providers/API_STORE.xml b/modules/core/distribution/src/repository/conf/identity/service-providers/API_STORE.xml index 4ae3fdaf..d77e49a3 100644 --- a/modules/core/distribution/src/repository/conf/identity/service-providers/API_STORE.xml +++ b/modules/core/distribution/src/repository/conf/identity/service-providers/API_STORE.xml @@ -44,7 +44,7 @@ true - false + true diff --git a/modules/core/distribution/src/repository/conf/identity/service-providers/devicemgt.xml b/modules/core/distribution/src/repository/conf/identity/service-providers/devicemgt.xml index 156eb6e1..2c7c52d9 100644 --- a/modules/core/distribution/src/repository/conf/identity/service-providers/devicemgt.xml +++ b/modules/core/distribution/src/repository/conf/identity/service-providers/devicemgt.xml @@ -44,7 +44,7 @@ true - false + true diff --git a/modules/core/distribution/src/repository/conf/identity/service-providers/portal.xml b/modules/core/distribution/src/repository/conf/identity/service-providers/portal.xml index 7f84e5ab..3cd65666 100644 --- a/modules/core/distribution/src/repository/conf/identity/service-providers/portal.xml +++ b/modules/core/distribution/src/repository/conf/identity/service-providers/portal.xml @@ -44,7 +44,7 @@ true - false + true diff --git a/modules/core/distribution/src/repository/conf/identity/service-providers/publisher.xml b/modules/core/distribution/src/repository/conf/identity/service-providers/publisher.xml index 503833ce..33a4736d 100644 --- a/modules/core/distribution/src/repository/conf/identity/service-providers/publisher.xml +++ b/modules/core/distribution/src/repository/conf/identity/service-providers/publisher.xml @@ -44,7 +44,7 @@ true - false + true diff --git a/modules/core/distribution/src/repository/conf/identity/service-providers/store.xml b/modules/core/distribution/src/repository/conf/identity/service-providers/store.xml index 27bb258e..9503a87d 100644 --- a/modules/core/distribution/src/repository/conf/identity/service-providers/store.xml +++ b/modules/core/distribution/src/repository/conf/identity/service-providers/store.xml @@ -44,7 +44,7 @@ true - false + true diff --git a/modules/core/distribution/src/repository/conf/security/Owasp.CsrfGuard.Carbon.properties b/modules/core/distribution/src/repository/conf/security/Owasp.CsrfGuard.Carbon.properties index 131b993f..345a112a 100644 --- a/modules/core/distribution/src/repository/conf/security/Owasp.CsrfGuard.Carbon.properties +++ b/modules/core/distribution/src/repository/conf/security/Owasp.CsrfGuard.Carbon.properties @@ -476,6 +476,7 @@ org.owasp.csrfguard.unprotected.socialAcs=%servletContext%/social/acs org.owasp.csrfguard.unprotected.socialApis=%servletContext%/social/apis org.owasp.csrfguard.unprotected.appStoreDevices=%servletContext%/store/apps/devices/* org.owasp.csrfguard.unprotected.appStoreApis=%servletContext%/store/apis/* +org.owasp.csrfguard.unprotected.appPortalClient=%servletContext%/portal/apis/* #carbon diff --git a/modules/core/distribution/src/repository/conf/security/authenticators.xml b/modules/core/distribution/src/repository/conf/security/authenticators.xml index 4c227fe9..4b8e8fb8 100644 --- a/modules/core/distribution/src/repository/conf/security/authenticators.xml +++ b/modules/core/distribution/src/repository/conf/security/authenticators.xml @@ -25,22 +25,35 @@ - - 10 - - false - https://localhost:9443 - admin - admin - - + + 5 + + + 10 + + false + https://localhost:9443 + admin + admin + + 5 - + + + + 10 diff --git a/modules/core/distribution/src/repository/conf/tomcat/catalina-server.xml b/modules/core/distribution/src/repository/conf/tomcat/catalina-server.xml new file mode 100644 index 00000000..c68a93ef --- /dev/null +++ b/modules/core/distribution/src/repository/conf/tomcat/catalina-server.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/core/distribution/src/repository/jaggeryapps/portal/configs/designer.json b/modules/core/distribution/src/repository/jaggeryapps/portal/configs/designer.json index 7e6bb450..86b79ac3 100644 --- a/modules/core/distribution/src/repository/jaggeryapps/portal/configs/designer.json +++ b/modules/core/distribution/src/repository/jaggeryapps/portal/configs/designer.json @@ -1,4 +1,5 @@ { + "isCloud" : false, "store": { "types": ["fs"] }, @@ -20,7 +21,7 @@ "acs": "%https.host%/portal/acs", "identityAlias": "wso2carbon", "defaultNameIDPolicy": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "useTenantKey": false, + "useTenantKey": true, "isPassive": false } }, @@ -34,7 +35,7 @@ "methods": { "oauth": { "attributes": { - "apimgt-gateway": false, + "apimgt-gateway": true, "oauthProvider": { "appRegistration": { "appType": "webapp", @@ -46,7 +47,8 @@ "grantType": "password refresh_token urn:ietf:params:oauth:grant-type:saml2-bearer urn:ietf:params:oauth:grant-type:jwt-bearer", "tokenScope": "admin", "callbackUrl": "%https.host%/portal", - "saasApp":true + "saasApp":true, + "samlGrantTypeName":"urn:ietf:params:oauth:grant-type:saml2-bearer" }, "tokenServiceURL": "https://localhost:9443/oauth2/token" }, diff --git a/modules/core/distribution/src/repository/jaggeryapps/portal/modules/oauth/token-handler-utils.js b/modules/core/distribution/src/repository/jaggeryapps/portal/modules/oauth/token-handler-utils.js new file mode 100644 index 00000000..c6a8aab5 --- /dev/null +++ b/modules/core/distribution/src/repository/jaggeryapps/portal/modules/oauth/token-handler-utils.js @@ -0,0 +1,598 @@ +/* + * 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. + */ + +var utils = function () { + var log = new Log("/modules/oauth/token-handler-utils.js"); + + var configs = require('/configs/portal.js').config(); + var constants = require("/modules/constants.js"); + var carbon = require("carbon"); + + //noinspection JSUnresolvedVariable + var Base64 = Packages.org.apache.commons.codec.binary.Base64; + //noinspection JSUnresolvedVariable + var String = Packages.java.lang.String; + + var publicMethods = {}; + var privateMethods = {}; + + publicMethods["encode"] = function (payload) { + return String(Base64.encodeBase64(String(payload).getBytes())); + }; + + publicMethods["decode"] = function (payload) { + return String(Base64.decodeBase64(String(payload).getBytes())); + }; + + /** + * Check whether this application is oauth enable or not + * @returns boolean if oauth enable + */ + publicMethods["checkOAuthEnabled"] = function () { + if (constants.AUTHORIZATION_TYPE_OAUTH === configs["authorization"]["activeMethod"]) { + return true; + } + return false; + }; + + /** + * Set access token into xml http request header + * @param xhr xml http request + * @returns {*} xhr which has access token it's header + */ + publicMethods["setAccessToken"] = function (xhr, callback) { + var accessToken; + if (publicMethods.checkOAuthEnabled()) { + try { + accessToken = parse(session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER_FOR_PORTAL))["accessToken"]; + xhr.setRequestHeader(constants.AUTHORIZATION_HEADER, constants.BEARER_PREFIX + accessToken); + } catch (exception) { + log.error("Access token hasn't been set yet, " + exception); + } finally { + callback(xhr); + } + } + callback(xhr); + }; + + /** + * Get access token of current logged user + * @param callBack response with access token + */ + publicMethods["getAccessToken"] = function (callBack) { + var accessToken = null; + if (publicMethods.checkOAuthEnabled()) { + try { + accessToken = parse(session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER_FOR_PORTAL))["accessToken"]; + } catch (exception) { + log.error("Access token hasn't been set yet, " + exception); + } finally { + callBack(accessToken); + } + } + callBack(accessToken); + }; + + /** + * Create error message which adhere to xml http response object + * @param statusCode response status code + * @param status response status + * @param responseText response message + * @returns {{statusCode: *, status: *, responseText: *}} + */ + publicMethods["createXHRObject"] = function (statusCode, status, responseText) { + return {"statusCode": statusCode, "status": status, "responseText": responseText}; + }; + + /** + * check whether user already logged to system before invoking any apis + * @param callBack + */ + publicMethods["isUserAuthorized"] = function (callBack) { + if (session.get("Loged") !== constants.LOGIN_MESSAGE) { + callBack(false); + } else { + callBack(true); + } + }; + + /** + * Get identity provider uir + * @returns {*} + */ + publicMethods["getIdPServerURL"] = function () { + return configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["tokenServiceURL"]; + }; + + /** + * Get an Access token pair based on client secret + * @param encodedClientKeys {{clientId:"", clientSecret:""}} + * @param scope eg: PRODUCTION + * @param idPServer identity provider url + * @returns {{accessToken: *, refreshToken: *}} + */ + publicMethods["getTokenWithClientSecretType"] = function (encodedClientKeys, scope, idPServer) { + var xhr = new XMLHttpRequest(); + var tokenEndpoint = idPServer; + xhr.open(constants.HTTP_POST, tokenEndpoint, false); + xhr.setRequestHeader(constants.CONTENT_TYPE_IDENTIFIER, constants.APPLICATION_X_WWW_FOR_URLENCODED); + xhr.setRequestHeader(constants.AUTHORIZATION_HEADER, constants.BASIC_PREFIX + encodedClientKeys); + xhr.send("grant_type=client_credentials&scope=" + scope); + var tokenPair = {}; + if (xhr.status == constants.HTTP_ACCEPTED) { + var data = parse(xhr.responseText); + tokenPair.refreshToken = data.refresh_token; + tokenPair.accessToken = data.access_token; + } else if (xhr.status == constants.HTTP_USER_NOT_AUTHENTICATED) { + log.error("Error in obtaining token with client secret grant type, You are not authenticated yet"); + return null; + } else { + log.error("Error in obtaining token with client secret grant type, This might be a problem with client meta " + + "data which required for client secret grant type"); + return null; + } + return tokenPair; + }; + + + /** + * This will create client id and client secret for a given application + * @param properties "callbackUrl": "", + * "clientName": "", + * "owner": "", + * "applicationType": "", + * "grantType": "", + * "saasApp" :"", + * "dynamicClientRegistrationEndPoint" : "" + * + * @returns {{clientId:*, clientSecret:*}} + */ + publicMethods["getDynamicClientAppCredentials"] = function (username) { + // setting up dynamic client application properties + var dcAppProperties = { + "applicationType": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["appType"], + "clientName": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["clientName"], + "owner": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["owner"], + "tokenScope": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["tokenScope"], + "grantType": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["grantType"], + "callbackUrl": configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["callbackUrl"], + "saasApp" : configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"]["saasApp"] + }; + + var tenantDomain = carbon.server.tenantDomain({username: username}); + if (!tenantDomain) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving tenant " + + "based client application credentials. Unable to obtain a valid tenant domain for provided username "+ + username +"- getDynamicClientAppCredentials(x)"); + return null; + } else { + var cachedTenantBasedClientAppCredentials = privateMethods. + getCachedTenantBasedClientAppCredentials(tenantDomain); + if (cachedTenantBasedClientAppCredentials) { + return cachedTenantBasedClientAppCredentials; + } else { + // calling dynamic client app registration service endpoint + var requestURL = configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"]["appRegistration"] + ["dynamicClientAppRegistrationServiceURL"]; + var requestPayload = dcAppProperties; + var token = publicMethods.encode(configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"] + ["appRegistration"]["owner"] + ":" + configs["authorization"]["methods"]["oauth"]["attributes"] + ["oauthProvider"]["appRegistration"]["password"]); + var xhr = new XMLHttpRequest(); + xhr.open("POST", requestURL, false); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("Authorization", "Basic "+ token); + xhr.send(stringify(requestPayload)); + var dynamicClientAppCredentials = {}; + if (xhr["status"] == 201 || xhr["status"] == 200 && xhr["responseText"]) { + var responsePayload = parse(xhr["responseText"]); + var clientId = responsePayload["client_id"]; + var clientSecret = responsePayload["client_secret"]; + if(typeof clientId == "undefined"){ + clientId = responsePayload["clientId"]; + } + if(typeof clientSecret == "undefined"){ + clientSecret = responsePayload["clientSecret"]; + } + dynamicClientAppCredentials["clientId"] = clientId; + dynamicClientAppCredentials["clientSecret"] = clientSecret; + privateMethods. + setCachedTenantBasedClientAppCredentials(tenantDomain, dynamicClientAppCredentials); + } else if (xhr["status"] == 400) { + log.error("{/modules/oauth/token-handler-utils.js - getDynamicClientAppCredentials()} " + + "Bad request. Invalid data provided as dynamic client application properties."); + dynamicClientAppCredentials = null; + } else { + log.error("{/modules/oauth/token-handler-utils.js - getDynamicClientAppCredentials()} " + + "Error in retrieving dynamic client credentials."); + dynamicClientAppCredentials = null; + } + // returning dynamic client credentials + return dynamicClientAppCredentials; + } + } + }; + + /** + * If gateway is enable, apiManagerClientAppRegistrationServiceURL is used to create oauth application + * @param username username of current logged user + * @returns {{clientId:*, clientSecret:*}} + */ + publicMethods["getTenantBasedClientAppCredentials"] = function (username) { + if (!username) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving tenant " + + "based client app credentials. No username " + + "as input - getTenantBasedClientAppCredentials(x)"); + return null; + } else { + //noinspection JSUnresolvedFunction, JSUnresolvedVariable + var tenantDomain = carbon.server.tenantDomain({username: username}); + + if (!tenantDomain) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving tenant " + + "based client application credentials. Unable to obtain a valid tenant domain for provided " + + "username - getTenantBasedClientAppCredentials(x, y)"); + return null; + } else { + var cachedTenantBasedClientAppCredentials = privateMethods. + getCachedTenantBasedClientAppCredentials(tenantDomain); + if (cachedTenantBasedClientAppCredentials) { + return cachedTenantBasedClientAppCredentials; + } else { + var adminUsername = configs["authorization"]["methods"]["oauth"]["attributes"]["adminUser"]; + var adminUserTenantId = configs["authorization"]["methods"]["oauth"]["attributes"] + ["adminUserTenantId"]; + //claims required for jwtAuthenticator. + var claims = {"http://wso2.org/claims/enduserTenantId": adminUserTenantId, + "http://wso2.org/claims/enduser": adminUsername}; + var jwtToken = publicMethods.getJwtToken(adminUsername, claims); + // register a tenant based client app at API Manager + var applicationName = configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"] + ["appRegistration"]["clientName"] + "_" + tenantDomain; + var requestURL = configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"] + ["appRegistration"]["apiManagerClientAppRegistrationServiceURL"] + + "?tenantDomain=" + tenantDomain + "&applicationName=" + applicationName; + var xhr = new XMLHttpRequest(); + xhr.open("POST", requestURL, false); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("X-JWT-Assertion", "" + jwtToken); + xhr.send(); + if ((xhr["status"] == 201 || xhr["status"] == 200) && xhr["responseText"]) { + var responsePayload = parse(xhr["responseText"]); + var tenantBasedClientAppCredentials = {}; + var clientId = responsePayload["client_id"]; + var clientSecret = responsePayload["client_secret"]; + if(typeof clientId == "undefined"){ + clientId = responsePayload["clientId"]; + } + if(typeof clientSecret == "undefined"){ + clientSecret = responsePayload["clientSecret"]; + } + tenantBasedClientAppCredentials["clientId"] = clientId; + tenantBasedClientAppCredentials["clientSecret"] = clientSecret; + privateMethods. + setCachedTenantBasedClientAppCredentials(tenantDomain, tenantBasedClientAppCredentials); + return tenantBasedClientAppCredentials; + } else { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving tenant " + + "based client application credentials from API " + + "Manager - getTenantBasedClientAppCredentials(x, y)"); + return null; + } + } + } + } + }; + + /** + * Caching oauth application credentials + * @param tenantDomain tenant domain where application is been created + * @param clientAppCredentials {{clientId:*, clientSecret:*}} + */ + privateMethods["setCachedTenantBasedClientAppCredentials"] = function (tenantDomain, clientAppCredentials) { + var cachedTenantBasedClientAppCredentialsMap = application.get(constants["CACHED_CREDENTIALS_PORTAL_APP"]); + if (!cachedTenantBasedClientAppCredentialsMap) { + cachedTenantBasedClientAppCredentialsMap = {}; + cachedTenantBasedClientAppCredentialsMap[tenantDomain] = clientAppCredentials; + application.put(constants["CACHED_CREDENTIALS_PORTAL_APP"], cachedTenantBasedClientAppCredentialsMap); + } else if (!cachedTenantBasedClientAppCredentialsMap[tenantDomain]) { + cachedTenantBasedClientAppCredentialsMap[tenantDomain] = clientAppCredentials; + } + }; + + /** + * Get oauth application credentials from cache + * @param tenantDomain tenant domain where application is been created + * @returns {{clientId:*, clientSecret:*}} + */ + privateMethods["getCachedTenantBasedClientAppCredentials"] = function (tenantDomain) { + var cachedTenantBasedClientAppCredentialsMap = application.get(constants["CACHED_CREDENTIALS_PORTAL_APP"]); + if (!cachedTenantBasedClientAppCredentialsMap || + !cachedTenantBasedClientAppCredentialsMap[tenantDomain]) { + return null; + } else { + return cachedTenantBasedClientAppCredentialsMap[tenantDomain]; + } + }; + + /** + * Get access token and refresh token using password grant type + * @param username username of the logged user + * @param password password of the logged user + * @param encodedClientAppCredentials {{clientId:*, clientSecret:*}} + * @param scopes scopes list + * @returns {{accessToken: *, refreshToken: *}} + */ + publicMethods["getTokenPairAndScopesByPasswordGrantType"] = function (username, password + , encodedClientAppCredentials, scopes) { + if (!username || !password || !encodedClientAppCredentials || !scopes) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving access token by password " + + "grant type. No username, password, encoded client app credentials or scopes are " + + "found - getTokenPairAndScopesByPasswordGrantType(a, b, c, d)"); + return null; + } else { + // calling oauth provider token service endpoint + var requestURL = configs["authorization"]["methods"]["oauth"]["attributes"]["oauthProvider"] + ["tokenServiceURL"]; + var requestPayload = "grant_type=password&username=" + + username + "&password=" + password + "&scope=" + scopes; + + var xhr = new XMLHttpRequest(); + xhr.open("POST", requestURL, false); + xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + xhr.setRequestHeader("Authorization", "Basic " + encodedClientAppCredentials); + xhr.send(requestPayload); + + if (xhr["status"] == 200 && xhr["responseText"]) { + var responsePayload = parse(xhr["responseText"]); + var tokenData = {}; + tokenData["accessToken"] = responsePayload["access_token"]; + tokenData["refreshToken"] = responsePayload["refresh_token"]; + tokenData["scopes"] = responsePayload["scope"]; + return tokenData; + } else { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving access token " + + "by password grant type - getTokenPairAndScopesByPasswordGrantType(a, b, c, d)"); + return null; + } + } + }; + + /** + * Get access token and refresh token using SAML grant type + * @param assertion + * @param encodedClientAppCredentials + * @param scopes + * @returns {{accessToken: *, refreshToken: *}} + */ + publicMethods["getTokenPairAndScopesByJWTGrantType"] = function (username, encodedClientAppCredentials, scopes) { + if (!username || !encodedClientAppCredentials || !scopes) { + log.error("{/app/modules/oauth/token-handler-utils.js} Error in retrieving access token by jwt " + + "grant type. No assertion, encoded client app credentials or scopes are " + + "found - getTokenPairAndScopesByJWTGrantType(x, y, z)"); + return null; + } else { + var JWTClientManagerServicePackagePath = + "org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService"; + //noinspection JSUnresolvedFunction, JSUnresolvedVariable + var JWTClientManagerService = carbon.server.osgiService(JWTClientManagerServicePackagePath); + //noinspection JSUnresolvedFunction + var jwtClient = JWTClientManagerService.getJWTClient(); + // returning access token by JWT grant type + var tokenInfo = jwtClient.getAccessToken(encodedClientAppCredentials, + username, scopes); + var tokenData = {}; + tokenData["accessToken"] = tokenInfo.getAccessToken(); + tokenData["refreshToken"] = tokenInfo.getRefreshToken(); + tokenData["scopes"] = tokenInfo.getScopes(); + return tokenData; + } + }; + + /** + * Get access token and refresh token using SAML grant type + * @param assertion + * @param encodedClientAppCredentials + * @param scopes + * @returns {{accessToken: *, refreshToken: *}} + */ + publicMethods["getTokenPairAndScopesBySAMLGrantType"] = function (assertion, encodedClientAppCredentials, scopes) { + if (!assertion || !encodedClientAppCredentials || !scopes) { + log.error("{/modules/oauth/token-handler-utils.js} Error in retrieving access token by saml " + + "grant type. No assertion, encoded client app credentials or scopes are " + + "found - getTokenPairAndScopesBySAMLGrantType(x, y, z)"); + return null; + } else { + + var assertionXML = publicMethods.decode(assertion); + /* + TODO: make assertion extraction with proper parsing. + Since Jaggery XML parser seem to add formatting which causes signature verification to fail. + */ + var assertionStartMarker = " org.wso2.carbon.devicemgt:org.wso2.carbon.apimgt.application.extension.feature:${carbon.device.mgt.version} + + org.wso2.carbon.devicemgt:org.wso2.carbon.apimgt.integration.client.feature:${carbon.device.mgt.version} + org.wso2.carbon.devicemgt:org.wso2.carbon.apimgt.handler.server.feature:${carbon.device.mgt.version} @@ -158,6 +161,9 @@ org.wso2.carbon.devicemgt:org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature:${carbon.device.mgt.version} + + org.wso2.carbon.devicemgt:org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature:${carbon.device.mgt.version} + org.wso2.carbon.devicemgt:org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature:${carbon.device.mgt.version} @@ -359,9 +365,6 @@ org.wso2.carbon.identity.framework:org.wso2.carbon.identity.thrift.authentication.feature:${carbon.identity.framework.version.iotcore} - - org.wso2.carbon.identity:org.wso2.carbon.identity.authenticator.mutualssl.feature:${identity.carbon.auth.mutual.ssl.version} - org.wso2.carbon.identity.metadata.saml2:org.wso2.carbon.identity.inbound.metadata.saml2.server.feature:0.1.1 @@ -618,6 +621,12 @@ org.wso2.carbon.apimgt:org.wso2.carbon.apimgt.rest.api.dcr.feature:${carbon.api.mgt.version} + + org.wso2.carbon.apimgt:org.wso2.carbon.apimgt.rest.api.publisher.feature:${carbon.api.mgt.version} + + + org.wso2.carbon.apimgt:org.wso2.carbon.apimgt.rest.api.store.feature:${carbon.api.mgt.version} + @@ -770,7 +779,7 @@ - p2-profile-generation-devicetype-publisher-profile + p2-profile-generation-device-manager-profile package materialize-product @@ -782,11 +791,11 @@ file:${basedir}/target/wso2carbon-core-${carbon.kernel.version}/repository/components - devicetype-publisher + device-manager - p2-profile-generation-devicetype-worker-profile + p2-profile-generation-device-backend-profile package materialize-product @@ -798,7 +807,7 @@ file:${basedir}/target/wso2carbon-core-${carbon.kernel.version}/repository/components - devicetype-worker + device-backend @@ -846,10 +855,6 @@ org.wso2.carbon.appmgt.core.feature.group ${appmgt.feature.version} - - org.wso2.carbon.store.feature.group - ${carbon.store.version} - org.wso2.carbon.appmgt.mdm.wso2emm.feature.group ${appmgt.feature.version} @@ -866,6 +871,10 @@ org.wso2.carbon.appmgt.services.api.feature.group ${appmgt.feature.version} + + org.wso2.carbon.store.feature.group + ${carbon.store.version} + org.wso2.carbon.appmgt.store.feature.group ${appmgt.feature.version} @@ -893,6 +902,10 @@ org.wso2.carbon.apimgt.application.extension.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.apimgt.integration.client.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.email.sender.feature.group ${carbon.device.mgt.version} @@ -945,6 +958,10 @@ org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature.group ${carbon.device.mgt.version} @@ -1053,6 +1070,14 @@ org.wso2.carbon.apimgt.rest.api.dcr.feature.group ${carbon.api.mgt.version} + + org.wso2.carbon.apimgt.rest.api.publisher.feature.group + ${carbon.api.mgt.version} + + + org.wso2.carbon.apimgt.rest.api.store.feature.group + ${carbon.api.mgt.version} + org.wso2.carbon.apimgt.gateway.feature.group @@ -1883,6 +1908,10 @@ org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature.group ${carbon.device.mgt.version} @@ -1911,6 +1940,10 @@ org.wso2.carbon.apimgt.application.extension.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.apimgt.integration.client.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.certificate.mgt.server.feature.group ${carbon.device.mgt.version} @@ -2327,6 +2360,10 @@ org.wso2.carbon.apimgt.application.extension.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.apimgt.integration.client.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.dynamic.client.registration.server.feature.group ${carbon.device.mgt.version} @@ -2366,6 +2403,10 @@ org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature.group ${carbon.device.mgt.version} @@ -2390,6 +2431,10 @@ org.wso2.carbon.apimgt.application.extension.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.apimgt.integration.client.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.certificate.mgt.api.feature.group ${carbon.device.mgt.version} @@ -2433,7 +2478,7 @@ p2-profile-gen - devicetype-publisher + device-manager file:${basedir}/target/p2-repo file:${basedir}/target/p2-repo @@ -2447,7 +2492,6 @@ ${product.iot.version} - org.wso2.carbon.appmgt.core.feature.group @@ -2512,6 +2556,10 @@ org.wso2.carbon.apimgt.application.extension.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.apimgt.integration.client.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.email.sender.feature.group ${carbon.device.mgt.version} @@ -2568,6 +2616,10 @@ org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature.group ${carbon.device.mgt.version} @@ -2863,6 +2915,18 @@ org.wso2.carbon.apimgt.gateway.feature.group ${carbon.api.mgt.version} + + org.wso2.carbon.apimgt.rest.api.dcr.feature.group + ${carbon.api.mgt.version} + + + org.wso2.carbon.apimgt.rest.api.publisher.feature.group + ${carbon.api.mgt.version} + + + org.wso2.carbon.apimgt.rest.api.store.feature.group + ${carbon.api.mgt.version} + org.wso2.carbon.apimgt.core.feature.group ${carbon.api.mgt.version} @@ -2997,6 +3061,10 @@ org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature.group ${carbon.device.mgt.version} @@ -3021,6 +3089,10 @@ org.wso2.carbon.apimgt.application.extension.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.apimgt.integration.client.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.certificate.mgt.api.feature.group ${carbon.device.mgt.version} @@ -3091,7 +3163,7 @@ p2-profile-gen - devicetype-worker + device-backend file:${basedir}/target/p2-repo file:${basedir}/target/p2-repo @@ -3106,23 +3178,39 @@ - - - org.wso2.carbon.appmgt.core.feature.group - ${appmgt.feature.version} - - - org.wso2.carbon.appmgt.mdm.wso2emm.feature.group - ${appmgt.feature.version} - - - org.wso2.carbon.appmgt.mobile.feature.group - ${appmgt.feature.version} - - - org.wso2.carbon.appmgt.services.api.feature.group - ${appmgt.feature.version} - + + + org.wso2.carbon.appmgt.core.feature.group + ${appmgt.feature.version} + + + org.wso2.carbon.appmgt.mdm.wso2emm.feature.group + ${appmgt.feature.version} + + + org.wso2.carbon.appmgt.mobile.feature.group + ${appmgt.feature.version} + + + org.wso2.carbon.appmgt.publisher.feature.group + ${appmgt.feature.version} + + + org.wso2.carbon.appmgt.services.api.feature.group + ${appmgt.feature.version} + + + org.wso2.carbon.store.feature.group + ${carbon.store.version} + + + org.wso2.carbon.appmgt.store.feature.group + ${appmgt.feature.version} + + + org.wso2.carbon.social.feature.group + ${carbon.store.version} + org.wso2.carbon.appmgt.mdm.osgiconnector.feature.group ${carbon.device.mgt.plugin.version} @@ -3131,7 +3219,7 @@ org.wso2.carbon.appmgt.mdm.restconnector.feature.group ${carbon.device.mgt.plugin.version} - + @@ -3150,6 +3238,10 @@ org.wso2.carbon.apimgt.application.extension.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.apimgt.integration.client.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.email.sender.feature.group ${carbon.device.mgt.version} @@ -3198,6 +3290,10 @@ org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature.group ${carbon.device.mgt.version} @@ -3215,6 +3311,7 @@ ${carbon.device.mgt.version} + org.wso2.carbon.device.mgt.adapter.feature.group ${carbon.device.mgt.plugin.version} @@ -3481,6 +3578,18 @@ org.wso2.carbon.apimgt.store.feature.group ${carbon.api.mgt.version} + + org.wso2.carbon.apimgt.rest.api.dcr.feature.group + ${carbon.api.mgt.version} + + + org.wso2.carbon.apimgt.rest.api.publisher.feature.group + ${carbon.api.mgt.version} + + + org.wso2.carbon.apimgt.rest.api.store.feature.group + ${carbon.api.mgt.version} + org.wso2.carbon.registry.extensions.feature.group ${carbon.governance.version} @@ -3607,6 +3716,10 @@ org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature.group ${carbon.device.mgt.version} @@ -3631,6 +3744,10 @@ org.wso2.carbon.apimgt.application.extension.feature.group ${carbon.device.mgt.version} + + org.wso2.carbon.apimgt.integration.client.feature.group + ${carbon.device.mgt.version} + org.wso2.carbon.certificate.mgt.server.feature.group ${carbon.device.mgt.version} @@ -3686,6 +3803,24 @@ ${identity.inbound.auth.saml.version.iotcore} + + + + org.wso2.carbon.dashboards.shindig.feature.group + ${carbon.dashboard.version} + + + org.wso2.carbon.dashboards.portal.feature.group + ${carbon.dashboard.version} + + + org.wso2.carbon.dashboard.deployment.feature.group + ${carbon.dashboard.version} + + + org.wso2.carbon.iot.device.statistics.dashboard.feature.group + ${carbon.device.mgt.plugin.version} + diff --git a/modules/core/scripts/mobile-qsg/pom.xml b/modules/core/scripts/mobile-qsg/pom.xml index 9310827a..944351b0 100644 --- a/modules/core/scripts/mobile-qsg/pom.xml +++ b/modules/core/scripts/mobile-qsg/pom.xml @@ -64,6 +64,72 @@ + + org.apache.maven.plugins + maven-antrun-plugin + + + download-appm-store.war + prepare-package + + run + + + + + + + + + download-appm-publisher.war + prepare-package + + run + + + + + + + + + download-appm-ouath-webapp.war + prepare-package + + run + + + + + + + + + download-appm-ouath-core.jar + prepare-package + + run + + + + + + + + + ${project.artifactId} diff --git a/modules/core/scripts/mobile-qsg/resources/Readme.txt b/modules/core/scripts/mobile-qsg/resources/Readme.txt index 36cf44c3..64ce0ece 100644 --- a/modules/core/scripts/mobile-qsg/resources/Readme.txt +++ b/modules/core/scripts/mobile-qsg/resources/Readme.txt @@ -1,10 +1,7 @@ - IoTs 3.0.0 QSG Setup guide - -1. Navigate to this folder using the terminal, Note that this (Readme.txt) flie should be located under /core/samples/mobile-qsg/ directory. -2. Stop the WSO2 IoTS if already runing -3. Then execute the copy-files.sh script -4. Start the WSO2 IoTS server -5. Once server is started execute the mobile-qsg.sh script -6. Then login to the https://:9443/devicemgt/ and use the username,password as alex alex@IoTS, Note that for this sample we have configured above user from the script. If you want to run this script again you have to login as admin and remove the user alex, chris and role iotMobileUser from the IoT Server. - + IoTs 3.1.0 QSG Setup guide +1. Start the WSO2 IoTS server +2. Navigate to /core/samples/mobile-qsg/ directory using the terminal. +3. Once server is started execute the mobile-qsg.sh script +4. Then login to the https://:9443/devicemgt/ and use the username,password as alex alex@IoTS, ++Note that for this sample we have configured above user from the script. If you want to run this script again you have to login as admin and remove the user alex, chris and role iotMobileUser from the IoT Server. \ No newline at end of file diff --git a/modules/core/scripts/mobile-qsg/resources/apps/android/catalog.apk b/modules/core/scripts/mobile-qsg/resources/apps/android/catalog.apk new file mode 100644 index 00000000..473f5805 Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/android/catalog.apk differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/android/images/banner.jpg b/modules/core/scripts/mobile-qsg/resources/apps/android/images/banner.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/android/images/banner.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/android/images/icon.jpg b/modules/core/scripts/mobile-qsg/resources/apps/android/images/icon.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/android/images/icon.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen1.jpg b/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen1.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen1.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen2.jpg b/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen2.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen2.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen3.jpg b/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen3.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/android/images/screen3.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/ios/PNDemo.ipa b/modules/core/scripts/mobile-qsg/resources/apps/ios/PNDemo.ipa new file mode 100644 index 00000000..01729c7c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/ios/PNDemo.ipa differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/ios/images/banner.jpg b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/banner.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/banner.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/ios/images/icon.jpg b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/icon.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/icon.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen1.jpg b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen1.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen1.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen2.jpg b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen2.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen2.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen3.jpg b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen3.jpg new file mode 100644 index 00000000..002dea5c Binary files /dev/null and b/modules/core/scripts/mobile-qsg/resources/apps/ios/images/screen3.jpg differ diff --git a/modules/core/scripts/mobile-qsg/resources/copy-files.sh b/modules/core/scripts/mobile-qsg/resources/copy-files.sh deleted file mode 100644 index 8bb28f16..00000000 --- a/modules/core/scripts/mobile-qsg/resources/copy-files.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -# product-emm qsg sample setup script for copying the required files - -echo "Copying the required files for wso2iots-3.0.0 QSG setup ..." -cp dropings/* ../../repository/components/dropins/ -cp webapps/* ../../repository/deployment/server/webapps/ - - diff --git a/modules/core/scripts/mobile-qsg/resources/mobile-qsg.sh b/modules/core/scripts/mobile-qsg/resources/mobile-qsg.sh old mode 100644 new mode 100755 diff --git a/modules/core/scripts/mobile-qsg/resources/script_and_resources.zip b/modules/core/scripts/mobile-qsg/resources/script_and_resources.zip deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/distribution/src/assembly/dist.xml b/modules/distribution/src/assembly/dist.xml index fdd91e0f..d14ebd4f 100644 --- a/modules/distribution/src/assembly/dist.xml +++ b/modules/distribution/src/assembly/dist.xml @@ -46,12 +46,12 @@
- - - - - - + + + + + + ${basedir}/src/resources/plugins @@ -60,37 +60,38 @@ */** 644 - true + true - - ${basedir}/src/resources/samples - wso2iot-${product.iot.version}/samples - - */** - + + ${basedir}/src/resources/samples + wso2iot-${product.iot.version}/samples + + */** + **/*samples-deployer.xml **/*connectedcup/pom.xml - 644 - + 644 + - - - + + + ${basedir}/src/resources/samples/samples-deployer.xml - - wso2iot-${product.iot.version}/samples/ - true - 644 - - - + + wso2iot-${product.iot.version}/samples/ + true + 644 + + + ${basedir}/src/resources/samples/connectedcup/pom.xml - - wso2iot-${product.iot.version}/samples/connectedcup - true - 644 - - + + wso2iot-${product.iot.version}/samples/connectedcup + true + 644 + + + diff --git a/modules/distribution/src/resources/plugins/plugins-deployer.xml b/modules/distribution/src/resources/plugins/plugins-deployer.xml index a531bd63..e545dd51 100644 --- a/modules/distribution/src/resources/plugins/plugins-deployer.xml +++ b/modules/distribution/src/resources/plugins/plugins-deployer.xml @@ -111,7 +111,7 @@ - + diff --git a/modules/distribution/src/resources/samples/connectedcup/component/analytics/src/main/resources/carbonapps/connected_cup/connected_cup_receiver/connected_cup_receiver.xml b/modules/distribution/src/resources/samples/connectedcup/component/analytics/src/main/resources/carbonapps/connected_cup/connected_cup_receiver/connected_cup_receiver.xml index e63f6973..0bf476f5 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/analytics/src/main/resources/carbonapps/connected_cup/connected_cup_receiver/connected_cup_receiver.xml +++ b/modules/distribution/src/resources/samples/connectedcup/component/analytics/src/main/resources/carbonapps/connected_cup/connected_cup_receiver/connected_cup_receiver.xml @@ -20,9 +20,7 @@ carbon.super/connectedcup/# - admin - admin - org.wso2.carbon.device.mgt.input.adapter.mqtt.util.MQTTContentValidator + iot-mqtt default true diff --git a/modules/integration/pom.xml b/modules/integration/pom.xml index 72e02fa3..e01676b3 100644 --- a/modules/integration/pom.xml +++ b/modules/integration/pom.xml @@ -33,8 +33,8 @@ tests-artifacts tests-common - tests-integration - + + tests-iot-web-ui diff --git a/modules/integration/tests-integration/pom.xml b/modules/integration/tests-integration/pom.xml index 7ef822f8..124c5b2a 100644 --- a/modules/integration/tests-integration/pom.xml +++ b/modules/integration/tests-integration/pom.xml @@ -16,7 +16,8 @@ ~ specific language governing permissions and limitations ~ under the License. --> - + org.wso2.iot wso2iot-integration diff --git a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/common/OAuthUtil.java b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/common/OAuthUtil.java index 6c57af40..7935d017 100644 --- a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/common/OAuthUtil.java +++ b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/common/OAuthUtil.java @@ -27,6 +27,7 @@ import org.wso2.carbon.automation.test.utils.http.client.HttpResponse; */ public class OAuthUtil { + public static String getScopes(String backendHTTPURL, String backendHTTPSURL) throws Exception { return getOAuthTokenPair(backendHTTPURL, backendHTTPSURL).get(Constants.SCOPE).toString(); } diff --git a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/mobileDevice/MobileDeviceManagementWithNoDevices.java b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/mobileDevice/MobileDeviceManagementWithNoDevices.java index b2e76bea..eeaa37a9 100644 --- a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/mobileDevice/MobileDeviceManagementWithNoDevices.java +++ b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/mobileDevice/MobileDeviceManagementWithNoDevices.java @@ -70,4 +70,4 @@ public class MobileDeviceManagementWithNoDevices extends TestBase { return tokenString.contains(permissionsList); } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index 787f115b..4ee1ae97 100644 --- a/pom.xml +++ b/pom.xml @@ -1534,21 +1534,23 @@ 4.7.0 - 2.0.13 + + 2.0.20-SNAPSHOT [2.0.0, 3.0.0) 3.1.0-SNAPSHOT - 3.0.10 + + 3.0.12-SNAPSHOT - 6.1.35 + 6.1.72 (6.0.0,7.0.0] - 4.6.9 + 4.6.10 5.1.5 @@ -1681,7 +1683,7 @@ 1.0.2 - 1.0.3 + 1.0.4-SNAPSHOT 4.2.5 4.5.2