diff --git a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/pom.xml b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/pom.xml index 46c6482561..2d8a1dc40c 100644 --- a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/pom.xml +++ b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core grafana-mgt - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/src/main/java/io/entgra/device/mgt/core/analytics/mgt/grafana/proxy/api/GrafanaAPIProxyService.java b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/src/main/java/io/entgra/device/mgt/core/analytics/mgt/grafana/proxy/api/GrafanaAPIProxyService.java index afbf98d345..81f6f9bf4a 100644 --- a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/src/main/java/io/entgra/device/mgt/core/analytics/mgt/grafana/proxy/api/GrafanaAPIProxyService.java +++ b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/src/main/java/io/entgra/device/mgt/core/analytics/mgt/grafana/proxy/api/GrafanaAPIProxyService.java @@ -45,9 +45,9 @@ import javax.ws.rs.core.*; @Scope( name = "Using Grafana APIs required for Grafana iframes", description = "Grafana API proxy to validate requests.", - key = "perm:grafana:api:view", - roles = {"Internal/grafanamgt-user"}, - permissions = {"/analytics-mgt/grafana-mgt/api/view"} + key = "grafana:api:view", + roles = {"Internal/devicemgt-user"}, + permissions = {"/device-mgt/grafana/view"} ) } ) @@ -71,7 +71,7 @@ public interface GrafanaAPIProxyService { tags = "Analytics", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:grafana:api:view") + @ExtensionProperty(name = SCOPE, value = "grafana:api:view") }) } ) @@ -88,7 +88,7 @@ public interface GrafanaAPIProxyService { tags = "Analytics", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:grafana:api:view") + @ExtensionProperty(name = SCOPE, value = "grafana:api:view") }) } ) @@ -104,7 +104,7 @@ public interface GrafanaAPIProxyService { tags = "Analytics", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:grafana:api:view") + @ExtensionProperty(name = SCOPE, value = "grafana:api:view") }) } ) @@ -121,7 +121,7 @@ public interface GrafanaAPIProxyService { tags = "Analytics", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:grafana:api:view") + @ExtensionProperty(name = SCOPE, value = "grafana:api:view") }) } ) @@ -137,7 +137,7 @@ public interface GrafanaAPIProxyService { tags = "Analytics", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:grafana:api:view") + @ExtensionProperty(name = SCOPE, value = "grafana:api:view") }) } ) diff --git a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.common/pom.xml b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.common/pom.xml index 7b39827240..a759665e92 100644 --- a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.common/pom.xml +++ b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.common/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core grafana-mgt - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.core/pom.xml b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.core/pom.xml index cb89652674..ce25a77c31 100644 --- a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.core/pom.xml +++ b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.core/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core grafana-mgt - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/analytics-mgt/grafana-mgt/pom.xml b/components/analytics-mgt/grafana-mgt/pom.xml index 8d10307c7e..7bc9db7e86 100644 --- a/components/analytics-mgt/grafana-mgt/pom.xml +++ b/components/analytics-mgt/grafana-mgt/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core analytics-mgt - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/analytics-mgt/pom.xml b/components/analytics-mgt/pom.xml index 2bacce641b..bc9ce9529f 100644 --- a/components/analytics-mgt/pom.xml +++ b/components/analytics-mgt/pom.xml @@ -21,7 +21,7 @@ io.entgra.device.mgt.core.parent io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../../pom.xml diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml index b264448977..951f3813a2 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml @@ -20,7 +20,7 @@ apimgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT 4.0.0 diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.annotations/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.annotations/pom.xml index e8d23d4294..8fc927f575 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.annotations/pom.xml +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.annotations/pom.xml @@ -22,7 +22,7 @@ apimgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/pom.xml index 7d17b52f92..00bad68142 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/pom.xml +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/pom.xml @@ -21,7 +21,7 @@ apimgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension/pom.xml index f566b1e725..5dc47782f4 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension/pom.xml +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension/pom.xml @@ -22,7 +22,7 @@ apimgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/pom.xml index d8a899d9a0..0529a0a238 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/pom.xml +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/pom.xml @@ -22,7 +22,7 @@ apimgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/PublisherRESTAPIServices.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/PublisherRESTAPIServices.java index 49f76f0622..4a27cc2f69 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/PublisherRESTAPIServices.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/PublisherRESTAPIServices.java @@ -19,19 +19,17 @@ package io.entgra.device.mgt.core.apimgt.extension.rest.api; import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIApplicationKey; -import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo.APIInfo; +import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo.*; import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.AccessTokenInfo; import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.APIServicesException; import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.BadRequestException; import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.UnexpectedResponseException; -import org.json.JSONObject; -import org.wso2.carbon.apimgt.api.model.*; import java.util.List; public interface PublisherRESTAPIServices { - JSONObject getScopes(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo) + Scope[] getScopes(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo) throws APIServicesException, BadRequestException, UnexpectedResponseException; boolean isSharedScopeNameExists(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String key) @@ -43,13 +41,13 @@ public interface PublisherRESTAPIServices { boolean updateSharedScope(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, Scope scope) throws APIServicesException, BadRequestException, UnexpectedResponseException; - JSONObject getApi(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIIdentifier apiIdentifier) + APIInfo getApi(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String apiUuid) throws APIServicesException, BadRequestException, UnexpectedResponseException; - JSONObject getApis(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo) + APIInfo[] getApis(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo) throws APIServicesException, BadRequestException, UnexpectedResponseException; - JSONObject addAPI(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIInfo api) + APIInfo addAPI(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIInfo api) throws APIServicesException, BadRequestException, UnexpectedResponseException; boolean updateApi(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIInfo api) @@ -59,27 +57,27 @@ public interface PublisherRESTAPIServices { String asyncApiDefinition) throws APIServicesException, BadRequestException, UnexpectedResponseException; - JSONObject getAllApiSpecificMediationPolicies(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - APIIdentifier apiIdentifier) + MediationPolicy[] getAllApiSpecificMediationPolicies(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, + String apiUuid) throws APIServicesException, BadRequestException, UnexpectedResponseException; boolean addApiSpecificMediationPolicy(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid, Mediation mediation) throws APIServicesException, BadRequestException, UnexpectedResponseException; - boolean updateApiSpecificMediationPolicyContent(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - String uuid, Mediation mediation) + boolean deleteApiSpecificMediationPolicy(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, + String uuid, Mediation mediation) throws APIServicesException, BadRequestException, UnexpectedResponseException; boolean changeLifeCycleStatus(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid, String action) throws APIServicesException, BadRequestException, UnexpectedResponseException; - JSONObject getAPIRevisions(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid, - Boolean deploymentStatus) + APIRevision[] getAPIRevisions(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid, + Boolean deploymentStatus) throws APIServicesException, BadRequestException, UnexpectedResponseException; - JSONObject addAPIRevision(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, + APIRevision addAPIRevision(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIRevision apiRevision) throws APIServicesException, BadRequestException, UnexpectedResponseException; @@ -87,15 +85,15 @@ public interface PublisherRESTAPIServices { String apiRevisionId, List apiRevisionDeploymentList) throws APIServicesException, BadRequestException, UnexpectedResponseException; - abstract boolean undeployAPIRevisionDeployment(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - JSONObject apiRevisionDeployment, String uuid) + boolean undeployAPIRevisionDeployment(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, + APIRevision apiRevisionDeployment, String uuid) throws APIServicesException, BadRequestException, UnexpectedResponseException; boolean deleteAPIRevision(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - JSONObject apiRevision, String uuid) + APIRevision apiRevision, String uuid) throws APIServicesException, BadRequestException, UnexpectedResponseException; - JSONObject getDocumentations(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, + Documentation[] getDocumentations(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid) throws APIServicesException, BadRequestException, UnexpectedResponseException; @@ -108,6 +106,6 @@ public interface PublisherRESTAPIServices { throws APIServicesException, BadRequestException, UnexpectedResponseException; boolean addDocumentationContent(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - APIInfo api, String docId, String docContent) + String apiUuid, String docId, String docContent) throws APIServicesException, BadRequestException, UnexpectedResponseException; } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/PublisherRESTAPIServicesImpl.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/PublisherRESTAPIServicesImpl.java index bcc282e843..8ba8bb12f7 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/PublisherRESTAPIServicesImpl.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/PublisherRESTAPIServicesImpl.java @@ -21,21 +21,20 @@ package io.entgra.device.mgt.core.apimgt.extension.rest.api; import com.google.gson.Gson; import io.entgra.device.mgt.core.apimgt.extension.rest.api.constants.Constants; import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIApplicationKey; -import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo.APIInfo; +import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo.*; import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.AccessTokenInfo; import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.APIServicesException; import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.BadRequestException; import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.UnexpectedResponseException; import io.entgra.device.mgt.core.apimgt.extension.rest.api.util.HttpsTrustManagerUtils; -import io.entgra.device.mgt.core.apimgt.extension.rest.api.util.ScopeUtils; import okhttp3.*; +import okhttp3.Request.Builder; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.ssl.Base64; import org.json.JSONArray; import org.json.JSONObject; -import org.wso2.carbon.apimgt.api.model.*; import java.io.IOException; import java.util.List; @@ -51,7 +50,7 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { + Constants.COLON + port; @Override - public JSONObject getScopes(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo) + public Scope[] getScopes(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo) throws APIServicesException, BadRequestException, UnexpectedResponseException { String getAllScopesUrl = endPointPrefix + Constants.GET_ALL_SCOPES; @@ -65,8 +64,8 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { try { Response response = client.newCall(request).execute(); if (HttpStatus.SC_OK == response.code()) { - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject; + JSONArray scopeList = (JSONArray) new JSONObject(response.body().string()).get("list"); + return gson.fromJson(scopeList.toString(), Scope[].class); } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. @@ -119,7 +118,7 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { log.error(msg); throw new BadRequestException(msg); } else if (HttpStatus.SC_NOT_FOUND == response.code()) { - String msg = "Shared scope key not found"; + String msg = "Shared scope key not found : " + key; log.info(msg); return false; } else { @@ -139,14 +138,21 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { String addNewSharedScopeEndPoint = endPointPrefix + Constants.SCOPE_API_ENDPOINT; - ScopeUtils scopeUtil = new ScopeUtils(); - scopeUtil.setKey(scope.getKey()); - scopeUtil.setName(scope.getName()); - scopeUtil.setDescription(scope.getDescription()); - scopeUtil.setRoles(scope.getRoles()); - String scopeString = scopeUtil.toJSON(); + JSONArray bindings = new JSONArray(); + if (scope.getBindings() != null) { + for (String str : scope.getBindings()) { + bindings.put(str); + } + } - RequestBody requestBody = RequestBody.create(JSON, scopeString); + JSONObject payload = new JSONObject(); + payload.put("name", (scope.getName() != null ? scope.getName() : "")); + payload.put("displayName", (scope.getDisplayName() != null ? scope.getDisplayName() : "")); + payload.put("description", (scope.getDescription() != null ? scope.getDescription() : "")); + payload.put("bindings", (bindings != null ? bindings : "")); + payload.put("usageCount", (scope.getUsageCount() != 0 ? scope.getUsageCount() : 0)); + + RequestBody requestBody = RequestBody.create(JSON, payload.toString()); Request request = new Request.Builder() .url(addNewSharedScopeEndPoint) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -186,14 +192,21 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { String updateScopeUrl = endPointPrefix + Constants.SCOPE_API_ENDPOINT + scope.getId(); - ScopeUtils scopeUtil = new ScopeUtils(); - scopeUtil.setKey(scope.getKey()); - scopeUtil.setName(scope.getName()); - scopeUtil.setDescription(scope.getDescription()); - scopeUtil.setRoles(scope.getRoles()); - String scopeString = scopeUtil.toJSON(); + JSONArray bindings = new JSONArray(); + if (scope.getBindings() != null) { + for (String str : scope.getBindings()) { + bindings.put(str); + } + } - RequestBody requestBody = RequestBody.create(JSON, scopeString); + JSONObject payload = new JSONObject(); + payload.put("name", (scope.getName() != null ? scope.getName() : "")); + payload.put("displayName", (scope.getDisplayName() != null ? scope.getDisplayName() : "")); + payload.put("description", (scope.getDescription() != null ? scope.getDescription() : "")); + payload.put("bindings", (bindings != null ? bindings : "")); + payload.put("usageCount", (scope.getUsageCount() != 0 ? scope.getUsageCount() : 0)); + + RequestBody requestBody = RequestBody.create(JSON, payload.toString()); Request request = new Request.Builder() .url(updateScopeUrl) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -228,10 +241,10 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { } @Override - public JSONObject getApi(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIIdentifier apiIdentifier) + public APIInfo getApi(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String apiUuid) throws APIServicesException, BadRequestException, UnexpectedResponseException { - String getAllApi = endPointPrefix + Constants.API_ENDPOINT + apiIdentifier.getUUID(); + String getAllApi = endPointPrefix + Constants.API_ENDPOINT + apiUuid; Request request = new Request.Builder() .url(getAllApi) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -242,15 +255,14 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { try { Response response = client.newCall(request).execute(); if (HttpStatus.SC_OK == response.code()) { - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject; + return gson.fromJson(response.body().string(), APIInfo.class); } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. generateAccessTokenFromRefreshToken(accessTokenInfo.getRefresh_token(), apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); //TODO: max attempt count - return getApi(apiApplicationKey, refreshedAccessToken, apiIdentifier); + return getApi(apiApplicationKey, refreshedAccessToken, apiUuid); } else if (HttpStatus.SC_BAD_REQUEST == response.code()) { String msg = "Bad Request, Invalid request"; log.error(msg); @@ -267,7 +279,7 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { } @Override - public JSONObject getApis(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo) + public APIInfo[] getApis(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo) throws APIServicesException, BadRequestException, UnexpectedResponseException { String getAllApis = endPointPrefix + Constants.GET_ALL_APIS; @@ -281,8 +293,8 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { try { Response response = client.newCall(request).execute(); if (HttpStatus.SC_OK == response.code()) { - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject; + JSONArray apiList = (JSONArray) new JSONObject(response.body().string()).get("list"); + return gson.fromJson(apiList.toString(), APIInfo[].class); } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. @@ -306,58 +318,111 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { } @Override - public JSONObject addAPI(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIInfo api) + public APIInfo addAPI(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIInfo api) throws APIServicesException, BadRequestException, UnexpectedResponseException { String addAPIEndPoint = endPointPrefix + Constants.API_ENDPOINT; - String apiString = "{\n" + - " \"name\": \"" + api.getName() + "\",\n" + - " \"description\":\"" + api.getDescription() + "\",\n" + - " \"context\":\"" + api.getContext() + "\",\n" + - " \"version\":\"" + api.getVersion() + "\",\n" + - " \"provider\":\"" + api.getProvider() + "\",\n" + - " \"lifeCycleStatus\":\"" + api.getLifeCycleStatus() + "\",\n" + - " \"wsdlInfo\": " + api.getWsdlInfo() + ",\n" + - " \"wsdlUrl\":" + api.getWsdlUrl() + ",\n" + - " \"responseCachingEnabled\": " + api.isResponseCachingEnabled() + ",\n" + - " \"cacheTimeout\": " + api.getCacheTimeout() + ",\n" + - " \"hasThumbnail\": " + api.isHasThumbnail() + ",\n" + - " \"isDefaultVersion\": " + api.isDefaultVersion() + ",\n" + - " \"isRevision\": " + api.isRevision() + ",\n" + - " \"revisionedApiId\": " + api.getRevisionedApiId() + ",\n" + - " \"revisionId\": " + api.getRevisionId() + ",\n" + - " \"enableSchemaValidation\": " + api.isEnableSchemaValidation() + ",\n" + - " \"type\": \"" + api.getType() + "\",\n" + - " \"transport\": " + gson.toJson(api.getTransport()) + ",\n" + - " \"tags\": " + gson.toJson(api.getTags()) + ",\n" + - " \"policies\": " + gson.toJson(api.getPolicies()) + ",\n" + - " \"apiThrottlingPolicy\": " + api.getApiThrottlingPolicy() + ",\n" + - " \"authorizationHeader\": \"" + api.getAuthorizationHeader() + "\",\n" + - " \"visibility\": \"" + api.getVisibility() + "\",\n" + - " \"subscriptionAvailability\": \"" + api.getSubscriptionAvailability() + "\",\n" + - " \"subscriptionAvailableTenants\": [],\n" + - " \"additionalProperties\": [],\n" + - " \"monetization\": " + api.getMonetization() + ",\n" + - " \"corsConfiguration\": " + gson.toJson(api.getCorsConfiguration()) + ",\n" + - " \"websubSubscriptionConfiguration\": {\n" + - " \"enable\": false,\n" + - " \"secret\": \"\",\n" + - " \"signingAlgorithm\": \"SHA1\",\n" + - " \"signatureHeader\": \"x-hub-signature\"\n" + - " },\n" + - " \"workflowStatus\": null,\n" + - " \"endpointConfig\": " + api.getEndpointConfig().toString() + ",\n" + - " \"endpointImplementationType\": \"ENDPOINT\",\n" + - " \"scopes\": " + api.getScopes().toString() + ",\n" + - " \"operations\": " + api.getOperations().toString() + ",\n" + - " \"threatProtectionPolicies\": null,\n" + - " \"categories\": [],\n" + - " \"keyManagers\": " + gson.toJson(api.getKeyManagers()) + ",\n" + - " \"serviceInfo\": " + api.getServiceInfo() + "\n" + - "}"; + JSONObject payload = new JSONObject(); + payload.put("name", api.getName()); + payload.put("description", api.getDescription()); + payload.put("context", api.getContext()); + payload.put("version", api.getVersion()); + payload.put("provider", api.getProvider()); + payload.put("lifeCycleStatus", api.getLifeCycleStatus()); + payload.put("wsdlInfo", (api.getWsdlInfo() != null ? api.getWsdlInfo() : null)); + payload.put("wsdlUrl", (api.getWsdlUrl() != null ? api.getWsdlUrl() : null)); + payload.put("responseCachingEnabled", api.isResponseCachingEnabled()); + payload.put("cacheTimeout", api.getCacheTimeout()); + payload.put("hasThumbnail", api.isHasThumbnail()); + payload.put("isDefaultVersion", api.isDefaultVersion()); + payload.put("isRevision", api.isRevision()); + payload.put("revisionedApiId", (api.getRevisionedApiId() != null ? api.getRevisionedApiId() : null)); + payload.put("revisionId", api.getRevisionId()); + payload.put("enableSchemaValidation", api.isEnableSchemaValidation()); + payload.put("type", api.getType()); + payload.put("apiThrottlingPolicy", api.getApiThrottlingPolicy()); + payload.put("authorizationHeader", api.getAuthorizationHeader()); + payload.put("visibility", api.getVisibility()); + payload.put("subscriptionAvailability", (api.getSubscriptionAvailability() != null ? api.getSubscriptionAvailability() : "")); - RequestBody requestBody = RequestBody.create(JSON, apiString); + //Lists + if (api.getTransport() != null) { + JSONArray transport = new JSONArray(); + for (String str : api.getTransport()) { + transport.put(str); + } + payload.put("transport", transport); + } + if (api.getTags() != null) { + JSONArray tags = new JSONArray(); + for (String str : api.getTags()) { + tags.put(str); + } + payload.put("tags", tags); + } + if (api.getPolicies() != null) { + JSONArray policies = new JSONArray(); + for (String str : api.getPolicies()) { + policies.put(str); + } + payload.put("policies", policies); + } + if (api.getMediationPolicies() != null) { + JSONArray mediationPolicies = new JSONArray(); + for (MediationPolicy object : api.getMediationPolicies()) { + mediationPolicies.put(new JSONObject(gson.toJson(object))); + } + payload.put("mediationPolicies", mediationPolicies); + } + if (api.getSubscriptionAvailableTenants() != null) { + JSONArray subscriptionAvailableTenants = new JSONArray(); + for (String str : api.getSubscriptionAvailableTenants()) { + subscriptionAvailableTenants.put(str); + } + payload.put("subscriptionAvailableTenants", subscriptionAvailableTenants); + } + if (api.getAdditionalProperties() != null) { + JSONArray additionalProperties = new JSONArray(); + for (AdditionalProperties str : api.getAdditionalProperties()) { + additionalProperties.put(str); + } + payload.put("additionalProperties", additionalProperties); + } + if (api.getScopes() != null) { + JSONArray scopes = new JSONArray(); + for (JSONObject object : api.getScopes()) { + scopes.put(object); + } + payload.put("scopes", scopes); + } + if (api.getOperations() != null) { + JSONArray operations = new JSONArray(); + for (Operations operation : api.getOperations()) { + operations.put(new JSONObject(gson.toJson(operation))); + } + payload.put("operations", operations); + } + if (api.getCategories() != null) { + JSONArray categories = new JSONArray(); + for (String str : api.getCategories()) { + categories.put(str); + } + payload.put("categories", categories); + } + + //objects + payload.put("monetization", (api.getMonetization() != null ? new JSONObject(gson.toJson(api.getMonetization())) : null)); + payload.put("corsConfiguration", (api.getCorsConfiguration() != null ? new JSONObject(gson.toJson(api.getCorsConfiguration())) : null)); + payload.put("websubSubscriptionConfiguration", (api.getWebsubSubscriptionConfiguration() != null ? new JSONObject(gson.toJson(api.getWebsubSubscriptionConfiguration())) : null)); + payload.put("workflowStatus", (api.getWorkflowStatus() != null ? api.getWorkflowStatus() : null)); + payload.put("endpointConfig", (api.getEndpointConfig() != null ? api.getEndpointConfig() : null)); + payload.put("endpointImplementationType", (api.getEndpointImplementationType() != null ? api.getEndpointImplementationType() : null)); + payload.put("threatProtectionPolicies", (api.getThreatProtectionPolicies() != null ? api.getThreatProtectionPolicies() : null)); + payload.put("serviceInfo", (api.getServiceInfo() != null ? new JSONObject(gson.toJson(api.getServiceInfo())) : null)); + payload.put("advertiseInfo", (api.getAdvertiseInfo() != null ? new JSONObject(gson.toJson(api.getAdvertiseInfo())) : null)); + + RequestBody requestBody = RequestBody.create(JSON, payload.toString()); Request request = new Request.Builder() .url(addAPIEndPoint) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -368,8 +433,7 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { try { Response response = client.newCall(request).execute(); if (HttpStatus.SC_CREATED == response.code()) { - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject; + return gson.fromJson(response.body().string(), APIInfo.class); } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. @@ -398,53 +462,106 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { String updateAPIEndPoint = endPointPrefix + Constants.API_ENDPOINT + api.getId(); - String apiString = "{\n" + - " \"name\": \"" + api.getName() + "\",\n" + - " \"description\":\"" + api.getDescription() + "\",\n" + - " \"context\":\"" + api.getContext() + "\",\n" + - " \"version\":\"" + api.getVersion() + "\",\n" + - " \"provider\":\"" + api.getProvider() + "\",\n" + - " \"lifeCycleStatus\":\"" + api.getLifeCycleStatus() + "\",\n" + - " \"wsdlInfo\": " + api.getWsdlInfo() + ",\n" + - " \"wsdlUrl\":" + api.getWsdlUrl() + ",\n" + - " \"responseCachingEnabled\": " + api.isResponseCachingEnabled() + ",\n" + - " \"cacheTimeout\": " + api.getCacheTimeout() + ",\n" + - " \"hasThumbnail\": " + api.isHasThumbnail() + ",\n" + - " \"isDefaultVersion\": " + api.isDefaultVersion() + ",\n" + - " \"isRevision\": " + api.isRevision() + ",\n" + - " \"revisionedApiId\": " + api.getRevisionedApiId() + ",\n" + - " \"revisionId\": " + api.getRevisionId() + ",\n" + - " \"enableSchemaValidation\": " + api.isEnableSchemaValidation() + ",\n" + - " \"type\": \"" + api.getType() + "\",\n" + - " \"transport\": " + gson.toJson(api.getTransport()) + ",\n" + - " \"tags\": " + gson.toJson(api.getTags()) + ",\n" + - " \"policies\": " + gson.toJson(api.getPolicies()) + ",\n" + - " \"apiThrottlingPolicy\": " + api.getApiThrottlingPolicy() + ",\n" + - " \"authorizationHeader\": \"" + api.getAuthorizationHeader() + "\",\n" + - " \"visibility\": \"" + api.getVisibility() + "\",\n" + - " \"subscriptionAvailability\": \"" + api.getSubscriptionAvailability() + "\",\n" + - " \"subscriptionAvailableTenants\": [],\n" + - " \"additionalProperties\": [],\n" + - " \"monetization\": " + api.getMonetization() + ",\n" + - " \"corsConfiguration\": " + gson.toJson(api.getCorsConfiguration()) + ",\n" + - " \"websubSubscriptionConfiguration\": {\n" + - " \"enable\": false,\n" + - " \"secret\": \"\",\n" + - " \"signingAlgorithm\": \"SHA1\",\n" + - " \"signatureHeader\": \"x-hub-signature\"\n" + - " },\n" + - " \"workflowStatus\": null,\n" + - " \"endpointConfig\": " + api.getEndpointConfig().toString() + ",\n" + - " \"endpointImplementationType\": \"ENDPOINT\",\n" + - " \"scopes\": " + api.getScopes().toString() + ",\n" + - " \"operations\": " + api.getOperations().toString() + ",\n" + - " \"threatProtectionPolicies\": null,\n" + - " \"categories\": [],\n" + - " \"keyManagers\": " + gson.toJson(api.getKeyManagers()) + ",\n" + - " \"serviceInfo\": " + api.getServiceInfo() + "\n" + - "}"; + JSONObject payload = new JSONObject(); + payload.put("name", api.getName()); + payload.put("description", api.getDescription()); + payload.put("context", api.getContext()); + payload.put("version", api.getVersion()); + payload.put("provider", api.getProvider()); + payload.put("lifeCycleStatus", api.getLifeCycleStatus()); + payload.put("wsdlInfo", (api.getWsdlInfo() != null ? api.getWsdlInfo() : null)); + payload.put("wsdlUrl", (api.getWsdlUrl() != null ? api.getWsdlUrl() : null)); + payload.put("responseCachingEnabled", api.isResponseCachingEnabled()); + payload.put("cacheTimeout", api.getCacheTimeout()); + payload.put("hasThumbnail", api.isHasThumbnail()); + payload.put("isDefaultVersion", api.isDefaultVersion()); + payload.put("isRevision", api.isRevision()); + payload.put("revisionedApiId", (api.getRevisionedApiId() != null ? api.getRevisionedApiId() : null)); + payload.put("revisionId", api.getRevisionId()); + payload.put("enableSchemaValidation", api.isEnableSchemaValidation()); + payload.put("type", api.getType()); + payload.put("apiThrottlingPolicy", api.getApiThrottlingPolicy()); + payload.put("authorizationHeader", api.getAuthorizationHeader()); + payload.put("visibility", api.getVisibility()); + payload.put("subscriptionAvailability", (api.getSubscriptionAvailability() != null ? api.getSubscriptionAvailability() : "")); - RequestBody requestBody = RequestBody.create(JSON, apiString); + //Lists + if (api.getTransport() != null) { + JSONArray transport = new JSONArray(); + for (String str : api.getTransport()) { + transport.put(str); + } + payload.put("transport", transport); + } + if (api.getTags() != null) { + JSONArray tags = new JSONArray(); + for (String str : api.getTags()) { + tags.put(str); + } + payload.put("tags", tags); + } + if (api.getPolicies() != null) { + JSONArray policies = new JSONArray(); + for (String str : api.getPolicies()) { + policies.put(str); + } + payload.put("policies", policies); + } + if (api.getMediationPolicies() != null) { + JSONArray mediationPolicies = new JSONArray(); + for (MediationPolicy object : api.getMediationPolicies()) { + mediationPolicies.put(new JSONObject(gson.toJson(object))); + } + payload.put("mediationPolicies", mediationPolicies); + } + if (api.getSubscriptionAvailableTenants() != null) { + JSONArray subscriptionAvailableTenants = new JSONArray(); + for (String str : api.getSubscriptionAvailableTenants()) { + subscriptionAvailableTenants.put(str); + } + payload.put("subscriptionAvailableTenants", subscriptionAvailableTenants); + } + if (api.getAdditionalProperties() != null) { + JSONArray additionalProperties = new JSONArray(); + for (AdditionalProperties str : api.getAdditionalProperties()) { + additionalProperties.put(str); + } + payload.put("additionalProperties", additionalProperties); + } + if (api.getScopes() != null) { + JSONArray scopes = new JSONArray(); + for (JSONObject object : api.getScopes()) { + scopes.put(object); + } + payload.put("scopes", scopes); + } + if (api.getOperations() != null) { + JSONArray operations = new JSONArray(); + for (Operations operation : api.getOperations()) { + operations.put(new JSONObject(gson.toJson(operation))); + } + payload.put("operations", operations); + } + if (api.getCategories() != null) { + JSONArray categories = new JSONArray(); + for (String str : api.getCategories()) { + categories.put(str); + } + payload.put("categories", categories); + } + + //objects + payload.put("monetization", (api.getMonetization() != null ? new JSONObject(gson.toJson(api.getMonetization())) : null)); + payload.put("corsConfiguration", (api.getCorsConfiguration() != null ? new JSONObject(gson.toJson(api.getCorsConfiguration())) : null)); + payload.put("websubSubscriptionConfiguration", (api.getWebsubSubscriptionConfiguration() != null ? new JSONObject(gson.toJson(api.getWebsubSubscriptionConfiguration())) : null)); + payload.put("workflowStatus", (api.getWorkflowStatus() != null ? api.getWorkflowStatus() : null)); + payload.put("endpointConfig", (api.getEndpointConfig() != null ? api.getEndpointConfig() : null)); + payload.put("endpointImplementationType", (api.getEndpointImplementationType() != null ? api.getEndpointImplementationType() : null)); + payload.put("threatProtectionPolicies", (api.getThreatProtectionPolicies() != null ? api.getThreatProtectionPolicies() : null)); + payload.put("serviceInfo", (api.getServiceInfo() != null ? new JSONObject(gson.toJson(api.getServiceInfo())) : null)); + payload.put("advertiseInfo", (api.getAdvertiseInfo() != null ? new JSONObject(gson.toJson(api.getAdvertiseInfo())) : null)); + + RequestBody requestBody = RequestBody.create(JSON, payload.toString()); Request request = new Request.Builder() .url(updateAPIEndPoint) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -456,7 +573,6 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { Response response = client.newCall(request).execute(); if (HttpStatus.SC_OK == response.code()) { return true; - } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. @@ -484,11 +600,16 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { String uuid, String asyncApiDefinition) throws APIServicesException, BadRequestException, UnexpectedResponseException { - String addNewScope = endPointPrefix + Constants.API_ENDPOINT + uuid; + String saveAsyncAPI = endPointPrefix + Constants.API_ENDPOINT + uuid + "/asyncapi"; + + RequestBody requestBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("apiDefinition", asyncApiDefinition) + .build(); - RequestBody requestBody = RequestBody.create(JSON, asyncApiDefinition); Request request = new Request.Builder() - .url(addNewScope) + .url(saveAsyncAPI) + .addHeader(Constants.HEADER_CONTENT_TYPE, "multipart/form-data") .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER + accessTokenInfo.getAccess_token()) .put(requestBody) @@ -522,11 +643,11 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { } @Override - public JSONObject getAllApiSpecificMediationPolicies(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - APIIdentifier apiIdentifier) + public MediationPolicy[] getAllApiSpecificMediationPolicies(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, + String apiUuid) throws APIServicesException, BadRequestException, UnexpectedResponseException { - String getAPIMediationEndPoint = endPointPrefix + Constants.API_ENDPOINT + apiIdentifier.getUUID() + "/mediation-policies"; + String getAPIMediationEndPoint = endPointPrefix + Constants.API_ENDPOINT + apiUuid + "/mediation-policies"; Request request = new Request.Builder() .url(getAPIMediationEndPoint) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -537,15 +658,15 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { try { Response response = client.newCall(request).execute(); if (HttpStatus.SC_OK == response.code()) { - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject; + JSONArray mediationPolicyList = (JSONArray) new JSONObject(response.body().string()).get("list"); + return gson.fromJson(mediationPolicyList.toString(), MediationPolicy[].class); } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. generateAccessTokenFromRefreshToken(accessTokenInfo.getRefresh_token(), apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); //TODO: max attempt count - return getAllApiSpecificMediationPolicies(apiApplicationKey, refreshedAccessToken, apiIdentifier); + return getAllApiSpecificMediationPolicies(apiApplicationKey, refreshedAccessToken, apiUuid); } else if (HttpStatus.SC_BAD_REQUEST == response.code()) { String msg = "Bad Request, Invalid request"; log.error(msg); @@ -566,12 +687,17 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { String uuid, Mediation mediation) throws APIServicesException, BadRequestException, UnexpectedResponseException { - String addAPIMediation = endPointPrefix + Constants.API_ENDPOINT + uuid + "/mediation-policies/" + mediation.getUuid() - + "/content"; + String addAPIMediation = endPointPrefix + Constants.API_ENDPOINT + uuid + "/mediation-policies"; - RequestBody requestBody = RequestBody.create(JSON, String.valueOf(mediation)); - Request request = new Request.Builder() + RequestBody requestBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("inlineContent", mediation.getConfig()) + .addFormDataPart("type", mediation.getType()) + .build(); + + Request request = new Builder() .url(addAPIMediation) + .addHeader(Constants.HEADER_CONTENT_TYPE, "multipart/form-data") .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER + accessTokenInfo.getAccess_token()) .post(requestBody) @@ -604,26 +730,23 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { } - @Override - public boolean updateApiSpecificMediationPolicyContent(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - String uuid, Mediation mediation) + public boolean deleteApiSpecificMediationPolicy(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, + String uuid, Mediation mediation) throws APIServicesException, BadRequestException, UnexpectedResponseException { - String updateApiMediationEndPOint = endPointPrefix + Constants.API_ENDPOINT + uuid + "/mediation-policies/" + mediation.getUuid() - + "/content"; + String deleteApiMediationEndPOint = endPointPrefix + Constants.API_ENDPOINT + uuid + "/mediation-policies/" + mediation.getUuid(); - RequestBody requestBody = RequestBody.create(JSON, String.valueOf(mediation)); Request request = new Request.Builder() - .url(updateApiMediationEndPOint) + .url(deleteApiMediationEndPOint) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER + accessTokenInfo.getAccess_token()) - .put(requestBody) + .delete() .build(); try { Response response = client.newCall(request).execute(); - if (HttpStatus.SC_CREATED == response.code()) { // Check response status + if (HttpStatus.SC_NO_CONTENT == response.code()) { // Check response status return true; } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); @@ -631,7 +754,7 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { generateAccessTokenFromRefreshToken(accessTokenInfo.getRefresh_token(), apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); //TODO: max attempt count - return updateApiSpecificMediationPolicyContent(apiApplicationKey, refreshedAccessToken, uuid, mediation); + return deleteApiSpecificMediationPolicy(apiApplicationKey, refreshedAccessToken, uuid, mediation); } else if (HttpStatus.SC_BAD_REQUEST == response.code()) { String msg = "Bad Request, Invalid mediation policy"; log.error(msg); @@ -691,8 +814,8 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { } @Override - public JSONObject getAPIRevisions(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid, - Boolean deploymentStatus) + public APIRevision[] getAPIRevisions(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid, + Boolean deploymentStatus) throws APIServicesException, BadRequestException, UnexpectedResponseException { String getAPIRevisionsEndPoint = endPointPrefix + Constants.API_ENDPOINT + uuid + "/revisions?query=deployed:" @@ -708,8 +831,8 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { try { Response response = client.newCall(request).execute(); if (HttpStatus.SC_OK == response.code()) { - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject; + JSONArray revisionList = (JSONArray) new JSONObject(response.body().string()).get("list"); + return gson.fromJson(revisionList.toString(), APIRevision[].class); } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. @@ -733,16 +856,15 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { } @Override - public JSONObject addAPIRevision(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIRevision apiRevision) + public APIRevision addAPIRevision(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, APIRevision apiRevision) throws APIServicesException, BadRequestException, UnexpectedResponseException { String addNewScope = endPointPrefix + Constants.API_ENDPOINT + apiRevision.getApiUUID() + "/revisions"; - String apiRevisionDescription = "{\n" + - " \"description\":\"" + apiRevision.getDescription() + "\"\n" + - "}"; + JSONObject payload = new JSONObject(); + payload.put("description", (apiRevision.getDescription() != null ? apiRevision.getDescription() : null)); - RequestBody requestBody = RequestBody.create(JSON, apiRevisionDescription); + RequestBody requestBody = RequestBody.create(JSON, payload.toString()); Request request = new Request.Builder() .url(addNewScope) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -753,8 +875,7 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { try { Response response = client.newCall(request).execute(); if (HttpStatus.SC_CREATED == response.code()) { - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject; + return gson.fromJson(response.body().string(), APIRevision.class); } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. @@ -785,15 +906,14 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { String deployAPIRevisionEndPoint = endPointPrefix + Constants.API_ENDPOINT + uuid + "/deploy-revision?revisionId=" + apiRevisionId; APIRevisionDeployment apiRevisionDeployment = apiRevisionDeploymentList.get(0); - String revision = "[\n" + - " {\n" + - " \"name\": \"" + apiRevisionDeployment.getDeployment() + "\",\n" + - " \"vhost\": \"" + apiRevisionDeployment.getVhost() + "\",\n" + - " \"displayOnDevportal\": " + apiRevisionDeployment.isDisplayOnDevportal() + "\n" + - " }\n" + - "]"; + JSONArray payload = new JSONArray(); + JSONObject revision = new JSONObject(); + revision.put("name", (apiRevisionDeployment.getName() != null ? apiRevisionDeployment.getName() : "")); + revision.put("vhost", (apiRevisionDeployment.getVhost() != null ? apiRevisionDeployment.getVhost() : "")); + revision.put("displayOnDevportal", apiRevisionDeployment.isDisplayOnDevportal()); + payload.put(revision); - RequestBody requestBody = RequestBody.create(JSON, revision); + RequestBody requestBody = RequestBody.create(JSON, payload.toString()); Request request = new Request.Builder() .url(deployAPIRevisionEndPoint) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -830,23 +950,22 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { @Override public boolean undeployAPIRevisionDeployment(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - JSONObject apiRevisionDeployment, String uuid) + APIRevision apiRevisionDeployment, String uuid) throws APIServicesException, BadRequestException, UnexpectedResponseException { String undeployAPIRevisionEndPoint = endPointPrefix + Constants.API_ENDPOINT + uuid + "/undeploy-revision?revisionId=" - + apiRevisionDeployment.getString("id"); - JSONArray array = apiRevisionDeployment.getJSONArray("deploymentInfo"); - JSONObject obj = array.getJSONObject(0); + + apiRevisionDeployment.getId(); + List apiRevisionDeployments = apiRevisionDeployment.getDeploymentInfo(); + APIRevisionDeployment earliestDeployment = apiRevisionDeployments.get(0); - String revision = "[\n" + - " {\n" + - " \"name\": \"" + obj.getString("name") + "\",\n" + - " \"vhost\": \"" + obj.getString("vhost") + "\",\n" + - " \"displayOnDevportal\": " + obj.get("displayOnDevportal") + "\n" + - " }\n" + - "]"; + JSONArray payload = new JSONArray(); + JSONObject revision = new JSONObject(); + revision.put("name", (earliestDeployment.getName() != null ? earliestDeployment.getName() : "")); + revision.put("vhost", (earliestDeployment.getVhost() != null ? earliestDeployment.getVhost() : "")); + revision.put("displayOnDevportal", earliestDeployment.isDisplayOnDevportal()); + payload.put(revision); - RequestBody requestBody = RequestBody.create(JSON, revision); + RequestBody requestBody = RequestBody.create(JSON, payload.toString()); Request request = new Request.Builder() .url(undeployAPIRevisionEndPoint) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER @@ -882,11 +1001,11 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { @Override public boolean deleteAPIRevision(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - JSONObject apiRevision, String uuid) + APIRevision apiRevision, String uuid) throws APIServicesException, BadRequestException, UnexpectedResponseException { String apiRevisionEndPoint = endPointPrefix + Constants.API_ENDPOINT + uuid + "/revisions/" + - apiRevision.getString("id"); + apiRevision.getId(); Request request = new Request.Builder() .url(apiRevisionEndPoint) @@ -922,7 +1041,7 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { } @Override - public JSONObject getDocumentations(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid) + public Documentation[] getDocumentations(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String uuid) throws APIServicesException, BadRequestException, UnexpectedResponseException { String getDocumentationsEndPoint = endPointPrefix + Constants.API_ENDPOINT + uuid + "/documents?limit=1000"; @@ -937,8 +1056,8 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { try { Response response = client.newCall(request).execute(); if (HttpStatus.SC_OK == response.code()) { - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject; + JSONArray documentList = (JSONArray) new JSONObject(response.body().string()).get("list"); + return gson.fromJson(documentList.toString(), Documentation[].class); } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. @@ -1008,19 +1127,19 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { String addNewScope = endPointPrefix + Constants.API_ENDPOINT + uuid + "/documents"; - String document = "{\n" + - " \"name\": \" " + documentation.getName() + " \",\n" + - " \"type\": \" " + documentation.getType() + " \",\n" + - " \"summary\": \" " + documentation.getSummary() + " \",\n" + - " \"sourceType\": \" " + documentation.getSourceType() + " \",\n" + - " \"inlineContent\": \" " + documentation.getSourceType() + " \",\n" + - " \"visibility\": \" " + documentation.getVisibility() + " \",\n" + - " \"createdBy\": \" admin \"\n" + - "}"; + JSONObject payload = new JSONObject(); + payload.put("name", documentation.getName()); + payload.put("type", documentation.getType()); + payload.put("summary", documentation.getSummary()); + payload.put("sourceType", documentation.getSourceType()); + payload.put("inlineContent", documentation.getSourceType()); + payload.put("visibility", documentation.getVisibility()); + payload.put("createdBy", documentation.getCreatedBy()); - RequestBody requestBody = RequestBody.create(JSON, document); + RequestBody requestBody = RequestBody.create(JSON, payload.toString()); Request request = new Request.Builder() .url(addNewScope) + .addHeader(Constants.HEADER_CONTENT_TYPE, Constants.APPLICATION_JSON) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER + accessTokenInfo.getAccess_token()) .post(requestBody) @@ -1054,14 +1173,19 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { @Override public boolean addDocumentationContent(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, - APIInfo api, String docId, String docContent) + String apiUuid, String docId, String docContent) throws APIServicesException, BadRequestException, UnexpectedResponseException { - String addDocumentationContentEndPoint = endPointPrefix + Constants.API_ENDPOINT + api.getId() + "/documents/" + docId; + String addDocumentationContentEndPoint = endPointPrefix + Constants.API_ENDPOINT + apiUuid + "/documents/" + docId + "/content"; + + RequestBody requestBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("inlineContent", docContent) + .build(); - RequestBody requestBody = RequestBody.create(JSON, docContent); Request request = new Request.Builder() .url(addDocumentationContentEndPoint) + .addHeader(Constants.HEADER_CONTENT_TYPE, "multipart/form-data") .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER + accessTokenInfo.getAccess_token()) .post(requestBody) @@ -1077,7 +1201,7 @@ public class PublisherRESTAPIServicesImpl implements PublisherRESTAPIServices { generateAccessTokenFromRefreshToken(accessTokenInfo.getRefresh_token(), apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); //TODO: max attempt count - return addDocumentationContent(apiApplicationKey, refreshedAccessToken, api, docId, docContent); + return addDocumentationContent(apiApplicationKey, refreshedAccessToken, apiUuid, docId, docContent); } else if (HttpStatus.SC_BAD_REQUEST == response.code()) { String msg = "Bad Request, Invalid documentation request body"; log.error(msg); diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/bean/APIMConsumer/APIInfo.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/bean/APIMConsumer/APIInfo.java index 3dc4b6c570..0435fc64ec 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/bean/APIMConsumer/APIInfo.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/bean/APIMConsumer/APIInfo.java @@ -18,7 +18,6 @@ package io.entgra.device.mgt.core.apimgt.extension.rest.api.bean.APIMConsumer; -import io.entgra.device.mgt.core.apimgt.extension.rest.api.util.ScopeUtils; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIInfo.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIInfo.java index a6f76116d9..a48a10c9e3 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIInfo.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIInfo.java @@ -1,12 +1,12 @@ /* - * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. * * Entgra (Pvt) Ltd. 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 + * 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 @@ -19,13 +19,8 @@ package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; import org.json.JSONObject; -import org.wso2.carbon.apimgt.api.model.APICategory; -import org.wso2.carbon.apimgt.api.model.CORSConfiguration; -import org.wso2.carbon.apimgt.api.model.WebsubSubscriptionConfiguration; -import java.util.ArrayList; import java.util.List; -import java.util.Set; /** * This class represents the API response. @@ -40,65 +35,75 @@ public class APIInfo { private String version; private String provider; private String lifeCycleStatus; - private String wsdlInfo; + private type wsdlInfo; private String wsdlUrl; private boolean responseCachingEnabled; private int cacheTimeout; private boolean hasThumbnail; private boolean isDefaultVersion; private boolean isRevision; - private String revisionedApiId; + private String revisionedApiId; private int revisionId; private boolean enableSchemaValidation; + private boolean enableStore; private String type; - private Set transport; - private Set tags; - private Set policies; + private List transport; + private List tags; + private List policies; private String apiThrottlingPolicy; private String authorizationHeader; - private String securityScheme; - private String maxTps; + private List securityScheme; + private APIMaxTps maxTps; private String visibility; - private String visibleRoles; - private String visibleTenants; - private String mediationPolicies; + private List visibleRoles; + private List visibleTenants; + private List mediationPolicies; private String subscriptionAvailability; - private String subscriptionAvailableTenants; - private String additionalProperties; - private String monetization; + private List subscriptionAvailableTenants; + private List additionalProperties; + private Monetization monetization; private String accessControl; - private String accessControlRoles; + private List accessControlRoles; private BusinessInformation businessInformation; private CORSConfiguration corsConfiguration; private WebsubSubscriptionConfiguration websubSubscriptionConfiguration; private String workflowStatus; private String createdTime; private String lastUpdatedTime; - private JSONObject endpointConfig = new JSONObject(); + private JSONObject endpointConfig; private String endpointImplementationType; - private List scopes = new ArrayList(); - private List operations; - private String threatProtectionPolicies; - private List apiCategories; - private List keyManagers = new ArrayList(); - private JSONObject serviceInfo = new JSONObject(); + private List scopes; + private List operations; + private JSONObject threatProtectionPolicies; + private List categories; + private List keyManagers; + private ServiceInfo serviceInfo; private AdvertiseInfo advertiseInfo; + public enum type { + WSDL, ZIP + } + public String getId() { return id; } + public void setId(String id) { this.id = id; } + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } @@ -110,12 +115,15 @@ public class APIInfo { public void setContext(String context) { this.context = context; } + public String getVersion() { return version; } + public void setVersion(String version) { this.version = version; } + public String getProvider() { return provider; } @@ -132,11 +140,11 @@ public class APIInfo { this.lifeCycleStatus = lifeCycleStatus; } - public String getWsdlInfo() { + public APIInfo.type getWsdlInfo() { return wsdlInfo; } - public void setWsdlInfo(String wsdlInfo) { + public void setWsdlInfo(APIInfo.type wsdlInfo) { this.wsdlInfo = wsdlInfo; } @@ -212,6 +220,14 @@ public class APIInfo { this.enableSchemaValidation = enableSchemaValidation; } + public boolean isEnableStore() { + return enableStore; + } + + public void setEnableStore(boolean enableStore) { + this.enableStore = enableStore; + } + public String getType() { return type; } @@ -220,27 +236,27 @@ public class APIInfo { this.type = type; } - public Set getTransport() { + public List getTransport() { return transport; } - public void setTransport(Set transport) { + public void setTransport(List transport) { this.transport = transport; } - public Set getTags() { + public List getTags() { return tags; } - public void setTags(Set tags) { + public void setTags(List tags) { this.tags = tags; } - public Set getPolicies() { + public List getPolicies() { return policies; } - public void setPolicies(Set policies) { + public void setPolicies(List policies) { this.policies = policies; } @@ -260,19 +276,19 @@ public class APIInfo { this.authorizationHeader = authorizationHeader; } - public String getSecurityScheme() { + public List getSecurityScheme() { return securityScheme; } - public void setSecurityScheme(String securityScheme) { + public void setSecurityScheme(List securityScheme) { this.securityScheme = securityScheme; } - public String getMaxTps() { + public APIMaxTps getMaxTps() { return maxTps; } - public void setMaxTps(String maxTps) { + public void setMaxTps(APIMaxTps maxTps) { this.maxTps = maxTps; } @@ -284,27 +300,27 @@ public class APIInfo { this.visibility = visibility; } - public String getVisibleRoles() { + public List getVisibleRoles() { return visibleRoles; } - public void setVisibleRoles(String visibleRoles) { + public void setVisibleRoles(List visibleRoles) { this.visibleRoles = visibleRoles; } - public String getVisibleTenants() { + public List getVisibleTenants() { return visibleTenants; } - public void setVisibleTenants(String visibleTenants) { + public void setVisibleTenants(List visibleTenants) { this.visibleTenants = visibleTenants; } - public String getMediationPolicies() { + public List getMediationPolicies() { return mediationPolicies; } - public void setMediationPolicies(String mediationPolicies) { + public void setMediationPolicies(List mediationPolicies) { this.mediationPolicies = mediationPolicies; } @@ -316,27 +332,27 @@ public class APIInfo { this.subscriptionAvailability = subscriptionAvailability; } - public String getSubscriptionAvailableTenants() { + public List getSubscriptionAvailableTenants() { return subscriptionAvailableTenants; } - public void setSubscriptionAvailableTenants(String subscriptionAvailableTenants) { + public void setSubscriptionAvailableTenants(List subscriptionAvailableTenants) { this.subscriptionAvailableTenants = subscriptionAvailableTenants; } - public String getAdditionalProperties() { + public List getAdditionalProperties() { return additionalProperties; } - public void setAdditionalProperties(String additionalProperties) { + public void setAdditionalProperties(List additionalProperties) { this.additionalProperties = additionalProperties; } - public String getMonetization() { + public Monetization getMonetization() { return monetization; } - public void setMonetization(String monetization) { + public void setMonetization(Monetization monetization) { this.monetization = monetization; } @@ -348,11 +364,11 @@ public class APIInfo { this.accessControl = accessControl; } - public String getAccessControlRoles() { + public List getAccessControlRoles() { return accessControlRoles; } - public void setAccessControlRoles(String accessControlRoles) { + public void setAccessControlRoles(List accessControlRoles) { this.accessControlRoles = accessControlRoles; } @@ -420,7 +436,7 @@ public class APIInfo { this.endpointImplementationType = endpointImplementationType; } - public ListgetScopes() { + public List getScopes() { return scopes; } @@ -428,28 +444,28 @@ public class APIInfo { this.scopes = scopes; } - public List getOperations() { + public List getOperations() { return operations; } - public void setOperations(List operations) { + public void setOperations(List operations) { this.operations = operations; } - public String getThreatProtectionPolicies() { + public JSONObject getThreatProtectionPolicies() { return threatProtectionPolicies; } - public void setThreatProtectionPolicies(String threatProtectionPolicies) { + public void setThreatProtectionPolicies(JSONObject threatProtectionPolicies) { this.threatProtectionPolicies = threatProtectionPolicies; } - public List getApiCategories() { - return apiCategories; + public List getCategories() { + return categories; } - public void setApiCategories(List apiCategories) { - this.apiCategories = apiCategories; + public void setCategories(List categories) { + this.categories = categories; } public List getKeyManagers() { @@ -460,11 +476,11 @@ public class APIInfo { this.keyManagers = keyManagers; } - public JSONObject getServiceInfo() { + public ServiceInfo getServiceInfo() { return serviceInfo; } - public void setServiceInfo(JSONObject serviceInfo) { + public void setServiceInfo(ServiceInfo serviceInfo) { this.serviceInfo = serviceInfo; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/public/css/analytics.css b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIMaxTps.java similarity index 56% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/public/css/analytics.css rename to components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIMaxTps.java index 5dc50e2fa8..5925b3c79a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/public/css/analytics.css +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIMaxTps.java @@ -15,42 +15,30 @@ * specific language governing permissions and limitations * under the License. */ +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; -#rangeSliderWrapper { - margin-top: 25px; -} +import java.io.Serializable; -#chart { - display: inline-block; -} +public class APIMaxTps implements Serializable { -#legend { - display: inline-block; - position: relative; - left: 8px; -} + private static final long serialVersionUID = 1L; -#legend_container { - position: absolute; - right: 0; - bottom: 26px; - width: 0; -} + int production; + int sandbox; -#chart_container { - float: left; - position: relative; -} + public int getProduction() { + return production; + } -.ast-container { - padding-bottom: 30px; -} + public void setProduction(int production) { + this.production = production; + } -.container { - width: auto; -} + public int getSandbox() { + return sandbox; + } -.shrink { - margin-right: 20px; - margin-left: 20px; + public void setSandbox(int sandbox) { + this.sandbox = sandbox; + } } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIRevision.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIRevision.java new file mode 100644 index 0000000000..c3f3b5831b --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIRevision.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +import java.io.Serializable; +import java.util.List; + +public class APIRevision implements Serializable { + private static final long serialVersionUID = 1L; + private String id; + private String apiUUID; + private String revisionUUID; + private String description; + private String displayName; + private String createdBy; + private String createdTime; + private APIInfo apiInfo; + private List deploymentInfo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getApiUUID() { + return apiUUID; + } + + public void setApiUUID(String apiUUID) { + this.apiUUID = apiUUID; + } + + public String getRevisionUUID() { + return revisionUUID; + } + + public void setRevisionUUID(String revisionUUID) { + this.revisionUUID = revisionUUID; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public List getDeploymentInfo() { + return deploymentInfo; + } + + public void setDeploymentInfo(List deploymentInfo) { + this.deploymentInfo = deploymentInfo; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public APIInfo getApiInfo() { + return apiInfo; + } + + public void setApiInfo(APIInfo apiInfo) { + this.apiInfo = apiInfo; + } + +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIRevisionDeployment.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIRevisionDeployment.java new file mode 100644 index 0000000000..4be3a64836 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/APIRevisionDeployment.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +import java.io.Serializable; + +public class APIRevisionDeployment implements Serializable { + private static final long serialVersionUID = 1L; + private int id; + private String revisionUuid; + private String name; + private String vhost; + private boolean displayOnDevportal; + private String deployedTime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getRevisionUuid() { + return revisionUuid; + } + + public void setRevisionUuid(String revisionUuid) { + this.revisionUuid = revisionUuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVhost() { + return vhost; + } + + public void setVhost(String vhost) { + this.vhost = vhost; + } + + public boolean isDisplayOnDevportal() { + return displayOnDevportal; + } + + public void setDisplayOnDevportal(boolean displayOnDevportal) { + this.displayOnDevportal = displayOnDevportal; + } + + public String getDeployedTime() { + return deployedTime; + } + + public void setDeployedTime(String deployedTime) { + this.deployedTime = deployedTime; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.js b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/AdditionalProperties.java similarity index 54% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.js rename to components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/AdditionalProperties.java index 4cb1e4099f..fbb51bc081 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.js +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/AdditionalProperties.java @@ -16,19 +16,35 @@ * under the License. */ -function onRequest(context) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var mdmProps = require("/app/modules/conf-reader/main.js")["conf"]; - var viewModel = {}; +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; +public class AdditionalProperties { - if (userModule.isAuthorized("/permission/admin/device-mgt/certificates/manage")) { - viewModel["removePermitted"] = true; - } - if (userModule.isAuthorized("/permission/admin/device-mgt/certificates/view")) { - viewModel["viewPermitted"] = true; + private String name; + private String value; + private boolean display; + + public String getName() { + return name; } - viewModel.adminUser = mdmProps.adminUser; - return viewModel; -} \ No newline at end of file + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public boolean isDisplay() { + return display; + } + + public void setDisplay(boolean display) { + this.display = display; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/AdvertiseInfo.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/AdvertiseInfo.java index 93511526aa..9ed465bc72 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/AdvertiseInfo.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/AdvertiseInfo.java @@ -1,12 +1,12 @@ /* - * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. * * Entgra (Pvt) Ltd. 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 + * 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 @@ -15,7 +15,6 @@ * specific language governing permissions and limitations * under the License. */ - package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; /** diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/BusinessInformation.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/BusinessInformation.java index ad32e51f15..4310d50cbf 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/BusinessInformation.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/BusinessInformation.java @@ -1,12 +1,12 @@ /* - * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. * * Entgra (Pvt) Ltd. 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 + * 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 diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/CORSConfiguration.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/CORSConfiguration.java new file mode 100644 index 0000000000..1bee613429 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/CORSConfiguration.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +import java.util.List; + +/** + * API CORS Configuration + */ +public class CORSConfiguration { + + private boolean corsConfigurationEnabled; + private List accessControlAllowOrigins; + private boolean accessControlAllowCredentials; + private List accessControlAllowHeaders; + private List accessControlAllowMethods; + + public CORSConfiguration(boolean corsConfigurationEnabled, List accessControlAllowOrigins, + boolean accessControlAllowCredentials, + List accessControlAllowHeaders, List accessControlAllowMethods) { + this.corsConfigurationEnabled = corsConfigurationEnabled; + this.accessControlAllowOrigins = accessControlAllowOrigins; + this.accessControlAllowCredentials = accessControlAllowCredentials; + this.accessControlAllowHeaders = accessControlAllowHeaders; + this.accessControlAllowMethods = accessControlAllowMethods; + } + + public boolean isCorsConfigurationEnabled() { + return corsConfigurationEnabled; + } + + public void setCorsConfigurationEnabled(boolean corsConfigurationEnabled) { + this.corsConfigurationEnabled = corsConfigurationEnabled; + } + + public List getAccessControlAllowOrigins() { + return accessControlAllowOrigins; + } + + public void setAccessControlAllowOrigins(List accessControlAllowOrigins) { + this.accessControlAllowOrigins = accessControlAllowOrigins; + } + + public boolean isAccessControlAllowCredentials() { + return accessControlAllowCredentials; + } + + public void setAccessControlAllowCredentials(boolean accessControlAllowCredentials) { + this.accessControlAllowCredentials = accessControlAllowCredentials; + } + + public List getAccessControlAllowHeaders() { + return accessControlAllowHeaders; + } + + public void setAccessControlAllowHeaders(List accessControlAllowHeaders) { + this.accessControlAllowHeaders = accessControlAllowHeaders; + } + + public List getAccessControlAllowMethods() { + return accessControlAllowMethods; + } + + public void setAccessControlAllowMethods(List accessControlAllowMethods) { + this.accessControlAllowMethods = accessControlAllowMethods; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Documentation.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Documentation.java new file mode 100644 index 0000000000..5d4c733b42 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Documentation.java @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +import java.util.Date; + +public class Documentation { + + private static final long serialVersionUID = 1L; + private String id; + private String documentId; + private String name; + private DocumentationType type; + private String summary; + private DocumentSourceType sourceType; + private String sourceUrl; + private String fileName; + private String filePath; + private String inlineContent; + private String otherTypeName; + private DocumentVisibility visibility; + private String createdTime; + private Date createdDate; + private String createdBy; + private Date lastUpdatedTime; + private String lastUpdatedBy; + + public String getOtherTypeName() { + return this.otherTypeName; + } + + public void setOtherTypeName(String otherTypeName) { + this.otherTypeName = otherTypeName; + } + + public String getFilePath() { + return this.filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getSourceUrl() { + return this.sourceUrl; + } + + public void setSourceUrl(String sourceUrl) { + this.sourceUrl = sourceUrl; + } + + public Documentation(DocumentationType type, String name) { + this.type = type; + this.name = name; + } + + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (o != null && this.getClass() == o.getClass()) { + Documentation that = (Documentation)o; + return this.name.equals(that.name) && this.type == that.type; + } else { + return false; + } + } + + public DocumentationType getType() { + return this.type; + } + + public String getName() { + return this.name; + } + + public String getSummary() { + return this.summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public DocumentVisibility getVisibility() { + return this.visibility; + } + + public void setVisibility(DocumentVisibility visibility) { + this.visibility = visibility; + } + + public DocumentSourceType getSourceType() { + return this.sourceType; + } + + public void setSourceType(DocumentSourceType sourceType) { + this.sourceType = sourceType; + } + + public int hashCode() { + int result = this.type.hashCode(); + result = 31 * result + this.name.hashCode(); + return result; + } + + public Date getLastUpdatedTime() { + return this.lastUpdatedTime; + } + + public void setLastUpdatedTime(Date lastUpdatedTime) { + this.lastUpdatedTime = lastUpdatedTime; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDocumentId() { + return documentId; + } + + public void setDocumentId(String documentId) { + this.documentId = documentId; + } + + public Date getCreatedDate() { + return this.createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getInlineContent() { + return inlineContent; + } + + public void setInlineContent(String inlineContent) { + this.inlineContent = inlineContent; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public static enum DocumentVisibility { + OWNER_ONLY("owner_only"), + PRIVATE("private"), + API_LEVEL("api_level"); + + private String visibility; + + private DocumentVisibility(String visibility) { + this.visibility = visibility; + } + } + + public static enum DocumentSourceType { + INLINE("In line"), + MARKDOWN("Markdown"), + URL("URL"), + FILE("File"); + + private String type; + + private DocumentSourceType(String type) { + this.type = type; + } + } + + public static enum DocumentationType { + HOWTO("How To"), + SAMPLES("Samples"), + PUBLIC_FORUM("Public Forum"), + SUPPORT_FORUM("Support Forum"), + API_MESSAGE_FORMAT("API Message Format"), + SWAGGER_DOC("Swagger API Definition"), + OTHER("Other"); + + private String type; + + private DocumentationType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Mediation.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Mediation.java new file mode 100644 index 0000000000..5e5125006c --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Mediation.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +public class Mediation { + + private String uuid; + private String name; + private String type; + private String config; + private boolean isGlobal; + + public Mediation(){} + + public void setUuid(String id){ + this.uuid=id; + } + public String getUuid(){return uuid;} + + public void setName(String name){this.name=name;} + + public String getName(){return name;} + + public void setType(String mType){this.type=mType;} + + public String getType(){return type;} + + public void setConfig(String mConfig){this.config=mConfig;} + + public String getConfig(){return config;} + + public boolean isGlobal() { + return isGlobal; + } + + public void setGlobal(boolean isGlobal) { + this.isGlobal = isGlobal; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.theme/public/lib/bootstrap_3.3.5/js/npm.js b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/MediationPolicy.java similarity index 50% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.theme/public/lib/bootstrap_3.3.5/js/npm.js rename to components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/MediationPolicy.java index cb5554e2b5..9db34dbe38 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.theme/public/lib/bootstrap_3.3.5/js/npm.js +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/MediationPolicy.java @@ -16,16 +16,44 @@ * under the License. */ -// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. -require('../../js/transition.js') -require('../../js/alert.js') -require('../../js/button.js') -require('../../js/carousel.js') -require('../../js/collapse.js') -require('../../js/dropdown.js') -require('../../js/modal.js') -require('../../js/tooltip.js') -require('../../js/popover.js') -require('../../js/scrollspy.js') -require('../../js/tab.js') -require('../../js/affix.js') \ No newline at end of file +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +public class MediationPolicy { + + private String id; + private String name; + private String type; + private boolean shared; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isShared() { + return shared; + } + + public void setShared(boolean shared) { + this.shared = shared; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.js b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Monetization.java similarity index 58% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.js rename to components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Monetization.java index 0de2bb58ed..5b014fbe58 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.js +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Monetization.java @@ -16,15 +16,27 @@ * under the License. */ -function onRequest(context) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var utility = require("/app/modules/utility.js")["utility"]; - var deviceType = request.getParameter("type"); +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; - var canEdit = false; - if(userModule.isAuthorized("/permission/admin/device-mgt/policy/manage")) { - canEdit = true; +import org.json.JSONObject; + +public class Monetization { + private boolean enabled; + private JSONObject properties; + + public boolean isEnabled() { + return enabled; } - return {"deviceTypePolicyView": utility.getTenantedDeviceUnitName(deviceType, "policy-view"), "canEdit": canEdit}; + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public JSONObject getProperties() { + return properties; + } + + public void setProperties(JSONObject properties) { + this.properties = properties; + } } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Operations.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Operations.java index 51f2c1ee4c..51e5d0c3de 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Operations.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Operations.java @@ -1,12 +1,12 @@ /* - * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. * * Entgra (Pvt) Ltd. 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 + * 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 @@ -18,7 +18,8 @@ package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; -import java.util.Set; +import org.json.JSONObject; +import java.util.List; /** * This hold the api operations information. @@ -29,8 +30,8 @@ public class Operations { private String verb; private String authType; private String throttlingPolicy; - private Set scopes; - private String usedProductIds; + private List scopes; + private List usedProductIds; private String amznResourceName; private String amznResourceTimeout; private String payloadSchema; @@ -78,19 +79,19 @@ public class Operations { this.throttlingPolicy = throttlingPolicy; } - public Set getScopes() { + public List getScopes() { return scopes; } - public void setScopes(Set scopes) { + public void setScopes(List scopes) { this.scopes = scopes; } - public String getUsedProductIds() { + public List getUsedProductIds() { return usedProductIds; } - public void setUsedProductIds(String usedProductIds) { + public void setUsedProductIds(List usedProductIds) { this.usedProductIds = usedProductIds; } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Scope.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Scope.java new file mode 100644 index 0000000000..53a40e2707 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/Scope.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Objects; +import java.util.Set; +import java.util.HashSet; + +public class Scope implements Serializable{ + + private static final long serialVersionUID = 1L; + + String id; + String name; + String displayName; + String description; + List bindings; + int usageCount; + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getBindings() { + return bindings; + } + + public void setBindings(List bindings) { + this.bindings = removeDuplicatesFromRoleString(bindings); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getUsageCount() { + return usageCount; + } + + public void setUsageCount(int usageCount) { + this.usageCount = usageCount; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Scope scope = (Scope) o; + + if (id != null ? !id.equals(scope.id) : scope.id != null) return false; + if (!name.equals(scope.name)) return false; + if (!displayName.equals(scope.displayName)) return false; + if (bindings != null ? !bindings.equals(scope.bindings) : scope.bindings != null) return false; + return description != null ? description.equals(scope.description) : scope.description == null; + } + + @Override + public int hashCode() { + return Objects.hash(name, displayName, bindings, description, id); + } + + private static List removeDuplicatesFromRoleString(List roles) { + Set roleSet = new HashSet<>(); + for(String role : roles) { + roleSet.add(role.trim()); + } + return new ArrayList<>(roleSet); + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/util/ScopeUtils.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/ServiceInfo.java similarity index 52% rename from components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/util/ScopeUtils.java rename to components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/ServiceInfo.java index e8f602f992..cfbcf2ea66 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/util/ScopeUtils.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/ServiceInfo.java @@ -16,21 +16,14 @@ * under the License. */ -package io.entgra.device.mgt.core.apimgt.extension.rest.api.util; +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; -/** - * This class represents the scope data. - */ -public class ScopeUtils { +public class ServiceInfo { private String key; private String name; - private String roles; - private String description; - private int id; - - public ScopeUtils() { - } + private String version; + private boolean outdated; public String getKey() { return key; @@ -48,31 +41,19 @@ public class ScopeUtils { this.name = name; } - public String getRoles() { - return roles; + public String getVersion() { + return version; } - public void setRoles(String roles) { - this.roles = roles; + public void setVersion(String version) { + this.version = version; } - public String getDescription() { - return description; + public boolean isOutdated() { + return outdated; } - public void setDescription(String description) { - this.description = description; - } - - public String toJSON() { - String jsonString = "{\n" + - " \"name\":\"" + key + "\",\n" + - " \"displayName\":\"" + name + "\",\n" + - " \"description\":\"" + description + "\",\n" + - " \"bindings\":[\n" + - " \"" + roles + "\"\n" + - " ]\n" + - "}"; - return jsonString; + public void setOutdated(boolean outdated) { + this.outdated = outdated; } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.js b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/ThreatProtectionPolicies.java old mode 100755 new mode 100644 similarity index 60% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.js rename to components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/ThreatProtectionPolicies.java index 4775342cf7..b9594830f9 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.js +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/ThreatProtectionPolicies.java @@ -16,17 +16,26 @@ * under the License. */ -function onRequest(context) { - var deviceTypes = context.unit.params.deviceTypes; - var deviceType = context.uriParams.deviceType; +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; - var deviceTypesList = []; - if (deviceTypes) { - for (var i = 0; i < deviceTypes.length; i++) { - deviceTypesList.push(deviceTypes[i].type); - } - } else if (deviceType) { - deviceTypesList.push(deviceType); +public class ThreatProtectionPolicies { + + private String policyID; + private int priority; + + public String getPolicyID() { + return policyID; + } + + public void setPolicyID(String policyID) { + this.policyID = policyID; + } + + public int getPriority() { + return priority; + } + + public void setPriority(int priority) { + this.priority = priority; } - return {"deviceTypes": stringify(deviceTypesList)}; } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/URITemplate.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/URITemplate.java new file mode 100644 index 0000000000..9cd69a9f11 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/URITemplate.java @@ -0,0 +1,440 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +import org.json.simple.JSONValue; +import org.wso2.carbon.apimgt.api.dto.ConditionGroupDTO; +import org.wso2.carbon.apimgt.api.model.APIProductIdentifier; +import org.wso2.carbon.apimgt.api.model.Scope; +import org.wso2.carbon.apimgt.api.model.policy.PolicyConstants; + +import java.io.Serializable; +import java.util.*; + +public class URITemplate implements Serializable{ + + private static final long serialVersionUID = 1L; + + private String uriTemplate; + private String resourceURI; + private String resourceSandboxURI; + private String httpVerb; + private String authType; + private LinkedHashSet httpVerbs = new LinkedHashSet(); + private List authTypes = new ArrayList(); + private List throttlingConditions = new ArrayList(); + private String applicableLevel; + private String throttlingTier; + private List throttlingTiers = new ArrayList(); + private org.wso2.carbon.apimgt.api.model.Scope scope; + private String mediationScript; + private List scopes = new ArrayList(); + private Map mediationScripts = new HashMap(); + private ConditionGroupDTO[] conditionGroups; + private int id; + private Set usedByProducts = new HashSet<>(); + private String amznResourceName; + private int amznResourceTimeout; + + public ConditionGroupDTO[] getConditionGroups() { + return conditionGroups; + } + + public void setConditionGroups(ConditionGroupDTO[] conditionGroups) { + this.conditionGroups = conditionGroups; + } + + public String getMediationScript() { + return mediationScript; + } + + + public List getThrottlingConditions() { + return throttlingConditions; + } + + public void setThrottlingConditions(List throttlingConditions) { + this.throttlingConditions = throttlingConditions; + } + + public void setMediationScript(String mediationScript) { + this.mediationScript = mediationScript; + } + /** + * Set mediation script for a given http method + * @param method http method name + * @param mediationScript mediation script content + */ + public void setMediationScripts(String method, String mediationScript){ + if (mediationScript != null && !mediationScript.trim().equals("") && !mediationScript.trim().equals("null")){ + mediationScripts.put(method, mediationScript); + } + + } + + /** + * Generating the script by aggregating scripts of each http method to form a single script in to be + * used when generating synapse configuration file. + * + * @return aggregated script in the following format, + * if (http-method = 'GET'){ + * //script for GET + * } + * .... + * .... + * if (http-method = 'POST'){ + * //script for POST + * } + */ + public String getAggregatedMediationScript(){ + if (mediationScripts.isEmpty()){ + return "null"; + }else if (mediationScripts.size() == 1 && httpVerbs.size() == 1){ + return mediationScript; + }else{ + StringBuilder aggregatedScript = new StringBuilder(); + + for (Map.Entry entry : mediationScripts.entrySet()){ + String httpMethod = entry.getKey(); + String mediationScript = entry.getValue(); + + aggregatedScript.append("if (mc.getProperty('REST_METHOD') == '").append(httpMethod).append("'){"); + aggregatedScript.append(mediationScript); + aggregatedScript.append("}"); + + } + + return aggregatedScript.toString(); + } + } + + public String getThrottlingTier() { + return throttlingTier; + } + + public void setThrottlingTier(String throttlingTier) { + this.throttlingTier = throttlingTier; + } + + public List getThrottlingTiers(){ + return throttlingTiers; + } + + public void setThrottlingTiers(List throttlingTiers) { + this.throttlingTiers = throttlingTiers; + } + + public String getHTTPVerb() { + return httpVerb; + } + + public void setHTTPVerb(String httpVerb) { + this.httpVerb = httpVerb; + } + + public String getAuthType() { + return authType; + } + + public void setAuthType(String authType) { + this.authType = authType; + + } + + public String getResourceURI() { + return resourceURI; + } + + public void setResourceURI(String resourceURI) { + this.resourceURI = resourceURI; + } + + public boolean isResourceURIExist(){ + return this.resourceURI != null; + } + + public String getResourceSandboxURI() { + return resourceSandboxURI; + } + + public void setResourceSandboxURI(String resourceSandboxURI) { + this.resourceSandboxURI = resourceSandboxURI; + } + + public boolean isResourceSandboxURIExist(){ + return this.resourceSandboxURI != null; + } + + public String getUriTemplate() { + return uriTemplate; + } + + public void setUriTemplate(String template) { + this.uriTemplate = template; + } + + public void setHttpVerbs(String httpVerb) { + + httpVerbs.add(httpVerb); + } + + public LinkedHashSet getHttpVerbs() { + + return httpVerbs; + } + + + + public void setAuthTypes(String authType) { + + authTypes.add(authType); + } + + public String getAuthTypes() { + + return authType; + } + + + public String getMethodsAsString() { + StringBuilder stringBuilder = new StringBuilder(); + for (String method : httpVerbs) { + stringBuilder.append(method).append(" "); + } + return stringBuilder.toString().trim(); + } + + public String getAuthTypeAsString() { + StringBuilder stringBuilder = new StringBuilder(); + for (String authType : authTypes) { + stringBuilder.append(authType).append(" "); + } + return stringBuilder.toString().trim(); + } + + public String getThrottlingConditionsAsString() { + StringBuilder stringBuilder = new StringBuilder(); + for (String authType : throttlingConditions) { + stringBuilder.append(authType).append(" "); + } + return stringBuilder.toString().trim(); + } + + public void setThrottlingTiers(String tier) { + throttlingTiers.add(tier); + } + + public String getThrottlingTiersAsString() { + StringBuilder stringBuilder = new StringBuilder(); + for (String tier : throttlingTiers) { + if (tier.contains(PolicyConstants.THROTTLING_TIER_CONTENT_AWARE_SEPERATOR)) { + stringBuilder.append(tier.substring(0, + tier.indexOf(PolicyConstants.THROTTLING_TIER_CONTENT_AWARE_SEPERATOR)).trim()).append(" "); + } else { + stringBuilder.append(tier.trim()).append(" "); + } + } + return stringBuilder.toString().trim(); + } + + public boolean checkContentAwareFromThrottlingTiers() { + // use the content aware property appended to throttling tiers + if (!throttlingTiers.isEmpty()) { + String throttlingTierWithContentAware = throttlingTiers.get(0); + if (throttlingTierWithContentAware != null && + throttlingTierWithContentAware.contains(PolicyConstants.THROTTLING_TIER_CONTENT_AWARE_SEPERATOR)) { + String[] splitThrottlingTiers = + throttlingTierWithContentAware.split(PolicyConstants.THROTTLING_TIER_CONTENT_AWARE_SEPERATOR); + return Boolean.valueOf(splitThrottlingTiers[splitThrottlingTiers.length - 1]); + } + } + return false; + } + + public org.wso2.carbon.apimgt.api.model.Scope getScope() { + return scope; + } + public List getScopes() { + return scopes; + } + + public void setScope(org.wso2.carbon.apimgt.api.model.Scope scope) { + this.scope = scope; + } + + public void setScopes(org.wso2.carbon.apimgt.api.model.Scope scope){ + this.scopes.add(scope); + } + + public String getResourceMap(){ + Map verbs = new LinkedHashMap(); + int i = 0; + for (String method : httpVerbs) { + Map verb = new LinkedHashMap(); + verb.put("auth_type",authTypes.get(i)); + verb.put("throttling_tier",throttlingTiers.get(i)); + //Following parameter is not required as it not need to reflect UI level. If need please enable it. + // /verb.put("throttling_conditions", throttlingConditions.get(i)); + try{ + org.wso2.carbon.apimgt.api.model.Scope tmpScope = scopes.get(i); + if(tmpScope != null){ + verb.put("scope",tmpScope.getKey()); + } + }catch(IndexOutOfBoundsException e){ + //todo need to rewrite to prevent this type of exceptions + } + verbs.put(method,verb); + i++; + } + //todo this is a hack to make key validation service stub from braking need to rewrite. + return JSONValue.toJSONString(verbs); + } + + public String getApplicableLevel() { + return applicableLevel; + } + + public void setApplicableLevel(String applicableLevel) { + this.applicableLevel = applicableLevel; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + URITemplate that = (URITemplate) o; + + if (!uriTemplate.equals(that.uriTemplate)) { + return false; + } + if (resourceURI != null ? !resourceURI.equals(that.resourceURI) : that.resourceURI != null) { + return false; + } + if (resourceSandboxURI != null ? !resourceSandboxURI.equals(that.resourceSandboxURI) : that + .resourceSandboxURI != null) { + return false; + } + if (!httpVerb.equals(that.httpVerb)) { + return false; + } + if (!authType.equals(that.authType)) { + return false; + } + if (!httpVerbs.equals(that.httpVerbs)) { + return false; + } + if (!authTypes.equals(that.authTypes)) { + return false; + } + if (throttlingConditions != null ? !throttlingConditions.equals(that.throttlingConditions) : that + .throttlingConditions != null) { + return false; + } + if (applicableLevel != null ? !applicableLevel.equals(that.applicableLevel) : that.applicableLevel != null) { + return false; + } + if (!throttlingTier.equals(that.throttlingTier)) { + return false; + } + if (!throttlingTiers.equals(that.throttlingTiers)) { + return false; + } + if (scope != null ? !scope.equals(that.scope) : that.scope != null) { + return false; + } + if (mediationScript != null ? !mediationScript.equals(that.mediationScript) : that.mediationScript != null) { + return false; + } + if (scopes != null ? !scopes.equals(that.scopes) : that.scopes != null) { + return false; + } + if (mediationScripts != null ? !mediationScripts.equals(that.mediationScripts) : that.mediationScripts != + null) { + return false; + } + // Probably incorrect - comparing Object[] arrays with Arrays.equals + return Arrays.equals(conditionGroups, that.conditionGroups); + } + + @Override + public int hashCode() { + int result = uriTemplate.hashCode(); + result = 31 * result + (resourceURI != null ? resourceURI.hashCode() : 0); + result = 31 * result + (resourceSandboxURI != null ? resourceSandboxURI.hashCode() : 0); + result = 31 * result + (httpVerb != null ? httpVerb.hashCode() : 0); + result = 31 * result + (authType != null ? authType.hashCode() : 0); + result = 31 * result + (httpVerbs != null ? httpVerbs.hashCode() : 0); + result = 31 * result + (authTypes != null ? authTypes.hashCode() : 0); + result = 31 * result + (throttlingConditions != null ? throttlingConditions.hashCode() : 0); + result = 31 * result + (applicableLevel != null ? applicableLevel.hashCode() : 0); + result = 31 * result + (throttlingTier != null ? throttlingTier.hashCode() : 0); + result = 31 * result + (throttlingTiers != null ? throttlingTiers.hashCode() : 0); + result = 31 * result + (scope != null ? scope.hashCode() : 0); + result = 31 * result + (mediationScript != null ? mediationScript.hashCode() : 0); + result = 31 * result + (scopes != null ? scopes.hashCode() : 0); + result = 31 * result + (mediationScripts != null ? mediationScripts.hashCode() : 0); + result = 31 * result + Arrays.hashCode(conditionGroups); + return result; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public List retrieveAllScopes() { + return this.scopes; + } + + public void addAllScopes(List scopes) { + + this.scopes = scopes; + } + + public Set retrieveUsedByProducts() { + return usedByProducts; + } + + public void addUsedByProduct(APIProductIdentifier usedByProduct) { + usedByProducts.add(usedByProduct); + } + + public void setAmznResourceName(String amznResourceName) { + this.amznResourceName = amznResourceName; + } + + public String getAmznResourceName() { + return amznResourceName; + } + + public void setAmznResourceTimeout(int amznResourceTimeout) { + this.amznResourceTimeout = amznResourceTimeout; + } + + public int getAmznResourceTimeout() { + return amznResourceTimeout; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/WebsubSubscriptionConfiguration.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/WebsubSubscriptionConfiguration.java new file mode 100644 index 0000000000..a029c69cb0 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/dto/APIInfo/WebsubSubscriptionConfiguration.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo; + +/** + * This hold the Websub Subscription Configuration of an API. + */ +public class WebsubSubscriptionConfiguration { + private boolean enable; + private String secret; + private String signingAlgorithm; + private String signatureHeader; + + public boolean isEnable() { + return enable; + } + + public void setEnable(boolean enable) { + this.enable = enable; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getSigningAlgorithm() { + return signingAlgorithm; + } + + public void setSigningAlgorithm(String signingAlgorithm) { + this.signingAlgorithm = signingAlgorithm; + } + + public String getSignatureHeader() { + return signatureHeader; + } + + public void setSignatureHeader(String signatureHeader) { + this.signatureHeader = signatureHeader; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension.api/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension.api/pom.xml index b9b4567912..02f206b74a 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension.api/pom.xml +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension.api/pom.xml @@ -21,7 +21,7 @@ apimgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT 4.0.0 diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension/pom.xml index 00a1c1a11b..2dad4adae3 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension/pom.xml +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension/pom.xml @@ -21,7 +21,7 @@ apimgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/pom.xml index 615f07c01e..15141fa9f2 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/pom.xml +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/pom.xml @@ -22,7 +22,7 @@ apimgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml @@ -133,6 +133,10 @@ org.json.wso2 json + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.core + @@ -173,6 +177,10 @@ io.entgra.device.mgt.core.apimgt.webapp.publisher.config, io.entgra.device.mgt.core.apimgt.webapp.publisher.dto, io.entgra.device.mgt.core.apimgt.webapp.publisher.exception, + io.entgra.device.mgt.core.device.mgt.common.exceptions, + io.entgra.device.mgt.core.device.mgt.common.metadata.mgt, + io.entgra.device.mgt.core.device.mgt.core.config, + io.entgra.device.mgt.core.device.mgt.core.config.permission, io.swagger.annotations;version="[1.6,2)", javax.servlet;version="[2.6,3)", javax.xml.bind;version="[0.0,1)", diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherService.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherService.java index 5edf16d076..eec6cfcab7 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherService.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherService.java @@ -35,4 +35,22 @@ public interface APIPublisherService { void publishAPI(APIConfig api) throws APIManagerPublisherException; void updateScopeRoleMapping() throws APIManagerPublisherException; + + /** + * Add default scopes defined in the cdm-config.xml + */ + void addDefaultScopesIfNotExist(); + + /** + * If the permissions are in the permission list, identify the relevant scopes of the supplied permission list + * and put the role there; if the permissions are in the removedPermission list, update the relevant scopes by + * deleting the role from those scopes. + * + * @param roleName Role Name + * @param permissions List of adding permissions + * @param removedPermissions List of removing permissions + * @throws APIManagerPublisherException If error occurred while updating the scope role mapping + */ + void updateScopeRoleMapping(String roleName, String[] permissions, String[] removedPermissions) throws APIManagerPublisherException; + } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherServiceImpl.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherServiceImpl.java index e188ae799b..c6c9003b07 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherServiceImpl.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherServiceImpl.java @@ -17,13 +17,15 @@ */ package io.entgra.device.mgt.core.apimgt.webapp.publisher; +import com.google.gson.Gson; +import io.entgra.device.mgt.core.apimgt.annotations.Scopes; import io.entgra.device.mgt.core.apimgt.extension.rest.api.APIApplicationServices; import io.entgra.device.mgt.core.apimgt.extension.rest.api.APIApplicationServicesImpl; import io.entgra.device.mgt.core.apimgt.extension.rest.api.PublisherRESTAPIServices; import io.entgra.device.mgt.core.apimgt.extension.rest.api.PublisherRESTAPIServicesImpl; import io.entgra.device.mgt.core.apimgt.extension.rest.api.constants.Constants; import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIApplicationKey; -import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo.APIInfo; +import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo.*; import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.AccessTokenInfo; import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.APIServicesException; import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.BadRequestException; @@ -32,19 +34,29 @@ import io.entgra.device.mgt.core.apimgt.webapp.publisher.config.WebappPublisherC import io.entgra.device.mgt.core.apimgt.webapp.publisher.dto.ApiScope; import io.entgra.device.mgt.core.apimgt.webapp.publisher.dto.ApiUriTemplate; import io.entgra.device.mgt.core.apimgt.webapp.publisher.exception.APIManagerPublisherException; +import io.entgra.device.mgt.core.apimgt.webapp.publisher.internal.APIPublisherDataHolder; +import io.entgra.device.mgt.core.device.mgt.core.config.DeviceConfigurationManager; +import io.entgra.device.mgt.core.device.mgt.core.config.DeviceManagementConfig; +import io.entgra.device.mgt.core.device.mgt.core.config.permission.DefaultPermission; +import io.entgra.device.mgt.core.device.mgt.core.config.permission.DefaultPermissions; +import io.entgra.device.mgt.core.device.mgt.core.config.permission.ScopeMapping; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONArray; import org.json.JSONObject; +import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.apimgt.api.APIManagementException; import org.wso2.carbon.apimgt.api.APIProvider; -import org.wso2.carbon.apimgt.api.model.*; +import org.wso2.carbon.apimgt.api.model.APIIdentifier; import org.wso2.carbon.apimgt.impl.APIConstants; import org.wso2.carbon.apimgt.impl.APIManagerFactory; import org.wso2.carbon.apimgt.impl.utils.APIUtil; import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.user.api.AuthorizationManager; +import org.wso2.carbon.user.api.Permission; import org.wso2.carbon.user.api.UserStoreException; +import org.wso2.carbon.user.api.UserStoreManager; import org.wso2.carbon.user.core.service.RealmService; import org.wso2.carbon.user.core.tenant.Tenant; import org.wso2.carbon.user.core.tenant.TenantSearchResult; @@ -66,6 +78,7 @@ import java.util.*; */ public class APIPublisherServiceImpl implements APIPublisherService { public static final APIManagerFactory API_MANAGER_FACTORY = APIManagerFactory.getInstance(); + private static final Gson gson = new Gson(); private static final String UNLIMITED_TIER = "Unlimited"; private static final String WS_UNLIMITED_TIER = "AsyncUnlimited"; private static final String API_PUBLISH_ENVIRONMENT = "Default"; @@ -75,6 +88,7 @@ public class APIPublisherServiceImpl implements APIPublisherService { public static final String SUBSCRIPTION_TO_CURRENT_TENANT = "CURRENT_TENANT"; public static final String API_GLOBAL_VISIBILITY = "PUBLIC"; public static final String API_PRIVATE_VISIBILITY = "PRIVATE"; + private static final String ADMIN_ROLE_KEY = "admin"; private static final Log log = LogFactory.getLog(APIPublisherServiceImpl.class); @@ -143,28 +157,30 @@ public class APIPublisherServiceImpl implements APIPublisherService { apiConfig.getName(), apiConfig.getVersion()); PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServicesImpl(); - JSONArray apiList = (JSONArray) publisherRESTAPIServices.getApis(apiApplicationKey, accessTokenInfo).get("list"); + APIInfo[] apiList = publisherRESTAPIServices.getApis(apiApplicationKey, accessTokenInfo); boolean apiFound = false; - for (int i = 0; i < apiList.length(); i++) { - JSONObject apiObj = apiList.getJSONObject(i); - if (apiObj.getString("name").equals(apiIdentifier.getApiName().replace(Constants.SPACE, - Constants.EMPTY_STRING))){ + for (int i = 0; i < apiList.length; i++) { + APIInfo apiObj = apiList[i]; + if (apiObj.getName().equals(apiIdentifier.getApiName().replace(Constants.SPACE, + Constants.EMPTY_STRING))) { apiFound = true; - apiIdentifier.setUuid(apiObj.getString("id")); + apiIdentifier.setUuid(apiObj.getId()); break; } } + String apiUuid = apiIdentifier.getUUID(); if (!apiFound) { // add new scopes as shared scopes addNewSharedScope(apiConfig.getScopes(), publisherRESTAPIServices, apiApplicationKey, accessTokenInfo); APIInfo api = getAPI(apiConfig, true); - JSONObject createdAPI = publisherRESTAPIServices.addAPI(apiApplicationKey, accessTokenInfo, api); + APIInfo createdAPI = publisherRESTAPIServices.addAPI(apiApplicationKey, accessTokenInfo, api); + apiUuid = createdAPI.getId(); if (apiConfig.getEndpointType() != null && "WS".equals(apiConfig.getEndpointType())) { publisherRESTAPIServices.saveAsyncApiDefinition(apiApplicationKey, accessTokenInfo, - createdAPI.getString("id"), apiConfig.getAsyncApiDefinition()); + apiUuid, apiConfig.getAsyncApiDefinition()); } - if (CREATED_STATUS.equals(createdAPI.getString("lifeCycleStatus"))) { + if (CREATED_STATUS.equals(createdAPI.getLifeCycleStatus())) { // if endpoint type "dynamic" and then add in sequence if ("dynamic".equals(apiConfig.getEndpointType())) { Mediation mediation = new Mediation(); @@ -173,26 +189,26 @@ public class APIPublisherServiceImpl implements APIPublisherService { mediation.setType("in"); mediation.setGlobal(false); publisherRESTAPIServices.addApiSpecificMediationPolicy(apiApplicationKey, - accessTokenInfo, createdAPI.getString("id"), mediation); + accessTokenInfo, apiUuid, mediation); } publisherRESTAPIServices.changeLifeCycleStatus(apiApplicationKey, accessTokenInfo, - createdAPI.getString("id"), PUBLISH_ACTION); + apiUuid, PUBLISH_ACTION); APIRevision apiRevision = new APIRevision(); - apiRevision.setApiUUID(createdAPI.getString("id")); + apiRevision.setApiUUID(apiUuid); apiRevision.setDescription("Initial Revision"); String apiRevisionId = publisherRESTAPIServices.addAPIRevision(apiApplicationKey, - accessTokenInfo, apiRevision).getString("id"); + accessTokenInfo, apiRevision).getId(); APIRevisionDeployment apiRevisionDeployment = new APIRevisionDeployment(); - apiRevisionDeployment.setDeployment(API_PUBLISH_ENVIRONMENT); + apiRevisionDeployment.setName(API_PUBLISH_ENVIRONMENT); apiRevisionDeployment.setVhost(System.getProperty("iot.gateway.host")); apiRevisionDeployment.setDisplayOnDevportal(true); List apiRevisionDeploymentList = new ArrayList<>(); apiRevisionDeploymentList.add(apiRevisionDeployment); publisherRESTAPIServices.deployAPIRevision(apiApplicationKey, accessTokenInfo, - createdAPI.getString("id"), apiRevisionId, apiRevisionDeploymentList); + apiUuid, apiRevisionId, apiRevisionDeploymentList); } } else { if (WebappPublisherConfig.getInstance().isEnabledUpdateApi()) { @@ -219,16 +235,17 @@ public class APIPublisherServiceImpl implements APIPublisherService { addNewSharedScope(apiConfig.getScopes(), publisherRESTAPIServices, apiApplicationKey, accessTokenInfo); - JSONObject existingAPI = publisherRESTAPIServices.getApi(apiApplicationKey, - accessTokenInfo, apiIdentifier); + // Get existing API + APIInfo existingAPI = publisherRESTAPIServices.getApi(apiApplicationKey, accessTokenInfo, + apiUuid); APIInfo api = getAPI(apiConfig, true); - api.setLastUpdatedTime(existingAPI.getString("lifeCycleStatus")); - api.setId(existingAPI.getString("id")); + api.setLifeCycleStatus(existingAPI.getLifeCycleStatus()); + api.setId(apiUuid); publisherRESTAPIServices.updateApi(apiApplicationKey, accessTokenInfo, api); if (apiConfig.getEndpointType() != null && "WS".equals(apiConfig.getEndpointType())) { publisherRESTAPIServices.saveAsyncApiDefinition(apiApplicationKey, accessTokenInfo, - existingAPI.getString("id"), apiConfig.getAsyncApiDefinition()); + apiUuid, apiConfig.getAsyncApiDefinition()); } // if endpoint type "dynamic" and then add /update in sequence @@ -239,54 +256,58 @@ public class APIPublisherServiceImpl implements APIPublisherService { mediation.setType("in"); mediation.setGlobal(false); - List mediationList = (List) publisherRESTAPIServices - .getAllApiSpecificMediationPolicies(apiApplicationKey, accessTokenInfo, - apiIdentifier).get("list"); + MediationPolicy[] mediationList = publisherRESTAPIServices + .getAllApiSpecificMediationPolicies(apiApplicationKey, accessTokenInfo, apiUuid); boolean isMediationPolicyFound = false; - for (Mediation m : mediationList) { - if (apiConfig.getInSequenceName().equals(m.getName())) { - m.setConfig(apiConfig.getInSequenceConfig()); - publisherRESTAPIServices. - updateApiSpecificMediationPolicyContent(apiApplicationKey, - accessTokenInfo, existingAPI.getString("id"), m); + for (int i = 0; i < mediationList.length; i++) { + MediationPolicy mediationPolicy = mediationList[i]; + if (apiConfig.getInSequenceName().equals(mediationPolicy.getName())) { + mediation.setUuid(mediationPolicy.getId()); + publisherRESTAPIServices.deleteApiSpecificMediationPolicy(apiApplicationKey, + accessTokenInfo, apiUuid, mediation); + publisherRESTAPIServices.addApiSpecificMediationPolicy(apiApplicationKey, + accessTokenInfo, apiUuid, mediation); isMediationPolicyFound = true; break; } } if (!isMediationPolicyFound) { publisherRESTAPIServices.addApiSpecificMediationPolicy(apiApplicationKey, - accessTokenInfo, existingAPI.getString("id"), mediation); + accessTokenInfo, apiUuid, mediation); } } - // This will retrieve the deployed revision - JSONArray revisionDeploymentList = (JSONArray) publisherRESTAPIServices.getAPIRevisions(apiApplicationKey, - accessTokenInfo, existingAPI.getString("id"), true).get("list"); - // This will retrieve the un deployed revision list - JSONArray undeployedRevisionList = (JSONArray) publisherRESTAPIServices.getAPIRevisions(apiApplicationKey, - accessTokenInfo, existingAPI.getString("id"), false).get("list"); - int apiRevisionCount = (int) publisherRESTAPIServices.getAPIRevisions(apiApplicationKey, - accessTokenInfo, existingAPI.getString("id"), null).get("count"); - + int apiRevisionCount = publisherRESTAPIServices.getAPIRevisions(apiApplicationKey, + accessTokenInfo, apiUuid, null).length; if (apiRevisionCount >= 5) { - JSONObject latestRevisionDeployment = revisionDeploymentList.getJSONObject(0); - JSONObject earliestUndeployRevision = undeployedRevisionList.getJSONObject(0); - publisherRESTAPIServices.undeployAPIRevisionDeployment(apiApplicationKey, - accessTokenInfo, latestRevisionDeployment, existingAPI.getString("id")); - publisherRESTAPIServices.deleteAPIRevision(apiApplicationKey, accessTokenInfo, - earliestUndeployRevision, existingAPI.getString("id")); + // This will retrieve the deployed revision + APIRevision[] revisionDeploymentList = publisherRESTAPIServices.getAPIRevisions( + apiApplicationKey, accessTokenInfo, apiUuid, true); + if (revisionDeploymentList.length > 0) { + APIRevision latestRevisionDeployment = revisionDeploymentList[0]; + publisherRESTAPIServices.undeployAPIRevisionDeployment(apiApplicationKey, + accessTokenInfo, latestRevisionDeployment, apiUuid); + } + // This will retrieve the undeployed revision list + APIRevision[] undeployedRevisionList = publisherRESTAPIServices.getAPIRevisions(apiApplicationKey, + accessTokenInfo, apiUuid, false); + if (undeployedRevisionList.length > 0) { + APIRevision earliestUndeployRevision = undeployedRevisionList[0]; + publisherRESTAPIServices.deleteAPIRevision(apiApplicationKey, accessTokenInfo, + earliestUndeployRevision, apiUuid); + } } // create new revision APIRevision apiRevision = new APIRevision(); - apiRevision.setApiUUID(existingAPI.getString("id")); + apiRevision.setApiUUID(apiUuid); apiRevision.setDescription("Updated Revision"); String apiRevisionId = publisherRESTAPIServices.addAPIRevision(apiApplicationKey, - accessTokenInfo, apiRevision).getString("id"); + accessTokenInfo, apiRevision).getId(); APIRevisionDeployment apiRevisionDeployment = new APIRevisionDeployment(); - apiRevisionDeployment.setDeployment(API_PUBLISH_ENVIRONMENT); + apiRevisionDeployment.setName(API_PUBLISH_ENVIRONMENT); apiRevisionDeployment.setVhost(System.getProperty("iot.gateway.host")); apiRevisionDeployment.setDisplayOnDevportal(true); @@ -294,17 +315,15 @@ public class APIPublisherServiceImpl implements APIPublisherService { apiRevisionDeploymentList.add(apiRevisionDeployment); publisherRESTAPIServices.deployAPIRevision(apiApplicationKey, accessTokenInfo, - existingAPI.getString("id"), apiRevisionId, apiRevisionDeploymentList); + apiUuid, apiRevisionId, apiRevisionDeploymentList); - if (CREATED_STATUS.equals(existingAPI.getString("lifeCycleStatus"))) { - publisherRESTAPIServices.changeLifeCycleStatus(apiApplicationKey,accessTokenInfo, - existingAPI.getString("id"), PUBLISH_ACTION); + if (CREATED_STATUS.equals(existingAPI.getLifeCycleStatus())) { + publisherRESTAPIServices.changeLifeCycleStatus(apiApplicationKey, accessTokenInfo, + apiUuid, PUBLISH_ACTION); } } } - if (apiConfig.getApiDocumentationSourceFile() != null) { - APIInfo api = getAPI(apiConfig, true); - + if (apiUuid != null && apiConfig.getApiDocumentationSourceFile() != null) { String fileName = CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + "resources" + File.separator + "api-docs" + File.separator + @@ -322,34 +341,36 @@ public class APIPublisherServiceImpl implements APIPublisherService { br.close(); String docContent = stringBuilder.toString(); - Documentation apiDocumentation = new Documentation(DocumentationType.HOWTO, apiConfig.getApiDocumentationName()); + Documentation apiDocumentation = new Documentation(Documentation.DocumentationType.HOWTO, apiConfig.getApiDocumentationName()); apiDocumentation.setVisibility(Documentation.DocumentVisibility.API_LEVEL); apiDocumentation.setSourceType(Documentation.DocumentSourceType.MARKDOWN); apiDocumentation.setCreatedDate(new Date()); - apiDocumentation.setLastUpdated(new Date()); + apiDocumentation.setLastUpdatedTime(new Date()); apiDocumentation.setSummary(apiConfig.getApiDocumentationSummary()); apiDocumentation.setOtherTypeName(null); - JSONArray documentList = (JSONArray) publisherRESTAPIServices.getDocumentations(apiApplicationKey, - accessTokenInfo, api.getId()).get("list"); + Documentation[] documentList = publisherRESTAPIServices.getDocumentations(apiApplicationKey, + accessTokenInfo, apiUuid); - if (documentList.length() > 0) { - for (int i = 0; i < documentList.length(); i++) { - JSONObject existingDoc = documentList.getJSONObject(i); - if (existingDoc.getString("name").equals(apiConfig.getApiDocumentationName()) - && existingDoc.getString("type").equals(DocumentationType.HOWTO)) { + if (documentList.length > 0) { + for (int i = 0; i < documentList.length; i++) { + Documentation existingDoc = documentList[i]; + if (existingDoc.getName().equals(apiConfig.getApiDocumentationName()) + && existingDoc.getType().equals(Documentation.DocumentationType.HOWTO.name())) { publisherRESTAPIServices.deleteDocumentations(apiApplicationKey, accessTokenInfo, - api.getId(), existingDoc.getString("documentId")); + apiUuid, existingDoc.getDocumentId()); } } } else { log.info("There is no any existing api documentation."); } - Documentation createdDoc = publisherRESTAPIServices.addDocumentation(apiApplicationKey, accessTokenInfo, - api.getId(), apiDocumentation); - publisherRESTAPIServices.addDocumentationContent(apiApplicationKey, accessTokenInfo, api, - createdDoc.getId(), docContent); + Documentation createdDoc = publisherRESTAPIServices.addDocumentation(apiApplicationKey, accessTokenInfo, + apiUuid, apiDocumentation); + + publisherRESTAPIServices.addDocumentationContent(apiApplicationKey, accessTokenInfo, apiUuid, + createdDoc.getDocumentId(), docContent); + } } catch (APIManagementException | IOException | APIServicesException | BadRequestException | UnexpectedResponseException e) { @@ -385,15 +406,52 @@ public class APIPublisherServiceImpl implements APIPublisherService { if (!publisherRESTAPIServices.isSharedScopeNameExists(apiApplicationKey, accessTokenInfo, apiScope.getKey())) { Scope scope = new Scope(); - scope.setName(apiScope.getName()); + scope.setName(apiScope.getKey()); scope.setDescription(apiScope.getDescription()); - scope.setKey(apiScope.getKey()); - scope.setRoles(apiScope.getRoles()); + scope.setDisplayName(apiScope.getName()); + List bindings = new ArrayList<>(apiScope.getRoles()); + bindings.add(ADMIN_ROLE_KEY); + scope.setBindings(bindings); publisherRESTAPIServices.addNewSharedScope(apiApplicationKey, accessTokenInfo, scope); } } } + public void addDefaultScopesIfNotExist() { + DeviceManagementConfig deviceManagementConfig = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(); + DefaultPermissions defaultPermissions = deviceManagementConfig.getDefaultPermissions(); + APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); + try { + APIApplicationKey apiApplicationKey = apiApplicationServices.createAndRetrieveApplicationCredentials( + "ClientForPublisherRestCalls", + "client_credentials password refresh_token" + ); + AccessTokenInfo accessTokenInfo = + apiApplicationServices.generateAccessTokenFromRegisteredApplication( + apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); + + PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServicesImpl(); + + Scope scope = new Scope(); + for (DefaultPermission defaultPermission: defaultPermissions.getDefaultPermissions()) { + //todo check whether scope is available or not + ScopeMapping scopeMapping = defaultPermission.getScopeMapping(); + + List bindings = new ArrayList<>( + Arrays.asList(scopeMapping.getDefaultRoles().split(","))); + bindings.add(ADMIN_ROLE_KEY); + scope.setName(scopeMapping.getKey()); + scope.setDescription(scopeMapping.getName()); + scope.setDisplayName(scopeMapping.getName()); + scope.setBindings(bindings); + publisherRESTAPIServices.addNewSharedScope(apiApplicationKey, accessTokenInfo, scope); + } + } catch (BadRequestException | UnexpectedResponseException | APIServicesException e) { + log.error("Error occurred while adding default scopes"); + } + } + + @Override public void updateScopeRoleMapping() throws APIManagerPublisherException { @@ -417,89 +475,110 @@ public class APIPublisherServiceImpl implements APIPublisherService { log.error(errorMsg, e); throw new APIManagerPublisherException(e); } + UserStoreManager userStoreManager; try { for (String tenantDomain : tenants) { PrivilegedCarbonContext.startTenantFlow(); PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(tenantDomain, true); PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServicesImpl(); - JSONObject scopeObject = publisherRESTAPIServices.getScopes(apiApplicationKey, accessTokenInfo); try { String fileName = CarbonUtils.getCarbonConfigDirPath() + File.separator + "etc" + File.separator + tenantDomain + ".csv"; + try { + userStoreManager = APIPublisherDataHolder.getInstance().getUserStoreManager(); + } catch (UserStoreException e) { + log.error("Unable to retrieve user store manager for tenant: " + tenantDomain); + return; + } if (Files.exists(Paths.get(fileName))) { BufferedReader br = new BufferedReader(new FileReader(fileName)); int lineNumber = 0; Map roles = new HashMap<>(); - String line = ""; + Map> rolePermissions = new HashMap<>(); + String line; String splitBy = ","; - while ((line = br.readLine()) != null) //returns a Boolean value - { + while ((line = br.readLine()) != null) { //returns a Boolean value lineNumber++; String[] scopeMapping = line.split(splitBy); // use comma as separator + String role; if (lineNumber == 1) { // skip titles - for (int i = 0; i < scopeMapping.length; i++) { - if (i > 3) { - roles.put(i, scopeMapping[i]); // add roles to the map + for (int i = 4; i < scopeMapping.length; i++) { + role = scopeMapping[i]; + roles.put(i, role); // add roles to the map + if (!"admin".equals(role)) { + try { + if (!userStoreManager.isExistingRole(role)) { + try { + addRole(role); + } catch (UserStoreException e) { + log.error("Error occurred when adding new role: " + role, e); + } + } + } catch (UserStoreException e) { + log.error("Error occurred when checking the existence of role: " + role, e); + } + rolePermissions.put(role, new ArrayList<>()); } } continue; } Scope scope = new Scope(); - scope.setName( + scope.setDisplayName( scopeMapping[0] != null ? StringUtils.trim(scopeMapping[0]) : StringUtils.EMPTY); scope.setDescription( scopeMapping[1] != null ? StringUtils.trim(scopeMapping[1]) : StringUtils.EMPTY); - scope.setKey( + scope.setName( scopeMapping[2] != null ? StringUtils.trim(scopeMapping[2]) : StringUtils.EMPTY); // scope.setPermissions( // scopeMapping[3] != null ? StringUtils.trim(scopeMapping[3]) : StringUtils.EMPTY); + String permission = scopeMapping[3] != null ? StringUtils.trim(scopeMapping[3]) : StringUtils.EMPTY; - String roleString = ""; + List rolesList = new ArrayList<>(); for (int i = 4; i < scopeMapping.length; i++) { if (scopeMapping[i] != null && StringUtils.trim(scopeMapping[i]).equals("Yes")) { - roleString = roleString + "," + roles.get(i); + rolesList.add(roles.get(i)); + if (rolePermissions.containsKey(roles.get(i)) && StringUtils.isNotEmpty(permission)) { + rolePermissions.get(roles.get(i)).add(permission); + } } } - if (roleString.length() > 1) { - roleString = roleString.substring(1); // remove first , (comma) - } - scope.setRoles(roleString); - - //Set scope id which related to the scope key - JSONArray scopeList = (JSONArray) scopeObject.get("list"); - for (int i = 0; i < scopeList.length(); i++) { - JSONObject scopeObj = scopeList.getJSONObject(i); - if (scopeObj.getString("name").equals(scopeMapping[2] != null ? - StringUtils.trim(scopeMapping[2]) : StringUtils.EMPTY)) { - scope.setId(scopeObj.getString("id")); + //Set scope details which related to the scope key + Scope[] scopes = publisherRESTAPIServices.getScopes(apiApplicationKey, accessTokenInfo); + for (int i = 0; i < scopes.length; i++) { + Scope relatedScope = scopes[i]; + if (relatedScope.getName().equals(scopeMapping[2].toString())) { + scope.setId(relatedScope.getId()); + scope.setUsageCount(relatedScope.getUsageCount()); + //Including already existing roles + rolesList.addAll(relatedScope.getBindings()); } } + scope.setBindings(rolesList); - if (publisherRESTAPIServices.isSharedScopeNameExists(apiApplicationKey, accessTokenInfo, scope.getKey())) { + if (publisherRESTAPIServices.isSharedScopeNameExists(apiApplicationKey, accessTokenInfo, scope.getName())) { publisherRESTAPIServices.updateSharedScope(apiApplicationKey, accessTokenInfo, scope); } else { // todo: come to this level means, that scope is removed from API, but haven't removed from the scope-role-permission-mappings list - if (log.isDebugEnabled()) { - log.debug(scope.getKey() + " not available as shared scope"); - } + log.warn(scope.getName() + " not available as shared scope"); + } + } + for (String role : rolePermissions.keySet()) { + try { + updatePermissions(role, rolePermissions.get(role)); + } catch (UserStoreException e) { + log.error("Error occurred when adding permissions to role: " + role, e); } } } } catch (IOException | DirectoryIteratorException ex) { log.error("failed to read scopes from file.", ex); - } catch (APIServicesException | BadRequestException e) { - String errorMsg = "Error while calling APIs"; - log.error(errorMsg, e); - throw new APIManagerPublisherException(e); } - } - } - catch (APIServicesException e) { + } catch (APIServicesException e) { String errorMsg = "Error while processing Publisher REST API response"; log.error(errorMsg, e); throw new APIManagerPublisherException(e); @@ -511,11 +590,153 @@ public class APIPublisherServiceImpl implements APIPublisherService { String errorMsg = "Unexpected response from the server"; log.error(errorMsg, e); throw new APIManagerPublisherException(e); - }finally { + } finally { PrivilegedCarbonContext.endTenantFlow(); } } + @Override + public void updateScopeRoleMapping(String roleName, String[] permissions, String[] removedPermissions) throws APIManagerPublisherException { + APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); + APIApplicationKey apiApplicationKey; + AccessTokenInfo accessTokenInfo; + try { + apiApplicationKey = apiApplicationServices.createAndRetrieveApplicationCredentials( + "ClientForPublisherRestCalls", + "client_credentials password refresh_token" + ); + accessTokenInfo = apiApplicationServices.generateAccessTokenFromRegisteredApplication( + apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); + } catch (APIServicesException e) { + String errorMsg = "Error occurred while generating the API application"; + log.error(errorMsg, e); + throw new APIManagerPublisherException(e); + } + + try { + PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServicesImpl(); + Scope[] scopeList = publisherRESTAPIServices.getScopes(apiApplicationKey, accessTokenInfo); + + Map permScopeMap = APIPublisherDataHolder.getInstance().getPermScopeMapping(); + if (permissions.length != 0) { + updateScopes(roleName, publisherRESTAPIServices, apiApplicationKey, accessTokenInfo, scopeList, permissions, permScopeMap, false); + } + if (removedPermissions.length != 0) { + updateScopes(roleName, publisherRESTAPIServices, apiApplicationKey, accessTokenInfo, scopeList, removedPermissions, permScopeMap, true); + } + + try { + updatePermissions(roleName, Arrays.asList(permissions)); + } catch (UserStoreException e) { + String errorMsg = "Error occurred when adding permissions to role: " + roleName; + log.error(errorMsg, e); + throw new APIManagerPublisherException(errorMsg, e); + } + } catch (APIServicesException e) { + String errorMsg = "Error while processing Publisher REST API response"; + log.error(errorMsg, e); + throw new APIManagerPublisherException(errorMsg, e); + } catch (BadRequestException e) { + String errorMsg = "Error while calling Publisher REST APIs"; + log.error(errorMsg, e); + throw new APIManagerPublisherException(errorMsg, e); + } catch (UnexpectedResponseException e) { + String errorMsg = "Unexpected response from the server"; + log.error(errorMsg, e); + throw new APIManagerPublisherException(errorMsg, e); + } + } + + /** + * Update Scopes + * + * @param roleName Role Name + * @param publisherRESTAPIServices {@link PublisherRESTAPIServices} + * @param apiApplicationKey {@link APIApplicationKey} + * @param accessTokenInfo {@link AccessTokenInfo} + * @param scopeList scope list returning from APIM + * @param permissions List of permissions + * @param permScopeMap Permission Scope map + * @param removingPermissions if list of permissions has to be removed from the role send true, otherwise sends false. + * @throws APIManagerPublisherException If the method receives invalid permission to update. + */ + private void updateScopes (String roleName, PublisherRESTAPIServices publisherRESTAPIServices, + APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, + Scope[] scopeList, String[] permissions, Map permScopeMap, boolean removingPermissions ) + throws APIManagerPublisherException { + for (String permission : permissions) { + String scopeValue = permScopeMap.get(permission); + if (scopeValue == null) { + String msg = "Found invalid permission: " + permission + ". Hence aborting the scope role " + + "mapping process"; + log.error(msg); + throw new APIManagerPublisherException(msg); + } + + for (int i = 0; i < scopeList.length; i++) { + Scope scopeObj = scopeList[i]; + if (scopeObj.getName().equals(scopeValue)) { + Scope scope = new Scope(); + scope.setName(scopeObj.getName()); + scope.setDisplayName(scopeObj.getDisplayName()); + scope.setDescription(scopeObj.getDescription()); + scope.setId(scopeObj.getId()); + + // Including already existing roles + List existingRoleList = new ArrayList<>(); + existingRoleList.addAll(scopeObj.getBindings()); + + if (!existingRoleList.contains(roleName)) { + existingRoleList.add(roleName); + } + + if (removingPermissions) { + existingRoleList.remove(roleName); + } else { + if (!existingRoleList.contains(roleName)) { + existingRoleList.add(roleName); + } + } + scope.setBindings(existingRoleList); + + try { + if (publisherRESTAPIServices.isSharedScopeNameExists(apiApplicationKey, accessTokenInfo, scope.getName())) { + publisherRESTAPIServices.updateSharedScope(apiApplicationKey, accessTokenInfo, scope); + } else { + // todo: come to this level means, that scope is removed from API, but haven't removed from the scope-role-permission-mappings list + log.warn(scope.getName() + " not available as shared scope"); + } + } catch (APIServicesException | BadRequestException | UnexpectedResponseException e) { + log.error("Error occurred while updating role scope mapping via APIM REST endpoint.", e); + } + break; + } + } + } + } + + private void updatePermissions(String role, List permissions) throws UserStoreException { + AuthorizationManager authorizationManager = APIPublisherDataHolder.getInstance().getUserRealm() + .getAuthorizationManager(); + if (log.isDebugEnabled()) { + log.debug("Updating the role '" + role + "'"); + } + if (permissions != null && !permissions.isEmpty()) { + authorizationManager.clearRoleAuthorization(role); + for (String permission : permissions) { + authorizationManager.authorizeRole(role, permission, CarbonConstants.UI_PERMISSION_ACTION); + } + } + } + + private void addRole(String role) throws UserStoreException { + UserStoreManager userStoreManager = APIPublisherDataHolder.getInstance().getUserStoreManager(); + if (log.isDebugEnabled()) { + log.debug("Persisting the role " + role + " in the underlying user store"); + } + userStoreManager.addRole(role, new String[]{"admin"}, new Permission[0]); + } + private APIInfo getAPI(APIConfig config, boolean includeScopes) { APIInfo apiInfo = new APIInfo(); @@ -535,57 +756,57 @@ public class APIPublisherServiceImpl implements APIPublisherService { apiInfo.setRevisionedApiId(null); apiInfo.setEnableSchemaValidation(false); - Set tags = new HashSet<>(); + List tags = new ArrayList<>(); tags.addAll(Arrays.asList(config.getTags())); apiInfo.setTags(tags); - Set availableTiers = new HashSet<>(); + List availableTiers = new ArrayList<>(); if (config.getEndpointType() != null && "WS".equals(config.getEndpointType())) { availableTiers.add(WS_UNLIMITED_TIER); } else { availableTiers.add(UNLIMITED_TIER); } apiInfo.setPolicies(availableTiers); + apiInfo.setApiThrottlingPolicy(UNLIMITED_TIER); - if (config.getEndpointType() == null) { - List operations = new ArrayList(); - List scopeSet = new ArrayList(); - Iterator iterator; - for (iterator = config.getUriTemplates().iterator(); iterator.hasNext(); ) { - ApiUriTemplate apiUriTemplate = iterator.next(); - JSONObject operation = new JSONObject(); - operation.put("target", apiUriTemplate.getUriTemplate()); - operation.put("verb", apiUriTemplate.getHttpVerb()); - operation.put("authType", apiUriTemplate.getAuthType()); - operation.put("throttlingPolicy", UNLIMITED_TIER); - if (includeScopes) { - if (apiUriTemplate.getScope() != null) { - String scopeString = "{\n" + - " \"scope\": {\n" + - " \"id\": null,\n" + - " \"name\": \"" + apiUriTemplate.getScope().getKey() + "\",\n" + - " \"displayName\": \"" + apiUriTemplate.getScope().getName() + "\",\n" + - " \"description\": \"" + apiUriTemplate.getScope().getDescription() + "\",\n" + - " \"bindings\": [\n" + - " \"" + apiUriTemplate.getScope().getRoles() + "\"\n" + - " ],\n" + - " \"usageCount\": null\n" + - " },\n" + - " \"shared\": true\n" + - " }"; - JSONObject scope = new JSONObject(scopeString); - scopeSet.add(scope); + //set operations and scopes + List operations = new ArrayList(); + List scopeSet = new ArrayList(); + Iterator iterator; - Set scopes = new HashSet<>(); - scopes.add(apiUriTemplate.getScope().getKey()); - operation.put("scopes", scopes); - } + for (iterator = config.getUriTemplates().iterator(); iterator.hasNext(); ) { + ApiUriTemplate apiUriTemplate = iterator.next(); + Operations operation = new Operations(); + operation.setTarget(apiUriTemplate.getUriTemplate()); + operation.setVerb(apiUriTemplate.getHttpVerb()); + operation.setAuthType(apiUriTemplate.getAuthType()); + operation.setThrottlingPolicy(UNLIMITED_TIER); + operation.setUriMapping(apiUriTemplate.getUriMapping()); + if (includeScopes) { + if (apiUriTemplate.getScope() != null) { + Scope scope = new Scope(); + scope.setName(apiUriTemplate.getScope().getKey()); + scope.setDisplayName(apiUriTemplate.getScope().getName()); + scope.setDescription(apiUriTemplate.getScope().getDescription()); + List bindings = new ArrayList<>(apiUriTemplate.getScope().getRoles()); + bindings.add(ADMIN_ROLE_KEY); + scope.setBindings(bindings); + + JSONObject scopeObject = new JSONObject(); + scopeObject.put("scope", new JSONObject(gson.toJson(scope))); + scopeObject.put("shared", true); + + scopeSet.add(scopeObject); + + List scopes = new ArrayList<>(); + scopes.addAll(Arrays.asList(apiUriTemplate.getScope().getKey())); + operation.setScopes(scopes); } - operations.add(operation); } - apiInfo.setScopes(scopeSet); - apiInfo.setOperations(operations); + operations.add(operation); } + apiInfo.setScopes(scopeSet); + apiInfo.setOperations(operations); if (config.isSharedWithAllTenants()) { apiInfo.setSubscriptionAvailability(SUBSCRIPTION_TO_ALL_TENANTS); @@ -607,15 +828,15 @@ public class APIPublisherServiceImpl implements APIPublisherService { " }"; JSONObject endPointConfig = new JSONObject(endpointConfig); - Set transports = new HashSet<>(); - transports.addAll(Arrays.asList(config.getTransports())); + List transports = new ArrayList<>(); + transports.addAll(Arrays.asList(config.getTransports().split(","))); apiInfo.setTransport(transports); apiInfo.setType("HTTP"); if (config.getEndpointType() != null && "dynamic".equals(config.getEndpointType())) { endpointConfig = "{\n" + - " \"endpoint_type\": \"http\",\n" + + " \"endpoint_type\": \"default\",\n" + " \"sandbox_endpoints\": {\n" + " \"url\": \" default \"\n" + " },\n" + @@ -624,13 +845,12 @@ public class APIPublisherServiceImpl implements APIPublisherService { " }\n" + " }"; endPointConfig = new JSONObject(endpointConfig); - //TODO: Will be used in dynamic endpoints -// apiInfo.setInSequence(config.getInSequenceName()); + apiInfo.setEndpointImplementationType("ENDPOINT"); } // if ws endpoint if (config.getEndpointType() != null && "WS".equals(config.getEndpointType())) { - endpointConfig = "{\n" + + endpointConfig = "{\n" + " \"endpoint_type\": \"ws\",\n" + " \"sandbox_endpoints\": {\n" + " \"url\": \"" + config.getEndpoint() + "\"\n" + @@ -641,7 +861,8 @@ public class APIPublisherServiceImpl implements APIPublisherService { " }"; endPointConfig = new JSONObject(endpointConfig); - transports.addAll(Arrays.asList("wss,ws")); + transports.add("wss"); + transports.add("ws"); apiInfo.setTransport(transports); apiInfo.setType("WS"); } @@ -675,44 +896,22 @@ public class APIPublisherServiceImpl implements APIPublisherService { apiInfo.setEnableSchemaValidation(false); apiInfo.setMonetization(null); apiInfo.setServiceInfo(null); + apiInfo.setWebsubSubscriptionConfiguration(null); + apiInfo.setAdvertiseInfo(null); return apiInfo; + } - //TODO: Will be used in WS or dynamic endpoints -// if (config.getEndpointType() != null && "WS".equals(config.getEndpointType())) { -// api.setAsyncApiDefinition(config.getAsyncApiDefinition()); -// AsyncApiParser asyncApiParser = new AsyncApiParser(); -// try { -// api.setUriTemplates(asyncApiParser.getURITemplates(config.getAsyncApiDefinition(), true)); -// } catch (APIManagementException e) { -// -// } -// api.setWsUriMapping(asyncApiParser.buildWSUriMapping(config.getAsyncApiDefinition())); -// } else { -// api.setSwaggerDefinition(APIPublisherUtil.getSwaggerDefinition(config)); -// -// Set uriTemplates = new HashSet<>(); -// Iterator iterator; -// for (iterator = config.getUriTemplates().iterator(); iterator.hasNext(); ) { -// ApiUriTemplate apiUriTemplate = iterator.next(); -// URITemplate uriTemplate = new URITemplate(); -// uriTemplate.setAuthType(apiUriTemplate.getAuthType()); -// uriTemplate.setHTTPVerb(apiUriTemplate.getHttpVerb()); -// uriTemplate.setResourceURI(apiUriTemplate.getResourceURI()); -// uriTemplate.setUriTemplate(apiUriTemplate.getUriTemplate()); -// if (includeScopes) { -// Scope scope = new Scope(); -// if (apiUriTemplate.getScope() != null) { -// scope.setName(apiUriTemplate.getScope().getName()); -// scope.setDescription(apiUriTemplate.getScope().getDescription()); -// scope.setKey(apiUriTemplate.getScope().getKey()); -// scope.setRoles(apiUriTemplate.getScope().getRoles()); -// uriTemplate.setScopes(scope); -// } -// } -// uriTemplates.add(uriTemplate); -// } -// api.setUriTemplates(uriTemplates); -// } + /** + * This method will construct the permission scope mapping hash map. This will call in each API publish call. + * @param scopes API Scopes + */ + private void constructPemScopeMap(Set scopes) { + APIPublisherDataHolder apiPublisherDataHolder = APIPublisherDataHolder.getInstance(); + Map permScopeMap = apiPublisherDataHolder.getPermScopeMapping(); + for (ApiScope scope : scopes) { + permScopeMap.put(scope.getPermissions(), scope.getKey()); + } + apiPublisherDataHolder.setPermScopeMapping(permScopeMap); } } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherStartupHandler.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherStartupHandler.java index 55a1733498..4d8835463e 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherStartupHandler.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/APIPublisherStartupHandler.java @@ -86,6 +86,7 @@ public class APIPublisherStartupHandler implements ServerStartupObserver { try { publisher.updateScopeRoleMapping(); + publisher.addDefaultScopesIfNotExist(); } catch (APIManagerPublisherException e) { log.error("failed to update scope role mapping.", e); } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/dto/ApiScope.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/dto/ApiScope.java index 5d178a0eb3..ea5f6d3047 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/dto/ApiScope.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/dto/ApiScope.java @@ -18,11 +18,13 @@ package io.entgra.device.mgt.core.apimgt.webapp.publisher.dto; +import java.util.List; + public class ApiScope { String key; String name; - String roles; + List roles; String permissions; String description; int id; @@ -46,11 +48,11 @@ public class ApiScope { this.name = name; } - public String getRoles() { + public List getRoles() { return this.roles; } - public void setRoles(String roles) { + public void setRoles(List roles) { this.roles = roles; } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/exception/APIManagerPublisherException.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/exception/APIManagerPublisherException.java index 47e28aefb9..281fdbbf16 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/exception/APIManagerPublisherException.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/exception/APIManagerPublisherException.java @@ -28,4 +28,12 @@ public class APIManagerPublisherException extends Exception { public APIManagerPublisherException(Throwable cause) { super(cause); } + + public APIManagerPublisherException(String errorMessage) { + super(errorMessage); + } + + public APIManagerPublisherException(String errorMessage, Throwable cause) { + super(errorMessage, cause); + } } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/internal/APIPublisherDataHolder.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/internal/APIPublisherDataHolder.java index bc7b8af32c..0d67edc7a9 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/internal/APIPublisherDataHolder.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/internal/APIPublisherDataHolder.java @@ -19,11 +19,19 @@ package io.entgra.device.mgt.core.apimgt.webapp.publisher.internal; import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIConfig; import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherService; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.registry.core.service.RegistryService; +import org.wso2.carbon.user.api.UserRealm; +import org.wso2.carbon.user.api.UserStoreException; +import org.wso2.carbon.user.api.UserStoreManager; import org.wso2.carbon.user.core.service.RealmService; import org.wso2.carbon.user.core.tenant.TenantManager; import org.wso2.carbon.utils.ConfigurationContextService; +import java.util.HashMap; +import java.util.Map; import java.util.Stack; public class APIPublisherDataHolder { @@ -35,6 +43,10 @@ public class APIPublisherDataHolder { private RegistryService registryService; private boolean isServerStarted; private Stack unpublishedApis = new Stack<>(); + private Map permScopeMapping; + + private MetadataManagementService metadataManagementService; + private static APIPublisherDataHolder thisInstance = new APIPublisherDataHolder(); private APIPublisherDataHolder() { @@ -79,6 +91,25 @@ public class APIPublisherDataHolder { realmService.getTenantManager() : null); } + public UserStoreManager getUserStoreManager() throws UserStoreException { + if (realmService == null) { + String msg = "Realm service has not initialized."; + throw new IllegalStateException(msg); + } + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return realmService.getTenantUserRealm(tenantId).getUserStoreManager(); + } + + public UserRealm getUserRealm() throws UserStoreException { + UserRealm realm; + if (realmService == null) { + throw new IllegalStateException("Realm service not initialized"); + } + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + realm = realmService.getTenantUserRealm(tenantId); + return realm; + } + private void setTenantManager(TenantManager tenantManager) { this.tenantManager = tenantManager; } @@ -114,4 +145,15 @@ public class APIPublisherDataHolder { this.unpublishedApis = unpublishedApis; } + public Map getPermScopeMapping() {return permScopeMapping;} + + public void setPermScopeMapping(Map permScopeMapping) {this.permScopeMapping = permScopeMapping;} + + public MetadataManagementService getMetadataManagementService() { + return metadataManagementService; + } + + public void setMetadataManagementService(MetadataManagementService metadataManagementService) { + this.metadataManagementService = metadataManagementService; + } } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/internal/APIPublisherServiceComponent.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/internal/APIPublisherServiceComponent.java index df71dcb231..d2aa464136 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/internal/APIPublisherServiceComponent.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/internal/APIPublisherServiceComponent.java @@ -17,19 +17,22 @@ */ package io.entgra.device.mgt.core.apimgt.webapp.publisher.internal; -import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherService; -import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherServiceImpl; -import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherStartupHandler; -import io.entgra.device.mgt.core.apimgt.webapp.publisher.config.WebappPublisherConfig; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; +import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherService; +import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherServiceImpl; +import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherStartupHandler; +import io.entgra.device.mgt.core.apimgt.webapp.publisher.config.WebappPublisherConfig; import org.osgi.service.component.annotations.*; import org.wso2.carbon.core.ServerStartupObserver; import org.wso2.carbon.registry.core.service.RegistryService; import org.wso2.carbon.user.core.service.RealmService; +import java.util.HashMap; + @Component( name = "io.entgra.device.mgt.core.apimgt.webapp.publisher.internal.APIPublisherServiceComponent", immediate = true) @@ -52,6 +55,7 @@ public class APIPublisherServiceComponent { /* Registering declarative service instances exposed by DeviceManagementServiceComponent */ this.registerServices(componentContext); + APIPublisherDataHolder.getInstance().setPermScopeMapping(new HashMap<>()); if (log.isDebugEnabled()) { log.debug("Webapp publisher bundle has been successfully initialized"); @@ -116,4 +120,21 @@ public class APIPublisherServiceComponent { APIPublisherDataHolder.getInstance().setRegistryService(null); } + @Reference( + name = "io.entgra.meta.mgt", + service = io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService.class, + cardinality = ReferenceCardinality.OPTIONAL, + policy = ReferencePolicy.DYNAMIC, + unbind = "unsetMetaDataMgtService") + protected void setMetaDataMgtService(MetadataManagementService metadataManagementService) { + if (metadataManagementService != null && log.isDebugEnabled()) { + log.debug("Meta data mgt mgt service initialized"); + } + APIPublisherDataHolder.getInstance().setMetadataManagementService(metadataManagementService); + } + + protected void unsetMetaDataMgtService(MetadataManagementService metadataManagementService) { + APIPublisherDataHolder.getInstance().setMetadataManagementService(null); + } + } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/lifecycle/listener/APIPublisherLifecycleListener.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/lifecycle/listener/APIPublisherLifecycleListener.java index da503fc4d7..6e39f0e940 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/lifecycle/listener/APIPublisherLifecycleListener.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/lifecycle/listener/APIPublisherLifecycleListener.java @@ -17,6 +17,21 @@ */ package io.entgra.device.mgt.core.apimgt.webapp.publisher.lifecycle.listener; +import com.google.gson.Gson; +import io.entgra.device.mgt.core.apimgt.webapp.publisher.dto.ApiScope; +import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService; +import io.entgra.device.mgt.core.device.mgt.core.config.DeviceConfigurationManager; +import io.entgra.device.mgt.core.device.mgt.core.config.DeviceManagementConfig; +import io.entgra.device.mgt.core.device.mgt.core.config.permission.DefaultPermission; +import io.entgra.device.mgt.core.device.mgt.core.config.permission.DefaultPermissions; +import org.apache.catalina.Lifecycle; +import org.apache.catalina.LifecycleEvent; +import org.apache.catalina.LifecycleListener; +import org.apache.catalina.core.StandardContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIConfig; import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherService; import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherUtil; @@ -35,7 +50,9 @@ import org.wso2.carbon.user.api.UserStoreException; import javax.servlet.ServletContext; import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; @SuppressWarnings("unused") @@ -49,68 +66,123 @@ public class APIPublisherLifecycleListener implements LifecycleListener { @Override public void lifecycleEvent(LifecycleEvent lifecycleEvent) { - if (Lifecycle.AFTER_START_EVENT.equals(lifecycleEvent.getType()) && WebappPublisherConfig.getInstance() - .isPublished()) { - StandardContext context = (StandardContext) lifecycleEvent.getLifecycle(); - ServletContext servletContext = context.getServletContext(); - String param = servletContext.getInitParameter(PARAM_MANAGED_API_ENABLED); - boolean isManagedApi = (param != null && !param.isEmpty()) && Boolean.parseBoolean(param); + if (Lifecycle.AFTER_START_EVENT.equals(lifecycleEvent.getType()) ) { + if (WebappPublisherConfig.getInstance() + .isPublished()) { + StandardContext context = (StandardContext) lifecycleEvent.getLifecycle(); + ServletContext servletContext = context.getServletContext(); + String param = servletContext.getInitParameter(PARAM_MANAGED_API_ENABLED); + boolean isManagedApi = (param != null && !param.isEmpty()) && Boolean.parseBoolean(param); - String profile = System.getProperty(PROPERTY_PROFILE); - if (WebappPublisherConfig.getInstance().getProfiles().getProfile().contains(profile.toLowerCase()) - && isManagedApi) { - try { - AnnotationProcessor annotationProcessor = new AnnotationProcessor(context); - Set annotatedSwaggerAPIClasses = annotationProcessor. - scanStandardContext(io.swagger.annotations.SwaggerDefinition.class.getName()); - List apiDefinitions = annotationProcessor.extractAPIInfo(servletContext, - annotatedSwaggerAPIClasses); - for (APIResourceConfiguration apiDefinition : apiDefinitions) { - APIConfig apiConfig = APIPublisherUtil.buildApiConfig(servletContext, apiDefinition); - APIPublisherUtil.setResourceAuthTypes(servletContext,apiConfig); - try { - int tenantId = APIPublisherDataHolder.getInstance().getTenantManager(). - getTenantId(apiConfig.getTenantDomain()); + String profile = System.getProperty(PROPERTY_PROFILE); + if (WebappPublisherConfig.getInstance().getProfiles().getProfile().contains(profile.toLowerCase()) + && isManagedApi) { + try { + AnnotationProcessor annotationProcessor = new AnnotationProcessor(context); + Set annotatedSwaggerAPIClasses = annotationProcessor. + scanStandardContext(io.swagger.annotations.SwaggerDefinition.class.getName()); + List apiDefinitions = annotationProcessor.extractAPIInfo(servletContext, + annotatedSwaggerAPIClasses); - boolean isTenantActive = APIPublisherDataHolder.getInstance(). - getTenantManager().isTenantActive(tenantId); - if (isTenantActive) { - boolean isServerStarted = APIPublisherDataHolder.getInstance().isServerStarted(); - if (isServerStarted) { - APIPublisherService apiPublisherService = - APIPublisherDataHolder.getInstance().getApiPublisherService(); - if (apiPublisherService == null) { - throw new IllegalStateException( - "API Publisher service is not initialized properly"); - } - apiPublisherService.publishAPI(apiConfig); - } else { - if (log.isDebugEnabled()) { - log.debug("Server has not started yet. Hence adding API '" + - apiConfig.getName() + "' to the queue"); - } - APIPublisherDataHolder.getInstance().getUnpublishedApis().push(apiConfig); - } - } else { - log.error("No tenant [" + apiConfig.getTenantDomain() + "] " + - "found when publishing the Web app"); - } - } catch (Throwable e) { - log.error("Error occurred while publishing API '" + apiConfig.getName() + - "' with the context '" + apiConfig.getContext() + - "' and version '" + apiConfig.getVersion() + "'", e); + APIPublisherDataHolder apiPublisherDataHolder = APIPublisherDataHolder.getInstance(); + MetadataManagementService metadataManagementService = + apiPublisherDataHolder.getMetadataManagementService(); + Metadata metadata = metadataManagementService.retrieveMetadata("perm-scope-mapping"); + if (metadata != null) { + HashMap permScopeMapping = + new Gson().fromJson(metadata.getMetaValue().toString(), HashMap.class); + apiPublisherDataHolder.setPermScopeMapping(permScopeMapping); } + + Map permScopeMap = apiPublisherDataHolder.getPermScopeMapping(); + for (APIResourceConfiguration apiDefinition : apiDefinitions) { + APIConfig apiConfig = APIPublisherUtil.buildApiConfig(servletContext, apiDefinition); + for (ApiScope scope : apiConfig.getScopes()) { + permScopeMap.put(scope.getPermissions(), scope.getKey()); + } + APIPublisherUtil.setResourceAuthTypes(servletContext,apiConfig); + try { + int tenantId = APIPublisherDataHolder.getInstance().getTenantManager(). + getTenantId(apiConfig.getTenantDomain()); + + boolean isTenantActive = APIPublisherDataHolder.getInstance(). + getTenantManager().isTenantActive(tenantId); + if (isTenantActive) { + boolean isServerStarted = APIPublisherDataHolder.getInstance().isServerStarted(); + if (isServerStarted) { + APIPublisherService apiPublisherService = + APIPublisherDataHolder.getInstance().getApiPublisherService(); + if (apiPublisherService == null) { + throw new IllegalStateException( + "API Publisher service is not initialized properly"); + } + apiPublisherService.publishAPI(apiConfig); + } else { + if (log.isDebugEnabled()) { + log.debug("Server has not started yet. Hence adding API '" + + apiConfig.getName() + "' to the queue"); + } + APIPublisherDataHolder.getInstance().getUnpublishedApis().push(apiConfig); + } + } else { + log.error("No tenant [" + apiConfig.getTenantDomain() + "] " + + "found when publishing the Web app"); + } + } catch (Throwable e) { + log.error("Error occurred while publishing API '" + apiConfig.getName() + + "' with the context '" + apiConfig.getContext() + + "' and version '" + apiConfig.getVersion() + "'", e); + } + } + + Metadata existingMetaData = metadataManagementService.retrieveMetadata("perm-scope" + + "-mapping"); + if (existingMetaData != null) { + existingMetaData.setMetaValue(new Gson().toJson(permScopeMap)); + metadataManagementService.updateMetadata(existingMetaData); + } else { + Metadata newMetaData = new Metadata(); + newMetaData.setMetaKey("perm-scope-mapping"); + + DeviceManagementConfig deviceManagementConfig = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(); + DefaultPermissions defaultPermissions = deviceManagementConfig.getDefaultPermissions(); + + for (DefaultPermission defaultPermission : defaultPermissions.getDefaultPermissions()) { + permScopeMap.put(defaultPermission.getName(), defaultPermission.getScopeMapping().getKey()); + } + newMetaData.setMetaValue(new Gson().toJson(permScopeMap)); + metadataManagementService.createMetadata(newMetaData); + } + apiPublisherDataHolder.setPermScopeMapping(permScopeMap); + } catch (IOException e) { + log.error("Error encountered while discovering annotated classes", e); + } catch (ClassNotFoundException e) { + log.error("Error while scanning class for annotations", e); + } catch (UserStoreException e) { + log.error("Error while retrieving tenant admin user for the tenant domain" + + PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(), e); + } catch (Throwable e) { + // This is done to stop tomcat failure if a webapp failed to publish apis. + log.error("Failed to Publish api from " + servletContext.getContextPath(), e); } - } catch (IOException e) { - log.error("Error encountered while discovering annotated classes", e); - } catch (ClassNotFoundException e) { - log.error("Error while scanning class for annotations", e); - } catch (UserStoreException e) { - log.error("Error while retrieving tenant admin user for the tenant domain" - + PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(), e); - } catch (Throwable e) { - // This is done to stop tomcat failure if a webapp failed to publish apis. - log.error("Failed to Publish api from " + servletContext.getContextPath(), e); + } + } else { + APIPublisherDataHolder apiPublisherDataHolder = APIPublisherDataHolder.getInstance(); + MetadataManagementService metadataManagementService = + apiPublisherDataHolder.getMetadataManagementService(); + try { + Metadata existingMetaData = metadataManagementService.retrieveMetadata("perm-scope" + + "-mapping"); + if (existingMetaData != null) { + existingMetaData.setMetaValue(new Gson().toJson(apiPublisherDataHolder.getPermScopeMapping() + )); + metadataManagementService.updateMetadata(existingMetaData); + } else { + log.error("Couldn't find 'perm-scope-mapping' Meta entry while API publishing has been turned" + + " off."); + } + } catch (MetadataManagementException e) { + log.error("Failed to Load Meta-Mgt data.", e); } } } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java index 4a085ff715..ffc1e2f7e7 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/main/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java @@ -54,7 +54,7 @@ public class AnnotationProcessor { private static final String PACKAGE_ORG_APACHE = "org.apache"; private static final String PACKAGE_ORG_CODEHAUS = "org.codehaus"; private static final String PACKAGE_ORG_SPRINGFRAMEWORK = "org.springframework"; - public static final String WILD_CARD = "/*"; + public static final String WILD_CARD = "/"; private static final String SWAGGER_ANNOTATIONS_INFO = "info"; private static final String SWAGGER_ANNOTATIONS_TAGS = "tags"; private static final String SWAGGER_ANNOTATIONS_EXTENSIONS = "extensions"; @@ -77,7 +77,7 @@ public class AnnotationProcessor { private static final String ANNOTATIONS_SCOPES = "scopes"; private static final String ANNOTATIONS_SCOPE = "scope"; private static final String DEFAULT_SCOPE_NAME = "default admin scope"; - private static final String DEFAULT_SCOPE_KEY = "perm:admin"; + private static final String DEFAULT_SCOPE_KEY = "dm:admin"; private static final String DEFAULT_SCOPE_PERMISSION = "/permision/device-mgt"; private static final String DEFAULT_SCOPE_ROLE = "admin"; @@ -219,10 +219,9 @@ public class AnnotationProcessor { String permissions[]; StringBuilder aggregatedPermissions; String roles[]; - StringBuilder aggregatedRoles; + List aggregatedRoles; for (int i = 0; i < annotatedScopes.length; i++) { aggregatedPermissions = new StringBuilder(); - aggregatedRoles = new StringBuilder(); methodHandler = Proxy.getInvocationHandler(annotatedScopes[i]); scope = new ApiScope(); scope.setName(invokeMethod(scopeClass @@ -241,11 +240,8 @@ public class AnnotationProcessor { scope.setPermissions(aggregatedPermissions.toString().trim()); roles = (String[]) methodHandler.invoke(annotatedScopes[i], scopeClass .getMethod(SWAGGER_ANNOTATIONS_PROPERTIES_ROLES, null), null); - for (String role : roles) { - aggregatedRoles.append(role); - aggregatedRoles.append(","); - } - scope.setRoles(aggregatedRoles.substring(0, aggregatedRoles.lastIndexOf(","))); + aggregatedRoles = Arrays.asList(roles); + scope.setRoles(aggregatedRoles); scopes.put(scope.getKey(), scope); } return scopes; @@ -296,11 +292,13 @@ public class AnnotationProcessor { // } else { // log.warn("Scope is not defined for '" + makeContextURLReady(resourceRootContext) + // makeContextURLReady(subCtx) + "' endpoint, hence assigning the default scope"); +// List roles = new ArrayList<>(); +// roles.add(DEFAULT_SCOPE_ROLE); // scope = new ApiScope(); // scope.setName(DEFAULT_SCOPE_NAME); // scope.setDescription(DEFAULT_SCOPE_NAME); // scope.setKey(DEFAULT_SCOPE_KEY); -// scope.setRoles(DEFAULT_SCOPE_ROLE); +// scope.setRoles(roles); // scope.setPermissions(DEFAULT_SCOPE_PERMISSION); // resource.setScope(scope); // } @@ -534,11 +532,13 @@ public class AnnotationProcessor { } else { // log.warn("Scope is not defined for '" + makeContextURLReady(resourceRootContext) + // makeContextURLReady(subCtx) + "' endpoint, hence assigning the default scope"); + List roles = new ArrayList<>(); + roles.add(DEFAULT_SCOPE_ROLE); scope = new ApiScope(); scope.setName(DEFAULT_SCOPE_NAME); scope.setDescription(DEFAULT_SCOPE_NAME); scope.setKey(DEFAULT_SCOPE_KEY); - scope.setRoles(DEFAULT_SCOPE_ROLE); + scope.setRoles(roles); scope.setPermissions(DEFAULT_SCOPE_PERMISSION); apiResource.setScope(scope); } diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/test/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/utils/TestUtils.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/test/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/utils/TestUtils.java index 0161c5cef5..85f0d520f9 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/test/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/utils/TestUtils.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/src/test/java/io/entgra/device/mgt/core/apimgt/webapp/publisher/utils/TestUtils.java @@ -37,9 +37,9 @@ public class TestUtils { template.setResourceURI("https://localhost:9443/api/device-mgt/windows/v1.0/admin/devices/reboot"); template.setUriTemplate(uriTemplate); ApiScope scope = new ApiScope(); - scope.setKey("perm:windows:reboot"); + scope.setKey("win:ops:reboot"); scope.setName("Reboot"); - scope.setRoles("/permission/admin/device-mgt/devices/owning-device/operations/windows/reboot"); + scope.setPermissions("/permission/admin/device-mgt/devices/owning-device/operations/windows/reboot"); scope.setDescription("Lock reset on Windows devices"); template.setScope(scope); uriTemplates.add(template); diff --git a/components/apimgt-extensions/pom.xml b/components/apimgt-extensions/pom.xml index 48514dd429..e9e07fb3b9 100644 --- a/components/apimgt-extensions/pom.xml +++ b/components/apimgt-extensions/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core io.entgra.device.mgt.core.parent - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../../pom.xml diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/pom.xml b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/pom.xml index 7925c9e662..74d2f7aecf 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/pom.xml +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/pom.xml @@ -21,7 +21,7 @@ io.entgra.device.mgt.core application-mgt - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DepConfig.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DepConfig.java new file mode 100644 index 0000000000..244f88fb08 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DepConfig.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.application.mgt.common; + +public class DepConfig { + + private String agentPackageName; + private String consumerKey; + private String consumerSecret; + private String accessToken; + private String accessSecret; + private String accessTokenExpiry; + private String vppToken; + + public String getAgentPackageName() { + return agentPackageName; + } + + public void setAgentPackageName(String agentPackageName) { + this.agentPackageName = agentPackageName; + } + + public String getConsumerKey() { + return consumerKey; + } + + public void setConsumerKey(String consumerKey) { + this.consumerKey = consumerKey; + } + + public String getConsumerSecret() { + return consumerSecret; + } + + public void setConsumerSecret(String consumerSecret) { + this.consumerSecret = consumerSecret; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getVppToken() { + return vppToken; + } + + public void setVppToken(String vppToken) { + this.vppToken = vppToken; + } + + public String getAccessSecret() { + return accessSecret; + } + + public void setAccessSecret(String accessSecret) { + this.accessSecret = accessSecret; + } + + public String getAccessTokenExpiry() { + return accessTokenExpiry; + } + + public void setAccessTokenExpiry(String accessTokenExpiry) { + this.accessTokenExpiry = accessTokenExpiry; + } +} diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/ItuneAppDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/ItuneAppDTO.java new file mode 100644 index 0000000000..a76a9ec12b --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/ItuneAppDTO.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.application.mgt.common.dto; + +public class ItuneAppDTO { + int id; + String packageName; + String version; + String description; + String title; + String paymentMethod; + String iconURL; + String category; + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getIconURL() { + return iconURL; + } + + public void setIconURL(String iconURL) { + this.iconURL = iconURL; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getPaymentMethod() { + return paymentMethod; + } + + public void setPaymentMethod(String paymentMethod) { + this.paymentMethod = paymentMethod; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/public/css/devicetype.css b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/ProxyResponse.java similarity index 56% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/public/css/devicetype.css rename to components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/ProxyResponse.java index 30c7b95769..80d5f94df1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/public/css/devicetype.css +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/ProxyResponse.java @@ -15,29 +15,23 @@ * specific language governing permissions and limitations * under the License. */ +package io.entgra.device.mgt.core.application.mgt.common.dto; +public class ProxyResponse { + private int code; + private String data; + private String executorResponse; -.dontfloat { - clear:both; -} + public int getCode() { return code; } -.hidden-div { - display: none; -} + public void setCode(int code) { this.code = code; } -.hidden-input { - display: none; -} + public String getData() { return data; } -.event-wrapper{ - margin-top: 10px; -} + public void setData(String data) { this.data = data; } -.wr-btn-horizontal{ - padding: 7px 10px; -} + public String getExecutorResponse() { return executorResponse; } -.wr-btn-secondary{ - background-color: #617d8b; + public void setExecutorResponse(String executorResponse) { this.executorResponse = executorResponse; } } \ No newline at end of file diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppAssetDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppAssetDTO.java new file mode 100644 index 0000000000..1ce0d3c3cf --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppAssetDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.application.mgt.common.dto; + +public class VppAssetDTO extends VppItuneAssetDTO { + int id; + int appId; + int tenantId; + String createdTime; + String lastUpdatedTime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getAppId() { + return appId; + } + + public void setAppId(int appId) { + this.appId = appId; + } + + public int getTenantId() { + return tenantId; + } + + public void setTenantId(int tenantId) { + this.tenantId = tenantId; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public String getLastUpdatedTime() { + return lastUpdatedTime; + } + + public void setLastUpdatedTime(String lastUpdatedTime) { + this.lastUpdatedTime = lastUpdatedTime; + } + +} \ No newline at end of file diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppAssociationDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppAssociationDTO.java new file mode 100644 index 0000000000..b2178febfa --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppAssociationDTO.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.application.mgt.common.dto; + +public class VppAssociationDTO { + int id; + String adamId; + String clientUserId; + String pricingParam; + String associationType; + + int assetId; + int clientId; + int tenantId; + String createdTime; + String lastUpdatedTime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getAdamId() { + return adamId; + } + + public void setAdamId(String adamId) { + this.adamId = adamId; + } + + public String getClientUserId() { + return clientUserId; + } + + public void setClientUserId(String clientUserId) { + this.clientUserId = clientUserId; + } + + public String getPricingParam() { + return pricingParam; + } + + public void setPricingParam(String pricingParam) { + this.pricingParam = pricingParam; + } + + public String getAssociationType() { + return associationType; + } + + public void setAssociationType(String associationType) { + this.associationType = associationType; + } + + public int getAssetId() { + return assetId; + } + + public void setAssetId(int assetId) { + this.assetId = assetId; + } + + public int getClientId() { + return clientId; + } + + public void setClientId(int clientId) { + this.clientId = clientId; + } + + public int getTenantId() { + return tenantId; + } + + public void setTenantId(int tenantId) { + this.tenantId = tenantId; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public String getLastUpdatedTime() { + return lastUpdatedTime; + } + + public void setLastUpdatedTime(String lastUpdatedTime) { + this.lastUpdatedTime = lastUpdatedTime; + } + +} \ No newline at end of file diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppItuneAssetDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppItuneAssetDTO.java new file mode 100644 index 0000000000..71e9429c68 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppItuneAssetDTO.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the String LicenseString ); 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 + * String AS ISString BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.application.mgt.common.dto; + +import java.util.List; + +public class VppItuneAssetDTO { + + + String adamId; + String assignedCount; + String availableCount; + String deviceAssignable; + String pricingParam; + String productType; + String retiredCount; + String revocable; + + List supportedPlatforms; + + public List getSupportedPlatforms() { + return supportedPlatforms; + } + + public void setSupportedPlatforms(List supportedPlatforms) { + this.supportedPlatforms = supportedPlatforms; + } + + public String getAdamId() { + return adamId; + } + + public void setAdamId(String adamId) { + this.adamId = adamId; + } + + public String getAssignedCount() { + return assignedCount; + } + + public void setAssignedCount(String assignedCount) { + this.assignedCount = assignedCount; + } + + public String getAvailableCount() { + return availableCount; + } + + public void setAvailableCount(String availableCount) { + this.availableCount = availableCount; + } + + public String getDeviceAssignable() { + return deviceAssignable; + } + + public void setDeviceAssignable(String deviceAssignable) { + this.deviceAssignable = deviceAssignable; + } + + public String getPricingParam() { + return pricingParam; + } + + public void setPricingParam(String pricingParam) { + this.pricingParam = pricingParam; + } + + public String getProductType() { + return productType; + } + + public void setProductType(String productType) { + this.productType = productType; + } + + public String getRetiredCount() { + return retiredCount; + } + + public void setRetiredCount(String retiredCount) { + this.retiredCount = retiredCount; + } + + public String getRevocable() { + return revocable; + } + + public void setRevocable(String revocable) { + this.revocable = revocable; + } + + +} \ No newline at end of file diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppItuneUserDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppItuneUserDTO.java new file mode 100644 index 0000000000..d9ebb4ee59 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppItuneUserDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.application.mgt.common.dto; + +public class VppItuneUserDTO { + String clientUserId; + String inviteCode; + String status; + String email; + String managedId; + + public String getClientUserId() { + return clientUserId; + } + + public void setClientUserId(String clientUserId) { + this.clientUserId = clientUserId; + } + + public String getInviteCode() { + return inviteCode; + } + + public void setInviteCode(String inviteCode) { + this.inviteCode = inviteCode; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getManagedId() { + return managedId; + } + + public void setManagedId(String managedId) { + this.managedId = managedId; + } + +} \ No newline at end of file diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppPaginationDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppPaginationDTO.java new file mode 100644 index 0000000000..95cf054f9c --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppPaginationDTO.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.application.mgt.common.dto; + +public class VppPaginationDTO { + + int currentPageIndex; + int size; + String tokenExpirationDate; + int nextPageIndex; + int totalPages; + String uId; + String versionId; + + public int getCurrentPageIndex() { + return currentPageIndex; + } + + public void setCurrentPageIndex(int currentPageIndex) { + this.currentPageIndex = currentPageIndex; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public String getTokenExpirationDate() { + return tokenExpirationDate; + } + + public void setTokenExpirationDate(String tokenExpirationDate) { + this.tokenExpirationDate = tokenExpirationDate; + } + + public int getNextPageIndex() { + return nextPageIndex; + } + + public void setNextPageIndex(int nextPageIndex) { + this.nextPageIndex = nextPageIndex; + } + + public int getTotalPages() { + return totalPages; + } + + public void setTotalPages(int totalPages) { + this.totalPages = totalPages; + } + + public String getuId() { + return uId; + } + + public void setuId(String uId) { + this.uId = uId; + } + + public String getVersionId() { + return versionId; + } + + public void setVersionId(String versionId) { + this.versionId = versionId; + } +} diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppUserDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppUserDTO.java new file mode 100644 index 0000000000..4ea7929014 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/VppUserDTO.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.application.mgt.common.dto; + +public class VppUserDTO extends VppItuneUserDTO { + int id; + String dmUsername; + int tenantId; + String createdTime; + String lastUpdatedTime; + String tmpPassword; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getDmUsername() { + return dmUsername; + } + + public void setDmUsername(String dmUsername) { + this.dmUsername = dmUsername; + } + + public int getTenantId() { + return tenantId; + } + + public void setTenantId(int tenantId) { + this.tenantId = tenantId; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public String getLastUpdatedTime() { + return lastUpdatedTime; + } + + public void setLastUpdatedTime(String lastUpdatedTime) { + this.lastUpdatedTime = lastUpdatedTime; + } + + public String getTmpPassword() { + return tmpPassword; + } + + public void setTmpPassword(String tmpPassword) { + this.tmpPassword = tmpPassword; + } + + @Override + public String toString() { + return "VppUserDTO{" + + "id=" + id + + ", dmUsername='" + dmUsername + '\'' + + ", tenantId=" + tenantId + + ", createdTime='" + createdTime + '\'' + + ", lastUpdatedTime='" + lastUpdatedTime + '\'' + + ", tmpPassword='" + tmpPassword + '\'' + + ", clientUserId='" + clientUserId + '\'' + + ", inviteCode='" + inviteCode + '\'' + + ", status='" + status + '\'' + + ", email='" + email + '\'' + + ", managedId='" + managedId + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/response/Application.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/response/Application.java index 025f352e4c..0d62a46a5b 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/response/Application.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/response/Application.java @@ -108,6 +108,12 @@ public class Application { value = "if the app is favoured by the user") private boolean isFavourite; + @ApiModelProperty(name = "isExternalAppStoreApp", + value = "Is the app coming from an external application store", + required = true, + example = "true or false") + private boolean isExternalAppStoreApp; + public String getPackageName() { return packageName; } @@ -194,4 +200,12 @@ public class Application { public void setFavourite(boolean favourite) { isFavourite = favourite; } + + public boolean isExternalAppStoreApp() { + return isExternalAppStoreApp; + } + + public void setExternalAppStoreApp(boolean externalAppStoreApp) { + isExternalAppStoreApp = externalAppStoreApp; + } } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/ApplicationManager.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/ApplicationManager.java index 44c9d3c983..ceed8f5544 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/ApplicationManager.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/ApplicationManager.java @@ -17,14 +17,7 @@ */ package io.entgra.device.mgt.core.application.mgt.common.services; -import io.entgra.device.mgt.core.application.mgt.common.ApplicationArtifact; -import io.entgra.device.mgt.core.application.mgt.common.ApplicationList; import io.entgra.device.mgt.core.application.mgt.common.ApplicationType; -import io.entgra.device.mgt.core.application.mgt.common.Filter; -import io.entgra.device.mgt.core.application.mgt.common.LifecycleChanger; -import io.entgra.device.mgt.core.application.mgt.common.LifecycleState; -import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO; -import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO; import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException; import io.entgra.device.mgt.core.application.mgt.common.exception.RequestValidatingException; import io.entgra.device.mgt.core.application.mgt.common.exception.ResourceManagementException; @@ -34,8 +27,21 @@ import io.entgra.device.mgt.core.application.mgt.common.response.Category; import io.entgra.device.mgt.core.application.mgt.common.response.Tag; import io.entgra.device.mgt.core.application.mgt.common.wrapper.*; import io.entgra.device.mgt.core.device.mgt.common.Base64File; +import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO; +import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException; import org.apache.cxf.jaxrs.ext.multipart.Attachment; - +import io.entgra.device.mgt.core.application.mgt.common.ApplicationArtifact; +import io.entgra.device.mgt.core.application.mgt.common.LifecycleChanger; +import io.entgra.device.mgt.core.application.mgt.common.ApplicationList; +import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO; +import io.entgra.device.mgt.core.application.mgt.common.Filter; +import io.entgra.device.mgt.core.application.mgt.common.LifecycleState; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.CustomAppReleaseWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.EntAppReleaseWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.ApplicationUpdateWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.PublicAppReleaseWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.WebAppReleaseWrapper; import java.util.List; /** @@ -269,6 +275,17 @@ public interface ApplicationManager { */ ApplicationDTO getApplication(int applicationId) throws ApplicationManagementException; + /** + * This method is responsible to provide application data for given deviceId. + * + * @param deviceId id of the device + * @return {@link ApplicationDTO} + * @throws ApplicationManagementException + * if an error occurred while getting subscribed app details for relevant device id, + */ + ApplicationList getSubscribedAppsOfDevice(int deviceId, PaginationRequest request) + throws ApplicationManagementException; + /** * To get the Application for given Id. * diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/SubscriptionManager.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/SubscriptionManager.java index 8219354946..cd66878019 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/SubscriptionManager.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/SubscriptionManager.java @@ -27,6 +27,7 @@ import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; import io.entgra.device.mgt.core.device.mgt.common.PaginationResult; import io.entgra.device.mgt.core.device.mgt.common.app.mgt.App; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; import java.util.List; import java.util.Properties; @@ -207,4 +208,13 @@ public interface SubscriptionManager { */ PaginationResult getAppInstalledSubscribeDevices(PaginationRequest request, String appUUID, String subType, String subTypeName) throws ApplicationManagementException; + + + /*** + * This method is responsible for retrieving application details of the passed operation id. + * @param id ID of the related operation + * @return {@link Activity} Activity result of the app information. + * @throws {@link SubscriptionManagementException} Exception of the subscription management + */ + Activity getOperationAppDetails(String id) throws SubscriptionManagementException; } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/VPPApplicationManager.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/VPPApplicationManager.java new file mode 100644 index 0000000000..7075424c33 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/VPPApplicationManager.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.application.mgt.common.services; + +import io.entgra.device.mgt.core.application.mgt.common.dto.ProxyResponse; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException; + +import java.io.IOException; +import java.util.List; + +public interface VPPApplicationManager { + + VppUserDTO addUser(VppUserDTO userDTO) throws ApplicationManagementException; + + VppUserDTO getUserByDMUsername(String emmUsername) throws ApplicationManagementException; + + void updateUser(VppUserDTO userDTO) throws ApplicationManagementException; + + void syncUsers(String clientId) throws ApplicationManagementException; + + void syncAssets(int nextPageIndex) throws ApplicationManagementException; + + VppAssetDTO getAssetByAppId(int appId) throws ApplicationManagementException; + + ProxyResponse callVPPBackend(String url, String payload, String accessToken, String method) throws IOException; + + boolean addAssociation(VppAssetDTO asset, List vppUsers) throws + ApplicationManagementException; + + VppAssociationDTO getAssociation(int assetId, int userId) throws ApplicationManagementException; + + VppAssociationDTO getUserAssociation(String adamId, String emmUsername) throws ApplicationManagementException; +} diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppAssociateRequestWrapper.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppAssociateRequestWrapper.java new file mode 100644 index 0000000000..7cea9d52c8 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppAssociateRequestWrapper.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package io.entgra.device.mgt.core.application.mgt.common.wrapper; + +import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO; + +import java.util.ArrayList; +import java.util.List; + +public class VppAssociateRequestWrapper { + + List assets; + List clientUserIds; + + public List getAssets() { + return assets; + } + + public void setAssets(List assets) { + this.assets = assets; + } + + public List getClientUserIds() { + return clientUserIds; + } + + public void setClientUserIds(List clientUserIds) { + this.clientUserIds = clientUserIds; + } + +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.js b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneAssetResponseWrapper.java similarity index 54% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.js rename to components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneAssetResponseWrapper.java index e83b53d265..26c45207ab 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.js +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneAssetResponseWrapper.java @@ -15,22 +15,25 @@ * specific language governing permissions and limitations * under the License. */ +package io.entgra.device.mgt.core.application.mgt.common.wrapper; -function onRequest(context) { - var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppPaginationDTO; - context["permissions"] = userModule.getUIPermissions(); - if (userModule.isAuthorized("/permission/admin/device-mgt/admin/device-type")) { - context["editPermitted"] = true; - } - var deviceTypeCount = deviceModule.getDeviceTypeCount(); +import java.util.ArrayList; +import java.util.List; - if (deviceTypeCount > 0) { - context["hasDeviceTypes"] = true; - } else { - context["hasDeviceTypes"] = false; +public class VppItuneAssetResponseWrapper extends VppPaginationDTO { + + List assets; + + public List getAssets() { + return assets; } - return context; -} \ No newline at end of file + public void setAssets(List assets) { + this.assets = assets; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/secondTemp.js b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneUserRequestWrapper.java similarity index 57% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/secondTemp.js rename to components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneUserRequestWrapper.java index 4e9f8312d6..4189fa557a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/secondTemp.js +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneUserRequestWrapper.java @@ -15,13 +15,26 @@ * specific language governing permissions and limitations * under the License. */ +package io.entgra.device.mgt.core.application.mgt.common.wrapper; - function reformatRadius(val){ - if(val != "" && !isNaN(val)){ - $("#fRadius" ).val(parseFloat(Math.round(val * 100) / 100).toFixed(2)); - } else{ - var message = "Invalid Fluctuation Radius Provided."; - noty({text: message, type: 'error'}); - } +import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO; + +import java.util.ArrayList; +import java.util.List; + +public class VppItuneUserRequestWrapper { + + List users; + + public VppItuneUserRequestWrapper() { + users = new ArrayList<>(); + } + public List getUser() { + return users; } + public void setUser(List users) { + this.users = users; + } + +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.js b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneUserResponseWrapper.java similarity index 53% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.js rename to components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneUserResponseWrapper.java index bb0ec87cac..64ee578241 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.js +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/wrapper/VppItuneUserResponseWrapper.java @@ -15,21 +15,26 @@ * specific language governing permissions and limitations * under the License. */ +package io.entgra.device.mgt.core.application.mgt.common.wrapper; -function onRequest(context) { - var Encode = Packages.org.owasp.encoder.Encode; - session.invalidate(); - var viewModel = {}; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppPaginationDTO; - var stat = request.getParameter("status"); - var statusMessage = request.getParameter("statusMsg"); +import java.util.ArrayList; +import java.util.List; - if (!stat || !statusMessage) { - stat = "Authentication Error!"; - statusMessage = "Something went wrong during the authentication process.Please try signing in again."; +public class VppItuneUserResponseWrapper extends VppPaginationDTO { + + List users; + + public VppItuneUserResponseWrapper() { + users = new ArrayList<>(); + } + public List getUser() { + return users; } - viewModel.stat = Encode.forHtmlContent(stat); - viewModel.statusMessage = Encode.forHtmlContent(statusMessage); - return viewModel; -} \ No newline at end of file + public void setUser(List users) { + this.users = users; + } +} diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/pom.xml b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/pom.xml index 581dcf9204..5ebd2d7226 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/pom.xml +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/pom.xml @@ -21,7 +21,7 @@ io.entgra.device.mgt.core application-mgt - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml @@ -173,6 +173,11 @@ + + + org.apache.httpcomponents + httpclient + org.apache.felix org.apache.felix.scr.ds-annotations diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/ApplicationDAO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/ApplicationDAO.java index 71e71e2abc..13be8be454 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/ApplicationDAO.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/ApplicationDAO.java @@ -22,6 +22,7 @@ import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO; import io.entgra.device.mgt.core.application.mgt.common.dto.CategoryDTO; import io.entgra.device.mgt.core.application.mgt.common.dto.TagDTO; import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; +import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; import java.util.List; @@ -150,6 +151,16 @@ public interface ApplicationDAO { */ ApplicationDTO getApplication(int applicationId, int tenantId) throws ApplicationManagementDAOException; + /** + * To get the application with the given id + * + * @param deviceId ID of the device which the apps are installed on. + * @param tenantId ID of the tenant. + * @return the application + * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. + */ + List getSubscribedAppsOfDevice(int deviceId, int tenantId, PaginationRequest request) throws ApplicationManagementDAOException; + /** * To get the application with the given uuid * diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/SubscriptionDAO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/SubscriptionDAO.java index 8b5caec6ac..804a4a29e2 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/SubscriptionDAO.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/SubscriptionDAO.java @@ -23,6 +23,7 @@ import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDT import io.entgra.device.mgt.core.application.mgt.common.dto.ScheduledSubscriptionDTO; import io.entgra.device.mgt.core.application.mgt.common.exception.SubscriptionManagementException; import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; import java.util.List; import java.util.Map; @@ -252,4 +253,15 @@ public interface SubscriptionDAO { * @throws {@link ApplicationManagementDAOException} if connections establishment fails. */ Map getCurrentInstalledAppVersion(int appId, List deviceIdList, String installedVersion) throws ApplicationManagementDAOException; + + + /** + * Retrieves app details by operation id. + * + * @param operationId ID of the operation which app details needs to be retrieved + * @param tenantId ID of tenant + * @return {@link Activity} + * @throws ApplicationManagementDAOException if error occurred while retrieving the app details + */ + Activity getOperationAppDetails(int operationId, int tenantId) throws ApplicationManagementDAOException; } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/VppApplicationDAO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/VppApplicationDAO.java new file mode 100644 index 0000000000..02aec95174 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/VppApplicationDAO.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.application.mgt.core.dao; + +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO; +import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; + + +public interface VppApplicationDAO { + + int addVppUser(VppUserDTO userDTO, int tenantId) throws ApplicationManagementDAOException; + + VppUserDTO updateVppUser(VppUserDTO userDTO, int tenantId) throws ApplicationManagementDAOException; + + VppUserDTO getUserByDMUsername(String emmUsername, int tenantId) throws ApplicationManagementDAOException; + + VppAssetDTO getAssetByAppId(int appId, int tenantId) throws ApplicationManagementDAOException; + + int addAsset(VppAssetDTO vppAssetDTO, int tenantId) throws ApplicationManagementDAOException; + + VppAssetDTO updateAsset(VppAssetDTO vppAssetDTO, int tenantId) throws ApplicationManagementDAOException; + + VppAssociationDTO getAssociation(int assetId, int userId, int tenantId) throws ApplicationManagementDAOException; + + int addAssociation(VppAssociationDTO vppAssociationDTO, int tenantId) throws ApplicationManagementDAOException; + + VppAssociationDTO updateAssociation(VppAssociationDTO vppAssociationDTO, int tenantId) throws ApplicationManagementDAOException; +} diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/common/ApplicationManagementDAOFactory.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/common/ApplicationManagementDAOFactory.java index 554bd32b1e..1a29b33b2d 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/common/ApplicationManagementDAOFactory.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/common/ApplicationManagementDAOFactory.java @@ -17,25 +17,36 @@ */ package io.entgra.device.mgt.core.application.mgt.core.dao.common; -import io.entgra.device.mgt.core.application.mgt.common.exception.UnsupportedDatabaseEngineException; import io.entgra.device.mgt.core.application.mgt.core.dao.*; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.GenericApplicationDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.OracleApplicationDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.PostgreSQLApplicationDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.SQLServerApplicationDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.GenericApplicationReleaseDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.OracleApplicationReleaseDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.PostgreSQLApplicationReleaseDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.SQLServerApplicationReleaseDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.spapplication.GenericSPApplicationDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.spapplication.OracleSPApplicationDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.spapplication.PostgreSQLSPApplicationDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.spapplication.SQLServerSPApplicationDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.lifecyclestate.GenericLifecycleStateDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.GenericVisibilityDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.OracleVisibilityDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.PostgreSQLVisibilityDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.SQLServerVisibilityDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp.GenericVppApplicationDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp.OracleVppApplicationDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp.PostgreSQLVppApplicationDAO; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp.SQLServerVppApplicationDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.util.Constants; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import io.entgra.device.mgt.core.application.mgt.common.exception.UnsupportedDatabaseEngineException; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.PostgreSQLApplicationDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.SQLServerApplicationDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.OracleApplicationReleaseDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.PostgreSQLApplicationReleaseDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.SQLServerApplicationReleaseDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.lifecyclestate.OracleLifecycleStateDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.lifecyclestate.PostgreSQLLifecycleStateDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.lifecyclestate.SQLServerLifecycleStateDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.review.GenericReviewDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.GenericApplicationDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.GenericApplicationReleaseDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.OracleApplicationDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.lifecyclestate.GenericLifecycleStateDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.review.OracleReviewDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.review.PostgreSQLReviewDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.review.SQLServerReviewDAOImpl; @@ -43,14 +54,7 @@ import io.entgra.device.mgt.core.application.mgt.core.dao.impl.subscription.Gene import io.entgra.device.mgt.core.application.mgt.core.dao.impl.subscription.OracleSubscriptionDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.subscription.PostgreSQLSubscriptionDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.dao.impl.subscription.SQLServerSubscriptionDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.GenericVisibilityDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.OracleVisibilityDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.PostgreSQLVisibilityDAOImpl; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.SQLServerVisibilityDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.util.ConnectionManagerUtil; -import io.entgra.device.mgt.core.application.mgt.core.util.Constants; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import javax.sql.DataSource; import java.sql.SQLException; @@ -226,4 +230,28 @@ public class ApplicationManagementDAOFactory { } throw new IllegalStateException("Database engine has not initialized properly."); } + + + /** + * To get the instance of VppApplicationImplementation of the particular database engine. + * @return specific VppApplicationImplementation + */ + public static VppApplicationDAO getVppApplicationDAO() { + if (databaseEngine != null) { + switch (databaseEngine) { + case Constants.DataBaseTypes.DB_TYPE_H2: + case Constants.DataBaseTypes.DB_TYPE_MYSQL: + return new GenericVppApplicationDAOImpl(); + case Constants.DataBaseTypes.DB_TYPE_POSTGRESQL: + return new PostgreSQLVppApplicationDAO(); + case Constants.DataBaseTypes.DB_TYPE_ORACLE: + return new OracleVppApplicationDAOImpl(); + case Constants.DataBaseTypes.DB_TYPE_MSSQL: + return new SQLServerVppApplicationDAOImpl(); + default: + throw new UnsupportedDatabaseEngineException("Unsupported database engine : " + databaseEngine); + } + } + throw new IllegalStateException("Database engine has not initialized properly."); + } } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java index 82f4b3d191..5999767301 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java @@ -29,6 +29,7 @@ import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManag import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException; import io.entgra.device.mgt.core.application.mgt.core.util.Constants; import io.entgra.device.mgt.core.application.mgt.core.util.DAOUtil; +import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -652,6 +653,84 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } } + @Override + public List getSubscribedAppsOfDevice(int deviceId, int tenantId, PaginationRequest request) throws + ApplicationManagementDAOException { + if (log.isDebugEnabled()) { + log.debug("Getting all installed apps of device " + deviceId + + " from the database"); + } + List appList = null; + + String sql = "SELECT " + + "AP_APP.ID AS APP_ID, " + + "AP_APP.NAME AS APP_NAME, " + + "AP_APP.DESCRIPTION AS APP_DESCRIPTION, " + + "AP_APP.TYPE AS APP_TYPE, " + + "AP_APP.STATUS AS APP_STATUS, " + + "AP_APP.SUB_TYPE AS APP_SUB_TYPE, " + + "AP_APP.CURRENCY AS APP_CURRENCY, " + + "AP_APP.RATING AS APP_RATING, " + + "AP_APP.DEVICE_TYPE_ID AS APP_DEVICE_TYPE_ID, " + + "AP_APP_RELEASE.ID AS RELEASE_ID, " + + "AP_APP_RELEASE.DESCRIPTION AS RELEASE_DESCRIPTION, " + + "AP_APP_RELEASE.VERSION AS RELEASE_VERSION, " + + "AP_APP_RELEASE.UUID AS RELEASE_UUID, " + + "AP_APP_RELEASE.RELEASE_TYPE AS RELEASE_TYPE, " + + "AP_APP_RELEASE.INSTALLER_LOCATION AS AP_RELEASE_STORED_LOC, " + + "AP_APP_RELEASE.ICON_LOCATION AS AP_RELEASE_ICON_LOC, " + + "AP_APP_RELEASE.BANNER_LOCATION AS AP_RELEASE_BANNER_LOC, " + + "AP_APP_RELEASE.SC_1_LOCATION AS AP_RELEASE_SC1, " + + "AP_APP_RELEASE.SC_2_LOCATION AS AP_RELEASE_SC2, " + + "AP_APP_RELEASE.SC_3_LOCATION AS AP_RELEASE_SC3, " + + "AP_APP_RELEASE.APP_HASH_VALUE AS RELEASE_HASH_VALUE, " + + "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, " + + "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, " + + "AP_APP_RELEASE.PACKAGE_NAME AS PACKAGE_NAME, " + + "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + + "AP_APP_RELEASE.RATING AS RELEASE_RATING, " + + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " + + "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT " + + "FROM AP_APP " + + "JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID " + + "JOIN AP_DEVICE_SUBSCRIPTION ON AP_APP_RELEASE.ID = AP_DEVICE_SUBSCRIPTION.AP_APP_RELEASE_ID " + + "WHERE AP_DEVICE_SUBSCRIPTION.DM_DEVICE_ID = ? AND AP_DEVICE_SUBSCRIPTION.TENANT_ID= ? " + +"AND AP_DEVICE_SUBSCRIPTION.STATUS= 'COMPLETED'"; + + if (request != null) { + sql = sql + " LIMIT ?,?"; + } + + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, deviceId); + stmt.setInt(2, tenantId); + if (request != null) { + stmt.setInt(3, request.getStartIndex()); + stmt.setInt(4, request.getRowCount()); + } + try (ResultSet rs = stmt.executeQuery()) { + appList = new ArrayList<>(); + while (rs.next()) { + ApplicationDTO app = DAOUtil.loadDeviceApp(rs); + appList.add(app); + } + return appList; + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the DB connection for getting all apps installed on the device of " + + "device Id: " + deviceId + "."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while while running SQL to get all installed apps of device with device Id: " + deviceId; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + @Override public boolean updateApplication(ApplicationDTO applicationDTO, int tenantId) throws ApplicationManagementDAOException { diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java index bd3bdf3bb6..9dd324123c 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java @@ -17,19 +17,20 @@ */ package io.entgra.device.mgt.core.application.mgt.core.dao.impl.subscription; +import io.entgra.device.mgt.core.application.mgt.core.dao.SubscriptionDAO; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.AbstractDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException; +import io.entgra.device.mgt.core.application.mgt.core.util.DAOUtil; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus; import io.entgra.device.mgt.core.application.mgt.common.SubAction; import io.entgra.device.mgt.core.application.mgt.common.SubscriptionType; import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO; import io.entgra.device.mgt.core.application.mgt.common.dto.ScheduledSubscriptionDTO; import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException; -import io.entgra.device.mgt.core.application.mgt.core.dao.SubscriptionDAO; -import io.entgra.device.mgt.core.application.mgt.core.dao.impl.AbstractDAOImpl; import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; -import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException; -import io.entgra.device.mgt.core.application.mgt.core.util.DAOUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import java.sql.*; import java.util.*; @@ -1425,4 +1426,44 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc throw new ApplicationManagementDAOException(msg, e); } } + + public Activity getOperationAppDetails(int operationId, int tenantId) throws ApplicationManagementDAOException { + try { + String sql = "SELECT " + + "AP.NAME, " + + "AP.TYPE, " + + "AR.PACKAGE_NAME, " + + "AR.VERSION, " + + "DS.SUBSCRIBED_BY, " + + "DS.STATUS, " + + "DS.ACTION_TRIGGERED_FROM " + + "FROM AP_APP_SUB_OP_MAPPING SOP " + + "JOIN AP_DEVICE_SUBSCRIPTION DS ON SOP.AP_DEVICE_SUBSCRIPTION_ID = DS.ID " + + "JOIN AP_APP_RELEASE AR ON DS.AP_APP_RELEASE_ID = AR.ID " + + "JOIN AP_APP AP ON AP.ID = AR.AP_APP_ID " + + " WHERE SOP.OPERATION_ID = ? AND SOP.TENANT_ID = ?"; + + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, operationId); + stmt.setInt(2,tenantId); + try (ResultSet rs = stmt.executeQuery()) { + return DAOUtil.loadOperationActivity(rs); + } + } + } catch (DBConnectionException e) { + String msg = + "Error occurred while getting the app details from the database related to operation " + operationId; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to retrieve app details of operation" + operationId; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (UnexpectedServerErrorException e) { + String msg = "More than one app for operation " + operationId; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/GenericVppApplicationDAOImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/GenericVppApplicationDAOImpl.java new file mode 100644 index 0000000000..38fa090f94 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/GenericVppApplicationDAOImpl.java @@ -0,0 +1,508 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp; + +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException; +import io.entgra.device.mgt.core.application.mgt.core.dao.VppApplicationDAO; +import io.entgra.device.mgt.core.application.mgt.core.dao.impl.AbstractDAOImpl; +import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; +import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException; +import io.entgra.device.mgt.core.application.mgt.core.util.DAOUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.sql.*; +import java.util.List; + +public class GenericVppApplicationDAOImpl extends AbstractDAOImpl implements VppApplicationDAO { + private static final Log log = LogFactory.getLog(GenericVppApplicationDAOImpl.class); + + @Override + public int addVppUser(VppUserDTO userDTO, int tenantId) + throws ApplicationManagementDAOException { + int vppUserId = -1; + String sql = "INSERT INTO " + + "AP_VPP_USER(" + + "CLIENT_USER_ID, " + + "DM_USERNAME, " + + "TENANT_ID, " + + "EMAIL, " + + "INVITE_CODE, " + + "STATUS," + + "CREATED_TIME," + + "LAST_UPDATED_TIME," + + "MANAGED_ID," + + "TEMP_PASSWORD) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + long currentTime = System.currentTimeMillis(); + stmt.setString(1, userDTO.getClientUserId()); + stmt.setString(2, userDTO.getDmUsername()); + stmt.setInt(3, tenantId); + stmt.setString(4, userDTO.getEmail()); + stmt.setString(5, userDTO.getInviteCode()); + stmt.setString(6, userDTO.getStatus()); + stmt.setLong(7, currentTime); + stmt.setLong(8, currentTime); + stmt.setString(9, userDTO.getManagedId()); + stmt.setString(10, userDTO.getTmpPassword()); + stmt.executeUpdate(); + try (ResultSet rs = stmt.getGeneratedKeys()) { + if (rs.next()) { + vppUserId = rs.getInt(1); + } + } + return vppUserId; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when adding the vpp user"; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to add the vpp user."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + + @Override + public VppUserDTO updateVppUser(VppUserDTO userDTO, int tenantId) + throws ApplicationManagementDAOException { + + String sql = "UPDATE AP_VPP_USER SET "; + if (userDTO.getClientUserId() != null && !userDTO.getClientUserId().isEmpty()) { + sql += "CLIENT_USER_ID = ?,"; + } + if (userDTO.getDmUsername() != null && !userDTO.getDmUsername().isEmpty()) { + sql += "DM_USERNAME = ?,"; + } + if (userDTO.getEmail() != null && !userDTO.getEmail().isEmpty()) { + sql += "EMAIL = ?,"; + } + if (userDTO.getInviteCode() != null && !userDTO.getInviteCode().isEmpty()) { + sql += "INVITE_CODE = ?,"; + } + if (userDTO.getStatus() != null && !userDTO.getStatus().isEmpty()) { + sql += "STATUS = ?,"; + } + if (userDTO.getManagedId() != null && !userDTO.getManagedId().isEmpty()) { + sql += "MANAGED_ID = ?,"; + } + if (userDTO.getTmpPassword() != null && !userDTO.getTmpPassword().isEmpty()) { + sql += "TEMP_PASSWORD = ?,"; + } + + sql += " TENANT_ID = ?, LAST_UPDATED_TIME = ? WHERE ID = ?"; + + try { + Connection conn = this.getDBConnection(); + long updatedTime = System.currentTimeMillis(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + int x = 0; + + if (userDTO.getClientUserId() != null && !userDTO.getClientUserId().isEmpty()) { + stmt.setString(++x, userDTO.getClientUserId()); + } + if (userDTO.getDmUsername() != null && !userDTO.getDmUsername().isEmpty()) { + stmt.setString(++x, userDTO.getDmUsername()); + } + if (userDTO.getEmail() != null && !userDTO.getEmail().isEmpty()) { + stmt.setString(++x, userDTO.getEmail()); + } + if (userDTO.getInviteCode() != null && !userDTO.getInviteCode().isEmpty()) { + stmt.setString(++x, userDTO.getInviteCode()); + } + if (userDTO.getStatus() != null && !userDTO.getStatus().isEmpty()) { + stmt.setString(++x, userDTO.getStatus()); + } + if (userDTO.getManagedId() != null && !userDTO.getManagedId().isEmpty()) { + stmt.setString(++x, userDTO.getManagedId()); + } + if (userDTO.getTmpPassword() != null && !userDTO.getTmpPassword().isEmpty()) { + stmt.setString(++x, userDTO.getTmpPassword()); + } + stmt.setInt(++x, tenantId); + stmt.setLong(++x, updatedTime); + stmt.setInt(++x, userDTO.getId()); + if (stmt.executeUpdate() == 1) { + return userDTO; + } + return null; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when updating the vpp user"; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to updating the vpp user."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + + @Override + public VppUserDTO getUserByDMUsername(String emmUsername, int tenantId) + throws ApplicationManagementDAOException { + String sql = "SELECT " + + "ID, " + + "CLIENT_USER_ID, " + + "TENANT_ID, " + + "EMAIL, " + + "INVITE_CODE, " + + "STATUS, " + + "CREATED_TIME, " + + "LAST_UPDATED_TIME, " + + "MANAGED_ID, " + + "TEMP_PASSWORD, " + + "DM_USERNAME " + + "FROM AP_VPP_USER " + + "WHERE DM_USERNAME = ? AND TENANT_ID = ?"; + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, emmUsername); + stmt.setInt(2, tenantId); + try (ResultSet rs = stmt.executeQuery()) { + return DAOUtil.loadVppUser(rs); + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when retrieving vpp user by EMM Username."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to retrieve vpp user by EMM Username."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (UnexpectedServerErrorException e) { + String msg = "Found more than one user for: " + emmUsername; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + + @Override + public VppAssetDTO getAssetByAppId(int appId, int tenantId) + throws ApplicationManagementDAOException { + String sql = "SELECT " + + "ID, " + + "APP_ID, " + + "TENANT_ID, " + + "CREATED_TIME, " + + "LAST_UPDATED_TIME, " + + "ADAM_ID, " + + "ASSIGNED_COUNT, " + + "DEVICE_ASSIGNABLE, " + + "PRICING_PARAMS, " + + "PRODUCT_TYPE, " + + "RETIRED_COUNT, " + + "REVOCABLE " +// + "SUPPORTED_PLATFORMS " + + "FROM AP_ASSETS " + + "WHERE APP_ID = ? AND TENANT_ID = ?"; + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, appId); + stmt.setInt(2, tenantId); + try (ResultSet rs = stmt.executeQuery()) { + return DAOUtil.loadAsset(rs); + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when retrieving asset data of app id "+ appId; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to retrieve asset by app id."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (UnexpectedServerErrorException e) { + String msg = "Found more than one app for app id: " + appId; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + + @Override + public int addAsset(VppAssetDTO vppAssetDTO, int tenantId) + throws ApplicationManagementDAOException { + int assetId = -1; + String sql = "INSERT INTO " + + "AP_ASSETS(" + + "APP_ID, " + + "TENANT_ID, " + + "CREATED_TIME," + + "LAST_UPDATED_TIME," + + "ADAM_ID," + + "ASSIGNED_COUNT," + + "DEVICE_ASSIGNABLE," + + "PRICING_PARAMS," + + "PRODUCT_TYPE," + + "RETIRED_COUNT," + + "REVOCABLE, " + + "SUPPORTED_PLATFORMS) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + long currentTime = System.currentTimeMillis(); + stmt.setInt(1, vppAssetDTO.getAppId()); + stmt.setInt(2, tenantId); + stmt.setLong(3, currentTime); + stmt.setLong(4, currentTime); + stmt.setString(5, vppAssetDTO.getAdamId()); + stmt.setString(6, vppAssetDTO.getAssignedCount()); + stmt.setString(7, vppAssetDTO.getDeviceAssignable()); + stmt.setString(8, vppAssetDTO.getPricingParam()); + stmt.setString(9, vppAssetDTO.getProductType()); + stmt.setString(10, vppAssetDTO.getRetiredCount()); + stmt.setString(11, vppAssetDTO.getRevocable()); + List platformList = vppAssetDTO.getSupportedPlatforms(); + String platformString = String.join(",", platformList); + stmt.setString(12, platformString); + stmt.executeUpdate(); + try (ResultSet rs = stmt.getGeneratedKeys()) { + if (rs.next()) { + assetId = rs.getInt(1); + } + } + return assetId; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when adding the asset."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to add the asset."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + + @Override + public VppAssetDTO updateAsset(VppAssetDTO vppAssetDTO, int tenantId) + throws ApplicationManagementDAOException { + + String sql = "UPDATE AP_ASSETS SET "; + + if (vppAssetDTO.getAdamId() != null && !vppAssetDTO.getAdamId().isEmpty()) { + sql += "ADAM_ID = ?, "; + } + if (vppAssetDTO.getAssignedCount() != null && !vppAssetDTO.getAssignedCount().isEmpty()) { + sql += "ASSIGNED_COUNT = ?, "; + } + if (vppAssetDTO.getDeviceAssignable() != null && !vppAssetDTO.getDeviceAssignable().isEmpty()) { + sql += "DEVICE_ASSIGNABLE = ?, "; + } + if (vppAssetDTO.getPricingParam() != null && !vppAssetDTO.getPricingParam().isEmpty()) { + sql += "PRICING_PARAMS = ?, "; + } + if (vppAssetDTO.getProductType() != null && !vppAssetDTO.getProductType().isEmpty()) { + sql += "PRODUCT_TYPE = ?, "; + } + if (vppAssetDTO.getRetiredCount() != null && !vppAssetDTO.getRetiredCount().isEmpty()) { + sql += "RETIRED_COUNT = ?, "; + } + if (vppAssetDTO.getRevocable() != null && !vppAssetDTO.getRevocable().isEmpty()) { + sql += "REVOCABLE = ?, "; + } + if (vppAssetDTO.getSupportedPlatforms() != null && !vppAssetDTO.getSupportedPlatforms().isEmpty()) { + sql += "SUPPORTED_PLATFORMS = ?,"; + } + sql += "APP_ID = ?, LAST_UPDATED_TIME = ? WHERE ID = ? AND TENANT_ID = ?"; + + try { + Connection conn = this.getDBConnection(); + long updatedTime = System.currentTimeMillis(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + int x = 0; + + if (vppAssetDTO.getAdamId() != null && !vppAssetDTO.getAdamId().isEmpty()) { + stmt.setString(++x, vppAssetDTO.getAdamId()); + } + if (vppAssetDTO.getAssignedCount() != null && !vppAssetDTO.getAssignedCount().isEmpty()) { + stmt.setString(++x, vppAssetDTO.getAssignedCount()); + } + if (vppAssetDTO.getDeviceAssignable() != null && !vppAssetDTO.getDeviceAssignable().isEmpty()) { + stmt.setString(++x, vppAssetDTO.getDeviceAssignable()); + } + if (vppAssetDTO.getPricingParam() != null && !vppAssetDTO.getPricingParam().isEmpty()) { + stmt.setString(++x, vppAssetDTO.getPricingParam()); + } + if (vppAssetDTO.getProductType() != null && !vppAssetDTO.getProductType().isEmpty()) { + stmt.setString(++x, vppAssetDTO.getProductType()); + } + if (vppAssetDTO.getRetiredCount() != null && !vppAssetDTO.getRetiredCount().isEmpty()) { + stmt.setString(++x, vppAssetDTO.getRetiredCount()); + } + if (vppAssetDTO.getRevocable() != null && !vppAssetDTO.getRevocable().isEmpty()) { + stmt.setString(++x, vppAssetDTO.getRevocable()); + } + if (vppAssetDTO.getSupportedPlatforms() != null && !vppAssetDTO.getSupportedPlatforms().isEmpty()) { + List platformList = vppAssetDTO.getSupportedPlatforms(); + String platformString = String.join(",", platformList); + stmt.setString(++x, platformString); + } + + stmt.setInt(++x, vppAssetDTO.getAppId()); + stmt.setLong(++x, updatedTime); + stmt.setInt(++x, vppAssetDTO.getId()); + stmt.setLong(++x, tenantId); + if (stmt.executeUpdate() == 1) { + return vppAssetDTO; + } + return null; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when updating the vpp user"; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to updating the vpp user."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + + @Override + public VppAssociationDTO getAssociation(int assetId, int userId, int tenantId) + throws ApplicationManagementDAOException { + String sql = "SELECT " + + "ID, " + + "ASSOCIATION_TYPE, " + + "CREATED_TIME, " + + "LAST_UPDATED_TIME, " + + "PRICING_PARAMS " + + "FROM AP_VPP_ASSOCIATION " + + "WHERE ASSET_ID = ? AND USER_ID = ? AND TENANT_ID = ?"; + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, assetId); + stmt.setInt(2, userId); + stmt.setInt(3, tenantId); + try (ResultSet rs = stmt.executeQuery()) { + return DAOUtil.loadAssignment(rs); + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when retrieving assignment data of user with id "+ userId; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to retrieve assignment by asset id and user id."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (UnexpectedServerErrorException e) { + String msg = "Found more than one assignment for user id: " + userId + " and asset id: " + assetId; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + + @Override + public int addAssociation(VppAssociationDTO vppAssociationDTO, int tenantId) + throws ApplicationManagementDAOException { + int associationId = -1; + String sql = "INSERT INTO " + + "AP_VPP_ASSOCIATION(" + + "ASSET_ID, " + + "USER_ID, " + + "TENANT_ID, " + + "ASSOCIATION_TYPE," + + "CREATED_TIME," + + "LAST_UPDATED_TIME," + + "PRICING_PARAMS) " + + "VALUES (?, ?, ?, ?, ?)"; + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + long currentTime = System.currentTimeMillis(); + stmt.setInt(1, vppAssociationDTO.getAssetId()); + stmt.setInt(2, vppAssociationDTO.getClientId()); + stmt.setInt(3, tenantId); + stmt.setString(4, vppAssociationDTO.getAssociationType()); + stmt.setLong(5, currentTime); + stmt.setLong(6, currentTime); + stmt.setString(7, vppAssociationDTO.getPricingParam()); + stmt.executeUpdate(); + try (ResultSet rs = stmt.getGeneratedKeys()) { + if (rs.next()) { + associationId = rs.getInt(1); + } + } + return associationId; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when adding the asset."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to add the asset."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } + + @Override + public VppAssociationDTO updateAssociation(VppAssociationDTO vppAssociationDTO, int tenantId) + throws ApplicationManagementDAOException { + + String sql = "UPDATE " + + "AP_VPP_ASSOCIATION " + + "SET " + + "ASSET_ID = ?," + + "USER_ID = ?, " + + "ASSOCIATION_TYPE = ?, " + + "LAST_UPDATED_TIME = ?, " + + "PRICING_PARAMS = ? " + + "WHERE ID = ? AND TENANT_ID = ?"; + try { + Connection conn = this.getDBConnection(); + long updatedTime = System.currentTimeMillis(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, vppAssociationDTO.getAssetId()); + stmt.setInt(2, vppAssociationDTO.getClientId()); + stmt.setString(3, vppAssociationDTO.getAssociationType()); + stmt.setLong(4, updatedTime); + stmt.setString(5, vppAssociationDTO.getPricingParam()); + stmt.setInt(6, vppAssociationDTO.getId()); + stmt.setLong(7, tenantId); + if (stmt.executeUpdate() == 1) { + return vppAssociationDTO; + } + return null; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when updating the vpp user"; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to updating the vpp user."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } +} diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/OracleVppApplicationDAOImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/OracleVppApplicationDAOImpl.java new file mode 100644 index 0000000000..480f18006e --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/OracleVppApplicationDAOImpl.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp; + +import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException; +import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.sql.*; + +public class OracleVppApplicationDAOImpl extends GenericVppApplicationDAOImpl { + + private static final Log log = LogFactory.getLog(GenericVppApplicationDAOImpl.class); + + @Override + public int addVppUser(VppUserDTO userDTO, int tenantId) + throws ApplicationManagementDAOException { + int vppUserId = -1; + String sql = "INSERT INTO " + + "AP_VPP_USER(" + + "CLIENT_USER_ID, " + + "DM_USERNAME, " + + "TENANT_ID, " + + "EMAIL, " + + "INVITE_CODE, " + + "STATUS," + + "CREATED_TIME," + + "LAST_UPDATED_TIME," + + "MANAGED_ID," + + "TEMP_PASSWORD) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql, new String[] {"ID"})) { + long currentTime = System.currentTimeMillis(); + stmt.setString(1, userDTO.getClientUserId()); + stmt.setString(2, userDTO.getDmUsername()); + stmt.setInt(3, tenantId); + stmt.setString(4, userDTO.getEmail()); + stmt.setString(5, userDTO.getInviteCode()); + stmt.setString(6, userDTO.getStatus()); + stmt.setLong(7, currentTime); + stmt.setLong(8, currentTime); + stmt.setString(9, userDTO.getManagedId()); + stmt.setString(10, userDTO.getTmpPassword()); + stmt.executeUpdate(); + try (ResultSet rs = stmt.getGeneratedKeys()) { + if (rs.next()) { + vppUserId = rs.getInt(1); + } + } + return vppUserId; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when adding the vpp user"; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to add the vpp user."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } +} diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/PostgreSQLVppApplicationDAO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/PostgreSQLVppApplicationDAO.java new file mode 100644 index 0000000000..5d9fe7a8f6 --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/PostgreSQLVppApplicationDAO.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp; + +import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException; +import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.sql.*; + +public class PostgreSQLVppApplicationDAO extends GenericVppApplicationDAOImpl { + + private static final Log log = LogFactory.getLog(GenericVppApplicationDAOImpl.class); + + public int addVppUser(VppUserDTO userDTO, int tenantId) + throws ApplicationManagementDAOException { + int vppUserId = -1; + String sql = "INSERT INTO " + + "AP_VPP_USER(" + + "CLIENT_USER_ID, " + + "DM_USERNAME, " + + "TENANT_ID, " + + "EMAIL, " + + "INVITE_CODE, " + + "STATUS," + + "CREATED_TIME," + + "LAST_UPDATED_TIME," + + "MANAGED_ID," + + "TEMP_PASSWORD) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try { + Connection conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql, new String[]{"ID"})) { + long currentTime = System.currentTimeMillis(); + stmt.setString(1, userDTO.getClientUserId()); + stmt.setString(2, userDTO.getDmUsername()); + stmt.setInt(3, tenantId); + stmt.setString(4, userDTO.getEmail()); + stmt.setString(5, userDTO.getInviteCode()); + stmt.setString(6, userDTO.getStatus()); + stmt.setLong(7, currentTime); + stmt.setLong(8, currentTime); + stmt.setString(9, userDTO.getManagedId()); + stmt.setString(10, userDTO.getTmpPassword()); + stmt.executeUpdate(); + try (ResultSet rs = stmt.getGeneratedKeys()) { + if (rs.next()) { + vppUserId = rs.getInt(1); + } + } + return vppUserId; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining database connection when adding the vpp user"; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when processing SQL to add the vpp user."; + log.error(msg, e); + throw new ApplicationManagementDAOException(msg, e); + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.lib.data-table/public/data-tables_1.10.7/extensions/FixedHeader/css/dataTables.fixedHeader.css b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/SQLServerVppApplicationDAOImpl.java similarity index 82% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.lib.data-table/public/data-tables_1.10.7/extensions/FixedHeader/css/dataTables.fixedHeader.css rename to components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/SQLServerVppApplicationDAOImpl.java index 74dbaa8763..da4e4828da 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.lib.data-table/public/data-tables_1.10.7/extensions/FixedHeader/css/dataTables.fixedHeader.css +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/vpp/SQLServerVppApplicationDAOImpl.java @@ -16,10 +16,7 @@ * under the License. */ +package io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp; - -div.FixedHeader_Cloned th, -div.FixedHeader_Cloned td { - background-color: white !important; +public class SQLServerVppApplicationDAOImpl extends GenericVppApplicationDAOImpl { } - diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/ApplicationManagerImpl.java index ddbf68b2e7..0d65bdbd6d 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/ApplicationManagerImpl.java @@ -18,6 +18,24 @@ package io.entgra.device.mgt.core.application.mgt.core.impl; +import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException; +import io.entgra.device.mgt.core.device.mgt.common.Base64File; +import io.entgra.device.mgt.core.application.mgt.core.dao.SPApplicationDAO; +import io.entgra.device.mgt.core.application.mgt.core.util.ApplicationManagementUtil; +import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.validator.routines.UrlValidator; +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONObject; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.context.PrivilegedCarbonContext; import io.entgra.device.mgt.core.application.mgt.common.ApplicationArtifact; import io.entgra.device.mgt.core.application.mgt.common.ApplicationInstaller; import io.entgra.device.mgt.core.application.mgt.common.ApplicationList; @@ -60,12 +78,10 @@ import io.entgra.device.mgt.core.application.mgt.core.config.ConfigurationManage import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationDAO; import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationReleaseDAO; import io.entgra.device.mgt.core.application.mgt.core.dao.LifecycleStateDAO; -import io.entgra.device.mgt.core.application.mgt.core.dao.SPApplicationDAO; import io.entgra.device.mgt.core.application.mgt.core.dao.SubscriptionDAO; import io.entgra.device.mgt.core.application.mgt.core.dao.VisibilityDAO; import io.entgra.device.mgt.core.application.mgt.core.dao.common.ApplicationManagementDAOFactory; import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; -import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException; import io.entgra.device.mgt.core.application.mgt.core.exception.ForbiddenException; import io.entgra.device.mgt.core.application.mgt.core.exception.LifeCycleManagementDAOException; import io.entgra.device.mgt.core.application.mgt.core.exception.NotFoundException; @@ -73,27 +89,12 @@ import io.entgra.device.mgt.core.application.mgt.core.exception.VisibilityManage import io.entgra.device.mgt.core.application.mgt.core.internal.DataHolder; import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager; import io.entgra.device.mgt.core.application.mgt.core.util.APIUtil; -import io.entgra.device.mgt.core.application.mgt.core.util.ApplicationManagementUtil; import io.entgra.device.mgt.core.application.mgt.core.util.ConnectionManagerUtil; import io.entgra.device.mgt.core.application.mgt.core.util.Constants; -import io.entgra.device.mgt.core.device.mgt.common.Base64File; -import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata; import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; -import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException; import io.entgra.device.mgt.core.device.mgt.core.common.exception.StorageManagementException; import io.entgra.device.mgt.core.device.mgt.core.dto.DeviceType; import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringEscapeUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.commons.validator.routines.UrlValidator; -import org.apache.cxf.jaxrs.ext.multipart.Attachment; -import org.json.JSONObject; -import org.wso2.carbon.context.CarbonContext; -import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.user.api.UserRealm; import org.wso2.carbon.user.api.UserStoreException; @@ -1443,6 +1444,43 @@ public class ApplicationManagerImpl implements ApplicationManager { } } + @Override + public ApplicationList getSubscribedAppsOfDevice(int deviceId, PaginationRequest request) throws ApplicationManagementException { + ApplicationList applicationList = new ApplicationList(); + List applications = new ArrayList<>(); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + try { + ConnectionManagerUtil.openDBConnection(); + List applicationDTOS = this.applicationDAO.getSubscribedAppsOfDevice(deviceId, tenantId, request); + for (ApplicationDTO applicationDTO: applicationDTOS) { + applicationDTO.setTags(this.applicationDAO.getAppTags(applicationDTO.getId(), tenantId)); + applicationDTO.setAppCategories(this.applicationDAO.getAppCategories(applicationDTO.getId(), tenantId)); + applications.add(APIUtil.appDtoToAppResponse(applicationDTO)); + } + + List totalApplications = this.applicationDAO.getSubscribedAppsOfDevice(deviceId, tenantId, null); + Pagination pagination = new Pagination(); + pagination.setCount(totalApplications.size()); + pagination.setSize(applications.size()); + pagination.setOffset(request.getStartIndex()); + pagination.setLimit(request.getRowCount()); + applicationList.setApplications(applications); + applicationList.setPagination(pagination); + return applicationList; + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred when getting installed apps of device with device id: " + + deviceId; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "DB Connection error occurred while getting installed apps of device with device id: " + deviceId; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + /** * Check whether given OS range is valid or invalid * diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java index 7c3ee9694e..5dea673b5e 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java @@ -19,6 +19,29 @@ package io.entgra.device.mgt.core.application.mgt.core.impl; import com.google.gson.Gson; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager; +import io.entgra.device.mgt.core.application.mgt.core.dao.VppApplicationDAO; +import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException; +import io.entgra.device.mgt.core.device.mgt.core.DeviceManagementConstants; +import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException; +import io.entgra.device.mgt.core.device.mgt.extensions.logger.spi.EntgraLogger; +import io.entgra.device.mgt.core.notification.logger.AppInstallLogContext; +import io.entgra.device.mgt.core.notification.logger.impl.EntgraAppInstallLoggerImpl; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.lang.StringUtils; + +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.json.JSONArray; +import org.json.JSONObject; import io.entgra.device.mgt.core.apimgt.application.extension.dto.ApiApplicationKey; import io.entgra.device.mgt.core.apimgt.application.extension.exception.APIManagerException; import io.entgra.device.mgt.core.application.mgt.common.ApplicationInstallResponse; @@ -46,7 +69,6 @@ import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationDAO; import io.entgra.device.mgt.core.application.mgt.core.dao.SubscriptionDAO; import io.entgra.device.mgt.core.application.mgt.core.dao.common.ApplicationManagementDAOFactory; import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; -import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException; import io.entgra.device.mgt.core.application.mgt.core.exception.ForbiddenException; import io.entgra.device.mgt.core.application.mgt.core.exception.NotFoundException; import io.entgra.device.mgt.core.application.mgt.core.internal.DataHolder; @@ -60,10 +82,7 @@ import io.entgra.device.mgt.core.device.mgt.common.Device; import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; import io.entgra.device.mgt.core.device.mgt.common.EnrolmentInfo; import io.entgra.device.mgt.core.device.mgt.common.MDMAppConstants; -import io.entgra.device.mgt.core.device.mgt.common.MDMAppConstants; import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; -import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; -import io.entgra.device.mgt.core.device.mgt.common.PaginationResult; import io.entgra.device.mgt.core.device.mgt.common.PaginationResult; import io.entgra.device.mgt.core.device.mgt.common.app.mgt.App; import io.entgra.device.mgt.core.device.mgt.common.app.mgt.MobileAppTypes; @@ -82,18 +101,11 @@ import io.entgra.device.mgt.core.device.mgt.core.service.GroupManagementProvider import io.entgra.device.mgt.core.device.mgt.core.util.MDMAndroidOperationUtil; import io.entgra.device.mgt.core.device.mgt.core.util.MDMIOSOperationUtil; import io.entgra.device.mgt.core.device.mgt.core.util.MDMWindowsOperationUtil; -import io.entgra.device.mgt.core.device.mgt.extensions.logger.spi.EntgraLogger; import io.entgra.device.mgt.core.identity.jwt.client.extension.dto.AccessTokenInfo; -import io.entgra.device.mgt.core.notification.logger.AppInstallLogContext; -import io.entgra.device.mgt.core.notification.logger.impl.EntgraAppInstallLoggerImpl; -import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.StringRequestEntity; -import org.apache.commons.lang.StringUtils; -import org.json.JSONArray; -import org.json.JSONObject; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.user.api.UserStoreException; @@ -105,6 +117,9 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -124,12 +139,14 @@ public class SubscriptionManagerImpl implements SubscriptionManager { private static final EntgraLogger log = new EntgraAppInstallLoggerImpl(SubscriptionManagerImpl.class); private SubscriptionDAO subscriptionDAO; private ApplicationDAO applicationDAO; + private VppApplicationDAO vppApplicationDAO; private LifecycleStateManager lifecycleStateManager; public SubscriptionManagerImpl() { this.lifecycleStateManager = DataHolder.getInstance().getLifecycleStateManager(); this.subscriptionDAO = ApplicationManagementDAOFactory.getSubscriptionDAO(); this.applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO(); + this.vppApplicationDAO = ApplicationManagementDAOFactory.getVppApplicationDAO(); } @Override @@ -154,6 +171,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager { ApplicationDTO applicationDTO = getApplicationDTO(applicationUUID); ApplicationSubscriptionInfo applicationSubscriptionInfo = getAppSubscriptionInfo(applicationDTO, subType, params); + performExternalStoreSubscription(applicationDTO, applicationSubscriptionInfo); ApplicationInstallResponse applicationInstallResponse = performActionOnDevices( applicationSubscriptionInfo.getAppSupportingDeviceTypeName(), applicationSubscriptionInfo.getDevices(), applicationDTO, subType, applicationSubscriptionInfo.getSubscribers(), action, properties, isOperationReExecutingDisabled); @@ -162,6 +180,51 @@ public class SubscriptionManagerImpl implements SubscriptionManager { return applicationInstallResponse; } + private void performExternalStoreSubscription(ApplicationDTO applicationDTO, + ApplicationSubscriptionInfo + applicationSubscriptionInfo) throws ApplicationManagementException { + try { + // Only for iOS devices + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + if (DeviceTypes.IOS.toString().equalsIgnoreCase(APIUtil.getDeviceTypeData(applicationDTO + .getDeviceTypeId()).getName())) { + // TODO: replace getAssetByAppId with the correct one in DAO + // Check if the app trying to subscribe is a VPP asset. + VppAssetDTO storedAsset = vppApplicationDAO.getAssetByAppId(applicationDTO.getId(), tenantId); + if (storedAsset != null) { // This is a VPP asset + List users = new ArrayList<>(); + List devices = applicationSubscriptionInfo.getDevices();// get + // subscribed device list, so that we can extract the users of those devices. + for (Device device : devices) { + VppUserDTO user = vppApplicationDAO.getUserByDMUsername(device.getEnrolmentInfo() + .getOwner(), PrivilegedCarbonContext.getThreadLocalCarbonContext() + .getTenantId(true)); + users.add(user); + } + VPPApplicationManager vppManager = APIUtil.getVPPManager(); + vppManager.addAssociation(storedAsset, users); + } + } + } catch (BadRequestException e) { + String msg = "Device Type not found"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (UnexpectedServerErrorException e) { + String msg = "Unexpected error while getting device type"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error while getting the device user"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementException e) { + String msg = "Error while associating user"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + + } + @Override public void createScheduledSubscription(ScheduledSubscriptionDTO subscriptionDTO) throws SubscriptionManagementException { @@ -1268,38 +1331,37 @@ public class SubscriptionManagerImpl implements SubscriptionManager { } } - private int invokeIOTCoreAPI(HttpMethodBase request) throws UserStoreException, APIManagerException, IOException { - HttpClient httpClient; + private int invokeIOTCoreAPI(HttpPost request) throws UserStoreException, APIManagerException, IOException, + ApplicationManagementException { + CloseableHttpClient httpClient = getHttpClient(); String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); ApiApplicationKey apiApplicationKey = OAuthUtils.getClientCredentials(tenantDomain); String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm().getRealmConfiguration() .getAdminUserName() + Constants.ApplicationInstall.AT + tenantDomain; AccessTokenInfo tokenInfo = OAuthUtils.getOAuthCredentials(apiApplicationKey, username); - request.addRequestHeader(Constants.ApplicationInstall.AUTHORIZATION, + request.addHeader(Constants.ApplicationInstall.AUTHORIZATION, Constants.ApplicationInstall.AUTHORIZATION_HEADER_VALUE + tokenInfo.getAccessToken()); - httpClient = new HttpClient(); - httpClient.executeMethod(request); - return request.getStatusCode(); + HttpResponse response = httpClient.execute(request); + return response.getStatusLine().getStatusCode(); } public int installEnrollmentApplications(ApplicationPolicyDTO applicationPolicyDTO) throws ApplicationManagementException { - - PostMethod request; + String requestUrl =null; try { - String requestUrl = Constants.ApplicationInstall.ENROLLMENT_APP_INSTALL_PROTOCOL + System - .getProperty(Constants.ApplicationInstall.IOT_CORE_HOST) + Constants.ApplicationInstall.COLON + requestUrl = Constants.ApplicationInstall.ENROLLMENT_APP_INSTALL_PROTOCOL + System + .getProperty(Constants.ApplicationInstall.IOT_GATEWAY_HOST) + Constants.ApplicationInstall.COLON + System.getProperty(Constants.ApplicationInstall.IOT_CORE_PORT) + Constants.ApplicationInstall.GOOGLE_APP_INSTALL_URL; Gson gson = new Gson(); String payload = gson.toJson(applicationPolicyDTO); + HttpPost httpPost = new HttpPost(requestUrl); - StringRequestEntity requestEntity = new StringRequestEntity(payload, MediaType.APPLICATION_JSON, - Constants.ApplicationInstall.ENCODING); - request = new PostMethod(requestUrl); - request.setRequestEntity(requestEntity); - return invokeIOTCoreAPI(request); + StringEntity stringEntity = new StringEntity(payload, Constants.ApplicationInstall.ENCODING); + httpPost.addHeader("Content-Type",MediaType.APPLICATION_JSON); + httpPost.setEntity(stringEntity); + return invokeIOTCoreAPI(httpPost); } catch (UserStoreException e) { String msg = "Error while accessing user store for user with Android device."; log.error(msg, e); @@ -1308,18 +1370,38 @@ public class SubscriptionManagerImpl implements SubscriptionManager { String msg = "Error while retrieving access token for Android device"; log.error(msg, e); throw new ApplicationManagementException(msg, e); - } catch (HttpException e) { - String msg = "Error while calling the app store to install enrollment app with id: " + applicationPolicyDTO - .getApplicationDTO().getId() + " on device"; - log.error(msg, e); - throw new ApplicationManagementException(msg, e); } catch (IOException e) { String msg = "Error while installing the enrollment with id: " + applicationPolicyDTO.getApplicationDTO().getId() - + " on device"; + + " on device: request URL: " + requestUrl; + log.error(msg + "request url: " + requestUrl, e); + throw new ApplicationManagementException(msg, e); + } + } + + private CloseableHttpClient getHttpClient() throws ApplicationManagementException { + try { + SSLContextBuilder builder = new SSLContextBuilder(); + builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build()); + return HttpClients.custom().setSSLSocketFactory(sslsf).useSystemProperties().build(); + } catch (NoSuchAlgorithmException e) { + String msg = "Failed while building the http client for EntApp installation. " + + "Used SSL algorithm not available"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (KeyStoreException e) { + String msg = "Failed while building the http client for EntApp installation. " + + "Failed to load required key stores"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (KeyManagementException e) { + String msg = "Failed while building the http client for EntApp installation. " + + "Failed while building SSL context"; log.error(msg, e); throw new ApplicationManagementException(msg, e); } + } private String getIOTCoreBaseUrl() { @@ -1594,4 +1676,29 @@ public class SubscriptionManagerImpl implements SubscriptionManager { ConnectionManagerUtil.closeDBConnection(); } } + + @Override + public Activity getOperationAppDetails(String id) throws SubscriptionManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + int operationId = Integer.parseInt( + id.replace(DeviceManagementConstants.OperationAttributes.ACTIVITY, "")); + if (operationId == 0) { + throw new IllegalArgumentException("Operation ID cannot be null or zero (0)."); + } + try { + ConnectionManagerUtil.openDBConnection(); + return subscriptionDAO.getOperationAppDetails(operationId, tenantId); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred while retrieving app details of operation: " + operationId; + log.error(msg, e); + throw new SubscriptionManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "Error occurred while retrieving the database connection"; + log.error(msg, e); + throw new SubscriptionManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/VppApplicationManagerImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/VppApplicationManagerImpl.java new file mode 100644 index 0000000000..dc9b34e40d --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/VppApplicationManagerImpl.java @@ -0,0 +1,610 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.application.mgt.core.impl; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import io.entgra.device.mgt.core.application.mgt.common.DepConfig; +import io.entgra.device.mgt.core.application.mgt.common.dto.ItuneAppDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.ProxyResponse; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.response.Application; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO; +import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException; +import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException; +import io.entgra.device.mgt.core.application.mgt.common.exception.TransactionManagementException; +import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.VppAssociateRequestWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.VppItuneAssetResponseWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.VppItuneUserRequestWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.VppItuneUserResponseWrapper; +import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationDAO; +import io.entgra.device.mgt.core.application.mgt.core.dao.SPApplicationDAO; +import io.entgra.device.mgt.core.application.mgt.core.dao.VisibilityDAO; +import io.entgra.device.mgt.core.application.mgt.core.dao.VppApplicationDAO; +import io.entgra.device.mgt.core.application.mgt.core.dao.common.ApplicationManagementDAOFactory; +import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException; +import io.entgra.device.mgt.core.application.mgt.core.internal.DataHolder; +import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager; +import io.entgra.device.mgt.core.application.mgt.core.util.ApplicationManagementUtil; +import io.entgra.device.mgt.core.application.mgt.core.util.ConnectionManagerUtil; +import io.entgra.device.mgt.core.application.mgt.core.util.Constants; +import io.entgra.device.mgt.core.application.mgt.core.util.VppHttpUtil; +import io.entgra.device.mgt.core.application.mgt.core.util.APIUtil; +import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService; +import io.entgra.device.mgt.core.device.mgt.core.DeviceManagementConstants; +import io.entgra.device.mgt.core.device.mgt.core.internal.DeviceManagementDataHolder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpStatus; +import org.wso2.carbon.context.PrivilegedCarbonContext; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class VppApplicationManagerImpl implements VPPApplicationManager { + private static final String APP_API = "https://vpp.itunes.apple.com/mdm/v2"; + private static final String ASSETS = APP_API + "/assets"; + private static final String USER_CREATE = APP_API + "/users/create"; + private static final String USER_UPDATE = APP_API + "/users/update"; + private static final String USER_GET = APP_API + "/users"; + private static final String ASSIGNMENTS_POST = APP_API + "/assets/associate"; + private static final String ASSIGNMENTS_GET = APP_API + "/assignments"; + private static final String TOKEN = ""; + private static final String LOOKUP_API = "https://uclient-api.itunes.apple" + + ".com/WebObjects/MZStorePlatform.woa/wa/lookup?version=2&id="; + private static final String LOOKUP_API_PREFIX = + "&p=mdm-lockup&caller=MDM&platform=enterprisestore&cc=us&l=en"; + + + private static final Log log = LogFactory.getLog(VppApplicationManagerImpl.class); + + private ApplicationDAO applicationDAO; + private SPApplicationDAO spApplicationDAO; + private VisibilityDAO visibilityDAO; + private final LifecycleStateManager lifecycleStateManager; + private VppApplicationDAO vppApplicationDAO; + + public VppApplicationManagerImpl() { + initDataAccessObjects(); + lifecycleStateManager = DataHolder.getInstance().getLifecycleStateManager(); + } + + private void initDataAccessObjects() { + this.applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO(); + this.visibilityDAO = ApplicationManagementDAOFactory.getVisibilityDAO(); + this.spApplicationDAO = ApplicationManagementDAOFactory.getSPApplicationDAO(); + this.vppApplicationDAO = ApplicationManagementDAOFactory.getVppApplicationDAO(); + } + + @Override + public VppUserDTO addUser(VppUserDTO userDTO) throws ApplicationManagementException { + + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + + // Call the API to add + try { + VppItuneUserDTO ituneUserDTO = userDTO; + VppItuneUserRequestWrapper wrapper = new VppItuneUserRequestWrapper(); + wrapper.getUser().add(ituneUserDTO); + + Gson gson = new Gson(); + String userPayload = gson.toJson(wrapper); + + ProxyResponse proxyResponse = callVPPBackend(USER_CREATE, userPayload, getVppToken(), Constants.VPP.POST); + if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() == + HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.EVENT_ID)) { + // Create user does not return any useful data. Its needed to call the backend again + ProxyResponse getUserResponse = callVPPBackend(USER_GET + Constants.VPP.CLIENT_USER_ID_PARAM + + userDTO.getClientUserId(), userPayload, getVppToken(), Constants.VPP.GET); + if ((getUserResponse.getCode() == HttpStatus.SC_OK || getUserResponse.getCode() == + HttpStatus.SC_CREATED) && getUserResponse.getData().contains(Constants.VPP.TOTAL_PAGES)) { + VppItuneUserResponseWrapper vppItuneUserResponseWrapper = gson.fromJson + (getUserResponse.getData(), VppItuneUserResponseWrapper.class); + userDTO.setInviteCode(vppItuneUserResponseWrapper.getUser().get(0) + .getInviteCode()); + userDTO.setStatus(vppItuneUserResponseWrapper.getUser().get(0).getStatus()); + log.error("userDTO " + userDTO.toString()); + try { + ConnectionManagerUtil.beginDBTransaction(); + int id = vppApplicationDAO.addVppUser(userDTO, tenantId); + if (id != -1) { + ConnectionManagerUtil.commitDBTransaction(); + userDTO.setId(id); + userDTO.setTenantId(PrivilegedCarbonContext + .getThreadLocalCarbonContext().getTenantId()); + return userDTO; + } + ConnectionManagerUtil.rollbackDBTransaction(); + return null; + } catch (ApplicationManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred while adding the Vpp User."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (TransactionManagementException e) { + String msg = "Error occurred while executing database transaction for adding Vpp User."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "Error occurred while retrieving the database connection for adding Vpp User."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + } + } catch (IOException e) { + String msg = "Error while calling VPP backend to add user"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + return null; + } + + @Override + public VppUserDTO getUserByDMUsername(String emmUsername) throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + try { + ConnectionManagerUtil.openDBConnection(); + return vppApplicationDAO.getUserByDMUsername(emmUsername, tenantId); + } catch (DBConnectionException e) { + String msg = "DB Connection error occurs while getting vpp User data related to EMM user " + emmUsername + "."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred while getting vpp User data related to EMM user " + emmUsername + "."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public void updateUser(VppUserDTO userDTO) throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + VppItuneUserDTO ituneUserDTO = userDTO; + VppItuneUserRequestWrapper wrapper = new VppItuneUserRequestWrapper(); + wrapper.getUser().add(ituneUserDTO); + + Gson gson = new Gson(); + String userPayload = gson.toJson(wrapper); + try { + ProxyResponse proxyResponse = callVPPBackend(USER_UPDATE, userPayload, getVppToken(), Constants.VPP.POST); + if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() == + HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.EVENT_ID)) { + VppUserDTO currentUserDTO = getUserByDMUsername(userDTO.getDmUsername()); + if (currentUserDTO != null) { + userDTO.setId(currentUserDTO.getId()); + } + try { + ConnectionManagerUtil.beginDBTransaction(); + if (vppApplicationDAO.updateVppUser(userDTO, tenantId) == null) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Unable to update the Vpp user " +userDTO.getId(); + log.error(msg); + throw new ApplicationManagementException(msg); + } + ConnectionManagerUtil.commitDBTransaction(); + } catch (ApplicationManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred while updating the Vpp User."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (TransactionManagementException e) { + String msg = "Error occurred while executing database transaction for Vpp User update."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "Error occurred while retrieving the database connection for Vpp User update."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + } catch (IOException e) { + String msg = "Error while calling VPP backend to update"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + } + + @Override + public void syncUsers(String clientId) throws ApplicationManagementException { + ProxyResponse proxyResponse = null; + try { + proxyResponse = callVPPBackend(USER_GET, null, getVppToken(), Constants + .VPP.GET); + if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() == + HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.TOTAL_PAGES)) { + log.error("proxyResponse " + proxyResponse.getData()); + Gson gson = new Gson(); + VppItuneUserResponseWrapper vppUserResponseWrapper = gson.fromJson + (proxyResponse.getData(), VppItuneUserResponseWrapper.class); + // TODO: to implement later + } + } catch (IOException e) { + String msg = "Error while syncing VPP users with backend"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + + } + + @Override + public void syncAssets(int nextPageIndex) throws ApplicationManagementException { + ProxyResponse proxyResponse = null; + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + try { + String url = ASSETS; + if (nextPageIndex > 0) { // Not the first page + url += "?pageIndex=" + nextPageIndex; + } + proxyResponse = callVPPBackend(url, null, getVppToken(), Constants.VPP.GET); + if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() == + HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.TOTAL_PAGES)) { + Gson gson = new Gson(); + VppItuneAssetResponseWrapper vppItuneAssetResponse = gson.fromJson + (proxyResponse.getData(), VppItuneAssetResponseWrapper.class); + if (vppItuneAssetResponse.getSize() > 0) { + for (VppAssetDTO vppAssetDTO : vppItuneAssetResponse.getAssets()) { + vppAssetDTO.setTenantId(PrivilegedCarbonContext + .getThreadLocalCarbonContext().getTenantId()); + vppAssetDTO.setCreatedTime(String.valueOf(System.currentTimeMillis())); + vppAssetDTO.setLastUpdatedTime(String.valueOf(System.currentTimeMillis())); + } + + for (VppAssetDTO vppAssetDTO : vppItuneAssetResponse.getAssets()) { + ItuneAppDTO ituneAppDTO = lookupAsset(vppAssetDTO.getAdamId()); + ApplicationManagementUtil.persistApp(ituneAppDTO); + List applications = ApplicationManagementUtil.getAppDetails(vppAssetDTO.getAdamId()); + for (Application application :applications) { + VppAssetDTO vppAssetDTOs = getAssetByAppId(application.getId()); + if (vppAssetDTOs == null) { + vppAssetDTOs = new VppAssetDTO(); + vppAssetDTO.setAppId(application.getId()); + try { + ConnectionManagerUtil.beginDBTransaction(); + if (vppApplicationDAO.addAsset(vppAssetDTO, tenantId) != -1) { + ConnectionManagerUtil.commitDBTransaction(); + } + ConnectionManagerUtil.rollbackDBTransaction(); + } catch (ApplicationManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred while adding the Asset."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (TransactionManagementException e) { + String msg = "Error occurred while executing database transaction for adding Asset."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "Error occurred while retrieving the database connection for adding Asset."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } else { + vppAssetDTOs.setAppId(application.getId()); + vppAssetDTOs.setSupportedPlatforms(vppAssetDTO.getSupportedPlatforms()); + try { + ConnectionManagerUtil.beginDBTransaction(); + if (vppApplicationDAO.updateAsset(vppAssetDTOs, tenantId) == null) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Unable to update the asset: " +vppAssetDTOs.getAdamId(); + log.error(msg); + throw new ApplicationManagementException(msg); + } + ConnectionManagerUtil.commitDBTransaction(); + } catch (ApplicationManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred while updating the Asset."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (TransactionManagementException e) { + String msg = "Error occurred while executing database transaction for Asset update."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "Error occurred while retrieving the database connection for Asset update."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + } + } + } + + if (vppItuneAssetResponse.getCurrentPageIndex() == (vppItuneAssetResponse + .getTotalPages() - 1)) { + return; + } else { + syncAssets(vppItuneAssetResponse.getNextPageIndex()); + } + } + } catch (IOException e) { + String msg = "Error while syncing VPP users with backend"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + } + + private ItuneAppDTO lookupAsset(String packageName) throws ApplicationManagementException { + String lookupURL = LOOKUP_API + packageName + LOOKUP_API_PREFIX; + try { + ProxyResponse proxyResponse = callVPPBackend(lookupURL, null, getVppToken(), Constants.VPP.GET); + if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() == + HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.GET_APP_DATA_RESPONSE_START)) { + String responseData = proxyResponse.getData(); + JsonObject responseJson = new JsonParser().parse(responseData) + .getAsJsonObject(); + + JsonObject results = responseJson.getAsJsonObject(Constants.ApplicationProperties.RESULTS); + JsonObject result = results.getAsJsonObject(packageName); + + String iconUrl = result.getAsJsonObject(Constants.ApplicationProperties.ARTWORK) + .get(Constants.ApplicationProperties.URL).getAsString(); + int lastSlashIndex = iconUrl.lastIndexOf("/"); + if (lastSlashIndex != -1) { + iconUrl = iconUrl.substring(0, lastSlashIndex + 1) + Constants.VPP.REMOTE_FILE_NAME; + } + + String descriptionStandard = result.getAsJsonObject(Constants.ApplicationProperties.DESCRIPTION) + .get(Constants.ApplicationProperties.STANDARD).getAsString(); + if (descriptionStandard != null && !descriptionStandard.isEmpty()) { + descriptionStandard = descriptionStandard.substring(0, 199); + } + String name = result.get(Constants.ApplicationProperties.NAME).getAsString(); + double price = result.getAsJsonArray(Constants.ApplicationProperties.OFFERS).get(0) + .getAsJsonObject().get(Constants.ApplicationProperties.PRICE).getAsDouble(); + String version = result.getAsJsonArray(Constants.ApplicationProperties.OFFERS) + .get(0).getAsJsonObject().get(Constants.ApplicationProperties.VERSION) + .getAsJsonObject().get(Constants.ApplicationProperties.DISPLAY).getAsString(); + + String[] genreNames = new Gson().fromJson(result.getAsJsonArray(Constants.ApplicationProperties.GENRE_NAMES), + String[].class); + + ItuneAppDTO ituneAppDTO = new ItuneAppDTO(); + ituneAppDTO.setPackageName(packageName); + ituneAppDTO.setVersion(version); + ituneAppDTO.setDescription(descriptionStandard); + ituneAppDTO.setTitle(name); + + if (Constants.ApplicationProperties.PRICE_ZERO.equalsIgnoreCase(String.valueOf(price))) { + ituneAppDTO.setPaymentMethod(Constants.ApplicationProperties.FREE_SUB_METHOD); + } else { + ituneAppDTO.setPaymentMethod(Constants.ApplicationProperties.PAID_SUB_METHOD); + } + ituneAppDTO.setIconURL(iconUrl); + ituneAppDTO.setCategory(genreNames[0]); + + return ituneAppDTO; + } + } catch (IOException e) { + String msg = "Error while looking up the app details"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + return null; + } + + @Override + public VppAssetDTO getAssetByAppId(int appId) throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + try { + ConnectionManagerUtil.openDBConnection(); + return vppApplicationDAO.getAssetByAppId(appId, tenantId); + } catch (DBConnectionException e) { + String msg = "DB Connection error occurs while getting asset related to app with app id " + appId + "."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred while getting asset data related to app with app id " + appId + "."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public boolean addAssociation(VppAssetDTO asset, List vppUsers) throws + ApplicationManagementException { + + List associations = new ArrayList<>(); // To save to UEM DBs + List clientUserIds = new ArrayList<>(); // Need this to send to vpp backend. + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + if (asset != null) { + for (VppUserDTO vppUserDTO : vppUsers) { + VppAssociationDTO associationDTO = VppHttpUtil.getAssociation(vppUserDTO, asset); + associations.add(associationDTO); + clientUserIds.add(vppUserDTO.getClientUserId()); + } + + if (associations.size() > 0) { + //TODO: Add or Update associations + try { + + // Create the VPP backend payload + List assets = new ArrayList<>(); + VppItuneAssetDTO assetDTO = new VppItuneAssetDTO(); + assetDTO.setAdamId(asset.getAdamId()); + assetDTO.setPricingParam(asset.getPricingParam()); + assets.add(assetDTO); + + VppAssociateRequestWrapper vppAssociate = new VppAssociateRequestWrapper(); + vppAssociate.setAssets(assets); + vppAssociate.setClientUserIds(clientUserIds); + + Gson gson = new Gson(); + String payload = gson.toJson(vppAssociate); + + ProxyResponse proxyResponse = callVPPBackend(ASSIGNMENTS_POST, payload, getVppToken(), + Constants.VPP.POST); + if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() == + HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.EVENT_ID)) { + // Create assignment does not return any useful data. Its needed to call the backend again + ProxyResponse getAssignmentResponse = callVPPBackend(ASSIGNMENTS_GET, null, getVppToken(), Constants.VPP.GET); + if ((getAssignmentResponse.getCode() == HttpStatus.SC_OK || getAssignmentResponse.getCode() == + HttpStatus.SC_CREATED) && getAssignmentResponse.getData().contains(Constants.VPP.TOTAL_PAGES)) { +// VppAssociateResponseWrapper vppAssociateResponseWrapper = gson.fromJson +// (getAssignmentResponse.getData(), VppAssociateResponseWrapper.class); + for (VppAssociationDTO association : associations) { + + VppAssociationDTO vppAssociation = getAssociation(association.getAssetId(), association.getClientId()); + + if (vppAssociation == null) { + try { + ConnectionManagerUtil.beginDBTransaction(); + if (vppApplicationDAO.addAssociation(association, tenantId) != -1) { + ConnectionManagerUtil.commitDBTransaction(); + return true; + } + ConnectionManagerUtil.rollbackDBTransaction(); + return false; + } catch (ApplicationManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred while adding the Assignment."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (TransactionManagementException e) { + String msg = "Error occurred while executing database transaction for adding Assignment."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "Error occurred while retrieving the database connection for adding Assignment."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } else { + try { + ConnectionManagerUtil.beginDBTransaction(); + if (vppApplicationDAO.updateAssociation(association, tenantId) == null) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Unable to update the assignment: " +association.getAssetId(); + log.error(msg); + throw new ApplicationManagementException(msg); + } + ConnectionManagerUtil.commitDBTransaction(); + return true; + } catch (ApplicationManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred while updating the Asset."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (TransactionManagementException e) { + String msg = "Error occurred while executing database transaction for Asset update."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "Error occurred while retrieving the database connection for Asset update."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + } + } + + } + + } catch (IOException e) { + String msg = "Error while adding associations"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + } + + } + + return false; + } + + @Override + public VppAssociationDTO getAssociation(int assetId, int userId) throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + try { + ConnectionManagerUtil.openDBConnection(); + return vppApplicationDAO.getAssociation(assetId, userId, tenantId); + } catch (DBConnectionException e) { + String msg = "DB Connection error occurs while getting assignment related to user of id " + userId + "."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred while getting assignment data related to user of id " + userId + "."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public ProxyResponse callVPPBackend(String url, + String payload, + String accessToken, + String method) throws IOException { + return VppHttpUtil.execute(url, payload, accessToken, method); + } + + public String getVppToken() throws ApplicationManagementException { + String token = ""; + MetadataManagementService meta = APIUtil.getMetadataManager(); + Metadata metadata = null; + try { + metadata = meta.retrieveMetadata("DEP_META_KEY"); + if (metadata != null) { + + Gson g = new Gson(); + DepConfig depConfigs = g.fromJson(metadata.getMetaValue(), DepConfig.class); + token = depConfigs.getVppToken(); + return token; + } + }catch (MetadataManagementException e) { + String msg = "Error when retrieving metadata of vpp feature"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + return token; + } + + public VppAssociationDTO getUserAssociation(String adamId, String emmUsername) throws ApplicationManagementException { + // Todo: Join the 3 tables and find a matching association + return null; + } + +} diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/internal/ApplicationManagementServiceComponent.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/internal/ApplicationManagementServiceComponent.java index 91ea87f66f..151240e3c0 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/internal/ApplicationManagementServiceComponent.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/internal/ApplicationManagementServiceComponent.java @@ -18,6 +18,13 @@ package io.entgra.device.mgt.core.application.mgt.core.internal; import io.entgra.device.mgt.core.application.mgt.common.config.LifecycleState; +import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationManager; +import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationStorageManager; +import io.entgra.device.mgt.core.application.mgt.common.services.AppmDataHandler; +import io.entgra.device.mgt.core.application.mgt.common.services.ReviewManager; +import io.entgra.device.mgt.core.application.mgt.common.services.SPApplicationManager; +import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager; +import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager; import io.entgra.device.mgt.core.application.mgt.common.services.*; import io.entgra.device.mgt.core.application.mgt.core.config.ConfigurationManager; import io.entgra.device.mgt.core.application.mgt.core.dao.common.ApplicationManagementDAOFactory; @@ -89,6 +96,12 @@ public class ApplicationManagementServiceComponent { DataHolder.getInstance().setConfigManager(configManager); bundleContext.registerService(AppmDataHandler.class.getName(), configManager, null); + // TODO: Get the new instance from extension like others + VPPApplicationManager vppApplicationManager = ApplicationManagementUtil + .getVPPManagerInstance(); + DataHolder.getInstance().setVppApplicationManager(vppApplicationManager); + bundleContext.registerService(VPPApplicationManager.class.getName(), vppApplicationManager, null); + ScheduledAppSubscriptionTaskManager taskManager = new ScheduledAppSubscriptionTaskManager(); // todo: taskManager.scheduleCleanupTask(); diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/internal/DataHolder.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/internal/DataHolder.java index 2484822e7c..bc770ead5e 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/internal/DataHolder.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/internal/DataHolder.java @@ -17,6 +17,13 @@ */ package io.entgra.device.mgt.core.application.mgt.core.internal; +import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationManager; +import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationStorageManager; +import io.entgra.device.mgt.core.application.mgt.common.services.AppmDataHandler; +import io.entgra.device.mgt.core.application.mgt.common.services.SPApplicationManager; +import io.entgra.device.mgt.core.application.mgt.common.services.ReviewManager; +import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager; +import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager; import io.entgra.device.mgt.core.application.mgt.common.services.*; import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager; import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; @@ -34,6 +41,8 @@ public class DataHolder { private SPApplicationManager SPApplicationManager; + private VPPApplicationManager vppApplicationManager; + private ApplicationManager applicationManager; private ReviewManager reviewManager; @@ -137,4 +146,12 @@ public class DataHolder { public void setISApplicationManager(SPApplicationManager SPApplicationManager) { this.SPApplicationManager = SPApplicationManager; } + + public VPPApplicationManager getVppApplicationManager() { + return vppApplicationManager; + } + + public void setVppApplicationManager(VPPApplicationManager vppApplicationManager) { + this.vppApplicationManager = vppApplicationManager; + } } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/APIUtil.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/APIUtil.java index bad2cc2926..67938483a0 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/APIUtil.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/APIUtil.java @@ -65,6 +65,7 @@ public class APIUtil { private static volatile SubscriptionManager subscriptionManager; private static volatile ReviewManager reviewManager; private static volatile AppmDataHandler appmDataHandler; + private static volatile VPPApplicationManager vppApplicationManager; private static volatile MetadataManagementService metadataManagementService; public static SPApplicationManager getSPApplicationManager() { @@ -107,6 +108,24 @@ public class APIUtil { return applicationManager; } + public static MetadataManagementService getMetadataManager() { + if (metadataManagementService == null) { + synchronized (APIUtil.class) { + if (metadataManagementService == null) { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + metadataManagementService = + (MetadataManagementService) ctx.getOSGiService(MetadataManagementService.class, null); + if (metadataManagementService == null) { + String msg = "MetadataManagement Manager service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + } + } + } + return metadataManagementService; + } + /** * To get the ApplicationDTO Storage Manager from the osgi context. * @return ApplicationStoreManager instance in the current osgi context. @@ -195,6 +214,29 @@ public class APIUtil { return reviewManager; } + public static VPPApplicationManager getVPPManager() { + try { + if (vppApplicationManager == null) { + synchronized (APIUtil.class) { + if (vppApplicationManager == null) { + vppApplicationManager = ApplicationManagementUtil.getVPPManagerInstance(); + if (vppApplicationManager == null) { + String msg = "Vpp Manager service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + } + } + } + } catch (Exception e) { + String msg = "Error occurred while getting the vpp manager"; + log.error(msg); + throw new IllegalStateException(msg); + } + return vppApplicationManager; + } + + /** * To get the DataHandler from the osgi context. * @return AppmDataHandler instance in the current osgi context. @@ -419,9 +461,13 @@ public class APIUtil { } List applicationReleases = new ArrayList<>(); if (ApplicationType.PUBLIC.toString().equals(applicationDTO.getType()) && application.getCategories() - .contains("GooglePlaySyncedApp")) { + .contains(Constants.GOOGLE_PLAY_SYNCED_APP)) { application.setAndroidEnterpriseApp(true); } + if (ApplicationType.PUBLIC.toString().equals(applicationDTO.getType()) && application.getCategories() + .contains(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY)) { + application.setExternalAppStoreApp(true); + } for (ApplicationReleaseDTO applicationReleaseDTO : applicationDTO.getApplicationReleaseDTOs()) { applicationReleases.add(releaseDtoToRelease(applicationReleaseDTO)); } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/ApplicationManagementUtil.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/ApplicationManagementUtil.java index 4800743abc..671dfdf84f 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/ApplicationManagementUtil.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/ApplicationManagementUtil.java @@ -19,24 +19,64 @@ package io.entgra.device.mgt.core.application.mgt.core.util; import io.entgra.device.mgt.core.application.mgt.common.ApplicationArtifact; import io.entgra.device.mgt.core.application.mgt.common.FileDataHolder; +import io.entgra.device.mgt.core.application.mgt.common.LifecycleChanger; import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.ItuneAppDTO; import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException; import io.entgra.device.mgt.core.application.mgt.common.exception.InvalidConfigurationException; import io.entgra.device.mgt.core.application.mgt.common.exception.RequestValidatingException; -import io.entgra.device.mgt.core.application.mgt.common.services.*; -import io.entgra.device.mgt.core.application.mgt.common.wrapper.*; +import io.entgra.device.mgt.core.application.mgt.common.response.Application; +import io.entgra.device.mgt.core.application.mgt.common.response.Category; +import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationManager; +import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationStorageManager; +import io.entgra.device.mgt.core.application.mgt.common.services.ReviewManager; +import io.entgra.device.mgt.core.application.mgt.common.services.SPApplicationManager; +import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager; +import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.ApplicationUpdateWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.ApplicationWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.CustomAppReleaseWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.CustomAppWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.EntAppReleaseWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.PublicAppReleaseWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.PublicAppWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.WebAppReleaseWrapper; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.WebAppWrapper; import io.entgra.device.mgt.core.application.mgt.core.config.ConfigurationManager; import io.entgra.device.mgt.core.application.mgt.core.config.Extension; import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException; +import io.entgra.device.mgt.core.application.mgt.core.impl.VppApplicationManagerImpl; import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager; import io.entgra.device.mgt.core.device.mgt.common.Base64File; +import io.entgra.device.mgt.core.device.mgt.common.DeviceManagementConstants; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService; import io.entgra.device.mgt.core.device.mgt.core.common.util.FileUtil; +import io.entgra.device.mgt.core.device.mgt.core.metadata.mgt.MetadataManagementServiceImpl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import io.entgra.device.mgt.core.application.mgt.common.services.*; +import io.entgra.device.mgt.core.application.mgt.common.wrapper.*; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; -import java.util.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * This DAOUtil class is responsible for making sure single instance of each Extension Manager is used throughout for @@ -168,6 +208,10 @@ public class ApplicationManagementUtil { return getInstance(extension, LifecycleStateManager.class); } + public static VPPApplicationManager getVPPManagerInstance() { + // TODO: implement as an extension + return new VppApplicationManagerImpl(); + } /** * This is useful to delete application artifacts if any error occurred while creating release/application * after uploading the artifacts @@ -232,4 +276,265 @@ public class ApplicationManagementUtil { throw new InvalidConfigurationException(msg, e); } } + + public static void persistApp(ItuneAppDTO product) throws ApplicationManagementException { + ApplicationManager applicationManager = APIUtil.getApplicationManager(); + List categories = applicationManager.getRegisteredCategories(); + if (product != null && product.getVersion() != null) { + // Generate artifacts + ApplicationArtifact applicationArtifact = generateArtifacts(product); + + List packageNamesOfApps = new ArrayList<>(); + packageNamesOfApps.add(product.getPackageName()); + + List existingApps = applicationManager.getApplications(packageNamesOfApps); + + if (existingApps != null && existingApps.size() > 0) { + Application app = existingApps.get(0); + if (product.getPackageName().equals(app.getPackageName())) { + ApplicationUpdateWrapper applicationUpdateWrapper = generatePubAppUpdateWrapper(product, categories); + applicationManager.updateApplication(app.getId(), applicationUpdateWrapper); + + PublicAppReleaseWrapper publicAppReleaseWrapper = new PublicAppReleaseWrapper(); + if (app.getSubMethod() + .equalsIgnoreCase(Constants.ApplicationProperties.FREE_SUB_METHOD)) { + publicAppReleaseWrapper.setPrice(0.0); + } else { + publicAppReleaseWrapper.setPrice(1.0); + } + + publicAppReleaseWrapper.setDescription(product.getDescription()); + publicAppReleaseWrapper.setReleaseType("ga"); + publicAppReleaseWrapper.setVersion(product.getVersion()); + publicAppReleaseWrapper.setSupportedOsVersions("4.0-12.3"); + applicationManager.updatePubAppRelease(app.getApplicationReleases().get(0).getUuid(), + publicAppReleaseWrapper, applicationArtifact); + return; + } + } else { + + // Generate App wrapper + PublicAppWrapper publicAppWrapper = generatePubAppWrapper(product, categories); + PublicAppReleaseWrapper appReleaseWrapper = new PublicAppReleaseWrapper(); + + if (publicAppWrapper.getSubMethod() + .equalsIgnoreCase(Constants.ApplicationProperties.FREE_SUB_METHOD)) { + appReleaseWrapper.setPrice(0.0); + } else { + appReleaseWrapper.setPrice(1.0); + } + + appReleaseWrapper.setDescription(product.getDescription()); + appReleaseWrapper.setReleaseType("ga"); + appReleaseWrapper.setVersion(product.getVersion()); + appReleaseWrapper.setPackageName(product.getPackageName()); + appReleaseWrapper.setSupportedOsVersions("4.0-12.3"); + + publicAppWrapper.setPublicAppReleaseWrappers( + Arrays.asList(new PublicAppReleaseWrapper[]{appReleaseWrapper})); + + try { + updateImages(appReleaseWrapper, applicationArtifact.getIconName(), + applicationArtifact.getIconStream(), applicationArtifact.getScreenshots()); + + Application application = applicationManager.createApplication(publicAppWrapper, false); + if (application != null && (application.getApplicationReleases().get(0).getCurrentStatus() == null + || application.getApplicationReleases().get(0).getCurrentStatus().equals("CREATED"))) { + String uuid = application.getApplicationReleases().get(0).getUuid(); + LifecycleChanger lifecycleChanger = new LifecycleChanger(); + lifecycleChanger.setAction("IN-REVIEW"); + applicationManager.changeLifecycleState(uuid, lifecycleChanger); + lifecycleChanger.setAction("APPROVED"); + applicationManager.changeLifecycleState(uuid, lifecycleChanger); + lifecycleChanger.setAction("PUBLISHED"); + applicationManager.changeLifecycleState(uuid, lifecycleChanger); + } + } catch (IOException e) { + String msg = "Error while downloading images of release."; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } + } + } + } + + private static PublicAppWrapper generatePubAppWrapper(ItuneAppDTO product, List categories) { + PublicAppWrapper publicAppWrapper = new PublicAppWrapper(); + publicAppWrapper.setName(product.getTitle()); + publicAppWrapper.setDescription(product.getDescription()); + publicAppWrapper.setCategories( + Collections.singletonList(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY));//Default category + for (Category category : categories) { + if (product.getCategory() == null) { + List pubAppCategories = new ArrayList<>(); + pubAppCategories.add(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY); + publicAppWrapper.setCategories(pubAppCategories); + break; + } else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) { + List pubAppCategories = new ArrayList<>(); + pubAppCategories.add(category.getCategoryName()); + pubAppCategories.add(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY); + publicAppWrapper.setCategories(pubAppCategories); + break; + } + } + if (product.getPaymentMethod().equalsIgnoreCase(Constants.ApplicationProperties.FREE_SUB_METHOD)) { + publicAppWrapper.setSubMethod(Constants.ApplicationProperties.FREE_SUB_METHOD); + } else { + publicAppWrapper.setSubMethod(Constants.ApplicationProperties.PAID_SUB_METHOD); + } + // TODO: purchase an app from app store and see how to capture the real value for price + // field. + publicAppWrapper.setPaymentCurrency("$"); + publicAppWrapper.setDeviceType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_IOS); + return publicAppWrapper; + } + + private static ApplicationUpdateWrapper generatePubAppUpdateWrapper(ItuneAppDTO product, List categories) { + ApplicationUpdateWrapper applicationUpdateWrapper = new ApplicationUpdateWrapper(); + applicationUpdateWrapper.setName(product.getTitle()); + applicationUpdateWrapper.setDescription(product.getDescription()); + applicationUpdateWrapper.setCategories( + Collections.singletonList(Constants + .ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY));//Default + // add the default APPLE_STORE_SYNCED_APP_CATEGORY + for (Category category : categories) { + if (product.getCategory() == null) { + List pubAppCategories = new ArrayList<>(); + pubAppCategories.add(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY); + applicationUpdateWrapper.setCategories(pubAppCategories); + break; + } else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) { + List pubAppCategories = new ArrayList<>(); + pubAppCategories.add(category.getCategoryName()); + pubAppCategories.add(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY); + applicationUpdateWrapper.setCategories(pubAppCategories); + break; + } + } + if (product.getPaymentMethod().equalsIgnoreCase(Constants.ApplicationProperties.FREE_SUB_METHOD)) { + applicationUpdateWrapper.setSubMethod(Constants.ApplicationProperties.FREE_SUB_METHOD); + } else { + applicationUpdateWrapper.setSubMethod(Constants.ApplicationProperties.PAID_SUB_METHOD); + } + // TODO: purchase an app from Playstore and see how to capture the real value for price field. + applicationUpdateWrapper.setPaymentCurrency("$"); + return applicationUpdateWrapper; + } + + private static ApplicationArtifact generateArtifacts(ItuneAppDTO product) throws ApplicationManagementException { + ApplicationArtifact applicationArtifact = new ApplicationArtifact(); + String prefix = product.getPackageName(); + try { + String iconName = prefix + "_icon"; + applicationArtifact.setIconName(iconName); + InputStream iconInputStream = getInputStream(iconName, product.getIconURL()); + applicationArtifact.setIconStream(iconInputStream); + Map screenshotMap = new HashMap<>(); + // TODO: look for a way to get screenshots + + for (int a = 0; a < 3; a++) { + String screenshotName = product.getPackageName() + a; + InputStream screenshotInputStream = getInputStream(screenshotName, product.getIconURL()); + screenshotMap.put(screenshotName, screenshotInputStream); + } + + applicationArtifact.setScreenshots(screenshotMap); + return applicationArtifact; + } catch (ApplicationManagementException e) { + String msg = "Error occurred while generating Application artifact"; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } + } + + private static InputStream getInputStream(String filename, String url) throws ApplicationManagementException { + URL website; + try { + website = new URL(url); + } catch (MalformedURLException e) { + String msg = "Error occurred while converting the url " + url; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } + ReadableByteChannel rbc = null; + FileOutputStream fos = null; + try { + rbc = Channels.newChannel(website.openStream()); + fos = new FileOutputStream(System.getProperty("java.io.tmpdir") + + File.separator + filename); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + } catch (IOException e) { + String msg = "Error occurred while opening stream for url " + url; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } finally { + try { + fos.close(); + rbc.close(); + } catch (IOException e) { + } + } + + File file = new File(System.getProperty("java.io.tmpdir") + File.separator + filename); + InputStream targetStream; + try { + targetStream = new FileInputStream(file); + } catch (FileNotFoundException e) { + String msg = "Error occurred while reading the tmp file " + System.getProperty("java.io.tmpdir") + + File.separator + filename; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } + file.deleteOnExit(); + return targetStream; + } + + private static void updateImages(PublicAppReleaseWrapper appReleaseWrapper, String iconName, + InputStream iconStream, Map + screenshotsMaps) throws IOException { + List screenshots = new ArrayList<>(); + Base64File iconFile = new Base64File(iconName, + convertStreamToBase64(iconStream)); + appReleaseWrapper.setIcon(iconFile); + if (screenshotsMaps.size() > 0) { + for (Map.Entry screenshotEntry : screenshotsMaps.entrySet()) { + Base64File screenshot = new Base64File(screenshotEntry.getKey(), + convertStreamToBase64(screenshotEntry.getValue())); + screenshots.add(screenshot); + } + appReleaseWrapper.setScreenshots(screenshots); + } + } + + private static String convertStreamToBase64(InputStream inputStream) throws IOException { + final int bufLen = 4 * 0x400; // 4KB + byte[] buf = new byte[bufLen]; + int readLen; + + try { + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + while ((readLen = inputStream.read(buf, 0, bufLen)) != -1) + outputStream.write(buf, 0, readLen); + + return Base64.getEncoder().encodeToString(outputStream.toByteArray()); + } + } catch (IOException e) { + String msg = "Error while converting image to base64"; + log.error(msg); + throw e; + } finally { + try { + inputStream.close(); + } catch (IOException e) { + } + } + } + + public static List getAppDetails(String adamId) throws ApplicationManagementException { + ApplicationManager applicationManager = APIUtil.getApplicationManager(); + List packageNamesOfApps = new ArrayList<>(); + packageNamesOfApps.add(adamId); + return applicationManager.getApplications(packageNamesOfApps); + } } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/Constants.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/Constants.java index c3e7c49160..40774c0486 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/Constants.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/Constants.java @@ -74,6 +74,7 @@ public class Constants { public static final String IS_USER_ABLE_TO_VIEW_ALL_ROLES = "isUserAbleToViewAllRoles"; public static final String GOOGLE_PLAY_STORE_URL = "https://play.google.com/store/apps/details?id="; public static final String APPLE_STORE_URL = "https://itunes.apple.com/country/app/app-name/id"; + public static final String GOOGLE_PLAY_SYNCED_APP = "GooglePlaySyncedApp"; // Subscription task related constants public static final String SUBSCRIBERS = "SUBSCRIBERS"; @@ -104,6 +105,25 @@ public class Constants { } public static final Map AGENT_FILE_NAMES = Collections.unmodifiableMap(AGENT_DATA); + public static final class VPP { + public static final String GET = "GET"; + public static final String BEARER = "Bearer "; + public static final String EXECUTOR_EXCEPTION_PREFIX = "ExecutorException-"; + public static final String TOKEN_IS_EXPIRED = "ACCESS_TOKEN_IS_EXPIRED"; + public static final int INTERNAL_ERROR_CODE = 500; + public static final String POST = "POST"; + public static final String PUT = "PUT"; + public static final String DELETE = "DELETE"; + public static final String EVENT_ID = "eventId"; + public static final String CLIENT_USER_ID_PARAM = "?clientUserId="; + public static final String TOTAL_PAGES = "totalPages"; + public static final String GET_APP_DATA_RESPONSE_START = "results"; + public static final String REMOTE_FILE_NAME = "512x512w.png"; + + private VPP() { + } + } + /** * Database types supported by Application Management. @@ -161,6 +181,8 @@ public class Constants { public static final String DEVICE_TYPE_ANDROID = "android"; public static final String COLON = ":"; public static final String IOT_CORE_HOST = "iot.core.host"; + + public static final String IOT_GATEWAY_HOST = "iot.gateway.host"; public static final String IOT_CORE_PORT = "iot.core.https.port"; public static final String ENROLLMENT_APP_INSTALL_PROTOCOL = "https://"; public static final String GOOGLE_APP_INSTALL_URL = "/api/device-mgt/android/v1.0/enterprise/change-app"; @@ -168,4 +190,31 @@ public class Constants { public static final String AUTHORIZATION = "Authorization"; public static final String AUTHORIZATION_HEADER_VALUE = "Bearer "; } + + public final class ApplicationProperties { + private ApplicationProperties() { + throw new AssertionError(); + } + + public static final String NAME = "name"; + public static final String VERSION = "version"; + public static final String FREE_SUB_METHOD = "FREE"; + public static final String PAID_SUB_METHOD = "PAID"; + public static final String TYPE = "type";; + public static final String PACKAGE_NAME = "packageName"; + public static final String APPLE_STORE_SYNCED_APP_CATEGORY = "AppleStoreSyncedApp"; + + public static final String RESULTS = "results"; + public static final String ARTWORK = "artwork"; + public static final String URL = "url"; + public static final String DESCRIPTION = "description"; + public static final String STANDARD = "standard"; + public static final String OFFERS = "offers"; + public static final String PRICE = "price"; + public static final String DISPLAY = "display"; + public static final String GENRE_NAMES = "genreNames"; + public static final String PRICE_ZERO = "0.0"; + public static final String ASSOCIATION_DEVICE = "ASSOCIATION_DEVICE"; + public static final String ASSOCIATION_USER = "ASSOCIATION_USER"; + } } diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/DAOUtil.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/DAOUtil.java index 4f624f60c8..a41f48e1e9 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/DAOUtil.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/DAOUtil.java @@ -19,24 +19,28 @@ package io.entgra.device.mgt.core.application.mgt.core.util; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus; -import io.entgra.device.mgt.core.application.mgt.common.SubscriptionType; import io.entgra.device.mgt.core.application.mgt.common.dto.*; import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException; -import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONException; +import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus; +import io.entgra.device.mgt.core.application.mgt.common.SubscriptionType; + +import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Date; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -235,6 +239,26 @@ public class DAOUtil { return applicationDTOs.get(0); } + public static ApplicationDTO loadDeviceApp(ResultSet rs) throws SQLException { + ApplicationDTO application = new ApplicationDTO(); + application.setId( rs.getInt("APP_ID")); + application.setName(rs.getString("APP_NAME")); + application.setDescription(rs.getString("APP_DESCRIPTION")); + application.setType(rs.getString("APP_TYPE")); + application.setSubType(rs.getString("APP_SUB_TYPE")); + application.setPaymentCurrency(rs.getString("APP_CURRENCY")); + application.setStatus(rs.getString("APP_STATUS")); + application.setAppRating(rs.getDouble("APP_RATING")); + application.setDeviceTypeId(rs.getInt("APP_DEVICE_TYPE_ID")); + ApplicationReleaseDTO releaseDTO = constructAppReleaseDTO(rs); + List releaseDtoList = new ArrayList<>(); + if (releaseDTO != null) { + releaseDtoList.add(constructAppReleaseDTO(rs)); + application.setApplicationReleaseDTOs(releaseDtoList); + } + return application; + } + /** * Populates {@link ApplicationReleaseDTO} object with the result obtained from the database. * @@ -338,6 +362,185 @@ public class DAOUtil { return subscriptionDTOS; } + public static Activity loadOperationActivity(ResultSet rs) throws SQLException, UnexpectedServerErrorException { + List activity = loadOperationActivities(rs); + if (activity.isEmpty()) { + return null; + } + if (activity.size() > 1) { + String msg = "Internal server error. Found more than one app for operation"; + log.error(msg); + throw new UnexpectedServerErrorException(msg); + } + return activity.get(0); + } + + public static List loadOperationActivities (ResultSet rs) throws SQLException { + List activities = new ArrayList<>(); + while (rs.next()) { + Activity activity = new Activity(); + activity.setAppName(rs.getString("NAME")); + activity.setAppType(rs.getString("TYPE")); + activity.setUsername(rs.getString("SUBSCRIBED_BY")); + activity.setPackageName(rs.getString("PACKAGE_NAME")); + activity.setStatus(rs.getString("STATUS")); + activity.setVersion(rs.getString("VERSION")); + activity.setTriggeredBy(rs.getString("ACTION_TRIGGERED_FROM")); + activities.add(activity); + } + return activities; + } + + public static VppUserDTO loadVppUser(ResultSet rs) throws SQLException, UnexpectedServerErrorException { + List vppUserDTOS = loadVppUsers(rs); + if (vppUserDTOS.isEmpty()) { + return null; + } + if (vppUserDTOS.size() > 1) { + String msg = "Internal server error. Found more than one vpp user for requested emmUsername"; + log.error(msg); + throw new UnexpectedServerErrorException(msg); + } + return vppUserDTOS.get(0); + } + + public static List loadVppUsers (ResultSet rs) throws SQLException { + List vppUserDTOS = new ArrayList<>(); + while (rs.next()) { + VppUserDTO vppUserDTO = new VppUserDTO(); + vppUserDTO.setId(rs.getInt("ID")); + vppUserDTO.setClientUserId(rs.getString("CLIENT_USER_ID")); + vppUserDTO.setTenantId(rs.getInt("TENANT_ID")); + vppUserDTO.setEmail(rs.getString("EMAIL")); + vppUserDTO.setInviteCode(rs.getString("INVITE_CODE")); + if (columnExist(rs,"STATUS")) { + vppUserDTO.setStatus(rs.getString("STATUS")); + } + if (columnExist(rs,"MANAGED_ID")) { + vppUserDTO.setManagedId(rs.getString("MANAGED_ID")); + } + if (columnExist(rs,"TEMP_PASSWORD")) { + vppUserDTO.setTmpPassword(rs.getString("TEMP_PASSWORD")); + } + if (columnExist(rs,"DM_USERNAME")) { + vppUserDTO.setDmUsername(rs.getString("DM_USERNAME")); + } + if (rs.getLong("CREATED_TIME") != 0) { + Date date = new Date(rs.getLong("CREATED_TIME")); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = dateFormat.format(date); + vppUserDTO.setCreatedTime(dateString); + } + if (rs.getLong("LAST_UPDATED_TIME") != 0) { + Date date = new Date(rs.getLong("LAST_UPDATED_TIME")); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = dateFormat.format(date); + vppUserDTO.setLastUpdatedTime(dateString); + } + vppUserDTOS.add(vppUserDTO); + } + return vppUserDTOS; + } + + private static boolean columnExist(ResultSet rs, String column){ + try{ + rs.findColumn(column); + return true; + } catch (SQLException sqlex){ + } + + return false; + } + + public static VppAssetDTO loadAsset(ResultSet rs) throws SQLException, UnexpectedServerErrorException { + List vppAssetDTOS = loadAssets(rs); + if (vppAssetDTOS.isEmpty()) { + return null; + } + if (vppAssetDTOS.size() > 1) { + String msg = "Internal server error. Found more than one asset for given app id."; + log.error(msg); + throw new UnexpectedServerErrorException(msg); + } + return vppAssetDTOS.get(0); + } + + public static List loadAssets (ResultSet rs) throws SQLException { + List vppAssetDTOS = new ArrayList<>(); + while (rs.next()) { + VppAssetDTO vppAssetDTO = new VppAssetDTO(); + vppAssetDTO.setId(rs.getInt("ID")); + vppAssetDTO.setAppId(rs.getInt("APP_ID")); + vppAssetDTO.setTenantId(rs.getInt("TENANT_ID")); + if (rs.getLong("CREATED_TIME") != 0) { + Date date = new Date(rs.getLong("CREATED_TIME")); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = dateFormat.format(date); + vppAssetDTO.setCreatedTime(dateString); + } + if (rs.getLong("LAST_UPDATED_TIME") != 0) { + Date date = new Date(rs.getLong("LAST_UPDATED_TIME")); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = dateFormat.format(date); + vppAssetDTO.setLastUpdatedTime(dateString); + } + vppAssetDTO.setAdamId(rs.getString("ADAM_ID")); + vppAssetDTO.setAssignedCount(rs.getString("ASSIGNED_COUNT")); + vppAssetDTO.setDeviceAssignable(rs.getString("DEVICE_ASSIGNABLE")); + vppAssetDTO.setPricingParam(rs.getString("PRICING_PARAMS")); + vppAssetDTO.setProductType(rs.getString("PRODUCT_TYPE")); + vppAssetDTO.setRetiredCount(rs.getString("RETIRED_COUNT")); + vppAssetDTO.setRevocable(rs.getString("REVOCABLE")); +// String jsonString = rs.getString("SUPPORTED_PLATFORMS"); +// ObjectMapper objectMapper = new ObjectMapper(); +// try { +// List platformList = objectMapper.readValue(jsonString, new TypeReference>() {}); +// vppAssetDTO.setSupportedPlatforms(platformList); +// } catch (IOException e) { +// e.printStackTrace(); +// } + vppAssetDTOS.add(vppAssetDTO); + } + return vppAssetDTOS; + } + + public static VppAssociationDTO loadAssignment(ResultSet rs) throws SQLException, UnexpectedServerErrorException { + List vppAssociationDTOS = loadAssignments(rs); + if (vppAssociationDTOS.isEmpty()) { + return null; + } + if (vppAssociationDTOS.size() > 1) { + String msg = "Internal server error. Found more than one asset for given app id."; + log.error(msg); + throw new UnexpectedServerErrorException(msg); + } + return vppAssociationDTOS.get(0); + } + + public static List loadAssignments (ResultSet rs) throws SQLException { + List vppAssociationDTOS = new ArrayList<>(); + while (rs.next()) { + VppAssociationDTO vppAssociationDTO = new VppAssociationDTO(); + vppAssociationDTO.setId(rs.getInt("ID")); + vppAssociationDTO.setAssociationType(rs.getString("ASSOCIATION_TYPE")); + if (rs.getLong("CREATED_TIME") != 0) { + Date date = new Date(rs.getLong("CREATED_TIME")); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = dateFormat.format(date); + vppAssociationDTO.setCreatedTime(dateString); + } + if (rs.getLong("LAST_UPDATED_TIME") != 0) { + Date date = new Date(rs.getLong("LAST_UPDATED_TIME")); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = dateFormat.format(date); + vppAssociationDTO.setLastUpdatedTime(dateString); + } + vppAssociationDTO.setPricingParam(rs.getString("PRICING_PARAMS")); + vppAssociationDTOS.add(vppAssociationDTO); + } + return vppAssociationDTOS; + } + /** * Cleans up the statement and resultset after executing the query * diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/VppHttpUtil.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/VppHttpUtil.java new file mode 100644 index 0000000000..c915b8407d --- /dev/null +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/VppHttpUtil.java @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.application.mgt.core.util; + +import com.google.gson.Gson; +import io.entgra.device.mgt.core.application.mgt.common.dto.ProxyResponse; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO; +import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.Consts; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.wso2.carbon.context.PrivilegedCarbonContext; + +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; + +public class VppHttpUtil { + private static final Log log = LogFactory.getLog(VppHttpUtil.class); + + public static ProxyResponse execute(String url, + String payload, + String accessToken, + String method) throws IOException { + + HttpRequestBase endpoint = null; + if (Constants.VPP.GET.equalsIgnoreCase(method) || Constants.VPP.DELETE.equalsIgnoreCase(method)) { + endpoint = new HttpGet(url); + addHeaders(endpoint, accessToken); + return VppHttpUtil.execute(endpoint); + } else if (Constants.VPP.POST.equalsIgnoreCase(method)) { + endpoint = new HttpPost(url); + } else if (Constants.VPP.PUT.equalsIgnoreCase(method)) { + endpoint = new HttpPut(url); + } + addHeaders(endpoint, accessToken); + + + if (payload != null) { + HttpEntity forwardRequestBody = new StringEntity(payload, ContentType.APPLICATION_JSON.toString(), "utf-8"); + if (Constants.VPP.POST.equalsIgnoreCase(method)) { + ((HttpPost) endpoint).setEntity(forwardRequestBody); + } else if (Constants.VPP.PUT.equalsIgnoreCase(method)) { + ((HttpPut) endpoint).setEntity(forwardRequestBody); + } + + } + if (log.isDebugEnabled()) { + log.info("Forwarding request to " + url); + } + return VppHttpUtil.execute(endpoint); + } + + private static void addHeaders(HttpRequestBase endpoint, String accessToken) { + endpoint.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()); + endpoint.setHeader(HttpHeaders.ACCEPT, ContentType.APPLICATION_JSON.toString()); + endpoint.setHeader(HttpHeaders.AUTHORIZATION, Constants.VPP.BEARER + accessToken); + } + + + /*** + * + * @param httpRequest - httpMethod e.g:- HttpPost, HttpGet + * @return response as string + * @throws IOException IO exception returns if error occurs when executing the httpMethod + */ + private static ProxyResponse execute(HttpRequestBase httpRequest) throws IOException { + try (CloseableHttpClient client = getHttpClient()) { + HttpResponse response = client.execute(httpRequest); + ProxyResponse proxyResponse = new ProxyResponse(); + + if (response == null) { + log.error("Received null response for http request : " + httpRequest.getMethod() + " " + httpRequest + .getURI().toString()); + proxyResponse.setCode(Constants.VPP.INTERNAL_ERROR_CODE); + proxyResponse.setExecutorResponse(Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + getStatusKey( + Constants.VPP.INTERNAL_ERROR_CODE)); + return proxyResponse; + } else { + int statusCode = response.getStatusLine().getStatusCode(); + try (BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()))) { + StringBuilder result = new StringBuilder(); + String line; + while ((line = rd.readLine()) != null) { + result.append(line); + } + + String jsonString = result.toString(); + if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_CREATED) { + proxyResponse.setCode(statusCode); + proxyResponse.setData(jsonString); + proxyResponse.setExecutorResponse("SUCCESS"); + return proxyResponse; + } else if (statusCode == HttpStatus.SC_UNAUTHORIZED) { + if (jsonString.contains("Access token expired") || jsonString + .contains("Invalid input. Access token validation failed")) { + proxyResponse.setCode(statusCode); + proxyResponse.setExecutorResponse(Constants.VPP.TOKEN_IS_EXPIRED); + return proxyResponse; + } else { + log.error( + "Received " + statusCode + " response for http request : " + httpRequest.getMethod() + + " " + httpRequest.getURI().toString() + ". Error message: " + jsonString); + proxyResponse.setCode(statusCode); + proxyResponse.setData(jsonString); + proxyResponse.setExecutorResponse( + Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(statusCode)); + return proxyResponse; + } + } + log.error("Received " + statusCode + + " response for http request : " + httpRequest.getMethod() + " " + httpRequest.getURI() + .toString() + ". Error message: " + jsonString); + proxyResponse.setCode(statusCode); + proxyResponse.setData(jsonString); + proxyResponse + .setExecutorResponse(Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(statusCode)); + return proxyResponse; + } + } + } + } + + /*** + * + * @param statusCode Provide status code, e.g:- 400, 401, 500 etc + * @return relative status code key for given status code. + */ + public static String getStatusKey(int statusCode) { + String statusCodeKey; + + switch (statusCode) { + case HttpStatus.SC_INTERNAL_SERVER_ERROR: + statusCodeKey = "internalServerError"; + break; + case HttpStatus.SC_BAD_REQUEST: + statusCodeKey = "badRequest"; + break; + case HttpStatus.SC_UNAUTHORIZED: + statusCodeKey = "unauthorized"; + break; + case HttpStatus.SC_FORBIDDEN: + statusCodeKey = "forbidden"; + break; + case HttpStatus.SC_NOT_FOUND: + statusCodeKey = "notFound"; + break; + case HttpStatus.SC_METHOD_NOT_ALLOWED: + statusCodeKey = "methodNotAllowed"; + break; + case HttpStatus.SC_NOT_ACCEPTABLE: + statusCodeKey = "notAcceptable"; + break; + case HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE: + statusCodeKey = "unsupportedMediaType"; + break; + default: + statusCodeKey = "defaultPage"; + break; + } + return statusCodeKey; + } + + + /*** + * Handle error requests. + * + * @param resp {@link HttpServletResponse} + * @param proxyResponse {@link ProxyResponse} + * @throws IOException If error occurred when trying to send the error response. + */ + public static void handleError(HttpServletResponse resp, ProxyResponse proxyResponse) throws IOException { + Gson gson = new Gson(); + if (proxyResponse == null) { + proxyResponse = new ProxyResponse(); + proxyResponse.setCode(HttpStatus.SC_INTERNAL_SERVER_ERROR); + proxyResponse.setExecutorResponse(Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + VppHttpUtil + .getStatusKey(Constants.VPP.INTERNAL_ERROR_CODE)); + } + resp.setStatus(proxyResponse.getCode()); + resp.setContentType(ContentType.APPLICATION_JSON.getMimeType()); + resp.setCharacterEncoding(Consts.UTF_8.name()); + + proxyResponse.setExecutorResponse(null); + try (PrintWriter writer = resp.getWriter()) { + writer.write(gson.toJson(proxyResponse)); + } + } + + /** + * Handle error requests with custom error codes. + * + * @param resp {@link HttpServletResponse} + * @param errorCode HTTP error status code + * @throws IOException If error occurred when trying to send the error response. + */ + public static void handleError(HttpServletResponse resp, int errorCode) + throws IOException { + ProxyResponse proxyResponse = new ProxyResponse(); + proxyResponse.setCode(errorCode); + proxyResponse.setExecutorResponse( + Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + VppHttpUtil.getStatusKey(errorCode)); + VppHttpUtil.handleError(resp, proxyResponse); + } + + /*** + * + * @param resp {@link HttpServletResponse} + * Return Success Response. + */ + public static void handleSuccess(HttpServletResponse resp, ProxyResponse proxyResponse) throws IOException { + if (proxyResponse == null) { + handleError(resp, null); + return; + } + resp.setStatus(proxyResponse.getCode()); + resp.setContentType(ContentType.APPLICATION_JSON.getMimeType()); + resp.setCharacterEncoding(Consts.UTF_8.name()); + JSONObject response = new JSONObject(); + String responseData = proxyResponse.getData(); + + if (!StringUtils.isEmpty(responseData)) { + try { + if (responseData.startsWith("{")) { + JSONObject responseDataJsonObj = new JSONObject(responseData); + response.put("data", responseDataJsonObj); + } else if (responseData.startsWith("[")) { + JSONArray responseDataJsonArr = new JSONArray(responseData); + response.put("data", responseDataJsonArr); + } else { + log.warn("Response data is not valid json string >> " + responseData); + response.put("data", responseData); + } + } catch (JSONException e) { + log.error("Response data is not passable"); + response.put("data", responseData); + } + } + + try (PrintWriter writer = resp.getWriter()) { + writer.write(response.toString()); + } + } + + /** + * Retrieve Http client based on hostname verification. + * + * @return {@link CloseableHttpClient} http client + */ + public static CloseableHttpClient getHttpClient() { + return HttpClients.custom().setMaxConnTotal(1).setMaxConnPerRoute(1).build(); + } + + public static VppAssociationDTO getAssociation(VppUserDTO user, VppAssetDTO asset) { + VppAssociationDTO associationDTO = new VppAssociationDTO(); + associationDTO.setAdamId(asset.getAdamId()); + associationDTO.setClientUserId(user.getClientUserId()); + associationDTO.setPricingParam(asset.getPricingParam()); + associationDTO.setAssociationType(Constants.ApplicationProperties.ASSOCIATION_USER); + + associationDTO.setAssetId(asset.getId()); + associationDTO.setClientId(user.getId()); + associationDTO.setTenantId(PrivilegedCarbonContext.getThreadLocalCarbonContext() + .getTenantId(true)); + associationDTO.setCreatedTime(String.valueOf(System.currentTimeMillis())); + associationDTO.setLastUpdatedTime(String.valueOf(System.currentTimeMillis())); + return associationDTO; + } + +} diff --git a/components/application-mgt/pom.xml b/components/application-mgt/pom.xml index 064f9eddb9..005789d0a6 100644 --- a/components/application-mgt/pom.xml +++ b/components/application-mgt/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core io.entgra.device.mgt.core.parent - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../../pom.xml diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/pom.xml b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/pom.xml index d4f1cf59f2..ad742cd285 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/pom.xml +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/pom.xml @@ -22,7 +22,7 @@ certificate-mgt io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/api/CertificateMgtService.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/api/CertificateMgtService.java index db14d6f072..f2bdb8fafd 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/api/CertificateMgtService.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/api/CertificateMgtService.java @@ -58,7 +58,7 @@ import javax.ws.rs.core.Response; @Scope( name = "Sign CSR", description = "Sign CSR", - key = "perm:sign-csr", + key = "dm:sign-csr", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/certificates/manage"} ) @@ -87,7 +87,7 @@ public interface CertificateMgtService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:sign-csr") + @ExtensionProperty(name = SCOPE, value = "dm:sign-csr") }) } ) diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/pom.xml b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/pom.xml index 76f70e08f2..0b0f530259 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/pom.xml +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/pom.xml @@ -22,7 +22,7 @@ certificate-mgt io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/cert/admin/api/CertificateManagementAdminService.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/cert/admin/api/CertificateManagementAdminService.java index 18207be106..34ddbd193a 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/cert/admin/api/CertificateManagementAdminService.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/cert/admin/api/CertificateManagementAdminService.java @@ -62,35 +62,35 @@ import javax.ws.rs.core.Response; @Scope( name = "Adding a new SSL certificate", description = "Adding a new SSL certificate", - key = "perm:admin:certificates:add", + key = "cm:cert:add", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/certificates/add"} ), @Scope( name = "Getting Details of an SSL Certificate", description = "Getting Details of an SSL Certificate", - key = "perm:admin:certificates:details", + key = "cm:cert:details:get", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/certificates/details"} ), @Scope( name = "Getting Details of Certificates", description = "Getting Details of Certificates", - key = "perm:admin:certificates:view", + key = "cm:cert:view", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/certificates/view"} ), @Scope( name = "Deleting an SSL Certificate", description = "Deleting an SSL Certificate", - key = "perm:admin:certificates:delete", + key = "cm:cert:delete", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/certificates/delete"} ), @Scope( name = "Verify SSL certificate", description = "Verify SSL certificate", - key = "perm:admin:certificates:verify", + key = "cm:cert:verify", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/certificates/verify"} ) @@ -119,7 +119,7 @@ public interface CertificateManagementAdminService { tags = "Certificate Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:admin:certificates:add") + @ExtensionProperty(name = SCOPE, value = "cm:cert:add") }) } ) @@ -188,7 +188,7 @@ public interface CertificateManagementAdminService { tags = "Certificate Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:admin:certificates:details") + @ExtensionProperty(name = SCOPE, value = "cm:cert:details:get") }) } ) @@ -247,19 +247,20 @@ public interface CertificateManagementAdminService { * * @return paginated result of certificate. */ + @GET @ApiOperation( consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, httpMethod = "GET", - value = "Getting Details of Certificates", - notes = "Get all the details of the certificates you have used for mutual SSL. In a situation where you wish to " - + "view all the certificate details, it is not feasible to show all the details on one " + value = "Getting Details of search Certificates", + notes = "Get all the details of the search certificates you have used for mutual SSL. In a situation where you wish to " + + "view all the search certificate details, it is not feasible to show all the details on one " + "page. Therefore, the details are paginated.", tags = "Certificate Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:admin:certificates:view") + @ExtensionProperty(name = SCOPE, value = "cm:cert:view") }) } ) @@ -307,6 +308,28 @@ public interface CertificateManagementAdminService { response = ErrorResponse.class) }) Response getAllCertificates( + @ApiParam( + name = "serialNumber", + value = "The serial number of the certificates", + required = false) + @QueryParam("serialNumber") String serialNumber, + @ApiParam( + name = "deviceIdentifier", + value = "The device identifier of the certificates", + required = false) + @QueryParam("deviceIdentifier") String deviceIdentifier, + @ApiParam( + name = "username", + value = "User name of the certificate added user", + required = false) + @QueryParam("username") String username, + @ApiParam( + name = "If-Modified-Since", + value = "Checks if the requested variant was modified, since the specified date-time. \n" + + "Provide the value in the following format: EEE, d MMM yyyy HH:mm:ss Z.\n" + + "Example: Mon, 05 Jan 2014 15:10:00 +0200", + required = false) + @HeaderParam("If-Modified-Since") String ifModifiedSince, @ApiParam( name = "offset", value = "The starting pagination index for the complete list of qualified items.", @@ -318,14 +341,7 @@ public interface CertificateManagementAdminService { value = "Provide how many certificate details you require from the starting pagination index/offset.", required = false, defaultValue = "5") - @QueryParam("limit") int limit, - @ApiParam( - name = "If-Modified-Since", - value = "Checks if the requested variant was modified, since the specified date-time. \n" + - "Provide the value in the following format: EEE, d MMM yyyy HH:mm:ss Z.\n" + - "Example: Mon, 05 Jan 2014 15:10:00 +0200", - required = false) - @HeaderParam("If-Modified-Since") String ifModifiedSince); + @QueryParam("limit") int limit); @DELETE @ApiOperation( @@ -337,7 +353,7 @@ public interface CertificateManagementAdminService { tags = "Certificate Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:admin:certificates:delete") + @ExtensionProperty(name = SCOPE, value = "cm:cert:delete") }) } ) @@ -383,7 +399,7 @@ public interface CertificateManagementAdminService { tags = "Certificate Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = SCOPE, value = "perm:admin:certificates:verify") + @ExtensionProperty(name = SCOPE, value = "cm:cert:verify") }) } ) diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/cert/admin/api/impl/CertificateManagementAdminServiceImpl.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/cert/admin/api/impl/CertificateManagementAdminServiceImpl.java index 85b361d33d..4b62253156 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/cert/admin/api/impl/CertificateManagementAdminServiceImpl.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/src/main/java/io/entgra/device/mgt/core/certificate/mgt/cert/admin/api/impl/CertificateManagementAdminServiceImpl.java @@ -18,7 +18,6 @@ package io.entgra.device.mgt.core.certificate.mgt.cert.admin.api.impl; -import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; @@ -26,7 +25,9 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; + +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.certificate.mgt.cert.admin.api.CertificateManagementAdminService; @@ -87,6 +88,13 @@ public class CertificateManagementAdminServiceImpl implements CertificateManagem certificate.setTenantId(PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId()); certificate.setSerial(enrollmentCertificate.getSerial()); certificate.setCertificate(certificateService.pemToX509Certificate(enrollmentCertificate.getPem())); + CertificateResponse existingCertificate = certificateService.getCertificateBySerial(enrollmentCertificate.getSerial()); + if (existingCertificate != null) { + return Response.status(Response.Status.BAD_REQUEST) + .entity("Certificate with serial number " + enrollmentCertificate.getSerial() + " already exists.") + .build(); + } + certificates.add(certificate); } certificateService.saveCertificate(certificates); @@ -134,13 +142,27 @@ public class CertificateManagementAdminServiceImpl implements CertificateManagem */ @GET public Response getAllCertificates( + @QueryParam("serialNumber") String serialNumber, + @QueryParam("deviceIdentifier") String deviceIdentifier, + @QueryParam("username") String username, + @HeaderParam("If-Modified-Since") String ifModifiedSince, @QueryParam("offset") int offset, - @QueryParam("limit") int limit, - @HeaderParam("If-Modified-Since") String ifModifiedSince) { + @QueryParam("limit") int limit) { RequestValidationUtil.validatePaginationInfo(offset, limit); CertificateManagementService certificateService = CertificateMgtAPIUtils.getCertificateManagementService(); + CertificatePaginationRequest request = new CertificatePaginationRequest(offset, limit); + + if (StringUtils.isNotEmpty(serialNumber)) { + request.setSerialNumber(serialNumber); + } + if (StringUtils.isNotEmpty(deviceIdentifier)){ + request.setDeviceIdentifier(deviceIdentifier); + } + if (StringUtils.isNotEmpty(username)){ + request.setUsername(username); + } try { - PaginationResult result = certificateService.getAllCertificates(offset, limit); + PaginationResult result = certificateService.getAllCertificates(request); CertificateList certificates = new CertificateList(); certificates.setCount(result.getRecordsTotal()); certificates.setList((List) result.getData()); @@ -159,18 +181,33 @@ public class CertificateManagementAdminServiceImpl implements CertificateManagem CertificateManagementService certificateService = CertificateMgtAPIUtils.getCertificateManagementService(); try { - boolean status = certificateService.removeCertificate(serialNumber); - if (!status) { - return Response.status(Response.Status.NOT_FOUND).entity( - "No certificate is found with the given " + - "serial number '" + serialNumber + "'").build(); + boolean decision = certificateService.getValidateMetaValue(); + if (decision) { + try { + boolean status = certificateService.removeCertificate(serialNumber); + if (!status) { + return Response.status(Response.Status.NOT_FOUND).entity( + "No certificate is found with the given " + + "serial number '" + serialNumber + "'").build(); + } else { + return Response.status(Response.Status.OK).entity( + "Certificate that carries the serial number '" + + serialNumber + "' has been removed").build(); + } + } catch (CertificateManagementException e) { + String msg = "Error occurred while removing certificate with the given " + + "serial number '" + serialNumber + "'"; + log.error(msg, e); + return Response.serverError().entity( + new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); + } } else { - return Response.status(Response.Status.OK).entity( - "Certificate that carries the serial number '" + - serialNumber + "' has been removed").build(); + return Response.status(Response.Status.UNAUTHORIZED).entity( + "User unauthorized to delete certificate with " + + "serial number '" + serialNumber + "'").build(); } } catch (CertificateManagementException e) { - String msg = "Error occurred while converting PEM file to X509Certificate"; + String msg = "Error occurred while getting the metadata entry for certificate deletion."; log.error(msg, e); return Response.serverError().entity( new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/pom.xml b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/pom.xml index dcccd215b1..2e5bb73e23 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/pom.xml +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/pom.xml @@ -21,7 +21,7 @@ io.entgra.device.mgt.core certificate-mgt - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml @@ -57,6 +57,62 @@ io.entgra.device.mgt.core.certificate.mgt.core.util + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + io.entgra.device.mgt.core.certificate.mgt.core.*, io.entgra.device.mgt.core.device.mgt.common;version="[5.0,6)", io.entgra.device.mgt.core.device.mgt.common.exceptions;version="[5.0,6)", @@ -253,6 +309,10 @@ org.wso2.orbit.javax.xml.bind jaxb-api + + com.googlecode.json-simple.wso2 + json-simple + diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/CertificateDAO.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/CertificateDAO.java index 779251761e..068766f3b9 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/CertificateDAO.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/CertificateDAO.java @@ -18,8 +18,10 @@ package io.entgra.device.mgt.core.certificate.mgt.core.dao; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; import io.entgra.device.mgt.core.certificate.mgt.core.bean.Certificate; import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; +import io.entgra.device.mgt.core.certificate.mgt.core.exception.CertificateManagementException; import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult; import java.util.List; @@ -75,13 +77,12 @@ public interface CertificateDAO { /** * Get all the certificates in a paginated manner. * - * @param rowNum Stating index of the paginated result. - * @param limit Number of records to return. + * @param request index of the paginated result. * @return Pagination result with data and the count of results. * @throws CertificateManagementDAOException * */ - PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException; + PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException; /** * Get all the certificates. @@ -95,7 +96,7 @@ public interface CertificateDAO { /** * Delete a certificate identified by a serial number() * - * @param serialNumber serial number + * @param serialNumber number * @return whether the certificate was removed or not. */ boolean removeCertificate(String serialNumber) throws CertificateManagementDAOException; diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/AbstractCertificateDAOImpl.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/AbstractCertificateDAOImpl.java index 0a8e9e3066..a5ec99203e 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/AbstractCertificateDAOImpl.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/AbstractCertificateDAOImpl.java @@ -279,7 +279,7 @@ public abstract class AbstractCertificateDAOImpl implements CertificateDAO{ return stmt.executeUpdate() > 0; } catch (SQLException e) { - String msg = "Unable to get the read the certificate with serial" + serialNumber; + String msg = "Unable to get the read the certificate with serialNumber" + serialNumber; log.error(msg, e); throw new CertificateManagementDAOException(msg, e); } finally { diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/GenericCertificateDAOImpl.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/GenericCertificateDAOImpl.java index fa5d028afe..455942b305 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/GenericCertificateDAOImpl.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/GenericCertificateDAOImpl.java @@ -18,14 +18,16 @@ package io.entgra.device.mgt.core.certificate.mgt.core.dao.impl; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; +import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; +import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil; -import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; -import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; import java.sql.Connection; @@ -48,45 +50,133 @@ public class GenericCertificateDAOImpl extends AbstractCertificateDAOImpl { return CertificateManagementDAOFactory.getConnection(); } + private int getCertificateCount(CertificatePaginationRequest request) throws CertificateManagementDAOException { + int certificateCount = 0; + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + String serialNumber = request.getSerialNumber(); + String deviceIdentifier = request.getDeviceIdentifier(); + String username = request.getUsername(); + + try { + Connection conn = this.getConnection(); + String sql = "SELECT COUNT(*) AS DEVICE_CERTIFICATE_COUNT " + + "FROM DM_DEVICE_CERTIFICATE " + + "WHERE TENANT_ID = ?"; + + if (StringUtils.isNotEmpty(serialNumber)) { + sql += " AND SERIAL_NUMBER = ?"; + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + sql += " AND DEVICE_IDENTIFIER = ?"; + } + + if (StringUtils.isNotEmpty(username)) { + sql += " AND USERNAME LIKE ?"; + } + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantId); + + int paramIdx = 2; + if (StringUtils.isNotEmpty(serialNumber)) { + stmt.setString(paramIdx++, serialNumber); + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + stmt.setString(paramIdx++, deviceIdentifier); + } + + if (StringUtils.isNotEmpty(username)) { + stmt.setString(paramIdx, "%" + username + "%"); + } + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + certificateCount = rs.getInt("DEVICE_CERTIFICATE_COUNT"); + } + } + } + } catch (SQLException e) { + String errorMsg = "SQL error occurred while retrieving the certificate count."; + log.error(errorMsg, e); + throw new CertificateManagementDAOException(errorMsg, e); + } + return certificateCount; + } + + @Override - public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException { - PreparedStatement stmt = null; - ResultSet resultSet = null; + public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); CertificateResponse certificateResponse; List certificates = new ArrayList<>(); PaginationResult paginationResult; - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + String serialNumber = request.getSerialNumber(); + String deviceIdentifier = request.getDeviceIdentifier(); + String username = request.getUsername(); + boolean isCertificateSerialNumberProvided = false; + boolean isCertificateDeviceIdentifierProvided = false; + boolean isCertificateUsernameProvided = false; + try { Connection conn = this.getConnection(); - String sql = "SELECT CERTIFICATE, SERIAL_NUMBER, TENANT_ID, USERNAME FROM " - + "DM_DEVICE_CERTIFICATE WHERE TENANT_ID = ? ORDER BY ID DESC LIMIT ?,?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, tenantId); - stmt.setInt(2, rowNum); - stmt.setInt(3, limit); - resultSet = stmt.executeQuery(); + String query = "SELECT * " + + "FROM DM_DEVICE_CERTIFICATE " + + "WHERE TENANT_ID = ? "; - int resultCount = 0; - while (resultSet.next()) { - certificateResponse = new CertificateResponse(); - byte[] certificateBytes = resultSet.getBytes("CERTIFICATE"); - certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER")); - certificateResponse.setTenantId(resultSet.getInt("TENANT_ID")); - certificateResponse.setUsername(resultSet.getString("USERNAME")); - CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse); - certificates.add(certificateResponse); - resultCount++; + if (StringUtils.isNotEmpty(serialNumber)) { + query += "AND SERIAL_NUMBER = ? "; + isCertificateSerialNumberProvided = true; + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + query += "AND DEVICE_IDENTIFIER = ? "; + isCertificateDeviceIdentifierProvided = true; + } + + if (StringUtils.isNotEmpty(username)) { + query += "AND USERNAME LIKE ? "; + isCertificateUsernameProvided = true; + } + + query += "ORDER BY ID LIMIT ?,?"; + + try (PreparedStatement stmt = conn.prepareStatement(query)) { + int paramIdx = 1; + stmt.setInt(paramIdx++, tenantId); + if (isCertificateSerialNumberProvided) { + stmt.setString(paramIdx++, serialNumber); + } + if (isCertificateDeviceIdentifierProvided) { + stmt.setString(paramIdx++, deviceIdentifier); + } + if (isCertificateUsernameProvided) { + stmt.setString(paramIdx++, "%" + username + "%"); + } + stmt.setInt(paramIdx++, request.getStartIndex()); + stmt.setInt(paramIdx++, request.getRowCount()); + try (ResultSet resultSet = stmt.executeQuery()) { + while (resultSet.next()) { + certificateResponse = new CertificateResponse(); + byte[] certificateBytes = resultSet.getBytes("CERTIFICATE"); + certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER")); + certificateResponse.setCertificateId(resultSet.getString("ID")); + certificateResponse.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFIER")); + certificateResponse.setTenantId(resultSet.getInt("TENANT_ID")); + certificateResponse.setUsername(resultSet.getString("USERNAME")); + CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse); + certificates.add(certificateResponse); + } + paginationResult = new PaginationResult(); + paginationResult.setData(certificates); + paginationResult.setRecordsTotal(this.getCertificateCount(request)); + } } - paginationResult = new PaginationResult(); - paginationResult.setData(certificates); - paginationResult.setRecordsTotal(resultCount); } catch (SQLException e) { String errorMsg = "SQL error occurred while retrieving the certificates."; log.error(errorMsg, e); throw new CertificateManagementDAOException(errorMsg, e); - } finally { - CertificateManagementDAOUtil.cleanupResources(stmt, resultSet); } return paginationResult; } -} +} \ No newline at end of file diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/OracleCertificateDAOImpl.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/OracleCertificateDAOImpl.java index 78a0fada50..cbb689977b 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/OracleCertificateDAOImpl.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/OracleCertificateDAOImpl.java @@ -18,14 +18,16 @@ package io.entgra.device.mgt.core.certificate.mgt.core.dao.impl; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; +import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; +import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil; -import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; -import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; import java.sql.Connection; @@ -44,43 +46,75 @@ public class OracleCertificateDAOImpl extends AbstractCertificateDAOImpl { private static final Log log = LogFactory.getLog(OracleCertificateDAOImpl.class); @Override - public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException { - PreparedStatement stmt = null; - ResultSet resultSet = null; + public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); CertificateResponse certificateResponse; List certificates = new ArrayList<>(); PaginationResult paginationResult; - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + String serialNumber = request.getSerialNumber(); + String deviceIdentifier = request.getDeviceIdentifier(); + String username = request.getUsername(); + boolean isCertificateSerialNumberProvided = false; + boolean isCertificateDeviceIdentifierProvided = false; + boolean isCertificateUsernameProvided = false; + try { Connection conn = this.getConnection(); - String sql = "SELECT CERTIFICATE, SERIAL_NUMBER, TENANT_ID, USERNAME FROM " - + "DM_DEVICE_CERTIFICATE WHERE TENANT_ID = ? ORDER BY ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, tenantId); - stmt.setInt(2, rowNum); - stmt.setInt(3, limit); - resultSet = stmt.executeQuery(); - - int resultCount = 0; - while (resultSet.next()) { - certificateResponse = new CertificateResponse(); - byte[] certificateBytes = resultSet.getBytes("CERTIFICATE"); - certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER")); - certificateResponse.setTenantId(resultSet.getInt("TENANT_ID")); - certificateResponse.setUsername(resultSet.getString("USERNAME")); - CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse); - certificates.add(certificateResponse); - resultCount++; + String query = "SELECT * " + + "FROM DM_DEVICE_CERTIFICATE " + + "WHERE TENANT_ID = ? "; + if (StringUtils.isNotEmpty(serialNumber)) { + query += "AND SERIAL_NUMBER = ? "; + isCertificateSerialNumberProvided = true; + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + query += "AND DEVICE_IDENTIFIER = ? "; + isCertificateDeviceIdentifierProvided = true; + } + + if (StringUtils.isNotEmpty(username)) { + query += "AND USERNAME LIKE ? "; + isCertificateUsernameProvided = true; + } + + query += "ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + + try (PreparedStatement stmt = conn.prepareStatement(query)) { + int paramIdx = 1; + stmt.setInt(paramIdx++, tenantId); + if (isCertificateSerialNumberProvided) { + stmt.setString(paramIdx++, serialNumber); + } + if (isCertificateDeviceIdentifierProvided) { + stmt.setString(paramIdx++, deviceIdentifier); + } + if (isCertificateUsernameProvided) { + stmt.setString(paramIdx++, "%" + username + "%"); + } + stmt.setInt(paramIdx++, request.getStartIndex()); + stmt.setInt(paramIdx++, request.getRowCount()); + try (ResultSet resultSet = stmt.executeQuery()) { + while (resultSet.next()) { + certificateResponse = new CertificateResponse(); + byte[] certificateBytes = resultSet.getBytes("CERTIFICATE"); + certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER")); + certificateResponse.setCertificateId(resultSet.getString("ID")); + certificateResponse.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFIER")); + certificateResponse.setTenantId(resultSet.getInt("TENANT_ID")); + certificateResponse.setUsername(resultSet.getString("USERNAME")); + CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse); + certificates.add(certificateResponse); + } + paginationResult = new PaginationResult(); + paginationResult.setData(certificates); + paginationResult.setRecordsTotal(this.getCertificateCount(request)); + } } - paginationResult = new PaginationResult(); - paginationResult.setData(certificates); - paginationResult.setRecordsTotal(resultCount); } catch (SQLException e) { String errorMsg = "SQL error occurred while retrieving the certificates."; log.error(errorMsg, e); throw new CertificateManagementDAOException(errorMsg, e); - } finally { - CertificateManagementDAOUtil.cleanupResources(stmt, resultSet); } return paginationResult; } @@ -88,4 +122,60 @@ public class OracleCertificateDAOImpl extends AbstractCertificateDAOImpl { private Connection getConnection() throws SQLException { return CertificateManagementDAOFactory.getConnection(); } + + private int getCertificateCount(CertificatePaginationRequest request) throws CertificateManagementDAOException { + int certificateCount = 0; + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + String serialNumber = request.getSerialNumber(); + String deviceIdentifier = request.getDeviceIdentifier(); + String username = request.getUsername(); + + try { + Connection conn = this.getConnection(); + String sql = "SELECT COUNT(*) AS DEVICE_CERTIFICATE_COUNT " + + "FROM DM_DEVICE_CERTIFICATE " + + "WHERE TENANT_ID = ?"; + + if (StringUtils.isNotEmpty(serialNumber)) { + sql += " AND SERIAL_NUMBER = ?"; + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + sql += " AND DEVICE_IDENTIFIER = ?"; + } + + if (StringUtils.isNotEmpty(username)) { + sql += " AND USERNAME LIKE ?"; + } + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantId); + + int paramIdx = 2; + if (StringUtils.isNotEmpty(serialNumber)) { + stmt.setString(paramIdx++, serialNumber); + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + stmt.setString(paramIdx++, deviceIdentifier); + } + + if (StringUtils.isNotEmpty(username)) { + stmt.setString(paramIdx, "%" + username + "%"); + } + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + certificateCount = rs.getInt("DEVICE_CERTIFICATE_COUNT"); + } + } + } + } catch (SQLException e) { + String errorMsg = "SQL error occurred while retrieving the certificate count."; + log.error(errorMsg, e); + throw new CertificateManagementDAOException(errorMsg, e); + } + return certificateCount; + } + } diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/PostgreSQLCertificateDAOImpl.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/PostgreSQLCertificateDAOImpl.java index e331402ce1..92b5720102 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/PostgreSQLCertificateDAOImpl.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/PostgreSQLCertificateDAOImpl.java @@ -18,14 +18,16 @@ package io.entgra.device.mgt.core.certificate.mgt.core.dao.impl; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; +import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; +import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil; -import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; -import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; import java.sql.Connection; @@ -44,43 +46,75 @@ public class PostgreSQLCertificateDAOImpl extends AbstractCertificateDAOImpl { private static final Log log = LogFactory.getLog(PostgreSQLCertificateDAOImpl.class); @Override - public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException { - PreparedStatement stmt = null; - ResultSet resultSet = null; + public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); CertificateResponse certificateResponse; List certificates = new ArrayList<>(); PaginationResult paginationResult; - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + String serialNumber = request.getSerialNumber(); + String deviceIdentifier = request.getDeviceIdentifier(); + String username = request.getUsername(); + boolean isCertificateSerialNumberProvided = false; + boolean isCertificateDeviceIdentifierProvided = false; + boolean isCertificateUsernameProvided = false; + try { Connection conn = this.getConnection(); - String sql = "SELECT CERTIFICATE, SERIAL_NUMBER, TENANT_ID, USERNAME FROM " - + "DM_DEVICE_CERTIFICATE WHERE TENANT_ID = ? ORDER BY ID DESC LIMIT ? OFFSET ?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, tenantId); - stmt.setInt(2, limit); - stmt.setInt(3, rowNum); - resultSet = stmt.executeQuery(); - - int resultCount = 0; - while (resultSet.next()) { - certificateResponse = new CertificateResponse(); - byte[] certificateBytes = resultSet.getBytes("CERTIFICATE"); - certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER")); - certificateResponse.setTenantId(resultSet.getInt("TENANT_ID")); - certificateResponse.setUsername(resultSet.getString("USERNAME")); - CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse); - certificates.add(certificateResponse); - resultCount++; + String query = "SELECT * " + + "FROM DM_DEVICE_CERTIFICATE " + + "WHERE TENANT_ID = ? "; + if (StringUtils.isNotEmpty(serialNumber)) { + query += "AND SERIAL_NUMBER = ? "; + isCertificateSerialNumberProvided = true; + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + query += "AND DEVICE_IDENTIFIER = ? "; + isCertificateDeviceIdentifierProvided = true; + } + + if (StringUtils.isNotEmpty(username)) { + query += "AND USERNAME LIKE ? "; + isCertificateUsernameProvided = true; + } + + query += "ORDER BY ID LIMIT ? OFFSET ?"; + + try (PreparedStatement stmt = conn.prepareStatement(query)) { + int paramIdx = 1; + stmt.setInt(paramIdx++, tenantId); + if (isCertificateSerialNumberProvided) { + stmt.setString(paramIdx++, serialNumber); + } + if (isCertificateDeviceIdentifierProvided) { + stmt.setString(paramIdx++, deviceIdentifier); + } + if (isCertificateUsernameProvided) { + stmt.setString(paramIdx++, "%" + username + "%"); + } + stmt.setInt(paramIdx++, request.getStartIndex()); + stmt.setInt(paramIdx++, request.getRowCount()); + try (ResultSet resultSet = stmt.executeQuery()) { + while (resultSet.next()) { + certificateResponse = new CertificateResponse(); + byte[] certificateBytes = resultSet.getBytes("CERTIFICATE"); + certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER")); + certificateResponse.setCertificateId(resultSet.getString("ID")); + certificateResponse.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFIER")); + certificateResponse.setTenantId(resultSet.getInt("TENANT_ID")); + certificateResponse.setUsername(resultSet.getString("USERNAME")); + CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse); + certificates.add(certificateResponse); + } + paginationResult = new PaginationResult(); + paginationResult.setData(certificates); + paginationResult.setRecordsTotal(this.getCertificateCount(request)); + } } - paginationResult = new PaginationResult(); - paginationResult.setData(certificates); - paginationResult.setRecordsTotal(resultCount); } catch (SQLException e) { String errorMsg = "SQL error occurred while retrieving the certificates."; log.error(errorMsg, e); throw new CertificateManagementDAOException(errorMsg, e); - } finally { - CertificateManagementDAOUtil.cleanupResources(stmt, resultSet); } return paginationResult; } @@ -88,4 +122,60 @@ public class PostgreSQLCertificateDAOImpl extends AbstractCertificateDAOImpl { private Connection getConnection() throws SQLException { return CertificateManagementDAOFactory.getConnection(); } + + private int getCertificateCount(CertificatePaginationRequest request) throws CertificateManagementDAOException { + int certificateCount = 0; + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + String serialNumber = request.getSerialNumber(); + String deviceIdentifier = request.getDeviceIdentifier(); + String username = request.getUsername(); + + try { + Connection conn = this.getConnection(); + String sql = "SELECT COUNT(*) AS DEVICE_CERTIFICATE_COUNT " + + "FROM DM_DEVICE_CERTIFICATE " + + "WHERE TENANT_ID = ?"; + + if (StringUtils.isNotEmpty(serialNumber)) { + sql += " AND SERIAL_NUMBER = ?"; + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + sql += " AND DEVICE_IDENTIFIER = ?"; + } + + if (StringUtils.isNotEmpty(username)) { + sql += " AND USERNAME ILIKE ?"; + } + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantId); + + int paramIdx = 2; + if (StringUtils.isNotEmpty(serialNumber)) { + stmt.setString(paramIdx++, serialNumber); + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + stmt.setString(paramIdx++, deviceIdentifier); + } + + if (StringUtils.isNotEmpty(username)) { + stmt.setString(paramIdx, "%" + username + "%"); + } + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + certificateCount = rs.getInt("DEVICE_CERTIFICATE_COUNT"); + } + } + } + } catch (SQLException e) { + String errorMsg = "SQL error occurred while retrieving the certificate count."; + log.error(errorMsg, e); + throw new CertificateManagementDAOException(errorMsg, e); + } + return certificateCount; + } + } diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/SQLServerCertificateDAOImpl.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/SQLServerCertificateDAOImpl.java index 084ab9a1c1..80f902614d 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/SQLServerCertificateDAOImpl.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dao/impl/SQLServerCertificateDAOImpl.java @@ -18,14 +18,16 @@ package io.entgra.device.mgt.core.certificate.mgt.core.dao.impl; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; +import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; +import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil; -import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; -import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; import java.sql.Connection; @@ -44,43 +46,75 @@ public class SQLServerCertificateDAOImpl extends AbstractCertificateDAOImpl { private static final Log log = LogFactory.getLog(SQLServerCertificateDAOImpl.class); @Override - public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException { - PreparedStatement stmt = null; - ResultSet resultSet = null; + public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); CertificateResponse certificateResponse; List certificates = new ArrayList<>(); PaginationResult paginationResult; - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + String serialNumber = request.getSerialNumber(); + String deviceIdentifier = request.getDeviceIdentifier(); + String username = request.getUsername(); + boolean isCertificateSerialNumberProvided = false; + boolean isCertificateDeviceIdentifierProvided = false; + boolean isCertificateUsernameProvided = false; + try { Connection conn = this.getConnection(); - String sql = "SELECT CERTIFICATE, SERIAL_NUMBER, TENANT_ID, USERNAME FROM " - + "DM_DEVICE_CERTIFICATE WHERE TENANT_ID = ? ORDER BY ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, tenantId); - stmt.setInt(2, rowNum); - stmt.setInt(3, limit); - resultSet = stmt.executeQuery(); - - int resultCount = 0; - while (resultSet.next()) { - certificateResponse = new CertificateResponse(); - byte[] certificateBytes = resultSet.getBytes("CERTIFICATE"); - certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER")); - certificateResponse.setTenantId(resultSet.getInt("TENANT_ID")); - certificateResponse.setUsername(resultSet.getString("USERNAME")); - CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse); - certificates.add(certificateResponse); - resultCount++; + String query = "SELECT * " + + "FROM DM_DEVICE_CERTIFICATE " + + "WHERE TENANT_ID = ? "; + if (StringUtils.isNotEmpty(serialNumber)) { + query += "AND SERIAL_NUMBER = ? "; + isCertificateSerialNumberProvided = true; + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + query += "AND DEVICE_IDENTIFIER = ? "; + isCertificateDeviceIdentifierProvided = true; + } + + if (StringUtils.isNotEmpty(username)) { + query += "AND USERNAME LIKE ? "; + isCertificateUsernameProvided = true; + } + + query += "ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + + try (PreparedStatement stmt = conn.prepareStatement(query)) { + int paramIdx = 1; + stmt.setInt(paramIdx++, tenantId); + if (isCertificateSerialNumberProvided) { + stmt.setString(paramIdx++, serialNumber); + } + if (isCertificateDeviceIdentifierProvided) { + stmt.setString(paramIdx++, deviceIdentifier); + } + if (isCertificateUsernameProvided) { + stmt.setString(paramIdx++, "%" + username + "%"); + } + stmt.setInt(paramIdx++, request.getStartIndex()); + stmt.setInt(paramIdx++, request.getRowCount()); + try (ResultSet resultSet = stmt.executeQuery()) { + while (resultSet.next()) { + certificateResponse = new CertificateResponse(); + byte[] certificateBytes = resultSet.getBytes("CERTIFICATE"); + certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER")); + certificateResponse.setCertificateId(resultSet.getString("ID")); + certificateResponse.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFIER")); + certificateResponse.setTenantId(resultSet.getInt("TENANT_ID")); + certificateResponse.setUsername(resultSet.getString("USERNAME")); + CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse); + certificates.add(certificateResponse); + } + paginationResult = new PaginationResult(); + paginationResult.setData(certificates); + paginationResult.setRecordsTotal(this.getCertificateCount(request)); + } } - paginationResult = new PaginationResult(); - paginationResult.setData(certificates); - paginationResult.setRecordsTotal(resultCount); } catch (SQLException e) { String errorMsg = "SQL error occurred while retrieving the certificates."; log.error(errorMsg, e); throw new CertificateManagementDAOException(errorMsg, e); - } finally { - CertificateManagementDAOUtil.cleanupResources(stmt, resultSet); } return paginationResult; } @@ -88,4 +122,60 @@ public class SQLServerCertificateDAOImpl extends AbstractCertificateDAOImpl { private Connection getConnection() throws SQLException { return CertificateManagementDAOFactory.getConnection(); } + + private int getCertificateCount(CertificatePaginationRequest request) throws CertificateManagementDAOException { + int certificateCount = 0; + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + String serialNumber = request.getSerialNumber(); + String deviceIdentifier = request.getDeviceIdentifier(); + String username = request.getUsername(); + + try { + Connection conn = this.getConnection(); + String sql = "SELECT COUNT(*) AS DEVICE_CERTIFICATE_COUNT " + + "FROM DM_DEVICE_CERTIFICATE " + + "WHERE TENANT_ID = ?"; + + if (StringUtils.isNotEmpty(serialNumber)) { + sql += " AND SERIAL_NUMBER = ?"; + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + sql += " AND DEVICE_IDENTIFIER = ?"; + } + + if (StringUtils.isNotEmpty(username)) { + sql += " AND USERNAME LIKE ?"; + } + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantId); + + int paramIdx = 2; + if (StringUtils.isNotEmpty(serialNumber)) { + stmt.setString(paramIdx++, serialNumber); + } + + if (StringUtils.isNotEmpty(deviceIdentifier)) { + stmt.setString(paramIdx++, deviceIdentifier); + } + + if (StringUtils.isNotEmpty(username)) { + stmt.setString(paramIdx, "%" + username + "%"); + } + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + certificateCount = rs.getInt("DEVICE_CERTIFICATE_COUNT"); + } + } + } + } catch (SQLException e) { + String errorMsg = "SQL error occurred while retrieving the certificate count."; + log.error(errorMsg, e); + throw new CertificateManagementDAOException(errorMsg, e); + } + return certificateCount; + } + } diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dto/CertificateResponse.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dto/CertificateResponse.java index 44b0df5193..23f37a0efa 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dto/CertificateResponse.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/dto/CertificateResponse.java @@ -32,6 +32,12 @@ public class CertificateResponse { @ApiModelProperty(name = "serialNumber", value = "It is the unique ID that is used to identify a certificate", required = true) String serialNumber; + @ApiModelProperty(name = "deviceIdentifier", value = "It is use to identify a certificate list", required = true) + String deviceIdentifier; + + @ApiModelProperty(name = "certificateId", value = "It is the unique ID that is used to identify a certificate", required = true) + String certificateId; + @ApiModelProperty(name = "tenantId", value = "The ID of the tenant who adds the certificate", required = true) int tenantId; @@ -44,8 +50,8 @@ public class CertificateResponse { @ApiModelProperty(name = "notBefore", value = "The date from when the certificate is valid", required = true) long notBefore; - @ApiModelProperty(name = "certificateserial", value = "The serial number of the certificate", required = true) - BigInteger certificateserial; + @ApiModelProperty(name = "certificateSerial", value = "The serial number of the certificate", required = true) + BigInteger certificateSerial; @ApiModelProperty(name = "issuer", value = "The identity of the authority that signs the SSL certificate", required = true) String issuer; @@ -83,12 +89,12 @@ public class CertificateResponse { this.notBefore = notBefore; } - public BigInteger getCertificateserial() { - return certificateserial; + public BigInteger getCertificateSerial() { + return certificateSerial; } - public void setCertificateserial(BigInteger certificateserial) { - this.certificateserial = certificateserial; + public void setCertificateSerial(BigInteger certificateSerial) { + this.certificateSerial = certificateSerial; } public String getIssuer() { @@ -146,4 +152,20 @@ public class CertificateResponse { public void setTenantId(int tenantId) { this.tenantId = tenantId; } + + public String getDeviceIdentifier() { + return deviceIdentifier; + } + + public void setDeviceIdentifier(String deviceIdentifier) { + this.deviceIdentifier = deviceIdentifier; + } + + public String getCertificateId() { + return certificateId; + } + + public void setCertificateId(String certificateId) { + this.certificateId = certificateId; + } } diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateGenerator.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateGenerator.java index 4fe75afb8a..347dea3d4f 100755 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateGenerator.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateGenerator.java @@ -108,7 +108,7 @@ public class CertificateGenerator { X509Certificate certificate = (X509Certificate) x509Certificate; certificateResponse.setNotAfter(certificate.getNotAfter().getTime()); certificateResponse.setNotBefore(certificate.getNotBefore().getTime()); - certificateResponse.setCertificateserial(certificate.getSerialNumber()); + certificateResponse.setCertificateSerial(certificate.getSerialNumber()); certificateResponse.setIssuer(certificate.getIssuerDN().getName()); certificateResponse.setSubject(certificate.getSubjectDN().getName()); certificateResponse.setCertificateVersion(certificate.getVersion()); diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/service/CertificateManagementService.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/service/CertificateManagementService.java index 3eb94d21f1..611295ba3f 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/service/CertificateManagementService.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/service/CertificateManagementService.java @@ -17,6 +17,7 @@ */ package io.entgra.device.mgt.core.certificate.mgt.core.service; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse; import io.entgra.device.mgt.core.certificate.mgt.core.dto.SCEPResponse; import io.entgra.device.mgt.core.certificate.mgt.core.exception.CertificateManagementException; @@ -71,10 +72,12 @@ public interface CertificateManagementService { CertificateResponse retrieveCertificate(String serialNumber) throws CertificateManagementException; - PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementException; + PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementException; boolean removeCertificate(String serialNumber) throws CertificateManagementException; + boolean getValidateMetaValue() throws CertificateManagementException; + List getCertificates() throws CertificateManagementException; List searchCertificates(String serialNumber) throws CertificateManagementException; diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/service/CertificateManagementServiceImpl.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/service/CertificateManagementServiceImpl.java index 95ec72a111..06cbedfb4d 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/service/CertificateManagementServiceImpl.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/service/CertificateManagementServiceImpl.java @@ -17,6 +17,12 @@ */ package io.entgra.device.mgt.core.certificate.mgt.core.service; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; +import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagementConstants; +import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagerUtil; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateDAO; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory; @@ -27,12 +33,15 @@ import io.entgra.device.mgt.core.certificate.mgt.core.exception.KeystoreExceptio import io.entgra.device.mgt.core.certificate.mgt.core.exception.TransactionManagementException; import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator; import io.entgra.device.mgt.core.certificate.mgt.core.impl.KeyStoreReader; -import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagementConstants; -import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagerUtil; + +import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bouncycastle.pkcs.PKCS10CertificationRequest; + import java.io.InputStream; import java.security.PrivateKey; import java.security.cert.Certificate; @@ -154,25 +163,24 @@ public class CertificateManagementServiceImpl implements CertificateManagementSe } @Override - public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementException { + public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementException { try { CertificateManagementDAOFactory.openConnection(); CertificateDAO certificateDAO = CertificateManagementDAOFactory.getCertificateDAO(); - return certificateDAO.getAllCertificates(rowNum, CertificateManagerUtil.validateCertificateListPageSize(limit)); + return certificateDAO.getAllCertificates(request); } catch (SQLException e) { String msg = "Error occurred while opening a connection to the underlying data source"; log.error(msg, e); throw new CertificateManagementException(msg, e); } catch (CertificateManagementDAOException e) { String msg = "Error occurred while looking up for the list of certificates managed in the underlying " + - "certificate repository"; + "certificate repository"; log.error(msg, e); throw new CertificateManagementException(msg, e); } finally { CertificateManagementDAOFactory.closeConnection(); } } - @Override public boolean removeCertificate(String serialNumber) throws CertificateManagementException { try { @@ -182,18 +190,43 @@ public class CertificateManagementServiceImpl implements CertificateManagementSe CertificateManagementDAOFactory.commitTransaction(); return status; } catch (TransactionManagementException e) { - String msg = "Error occurred while removing certificate carrying serial number '" + serialNumber + "'"; + String msg = "Error occurred while removing certificate carrying serialNumber '" + serialNumber + "'"; log.error(msg, e); throw new CertificateManagementException(msg, e); } catch (CertificateManagementDAOException e) { CertificateManagementDAOFactory.rollbackTransaction(); - String msg = "Error occurred while removing the certificate carrying serial number '" + serialNumber + + String msg = "Error occurred while removing the certificate carrying serialNumber '" + serialNumber + "' from the certificate repository"; log.error(msg, e); throw new CertificateManagementException(msg, e); } } + @Override + public boolean getValidateMetaValue() throws CertificateManagementException { + Metadata metadata; + try { + metadata = CertificateManagerUtil.getMetadataManagementService().retrieveMetadata(CertificateManagementConstants.CERTIFICATE_DELETE); + if (metadata != null) { + String metaValue = metadata.getMetaValue(); + if (StringUtils.isNotEmpty(metaValue)) { + JsonParser parser = new JsonParser(); + JsonObject jsonObject = parser.parse(metaValue).getAsJsonObject(); + return jsonObject.get(CertificateManagementConstants.IS_CERTIFICATE_DELETE_ENABLE).getAsBoolean(); + } + } + return false; + } catch (MetadataManagementException e) { + String msg = "Error occurred while getting the metadata entry for metaKey: " + CertificateManagementConstants.CERTIFICATE_DELETE; + log.error(msg, e); + throw new CertificateManagementException(msg, e); + } catch (JsonParseException e) { + String msg = "Error occurred while parsing the JSON metadata value for metaKey: " + CertificateManagementConstants.CERTIFICATE_DELETE; + log.error(msg, e); + throw new CertificateManagementException(msg, e); + } + } + @Override public List getCertificates() throws CertificateManagementException { try { diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/util/CertificateManagementConstants.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/util/CertificateManagementConstants.java index 8235b3ee77..f851bd05f0 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/util/CertificateManagementConstants.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/util/CertificateManagementConstants.java @@ -41,6 +41,12 @@ public final class CertificateManagementConstants { public static final int RSA_KEY_LENGTH = 2048; public static final String SIGNING_ALGORITHM = "SHA256withRSA"; + public static final int DEFAULT_PAGE_LIMIT = 50; + + public static final String CERTIFICATE_DELETE = "CERTIFICATE_DELETE"; + public static final String IS_CERTIFICATE_DELETE_ENABLE = "isCertificateDelete"; + + public static final class DataBaseTypes { private DataBaseTypes() { throw new AssertionError(); diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/util/CertificateManagerUtil.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/util/CertificateManagerUtil.java index 4383396448..2da3d4d414 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/util/CertificateManagerUtil.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/main/java/io/entgra/device/mgt/core/certificate/mgt/core/util/CertificateManagerUtil.java @@ -19,15 +19,17 @@ package io.entgra.device.mgt.core.certificate.mgt.core.util; +import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.w3c.dom.Document; import io.entgra.device.mgt.core.certificate.mgt.core.config.CertificateConfigurationManager; import io.entgra.device.mgt.core.certificate.mgt.core.config.CertificateManagementConfig; import io.entgra.device.mgt.core.certificate.mgt.core.config.datasource.DataSourceConfig; import io.entgra.device.mgt.core.certificate.mgt.core.config.datasource.JNDILookupDefinition; import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil; import io.entgra.device.mgt.core.certificate.mgt.core.exception.CertificateManagementException; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.w3c.dom.Document; +import org.wso2.carbon.context.PrivilegedCarbonContext; import javax.sql.DataSource; import javax.xml.XMLConstants; @@ -41,6 +43,7 @@ public class CertificateManagerUtil { public static final String GENERAL_CONFIG_RESOURCE_PATH = "general"; public static final String MONITORING_FREQUENCY = "notifierFrequency"; + private static MetadataManagementService metadataManagementService; private static final Log log = LogFactory.getLog(CertificateManagerUtil.class); public static Document convertToDocument(File file) throws CertificateManagementException { @@ -105,4 +108,26 @@ public class CertificateManagerUtil { return limit; } + /** + * Initializing and accessing method for MetadataManagementService. + * + * @return MetadataManagementService instance + * @throws IllegalStateException if metadataManagementService cannot be initialized + */ + public static MetadataManagementService getMetadataManagementService() { + if (metadataManagementService == null) { + synchronized (CertificateManagerUtil.class) { + if (metadataManagementService == null) { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + metadataManagementService = (MetadataManagementService) ctx.getOSGiService( + MetadataManagementService.class, null); + if (metadataManagementService == null) { + throw new IllegalStateException("Metadata Management service not initialized."); + } + } + } + } + return metadataManagementService; + } + } \ No newline at end of file diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateManagementServiceImplNegativeTests.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateManagementServiceImplNegativeTests.java index 1f7dbf0f3c..7aff1cd586 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateManagementServiceImplNegativeTests.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateManagementServiceImplNegativeTests.java @@ -18,10 +18,7 @@ package io.entgra.device.mgt.core.certificate.mgt.core.impl; -import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory; -import io.entgra.device.mgt.core.certificate.mgt.core.exception.CertificateManagementException; -import io.entgra.device.mgt.core.certificate.mgt.core.exception.TransactionManagementException; -import io.entgra.device.mgt.core.certificate.mgt.core.service.CertificateManagementServiceImpl; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; @@ -33,6 +30,10 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.ObjectFactory; import org.testng.annotations.Test; import org.wso2.carbon.base.MultitenantConstants; +import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory; +import io.entgra.device.mgt.core.certificate.mgt.core.exception.CertificateManagementException; +import io.entgra.device.mgt.core.certificate.mgt.core.exception.TransactionManagementException; +import io.entgra.device.mgt.core.certificate.mgt.core.service.CertificateManagementServiceImpl; import org.wso2.carbon.context.PrivilegedCarbonContext; import javax.sql.DataSource; @@ -110,7 +111,8 @@ public class CertificateManagementServiceImplNegativeTests extends PowerMockTest public void negativeTestGetAllCertificates() throws Exception { PowerMockito.mockStatic(CertificateManagementDAOFactory.class); PowerMockito.doThrow(new SQLException()).when(CertificateManagementDAOFactory.class, "openConnection"); - instance.getAllCertificates(1, 2); + CertificatePaginationRequest request = new CertificatePaginationRequest(0, 2); + instance.getAllCertificates(request); } @Test(description = "This test case tests behaviour when an error occurs getting the list of certificates from repository" @@ -118,7 +120,8 @@ public class CertificateManagementServiceImplNegativeTests extends PowerMockTest public void negativeTestGetAllCertificates2() throws Exception { CertificateManagementDAOFactory.init(daoExceptionDatasource); CertificateManagementServiceImpl instance1 = CertificateManagementServiceImpl.getInstance(); - instance1.getAllCertificates(1, 2); + CertificatePaginationRequest request = new CertificatePaginationRequest(0, 2); + instance.getAllCertificates(request); } @Test(description = "This test case tests behaviour when data source transaction error occurs when removing the certificate" diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateManagementServiceImplTests.java b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateManagementServiceImplTests.java index 6337837ef1..a3cca775a9 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateManagementServiceImplTests.java +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/java/io/entgra/device/mgt/core/certificate/mgt/core/impl/CertificateManagementServiceImplTests.java @@ -32,6 +32,7 @@ import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagement import io.entgra.device.mgt.core.certificate.mgt.core.util.DummyCertificate; import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; import io.entgra.device.mgt.core.device.mgt.core.config.DeviceConfigurationManager; +import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -210,14 +211,15 @@ public class CertificateManagementServiceImplTests extends BaseDeviceManagementC X509Certificate x509Certificate = managementService.generateX509Certificate(); CertificateResponse certificateResponse = managementService.retrieveCertificate(x509Certificate.getSerialNumber().toString()); Assert.assertNotNull(certificateResponse); - Assert.assertEquals(x509Certificate.getSerialNumber(), certificateResponse.getCertificateserial()); + Assert.assertEquals(x509Certificate.getSerialNumber(), certificateResponse.getCertificateSerial()); } @Test(description = "This test case tests the retrieval of Certificates from keystore in desired pagination") public void testGetAllCertificatesPaginated() throws CertificateManagementException, KeystoreException { managementService.generateX509Certificate(); managementService.generateX509Certificate(); - PaginationResult allCertificates = managementService.getAllCertificates(0, 2); + CertificatePaginationRequest request = new CertificatePaginationRequest(0,2); + PaginationResult allCertificates = managementService.getAllCertificates(request); Assert.assertEquals(allCertificates.getData().size(), 2); log.info("GetAllCertificatesPaginated Test Successful"); } diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/resources/sql/h2.sql b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/resources/sql/h2.sql index 46582aa390..0fb769e406 100644 --- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/resources/sql/h2.sql +++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/src/test/resources/sql/h2.sql @@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE ( SERIAL_NUMBER VARCHAR(500) DEFAULT NULL, CERTIFICATE BLOB DEFAULT NULL, TENANT_ID INTEGER DEFAULT 0, + DEVICE_IDENTIFIER VARCHAR(300), USERNAME VARCHAR(500) DEFAULT NULL, PRIMARY KEY (ID) ); \ No newline at end of file diff --git a/components/certificate-mgt/pom.xml b/components/certificate-mgt/pom.xml index da2dfcd2df..b218c20dd4 100644 --- a/components/certificate-mgt/pom.xml +++ b/components/certificate-mgt/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core io.entgra.device.mgt.core.parent - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager/pom.xml index 0e946ff81d..6bed168fde 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.type.deployer/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.type.deployer/pom.xml index 60ea674ab9..66530f647c 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.type.deployer/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.type.deployer/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.logger/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.logger/pom.xml index 04a9e048e6..d4c7eda985 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.logger/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.logger/pom.xml @@ -21,7 +21,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.pull.notification/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.pull.notification/pom.xml index c64715c941..90a6331adb 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.pull.notification/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.pull.notification/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm/pom.xml index f4e6546fe8..e5b71633c3 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http/pom.xml index 4054d7c446..b3fabbd1a3 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt/pom.xml index 64f3d4265b..44fac89fc6 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp/pom.xml index ffbef61ef9..5a27316b32 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.stateengine/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.stateengine/pom.xml index e6e8dde418..173081ceff 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.stateengine/pom.xml +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.stateengine/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/pom.xml b/components/device-mgt-extensions/pom.xml index 4a0aa662a3..6fce15dac4 100644 --- a/components/device-mgt-extensions/pom.xml +++ b/components/device-mgt-extensions/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core.parent io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../../pom.xml diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/pom.xml index dc7016b80f..d5bbb2e967 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/pom.xml +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/pom.xml @@ -22,7 +22,7 @@ device-mgt io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml @@ -448,5 +448,10 @@ io.entgra.device.mgt.core.apimgt.analytics.extension provided + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.apimgt.webapp.publisher + provided + \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/ApplicationUninstallation.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/ApplicationUninstallation.java index a38ae2982d..f78d15966e 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/ApplicationUninstallation.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/ApplicationUninstallation.java @@ -41,6 +41,14 @@ public class ApplicationUninstallation { @Pattern(regexp = "^[A-Za-z]*$") String type; + String name; + + String platform; + + String version; + + String user; + public ApplicationUninstallation() { } @@ -49,6 +57,47 @@ public class ApplicationUninstallation { this.type = type; } + public ApplicationUninstallation(String appIdentifier, String type, String name, String platform, String version, String user) { + this.appIdentifier = appIdentifier; + this.type = type; + this.name = name; + this.platform = platform; + this.version = version; + this.user = user; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + public String getAppIdentifier() { return appIdentifier; } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/DeviceActivityList.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/DeviceActivityList.java new file mode 100644 index 0000000000..a538ea4d33 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/DeviceActivityList.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.Gson; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.DeviceActivity; + +import java.util.List; + +@ApiModel(value = "ListOfDeviceActivities", description = "This contains a set of device activities that " + + "matches a given" + + " criteria as a collection") +public class DeviceActivityList extends BasePaginatedResult { + + private List activities; + + @ApiModelProperty(value = "List of device activity Ids") + @JsonProperty("activities") + public List getList() { + return activities; + } + + public void setList(List activities) { + this.activities = activities; + } + + @Override + public String toString() { + return new Gson().toJson(this); + } + +} diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/RoleInfo.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/RoleInfo.java index c67634446d..6269bcbcba 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/RoleInfo.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/RoleInfo.java @@ -31,6 +31,11 @@ public class RoleInfo { @ApiModelProperty(name = "permissions", value = "Lists out all the permissions associated with roles.", required = true, dataType = "List[java.lang.String]") private String[] permissions; + + @ApiModelProperty(name = "removedPermissions", value = "Lists out all the permissions unassociated with roles.", + required = true, dataType = "List[java.lang.String]") + private String[] removedPermissions; + @ApiModelProperty(name = "users", value = "The list of users assigned to the selected role.", required = true, dataType = "List[java.lang.String]") private String[] users; @@ -74,4 +79,7 @@ public class RoleInfo { this.permissionList = permissionList; } + public String[] getRemovedPermissions() { return removedPermissions; } + + public void setRemovedPermissions(String[] removedPermissions) { this.removedPermissions = removedPermissions; } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ActivityInfoProviderService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ActivityInfoProviderService.java index d4f5881670..7e645198a6 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ActivityInfoProviderService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ActivityInfoProviderService.java @@ -58,9 +58,9 @@ import java.util.List; @Scope( name = "Get activities", description = "Get activities", - key = "perm:get-activity", + key = "dm:activity:get", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/activities/view"} ) } ) @@ -79,7 +79,7 @@ public interface ActivityInfoProviderService { tags = "Activity Info Provider", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:get-activity") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:activity:get") }) } ) @@ -153,7 +153,7 @@ public interface ActivityInfoProviderService { tags = "Activity Info Provider", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:get-activity") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:activity:get") }) }, nickname = "getActivitiesByActivityIdList" @@ -216,7 +216,7 @@ public interface ActivityInfoProviderService { tags = "Activity Info Provider", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:get-activity") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:activity:get") }) } ) @@ -290,7 +290,17 @@ public interface ActivityInfoProviderService { "Provide the value in the Java Date Format: EEE, d MMM yyyy HH:mm:ss Z\n." + "Example: Mon, 05 Jan 2014 15:10:00 +0200", required = false) - @HeaderParam("If-Modified-Since") String ifModifiedSince); + @HeaderParam("If-Modified-Since") String ifModifiedSince, + @ApiParam( + name = "response", + value = "The starting pagination index for the complete list of qualified items.", + required = false) + @QueryParam("response") Boolean response, + @ApiParam( + name = "appInstall", + value = "The starting pagination index for the complete list of qualified items.", + required = false) + @QueryParam("appInstall") Boolean appInstall); @GET @Path("/type/{operationCode}") @@ -303,7 +313,7 @@ public interface ActivityInfoProviderService { tags = "Activity Info Provider", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:get-activity") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:activity:get") }) }, nickname = "getActivitiesByOperationCode" @@ -357,6 +367,131 @@ public interface ActivityInfoProviderService { defaultValue = "5") @QueryParam("limit") int limit); + @GET + @Path("/devices") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Device Activity Details", + notes = "Get the details of the operations/activities executed by the server on the devices registered" + + " with WSO2 EMM, during a defined time period.", + tags = "Device Activity Info Provider", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:get-activity") + }) + }, + nickname = "getDeviceActivitiesWithFilters" + ) + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the device activity details.", + response = ActivityList.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the client already has the latest version of the" + + " requested resource.\n"), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not Found. \n No activities found.", + response = ErrorResponse.class), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the activity data.", + response = ErrorResponse.class) + }) + Response getDeviceActivities( + @ApiParam( + name = "offset", + value = "The starting pagination index for the complete list of qualified items.", + defaultValue = "0") + @DefaultValue("0") @QueryParam("offset") int offset, + @ApiParam( + name = "limit", + value = "Provide how many activity details you require from the starting pagination index/offset.", + defaultValue = "5") + @DefaultValue("20") @QueryParam("limit") int limit, + @ApiParam( + name = "since", + value = "Checks if the requested variant was created since the specified date-time.\n" + + "Provide the value in the following format: EEE, d MMM yyyy HH:mm:ss Z.\n" + + "Example: Mon, 05 Jan 2014 15:10:00 +0200" + ) + @QueryParam("since") String since, + @ApiParam( + name = "initiatedBy", + value = "The user, who initiated the operation. If is done by the task, the SYSTEM will be returned." + + " And if a user adds the operation, username is returned" + ) + @QueryParam("initiatedBy") String initiatedBy, + @ApiParam( + name = "operationCode", + value = "Operation Code to filter" + ) + @QueryParam("operationCode") String operationCode, + @ApiParam( + name = "operationId", + value = "Operation Id to filter" + ) + @QueryParam("operationId") int operationId, + @ApiParam( + name = "deviceType", + value = "Device Type to filter" + ) + @QueryParam("deviceType") String deviceType, + @ApiParam( + name = "deviceId", + value = "Device Id to filter" + ) + @QueryParam("deviceId") List deviceIds, + @ApiParam( + name = "type", + value = "Operation type to filter" + ) + @QueryParam("type") String type, + @ApiParam( + name = "status", + value = "Operation response status to filter" + ) + @QueryParam("status") String status, + @ApiParam( + name = "If-Modified-Since", + value = "Checks if the requested variant was modified, since the specified date-time\n." + + "Provide the value in the following format: EEE, d MMM yyyy HH:mm:ss Z\n." + + "Example: Mon, 05 Jan 2014 15:10:00 +0200" + ) + @HeaderParam("If-Modified-Since") String ifModifiedSince, + @ApiParam( + name = "startTimestamp", + value = "Starting unix timestamp value for filtering activities" + ) + @QueryParam("startTimestamp") long startTimestamp, + @ApiParam( + name = "endTimestamp", + value = "Ending unix timestamp value for filtering activities" + ) + @QueryParam("endTimestamp") long endTimestamp); + @GET @ApiOperation( produces = MediaType.APPLICATION_JSON, @@ -367,7 +502,7 @@ public interface ActivityInfoProviderService { tags = "Activity Info Provider", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:get-activity") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:activity:get") }) }, nickname = "getActivitiesWithFilters" @@ -438,6 +573,11 @@ public interface ActivityInfoProviderService { value = "Operation Code to filter" ) @QueryParam("operationCode") String operationCode, + @ApiParam( + name = "operationId", + value = "Operation Id to filter" + ) + @QueryParam("operationId") int operationId, @ApiParam( name = "deviceType", value = "Device Type to filter" diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/AnalyticsArtifactsManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/AnalyticsArtifactsManagementService.java index fd03db1080..f509284431 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/AnalyticsArtifactsManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/AnalyticsArtifactsManagementService.java @@ -51,49 +51,49 @@ import javax.ws.rs.core.Response; @Scope( name = "Create Event Stream Artifact", description = "Create Event Stream Artifact", - key = "perm:analytics:artifacts:stream", + key = "dm:an:artifacts:stream:add", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/analytics/artifacts/stream/add"}), @Scope( name = "Delete Stream Artifact", description = "Delete Stream Artifact", - key = "perm:analytics:artifacts:stream:delete", + key = "dm:an:artifacts:stream:delete", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/analytics/artifacts/stream/delete"}), @Scope( name = "Create Event Receiver Artifact", description = "Create Event Receiver Artifact", - key = "perm:analytics:artifacts:receiver", + key = "dm:an:artifacts:rcv:add", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/analytics/artifacts/receiver/add"}), @Scope( name = "Delete Receiver Artifact", description = "Delete Receiver Artifact", - key = "perm:analytics:artifacts:receiver:delete", + key = "dm:an:artifacts:rcv:delete", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/analytics/artifacts/receiver/delete"}), @Scope( name = "Create Event Publisher Artifact", description = "Create Event Publisher Artifact", - key = "perm:analytics:artifacts:publisher", + key = "dm:an:artifacts:pub:add", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/analytics/artifacts/publisher/add"}), @Scope( name = "Delete Publisher Artifact", description = "Delete Publisher Artifact", - key = "perm:analytics:artifacts:publisher:delete", + key = "dm:an:artifacts:pub:delete", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/analytics/artifacts/publisher/delete"}), @Scope( name = "Create Siddhi Script Artifact", description = "Create Siddhi Script Artifact", - key = "perm:analytics:artifacts:siddhi", + key = "dm:an:artifacts:siddhi:add", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/analytics/artifacts/siddhi-script/add"}), @Scope( name = "Delete Siddhi Script Artifact", description = "Delete Siddhi Script Artifact", - key = "perm:analytics:artifacts:siddhi:delete", + key = "dm:an:artifacts:siddhi:delete", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/analytics/artifacts/siddhi-script/delete"}) } @@ -118,7 +118,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:stream" + value = "dm:an:artifacts:stream:add" )}) } ) @@ -176,7 +176,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:stream" + value = "dm:an:artifacts:stream:add" )}) } ) @@ -222,7 +222,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:stream:delete" + value = "dm:an:artifacts:stream:delete" )}) } ) @@ -275,7 +275,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:receiver" + value = "dm:an:artifacts:rcv:add" )}) } ) @@ -327,7 +327,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:receiver" + value = "dm:an:artifacts:rcv:add" )}) } ) @@ -374,7 +374,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:receiver:delete" + value = "dm:an:artifacts:rcv:delete" )}) } ) @@ -421,7 +421,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:publisher" + value = "dm:an:artifacts:pub:add" )}) } ) @@ -473,7 +473,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:publisher" + value = "dm:an:artifacts:pub:add" )}) } ) @@ -520,7 +520,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:publisher:delete" + value = "dm:an:artifacts:pub:delete" )}) } ) @@ -564,7 +564,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:siddhi" + value = "dm:an:artifacts:siddhi:add" )}) } ) @@ -615,7 +615,7 @@ public interface AnalyticsArtifactsManagementService { @Extension(properties = { @ExtensionProperty( name = Constants.SCOPE, - value = "perm:analytics:artifacts:siddhi:delete" + value = "dm:an:artifacts:siddhi:delete" ) }) } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ConfigurationManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ConfigurationManagementService.java index 720b6ea184..5957783c3a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ConfigurationManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ConfigurationManagementService.java @@ -55,14 +55,14 @@ import javax.ws.rs.core.Response; @Scope( name = "View configurations", description = "", - key = "perm:view-configuration", + key = "dm:conf:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/platform-configurations/view"} ), @Scope( name = "Manage configurations", description = "", - key = "perm:manage-configuration", + key = "dm:conf:manage", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/platform-configurations/manage"} ) @@ -81,7 +81,7 @@ public interface ConfigurationManagementService { tags = "Configuration Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:view-configuration") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:conf:view") }) } ) @@ -141,7 +141,7 @@ public interface ConfigurationManagementService { tags = "Configuration Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:manage-configuration") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:conf:manage") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceAgentService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceAgentService.java index 0dbc238688..1aee1b1b29 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceAgentService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceAgentService.java @@ -57,37 +57,37 @@ import java.util.Map; @Scope( name = "Enroll Device", description = "Register a device", - key = "perm:device:enroll", + key = "dm:device:enroll", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/add"} ), @Scope( name = "Modify Device", description = "Modify a device", - key = "perm:device:modify", + key = "dm:device:modify", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/modify"} ), @Scope( name = "Disenroll Device", description = "Disenroll a device", - key = "perm:device:disenroll", + key = "dm:device:disenroll", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/remove"} + permissions = {"/device-mgt/devices/owning-device/disenroll"} ), @Scope( name = "Publish Event", description = "publish device event", - key = "perm:device:publish-event", + key = "dm:device:event:publish", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/event"} + permissions = {"/device-mgt/devices/owning-device/event/publish"} ), @Scope( name = "Getting Device Operation Details", description = "Getting Device Operation Details", - key = "perm:device:operations", + key = "dm:devices:ops:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/operations/view"} ) } ) @@ -103,7 +103,7 @@ public interface DeviceAgentService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:enroll") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device:enroll") }) } ) @@ -155,7 +155,7 @@ public interface DeviceAgentService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:disenroll") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device:disenroll") }) } ) @@ -185,7 +185,7 @@ public interface DeviceAgentService { tags = "Device Agent Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:modify") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device:modify") }) } ) @@ -243,7 +243,7 @@ public interface DeviceAgentService { tags = "Device Agent Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:publish-event") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device:event:publish") }) }, nickname = "publishEventFromAgent" @@ -309,7 +309,7 @@ public interface DeviceAgentService { tags = "Device Agent Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:publish-event") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device:event:publish") }) }, nickname = "publishEventsByTypeAndDevice" @@ -376,7 +376,7 @@ public interface DeviceAgentService { tags = "Device Agent Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:operations") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:ops:view") }) } ) @@ -435,7 +435,7 @@ public interface DeviceAgentService { tags = "Device Agent Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:operations") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:ops:view") }) } ) @@ -493,7 +493,7 @@ public interface DeviceAgentService { tags = "Device Agent Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:operations") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:ops:view") }) } ) @@ -552,7 +552,7 @@ public interface DeviceAgentService { tags = "Device Agent Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:modify") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device:modify") }) } ) @@ -612,7 +612,7 @@ public interface DeviceAgentService { tags = "Device Agent Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:operations") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:ops:view") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceEventManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceEventManagementService.java index 8c532f4e23..fd7258e3c0 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceEventManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceEventManagementService.java @@ -51,16 +51,16 @@ import java.util.List; @Scope( name = "Add or Delete Event Definition for device type", description = "Add or Delete Event Definition for device type", - key = "perm:device-types:events", + key = "dm:device-type:event:modify", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/device-type/add"} + permissions = {"/device-mgt/devices/owning-device/event/modify"} ), @Scope( name = "Get Events Details of a Device Type", description = "Get Events Details of a Device Type", - key = "perm:device-types:events:view", + key = "dm:device-type:event:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/event/view"} ) } ) @@ -80,7 +80,7 @@ public interface DeviceEventManagementService { tags = "Device Event Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:events") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:event:modify") }) } ) @@ -139,7 +139,7 @@ public interface DeviceEventManagementService { tags = "Device Event Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:events") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:event:modify") }) } ) @@ -191,7 +191,7 @@ public interface DeviceEventManagementService { // tags = "Device Event Management", // extensions = { // @Extension(properties = { -// @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:events:view") +// @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:event:view") // }) // } // ) @@ -253,7 +253,7 @@ public interface DeviceEventManagementService { // tags = "Device Event Management", // extensions = { // @Extension(properties = { -// @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:events:view") +// @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:event:view") // }) // } // ) @@ -309,7 +309,7 @@ public interface DeviceEventManagementService { // tags = "Device Event Management", // extensions = { // @Extension(properties = { -// @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:events:view") +// @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:event:view") // }) // } // ) @@ -369,7 +369,7 @@ public interface DeviceEventManagementService { tags = "Device Event Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:events:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:event:view") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceManagementService.java index 96091625ba..c42557b7df 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceManagementService.java @@ -41,6 +41,7 @@ import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.List; +import java.util.Map; /** * Device related REST-API. This can be used to manipulated device related details. @@ -65,91 +66,91 @@ import java.util.List; @Scope( name = "Getting Details of Registered Devices", description = "Getting Details of Registered Devices", - key = "perm:devices:view", + key = "dm:devices:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/view"} ), @Scope( name = "Getting Details of a Device", description = "Getting Details of a Device", - key = "perm:devices:details", + key = "dm:devices:details", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/details/view"} ), @Scope( name = "Update the device specified by device id", description = "Update the device specified by device id", - key = "perm:devices:update", + key = "dm:devices:update", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/update"} ), @Scope( name = "Delete the device specified by device id", description = "Delete the device specified by device id", - key = "perm:devices:delete", + key = "dm:devices:delete", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/delete"} ), @Scope( name = "Getting Feature Details of a Device", description = "Getting Feature Details of a Device", - key = "perm:devices:features", + key = "dm:devices:features:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/features/view"} ), @Scope( name = "Advanced Search for Devices", description = "Advanced Search for Devices", - key = "perm:devices:search", + key = "dm:devices:search", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/search"} ), @Scope( name = "Getting Installed Application Details of a Device", description = "Getting Installed Application Details of a Device", - key = "perm:devices:applications", + key = "dm:devices:app:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/apps/view"} ), @Scope( name = "Getting Device Operation Details", description = "Getting Device Operation Details", - key = "perm:devices:operations", + key = "dm:devices:ops:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/operations/view"} ), @Scope( name = "Get the details of the policy that is enforced on a device.", description = "Get the details of the policy that is enforced on a device.", - key = "perm:devices:effective-policy", + key = "dm:devices:policy:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/policies/view"} ), @Scope( name = "Getting Policy Compliance Details of a Device", description = "Getting Policy Compliance Details of a Device", - key = "perm:devices:compliance-data", + key = "dm:devices:compliance:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/compliance/view"} ), @Scope( name = "Change device status.", description = "Change device status.", - key = "perm:devices:change-status", + key = "dm:devices:status:change", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/change-status"} ), @Scope( name = "Enroll Device", description = "Register a device", - key = "perm:device:enroll", + key = "dm:device:enroll", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/add"} ), @Scope( name = "Viewing Enrollment Guide", description = "Show enrollment guide to users", - key = "perm:devices:enrollment-guide:view", + key = "dm:devices:enrollment-guide:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/enrollment-guide/view"} ), @@ -170,7 +171,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -259,6 +260,12 @@ public interface DeviceManagementService { required = false) @QueryParam("serialNumber") String serialNumber, + @ApiParam( + name = "customProperty", + value = "CustomProperty from device as a JSON encoded string.", + required = false) + @QueryParam("customProperty") + String customProperty, @ApiParam( name = "status", value = "Provide the device status details, such as active or inactive.", @@ -319,7 +326,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -395,7 +402,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:details") }) } ) @@ -485,7 +492,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:details") }) } ) @@ -573,7 +580,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:details") }) } ) @@ -649,7 +656,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:details") }) } ) @@ -727,7 +734,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:enrollment-guide:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:enrollment-guide:view") }) } ) @@ -778,7 +785,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:details") }) } ) @@ -814,9 +821,9 @@ public interface DeviceManagementService { Response getDeviceByIdList(List deviceIds); - @PUT + @GET @Produces(MediaType.APPLICATION_JSON) - @Path("/{type}/{id}") + @Path("/{type}/{id}/status") @ApiOperation( produces = MediaType.APPLICATION_JSON, httpMethod = "GET", @@ -825,7 +832,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) }, nickname = "isEnrolledByType" @@ -882,7 +889,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:details") }) } ) @@ -959,7 +966,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:details") }) } ) @@ -1035,7 +1042,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:details") }) } ) @@ -1115,7 +1122,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:update") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:update") }) } ) @@ -1190,7 +1197,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:delete") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:delete") }) }, nickname = "deleteDeviceByTypeAndId" @@ -1261,7 +1268,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:features") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:features:view") }) } ) @@ -1343,7 +1350,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:search") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:search") }) } ) @@ -1423,7 +1430,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:search") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:search") }) } ) @@ -1501,7 +1508,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:applications") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:app:view") }) } @@ -1606,7 +1613,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:applications") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:app:view") }) }) @ApiResponses( @@ -1633,7 +1640,31 @@ public interface DeviceManagementService { value = "The package name of the app user want to uninstall", required = true) @QueryParam("packageName") - String packageName); + String packageName, + @ApiParam( + name = "platform", + value = "The platform of the app user want to uninstall", + required = false) + @QueryParam("platform") + String platform, + @ApiParam( + name = "name", + value = "The name of the app user want to uninstall", + required = false) + @QueryParam("name") + String name, + @ApiParam( + name = "version", + value = "The version of the app user want to uninstall", + required = false) + @QueryParam("version") + String version, + @ApiParam( + name = "user", + value = "The user who triggered the app uninstall", + required = false) + @QueryParam("user") + String user); @GET @Produces(MediaType.APPLICATION_JSON) @@ -1646,7 +1677,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:operations") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:ops:view") }) } ) @@ -1788,7 +1819,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:effective-policy") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:policy:view") }) } ) @@ -1877,7 +1908,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:compliance-data") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:compliance:view") }) } ) @@ -1924,7 +1955,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -1992,7 +2023,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -2062,7 +2093,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:change-status") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:status:change") }) } ) @@ -2138,7 +2169,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:operations") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:ops:view") }) } ) @@ -2195,7 +2226,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -2264,7 +2295,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -2334,7 +2365,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:change-status") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:status:change") }) } ) @@ -2395,7 +2426,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:compliance-data") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:compliance:view") }) } ) @@ -2463,7 +2494,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:compliance-data") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:compliance:view") }) } ) @@ -2503,7 +2534,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:applications") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:app:view") }) } ) @@ -2570,7 +2601,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:applications") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:app:view") }) } ) @@ -2615,7 +2646,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:operations") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:ops:view") }) } ) @@ -2667,7 +2698,7 @@ public interface DeviceManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -2706,7 +2737,7 @@ public interface DeviceManagementService { notes = "Getting the default access token by using given client ID and the client secret value.", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device:enroll") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device:enroll") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceTypeManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceTypeManagementService.java index e355c5bfae..7ad07f5c0c 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceTypeManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/DeviceTypeManagementService.java @@ -52,28 +52,28 @@ import javax.ws.rs.core.Response; @Scope( name = "Getting the Supported Device Platforms", description = "Getting the Supported Device Platforms", - key = "perm:device-types:types", + key = "dm:device-type:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/device-type/view"} ), @Scope( name = "Get Feature Details of a Device Type", description = "Get Feature Details of a Device Type", - key = "perm:device-types:features", + key = "dm:device-type:features:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/device-type/features/view"} ), @Scope( name = "Get Config Details of a Device Type", description = "Get Config Details of a Device Type", - key = "perm:device-types:configs", + key = "dm:device-type:conf:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/device-type/config/view"} ), @Scope( name = "Getting Details of Policies", description = "Getting Details of Policies", - key = "perm:policies:get-details", + key = "dm:policies:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/policies/view"} ) @@ -95,7 +95,7 @@ public interface DeviceTypeManagementService { tags = "Device Type Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:types") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:view") }) }, nickname = "getAllDeviceTypesPaginated" @@ -177,7 +177,7 @@ public interface DeviceTypeManagementService { tags = "Device Type Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:types") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:view") }) }, nickname = "getDeviceTypeByDeviceTypeName" @@ -232,7 +232,7 @@ public interface DeviceTypeManagementService { tags = "Device Type Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:features") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:features:view") }) } ) @@ -311,7 +311,7 @@ public interface DeviceTypeManagementService { tags = "Device Type Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:device-types:configs") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:device-type:conf:view") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GeoLocationBasedService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GeoLocationBasedService.java index 5f97523365..c5faaf1f1c 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GeoLocationBasedService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GeoLocationBasedService.java @@ -54,21 +54,21 @@ import java.util.List; @Scope( name = "View Analytics", description = "", - key = "perm:geo-service:analytics-view", + key = "dm:geo:an:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/view-analytics"} ), @Scope( name = "Manage Alerts", description = "", - key = "perm:geo-service:alerts-manage", + key = "dm:geo:alerts:manage", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/manage-alerts"} ), @Scope( name = "Manage Geo Fences", description = "", - key = "perm:geo-service:geo-fence", + key = "dm:geo:geo-fence:manage", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/manage-geo-fence"} ) @@ -93,7 +93,7 @@ public interface GeoLocationBasedService { // tags = "Geo Service Management", // extensions = { // @Extension(properties = { -// @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:analytics-view") +// @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:an:view") // }) // } // ) @@ -162,7 +162,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:analytics-view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:an:view") }) } ) @@ -246,7 +246,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:analytics-view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:an:view") }) } ) @@ -363,7 +363,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") }) } ) @@ -429,7 +429,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") }) } ) @@ -482,7 +482,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") }) } ) @@ -547,7 +547,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") }) } ) @@ -600,7 +600,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") }) } ) @@ -664,7 +664,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") }) } ) @@ -717,7 +717,7 @@ public interface GeoLocationBasedService { // tags = "Geo Service Management", // extensions = { // @Extension(properties = { -// @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") +// @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") // }) // } // ) @@ -786,7 +786,7 @@ public interface GeoLocationBasedService { // tags = "Geo Service Management", // extensions = { // @Extension(properties = { -// @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") +// @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") // }) // } // ) @@ -845,7 +845,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") }) } ) @@ -910,7 +910,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:alerts:manage") }) } ) @@ -960,7 +960,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:geo-fence") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:geo-fence:manage") }) } ) @@ -1002,7 +1002,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:geo-fence") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:geo-fence:manage") }) }, nickname = "getGeofenceByFenceId" @@ -1053,7 +1053,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:geo-fence") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:geo-fence:manage") }) } ) @@ -1105,7 +1105,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:geo-fence") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:geo-fence:manage") }) } ) @@ -1151,7 +1151,7 @@ public interface GeoLocationBasedService { tags = "Geo Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:geo-fence") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:geo:geo-fence:manage") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GroupManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GroupManagementService.java index c39ae0b540..c302d15edf 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GroupManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GroupManagementService.java @@ -82,114 +82,107 @@ import java.util.List; @Scope( name = "Get the list of groups belongs to current user.", description = "Get the list of groups belongs to current user.", - key = "perm:groups:groups", + key = "gm:groups:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/view"} ), @Scope( name = "Get the count of groups belongs to current user.", description = "Get the count of groups belongs to current user.", - key = "perm:groups:count", + key = "gm:groups:count", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/groups/view"} + permissions = {"/device-mgt/groups/count"} ), @Scope( name = "Add new device group to the system.", description = "Add new device group to the system.", - key = "perm:groups:add", + key = "gm:groups:add", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/add"} ), @Scope( name = "View group specified", description = "View group specified", - key = "perm:groups:groups-view", + key = "gm:groups:groups-view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/groups/view"} + permissions = {"/device-mgt/groups/specified-groups/view"} ), @Scope( name = "Update a group", description = "Update a group", - key = "perm:groups:update", + key = "gm:groups:update", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/update"} ), @Scope( name = "Delete a group", description = "Delete a group", - key = "perm:groups:remove", + key = "gm:groups:remove", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/remove"} ), @Scope( name = "Manage group sharing with a user", description = "Manage group sharing with a user", - key = "perm:groups:share", + key = "gm:roles:share", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/share"} ), @Scope( name = "View list of roles of a device group", description = "View list of roles of a device group", - key = "perm:groups:roles", + key = "gm:roles:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/roles/view"} ), @Scope( name = "View list of devices in the device group", description = "View list of devices in the device group", - key = "perm:groups:devices", + key = "gm:devices:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/devices/view"} ), @Scope( name = "View list of device count in the device group", description = "View list of device count in the device group", - key = "perm:groups:devices-count", + key = "gm:devices:count", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/groups/devices/view"} + permissions = {"/device-mgt/groups/devices/count"} ), @Scope( name = "Add devices to group", description = "Add devices to group", - key = "perm:groups:devices-add", + key = "gm:devices:add", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/devices/add"} ), @Scope( name = "Remove devices from group", description = "Remove devices from group", - key = "perm:groups:devices-remove", + key = "gm:devices:remove", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/groups/devices/remove"} ), @Scope( name = "Assign devices to groups", description = "Assign devices to groups", - key = "perm:groups:assign", + key = "gm:devices:assign", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/groups/devices/add"} + permissions = {"/device-mgt/groups/devices/assign"} ), @Scope( name = "List of groups that have the device", description = "List of groups that have the device", - key = "perm:groups:device", + key = "gm:groups:device:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/groups/devices/view"} + permissions = {"/device-mgt/groups/device-groups/view"} ), @Scope( name = "View whether the groups has relevant device types", description = "View whether the groups has relevant device types", - key = "perm:groups:devices-types", + key = "gm:devices-types:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/groups/devices/types"} - ), - @Scope( - name = "View whether the groups has relevant device types", - description = "View whether the groups has relevant device types", - key = "perm:groups:add", - roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/groups/device-types"} + permissions = {"/device-mgt/groups/device-types/view"} ) } ) @@ -209,7 +202,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:groups") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:view") }) }, nickname = "getGroupsWithFilter" @@ -284,7 +277,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:groups") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:view") }) }, nickname = "getGroupsWithHierarchyNonAdmin" @@ -355,6 +348,52 @@ public interface GroupManagementService { @QueryParam("limit") int limit); + @Path("/hierarchy/count") + @GET + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = HTTPConstants.HEADER_GET, + value = "Getting the Number of Hirarchical Device Groups", + notes = "Get the number of hierarchical device groups in the server that the current signed in user can access.", + tags = "Device Group Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:count") + }) + }, + nickname = "getGroupCountNonAdmin" + + ) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK. \n Successfully fetched the hierarchical device group count.", + response = DeviceGroupList.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the client has already the latest version of " + + "the requested resource."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the group count.", + response = ErrorResponse.class) + }) + Response getHierarchicalGroupCount(); + @Path("/count") @GET @ApiOperation( @@ -365,7 +404,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:count") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:count") }) }, nickname = "getGroupCountNonAdmin" @@ -410,7 +449,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:add") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:add") }) }, nickname = "createGroupByGroupObject" @@ -479,7 +518,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:groups-view") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:groups-view") }) } ) @@ -552,7 +591,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:groups-view") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:groups-view") }) }, nickname = "getGroupByGroupNameFilter" @@ -619,7 +658,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:update") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:update") }) } ) @@ -677,7 +716,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:remove") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:remove") }) } ) @@ -734,7 +773,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:share") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:roles:share") }) } ) @@ -791,7 +830,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:roles") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:roles:view") }) } ) @@ -843,7 +882,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:devices") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:devices:view") }) } ) @@ -917,7 +956,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:devices-count") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:devices:count") }) } ) @@ -970,7 +1009,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:devices-add") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:devices:add") }) } ) @@ -1026,7 +1065,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:devices-remove") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:devices:remove") }) } ) @@ -1083,7 +1122,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:assign") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:devices:assign") }) } ) @@ -1138,7 +1177,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:device") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:device:view") }) }, nickname = "getGroupsNonAdmin" @@ -1200,7 +1239,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:devices-types") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:devices-types:view") }) }, nickname = "getGroupByGroupNameFilter" @@ -1255,7 +1294,7 @@ public interface GroupManagementService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:add") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:add") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/MetadataService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/MetadataService.java index 5f79032843..1fcdb4d0e8 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/MetadataService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/MetadataService.java @@ -54,28 +54,28 @@ import javax.ws.rs.core.Response; @Scope( name = "View metadata records", description = "View metadata records", - key = "perm:metadata:view", + key = "dm:metadata:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/metadata/view"} ), @Scope( name = "Create a metadata record", description = "Create a metadata record", - key = "perm:metadata:create", + key = "dm:metadata:create", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/metadata/create"} ), @Scope( name = "Update a metadata record", description = "Updating a specified metadata record", - key = "perm:metadata:update", + key = "dm:metadata:update", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/metadata/update"} ), @Scope( name = "Delete a metadata record", description = "Delete a specified metadata record", - key = "perm:metadata:remove", + key = "dm:metadata:remove", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/metadata/remove"} ) @@ -96,7 +96,7 @@ public interface MetadataService { tags = "Device Metadata Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:metadata:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:metadata:view") }) } ) @@ -152,7 +152,7 @@ public interface MetadataService { tags = "Device Metadata Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:metadata:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:metadata:view") }) } ) @@ -197,7 +197,7 @@ public interface MetadataService { tags = "Device Metadata Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:metadata:create") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:metadata:create") }) } ) @@ -248,7 +248,7 @@ public interface MetadataService { tags = "Device Metadata Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:metadata:update") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:metadata:update") }) } ) @@ -295,7 +295,7 @@ public interface MetadataService { tags = "Device Metadata Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:metadata:remove") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:metadata:remove") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/NotificationManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/NotificationManagementService.java index 5e804c3ce3..c86153ecc3 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/NotificationManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/NotificationManagementService.java @@ -54,16 +54,16 @@ import javax.ws.rs.core.Response; @Scope( name = "Getting All Device Notification Details", description = "Getting All Device Notification Details", - key = "perm:notifications:view", + key = "dm:notifications:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/notifications/view"} ), @Scope( name = "Updating the Device Notification Status", description = "Updating the Device Notification Status", - key = "perm:notifications:mark-checked", + key = "dm:notif:mark-checked", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/notifications/view"} + permissions = {"/device-mgt/notifications/update"} ) } ) @@ -82,7 +82,7 @@ public interface NotificationManagementService { tags = "Device Notification Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:notifications:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:notifications:view") }) } ) @@ -171,7 +171,7 @@ public interface NotificationManagementService { tags = "Device Notification Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:notifications:mark-checked") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:notif:mark-checked") }) } ) @@ -211,7 +211,7 @@ public interface NotificationManagementService { tags = "Device Notification Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:notifications:mark-checked") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:notif:mark-checked") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/PolicyManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/PolicyManagementService.java index deb3d4c8bb..9b550b9b65 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/PolicyManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/PolicyManagementService.java @@ -59,72 +59,72 @@ import java.util.List; @Scope( name = "Adding a Policy", description = "Adding a Policy", - key = "perm:policies:manage", + key = "pm:policies:add", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/manage"} + permissions = {"/device-mgt/policies/add"} ), @Scope( name = "Getting Details of Policies", description = "Getting Details of Policies", - key = "perm:policies:get-details", + key = "dm:policies:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/policies/view"} ), @Scope( name = "Getting Details of a Policy", description = "Getting Details of a Policy", - key = "perm:policies:get-policy-details", + key = "pm:policies:details:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/view"} + permissions = {"/device-mgt/policies/view-details"} ), @Scope( name = "Updating a Policy", description = "Updating a Policy", - key = "perm:policies:update", + key = "pm:policies:update", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/manage"} + permissions = {"/device-mgt/policies/update"} ), @Scope( name = "Removing Multiple Policies", description = "Removing Multiple Policies", - key = "perm:policies:remove", + key = "pm:policies:remove", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/manage"} + permissions = {"/device-mgt/policies/remove"} ), @Scope( name = "Activating Policies", description = "Activating Policies", - key = "perm:policies:activate", + key = "pm:policies:activate", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/manage"} + permissions = {"/device-mgt/policies/activate"} ), @Scope( name = "Deactivating Policies", description = "Deactivating Policies", - key = "perm:policies:deactivate", + key = "pm:policies:deactivate", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/manage"} + permissions = {"/device-mgt/policies/deactivate"} ), @Scope( name = "Applying Changes on Policies", description = "Applying Changes on Policies", - key = "perm:policies:changes", + key = "pm:policies:change", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/manage"} + permissions = {"/device-mgt/policies/apply-changes"} ), @Scope( name = "Updating the Policy Priorities", description = "Updating the Policy Priorities", - key = "perm:policies:priorities", + key = "pm:policies:priorities:update", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/manage"} + permissions = {"/device-mgt/policies/update-priority"} ), @Scope( name = "Fetching the Effective Policy", description = "Fetching the Effective Policy", - key = "perm:policies:effective-policy", + key = "pm:policies:effective-policy", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/policies/view"} + permissions = {"/device-mgt/policies/view-effective-policy"} ) } ) @@ -148,7 +148,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:manage") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:add") }) } ) @@ -219,7 +219,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:manage") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:add") }) } ) @@ -288,7 +288,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:get-details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:policies:view") }) } ) @@ -364,7 +364,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:get-policy-details") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:details:view") }) } ) @@ -433,7 +433,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:update") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:update") }) } ) @@ -502,7 +502,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:remove") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:remove") }) } ) @@ -550,7 +550,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:activate") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:activate") }) } ) @@ -592,7 +592,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:deactivate") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:deactivate") }) } ) @@ -638,7 +638,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:changes") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:change") }) } ) @@ -666,7 +666,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:priorities") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:priorities:update") }) } ) @@ -702,7 +702,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:effective-policy") + @ExtensionProperty(name = Constants.SCOPE, value = "pm:policies:effective-policy") }) } ) @@ -772,7 +772,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:get-details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:policies:view") }) }, nickname = "getPoliciesFilteredByType" @@ -856,7 +856,7 @@ public interface PolicyManagementService { tags = "Device Policy Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:policies:get-details") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:policies:view") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/RemoteSessionService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/RemoteSessionService.java index e9bd6f6d9f..4df5b8c7e6 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/RemoteSessionService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/RemoteSessionService.java @@ -50,7 +50,7 @@ import javax.ws.rs.core.Response; @Scope( name = "Remote Session Connection", description = "", - key = "perm:remote-session-service:connect", + key = "dm:remote:connect", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/remote-session"} ) @@ -75,7 +75,7 @@ public interface RemoteSessionService { tags = "Remote Session Service Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:remote-session-service:connect") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:remote:connect") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ReportManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ReportManagementService.java index 89353182ad..af7c103764 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ReportManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/ReportManagementService.java @@ -50,7 +50,7 @@ import java.util.List; @Scope( name = "Getting Details of Registered Devices", description = "Getting Details of Registered Devices", - key = "perm:devices:view", + key = "dm:devices:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/view"} ), @@ -73,7 +73,7 @@ public interface ReportManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -157,7 +157,7 @@ public interface ReportManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -229,7 +229,7 @@ public interface ReportManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -307,7 +307,7 @@ public interface ReportManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -366,7 +366,7 @@ public interface ReportManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -416,7 +416,7 @@ public interface ReportManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -491,7 +491,7 @@ public interface ReportManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) @@ -559,7 +559,7 @@ public interface ReportManagementService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:devices:view") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/RoleManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/RoleManagementService.java index 5031f1598d..eedede200a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/RoleManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/RoleManagementService.java @@ -51,58 +51,58 @@ import java.util.List; @Scope( name = "Getting the List of Roles", description = "Getting the List of Roles", - key = "perm:roles:view", + key = "rm:roles:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/roles/view"} ), @Scope( name = "Getting Permission Details of a Role", description = "Getting Permission Details of a Role", - key = "perm:roles:permissions", + key = "rm:roles:permissions:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/roles/view"} + permissions = {"/device-mgt/roles/view-permissions"} ), @Scope( name = "Getting the List of Roles", description = "Getting the List of Roles", - key = "perm:roles:details", + key = "rm:roles:details:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/roles/view"} + permissions = {"/device-mgt/roles/view-details"} ), @Scope( name = "Adding a Role", description = "Adding a Role", - key = "perm:roles:add", + key = "rm:roles:add", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/roles/manage"} + permissions = {"/device-mgt/roles/add"} ), @Scope( name = "Adding a combined Role", description = "Adding a combined Role", - key = "perm:roles:create-combined-role", + key = "rm:roles:combined:add", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/roles/manage"} + permissions = {"/device-mgt/roles/combined-role/add"} ), @Scope( name = "Updating Role Details", description = "Updating Role Details", - key = "perm:roles:update", + key = "rm:roles:update", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/roles/manage"} + permissions = {"/device-mgt/roles/update"} ), @Scope( name = "Deleting a Role", description = "Deleting a Role", - key = "perm:roles:delete", + key = "rm:roles:delete", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/roles/manage"} + permissions = {"/device-mgt/roles/delete"} ), @Scope( name = "Adding Users to a Role", description = "Adding Users to a Role", - key = "perm:roles:add-users", + key = "rm:users:add", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/roles/manage"} + permissions = {"/device-mgt/roles/assign-user"} ) } ) @@ -122,7 +122,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:view") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:view") }) } ) @@ -198,7 +198,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:view") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:view") }) } ) @@ -296,7 +296,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:view") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:view") }) } ) @@ -382,7 +382,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:permissions") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:permissions:view") }) } ) @@ -457,7 +457,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:details") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:details:view") }) } ) @@ -531,7 +531,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:add") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:add") }) } ) @@ -593,7 +593,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:create-combined-role") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:combined:add") }) } ) @@ -657,7 +657,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:update") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:update") }) } ) @@ -727,7 +727,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:delete") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:roles:delete") }) } ) @@ -779,7 +779,7 @@ public interface RoleManagementService { tags = "Role Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:roles:add-users") + @ExtensionProperty(name = Constants.SCOPE, value = "rm:users:add") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/UserManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/UserManagementService.java index e92d4a7081..b8a3c1e528 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/UserManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/UserManagementService.java @@ -51,91 +51,91 @@ import javax.ws.rs.core.Response; @Scope( name = "Adding a User", description = "Adding a User", - key = "perm:users:add", + key = "um:users:add", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/manage"} + permissions = {"/device-mgt/users/add"} ), @Scope( name = "Getting Details of a User", description = "Getting Details of a User", - key = "perm:users:details", + key = "um:users:details:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/view"} + permissions = {"/device-mgt/users/details/view"} ), @Scope( name = "Updating Details of a User", description = "Updating Details of a User", - key = "perm:users:update", + key = "um:users:update", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/manage"} + permissions = {"/device-mgt/users/update"} ), @Scope( name = "Deleting a User", description = "Deleting a User", - key = "perm:users:delete", + key = "um:users:delete", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/manage"} + permissions = {"/device-mgt/users/delete"} ), @Scope( name = "Getting the Role Details of a User", description = "Getting the Role Details of a User", - key = "perm:users:roles", + key = "um:roles:view", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/view"} + permissions = {"/device-mgt/users/roles/view"} ), @Scope( name = "Getting Details of Users", description = "Getting Details of Users", - key = "perm:users:user-details", + key = "um:users:user-details:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/users/view"} ), @Scope( name = "Getting the User Count", description = "Getting the User Count", - key = "perm:users:count", + key = "um:users:count", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/view"} + permissions = {"/device-mgt/users/count"} ), @Scope( name = "Getting the User existence status", description = "Getting the User existence status", - key = "perm:users:is-exist", + key = "um:users:is-exist", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/view"} + permissions = {"/device-mgt/users/existence/view"} ), @Scope( name = "Searching for a User Name", description = "Searching for a User Name", - key = "perm:users:search", + key = "um:users:search", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/view"} + permissions = {"/device-mgt/users/search"} ), @Scope( name = "Changing the User Password", description = "Adding a User", - key = "perm:users:credentials", + key = "um:users:cred:change", roles = {"Internal/devicemgt-user"}, - permissions = {"/login"} + permissions = {"/login/password/update"} ), @Scope( name = "Sending Enrollment Invitations to Users", description = "Sending Enrollment Invitations to Users", - key = "perm:users:send-invitation", + key = "um:users:invite", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/users/manage"} + permissions = {"/device-mgt/users/invite"} ), @Scope( name = "Get activities", description = "Get activities", - key = "perm:get-activity", + key = "dm:activity:get", roles = {"Internal/devicemgt-user"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/devices/owning-device/activities/view"} ), @Scope( name = "Getting the Permissions of the User", description = "Getting the Permissions of the User", - key = "perm:user:permission-view", + key = "um:users:permission:view", roles = {"Internal/devicemgt-user"}, permissions = {"/login"} ) @@ -158,7 +158,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:add") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:add") }) } ) @@ -217,7 +217,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:details") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:details:view") }) } ) @@ -288,7 +288,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:update") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:update") }) } ) @@ -355,7 +355,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:delete") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:delete") }) } ) @@ -400,7 +400,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:roles") + @ExtensionProperty(name = Constants.SCOPE, value = "um:roles:view") }) } ) @@ -465,7 +465,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:user-details") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:user-details:view") }) } ) @@ -543,7 +543,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:user-details") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:user-details:view") }) }, nickname = "getUsersByFilter" @@ -629,7 +629,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:count") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:count") }) } ) @@ -665,7 +665,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:is-exist") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:is-exist") }) } ) @@ -709,7 +709,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:search") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:search") }) } ) @@ -788,7 +788,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:credentials") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:cred:change") }) } ) @@ -835,7 +835,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:send-invitation") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:invite") }) } ) @@ -878,7 +878,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:send-invitation") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:invite") }) } ) @@ -926,7 +926,7 @@ public interface UserManagementService { tags = "Activity Info Provider", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:get-activity") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:activity:get") }) } ) @@ -1002,7 +1002,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:details") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:details:view") }) } ) @@ -1062,7 +1062,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:details") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:details:view") }) } ) @@ -1118,7 +1118,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:details") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:details:view") }) } ) @@ -1174,7 +1174,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:user:permission-view") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:permission:view") }) } ) @@ -1221,7 +1221,7 @@ public interface UserManagementService { tags = "User Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:users:user-details") + @ExtensionProperty(name = Constants.SCOPE, value = "um:users:user-details:view") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/WhiteLabelService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/WhiteLabelService.java index fdf2e62793..e6fd3e2c7a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/WhiteLabelService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/WhiteLabelService.java @@ -54,14 +54,14 @@ import javax.ws.rs.core.Response; @Scope( name = "View Whitelabel", description = "View whitelabel details", - key = "perm:whitelabel:view", + key = "dm:whitelable:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/whitelabel/view"} ), @Scope( name = "Update Whitelabel", description = "Updating whitelabel", - key = "perm:whitelabel:update", + key = "dm:whitelable:update", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/whitelabel/update"} ), @@ -197,7 +197,7 @@ public interface WhiteLabelService { tags = "Tenant Metadata Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:whitelabel:update") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:whitelable:update") }) } ) @@ -237,7 +237,7 @@ public interface WhiteLabelService { tags = "Tenant Metadata Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:whitelabel:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:whitelable:view") }) } ) @@ -278,7 +278,7 @@ public interface WhiteLabelService { tags = "Tenant Metadata Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:whitelabel:update") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:whitelable:update") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/ApplicationManagementAdminService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/ApplicationManagementAdminService.java index 28ec2cb92a..9e7fa5a247 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/ApplicationManagementAdminService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/ApplicationManagementAdminService.java @@ -56,16 +56,16 @@ import javax.ws.rs.core.Response; @Scope( name = "Installing an Application (Internal API)", description = "Installing an Application (Internal API)", - key = "perm:applications:install", + key = "am:admin:app:install", roles = {"Internal/devicemgt-admin"}, - permissions = {"/device-mgt/applications/manage"} + permissions = {"/device-mgt/admin/applications/install"} ), @Scope( name = "Uninstalling an Application (Internal API)", description = "Uninstalling an Application (Internal API)", - key = "perm:applications:uninstall", + key = "am:admin:app:uninstall", roles = {"Internal/devicemgt-admin"}, - permissions = {"/device-mgt/applications/manage"} + permissions = {"/device-mgt/admin/applications/uninstall"} ) } ) @@ -85,7 +85,7 @@ public interface ApplicationManagementAdminService { tags = "Application Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:applications:install") + @ExtensionProperty(name = Constants.SCOPE, value = "am:admin:app:install") }) } ) @@ -129,7 +129,7 @@ public interface ApplicationManagementAdminService { tags = "Application Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:applications:uninstall") + @ExtensionProperty(name = Constants.SCOPE, value = "am:admin:app:uninstall") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceAccessAuthorizationAdminService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceAccessAuthorizationAdminService.java index aabaf7f793..a29604db1b 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceAccessAuthorizationAdminService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceAccessAuthorizationAdminService.java @@ -57,7 +57,7 @@ import javax.ws.rs.core.Response; @Scope( name = "Verify device authorization", description = "Verify device authorization", - key = "perm:authorization:verify", + key = "dm:authorization:verify", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/authorization/verify"} ) @@ -81,7 +81,7 @@ public interface DeviceAccessAuthorizationAdminService { tags = "Authorization Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:authorization:verify") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:authorization:verify") }) }) @@ -120,7 +120,7 @@ public interface DeviceAccessAuthorizationAdminService { tags = "Authorization Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:authorization:verify") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:authorization:verify") }) }) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceManagementAdminService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceManagementAdminService.java index 20188e87c2..13a63087a7 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceManagementAdminService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceManagementAdminService.java @@ -59,28 +59,28 @@ import java.util.List; @Scope( name = "Getting Details of a Device", description = "Getting Details of a Device", - key = "perm:admin:devices:view", + key = "dm:admin:devices:view", roles = {"Internal/devicemgt-admin"}, - permissions = {"/device-mgt/devices/owning-device/view"} + permissions = {"/device-mgt/admin/devices/view"} ), @Scope( name = "Update the Device Owner", description = "Update the ownership of the device", - key = "perm:admin:devices:update-enrollment", + key = "dm:admin:enrollment:update", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/devices/update-enrollment"} ), @Scope( name = "Permanently Delete the device specified by device id", description = "Permanently Delete the device specified by device id", - key = "perm:devices:permanent-delete", + key = "dm:admin:devices:permanent-delete", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/devices/permanent-delete"} ), @Scope( name = "Get Usage of Devices", description = "Get Usage of Devices", - key = "perm:admin:usage:view", + key = "dm:admin:devices:usage:view", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/devices/usage/view"} ), @@ -99,7 +99,7 @@ public interface DeviceManagementAdminService { tags = "Device Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:devices:view") }) } ) @@ -193,7 +193,7 @@ public interface DeviceManagementAdminService { tags = "Device Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:devices:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:devices:view") }) } ) @@ -246,7 +246,7 @@ public interface DeviceManagementAdminService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:devices:update-enrollment") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:enrollment:update") }) } ) @@ -297,7 +297,7 @@ public interface DeviceManagementAdminService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:permanent-delete") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:devices:permanent-delete") }) } ) @@ -348,7 +348,7 @@ public interface DeviceManagementAdminService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:android:enroll") + @ExtensionProperty(name = Constants.SCOPE, value = "and:devices:enroll") }) } ) @@ -407,7 +407,7 @@ public interface DeviceManagementAdminService { tags = "Device Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:usage:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:devices:usage:view") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceTypeManagementAdminService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceTypeManagementAdminService.java index 4cac83ae6b..f0e67a5755 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceTypeManagementAdminService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/DeviceTypeManagementAdminService.java @@ -56,21 +56,21 @@ import javax.ws.rs.core.Response; @Scope( name = "Manage a Device Type", description = "Add, Edit or View a Device Type", - key = "perm:admin:device-type", + key = "dm:admin:device-type:modify", roles = {"Internal/devicemgt-admin"}, - permissions = {"/device-mgt/admin/device-type"} + permissions = {"/device-mgt/admin/device-type/modify"} ), @Scope( name = "Getting Details of a Device Type", description = "Getting Details of a Device Type", - key = "perm:admin:device-type:view", + key = "dm:admin:device-type:view", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/device-type/view"} ), @Scope( name = "Add Device Type Config", description = "Add Platform Config of a Device Type", - key = "perm:admin:device-type:configs", + key = "dm:admin:device-type:conf:add", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/device-type/config"} ) @@ -88,7 +88,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:view") }) } ) @@ -142,7 +142,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type:view") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:view") }) } ) @@ -195,7 +195,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:modify") }) } ) @@ -248,7 +248,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:modify") }) } ) @@ -304,7 +304,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type:configs") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:conf:add") }) } ) @@ -362,7 +362,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:modify") }) } ) @@ -416,7 +416,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:modify") }) } ) @@ -468,7 +468,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:modify") }) } ) @@ -522,7 +522,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:modify") }) } ) @@ -575,7 +575,7 @@ public interface DeviceTypeManagementAdminService { tags = "Device Type Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin:device-type") + @ExtensionProperty(name = Constants.SCOPE, value = "dm:admin:device-type:modify") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/GroupManagementAdminService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/GroupManagementAdminService.java index 4c27cb6908..6d69127405 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/GroupManagementAdminService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/GroupManagementAdminService.java @@ -75,21 +75,21 @@ import javax.ws.rs.core.Response; @Scope( name = "View groups", description = "", - key = "perm:admin-groups:view", + key = "gm:admin:groups:view", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/groups/view"} ), @Scope( name = "Count groups", description = "", - key = "perm:admin-groups:count", + key = "gm:admin:groups:count", roles = {"Internal/devicemgt-admin"}, - permissions = {"/device-mgt/admin/groups/view"} + permissions = {"/device-mgt/admin/groups/count"} ), @Scope( name = "Add groups", description = "", - key = "perm:admin-groups:add", + key = "gm:admin:groups:add", roles = {"Internal/devicemgt-admin"}, permissions = {"/device-mgt/admin/groups/add"} ) @@ -106,7 +106,7 @@ public interface GroupManagementAdminService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin-groups:view") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:admin:groups:view") }) } ) @@ -182,7 +182,7 @@ public interface GroupManagementAdminService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin-groups:view") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:admin:groups:view") }) } ) @@ -256,6 +256,58 @@ public interface GroupManagementAdminService { @QueryParam("limit") int limit); + @Path("/hierarchy/count") + @GET + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = HTTPConstants.HEADER_GET, + value = "Get the count of all hierarchical groups belongs to current admin user.", + notes = "Returns count of all permitted hierarchical groups enrolled with the system.", + tags = "Device Group Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "gm:admin:groups:count") + }) + } + ) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK. \n Successfully fetched the hierarchical device group count.", + response = Integer.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the client has already the latest version of " + + "the requested resource."), + @ApiResponse( + code = 404, + message = "No groups found.", + response = ErrorResponse.class), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the group count.", + response = ErrorResponse.class) + }) + Response getHierarchicalGroupCount(@ApiParam( + name = "status", + value = "status of hierarchical groups of which count should be retrieved") + @QueryParam("status") + String status); + @Path("/count") @GET @ApiOperation( @@ -266,7 +318,7 @@ public interface GroupManagementAdminService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin-groups:count") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:admin:groups:count") }) } ) @@ -317,7 +369,7 @@ public interface GroupManagementAdminService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin-groups:add") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:admin:groups:add") }) } ) @@ -387,7 +439,7 @@ public interface GroupManagementAdminService { tags = "Device Group Management", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:add") + @ExtensionProperty(name = Constants.SCOPE, value = "gm:groups:add") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/UserManagementAdminService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/UserManagementAdminService.java index a6f2deeec7..1feefa0756 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/UserManagementAdminService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/admin/UserManagementAdminService.java @@ -51,16 +51,16 @@ import javax.ws.rs.core.Response; @Scope( name = "View Users", description = "View Users", - key = "perm:admin-users:view", + key = "um:admin:users:view", roles = {"Internal/devicemgt-admin"}, - permissions = {"/device-mgt/users/manage"} + permissions = {"/device-mgt/admin/users/view"} ), @Scope( name = "Delete Users Device Information", description = "Delete users device details", - key = "perm:admin-users:remove", + key = "um:admin:users:remove", roles = {"Internal/devicemgt-admin"}, - permissions = {"/device-mgt/users/manage"} + permissions = {"/device-mgt/admin/users/delete"} ) } ) @@ -84,7 +84,7 @@ public interface UserManagementAdminService { tags = "User Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin-users:view") + @ExtensionProperty(name = Constants.SCOPE, value = "um:admin:users:view") }) } ) @@ -143,7 +143,7 @@ public interface UserManagementAdminService { tags = "Device details remove", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin-users:remove") + @ExtensionProperty(name = Constants.SCOPE, value = "um:admin:users:remove") }) } ) @@ -201,7 +201,7 @@ public interface UserManagementAdminService { tags = "Device details remove privacy compliance", extensions = { @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:admin-users:remove") + @ExtensionProperty(name = Constants.SCOPE, value = "um:admin:users:remove") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/ActivityProviderServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/ActivityProviderServiceImpl.java index f9e1a64432..6082eb0f1c 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/ActivityProviderServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/ActivityProviderServiceImpl.java @@ -18,20 +18,23 @@ package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl; import com.google.gson.Gson; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ActivityList; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ErrorResponse; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.common.ActivityIdList; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.ActivityInfoProviderService; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestValidationUtil; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; +import io.entgra.device.mgt.core.application.mgt.common.exception.SubscriptionManagementException; +import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.device.mgt.common.ActivityPaginationRequest; import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Operation; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationManagementException; import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ActivityList; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.DeviceActivityList; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ErrorResponse; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.common.ActivityIdList; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.ActivityInfoProviderService; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestValidationUtil; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; import org.wso2.carbon.user.api.UserStoreException; import javax.validation.constraints.Size; @@ -139,8 +142,11 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService @Size(max = 45) String devicetype, @PathParam("deviceid") @Size(max = 45) String deviceid, - @HeaderParam("If-Modified-Since") String ifModifiedSince) { - Activity activity; + @HeaderParam("If-Modified-Since") String ifModifiedSince, + @QueryParam("response") Boolean response, + @QueryParam("appInstall") Boolean appInstall) { + Activity activity = new Activity(); + Activity appActivity = null; DeviceManagementProviderService dmService; try { RequestValidationUtil.validateActivityId(id); @@ -150,7 +156,29 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService deviceIdentifier.setType(devicetype); dmService = DeviceMgtAPIUtils.getDeviceManagementService(); - activity = dmService.getOperationByActivityIdAndDevice(id, deviceIdentifier); + + if (appInstall != null && appInstall) { + if (response != null && response) { + activity = dmService.getOperationByActivityIdAndDevice(id, deviceIdentifier); + } + SubscriptionManager subscriptionManager = DeviceMgtAPIUtils.getSubscriptionManager(); + appActivity = subscriptionManager.getOperationAppDetails(id); + if (appActivity != null) { + activity.setUsername(appActivity.getUsername()); + activity.setPackageName(appActivity.getPackageName()); + activity.setAppName(appActivity.getAppName()); + activity.setStatus(appActivity.getStatus()); + activity.setAppType(appActivity.getAppType()); + activity.setVersion(appActivity.getVersion()); + activity.setTriggeredBy(appActivity.getTriggeredBy()); + } else { + String msg = "Cannot find the app details related to the operation "; + log.error(msg); + Response.status(404).entity(msg).build(); + } + } else { + activity = dmService.getOperationByActivityIdAndDevice(id, deviceIdentifier); + } if (activity == null) { String msg = "No activity can be " + "found upon the provided activity id '" + id + "'"; @@ -162,6 +190,11 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService log.error(msg, e); return Response.serverError().entity( new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); + } catch (SubscriptionManagementException e) { + String msg = "ErrorResponse occurred while fetching the app details for the supplied id."; + log.error(msg, e); + return Response.serverError().entity( + new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); } } @@ -207,6 +240,130 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService } } + @GET + @Path("/devices") + @Override + public Response getDeviceActivities(@DefaultValue("0") @QueryParam("offset") int offset, + @DefaultValue("20") @QueryParam("limit") int limit, + @QueryParam("since") String since, + @QueryParam("initiatedBy") String initiatedBy, + @QueryParam("operationCode") String operationCode, + @QueryParam("operationId") int operationId, + @QueryParam("deviceType") String deviceType, + @QueryParam("deviceId") List deviceIds, + @QueryParam("type") String type, + @QueryParam("status") String status, + @HeaderParam("If-Modified-Since") String ifModifiedSince, + @QueryParam("startTimestamp") long startTimestamp, + @QueryParam("endTimestamp") long endTimestamp) { + + long ifModifiedSinceTimestamp; + long sinceTimestamp; + long timestamp = 0; + boolean isTimeDurationProvided = false; + if (log.isDebugEnabled()) { + log.debug("getDeviceActivities since: " + since + " , offset: " + offset + " ,limit: " + limit + " ," + + "ifModifiedSince: " + ifModifiedSince); + } + RequestValidationUtil.validatePaginationParameters(offset, limit); + if (ifModifiedSince != null && !ifModifiedSince.isEmpty()) { + Date ifSinceDate; + SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); + try { + ifSinceDate = format.parse(ifModifiedSince); + } catch (ParseException e) { + return Response.status(400).entity( + new ErrorResponse.ErrorResponseBuilder().setMessage( + "Invalid date string is provided in 'If-Modified-Since' header").build()).build(); + } + ifModifiedSinceTimestamp = ifSinceDate.getTime(); + timestamp = ifModifiedSinceTimestamp / 1000; + } else if (since != null && !since.isEmpty()) { + Date sinceDate; + SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); + try { + sinceDate = format.parse(since); + } catch (ParseException e) { + return Response.status(400).entity( + new ErrorResponse.ErrorResponseBuilder().setMessage( + "Invalid date string is provided in 'since' filter").build()).build(); + } + sinceTimestamp = sinceDate.getTime(); + timestamp = sinceTimestamp / 1000; + } else if (startTimestamp > 0 && endTimestamp > 0) { + RequestValidationUtil.validateTimeDuration(startTimestamp, endTimestamp); + isTimeDurationProvided = true; + } + + if (timestamp == 0 && !isTimeDurationProvided) { + //If timestamp is not sent by the user, a default value is set, that is equal to current time-12 hours. + long time = System.currentTimeMillis() / 1000; + timestamp = time - 42300; + } + if (log.isDebugEnabled()) { + log.debug("getDeviceActivities final timestamp " + timestamp); + } + DeviceActivityList deviceActivityList = new DeviceActivityList(); + DeviceManagementProviderService dmService; + ActivityPaginationRequest activityPaginationRequest = new ActivityPaginationRequest(offset, limit); + try { + if (log.isDebugEnabled()) { + log.debug("Calling database to get device activities."); + } + dmService = DeviceMgtAPIUtils.getDeviceManagementService(); + if (initiatedBy != null && !initiatedBy.isEmpty()) { + activityPaginationRequest.setInitiatedBy(initiatedBy); + } + if (operationCode != null && !operationCode.isEmpty()) { + activityPaginationRequest.setOperationCode(operationCode); + } + if (operationId > 0) { + activityPaginationRequest.setOperationId(operationId); + } + if (deviceType != null && !deviceType.isEmpty()) { + activityPaginationRequest.setDeviceType(deviceType); + } + if (deviceIds != null && !deviceIds.isEmpty()) { + activityPaginationRequest.setDeviceIds(deviceIds); + } + if (type != null && !type.isEmpty()) { + activityPaginationRequest.setType(Operation.Type.valueOf(type.toUpperCase())); + } + if (status != null && !status.isEmpty()) { + activityPaginationRequest.setStatus(Operation.Status.valueOf(status.toUpperCase())); + } + if (timestamp > 0) { + activityPaginationRequest.setSince(timestamp); + } else { + activityPaginationRequest.setStartTimestamp(startTimestamp); + activityPaginationRequest.setEndTimestamp(endTimestamp); + } + if (log.isDebugEnabled()) { + log.debug("Device Activity request: " + new Gson().toJson(activityPaginationRequest)); + } + int count = dmService.getDeviceActivitiesCount(activityPaginationRequest); + if (log.isDebugEnabled()) { + log.debug("Filtered Device Activity count: " + count); + } + if (count > 0) { + deviceActivityList.setList(dmService.getDeviceActivities(activityPaginationRequest)); + if (log.isDebugEnabled()) { + log.debug("Fetched Device Activity count: " + deviceActivityList.getList().size()); + } + } else if (ifModifiedSince != null && !ifModifiedSince.isEmpty()) { + return Response.notModified().build(); + } + deviceActivityList.setCount(count); + return Response.ok().entity(deviceActivityList).build(); + } catch (OperationManagementException e) { + String msg + = "ErrorResponse occurred while fetching the device activities updated after given time stamp."; + log.error(msg, e); + return Response.serverError().entity( + new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); + } + } + @GET @Override public Response getActivities(@DefaultValue("0") @QueryParam("offset") int offset, @@ -214,6 +371,7 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService @QueryParam("since") String since, @QueryParam("initiatedBy") String initiatedBy, @QueryParam("operationCode") String operationCode, + @QueryParam("operationId") int operationId, @QueryParam("deviceType") String deviceType, @QueryParam("deviceId") List deviceIds, @QueryParam("type") String type, @@ -266,66 +424,64 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService if (log.isDebugEnabled()) { log.debug("getActivities final timestamp " + timestamp); } - Response response = validateAdminPermission(); - if (response == null) { - ActivityList activityList = new ActivityList(); - DeviceManagementProviderService dmService; - ActivityPaginationRequest activityPaginationRequest = new ActivityPaginationRequest(offset, limit); - try { - if (log.isDebugEnabled()) { - log.debug("Calling database to get activities."); - } - dmService = DeviceMgtAPIUtils.getDeviceManagementService(); - if (initiatedBy != null && !initiatedBy.isEmpty()) { - activityPaginationRequest.setInitiatedBy(initiatedBy); - } - if (operationCode != null && !operationCode.isEmpty()) { - activityPaginationRequest.setOperationCode(operationCode); - } - if (deviceType != null && !deviceType.isEmpty()) { - activityPaginationRequest.setDeviceType(deviceType); - } - if (deviceIds != null && !deviceIds.isEmpty()) { - activityPaginationRequest.setDeviceIds(deviceIds); - } - if (type != null && !type.isEmpty()) { - activityPaginationRequest.setType(Operation.Type.valueOf(type.toUpperCase())); - } - if (status != null && !status.isEmpty()) { - activityPaginationRequest.setStatus(Operation.Status.valueOf(status.toUpperCase())); - } - if (timestamp > 0) { - activityPaginationRequest.setSince(timestamp); - } else { - activityPaginationRequest.setStartTimestamp(startTimestamp); - activityPaginationRequest.setEndTimestamp(endTimestamp); - } - if (log.isDebugEnabled()) { - log.debug("Activity request: " + new Gson().toJson(activityPaginationRequest)); - } - int count = dmService.getActivitiesCount(activityPaginationRequest); - if (log.isDebugEnabled()) { - log.debug("Filtered Activity count: " + count); - } - if (count > 0) { - activityList.setList(dmService.getActivities(activityPaginationRequest)); - if (log.isDebugEnabled()) { - log.debug("Fetched Activity count: " + activityList.getList().size()); - } - } else if (ifModifiedSince != null && !ifModifiedSince.isEmpty()) { - return Response.notModified().build(); - } - activityList.setCount(count); - return Response.ok().entity(activityList).build(); - } catch (OperationManagementException e) { - String msg - = "ErrorResponse occurred while fetching the activities updated after given time stamp."; - log.error(msg, e); - return Response.serverError().entity( - new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); + ActivityList activityList = new ActivityList(); + DeviceManagementProviderService dmService; + ActivityPaginationRequest activityPaginationRequest = new ActivityPaginationRequest(offset, limit); + try { + if (log.isDebugEnabled()) { + log.debug("Calling database to get activities."); } - } else { - return response; + dmService = DeviceMgtAPIUtils.getDeviceManagementService(); + if (initiatedBy != null && !initiatedBy.isEmpty()) { + activityPaginationRequest.setInitiatedBy(initiatedBy); + } + if (operationCode != null && !operationCode.isEmpty()) { + activityPaginationRequest.setOperationCode(operationCode); + } + if (operationId > 0) { + activityPaginationRequest.setOperationId(operationId); + } + if (deviceType != null && !deviceType.isEmpty()) { + activityPaginationRequest.setDeviceType(deviceType); + } + if (deviceIds != null && !deviceIds.isEmpty()) { + activityPaginationRequest.setDeviceIds(deviceIds); + } + if (type != null && !type.isEmpty()) { + activityPaginationRequest.setType(Operation.Type.valueOf(type.toUpperCase())); + } + if (status != null && !status.isEmpty()) { + activityPaginationRequest.setStatus(Operation.Status.valueOf(status.toUpperCase())); + } + if (timestamp > 0) { + activityPaginationRequest.setSince(timestamp); + } else { + activityPaginationRequest.setStartTimestamp(startTimestamp); + activityPaginationRequest.setEndTimestamp(endTimestamp); + } + if (log.isDebugEnabled()) { + log.debug("Activity request: " + new Gson().toJson(activityPaginationRequest)); + } + int count = dmService.getActivitiesCount(activityPaginationRequest); + if (log.isDebugEnabled()) { + log.debug("Filtered Activity count: " + count); + } + if (count > 0) { + activityList.setList(dmService.getActivities(activityPaginationRequest)); + if (log.isDebugEnabled()) { + log.debug("Fetched Activity count: " + activityList.getList().size()); + } + } else if (ifModifiedSince != null && !ifModifiedSince.isEmpty()) { + return Response.notModified().build(); + } + activityList.setCount(count); + return Response.ok().entity(activityList).build(); + } catch (OperationManagementException e) { + String msg + = "ErrorResponse occurred while fetching the activities updated after given time stamp."; + log.error(msg, e); + return Response.serverError().entity( + new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImpl.java index 3ba6e390f5..70a773516b 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImpl.java @@ -18,6 +18,7 @@ package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import io.entgra.device.mgt.core.apimgt.application.extension.APIManagementProviderService; import io.entgra.device.mgt.core.apimgt.application.extension.APIManagementProviderServiceImpl; @@ -40,12 +41,10 @@ import io.entgra.device.mgt.core.application.mgt.common.exception.SubscriptionMa import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationManager; import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager; import io.entgra.device.mgt.core.application.mgt.core.util.HelperUtil; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.*; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.DeviceManagementService; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.InputValidationException; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestValidationUtil; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.device.mgt.common.*; import io.entgra.device.mgt.core.device.mgt.common.app.mgt.Application; import io.entgra.device.mgt.core.device.mgt.common.app.mgt.ApplicationManagementException; @@ -83,16 +82,18 @@ import io.entgra.device.mgt.core.device.mgt.core.search.mgt.SearchMgtException; import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; import io.entgra.device.mgt.core.device.mgt.core.service.GroupManagementProviderService; import io.entgra.device.mgt.core.device.mgt.core.util.DeviceManagerUtil; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.*; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.DeviceManagementService; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.InputValidationException; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestValidationUtil; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; import io.entgra.device.mgt.core.identity.jwt.client.extension.JWTClient; import io.entgra.device.mgt.core.identity.jwt.client.extension.dto.AccessTokenInfo; import io.entgra.device.mgt.core.identity.jwt.client.extension.exception.JWTClientException; import io.entgra.device.mgt.core.identity.jwt.client.extension.service.JWTClientManagerService; import io.entgra.device.mgt.core.policy.mgt.common.PolicyManagementException; import io.entgra.device.mgt.core.policy.mgt.core.PolicyManagerService; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.user.api.UserStoreException; @@ -102,12 +103,15 @@ import javax.validation.Valid; import javax.validation.constraints.Size; import javax.ws.rs.*; import javax.ws.rs.core.Response; +import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; +import java.util.concurrent.ExecutionException; +import java.util.Map; @Path("/devices") public class DeviceManagementServiceImpl implements DeviceManagementService { @@ -145,6 +149,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { @QueryParam("role") String role, @QueryParam("ownership") String ownership, @QueryParam("serialNumber") String serialNumber, + @QueryParam("customProperty") String customProperty, @QueryParam("status") List status, @QueryParam("groupId") int groupId, @QueryParam("since") String since, @@ -158,6 +163,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); } // RequestValidationUtil.validateSelectionCriteria(type, user, roleName, ownership, status); + final ObjectMapper objectMapper = new ObjectMapper(); RequestValidationUtil.validatePaginationParameters(offset, limit); DeviceManagementProviderService dms = DeviceMgtAPIUtils.getDeviceManagementService(); DeviceAccessAuthorizationService deviceAccessAuthorizationService = @@ -169,6 +175,22 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { if (name != null && !name.isEmpty()) { request.setDeviceName(name); } + if (customProperty != null && !customProperty.isEmpty()) { + try { + Map customProperties = objectMapper.readValue(customProperty, Map.class); + // Extract and set custom properties + for (Map.Entry entry : customProperties.entrySet()) { + String propertyName = entry.getKey(); + String propertyValue = entry.getValue(); + // Add custom property to the paginationRequest object + request.addCustomProperty(propertyName, propertyValue); + } + } catch (IOException e) { + String msg = "Error occurred while converting custom property string to a Java Map"; + log.error(msg); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } + } if (type != null && !type.isEmpty()) { request.setDeviceType(type); } @@ -1024,7 +1046,11 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { public Response uninstallation( @PathParam("type") @Size(max = 45) String type, @PathParam("id") @Size(max = 45) String id, - @QueryParam("packageName") String packageName) { + @QueryParam("packageName") String packageName, + @QueryParam("platform") String platform, + @QueryParam("name") String name, + @QueryParam("version") String version, + @QueryParam("user") String user) { List deviceIdentifiers = new ArrayList<>(); Operation operation = new Operation(); try { @@ -1047,7 +1073,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { //if the applications not installed via entgra store } else { if (Constants.ANDROID.equals(type)) { - ApplicationUninstallation applicationUninstallation = new ApplicationUninstallation(packageName, "PUBLIC"); + ApplicationUninstallation applicationUninstallation = new ApplicationUninstallation(packageName, "PUBLIC", name, platform, version, user); Gson gson = new Gson(); operation.setCode(MDMAppConstants.AndroidConstants.UNMANAGED_APP_UNINSTALL); operation.setType(Operation.Type.PROFILE); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GeoLocationBasedServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GeoLocationBasedServiceImpl.java index 1d410d43d5..21fdb282df 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GeoLocationBasedServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GeoLocationBasedServiceImpl.java @@ -836,6 +836,14 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { PaginationResult paginationResult = new PaginationResult(); paginationResult.setData(geofenceList); paginationResult.setRecordsTotal(geofenceList.size()); + try { + GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); + paginationResult.setTotalDeviceCount(geoService.getGeoFenceCount()); + } catch (GeoLocationBasedServiceException e) { + String msg = "Failed to retrieve geofence data"; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } return Response.status(Response.Status.OK).entity(paginationResult).build(); } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImpl.java index 347ebe88f9..7912c72441 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImpl.java @@ -133,6 +133,19 @@ public class GroupManagementServiceImpl implements GroupManagementService { } } + @Override + public Response getHierarchicalGroupCount() { + try { + String currentUser = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + int count = DeviceMgtAPIUtils.getGroupManagementProviderService().getHierarchicalGroupCount(currentUser, null); + return Response.status(Response.Status.OK).entity(count).build(); + } catch (GroupManagementException e) { + String msg = "Error occurred while retrieving hierarchical group count."; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } + } + @Override public Response getGroupCount() { try { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/RoleManagementServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/RoleManagementServiceImpl.java index 28610ce73a..a80665d294 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/RoleManagementServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/RoleManagementServiceImpl.java @@ -17,10 +17,20 @@ */ package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl; +import io.entgra.device.mgt.core.apimgt.webapp.publisher.exception.APIManagerPublisherException; import com.google.common.base.Strings; import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException; import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException; import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata; +import org.apache.commons.logging.Log; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.CarbonConstants; +import org.wso2.carbon.base.MultitenantConstants; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.context.PrivilegedCarbonContext; import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ErrorResponse; import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.RoleInfo; import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.RoleList; @@ -30,15 +40,8 @@ import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestV import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants; import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.SetReferenceTransformer; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; +import org.wso2.carbon.user.api.*; import org.springframework.util.StringUtils; -import org.wso2.carbon.CarbonConstants; -import org.wso2.carbon.base.MultitenantConstants; -import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.RegistryType; import org.wso2.carbon.registry.api.Registry; import org.wso2.carbon.registry.core.session.UserRegistry; @@ -74,8 +77,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Optional; import java.util.Set; +import java.util.Optional; import static io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants.PRIMARY_USER_STORE; @@ -297,15 +300,49 @@ public class RoleManagementServiceImpl implements RoleManagementService { } } - private UIPermissionNode getAllRolePermissions(String roleName, UserRealm userRealm) throws UserAdminException { - org.wso2.carbon.user.core.UserRealm userRealmCore = null; - if (userRealm instanceof org.wso2.carbon.user.core.UserRealm) { - userRealmCore = (org.wso2.carbon.user.core.UserRealm) userRealm; + /** + * Retrieve filtered permissions by analyzing all the permission paths. + * + * @param rolePermissions All the permission paths + * @param permissionPaths Permission paths that needs to filter + * @param permissions List of filtered permissions + * @return {@link List} + */ + private List processAndFilterPermissions(UIPermissionNode[] rolePermissions, List permissionPaths, List permissions) { + + for (UIPermissionNode rolePermission : rolePermissions) { + if (permissionPaths.isEmpty()) { + return permissions; + } + + if (rolePermission.getNodeList().length == 0) { + if (permissionPaths.contains(rolePermission.getResourcePath())) { + permissions.add(rolePermission.getResourcePath()); + } + } + permissionPaths.remove(rolePermission.getResourcePath()); + if (rolePermission.getNodeList().length != 0) { + processAndFilterPermissions(rolePermission.getNodeList(), permissionPaths, permissions); + } } - final UserRealmProxy userRealmProxy = new UserRealmProxy(userRealmCore); - final UIPermissionNode rolePermissions = - userRealmProxy.getRolePermissions(roleName, MultitenantConstants.SUPER_TENANT_ID); - return rolePermissions; + return permissions; + } + + /** + * Getting platform permissions + * + * @param roleName Role Name + * @param userRealm {@link UserRealm} + * @param permissions list of permissions + * @return {@link List} + * @throws UserAdminException if error occurred when getting {@link UIPermissionNode} + */ + private String[] getPlatformUIPermissions(String roleName, UserRealm userRealm, String[] permissions) + throws UserAdminException { + UIPermissionNode uiPermissionNode = getUIPermissionNode(roleName, userRealm); + List permissionsArray = processAndFilterPermissions(uiPermissionNode.getNodeList(), new ArrayList<>(Arrays.asList(permissions)), + new ArrayList<>()); + return permissionsArray.toArray(new String[0]); } private UIPermissionNode getUIPermissionNode(String roleName, UserRealm userRealm) @@ -324,7 +361,8 @@ public class RoleManagementServiceImpl implements RoleManagementService { for (UIPermissionNode node : permissionNode.getNodeList()) { if (Constants.Permission.LOGIN.equals(node.getResourcePath()) || Constants.Permission.DEVICE_MGT.equals(node.getResourcePath()) || - Constants.Permission.APP_MGT.equals(node.getResourcePath())) { + Constants.Permission.APP_MGT.equals(node.getResourcePath()) || + Constants.Permission.TENANT.equals(node.getResourcePath())) { deviceMgtPermissionsList.add(node); } } @@ -381,18 +419,6 @@ public class RoleManagementServiceImpl implements RoleManagementService { } } - private List getAuthorizedPermissions(UIPermissionNode uiPermissionNode, List list) { - for (UIPermissionNode permissionNode : uiPermissionNode.getNodeList()) { - if (permissionNode.isSelected()) { - list.add(permissionNode.getResourcePath()); - } - if (permissionNode.getNodeList() != null && permissionNode.getNodeList().length > 0) { - getAuthorizedPermissions(permissionNode, list); - } - } - return list; - } - @POST @Override public Response addRole(RoleInfo roleInfo) { @@ -403,6 +429,7 @@ public class RoleManagementServiceImpl implements RoleManagementService { if (log.isDebugEnabled()) { log.debug("Persisting the role in the underlying user store"); } + Permission[] permissions = null; if (roleInfo.getPermissions() != null && roleInfo.getPermissions().length > 0) { permissions = new Permission[roleInfo.getPermissions().length]; @@ -412,7 +439,17 @@ public class RoleManagementServiceImpl implements RoleManagementService { } } userStoreManager.addRole(roleInfo.getRoleName(), roleInfo.getUsers(), permissions); - authorizeRoleForAppmgt(roleInfo.getRoleName(), roleInfo.getPermissions()); + try { + if (roleInfo.getPermissions() != null && roleInfo.getPermissions().length > 0) { + String[] roleName = roleInfo.getRoleName().split("/"); + roleInfo.setRemovedPermissions(new String[0]); + updatePermissions(roleName[roleName.length - 1], roleInfo, DeviceMgtAPIUtils.getUserRealm()); + } + } catch (UserStoreException e) { + String msg = "Error occurred while loading the user store."; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } //TODO fix what's returned in the entity return Response.created(new URI(API_BASE_PATH + "/" + URLEncoder.encode(roleInfo.getRoleName(), "UTF-8"))). @@ -522,11 +559,10 @@ public class RoleManagementServiceImpl implements RoleManagementService { final UserRealm userRealm = DeviceMgtAPIUtils.getUserRealm(); final UserStoreManager userStoreManager = userRealm.getUserStoreManager(); if (!userStoreManager.isExistingRole(roleName)) { - String msg = "No role exists with the name : " + roleName ; + String msg = "No role exists with the name : " + roleName; return Response.status(404).entity(msg).build(); } - final AuthorizationManager authorizationManager = userRealm.getAuthorizationManager(); if (log.isDebugEnabled()) { log.debug("Updating the role to user store"); } @@ -548,31 +584,8 @@ public class RoleManagementServiceImpl implements RoleManagementService { } if (roleInfo.getPermissions() != null) { - // Get all role permissions - final UIPermissionNode rolePermissions = this.getAllRolePermissions(roleName, userRealm); - List permissions = new ArrayList(); - final UIPermissionNode emmRolePermissions = (UIPermissionNode) this.getRolePermissions(roleName); - List emmConsolePermissions = new ArrayList(); - this.getAuthorizedPermissions(emmRolePermissions, emmConsolePermissions); - emmConsolePermissions.removeAll(new ArrayList(Arrays.asList(roleInfo.getPermissions()))); - this.getAuthorizedPermissions(rolePermissions, permissions); - for (String permission : roleInfo.getPermissions()) { - permissions.add(permission); - } - permissions.removeAll(emmConsolePermissions); - String[] allApplicablePerms = new String[permissions.size()]; - allApplicablePerms = permissions.toArray(allApplicablePerms); - roleInfo.setPermissions(allApplicablePerms); - - // Delete all authorizations for the current role before authorizing the permission tree - authorizationManager.clearRoleAuthorization(roleName); - if (roleInfo.getPermissions().length > 0) { - for (int i = 0; i < roleInfo.getPermissions().length; i++) { - String permission = roleInfo.getPermissions()[i]; - authorizationManager.authorizeRole(roleName, permission, CarbonConstants.UI_PERMISSION_ACTION); - } - } - authorizeRoleForAppmgt(roleName, roleInfo.getPermissions()); + String[] roleDetails = roleName.split("/"); + updatePermissions(roleDetails[roleDetails.length - 1], roleInfo, userRealm); } //TODO: Need to send the updated role information in the entity back to the client return Response.status(Response.Status.OK).entity("Role '" + roleInfo.getRoleName() + "' has " + @@ -589,70 +602,12 @@ public class RoleManagementServiceImpl implements RoleManagementService { String msg = "Role already exists with name : " + role + ". Try with another role name."; log.warn(msg); return Response.status(Response.Status.CONFLICT).entity(msg).build(); - }else{ + } else { String msg = "Error occurred while updating role '" + roleName + "'"; log.error(msg, e); return Response.serverError().entity( new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); } - } catch (UserAdminException e) { - String msg = "Error occurred while updating permissions of the role '" + roleName + "'"; - log.error(msg, e); - return Response.serverError().entity( - new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); - } - } - - /** - * When presented with role and a set of permissions, if given role has permission to - * perform mobile app management, said role will be given rights mobile app collection in the - * governance registry. - * - * @param role - * @param permissions - * @return state of role update Operation - */ - private boolean authorizeRoleForAppmgt(String role, String[] permissions) { - String permissionString = - "ra^true:rd^false:wa^true:wd^false:da^true:dd^false:aa^true:ad^false"; - String resourcePath = "/_system/governance/mobileapps/"; - boolean appmPermAvailable = false; - - if (permissions != null) { - for (int i = 0; i < permissions.length; i++) - switch (permissions[i]) { - case "/permission/admin/manage/mobileapp": - appmPermAvailable = true; - break; - case "/permission/admin/manage/mobileapp/create": - appmPermAvailable = true; - break; - case "/permission/admin/manage/mobileapp/publish": - appmPermAvailable = true; - break; - } - } - - if (appmPermAvailable) { - try { - Registry registry = CarbonContext.getThreadLocalCarbonContext(). - getRegistry(RegistryType.SYSTEM_GOVERNANCE); - ChangeRolePermissionsUtil.changeRolePermissions((UserRegistry) registry, - resourcePath, role + ":" + permissionString); - - return true; - } catch (Exception e) { - String msg = "Error while retrieving user registry in order to update permissions " - + "for resource : " + resourcePath; - log.error(msg, e); - return false; - } - } else { - if (log.isDebugEnabled()) { - log.debug("Mobile App Management permissions not selected, therefore role : " + - role + " not given permission for registry collection : " + resourcePath); - } - return false; } } @@ -780,4 +735,33 @@ public class RoleManagementServiceImpl implements RoleManagementService { } return rolePermissions; } + + /** + * Update the role's permissions. This will function in the fire and forget pattern and run on a new thread. + * + * @param roleName Role Name + * @param roleInfo {@link RoleInfo} + * @param userRealm {@link UserRealm} + */ + private void updatePermissions(String roleName, RoleInfo roleInfo, UserRealm userRealm) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(true); + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + PrivilegedCarbonContext.startTenantFlow(); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(tenantDomain, true); + DeviceMgtAPIUtils.getApiPublisher().updateScopeRoleMapping(roleName, + RoleManagementServiceImpl.this.getPlatformUIPermissions(roleName, userRealm, + roleInfo.getPermissions()), RoleManagementServiceImpl.this.getPlatformUIPermissions(roleName, userRealm, + roleInfo.getRemovedPermissions())); + } catch (APIManagerPublisherException | UserAdminException e) { + log.error("Error Occurred while updating role scope mapping. ", e); + } finally { + PrivilegedCarbonContext.endTenantFlow(); + } + } + }); + thread.start(); + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/UserManagementServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/UserManagementServiceImpl.java index d0f5239fa3..10b5a29dfe 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/UserManagementServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/UserManagementServiceImpl.java @@ -19,6 +19,15 @@ package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import io.entgra.device.mgt.core.device.mgt.common.Device; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpStatus; +import org.eclipse.wst.common.uriresolver.internal.util.URIEncoder; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.*; import io.entgra.device.mgt.core.device.mgt.api.jaxrs.exception.BadRequestException; import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.UserManagementService; @@ -28,7 +37,6 @@ import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.CredentialManagementR import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; import io.entgra.device.mgt.core.device.mgt.common.EnrolmentInfo; import io.entgra.device.mgt.core.device.mgt.common.configuration.mgt.ConfigurationManagementException; -import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; import io.entgra.device.mgt.core.device.mgt.common.exceptions.OTPManagementException; import io.entgra.device.mgt.core.device.mgt.common.invitation.mgt.DeviceEnrollmentInvitation; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; @@ -37,13 +45,6 @@ import io.entgra.device.mgt.core.device.mgt.common.spi.OTPManagementService; import io.entgra.device.mgt.core.device.mgt.core.DeviceManagementConstants; import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; import io.entgra.device.mgt.core.device.mgt.core.service.EmailMetaInfo; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.http.HttpStatus; -import org.eclipse.wst.common.uriresolver.internal.util.URIEncoder; -import org.wso2.carbon.context.CarbonContext; -import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.identity.claim.metadata.mgt.ClaimMetadataManagementAdminService; import org.wso2.carbon.identity.claim.metadata.mgt.dto.AttributeMappingDTO; import org.wso2.carbon.identity.claim.metadata.mgt.dto.ClaimPropertyDTO; @@ -83,11 +84,6 @@ public class UserManagementServiceImpl implements UserManagementService { private static final String API_BASE_PATH = "/users"; private static final Log log = LogFactory.getLog(UserManagementServiceImpl.class); - private static final String ADMIN_ROLE = "admin"; - private static final String DEFAULT_DEVICE_USER = "Internal/devicemgt-user"; - private static final String DEFAULT_DEVICE_ADMIN = "Internal/devicemgt-admin"; - private static final String DEFAULT_SUBSCRIBER = "Internal/subscriber"; - // Permissions that are given for a normal device user. private static final Permission[] PERMISSIONS_FOR_DEVICE_USER = { new Permission("/permission/admin/Login", "ui.execute"), @@ -124,51 +120,9 @@ public class UserManagementServiceImpl implements UserManagementService { Map defaultUserClaims = this.buildDefaultUserClaims(userInfo.getFirstname(), userInfo.getLastname(), userInfo.getEmailAddress(), true); - // calling addUser method of carbon user api - List tmpRoles = new ArrayList<>(); - String[] userInfoRoles = userInfo.getRoles(); - tmpRoles.add(DEFAULT_DEVICE_USER); - - boolean subscriberFound = false; - boolean adminFound = false; - - if (userInfoRoles != null) { - //check if subscriber role is coming in the payload - for (String r : userInfoRoles) { - if (!subscriberFound || !adminFound) { - if (DEFAULT_SUBSCRIBER.equals(r)) { - subscriberFound = true; - } else if (ADMIN_ROLE.equals(r)) { - tmpRoles.add(DEFAULT_DEVICE_ADMIN); - adminFound = true; - } - } else { - break; - } - } - tmpRoles.addAll(Arrays.asList(userInfoRoles)); - } - - if (!subscriberFound) { - // Add Internal/subscriber role to new users - if (userStoreManager.isExistingRole(DEFAULT_SUBSCRIBER)) { - tmpRoles.add(DEFAULT_SUBSCRIBER); - } else { - log.warn("User: " + userInfo.getUsername() + " will not be able to enroll devices as '" + - DEFAULT_SUBSCRIBER + "' is missing in the system"); - } - } - - String[] roles = new String[tmpRoles.size()]; - tmpRoles.toArray(roles); - - // If the normal device user role does not exist, create a new role with the minimal permissions - if (!userStoreManager.isExistingRole(DEFAULT_DEVICE_USER)) { - userStoreManager.addRole(DEFAULT_DEVICE_USER, null, PERMISSIONS_FOR_DEVICE_USER); - } userStoreManager.addUser(userInfo.getUsername(), initialUserPassword, - roles, defaultUserClaims, null); + userInfo.getRoles(), defaultUserClaims, null); // Outputting debug message upon successful addition of user if (log.isDebugEnabled()) { log.debug("User '" + userInfo.getUsername() + "' has successfully been added."); @@ -336,32 +290,42 @@ public class UserManagementServiceImpl implements UserManagementService { @Consumes(MediaType.WILDCARD) @Override public Response removeUser(@QueryParam("username") String username, @QueryParam("domain") String domain) { + boolean nameWithDomain = false; if (domain != null && !domain.isEmpty()) { username = domain + '/' + username; + nameWithDomain = true; } try { + int deviceCount; UserStoreManager userStoreManager = DeviceMgtAPIUtils.getUserStoreManager(); if (!userStoreManager.isExistingUser(username)) { if (log.isDebugEnabled()) { - log.debug("User by username: " + username + " does not exist for removal."); + log.debug("User by user: " + username + " does not exist for removal."); } - String msg = "User by username: " + username + " does not exist for removal."; + String msg = "User by user: " + username + " does not exist for removal."; return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); } - // Un-enroll all devices for the user DeviceManagementProviderService deviceManagementService = DeviceMgtAPIUtils.getDeviceManagementService(); - deviceManagementService.setStatus(username, EnrolmentInfo.Status.REMOVED); - - userStoreManager.deleteUser(username); - if (log.isDebugEnabled()) { - log.debug("User '" + username + "' was successfully removed."); + if (nameWithDomain) { + deviceCount = deviceManagementService.getDeviceCount(username.split("/")[1]); + } else { + deviceCount = deviceManagementService.getDeviceCount(username); + } + if (deviceCount == 0) { + userStoreManager.deleteUser(username); + if (log.isDebugEnabled()) { + log.debug("User '" + username + "' was successfully removed."); + } + return Response.status(Response.Status.OK).build(); + } else { + String msg = "There are enrolled devices for user: " + username + ". Please remove them before deleting the user."; + log.error(msg); + return Response.status(400).entity(msg).build(); } - return Response.status(Response.Status.OK).build(); } catch (DeviceManagementException | UserStoreException e) { - String msg = "Exception in trying to remove user by username: " + username; + String msg = "Exception in trying to remove user by user: " + username; log.error(msg, e); - return Response.serverError().entity( - new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); + return Response.status(400).entity(msg).build(); } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/admin/GroupManagementAdminServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/admin/GroupManagementAdminServiceImpl.java index 51b00ec613..8c13cf4bf3 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/admin/GroupManagementAdminServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/admin/GroupManagementAdminServiceImpl.java @@ -133,6 +133,23 @@ public class GroupManagementAdminServiceImpl implements GroupManagementAdminServ } } + @Override + public Response getHierarchicalGroupCount(String status) { + try { + int count; + if (status == null || status.isEmpty()) { + count = DeviceMgtAPIUtils.getGroupManagementProviderService().getHierarchicalGroupCount(); + } else { + count = DeviceMgtAPIUtils.getGroupManagementProviderService().getGroupCountByStatus(status); + } + return Response.status(Response.Status.OK).entity(count).build(); + } catch (GroupManagementException e) { + String msg = "ErrorResponse occurred while retrieving hierarchical group count."; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } + } + @Override public Response getGroupCount(String status) { try { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/util/Constants.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/util/Constants.java index 0a9b6efa26..75ba2cc322 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/util/Constants.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/util/Constants.java @@ -84,6 +84,7 @@ public class Constants { public static final String LOGIN = "/permission/admin/login"; public static final String DEVICE_MGT = "/permission/admin/device-mgt"; public static final String APP_MGT = "/permission/admin/app-mgt"; + public static final String TENANT = "/permission/admin/tenants"; } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/util/DeviceMgtAPIUtils.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/util/DeviceMgtAPIUtils.java index db613f8a28..5494476636 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/util/DeviceMgtAPIUtils.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/util/DeviceMgtAPIUtils.java @@ -18,6 +18,7 @@ package io.entgra.device.mgt.core.device.mgt.api.jaxrs.util; +import io.entgra.device.mgt.core.apimgt.webapp.publisher.APIPublisherService; import io.entgra.device.mgt.core.apimgt.application.extension.APIManagementProviderService; import io.entgra.device.mgt.core.apimgt.extension.rest.api.APIApplicationServices; import io.entgra.device.mgt.core.apimgt.extension.rest.api.ConsumerRESTAPIServices; @@ -160,6 +161,7 @@ public class DeviceMgtAPIUtils { private static volatile APIApplicationServices apiApplicationServices; private static volatile ConsumerRESTAPIServices consumerRESTAPIServices; private static volatile APIManagementProviderService apiManagementProviderService; + private static volatile APIPublisherService apiPublisher; static { String keyStorePassword = ServerConfiguration.getInstance().getFirstProperty("Security.KeyStore.Password"); @@ -239,6 +241,24 @@ public class DeviceMgtAPIUtils { return applicationManager; } + public static APIPublisherService getApiPublisher() { + if (apiPublisher == null) { + synchronized (DeviceMgtAPIUtils.class) { + if (apiPublisher == null) { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + apiPublisher = + (APIPublisherService) ctx.getOSGiService(APIPublisherService.class, null); + if (apiPublisher == null) { + String msg = "Application Manager service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + } + } + } + return apiPublisher; + } + public static void scheduleTaskService(int notifierFrequency) { TaskScheduleService taskScheduleService; try { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/ActivityProviderServiceImplTest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/ActivityProviderServiceImplTest.java index 6e118a1104..91711e6b44 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/ActivityProviderServiceImplTest.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/ActivityProviderServiceImplTest.java @@ -18,19 +18,11 @@ package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.common.ActivityIdList; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.ActivityInfoProviderService; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.DeviceManagementService; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestValidationUtil; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; import io.entgra.device.mgt.core.device.mgt.common.authorization.DeviceAccessAuthorizationService; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationManagementException; import io.entgra.device.mgt.core.device.mgt.core.authorization.DeviceAccessAuthorizationServiceImpl; -import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; -import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderServiceImpl; -import io.entgra.device.mgt.core.policy.mgt.core.util.PolicyManagerUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mockito.Mockito; @@ -44,9 +36,21 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.ObjectFactory; import org.testng.annotations.Test; import org.wso2.carbon.context.PrivilegedCarbonContext; +import io.entgra.device.mgt.core.device.mgt.common.ActivityPaginationRequest; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.DeviceActivity; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Operation; +import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; +import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderServiceImpl; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.common.ActivityIdList; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.ActivityInfoProviderService; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.DeviceManagementService; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestValidationUtil; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; +import io.entgra.device.mgt.core.policy.mgt.core.util.PolicyManagerUtil; import javax.ws.rs.core.Response; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.mockito.MockitoAnnotations.initMocks; @@ -63,6 +67,12 @@ public class ActivityProviderServiceImplTest { private static final Log log = LogFactory.getLog(ActivityProviderServiceImplTest.class); private static final String TEST_ACTIVITY_ID = "ACTIVITY_1"; private static final String IF_MODIFIED_SINCE = "01Aug2018"; + private static final String SINCE = "Fri, 06 Oct 2023 15:30:00 GMT"; + private static final String DEVICE_TYPE_2 = "power-meter"; + private static final Operation.Status STATUS = Operation.Status.NOTNOW; + private static final Operation.Type TYPE = Operation.Type.PROFILE; + private static final String INITIATED_BY = "admin"; + private static final int OPERATION_ID = 158572; private static final String DEVICE_TYPE = "android"; private static final String DEVICE_ID = "1234567"; private static final String OPERATION_CODE = "111222"; @@ -71,7 +81,10 @@ public class ActivityProviderServiceImplTest { private static final String TEST_ACTIVITY_ID_LIST = "ACTIVITY_1,ACTIVITY_2"; private static final List idList = new ArrayList(); private static final List activities = new ArrayList<>(); + private static final List deviceActivities = new ArrayList<>(); private static final ActivityIdList activityList = new ActivityIdList(TEST_ACTIVITY_ID_LIST); + + private static final ActivityPaginationRequest activityPaginationRequest = new ActivityPaginationRequest(LIMIT,OFFSET); private static final ActivityIdList activityListEmpty = new ActivityIdList(""); private List idList1; @@ -108,6 +121,23 @@ public class ActivityProviderServiceImplTest { activity2.setActivityId("ACTIVITY_2"); activities.add(activity1); activities.add(activity2); + DeviceActivity deviceActivity1 = new DeviceActivity(); + DeviceActivity deviceActivity2 = new DeviceActivity(); + deviceActivity1.setActivityId("ACTIVITY_3"); + deviceActivity2.setActivityId("ACTIVITY_4"); + deviceActivities.add(deviceActivity1); + deviceActivities.add(deviceActivity2); + activityPaginationRequest.setDeviceIds(Collections.singletonList(DEVICE_ID)); + activityPaginationRequest.setOperationCode(OPERATION_CODE); + activityPaginationRequest.setDeviceType(DEVICE_TYPE_2); + activityPaginationRequest.setOperationId(OPERATION_ID); + activityPaginationRequest.setInitiatedBy(INITIATED_BY); + activityPaginationRequest.setStatus(STATUS); + activityPaginationRequest.setType(TYPE); + activityPaginationRequest.setStartTimestamp(0); + activityPaginationRequest.setEndTimestamp(0); + activityPaginationRequest.setLimit(LIMIT); + activityPaginationRequest.setOffset(OFFSET); } @Test(description = @@ -186,6 +216,70 @@ public class ActivityProviderServiceImplTest { Mockito.reset(this.deviceManagementProviderService); } + @Test(description = "This method tests trying to get details activity IDs when call with data") + public void testGetActivitiesWithActivityPaginationRequest() throws OperationManagementException { + PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "isAdmin")).toReturn(true); + PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceManagementService")) + .toReturn(this.deviceManagementProviderService); + + Mockito.when(this.deviceManagementProviderService.getActivitiesCount(Mockito.any())).thenReturn(2); + Mockito.when(this.deviceManagementProviderService.getActivities(Mockito.any())).thenReturn(activities); + Response response = this.activityInfoProviderService.getActivities( + OFFSET, LIMIT, SINCE, INITIATED_BY, OPERATION_CODE, OPERATION_ID, + DEVICE_TYPE_2, Collections.singletonList(DEVICE_ID), TYPE.toString(), STATUS.toString(), null, 0, 0); + + Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); + Assert.assertNotNull(response); + Mockito.reset(this.deviceManagementProviderService); + } + + @Test(description = "This method tests trying to get details device activity IDs when call with empty data") + public void testGetActivitiesWithEmptyActivityPaginationRequest() throws OperationManagementException { + PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "isAdmin")).toReturn(true); + PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceManagementService")) + .toReturn(this.deviceManagementProviderService); + + Response response = this.activityInfoProviderService.getActivities( + OFFSET, 0, null, null, null, 0, + null, null, null, null, null, 0, 0); + + Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); + Assert.assertEquals(response.getEntity().toString(), "{\"count\":0}"); + Mockito.reset(this.deviceManagementProviderService); + } + + @Test(description = "This method tests trying to get details device activity IDs when call with data") + public void testGetDeviceActivitiesWithActivityPaginationRequest() throws OperationManagementException { + PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "isAdmin")).toReturn(true); + PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceManagementService")) + .toReturn(this.deviceManagementProviderService); + + Mockito.when(this.deviceManagementProviderService.getDeviceActivitiesCount(Mockito.any())).thenReturn(2); + Mockito.when(this.deviceManagementProviderService.getDeviceActivities(Mockito.any())).thenReturn(deviceActivities); + Response response = this.activityInfoProviderService.getDeviceActivities( + OFFSET, LIMIT, SINCE, INITIATED_BY, OPERATION_CODE, OPERATION_ID, + DEVICE_TYPE_2, Collections.singletonList(DEVICE_ID), TYPE.toString(), STATUS.toString(), null, 0, 0); + + Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); + Assert.assertNotNull(response); + Mockito.reset(this.deviceManagementProviderService); + } + + @Test(description = "This method tests trying to get details activity IDs when call with empty data") + public void testGetDeviceActivitiesWithEmptyActivityPaginationRequest() { + PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "isAdmin")).toReturn(true); + PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceManagementService")) + .toReturn(this.deviceManagementProviderService); + + Response response = this.activityInfoProviderService.getDeviceActivities( + OFFSET, 0, null, null, null, 0, + null, null, null, null, null, 0, 0); + + Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); + Assert.assertEquals(response.getEntity().toString(), "{\"count\":0}"); + Mockito.reset(this.deviceManagementProviderService); + } + @Test(description = "This method tests trying to get details of a list activity IDs which does not exists") public void testGetActivitiesWithNonExistingActivityIdList() throws OperationManagementException { PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "isAdmin")).toReturn(true); @@ -206,7 +300,7 @@ public class ActivityProviderServiceImplTest { Mockito.when(this.deviceManagementProviderService .getOperationByActivityIdAndDevice(TEST_ACTIVITY_ID, deviceIdentifier)).thenReturn(activity); Response response = this.activityInfoProviderService.getActivityByDevice(TEST_ACTIVITY_ID, - DEVICE_TYPE, DEVICE_ID, IF_MODIFIED_SINCE); + DEVICE_TYPE, DEVICE_ID, IF_MODIFIED_SINCE, false, false); Assert.assertNotNull(response); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Mockito.reset(this.deviceManagementProviderService); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImplTest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImplTest.java index 25cdd5168c..0f50c89156 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImplTest.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImplTest.java @@ -157,7 +157,7 @@ public class DeviceManagementServiceImplTest { .toReturn(this.deviceAccessAuthorizationService); Response response = this.deviceManagementService .getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 1, null, null, false, + null, null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode()); } @@ -177,22 +177,22 @@ public class DeviceManagementServiceImplTest { Response response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 1, null, null, false, + null,null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); response = this.deviceManagementService .getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, null, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 1, null, null, false, + null, null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); response = this.deviceManagementService .getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, null, null, null, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 1, null, null, false, + null, null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); response = this.deviceManagementService .getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, null, null, null, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 1, null, null, true, + null, null, DEFAULT_STATUS_LIST, 1, null, null, true, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); } @@ -306,7 +306,7 @@ public class DeviceManagementServiceImplTest { .toReturn(this.deviceManagementProviderService); Mockito.when(deviceAccessAuthorizationService.isDeviceAdminUser()).thenReturn(true); deviceManagementService.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, - DEFAULT_ROLE, DEFAULT_OWNERSHIP, null, DEFAULT_STATUS_LIST, 1, + DEFAULT_ROLE, DEFAULT_OWNERSHIP, null,null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); } @@ -326,11 +326,11 @@ public class DeviceManagementServiceImplTest { Response response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP - , null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); + , null, null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, null, DEFAULT_USERNAME, DEFAULT_ROLE, DEFAULT_OWNERSHIP - , null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); + , null, null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); } @@ -352,7 +352,7 @@ public class DeviceManagementServiceImplTest { Response response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, "newuser", null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 0, null, null, false, + null, null, DEFAULT_STATUS_LIST, 0, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.UNAUTHORIZED.getStatusCode()); Mockito.reset(this.deviceAccessAuthorizationService); @@ -374,17 +374,17 @@ public class DeviceManagementServiceImplTest { Response response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 0, null, ifModifiedSince, false, + null, null, DEFAULT_STATUS_LIST, 0, null, ifModifiedSince, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.NOT_MODIFIED.getStatusCode()); response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 0, null, ifModifiedSince, true, + null, null, DEFAULT_STATUS_LIST, 0, null, ifModifiedSince, true, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.NOT_MODIFIED.getStatusCode()); response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 0, null, "ErrorModifiedSince", + null, null, DEFAULT_STATUS_LIST, 0, null, "ErrorModifiedSince", false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode()); } @@ -405,17 +405,17 @@ public class DeviceManagementServiceImplTest { Response response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 0, since, null, false, + null, null,DEFAULT_STATUS_LIST, 0, since, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 0, since, null, true, + null, null,DEFAULT_STATUS_LIST, 0, since, null, true, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 0, "ErrorSince", null, false, + null, null,DEFAULT_STATUS_LIST, 0, "ErrorSince", null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode()); } @@ -438,7 +438,7 @@ public class DeviceManagementServiceImplTest { Response response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 1, null, null, false, + null, null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); Mockito.reset(this.deviceManagementProviderService); @@ -461,7 +461,7 @@ public class DeviceManagementServiceImplTest { Response response = this.deviceManagementService .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, - null, DEFAULT_STATUS_LIST, 1, null, null, false, + null, null, DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5); Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); Mockito.reset(this.deviceAccessAuthorizationService); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/UserManagementServiceImplTest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/UserManagementServiceImplTest.java index 5b2417c4db..ea6594d15b 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/UserManagementServiceImplTest.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/UserManagementServiceImplTest.java @@ -18,20 +18,7 @@ package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.BasicUserInfo; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.EnrollmentInvitation; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.UserInfo; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.UserManagementService; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants; -import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; -import io.entgra.device.mgt.core.device.mgt.common.configuration.mgt.ConfigurationManagementException; -import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; -import io.entgra.device.mgt.core.device.mgt.common.exceptions.OTPManagementException; -import io.entgra.device.mgt.core.device.mgt.common.invitation.mgt.DeviceEnrollmentInvitation; -import io.entgra.device.mgt.core.device.mgt.common.spi.OTPManagementService; -import io.entgra.device.mgt.core.device.mgt.core.otp.mgt.service.OTPManagementServiceImpl; -import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; -import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderServiceImpl; +import io.entgra.device.mgt.core.device.mgt.common.Device; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -45,6 +32,20 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.ObjectFactory; import org.testng.annotations.Test; import org.wso2.carbon.context.CarbonContext; +import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; +import io.entgra.device.mgt.core.device.mgt.common.configuration.mgt.ConfigurationManagementException; +import io.entgra.device.mgt.core.device.mgt.common.exceptions.OTPManagementException; +import io.entgra.device.mgt.core.device.mgt.common.invitation.mgt.DeviceEnrollmentInvitation; +import io.entgra.device.mgt.core.device.mgt.common.spi.OTPManagementService; +import io.entgra.device.mgt.core.device.mgt.core.otp.mgt.service.OTPManagementServiceImpl; +import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; +import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderServiceImpl; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.BasicUserInfo; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.EnrollmentInvitation; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.UserInfo; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.UserManagementService; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants; +import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils; import org.wso2.carbon.user.api.RealmConfiguration; import org.wso2.carbon.user.api.UserRealm; import org.wso2.carbon.user.api.UserStoreException; @@ -272,7 +273,7 @@ public class UserManagementServiceImplTest { .toReturn(this.userStoreManager); PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceManagementService")) .toReturn(this.deviceManagementProviderService); - Mockito.doReturn(true).when(deviceManagementProviderService).setStatus(Mockito.anyString(), Mockito.any()); + Mockito.doReturn(0).when(deviceManagementProviderService).getDeviceCount(TEST_USERNAME); Mockito.doNothing().when(userStoreManager).deleteUser(Mockito.anyString()); Response response = userManagementService.removeUser(TEST_USERNAME, null); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), @@ -337,7 +338,7 @@ public class UserManagementServiceImplTest { Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), "Response returned successful for a user updating request with problematic inputs"); response = userManagementService.removeUser(TEST3_USERNAME, null); - Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), + Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode(), "Response returned successful for a user removal request with problematic inputs"); response = userManagementService.getRolesOfUser(TEST3_USERNAME, null); Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/pom.xml index 291280ef73..ca51d3e198 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/pom.xml +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/pom.xml @@ -21,7 +21,7 @@ device-mgt io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/ActivityPaginationRequest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/ActivityPaginationRequest.java index b535ab4bd6..058b82dd2f 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/ActivityPaginationRequest.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/ActivityPaginationRequest.java @@ -32,6 +32,7 @@ public class ActivityPaginationRequest { private String deviceType; private List deviceIds; private String operationCode; + private int operationId; private String initiatedBy; private long since; private Operation.Type type; @@ -132,4 +133,12 @@ public class ActivityPaginationRequest { public void setEndTimestamp(long endTimestamp) { this.endTimestamp = endTimestamp; } + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/CertificatePaginationRequest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/CertificatePaginationRequest.java new file mode 100644 index 0000000000..fdfcf5d30c --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/CertificatePaginationRequest.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.device.mgt.common; + +public class CertificatePaginationRequest { + private int startIndex; + private int rowCount; + private String serialNumber; + private String deviceIdentifier; + private String username; + + public CertificatePaginationRequest(int start, int rowCount) { + this.startIndex = start; + this.rowCount = rowCount; + } + + public int getStartIndex() { + return startIndex; + } + + public void setStartIndex(int startIndex) { + this.startIndex = startIndex; + } + + public int getRowCount() { + return rowCount; + } + + public void setRowCount(int rowCount) { + this.rowCount = rowCount; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public String getDeviceIdentifier() { + return deviceIdentifier; + } + + public void setDeviceIdentifier(String deviceIdentifier) { + this.deviceIdentifier = deviceIdentifier; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String toString() { + return "Certificate serial number '" + this.serialNumber + "' num of rows: " + this.rowCount + " start index: " + this.startIndex; + } +} diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/EnrolmentInfo.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/EnrolmentInfo.java index 9085468df0..2b287fa427 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/EnrolmentInfo.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/EnrolmentInfo.java @@ -31,7 +31,7 @@ public class EnrolmentInfo implements Serializable { public enum Status { CREATED, ACTIVE, INACTIVE, UNREACHABLE, UNCLAIMED, SUSPENDED, BLOCKED, REMOVED, DISENROLLMENT_REQUESTED, CONFIGURED, READY_TO_CONNECT, RETURN_PENDING, RETURNED, DEFECTIVE, WARRANTY_PENDING, WARRANTY_SENT, - WARRANTY_REPLACED, ASSIGNED + WARRANTY_REPLACED, ASSIGNED, DELETED } public enum OwnerShip { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/PaginationRequest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/PaginationRequest.java index ab1eeeff80..766bf6dc27 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/PaginationRequest.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/PaginationRequest.java @@ -37,6 +37,7 @@ public class PaginationRequest { private Date since; private String filter; private String serialNumber; + private Map customProperty = new HashMap<>(); private Map property = new HashMap<>(); private List statusList = new ArrayList<>(); private OperationLogFilters operationLogFilters = new OperationLogFilters(); @@ -111,6 +112,18 @@ public class PaginationRequest { return ownership; } + public Map getCustomProperty() { + return customProperty; + } + + public void setCustomProperty(Map customProperty) { + this.customProperty = customProperty; + } + + public void addCustomProperty(String key, String value) { + customProperty.put(key, value); + } + public void setOwnership(String ownership) { this.ownership = ownership; } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/geo/service/GeoLocationProviderService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/geo/service/GeoLocationProviderService.java index 1d1cbf1d95..4a9da7c79c 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/geo/service/GeoLocationProviderService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/geo/service/GeoLocationProviderService.java @@ -169,4 +169,11 @@ public interface GeoLocationProviderService { * @throws GeoLocationBasedServiceException any errors occurred while reading event records to geofence */ List getEventsOfGeoFence(int geoFenceId) throws GeoLocationBasedServiceException; + + /** + * Get geo fence count by tenant id + * @return returns the geofence count of tenant. + * @throws GeoLocationBasedServiceException any errors occurred while reading event records to geofence + */ + int getGeoFenceCount() throws GeoLocationBasedServiceException; } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/Activity.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/Activity.java index 5a04185e0a..3c68fc74b2 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/Activity.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/Activity.java @@ -49,6 +49,14 @@ public class Activity { @JsonProperty("code") private String code; + @ApiModelProperty( + name = "operationId", + value = "Operation Id", + required = false, + example = "10") + @JsonProperty("operationId") + private int operationId; + @ApiModelProperty( name = "type", value = "Activity type", @@ -80,6 +88,32 @@ public class Activity { @JsonProperty("initiatedBy") private String initiatedBy; + @ApiModelProperty(name = "appName", value = "App Name.") + private String appName; + + @ApiModelProperty(name = "packageName", + value = "package name of the application") + private String packageName; + @ApiModelProperty(name = "username", + value = "username of subscribed person") + private String username; + @ApiModelProperty(name = "status", + value = "Status of app install") + private String status; + + @ApiModelProperty(name = "version", + value = "Version of app") + private String version; + + @ApiModelProperty(name = "triggeredBy", + value = "Operation triggered by what") + private String triggeredBy; + + @ApiModelProperty(name = "appType", + value = "Type of application") + private String appType; + + public String getActivityId() { return activityId; } @@ -96,6 +130,14 @@ public class Activity { this.code = code; } + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + public Type getType() { return type; } @@ -127,5 +169,61 @@ public class Activity { public void setInitiatedBy(String initiatedBy) { this.initiatedBy = initiatedBy; } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getTriggeredBy() { + return triggeredBy; + } + + public void setTriggeredBy(String triggeredBy) { + this.triggeredBy = triggeredBy; + } + + public String getAppType() { + return appType; + } + + public void setAppType(String appType) { + this.appType = appType; + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/DeviceActivity.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/DeviceActivity.java new file mode 100644 index 0000000000..b7153fc435 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/DeviceActivity.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +package io.entgra.device.mgt.core.device.mgt.common.operation.mgt; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; + +import java.util.List; + +@ApiModel(value = "DeviceActivity", description = "An activity instance carries a unique identifier that can be " + + "used to identify a particular operation instance uniquely") +public class DeviceActivity { + + public enum Type { + CONFIG, MESSAGE, INFO, COMMAND, PROFILE, POLICY + } + + public enum Status { + IN_PROGRESS, PENDING, COMPLETED, ERROR, REPEATED, INVALID, UNAUTHORIZED, NOTNOW, REQUIRED_CONFIRMATION, CONFIRMED + } + + @ApiModelProperty( + name = "activityId", + value = "Device Activity identifier", + required = true, + example = "ACTIVITY_1") + @JsonProperty("activityId") + private String activityId; + @ApiModelProperty( + name = "code", + value = "Device Activity code", + required = true, + example = "DEVICE_RING") + @JsonProperty("code") + private String code; + @ApiModelProperty( + name = "operationId", + value = "Operation Id", + required = false, + example = "10") + @JsonProperty("operationId") + private int operationId; + @ApiModelProperty( + name = "type", + value = "Activity type", + required = true, + allowableValues = "CONFIG, MESSAGE, INFO, COMMAND, PROFILE, POLICY", + example = "COMMAND") + @JsonProperty("type") + private Type type; + + @ApiModelProperty( + name = "status", + value = "Status of the device activity performed.", + required = true, + example = "PENDING") + @JsonProperty("status") + private Status status; + @ApiModelProperty( + name = "createdTimeStamp", + value = "Timestamp recorded when the activity took place", + required = true, + example = "Thu Oct 06 11:18:47 IST 2016") + @JsonProperty("createdTimestamp") + private String createdTimeStamp; + @ApiModelProperty( + name = "deviceActivities", + value = "Collection of devices activities corresponding to the activity", + required = true) + @JsonProperty("deviceActivities") + private List deviceActivities; + @ApiModelProperty( + name = "initiatedBy", + value = "Initiated user", + required = true) + @JsonProperty("initiatedBy") + private String initiatedBy; + @ApiModelProperty( + name = "deviceIdentifier", + value = "Device identifier of the device.", + required = true) + @JsonProperty("deviceIdentifier") + private DeviceIdentifier deviceIdentifier; + @ApiModelProperty( + name = "responses", + value = "Responses received from devices.", + required = true) + @JsonProperty("responses") + private List responses; + @ApiModelProperty( + name = "updatedTimestamp ", + value = "Last updated time of the activity.", + required = true, + example = "Thu Oct 06 11:18:47 IST 2016") + @JsonProperty("updatedTimestamp") + private String updatedTimestamp; + + public DeviceIdentifier getDeviceIdentifier() { + return deviceIdentifier; + } + + public void setDeviceIdentifier(DeviceIdentifier deviceIdentifier) { + this.deviceIdentifier = deviceIdentifier; + } + + public List getResponses() { + return responses; + } + + public void setResponses(List responses) { + this.responses = responses; + } + + public String getUpdatedTimestamp() { + return updatedTimestamp; + } + + public void setUpdatedTimestamp(String updatedTimestamp) { + this.updatedTimestamp = updatedTimestamp; + } + + public String getActivityId() { + return activityId; + } + + public void setActivityId(String activityId) { + this.activityId = activityId; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public String getCreatedTimeStamp() { + return createdTimeStamp; + } + + public void setCreatedTimeStamp(String createdTimeStamp) { + this.createdTimeStamp = createdTimeStamp; + } + + public List getDeviceActivities() { + return deviceActivities; + } + + public void setDeviceActivities(List deviceActivities) { + this.deviceActivities = deviceActivities; + } + + public String getInitiatedBy() { + return initiatedBy; + } + + public void setInitiatedBy(String initiatedBy) { + this.initiatedBy = initiatedBy; + } +} + diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/OperationManager.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/OperationManager.java index d53e6c6339..f223c20ea5 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/OperationManager.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/operation/mgt/OperationManager.java @@ -123,6 +123,11 @@ public interface OperationManager { int getActivitiesCount(ActivityPaginationRequest activityPaginationRequest) throws OperationManagementException; + List getDeviceActivities(ActivityPaginationRequest activityPaginationRequest) throws OperationManagementException; + + int getDeviceActivitiesCount(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementException; + List getFilteredActivities(String operationCode, int limit, int offset) throws OperationManagementException; int getTotalCountOfFilteredActivities(String operationCode) throws OperationManagementException; diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/pom.xml index e842d254fc..9f2d5aa52b 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/pom.xml +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/pom.xml @@ -22,7 +22,7 @@ device-mgt io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/src/main/java/io/entgra/device/mgt/core/device/mgt/config/api/service/DeviceManagementConfigService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/src/main/java/io/entgra/device/mgt/core/device/mgt/config/api/service/DeviceManagementConfigService.java index 729e477c00..e5d65dd4d3 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/src/main/java/io/entgra/device/mgt/core/device/mgt/config/api/service/DeviceManagementConfigService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/src/main/java/io/entgra/device/mgt/core/device/mgt/config/api/service/DeviceManagementConfigService.java @@ -53,28 +53,28 @@ import java.util.List; @Scope( name = "View configurations", description = "", - key = "perm:view-configuration", + key = "dm:conf:view", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/platform-configurations/view"} ), @Scope( name = "Manage configurations", description = "", - key = "perm:manage-configuration", + key = "dm:conf:manage", roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/platform-configurations/manage"} ), @Scope( name = "Getting Details of Device tenants", description = "Getting Details of Device tenants", - key = "perm:admin:tenant:view", + key = "admin:tenant:view", roles = {"Internal/devicemgt-user"}, permissions = {"/tenants/view"} ), @Scope( name = "Add a permission to the permission tree", description = "Add a permission to the permission tree", - key = "perm:admin:permissions:add", + key = "admin:permissions:add", roles = {"Internal/devicemgt-user"}, permissions = {"/permissions/add"} ) @@ -156,7 +156,7 @@ public interface DeviceManagementConfigService { tags = "Device Management Configuration", extensions = { @Extension(properties = { - @ExtensionProperty(name = "scope", value = "perm:manage-configuration") + @ExtensionProperty(name = "scope", value = "dm:conf:manage") }) } ) @@ -240,7 +240,7 @@ public interface DeviceManagementConfigService { tags = "Device Management Administrative Service", extensions = { @Extension(properties = { - @ExtensionProperty(name = "scope", value ="perm:admin:tenant:view") + @ExtensionProperty(name = "scope", value ="admin:tenant:view") }) } ) @@ -288,7 +288,7 @@ public interface DeviceManagementConfigService { extensions = { @Extension(properties = { @ExtensionProperty(name = "scope", value = - "perm:admin:permissions:add") + "admin:permissions:add") }) } ) diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/pom.xml index 38fe9896c3..f8d7331ef1 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/pom.xml +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/pom.xml @@ -22,7 +22,7 @@ io.entgra.device.mgt.core device-mgt - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml @@ -507,6 +507,7 @@ io.entgra.device.mgt.core io.entgra.device.mgt.core.notification.logger + org.wso2.orbit.javax.xml.bind diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/DeviceManagementConstants.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/DeviceManagementConstants.java index 58be3dae82..8fc2e2804a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/DeviceManagementConstants.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/DeviceManagementConstants.java @@ -29,6 +29,7 @@ public final class DeviceManagementConstants { public static final String GEOFENCE_CACHE = "GEOFENCE_CACHE"; public static final String BILLING_CACHE = "BILLING_CACHE"; public static final String META_KEY = "PER_DEVICE_COST"; + public static final String DEP_META_KEY = "DEP_CONFIG"; public static final String ACTIVE_STATUS = "ACTIVE"; public static final String ENROLLMENT_NOTIFICATION_API_ENDPOINT = "/api/device-mgt/enrollment-notification"; public static final String URL_SEPERATOR = "/"; @@ -37,7 +38,7 @@ public final class DeviceManagementConstants { private ConfigurationManagement(){ throw new AssertionError(); } - public static final String SCOPES_FOR_TOKEN = "perm:device:operations perm:device:publish-event perm:windows:enroll"; + public static final String SCOPES_FOR_TOKEN = "dm:devices:ops:view dm:device:event:publish win:devices:enroll"; public static final String IOT_GATEWAY_HOST = "iot.gateway.host"; public static final String IOT_GATEWAY_HTTPS_PORT = "iot.gateway.https.port"; public static final String IOT_CORE_HOST = "iot.core.host"; @@ -155,6 +156,7 @@ public final class DeviceManagementConstants { new Permission("/permission/admin/device-mgt/devices/enroll", "ui.execute"), new Permission("/permission/admin/device-mgt/devices/disenroll", "ui.execute"), new Permission("/permission/admin/device-mgt/devices/owning-device/view", "ui.execute"), + new Permission("/permission/admin/device-mgt/devices/owning-device/operations/view", "ui.execute"), new Permission("/permission/admin/device-mgt/metadata", "ui.execute"), new Permission("/permission/admin/manage/portal", "ui.execute") }; diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/DeviceManagementConfig.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/DeviceManagementConfig.java index e97ee8e108..d38eb41338 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/DeviceManagementConfig.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/DeviceManagementConfig.java @@ -39,6 +39,7 @@ import io.entgra.device.mgt.core.device.mgt.core.config.remote.session.RemoteSes import io.entgra.device.mgt.core.device.mgt.core.config.status.task.DeviceStatusTaskConfig; import io.entgra.device.mgt.core.device.mgt.core.config.task.TaskConfiguration; import io.entgra.device.mgt.core.device.mgt.core.event.config.EventOperationTaskConfiguration; +import io.entgra.device.mgt.core.device.mgt.core.config.permission.DefaultPermissions; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -75,6 +76,8 @@ public final class DeviceManagementConfig { private MetaDataConfiguration metaDataConfiguration; private EnrollmentGuideConfiguration enrollmentGuideConfiguration; + private DefaultPermissions defaultPermissions; + @XmlElement(name = "ManagementRepository", required = true) public DeviceManagementConfigRepository getDeviceManagementConfigRepository() { return deviceManagementConfigRepository; @@ -287,5 +290,14 @@ public final class DeviceManagementConfig { public void setEnrollmentGuideConfiguration(EnrollmentGuideConfiguration enrollmentGuideConfiguration) { this.enrollmentGuideConfiguration = enrollmentGuideConfiguration; } + + @XmlElement(name = "DefaultPermissions", required = true) + public DefaultPermissions getDefaultPermissions() { + return defaultPermissions; + } + + public void setDefaultPermissions(DefaultPermissions defaultPermissions) { + this.defaultPermissions = defaultPermissions; + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/DefaultPermission.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/DefaultPermission.java new file mode 100644 index 0000000000..d8ee628924 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/DefaultPermission.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.device.mgt.core.config.permission; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "DefaultPermission") +public class DefaultPermission { + + private String name; + private ScopeMapping scopeMapping; + + @XmlElement(name = "Name", required = true) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @XmlElement(name = "MappedScopeDetails", required = true) + public ScopeMapping getScopeMapping() { + return scopeMapping; + } + + public void setScopeMapping(ScopeMapping scopeMapping) { + this.scopeMapping = scopeMapping; + } +} diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/DefaultPermissions.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/DefaultPermissions.java new file mode 100644 index 0000000000..c04695b111 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/DefaultPermissions.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.device.mgt.core.config.permission; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement(name = "DefaultPermissions") +public class DefaultPermissions { + + private List defaultPermissions; + + @XmlElement(name = "DefaultPermission", required = true) + public List getDefaultPermissions() { + return defaultPermissions; + } + + public void setDefaultPermissions(List defaultPermissions) { + this.defaultPermissions = defaultPermissions; + } +} diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/ScopeMapping.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/ScopeMapping.java new file mode 100644 index 0000000000..e745126502 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/permission/ScopeMapping.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.device.mgt.core.config.permission; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "MappedScopeDetails") +public class ScopeMapping { + + private String name; + private String key; + + private String defaultRoles; + + @XmlElement(name = "Name", required = true) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @XmlElement(name = "Key", required = true) + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + @XmlElement(name = "DefaultRoles", required = true) + public String getDefaultRoles() { + return defaultRoles; + } + + public void setDefaultRoles(String defaultRoles) { + this.defaultRoles = defaultRoles; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.header.default.user-menu/user-menu.js b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/DeviceInfoConfigurations.java similarity index 59% rename from components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.header.default.user-menu/user-menu.js rename to components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/DeviceInfoConfigurations.java index b117446615..0e37753018 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.header.default.user-menu/user-menu.js +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/DeviceInfoConfigurations.java @@ -16,15 +16,21 @@ * under the License. */ -function onRequest(context) { - var constants = require("/app/modules/constants.js"); - var user = context.user; - var isSuperTenant = false; - if (user.tenantId == -1234){ - isSuperTenant = true; +package io.entgra.device.mgt.core.device.mgt.core.config.ui; + +import javax.xml.bind.annotation.XmlElement; +import java.util.List; + +class DeviceInfoConfigurations { + + private List deviceInfoItems; + + @XmlElement(name = "DeviceInfoItem") + public List getDeviceInfoItems() { + return deviceInfoItems; + } + + public void setDeviceInfoItems(List deviceInfoItems) { + this.deviceInfoItems = deviceInfoItems; } - var viewModal = {}; - viewModal.isSuperTenant = isSuperTenant; - viewModal.USER_SESSION_KEY = session.get(constants["USER_SESSION_KEY"]); - return viewModal; } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/DeviceInfoItem.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/DeviceInfoItem.java new file mode 100644 index 0000000000..0f02669a49 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/DeviceInfoItem.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.entgra.device.mgt.core.device.mgt.core.config.ui; + +import javax.xml.bind.annotation.XmlElement; + +class DeviceInfoItem { + + private String definedValue; + private String displayValue; + + private String type; + + @XmlElement(name = "DefinedValue") + public String getDefinedValue() { + return definedValue; + } + + public void setDefinedValue(String definedValue) { + this.definedValue = definedValue; + } + + @XmlElement(name = "DisplayValue") + public String getDisplayValue() { + return displayValue; + } + + public void setDisplayValue(String displayValue) { + this.displayValue = displayValue; + } + + @XmlElement(name = "Type") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/UIConfiguration.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/UIConfiguration.java index 844c4039d2..6e71d17072 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/UIConfiguration.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/config/ui/UIConfiguration.java @@ -36,6 +36,8 @@ public class UIConfiguration { private Billing billing; private HubspotChat hubspotChat; + private DeviceInfoConfigurations deviceInfoConfigurations; + @XmlElement(name = "AppRegistration", required=true) public AppRegistration getAppRegistration() { return appRegistration; @@ -98,4 +100,13 @@ public class UIConfiguration { public void setLoginCacheCapacity(int loginCacheCapacity) { this.loginCacheCapacity = loginCacheCapacity; } + + @XmlElement(name = "DeviceInfoConfigurations", required = true) + public DeviceInfoConfigurations getDeviceInfoConfigurations() { + return deviceInfoConfigurations; + } + + public void setDeviceInfoConfigurations(DeviceInfoConfigurations deviceInfoConfigurations) { + this.deviceInfoConfigurations = deviceInfoConfigurations; + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/DeviceDAO.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/DeviceDAO.java index fa58ba9f4f..8b08641e2c 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/DeviceDAO.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/DeviceDAO.java @@ -634,7 +634,7 @@ public interface DeviceDAO { * @param enrollmentIds list of enrollment ids. * @throws DeviceManagementDAOException when no enrolments are found for the given device. */ - void deleteDevices(List deviceIdentifiers, List deviceIds, List enrollmentIds) throws DeviceManagementDAOException; + void deleteDevices(List deviceIdentifiers, List deviceIds, List enrollmentIds, List validDevices) throws DeviceManagementDAOException; boolean transferDevice(String deviceType, String deviceId, String owner, int destinationTenantId) throws DeviceManagementDAOException, SQLException; diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/GeofenceDAO.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/GeofenceDAO.java index a6fcf172e5..1546d4034e 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/GeofenceDAO.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/GeofenceDAO.java @@ -174,4 +174,12 @@ public interface GeofenceDAO { * @throws DeviceManagementDAOException */ GeofenceData getGeofence(int fenceId, boolean requireGroupData) throws DeviceManagementDAOException; + + /** + * This method is used to get the geofence count by tenant id. + * @param tenantId tenant id. + * @return returns the geofence count of tenant. + * @throws DeviceManagementDAOException + */ + int getGeofenceCount(int tenantId) throws DeviceManagementDAOException; } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java index 4515dc8734..3f654e3be1 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java @@ -41,6 +41,10 @@ import org.apache.commons.logging.LogFactory; import java.sql.*; import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; +import java.util.Random; import java.util.*; public abstract class AbstractDeviceDAOImpl implements DeviceDAO { @@ -2145,7 +2149,7 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { } @Override - public void deleteDevices(List deviceIdentifiers, List deviceIds, List enrollmentIds) + public void deleteDevices(List deviceIdentifiers, List deviceIds, List enrollmentIds, List validDevices) throws DeviceManagementDAOException { Connection conn; try { @@ -2200,7 +2204,8 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { "operation response, enrollment operation mapping data of " + "devices with identifiers: " + deviceIdentifiers); } - removeDeviceEnrollment(conn, deviceIds); + refactorEnrolment(conn, deviceIds); + refactorDeviceStatus(conn, validDevices); if (log.isDebugEnabled()) { log.debug("Successfully removed device enrollment data of devices: " + deviceIdentifiers); } @@ -2208,7 +2213,7 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { if (log.isDebugEnabled()) { log.debug("Successfully removed device group mapping data of devices: " + deviceIdentifiers); } - removeDevice(conn, deviceIds); + refactorDevice(conn, deviceIds); if (log.isDebugEnabled()) { log.debug("Successfully permanently deleted the device of devices: " + deviceIdentifiers); } @@ -2739,30 +2744,6 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { } } - /*** - * This method removes records of a given list of enrollments from the DM_ENROLMENT table - * @param conn Connection object - * @param enrollmentIds list of enrollment ids (primary keys) - * @throws DeviceManagementDAOException if deletion fails - */ - private void removeDeviceEnrollment(Connection conn, List enrollmentIds) - throws DeviceManagementDAOException { - String sql = "DELETE FROM DM_ENROLMENT WHERE DEVICE_ID = ?"; - try { - if (!executeBatchOperation(conn, sql, enrollmentIds)) { - String msg = "Failed to remove enrollments of devices with enrollmentIds : " + enrollmentIds - + " while executing batch operation"; - log.error(msg); - throw new DeviceManagementDAOException(msg); - } - } catch (SQLException e) { - String msg = "SQL error occurred while removing enrollments of devices with enrollmentIds : " - + enrollmentIds; - log.error(msg, e); - throw new DeviceManagementDAOException(msg, e); - } - } - /*** * This method removes records of a given list of devices from the DM_DEVICE_GROUP_MAP table * @param conn Connection object @@ -2787,26 +2768,113 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { } /*** - * This method removes records of a given list of devices from the DM_DEVICE table + * This method refactors some attributes of a given list of devices which are being deleted by the user * @param conn Connection object * @param deviceIds list of device ids (primary keys) - * @throws DeviceManagementDAOException if deletion fails + * @throws DeviceManagementDAOException if refactoring fails */ - private void removeDevice(Connection conn, List deviceIds) throws DeviceManagementDAOException { - String sql = "DELETE FROM DM_DEVICE WHERE ID = ?"; - try { - if (!executeBatchOperation(conn, sql, deviceIds)) { - String msg = "Failed to remove devices with deviceIds : " + deviceIds + " while executing batch operation"; - log.error(msg); - throw new DeviceManagementDAOException(msg); + public void refactorDevice(Connection conn, List deviceIds) throws DeviceManagementDAOException { + String updateQuery = "UPDATE DM_DEVICE SET DEVICE_IDENTIFICATION = ?, NAME = ? WHERE ID = ?"; + + try (PreparedStatement preparedStatement = conn.prepareStatement(updateQuery)) { + for (int deviceId : deviceIds) { + + String randomIdentification = generateRandomString(10); + String randomName = generateRandomString(20); + + preparedStatement.setString(1, randomIdentification); + preparedStatement.setString(2, randomName); + preparedStatement.setInt(3, deviceId); + + preparedStatement.executeUpdate(); } + } catch (SQLException e) { - String msg = "SQL error occurred while removing devices with deviceIds : " + deviceIds; + String msg = "SQL error occurred while refactoring device properties of deviceIds: " + deviceIds; log.error(msg, e); throw new DeviceManagementDAOException(msg, e); } } + + /*** + * This method refactors some attributes of a given list of devices in the DM_ENROLMENT table + * @param conn Connection object + * @param deviceIds list of device ids (primary keys) + * @throws DeviceManagementDAOException if refactoring fails + */ + public void refactorEnrolment(Connection conn, List deviceIds) throws DeviceManagementDAOException { + String updateQuery = "UPDATE DM_ENROLMENT SET OWNER = ?, STATUS = ? WHERE DEVICE_ID = ?"; + + try (PreparedStatement preparedStatement = conn.prepareStatement(updateQuery)) { + for (int deviceId : deviceIds) { + + String randomOwner = generateRandomString(4); + + preparedStatement.setString(1, randomOwner); + preparedStatement.setString(2, String.valueOf(Status.DELETED)); + preparedStatement.setInt(3, deviceId); + + preparedStatement.executeUpdate(); + } + + } catch (SQLException e) { + String msg = "SQL error occurred while refactoring device enrolment properties of deviceIds: " + deviceIds; + log.error(msg, e); + throw new DeviceManagementDAOException(msg, e); + } + } + + /*** + * This method updates the status of a given list of devices to DELETED state in the DM_DEVICE_STATUS table + * @param conn Connection object + * @param validDevices list of devices + * @throws DeviceManagementDAOException if updating fails + */ + public void refactorDeviceStatus(Connection conn, List validDevices) throws DeviceManagementDAOException { + String updateQuery = "UPDATE DM_DEVICE_STATUS SET STATUS = ? WHERE ID = ?"; + String selectLastMatchingRecordQuery = "SELECT ID FROM DM_DEVICE_STATUS WHERE ENROLMENT_ID = ? AND DEVICE_ID = ? ORDER BY ID DESC LIMIT 1"; + + try (PreparedStatement selectStatement = conn.prepareStatement(selectLastMatchingRecordQuery); + PreparedStatement updateStatement = conn.prepareStatement(updateQuery)) { + + for (Device device : validDevices) { + + selectStatement.setInt(1, device.getEnrolmentInfo().getId()); + selectStatement.setInt(2, device.getId()); + + ResultSet resultSet = selectStatement.executeQuery(); + int lastRecordId = 0; + if (resultSet.next()) { + lastRecordId = resultSet.getInt("ID"); + } + + updateStatement.setString(1, String.valueOf(Status.DELETED)); + updateStatement.setInt(2, lastRecordId); + updateStatement.execute(); + } + + } catch (SQLException e) { + String msg = "SQL error occurred while updating device status properties."; + log.error(msg, e); + throw new DeviceManagementDAOException(msg, e); + } + } + + private String generateRandomString(int length) { + String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + StringBuilder randomString = new StringBuilder(); + + Random random = new Random(); + + for (int i = 0; i < length; i++) { + int index = random.nextInt(characters.length()); + randomString.append(characters.charAt(index)); + } + + return randomString.toString(); + } + /*** * This method executes batch operations for a given list of primary keys * where the statement only has one param of type int, following the given pattern: diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGeofenceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGeofenceDAOImpl.java index 2b52de02e0..ca73829320 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGeofenceDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGeofenceDAOImpl.java @@ -633,4 +633,28 @@ public abstract class AbstractGeofenceDAOImpl implements GeofenceDAO { throw new DeviceManagementDAOException(msg, e); } } + + @Override + public int getGeofenceCount(int tenantId) throws DeviceManagementDAOException { + try { + Connection conn = this.getConnection(); + String sql = "SELECT COUNT(*) AS geofence_count " + + "FROM DM_GEOFENCE " + + "WHERE TENANT_ID = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantId); + try (ResultSet rst = stmt.executeQuery()) { + if (rst.next()) { + return rst.getInt("geofence_count"); + } + } + } + return 0; // Return 0 if no records found for the given tenantId. + } catch (SQLException e) { + String msg = "Error occurred while retrieving Geofence count of the tenant " + tenantId; + log.error(msg, e); + throw new DeviceManagementDAOException(msg, e); + } + } + } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGroupDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGroupDAOImpl.java index 9a527cec08..17236e678f 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGroupDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGroupDAOImpl.java @@ -526,6 +526,14 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO { stmt.setInt(1, groupId); stmt.setInt(2, tenantId); stmt.executeUpdate(); + sql = "DELETE FROM DM_DEVICE_EVENT_GROUP_MAPPING WHERE GROUP_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, groupId); + stmt.executeUpdate(); + sql = "DELETE FROM DM_GEOFENCE_GROUP_MAPPING WHERE GROUP_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, groupId); + stmt.executeUpdate(); } catch (SQLException e) { throw new GroupManagementDAOException("Error occurred while removing mappings for group.'", e); } finally { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/ApplicationDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/ApplicationDAOImpl.java index 56ab396c4b..37c696f9fc 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/ApplicationDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/ApplicationDAOImpl.java @@ -292,11 +292,11 @@ public class ApplicationDAOImpl implements ApplicationDAO { "WHERE A.NAME = DM_APPLICATION.NAME " + "AND A.ID < DM_APPLICATION.ID) " + "AND PLATFORM = ? " + - "AND TENANT_ID = ?"; + "AND TENANT_ID = ? "; try { String filter = request.getFilter(); if (filter != null) { - sql = sql + "AND NAME LIKE ?"; + sql = sql + "AND NAME LIKE ? "; } sql = sql + "LIMIT ? OFFSET ?"; Connection conn = this.getConnection(); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/DeviceStatusDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/DeviceStatusDAOImpl.java index 8206a36066..5107002ddc 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/DeviceStatusDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/DeviceStatusDAOImpl.java @@ -53,7 +53,7 @@ public class DeviceStatusDAOImpl implements DeviceStatusDAO { } if (billingStatus) { - sql += " ORDER BY UPDATE_TIME DESC"; + sql += " ORDER BY ID DESC"; } stmt = conn.prepareStatement(sql); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java index 27a3bd1ecc..1fac9ae6ae 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringJoiner; +import java.util.Map; /** * This class holds the generic implementation of DeviceDAO which can be used to support ANSI db syntax. @@ -84,14 +85,40 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { "d.DEVICE_IDENTIFICATION, " + "t.NAME AS DEVICE_TYPE "; - if (serial != null) { - sql = sql + "FROM DM_DEVICE d, DM_DEVICE_TYPE t, DM_DEVICE_INFO i " + - "WHERE DEVICE_TYPE_ID = t.ID " + - "AND d.ID= i.DEVICE_ID " + - "AND i.KEY_FIELD = 'serial' " + - "AND i.VALUE_FIELD LIKE ? " + - "AND d.TENANT_ID = ? "; - isSerialProvided = true; + //Filter by serial number or any Custom Property in DM_DEVICE_INFO + if ((serial != null) || (request.getCustomProperty() != null && !request.getCustomProperty().isEmpty())) { + sql = sql + + "FROM DM_DEVICE d " + + "INNER JOIN DM_DEVICE_TYPE t ON d.DEVICE_TYPE_ID = t.ID " + + "WHERE "; + if (serial != null) { + sql += "EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d.ID " + + "AND di.KEY_FIELD = 'serial' " + + "AND di.VALUE_FIELD LIKE ? ) "; + isSerialProvided = true; + } + if (!request.getCustomProperty().isEmpty()) { + if (serial != null) { + sql += "AND "; + } + boolean firstCondition = true; + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + if (!firstCondition) { + sql += "AND "; + } + sql += "EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d.ID " + + "AND di.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di.VALUE_FIELD LIKE ? ) "; + firstCondition = false; + } + } + sql += "AND d.TENANT_ID = ? "; } else { sql = sql + "FROM DM_DEVICE d, DM_DEVICE_TYPE t WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? "; } @@ -135,6 +162,11 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { if (isSerialProvided) { stmt.setString(paramIdx++, "%" + serial + "%"); } + if (request.getCustomProperty() != null && !request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + stmt.setString(paramIdx++, "%" + entry.getValue() + "%"); + } + } stmt.setInt(paramIdx++, tenantId); if (isSinceProvided) { stmt.setTimestamp(paramIdx++, new Timestamp(since.getTime())); @@ -197,7 +229,7 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { "WHERE " + "e.TENANT_ID=? AND " + "d.ID=e.DEVICE_ID AND " + - "STATUS !='REMOVED' AND " + + "STATUS NOT IN ('REMOVED', 'DELETED') AND " + "(" + "DATE_OF_ENROLMENT BETWEEN ? AND ? " + ")"; @@ -236,7 +268,9 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { "from DM_DEVICE d, DM_ENROLMENT e " + "where " + "e.TENANT_ID=? and d.ID=e.DEVICE_ID and " + - "STATUS ='REMOVED' and " + + "(" + + "STATUS = 'REMOVED' OR STATUS = 'DELETED' " + + ") and " + "(" + "DATE_OF_ENROLMENT between ? and ? " + ") and " + @@ -279,7 +313,7 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { "where " + "e.TENANT_ID=? and " + "d.ID=e.DEVICE_ID and " + - "STATUS !='REMOVED' and " + + "STATUS NOT IN ('REMOVED', 'DELETED') and " + "(" + "DATE_OF_ENROLMENT < ? " + ")"; @@ -318,7 +352,9 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { "from DM_DEVICE d, DM_ENROLMENT e " + "where " + "e.TENANT_ID=? and d.ID=e.DEVICE_ID and " + - "STATUS ='REMOVED' and " + + "(" + + "STATUS = 'REMOVED' OR STATUS = 'DELETED' " + + ") and " + "(" + "DATE_OF_ENROLMENT < ? " + ") and " + @@ -616,6 +652,8 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { boolean isStatusProvided = false; Date since = request.getSince(); boolean isSinceProvided = false; + String serial = request.getSerialNumber(); + boolean isSerialProvided = false; try { Connection conn = getConnection(); @@ -684,6 +722,28 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { sql += buildStatusQuery(statusList); isStatusProvided = true; } + //Filter Group with serial number or any Custom Property in DM_DEVICE_INFO + if (serial != null || !request.getCustomProperty().isEmpty()) { + if (serial != null) { + sql += "AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d1.DEVICE_ID " + + "AND di.KEY_FIELD = 'serial' " + + "AND di.VALUE_FIELD LIKE ?) "; + isSerialProvided = true; + } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + sql += "AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di2 " + + "WHERE di2.DEVICE_ID = d1.DEVICE_ID " + + "AND di2.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di2.VALUE_FIELD LIKE ?)"; + } + } + } sql = sql + " LIMIT ?,?"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { @@ -713,6 +773,14 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { stmt.setString(paramIdx++, status); } } + if (isSerialProvided) { + stmt.setString(paramIdx++, "%" + serial + "%"); + } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + stmt.setString(paramIdx++, "%" + entry.getValue() + "%"); + } + } stmt.setInt(paramIdx++, request.getStartIndex()); stmt.setInt(paramIdx, request.getRowCount()); @@ -1242,6 +1310,17 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { query += buildStatusQuery(status); isStatusProvided = true; } + // Loop through custom properties and add conditions + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + query += " AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di2 " + + "WHERE di2.DEVICE_ID = DM_DEVICE.ID " + + "AND di2.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di2.VALUE_FIELD LIKE ?)"; + } + } query = query + " LIMIT ?,?"; @@ -1269,6 +1348,12 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { ps.setString(index++, deviceStatus); } } + // Set custom property values in the loop + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + ps.setString(index++, "%" + entry.getValue() + "%"); + } + } ps.setInt(index++, offsetValue); ps.setInt(index, limitValue); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java index 124039c057..7cfcd9946d 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringJoiner; +import java.util.Map; /** * This class holds the generic implementation of DeviceDAO which can be used to support ANSI db syntax. @@ -87,14 +88,40 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { "d.DEVICE_IDENTIFICATION, " + "t.NAME AS DEVICE_TYPE "; - if (serial != null) { - sql = sql + "FROM DM_DEVICE d, DM_DEVICE_TYPE t, DM_DEVICE_INFO i " + - "WHERE DEVICE_TYPE_ID = t.ID " + - "AND d.ID= i.DEVICE_ID " + - "AND i.KEY_FIELD = 'serial' " + - "AND i.VALUE_FIELD LIKE ? " + - "AND d.TENANT_ID = ? "; - isSerialProvided = true; + //Filter by serial number or any Custom Property in DM_DEVICE_INFO + if (serial != null || !request.getCustomProperty().isEmpty()) { + sql = sql + + "FROM DM_DEVICE d " + + "INNER JOIN DM_DEVICE_TYPE t ON d.DEVICE_TYPE_ID = t.ID " + + "WHERE "; + if (serial != null) { + sql += "EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d.ID " + + "AND di.KEY_FIELD = 'serial' " + + "AND di.VALUE_FIELD LIKE ? ) "; + isSerialProvided = true; + } + if (!request.getCustomProperty().isEmpty()) { + if (serial != null) { + sql += "AND "; + } + boolean firstCondition = true; + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + if (!firstCondition) { + sql += "AND "; + } + sql += "EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d.ID " + + "AND di.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di.VALUE_FIELD LIKE ? ) "; + firstCondition = false; + } + } + sql += "AND d.TENANT_ID = ? "; } else { sql = sql + "FROM DM_DEVICE d, DM_DEVICE_TYPE t WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? "; } @@ -138,6 +165,11 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { if (isSerialProvided) { stmt.setString(paramIdx++, "%" + serial + "%"); } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + stmt.setString(paramIdx++, "%" + entry.getValue() + "%"); + } + } stmt.setInt(paramIdx++, tenantId); if (isSinceProvided) { stmt.setTimestamp(paramIdx++, new Timestamp(since.getTime())); @@ -448,6 +480,8 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { boolean isStatusProvided = false; Date since = request.getSince(); boolean isSinceProvided = false; + String serial = request.getSerialNumber(); + boolean isSerialProvided = false; try { conn = getConnection(); @@ -516,6 +550,28 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { sql += buildStatusQuery(statusList); isStatusProvided = true; } + //Filter Group with serial number or any Custom Property in DM_DEVICE_INFO + if (serial != null || !request.getCustomProperty().isEmpty()) { + if (serial != null) { + sql += "AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d1.DEVICE_ID " + + "AND di.KEY_FIELD = 'serial' " + + "AND di.VALUE_FIELD LIKE ?) "; + isSerialProvided = true; + } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + sql += "AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di2 " + + "WHERE di2.DEVICE_ID = d1.DEVICE_ID " + + "AND di2.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di2.VALUE_FIELD LIKE ?)"; + } + } + } sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { @@ -545,6 +601,14 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { stmt.setString(paramIdx++, status); } } + if (isSerialProvided) { + stmt.setString(paramIdx++, "%" + serial + "%"); + } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + stmt.setString(paramIdx++, "%" + entry.getValue() + "%"); + } + } stmt.setInt(paramIdx++, request.getStartIndex()); stmt.setInt(paramIdx, request.getRowCount()); @@ -1029,6 +1093,17 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { query += buildStatusQuery(status); isStatusProvided = true; } + // Loop through custom properties and add conditions + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + query += " AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di2 " + + "WHERE di2.DEVICE_ID = DM_DEVICE.ID " + + "AND di2.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di2.VALUE_FIELD LIKE ?)"; + } + } query = query + " ORDER BY DM_DEVICE.ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; @@ -1053,6 +1128,12 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { ps.setString(index++, deviceStatus); } } + // Set custom property values in the loop + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + ps.setString(index++, "%" + entry.getValue() + "%"); + } + } ps.setInt(index++, offsetValue); ps.setInt(index, limitValue); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/PostgreSQLDeviceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/PostgreSQLDeviceDAOImpl.java index f1b0ec91bb..82e35a3842 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/PostgreSQLDeviceDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/PostgreSQLDeviceDAOImpl.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringJoiner; +import java.util.Map; /** * This class holds the generic implementation of DeviceDAO which can be used to support ANSI db syntax. @@ -86,14 +87,40 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { "d.DEVICE_IDENTIFICATION, " + "t.NAME AS DEVICE_TYPE "; - if (serial != null) { - sql = sql + "FROM DM_DEVICE d, DM_DEVICE_TYPE t, DM_DEVICE_INFO i " + - "WHERE DEVICE_TYPE_ID = t.ID " + - "AND d.ID= i.DEVICE_ID " + - "AND i.KEY_FIELD = 'serial' " + - "AND i.VALUE_FIELD LIKE ? " + - "AND d.TENANT_ID = ? "; - isSerialProvided = true; + //Filter by serial number or any Custom Property in DM_DEVICE_INFO + if (serial != null || !request.getCustomProperty().isEmpty()) { + sql = sql + + "FROM DM_DEVICE d " + + "INNER JOIN DM_DEVICE_TYPE t ON d.DEVICE_TYPE_ID = t.ID " + + "WHERE "; + if (serial != null) { + sql += "EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d.ID " + + "AND di.KEY_FIELD = 'serial' " + + "AND di.VALUE_FIELD LIKE ? ) "; + isSerialProvided = true; + } + if (!request.getCustomProperty().isEmpty()) { + if (serial != null) { + sql += "AND "; + } + boolean firstCondition = true; + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + if (!firstCondition) { + sql += "AND "; + } + sql += "EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d.ID " + + "AND di.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di.VALUE_FIELD LIKE ? ) "; + firstCondition = false; + } + } + sql += "AND d.TENANT_ID = ? "; } else { sql = sql + "FROM DM_DEVICE d, DM_DEVICE_TYPE t WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? "; } @@ -132,6 +159,11 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { if (isSerialProvided) { stmt.setString(paramIdx++, "%" + serial + "%"); } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + stmt.setString(paramIdx++, "%" + entry.getValue() + "%"); + } + } stmt.setInt(paramIdx++, tenantId); if (isDeviceTypeProvided) { stmt.setString(paramIdx++, deviceType); @@ -429,6 +461,8 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { boolean isStatusProvided = false; Date since = request.getSince(); boolean isSinceProvided = false; + String serial = request.getSerialNumber(); + boolean isSerialProvided = false; try { conn = getConnection(); @@ -496,6 +530,28 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { sql += buildStatusQuery(statusList); isStatusProvided = true; } + //Filter Group with serial number or any Custom Property in DM_DEVICE_INFO + if (serial != null || !request.getCustomProperty().isEmpty()) { + if (serial != null) { + sql += "AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d1.DEVICE_ID " + + "AND di.KEY_FIELD = 'serial' " + + "AND di.VALUE_FIELD LIKE ?) "; + isSerialProvided = true; + } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + sql += "AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di2 " + + "WHERE di2.DEVICE_ID = d1.DEVICE_ID " + + "AND di2.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di2.VALUE_FIELD LIKE ?)"; + } + } + } sql = sql + " LIMIT ? OFFSET ?"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { @@ -525,6 +581,14 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { stmt.setString(paramIdx++, status); } } + if (isSerialProvided) { + stmt.setString(paramIdx++, "%" + serial + "%"); + } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + stmt.setString(paramIdx++, "%" + entry.getValue() + "%"); + } + } stmt.setInt(paramIdx++, request.getRowCount()); stmt.setInt(paramIdx, request.getStartIndex()); @@ -1008,6 +1072,17 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { query += buildStatusQuery(status); isStatusProvided = true; } + // Loop through custom properties and add conditions + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + query += " AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di2 " + + "WHERE di2.DEVICE_ID = DM_DEVICE.ID " + + "AND di2.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di2.VALUE_FIELD LIKE ?)"; + } + } query = query + " LIMIT ? OFFSET ?"; @@ -1032,6 +1107,12 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { ps.setString(index++, deviceStatus); } } + // Set custom property values in the loop + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + ps.setString(index++, "%" + entry.getValue() + "%"); + } + } ps.setInt(index++, offsetValue); ps.setInt(index, limitValue); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java index 1cbf9fe4d8..a09f74a354 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringJoiner; +import java.util.Map; /** * This class holds the generic implementation of DeviceDAO which can be used to support ANSI db syntax. @@ -87,14 +88,40 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { "d.DEVICE_IDENTIFICATION, " + "t.NAME AS DEVICE_TYPE "; - if (serial != null) { - sql = sql + "FROM DM_DEVICE d, DM_DEVICE_TYPE t, DM_DEVICE_INFO i " + - "WHERE DEVICE_TYPE_ID = t.ID " + - "AND d.ID= i.DEVICE_ID " + - "AND i.KEY_FIELD = 'serial' " + - "AND i.VALUE_FIELD LIKE ? " + - "AND d.TENANT_ID = ? "; - isSerialProvided = true; + //Filter by serial number or any Custom Property in DM_DEVICE_INFO + if (serial != null || !request.getCustomProperty().isEmpty()) { + sql = sql + + "FROM DM_DEVICE d " + + "INNER JOIN DM_DEVICE_TYPE t ON d.DEVICE_TYPE_ID = t.ID " + + "WHERE "; + if (serial != null) { + sql += "EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d.ID " + + "AND di.KEY_FIELD = 'serial' " + + "AND di.VALUE_FIELD LIKE ? ) "; + isSerialProvided = true; + } + if (!request.getCustomProperty().isEmpty()) { + if (serial != null) { + sql += "AND "; + } + boolean firstCondition = true; + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + if (!firstCondition) { + sql += "AND "; + } + sql += "EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d.ID " + + "AND di.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di.VALUE_FIELD LIKE ? ) "; + firstCondition = false; + } + } + sql += "AND d.TENANT_ID = ? "; } else { sql = sql + "FROM DM_DEVICE d, DM_DEVICE_TYPE t WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? "; } @@ -138,6 +165,11 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { if (isSerialProvided) { stmt.setString(paramIdx++, "%" + serial + "%"); } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + stmt.setString(paramIdx++, "%" + entry.getValue() + "%"); + } + } stmt.setInt(paramIdx++, tenantId); if (isSinceProvided) { stmt.setTimestamp(paramIdx++, new Timestamp(since.getTime())); @@ -448,6 +480,8 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { boolean isStatusProvided = false; Date since = request.getSince(); boolean isSinceProvided = false; + String serial = request.getSerialNumber(); + boolean isSerialProvided = false; try { conn = getConnection(); @@ -515,6 +549,28 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { sql += buildStatusQuery(statusList); isStatusProvided = true; } + //Filter Group with serial number or any Custom Property in DM_DEVICE_INFO + if (serial != null || !request.getCustomProperty().isEmpty()) { + if (serial != null) { + sql += "AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di " + + "WHERE di.DEVICE_ID = d1.DEVICE_ID " + + "AND di.KEY_FIELD = 'serial' " + + "AND di.VALUE_FIELD LIKE ?) "; + isSerialProvided = true; + } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + sql += "AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di2 " + + "WHERE di2.DEVICE_ID = d1.DEVICE_ID " + + "AND di2.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di2.VALUE_FIELD LIKE ?)"; + } + } + } sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { @@ -544,6 +600,14 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { stmt.setString(paramIdx++, status); } } + if (isSerialProvided) { + stmt.setString(paramIdx++, "%" + serial + "%"); + } + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + stmt.setString(paramIdx++, "%" + entry.getValue() + "%"); + } + } stmt.setInt(paramIdx++, request.getStartIndex()); stmt.setInt(paramIdx, request.getRowCount()); @@ -876,6 +940,17 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { query += buildStatusQuery(status); isStatusProvided = true; } + // Loop through custom properties and add conditions + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + query += " AND EXISTS (" + + "SELECT VALUE_FIELD " + + "FROM DM_DEVICE_INFO di2 " + + "WHERE di2.DEVICE_ID = DM_DEVICE.ID " + + "AND di2.KEY_FIELD = '" + entry.getKey() + "' " + + "AND di2.VALUE_FIELD LIKE ?)"; + } + } query = query + " ORDER BY DM_DEVICE.ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; @@ -900,6 +975,12 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { ps.setString(index++, deviceStatus); } } + // Set custom property values in the loop + if (!request.getCustomProperty().isEmpty()) { + for (Map.Entry entry : request.getCustomProperty().entrySet()) { + ps.setString(index++, "%" + entry.getValue() + "%"); + } + } ps.setInt(index++, offsetValue); ps.setInt(index, limitValue); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/group/SQLServerGroupDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/group/SQLServerGroupDAOImpl.java index b54d0e3ea4..2b68c264cf 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/group/SQLServerGroupDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/group/SQLServerGroupDAOImpl.java @@ -57,7 +57,7 @@ public class SQLServerGroupDAOImpl extends AbstractGroupDAOImpl { try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP " + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP " + "WHERE TENANT_ID = ?"; if (groupName != null && !groupName.isEmpty()) { sql += " AND GROUP_NAME LIKE ?"; @@ -129,7 +129,7 @@ public class SQLServerGroupDAOImpl extends AbstractGroupDAOImpl { try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP " + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP " + "WHERE TENANT_ID = ?"; if (groupName != null && !groupName.isEmpty()) { sql += " AND GROUP_NAME LIKE ?"; diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java index c7f56174e5..c048bd4422 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java @@ -18,6 +18,11 @@ package io.entgra.device.mgt.core.device.mgt.core.device.details.mgt.impl; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.CarbonContext; +import io.entgra.device.mgt.core.device.mgt.common.authorization.DeviceAccessAuthorizationException; import io.entgra.device.mgt.core.device.mgt.common.Device; import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; import io.entgra.device.mgt.core.device.mgt.common.device.details.DeviceDetailsWrapper; @@ -41,10 +46,6 @@ import io.entgra.device.mgt.core.device.mgt.core.report.mgt.Constants; import io.entgra.device.mgt.core.device.mgt.core.service.GroupManagementProviderService; import io.entgra.device.mgt.core.device.mgt.core.util.DeviceManagerUtil; import io.entgra.device.mgt.core.device.mgt.core.util.HttpReportingUtil; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.user.api.UserStoreException; import java.sql.SQLException; @@ -232,9 +233,19 @@ public class DeviceInformationManagerImpl implements DeviceInformationManager { deviceDetailsWrapper.setGroups(groups); } - String[] rolesOfUser = DeviceManagerUtil.getRolesOfUser(CarbonContext - .getThreadLocalCarbonContext() - .getUsername()); + String username = CarbonContext.getThreadLocalCarbonContext().getUsername(); + if (StringUtils.isEmpty(username)) { + boolean isUserAuthorized = DeviceManagementDataHolder.getInstance(). + getDeviceAccessAuthorizationService().isUserAuthorized( + new DeviceIdentifier(device.getDeviceIdentifier(), device.getType()), + device.getEnrolmentInfo().getOwner() + ); + if (isUserAuthorized) { + username = device.getEnrolmentInfo().getOwner(); + } + } + + String[] rolesOfUser = DeviceManagerUtil.getRolesOfUser(username); if (rolesOfUser != null && rolesOfUser.length > 0) { deviceDetailsWrapper.setRole(rolesOfUser); } @@ -248,6 +259,10 @@ public class DeviceInformationManagerImpl implements DeviceInformationManager { log.error("Error occurred while getting group list", e); } catch (UserStoreException e) { log.error("Error occurred while getting role list", e); + } catch (DeviceAccessAuthorizationException e) { + log.error("User with name '" + device.getEnrolmentInfo().getOwner() + + "' is unauthorized to publish events for device with the id '" + + device.getDeviceIdentifier() + "'", e); } } else { if(log.isTraceEnabled()) { @@ -363,13 +378,6 @@ public class DeviceInformationManagerImpl implements DeviceInformationManager { DeviceManagementDAOFactory.beginTransaction(); DeviceLocation previousLocation = deviceDetailsDAO.getDeviceLocation(device.getId(), device.getEnrolmentInfo().getId()); - if (previousLocation == null) { - deviceDetailsDAO.addDeviceLocation(deviceLocation, device.getEnrolmentInfo().getId()); - } else { - deviceDetailsDAO.updateDeviceLocation(deviceLocation, device.getEnrolmentInfo().getId()); - } - deviceDetailsDAO.addDeviceLocationInfo(device, deviceLocation, - CarbonContext.getThreadLocalCarbonContext().getTenantId()); if (DeviceManagerUtil.isPublishLocationResponseEnabled()) { Object[] metaData = {device.getDeviceIdentifier(), device.getEnrolmentInfo().getOwner(), device.getType()}; Object[] payload = new Object[]{ @@ -382,11 +390,17 @@ public class DeviceInformationManagerImpl implements DeviceInformationManager { deviceLocation.getDistance() }; } - //Tracker update GPS Location if (HttpReportingUtil.isLocationPublishing() && HttpReportingUtil.isTrackerEnabled()) { DeviceManagementDataHolder.getInstance().getTraccarManagementService().updateLocation(device, deviceLocation); } else { + if (previousLocation == null) { + deviceDetailsDAO.addDeviceLocation(deviceLocation, device.getEnrolmentInfo().getId()); + } else { + deviceDetailsDAO.updateDeviceLocation(deviceLocation, device.getEnrolmentInfo().getId()); + } + deviceDetailsDAO.addDeviceLocationInfo(device, deviceLocation, + CarbonContext.getThreadLocalCarbonContext().getTenantId()); if(!HttpReportingUtil.isLocationPublishing()) { if (log.isDebugEnabled()) { log.debug("Location publishing is disabled"); @@ -453,29 +467,29 @@ public class DeviceInformationManagerImpl implements DeviceInformationManager { DeviceManagementDAOFactory.beginTransaction(); boolean previousLocation = deviceDetailsDAO.hasLocations(device.getId(), device.getEnrolmentInfo().getId()); - if (previousLocation) { - deviceDetailsDAO.updateDeviceLocation(mostRecentDeviceLocation, device.getEnrolmentInfo().getId()); - } else { - deviceDetailsDAO.addDeviceLocation(mostRecentDeviceLocation, device.getEnrolmentInfo().getId()); - } - - deviceDetailsDAO.addDeviceLocationsInfo(device, deviceLocations, - CarbonContext.getThreadLocalCarbonContext().getTenantId()); - - for (DeviceLocation deviceLocation: deviceLocations) { - //Tracker update GPS Location - if (HttpReportingUtil.isLocationPublishing() && HttpReportingUtil.isTrackerEnabled()) { - DeviceManagementDataHolder.getInstance().getTraccarManagementService().updateLocation(device, deviceLocation); + if(!HttpReportingUtil.isTrackerEnabled()) { + if (previousLocation) { + deviceDetailsDAO.updateDeviceLocation(mostRecentDeviceLocation, device.getEnrolmentInfo().getId()); } else { - if(!HttpReportingUtil.isLocationPublishing()) { - if (log.isDebugEnabled()) { - log.debug("Location publishing is disabled"); - } + deviceDetailsDAO.addDeviceLocation(mostRecentDeviceLocation, device.getEnrolmentInfo().getId()); + } + deviceDetailsDAO.addDeviceLocationsInfo(device, deviceLocations, + CarbonContext.getThreadLocalCarbonContext().getTenantId()); + } + if (HttpReportingUtil.isLocationPublishing() && HttpReportingUtil.isTrackerEnabled()) { + for (DeviceLocation deviceLocation: deviceLocations) { + //Tracker update GPS Location + DeviceManagementDataHolder.getInstance().getTraccarManagementService().updateLocation(device, deviceLocation); + } + } else { + if(!HttpReportingUtil.isLocationPublishing()) { + if (log.isDebugEnabled()) { + log.debug("Location publishing is disabled"); } - if (!HttpReportingUtil.isTrackerEnabled()) { - if (log.isDebugEnabled()) { - log.debug("Traccar is disabled"); - } + } + if (!HttpReportingUtil.isTrackerEnabled()) { + if (log.isDebugEnabled()) { + log.debug("Traccar is disabled"); } } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java index eca73e2fc6..7b846ebe1e 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java @@ -1731,6 +1731,32 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } } + @Override + public int getGeoFenceCount() throws GeoLocationBasedServiceException { + int tenantId; + try { + tenantId = DeviceManagementDAOUtil.getTenantId(); + } catch (DeviceManagementDAOException e) { + String msg = "Error occurred while retrieving tenant id while get geofence data"; + log.error(msg, e); + throw new GeoLocationBasedServiceException(msg, e); + } + try { + EventManagementDAOFactory.openConnection(); + return geofenceDAO.getGeofenceCount(tenantId); + } catch (DeviceManagementDAOException e) { + String msg = "Error occurred while retrieving geofence data for the tenant " + tenantId; + log.error(msg, e); + throw new GeoLocationBasedServiceException(msg, e); + } catch (SQLException e) { + String msg = "Failed to open the DB connection to retrieve Geofence"; + log.error(msg, e); + throw new GeoLocationBasedServiceException(msg, e); + } finally { + EventManagementDAOFactory.closeConnection(); + } + } + /** * Delete events of geofence * diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/OperationManagerImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/OperationManagerImpl.java index 23df34f871..f7752d30dc 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/OperationManagerImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/OperationManagerImpl.java @@ -32,6 +32,17 @@ import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementEx import io.entgra.device.mgt.core.device.mgt.common.exceptions.InvalidDeviceException; import io.entgra.device.mgt.core.device.mgt.common.exceptions.TransactionManagementException; import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupConstants; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.DeviceActivity; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.ActivityStatus; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Operation; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationManagementException; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationManager; +import io.entgra.device.mgt.core.device.mgt.common.push.notification.NotificationContext; +import io.entgra.device.mgt.core.device.mgt.common.push.notification.NotificationStrategy; +import io.entgra.device.mgt.core.device.mgt.common.push.notification.PushNotificationConfig; +import io.entgra.device.mgt.core.device.mgt.common.push.notification.PushNotificationExecutionFailedException; +import io.entgra.device.mgt.core.device.mgt.common.push.notification.PushNotificationProvider; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.*; import io.entgra.device.mgt.core.device.mgt.common.push.notification.*; import io.entgra.device.mgt.core.device.mgt.common.spi.DeviceManagementService; @@ -1300,6 +1311,36 @@ public class OperationManagerImpl implements OperationManager { } } + @Override + public List getDeviceActivities(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementException { + try { + OperationManagementDAOFactory.openConnection(); + return operationDAO.getDeviceActivities(activityPaginationRequest); + } catch (SQLException e) { + throw new OperationManagementException("Error occurred while opening a connection to the data source.", e); + } catch (OperationManagementDAOException e) { + throw new OperationManagementException("Error occurred while getting the device activity list.", e); + } finally { + OperationManagementDAOFactory.closeConnection(); + } + } + + @Override + public int getDeviceActivitiesCount(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementException { + try { + OperationManagementDAOFactory.openConnection(); + return operationDAO.getDeviceActivitiesCount(activityPaginationRequest); + } catch (SQLException e) { + throw new OperationManagementException("Error occurred while opening a connection to the data source.", e); + } catch (OperationManagementDAOException e) { + throw new OperationManagementException("Error occurred while getting the device activity count.", e); + } finally { + OperationManagementDAOFactory.closeConnection(); + } + } + @Override public List getFilteredActivities(String operationCode, int limit, int offset) throws OperationManagementException { try { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/OperationDAO.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/OperationDAO.java index 9d3de1494e..4fe22494c6 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/OperationDAO.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/OperationDAO.java @@ -22,6 +22,7 @@ import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationResponse; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.DeviceActivity; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.Operation; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.OperationResponseMeta; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.OperationMapping; @@ -105,6 +106,10 @@ public interface OperationDAO { Map> getOperationMappingsByStatus(Operation.Status opStatus, Operation.PushNotificationStatus pushNotificationStatus, int limit) throws OperationManagementDAOException; + Map> getAllocatedOperationMappingsByStatus(Operation.Status opStatus, + Operation.PushNotificationStatus pushNotificationStatus, int limit, int activeServerCount, int serverIndex) + throws OperationManagementDAOException; + List getActivities(List deviceTypes, String operationCode, long updatedSince, String operationStatus) throws OperationManagementDAOException; @@ -114,4 +119,9 @@ public interface OperationDAO { int getActivitiesCount(ActivityPaginationRequest activityPaginationRequest) throws OperationManagementDAOException; + List getDeviceActivities(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementDAOException; + + int getDeviceActivitiesCount(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementDAOException; } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java index 826fde0d1f..f47f796674 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java @@ -18,14 +18,15 @@ package io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.impl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import io.entgra.device.mgt.core.device.mgt.core.dao.util.DeviceManagementDAOUtil; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.CommandOperation; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.Operation; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOException; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import java.sql.Connection; import java.sql.PreparedStatement; @@ -44,7 +45,7 @@ public class CommandOperationDAOImpl extends GenericOperationDAOImpl { try { Connection connection = OperationManagementDAOFactory.getConnection(); String sql = "INSERT INTO DM_OPERATION(TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, " + - "INITIATED_BY, ENABLED) VALUES (?, ?, ?, ?, ?, ?)"; + "INITIATED_BY, ENABLED, TENANT_ID) VALUES (?, ?, ?, ?, ?, ?, ?)"; stmt = connection.prepareStatement(sql, new String[]{"id"}); stmt.setString(1, operation.getType().toString()); stmt.setLong(2, DeviceManagementDAOUtil.getCurrentUTCTime()); @@ -52,6 +53,7 @@ public class CommandOperationDAOImpl extends GenericOperationDAOImpl { stmt.setString(4, operation.getCode()); stmt.setString(5, operation.getInitiatedBy()); stmt.setBoolean(6, operation.isEnabled()); + stmt.setInt(7, PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId()); stmt.executeUpdate(); rs = stmt.getGeneratedKeys(); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/ConfigOperationDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/ConfigOperationDAOImpl.java index 2817d192ab..d493a9ef9d 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/ConfigOperationDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/ConfigOperationDAOImpl.java @@ -18,14 +18,15 @@ package io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.impl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import io.entgra.device.mgt.core.device.mgt.core.dao.util.DeviceManagementDAOUtil; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.ConfigOperation; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.Operation; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOException; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -47,7 +48,7 @@ public class ConfigOperationDAOImpl extends GenericOperationDAOImpl { operation.setCreatedTimeStamp(new Timestamp(new Date().getTime()).toString()); Connection connection = OperationManagementDAOFactory.getConnection(); String sql = "INSERT INTO DM_OPERATION(TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, " + - "INITIATED_BY, OPERATION_DETAILS) VALUES (?, ?, ?, ?, ?, ?)"; + "INITIATED_BY, OPERATION_DETAILS, TENANT_ID) VALUES (?, ?, ?, ?, ?, ?, ?)"; stmt = connection.prepareStatement(sql, new String[]{"id"}); stmt.setString(1, operation.getType().toString()); stmt.setLong(2, DeviceManagementDAOUtil.getCurrentUTCTime()); @@ -55,6 +56,7 @@ public class ConfigOperationDAOImpl extends GenericOperationDAOImpl { stmt.setString(4, operation.getCode()); stmt.setString(5, operation.getInitiatedBy()); stmt.setObject(6, operation); + stmt.setInt(7, PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId()); stmt.executeUpdate(); rs = stmt.getGeneratedKeys(); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java index 45283118c1..afde6acc6a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java @@ -17,10 +17,16 @@ */ package io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.impl; +import io.entgra.device.mgt.core.device.mgt.common.MDMAppConstants; +import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.ProfileOperation; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import io.entgra.device.mgt.core.device.mgt.common.ActivityPaginationRequest; import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.DeviceActivity; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.ActivityHolder; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.ActivityStatus; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationResponse; @@ -34,14 +40,17 @@ import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationMana import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.util.OperationDAOUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.context.PrivilegedCarbonContext; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; -import java.sql.*; +import java.io.ObjectInputStream; +import java.io.ByteArrayInputStream; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -62,7 +71,7 @@ public class GenericOperationDAOImpl implements OperationDAO { try { Connection connection = OperationManagementDAOFactory.getConnection(); String sql = "INSERT INTO DM_OPERATION(TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, " + - "INITIATED_BY, OPERATION_DETAILS) VALUES (?, ?, ?, ?, ?, ?)"; + "INITIATED_BY, OPERATION_DETAILS, TENANT_ID) VALUES (?, ?, ?, ?, ?, ?, ?)"; stmt = connection.prepareStatement(sql, new String[]{"id"}); stmt.setString(1, operation.getType().toString()); stmt.setLong(2, DeviceManagementDAOUtil.getCurrentUTCTime()); @@ -70,6 +79,7 @@ public class GenericOperationDAOImpl implements OperationDAO { stmt.setString(4, operation.getCode()); stmt.setString(5, operation.getInitiatedBy()); stmt.setObject(6, operation); + stmt.setInt(7, PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId()); stmt.executeUpdate(); rs = stmt.getGeneratedKeys(); @@ -386,6 +396,51 @@ public class GenericOperationDAOImpl implements OperationDAO { } } + public OperationResponse populateResponse(ResultSet rs) throws SQLException { + OperationResponse response = new OperationResponse(); + + DeviceActivity deviceActivity = new DeviceActivity(); + int responseId = 0; + List operationResponses = new ArrayList<>(); + List largeResponseIDs = new ArrayList<>(); + + if (rs.getTimestamp("RECEIVED_TIMESTAMP") != null) { + Timestamp receivedTimestamp = rs.getTimestamp("RECEIVED_TIMESTAMP"); + response.setReceivedTimeStamp(new Date(receivedTimestamp.getTime()).toString()); + } + response.setResponse(rs.getString("OPERATION_RESPONSE")); + + int deviceOpId = rs.getInt("OPERATION_ID"); + String deviceActivityId = DeviceManagementConstants.OperationAttributes.ACTIVITY + deviceOpId; + String deviceIdentifierId = rs.getString("DEVICE_IDENTIFICATION"); + + if (rs.getInt("UPDATED_TIMESTAMP") != 0) { + responseId = rs.getInt("OP_RES_ID"); + if (rs.getBoolean("IS_LARGE_RESPONSE")) { + largeResponseIDs.add(responseId); + } else { + deviceActivity.setResponses(operationResponses); + } + } + if (!largeResponseIDs.isEmpty()) { + Map>> largeOperationResponses = null; + try { + largeOperationResponses = getLargeOperationResponsesInBulk(largeResponseIDs); + if (!largeOperationResponses.isEmpty()) { + Map> largeResponse = largeOperationResponses.get(deviceActivityId); + if (largeResponse != null) { + response = largeResponse.get(deviceIdentifierId).get(0); + } + } + } catch (OperationManagementDAOException e) { + log.warn("Unable to get operation response for Operation ID: " + deviceOpId + + ", Error: " + e.getErrorMessage()); + } + } + + return response; + } + @Override public Activity getActivity(int operationId) throws OperationManagementDAOException { @@ -1345,6 +1400,7 @@ public class GenericOperationDAOImpl implements OperationDAO { List operations = new ArrayList<>(); String createdTo = null; String createdFrom = null; + ProfileOperation profileOperation = null; DateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); boolean isCreatedDayProvided = false; boolean isUpdatedDayProvided = false; //updated day = received day @@ -1367,6 +1423,7 @@ public class GenericOperationDAOImpl implements OperationDAO { "o.RECEIVED_TIMESTAMP, " + "o.OPERATION_CODE, " + "o.INITIATED_BY, " + + "o.OPERATION_DETAILS, " + "om.STATUS, " + "om.ID AS OM_MAPPING_ID, " + "om.UPDATED_TIMESTAMP " + @@ -1465,6 +1522,22 @@ public class GenericOperationDAOImpl implements OperationDAO { } operation.setCode(rs.getString("OPERATION_CODE")); operation.setInitiatedBy(rs.getString("INITIATED_BY")); + if (MDMAppConstants.AndroidConstants.UNMANAGED_APP_UNINSTALL.equals(operation.getCode())) { + byte[] operationDetails = rs.getBytes("OPERATION_DETAILS"); + try (ByteArrayInputStream bais = new ByteArrayInputStream(operationDetails); + ObjectInputStream ois = new ObjectInputStream(bais)) { + profileOperation = (ProfileOperation) ois.readObject(); + operation.setPayLoad(profileOperation.getPayLoad()); + } catch (IOException e) { + String msg = "IO Error occurred while retrieving app data of operation "; + log.error(msg, e); + throw new OperationManagementDAOException(msg, e); + } catch (ClassNotFoundException e) { + String msg = "Class not found error occurred while retrieving app data of operation "; + log.error(msg, e); + throw new OperationManagementDAOException(msg, e); + } + } operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); OperationDAOUtil.setActivityId(operation, rs.getInt("ID")); operations.add(operation); @@ -1485,6 +1558,7 @@ public class GenericOperationDAOImpl implements OperationDAO { List operations = new ArrayList<>(); String createdTo = null; String createdFrom = null; + ProfileOperation profileOperation = null; DateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); boolean isCreatedDayProvided = false; boolean isUpdatedDayProvided = false; //updated day = received day @@ -1507,6 +1581,7 @@ public class GenericOperationDAOImpl implements OperationDAO { "o.RECEIVED_TIMESTAMP, " + "o.OPERATION_CODE, " + "o.INITIATED_BY, " + + "o.OPERATION_DETAILS, " + "om.STATUS, " + "om.ID AS OM_MAPPING_ID, " + "om.UPDATED_TIMESTAMP " + @@ -1605,6 +1680,22 @@ public class GenericOperationDAOImpl implements OperationDAO { } operation.setCode(rs.getString("OPERATION_CODE")); operation.setInitiatedBy(rs.getString("INITIATED_BY")); + if (MDMAppConstants.AndroidConstants.UNMANAGED_APP_UNINSTALL.equals(operation.getCode())) { + byte[] operationDetails = rs.getBytes("OPERATION_DETAILS"); + try (ByteArrayInputStream bais = new ByteArrayInputStream(operationDetails); + ObjectInputStream ois = new ObjectInputStream(bais)) { + profileOperation = (ProfileOperation) ois.readObject(); + operation.setPayLoad(profileOperation.getPayLoad()); + } catch (IOException e) { + String msg = "IO Error occurred while retrieving app data of operation "; + log.error(msg, e); + throw new OperationManagementDAOException(msg, e); + } catch (ClassNotFoundException e) { + String msg = "Class not found error occurred while retrieving app data of operation "; + log.error(msg, e); + throw new OperationManagementDAOException(msg, e); + } + } operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); OperationDAOUtil.setActivityId(operation, rs.getInt("ID")); operations.add(operation); @@ -1962,6 +2053,54 @@ public class GenericOperationDAOImpl implements OperationDAO { return operationMappingsTenantMap; } + @Override + public Map> getAllocatedOperationMappingsByStatus(Operation.Status opStatus, + Operation.PushNotificationStatus pushNotificationStatus, int limit, int activeServerCount, int serverIndex) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Connection conn; + OperationMapping operationMapping; + Map> operationMappingsTenantMap = new HashMap<>(); + try { + conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT op.ENROLMENT_ID, op.OPERATION_ID, d.DEVICE_IDENTIFICATION, dt.NAME as DEVICE_TYPE, " + + "d.TENANT_ID FROM DM_DEVICE d, DM_ENROLMENT_OP_MAPPING op, DM_DEVICE_TYPE dt WHERE op.STATUS = ?" + + " AND op.PUSH_NOTIFICATION_STATUS = ? AND d.DEVICE_TYPE_ID = dt.ID AND d.ID=op.ENROLMENT_ID AND MOD(d.ID, ?) = ? ORDER" + + " BY op.OPERATION_ID LIMIT ?"; + stmt = conn.prepareStatement(sql); + stmt.setString(1, opStatus.toString()); + stmt.setString(2, pushNotificationStatus.toString()); + stmt.setInt(3, activeServerCount); + stmt.setInt(4, serverIndex); + stmt.setInt(5, limit); + rs = stmt.executeQuery(); + while (rs.next()) { + int tenantID = rs.getInt("TENANT_ID"); + List operationMappings = operationMappingsTenantMap.get(tenantID); + if (operationMappings == null) { + operationMappings = new LinkedList<>(); + operationMappingsTenantMap.put(tenantID, operationMappings); + } + operationMapping = new OperationMapping(); + operationMapping.setOperationId(rs.getInt("OPERATION_ID")); + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(rs.getString("DEVICE_IDENTIFICATION")); + deviceIdentifier.setType(rs.getString("DEVICE_TYPE")); + operationMapping.setDeviceIdentifier(deviceIdentifier); + operationMapping.setEnrollmentId(rs.getInt("ENROLMENT_ID")); + operationMapping.setTenantId(tenantID); + operationMappings.add(operationMapping); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error while getting operation mappings from database. " + + e.getMessage(), e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operationMappingsTenantMap; + } + public List getActivities(List deviceTypes, String operationCode, long updatedSince, String operationStatus) throws OperationManagementDAOException { @@ -2124,41 +2263,70 @@ public class GenericOperationDAOImpl implements OperationDAO { " DM_ENROLMENT_OP_MAPPING eom " + "LEFT JOIN " + " DM_DEVICE_OPERATION_RESPONSE opr ON opr.EN_OP_MAP_ID = eom.ID " + - "INNER JOIN " + - " (SELECT DISTINCT OPERATION_ID FROM DM_ENROLMENT_OP_MAPPING WHERE TENANT_ID = ? "); + "INNER JOIN "); - if (activityPaginationRequest.getDeviceType() != null) { - sql.append("AND DEVICE_TYPE = ? "); - } - if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { - sql.append("AND DEVICE_IDENTIFICATION IN ("); - for (int i = 0; i < activityPaginationRequest.getDeviceIds().size() - 1; i++) { - sql.append("?, "); + if (activityPaginationRequest.getDeviceType() != null || + (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) || + activityPaginationRequest.getSince() != 0 || + activityPaginationRequest.getStatus() != null) { + + sql.append("(SELECT DISTINCT OPERATION_ID FROM DM_ENROLMENT_OP_MAPPING eom WHERE TENANT_ID = ? "); + + if (activityPaginationRequest.getDeviceType() != null) { + sql.append("AND DEVICE_TYPE = ? "); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + sql.append("AND eom.DEVICE_IDENTIFICATION IN ("); + for (int i = 0; i < activityPaginationRequest.getDeviceIds().size() - 1; i++) { + sql.append("?, "); + } + sql.append("?) "); + } + if (activityPaginationRequest.getOperationId() > 0) { + sql.append("AND OPERATION_ID = ? "); + } + if (activityPaginationRequest.getOperationCode() != null) { + sql.append("AND OPERATION_CODE = ? "); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + sql.append("AND INITIATED_BY = ? "); + } + if (activityPaginationRequest.getSince() != 0) { + sql.append("AND UPDATED_TIMESTAMP > ? "); + } + if (activityPaginationRequest.getStartTimestamp() > 0 && activityPaginationRequest.getEndTimestamp() > 0) { + isTimeDurationFilteringProvided = true; + sql.append("AND CREATED_TIMESTAMP BETWEEN ? AND ? "); + } + if (activityPaginationRequest.getType() != null) { + sql.append("AND TYPE = ? "); + } + if (activityPaginationRequest.getStatus() != null) { + sql.append("AND STATUS = ? "); } - sql.append("?) "); - } - if (activityPaginationRequest.getOperationCode() != null) { - sql.append("AND OPERATION_CODE = ? "); - } - if (activityPaginationRequest.getInitiatedBy() != null) { - sql.append("AND INITIATED_BY = ? "); - } - if (activityPaginationRequest.getSince() != 0) { - sql.append("AND UPDATED_TIMESTAMP > ? "); - } - if (activityPaginationRequest.getStartTimestamp() > 0 && activityPaginationRequest.getEndTimestamp() > 0) { - isTimeDurationFilteringProvided = true; - sql.append("AND CREATED_TIMESTAMP BETWEEN ? AND ? "); - } - if (activityPaginationRequest.getType() != null) { - sql.append("AND TYPE = ? "); - } - if (activityPaginationRequest.getStatus() != null) { - sql.append("AND STATUS = ? "); - } - sql.append("ORDER BY OPERATION_ID ASC limit ? , ? ) eom_ordered " + - "ON eom_ordered.OPERATION_ID = eom.OPERATION_ID WHERE eom.TENANT_ID = ? "); + sql.append("ORDER BY OPERATION_ID ASC limit ? , ? ) eom_ordered " + + "ON eom_ordered.OPERATION_ID = eom.OPERATION_ID WHERE eom.TENANT_ID = ? "); + } else { + sql.append("(SELECT ID AS OPERATION_ID FROM DM_OPERATION WHERE TENANT_ID = ? "); + + if (activityPaginationRequest.getStartTimestamp() > 0 && activityPaginationRequest.getEndTimestamp() > 0) { + isTimeDurationFilteringProvided = true; + sql.append("AND CREATED_TIMESTAMP BETWEEN ? AND ? "); + } + if (activityPaginationRequest.getOperationId() > 0) { + sql.append("AND ID = ? "); + } + if (activityPaginationRequest.getOperationCode() != null) { + sql.append("AND OPERATION_CODE = ? "); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + sql.append("AND INITIATED_BY = ? "); + } + + sql.append("ORDER BY ID ASC limit ? , ? ) dm_ordered " + + "ON dm_ordered.OPERATION_ID = eom.OPERATION_ID WHERE eom.TENANT_ID = ? "); + } if (activityPaginationRequest.getDeviceType() != null) { sql.append("AND eom.DEVICE_TYPE = ? "); @@ -2173,6 +2341,9 @@ public class GenericOperationDAOImpl implements OperationDAO { if (activityPaginationRequest.getOperationCode() != null) { sql.append("AND eom.OPERATION_CODE = ? "); } + if (activityPaginationRequest.getOperationId() > 0) { + sql.append("AND eom.OPERATION_ID = ? "); + } if (activityPaginationRequest.getInitiatedBy() != null) { sql.append("AND eom.INITIATED_BY = ? "); } @@ -2180,7 +2351,7 @@ public class GenericOperationDAOImpl implements OperationDAO { sql.append("AND eom.UPDATED_TIMESTAMP > ? "); } if (isTimeDurationFilteringProvided) { - sql.append("AND eom.CREATED_TIMESTAMP BETWEEN ? AND ? "); + sql.append("AND eom.CREATED_TIMESTAMP BETWEEN ? AND ? "); } if (activityPaginationRequest.getType() != null) { sql.append("AND eom.TYPE = ? "); @@ -2194,48 +2365,86 @@ public class GenericOperationDAOImpl implements OperationDAO { int index = 1; try (PreparedStatement stmt = conn.prepareStatement(sql.toString())) { stmt.setInt(index++, tenantId); - if (activityPaginationRequest.getDeviceType() != null) { - stmt.setString(index++, activityPaginationRequest.getDeviceType()); - } - if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { - for (String deviceId : activityPaginationRequest.getDeviceIds()) { - stmt.setString(index++, deviceId); + if (activityPaginationRequest.getDeviceType() != null || + (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) || + activityPaginationRequest.getSince() != 0 || + activityPaginationRequest.getStatus() != null) { + + if (activityPaginationRequest.getDeviceType() != null) { + stmt.setString(index++, activityPaginationRequest.getDeviceType()); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + for (String deviceId : activityPaginationRequest.getDeviceIds()) { + stmt.setString(index++, deviceId); + } + } + if (activityPaginationRequest.getOperationCode() != null) { + stmt.setString(index++, activityPaginationRequest.getOperationCode()); + } + if (activityPaginationRequest.getOperationId() > 0) { + stmt.setInt(index++, activityPaginationRequest.getOperationId()); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); + } + if (activityPaginationRequest.getSince() != 0) { + stmt.setLong(index++, activityPaginationRequest.getSince()); + } + if (isTimeDurationFilteringProvided) { + stmt.setLong(index++, activityPaginationRequest.getStartTimestamp()); + stmt.setLong(index++, activityPaginationRequest.getEndTimestamp()); + } + if (activityPaginationRequest.getType() != null) { + stmt.setString(index++, activityPaginationRequest.getType().name()); + } + if (activityPaginationRequest.getStatus() != null) { + stmt.setString(index++, activityPaginationRequest.getStatus().name()); + } + + stmt.setInt(index++, activityPaginationRequest.getOffset()); + stmt.setInt(index++, activityPaginationRequest.getLimit()); + stmt.setInt(index++, tenantId); + + if (activityPaginationRequest.getDeviceType() != null) { + stmt.setString(index++, activityPaginationRequest.getDeviceType()); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + for (String deviceId : activityPaginationRequest.getDeviceIds()) { + stmt.setString(index++, deviceId); + } + } + } else { + if (isTimeDurationFilteringProvided) { + stmt.setLong(index++, activityPaginationRequest.getStartTimestamp()); + stmt.setLong(index++, activityPaginationRequest.getEndTimestamp()); + } + if (activityPaginationRequest.getOperationCode() != null) { + stmt.setString(index++, activityPaginationRequest.getOperationCode()); + } + if (activityPaginationRequest.getOperationId() > 0) { + stmt.setInt(index++, activityPaginationRequest.getOperationId()); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); + } + stmt.setInt(index++, activityPaginationRequest.getOffset()); + stmt.setInt(index++, activityPaginationRequest.getLimit()); + stmt.setInt(index++, tenantId); + + if (activityPaginationRequest.getDeviceType() != null) { + stmt.setString(index++, activityPaginationRequest.getDeviceType()); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + for (String deviceId : activityPaginationRequest.getDeviceIds()) { + stmt.setString(index++, deviceId); + } } } if (activityPaginationRequest.getOperationCode() != null) { stmt.setString(index++, activityPaginationRequest.getOperationCode()); } - if (activityPaginationRequest.getInitiatedBy() != null) { - stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); - } - if (activityPaginationRequest.getSince() != 0) { - stmt.setLong(index++, activityPaginationRequest.getSince()); - } - if (isTimeDurationFilteringProvided) { - stmt.setLong(index++, activityPaginationRequest.getStartTimestamp()); - stmt.setLong(index++, activityPaginationRequest.getEndTimestamp()); - } - if (activityPaginationRequest.getType() != null) { - stmt.setString(index++, activityPaginationRequest.getType().name()); - } - if (activityPaginationRequest.getStatus() != null) { - stmt.setString(index++, activityPaginationRequest.getStatus().name()); - } - - stmt.setInt(index++, activityPaginationRequest.getOffset()); - stmt.setInt(index++, activityPaginationRequest.getLimit()); - stmt.setInt(index++, tenantId); - - if (activityPaginationRequest.getDeviceType() != null) { - stmt.setString(index++, activityPaginationRequest.getDeviceType()); - } - if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { - for (String deviceId : activityPaginationRequest.getDeviceIds()) { - stmt.setString(index++, deviceId); - } - } - if (activityPaginationRequest.getOperationCode() != null) { - stmt.setString(index++, activityPaginationRequest.getOperationCode()); + if (activityPaginationRequest.getOperationId() > 0) { + stmt.setInt(index++, activityPaginationRequest.getOperationId()); } if (activityPaginationRequest.getInitiatedBy() != null) { stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); @@ -2278,33 +2487,57 @@ public class GenericOperationDAOImpl implements OperationDAO { boolean isTimeDurationFilteringProvided = false; Connection conn = OperationManagementDAOFactory.getConnection(); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); - StringBuilder sql = new StringBuilder("SELECT count(DISTINCT OPERATION_ID) AS ACTIVITY_COUNT " + - "FROM DM_ENROLMENT_OP_MAPPING WHERE TENANT_ID = ? "); + StringBuilder sql = new StringBuilder(); - if (activityPaginationRequest.getDeviceType() != null) { - sql.append("AND DEVICE_TYPE = ? "); - } - if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { - sql.append("AND DEVICE_IDENTIFICATION IN ("); - for (int i = 0; i < activityPaginationRequest.getDeviceIds().size() - 1; i++) { - sql.append("?, "); + if (activityPaginationRequest.getDeviceType() != null || + (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) || + activityPaginationRequest.getSince() != 0 || + activityPaginationRequest.getStatus() != null) { + + sql.append("SELECT count(DISTINCT OPERATION_ID) AS ACTIVITY_COUNT " + + "FROM DM_ENROLMENT_OP_MAPPING WHERE TENANT_ID = ? "); + + if (activityPaginationRequest.getDeviceType() != null) { + sql.append("AND DEVICE_TYPE = ? "); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + sql.append("AND DEVICE_IDENTIFICATION IN ("); + for (int i = 0; i < activityPaginationRequest.getDeviceIds().size() - 1; i++) { + sql.append("?, "); + } + sql.append("?) "); + } + if (activityPaginationRequest.getOperationCode() != null) { + sql.append("AND OPERATION_CODE = ? "); + } + if (activityPaginationRequest.getOperationId() > 0) { + sql.append("AND OPERATION_ID = ? "); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + sql.append("AND INITIATED_BY = ? "); + } + if (activityPaginationRequest.getSince() != 0) { + sql.append("AND UPDATED_TIMESTAMP > ? "); + } + if (activityPaginationRequest.getType() != null) { + sql.append("AND TYPE = ? "); + } + if (activityPaginationRequest.getStatus() != null) { + sql.append("AND STATUS = ? "); + } + + } else { + sql.append("SELECT count(ID) AS ACTIVITY_COUNT FROM DM_OPERATION WHERE TENANT_ID = ? "); + + if (activityPaginationRequest.getOperationCode() != null) { + sql.append("AND OPERATION_CODE = ? "); + } + if (activityPaginationRequest.getOperationId() > 0) { + sql.append("AND ID = ? "); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + sql.append("AND INITIATED_BY = ? "); } - sql.append("?) "); - } - if (activityPaginationRequest.getOperationCode() != null) { - sql.append("AND OPERATION_CODE = ? "); - } - if (activityPaginationRequest.getInitiatedBy() != null) { - sql.append("AND INITIATED_BY = ? "); - } - if (activityPaginationRequest.getSince() != 0) { - sql.append("AND UPDATED_TIMESTAMP > ? "); - } - if (activityPaginationRequest.getType() != null) { - sql.append("AND TYPE = ? "); - } - if (activityPaginationRequest.getStatus() != null) { - sql.append("AND STATUS = ? "); } if (activityPaginationRequest.getStartTimestamp() > 0 && activityPaginationRequest.getEndTimestamp() > 0) { isTimeDurationFilteringProvided = true; @@ -2314,28 +2547,47 @@ public class GenericOperationDAOImpl implements OperationDAO { int index = 1; try (PreparedStatement stmt = conn.prepareStatement(sql.toString())) { stmt.setInt(index++, tenantId); - if (activityPaginationRequest.getDeviceType() != null) { - stmt.setString(index++, activityPaginationRequest.getDeviceType()); - } - if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { - for (String deviceId : activityPaginationRequest.getDeviceIds()) { - stmt.setString(index++, deviceId); + + if (activityPaginationRequest.getDeviceType() != null || + (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) || + activityPaginationRequest.getSince() != 0 || + activityPaginationRequest.getStatus() != null) { + if (activityPaginationRequest.getDeviceType() != null) { + stmt.setString(index++, activityPaginationRequest.getDeviceType()); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + for (String deviceId : activityPaginationRequest.getDeviceIds()) { + stmt.setString(index++, deviceId); + } + } + if (activityPaginationRequest.getOperationCode() != null) { + stmt.setString(index++, activityPaginationRequest.getOperationCode()); + } + if (activityPaginationRequest.getOperationId() > 0) { + stmt.setInt(index++, activityPaginationRequest.getOperationId()); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); + } + if (activityPaginationRequest.getSince() != 0) { + stmt.setLong(index++, activityPaginationRequest.getSince()); + } + if (activityPaginationRequest.getType() != null) { + stmt.setString(index++, activityPaginationRequest.getType().name()); + } + if (activityPaginationRequest.getStatus() != null) { + stmt.setString(index++, activityPaginationRequest.getStatus().name()); + } + } else { + if (activityPaginationRequest.getOperationCode() != null) { + stmt.setString(index++, activityPaginationRequest.getOperationCode()); + } + if (activityPaginationRequest.getOperationId() > 0) { + stmt.setInt(index++, activityPaginationRequest.getOperationId()); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); } - } - if (activityPaginationRequest.getOperationCode() != null) { - stmt.setString(index++, activityPaginationRequest.getOperationCode()); - } - if (activityPaginationRequest.getInitiatedBy() != null) { - stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); - } - if (activityPaginationRequest.getSince() != 0) { - stmt.setLong(index++, activityPaginationRequest.getSince()); - } - if (activityPaginationRequest.getType() != null) { - stmt.setString(index++, activityPaginationRequest.getType().name()); - } - if (activityPaginationRequest.getStatus() != null) { - stmt.setString(index++, activityPaginationRequest.getStatus().name()); } if (isTimeDurationFilteringProvided) { stmt.setLong(index++, activityPaginationRequest.getStartTimestamp()); @@ -2356,4 +2608,222 @@ public class GenericOperationDAOImpl implements OperationDAO { return 0; } + @Override + public List getDeviceActivities(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementDAOException { + List finalizedActivitiesList = new ArrayList<>(); + try { + boolean isTimeDurationFilteringProvided = false; + Connection conn = OperationManagementDAOFactory.getConnection(); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + StringBuilder sql = new StringBuilder("SELECT " + + " eom.*," + + " opr.ID AS OP_RES_ID," + + " opr.RECEIVED_TIMESTAMP," + + " opr.OPERATION_RESPONSE, " + + " opr.IS_LARGE_RESPONSE " + + "FROM(" + + " SELECT * " + + " FROM " + + " DM_ENROLMENT_OP_MAPPING " + + " WHERE " + + " TENANT_ID = ? "); + + if (activityPaginationRequest.getStartTimestamp() > 0 && activityPaginationRequest.getEndTimestamp() > 0) { + isTimeDurationFilteringProvided = true; + sql.append("AND CREATED_TIMESTAMP BETWEEN ? AND ? "); + } + if (activityPaginationRequest.getDeviceType() != null) { + sql.append("AND DEVICE_TYPE = ? "); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + sql.append("AND DEVICE_IDENTIFICATION IN ("); + for (int i = 0; i < activityPaginationRequest.getDeviceIds().size() - 1; i++) { + sql.append("?, "); + } + sql.append("?) "); + } + if (activityPaginationRequest.getOperationId() > 0) { + sql.append("AND OPERATION_ID = ? "); + } + if (activityPaginationRequest.getOperationCode() != null) { + sql.append("AND OPERATION_CODE = ? "); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + sql.append("AND INITIATED_BY = ? "); + } + if (activityPaginationRequest.getSince() != 0) { + sql.append("AND UPDATED_TIMESTAMP > ? "); + } + if (activityPaginationRequest.getType() != null) { + sql.append("AND TYPE = ? "); + } + if (activityPaginationRequest.getStatus() != null) { + sql.append("AND STATUS = ? "); + } + + sql.append("ORDER BY ID ASC limit ? , ? ) eom " + + "LEFT JOIN DM_DEVICE_OPERATION_RESPONSE opr ON eom.ID = opr.EN_OP_MAP_ID"); + + int index = 1; + try (PreparedStatement stmt = conn.prepareStatement(sql.toString())) { + stmt.setInt(index++, tenantId); + if (isTimeDurationFilteringProvided) { + stmt.setLong(index++, activityPaginationRequest.getStartTimestamp()); + stmt.setLong(index++, activityPaginationRequest.getEndTimestamp()); + } + if (activityPaginationRequest.getDeviceType() != null) { + stmt.setString(index++, activityPaginationRequest.getDeviceType()); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + for (String deviceId : activityPaginationRequest.getDeviceIds()) { + stmt.setString(index++, deviceId); + } + } + if (activityPaginationRequest.getOperationId() > 0) { + stmt.setInt(index++, activityPaginationRequest.getOperationId()); + } + if (activityPaginationRequest.getOperationCode() != null) { + stmt.setString(index++, activityPaginationRequest.getOperationCode()); + } + + if (activityPaginationRequest.getInitiatedBy() != null) { + stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); + } + if (activityPaginationRequest.getSince() != 0) { + stmt.setLong(index++, activityPaginationRequest.getSince()); + } + if (activityPaginationRequest.getType() != null) { + stmt.setString(index++, activityPaginationRequest.getType().name()); + } + if (activityPaginationRequest.getStatus() != null) { + stmt.setString(index++, activityPaginationRequest.getStatus().name()); + } + + stmt.setInt(index++, activityPaginationRequest.getOffset()); + stmt.setInt(index, activityPaginationRequest.getLimit()); + + try (ResultSet rs = stmt.executeQuery()) { + Map activities = new HashMap<>(); + + while (rs.next()) { + int activityId = rs.getInt("ID"); + DeviceActivity deviceActivity = activities.get(activityId); + if (deviceActivity == null) { + deviceActivity = OperationDAOUtil.populateActivity(rs); + activities.put(activityId, deviceActivity); + } + deviceActivity.getResponses().add(populateResponse(rs)); + } + for (int activityId : activities.keySet()) { + DeviceActivity deviceActivity = activities.get(activityId); + finalizedActivitiesList.add(deviceActivity); + } + } + + } + } catch (SQLException e) { + String msg = "Error occurred while getting the operation details from the database."; + log.error(msg, e); + throw new OperationManagementDAOException(msg, e); + } + return finalizedActivitiesList; + } + + + @Override + public int getDeviceActivitiesCount(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementDAOException { + try { + boolean isTimeDurationFilteringProvided = false; + Connection conn = OperationManagementDAOFactory.getConnection(); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + StringBuilder sql = new StringBuilder(); + + + sql.append("SELECT count(DISTINCT ID) AS ACTIVITY_COUNT " + + "FROM DM_ENROLMENT_OP_MAPPING WHERE TENANT_ID = ? "); + + if (activityPaginationRequest.getDeviceType() != null) { + sql.append("AND DEVICE_TYPE = ? "); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + sql.append("AND DEVICE_IDENTIFICATION IN ("); + for (int i = 0; i < activityPaginationRequest.getDeviceIds().size() - 1; i++) { + sql.append("?, "); + } + sql.append("?) "); + } + if (activityPaginationRequest.getOperationCode() != null) { + sql.append("AND OPERATION_CODE = ? "); + } + if (activityPaginationRequest.getOperationId() > 0) { + sql.append("AND OPERATION_ID = ? "); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + sql.append("AND INITIATED_BY = ? "); + } + if (activityPaginationRequest.getSince() != 0) { + sql.append("AND UPDATED_TIMESTAMP > ? "); + } + if (activityPaginationRequest.getType() != null) { + sql.append("AND TYPE = ? "); + } + if (activityPaginationRequest.getStatus() != null) { + sql.append("AND STATUS = ? "); + } + + if (activityPaginationRequest.getStartTimestamp() > 0 && activityPaginationRequest.getEndTimestamp() > 0) { + isTimeDurationFilteringProvided = true; + sql.append("AND CREATED_TIMESTAMP BETWEEN ? AND ? "); + } + + int index = 1; + try (PreparedStatement stmt = conn.prepareStatement(sql.toString())) { + stmt.setInt(index++, tenantId); + if (activityPaginationRequest.getDeviceType() != null) { + stmt.setString(index++, activityPaginationRequest.getDeviceType()); + } + if (activityPaginationRequest.getDeviceIds() != null && !activityPaginationRequest.getDeviceIds().isEmpty()) { + for (String deviceId : activityPaginationRequest.getDeviceIds()) { + stmt.setString(index++, deviceId); + } + } + if (activityPaginationRequest.getOperationCode() != null) { + stmt.setString(index++, activityPaginationRequest.getOperationCode()); + } + if (activityPaginationRequest.getOperationId() > 0) { + stmt.setInt(index++, activityPaginationRequest.getOperationId()); + } + if (activityPaginationRequest.getInitiatedBy() != null) { + stmt.setString(index++, activityPaginationRequest.getInitiatedBy()); + } + if (activityPaginationRequest.getSince() != 0) { + stmt.setLong(index++, activityPaginationRequest.getSince()); + } + if (activityPaginationRequest.getType() != null) { + stmt.setString(index++, activityPaginationRequest.getType().name()); + } + if (activityPaginationRequest.getStatus() != null) { + stmt.setString(index++, activityPaginationRequest.getStatus().name()); + } + + if (isTimeDurationFilteringProvided) { + stmt.setLong(index++, activityPaginationRequest.getStartTimestamp()); + stmt.setLong(index, activityPaginationRequest.getEndTimestamp()); + } + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return rs.getInt("ACTIVITY_COUNT"); + } + } + } + } catch (SQLException e) { + String msg = "Error occurred while getting the operation details from the database."; + log.error(msg, e); + throw new OperationManagementDAOException(msg, e); + } + return 0; + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/PolicyOperationDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/PolicyOperationDAOImpl.java index cffcd5744e..bd4d74386a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/PolicyOperationDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/PolicyOperationDAOImpl.java @@ -17,14 +17,15 @@ */ package io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.impl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import io.entgra.device.mgt.core.device.mgt.core.dao.util.DeviceManagementDAOUtil; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.Operation; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.PolicyOperation; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOException; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import java.io.*; import java.sql.*; @@ -49,7 +50,7 @@ public class PolicyOperationDAOImpl extends GenericOperationDAOImpl { operation.setEnabled(true); Connection connection = OperationManagementDAOFactory.getConnection(); String sql = "INSERT INTO DM_OPERATION(TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, " + - "INITIATED_BY, OPERATION_DETAILS, ENABLED) VALUES (?, ?, ?, ?, ?, ?, ?)"; + "INITIATED_BY, OPERATION_DETAILS, ENABLED, TENANT_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; stmt = connection.prepareStatement(sql, new String[]{"id"}); stmt.setString(1, operation.getType().toString()); stmt.setLong(2, DeviceManagementDAOUtil.getCurrentUTCTime()); @@ -63,6 +64,7 @@ public class PolicyOperationDAOImpl extends GenericOperationDAOImpl { stmt.setBytes(6, bao.toByteArray()); stmt.setBoolean(7, operation.isEnabled()); + stmt.setInt(8, PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId()); stmt.executeUpdate(); rs = stmt.getGeneratedKeys(); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java index 489ce3d306..93b25f47dc 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java @@ -17,18 +17,20 @@ */ package io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.impl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import io.entgra.device.mgt.core.device.mgt.core.dao.util.DeviceManagementDAOUtil; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.Operation; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.ProfileOperation; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOException; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import java.io.*; import java.sql.*; import java.util.ArrayList; +import java.util.Date; import java.util.List; public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { @@ -45,7 +47,7 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { operation.setEnabled(true); Connection connection = OperationManagementDAOFactory.getConnection(); String sql = "INSERT INTO DM_OPERATION(TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, " + - "INITIATED_BY, OPERATION_DETAILS, ENABLED) VALUES (?, ?, ?, ?, ?, ?, ?)"; + "INITIATED_BY, OPERATION_DETAILS, ENABLED, TENANT_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; stmt = connection.prepareStatement(sql, new String[]{"id"}); stmt.setString(1, operation.getType().toString()); stmt.setLong(2, DeviceManagementDAOUtil.getCurrentUTCTime()); @@ -59,6 +61,7 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { stmt.setBytes(6, bao.toByteArray()); stmt.setBoolean(7, operation.isEnabled()); + stmt.setInt(8, PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId()); stmt.executeUpdate(); rs = stmt.getGeneratedKeys(); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/util/OperationDAOUtil.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/util/OperationDAOUtil.java index 518ce5952a..bac0fb0648 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/util/OperationDAOUtil.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/mgt/dao/util/OperationDAOUtil.java @@ -18,6 +18,12 @@ package io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.util; import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.DeviceActivity; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.ActivityHolder; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.ActivityMapper; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.ActivityStatus; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationResponse; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.*; import io.entgra.device.mgt.core.device.mgt.core.DeviceManagementConstants; import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.Operation; @@ -31,6 +37,8 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.Date; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -129,8 +137,9 @@ public class OperationDAOUtil { public static OperationResponse getLargeOperationResponse(ResultSet rs) throws ClassNotFoundException, IOException, SQLException { OperationResponse response = new OperationResponse(); - if (rs.getTimestamp("RECEIVED_TIMESTAMP") != (null)) { - response.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") != null) { + Timestamp receivedTimestamp = rs.getTimestamp("RECEIVED_TIMESTAMP"); + response.setReceivedTimeStamp(new Date(receivedTimestamp.getTime()).toString()); } ByteArrayInputStream bais = null; ObjectInputStream ois = null; @@ -164,8 +173,9 @@ public class OperationDAOUtil { public static OperationResponse getOperationResponse(ResultSet rs) throws SQLException { OperationResponse response = new OperationResponse(); - if (rs.getTimestamp("RECEIVED_TIMESTAMP") != (null)) { - response.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") != null) { + Timestamp receivedTimestamp = rs.getTimestamp("RECEIVED_TIMESTAMP"); + response.setReceivedTimeStamp(new Date(receivedTimestamp.getTime()).toString()); } if (rs.getString("OPERATION_RESPONSE") != null) { response.setResponse(rs.getString("OPERATION_RESPONSE")); @@ -241,6 +251,7 @@ public class OperationDAOUtil { activity.setCreatedTimeStamp( new java.util.Date(rs.getLong(("CREATED_TIMESTAMP")) * 1000).toString()); activity.setCode(rs.getString("OPERATION_CODE")); + activity.setOperationId(rs.getInt("OPERATION_ID")); activity.setInitiatedBy(rs.getString("INITIATED_BY")); DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); @@ -294,4 +305,27 @@ public class OperationDAOUtil { throw new OperationManagementDAOException(msg, e); } } + + public static DeviceActivity populateActivity(ResultSet rs) throws SQLException { + DeviceActivity deviceActivity = new DeviceActivity(); + List operationResponses = new ArrayList<>(); + + deviceActivity.setType(DeviceActivity.Type.valueOf(rs.getString("TYPE"))); + deviceActivity.setCreatedTimeStamp(new Date(rs.getLong(("CREATED_TIMESTAMP")) * 1000).toString()); + deviceActivity.setActivityId(OperationDAOUtil.getActivityId(rs.getInt("OPERATION_ID"))); + deviceActivity.setCode(rs.getString("OPERATION_CODE")); + deviceActivity.setOperationId(rs.getInt("OPERATION_ID")); + deviceActivity.setInitiatedBy(rs.getString("INITIATED_BY")); + + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(rs.getString("DEVICE_IDENTIFICATION")); + deviceIdentifier.setType(rs.getString("DEVICE_TYPE")); + deviceActivity.setDeviceIdentifier(deviceIdentifier); + deviceActivity.setStatus(DeviceActivity.Status.valueOf(rs.getString("STATUS"))); + if (rs.getInt("UPDATED_TIMESTAMP") != 0) { + deviceActivity.setResponses(operationResponses); + } + deviceActivity.setUpdatedTimestamp(new Date(rs.getLong(("UPDATED_TIMESTAMP")) * 1000).toString()); + return deviceActivity; + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/timeout/task/impl/OperationTimeoutTask.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/timeout/task/impl/OperationTimeoutTask.java index 0639d60b4c..157795aa5a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/timeout/task/impl/OperationTimeoutTask.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/timeout/task/impl/OperationTimeoutTask.java @@ -18,6 +18,9 @@ package io.entgra.device.mgt.core.device.mgt.core.operation.timeout.task.impl; import com.google.gson.Gson; +import io.entgra.device.mgt.core.server.bootup.heartbeat.beacon.exception.HeartBeatManagementException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.ActivityStatus; @@ -27,8 +30,6 @@ import io.entgra.device.mgt.core.device.mgt.core.config.operation.timeout.Operat import io.entgra.device.mgt.core.device.mgt.core.dto.DeviceType; import io.entgra.device.mgt.core.device.mgt.core.internal.DeviceManagementDataHolder; import io.entgra.device.mgt.core.device.mgt.core.task.impl.DynamicPartitionedScheduleTask; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import java.util.ArrayList; import java.util.List; @@ -36,7 +37,6 @@ import java.util.List; public class OperationTimeoutTask extends DynamicPartitionedScheduleTask { private static final Log log = LogFactory.getLog(OperationTimeoutTask.class); - @Override protected void setup() { @@ -44,45 +44,60 @@ public class OperationTimeoutTask extends DynamicPartitionedScheduleTask { @Override protected void executeDynamicTask() { - String operationTimeoutTaskConfigStr = getProperty( - OperationTimeoutTaskManagerServiceImpl.OPERATION_TIMEOUT_TASK_CONFIG); - Gson gson = new Gson(); - OperationTimeout operationTimeoutConfig = gson.fromJson(operationTimeoutTaskConfigStr, OperationTimeout.class); - try { - long timeMillis = System.currentTimeMillis() - operationTimeoutConfig.getTimeout() * 60 * 1000; - List deviceTypes = new ArrayList<>(); - if (operationTimeoutConfig.getDeviceTypes().size() == 1 && - "ALL".equals(operationTimeoutConfig.getDeviceTypes().get(0))) { - try { - List deviceTypeList = DeviceManagementDataHolder.getInstance() - .getDeviceManagementProvider().getDeviceTypes(); - for (DeviceType deviceType : deviceTypeList) { - deviceTypes.add(deviceType.getName()); + if (isQualifiedToExecuteTask()) { // this task will run only in one node when the deployment has multiple nodes + String operationTimeoutTaskConfigStr = getProperty( + OperationTimeoutTaskManagerServiceImpl.OPERATION_TIMEOUT_TASK_CONFIG); + Gson gson = new Gson(); + OperationTimeout operationTimeoutConfig = gson.fromJson(operationTimeoutTaskConfigStr, OperationTimeout.class); + try { + long timeMillis = System.currentTimeMillis() - (long) operationTimeoutConfig.getTimeout(); + List deviceTypes = new ArrayList<>(); + if (operationTimeoutConfig.getDeviceTypes().size() == 1 && + "ALL".equals(operationTimeoutConfig.getDeviceTypes().get(0))) { + try { + List deviceTypeList = DeviceManagementDataHolder.getInstance() + .getDeviceManagementProvider().getDeviceTypes(); + for (DeviceType deviceType : deviceTypeList) { + deviceTypes.add(deviceType.getName()); + } + } catch (DeviceManagementException e) { + log.error("Error occurred while reading device types", e); } - } catch (DeviceManagementException e) { - log.error("Error occurred while reading device types", e); + } else { + deviceTypes = operationTimeoutConfig.getDeviceTypes(); } - } else { - deviceTypes = operationTimeoutConfig.getDeviceTypes(); - } - List activities = DeviceManagementDataHolder.getInstance().getOperationManager() - .getActivities(deviceTypes, operationTimeoutConfig.getCode(), timeMillis, - operationTimeoutConfig.getInitialStatus()); - for (Activity activity : activities) { - for (ActivityStatus activityStatus : activity.getActivityStatus()) { - String operationId = activity.getActivityId().replace("ACTIVITY_", ""); - Operation operation = DeviceManagementDataHolder.getInstance().getOperationManager() - .getOperation(Integer.parseInt(operationId)); - operation.setStatus(Operation.Status.valueOf(operationTimeoutConfig.getNextStatus())); - DeviceManagementDataHolder.getInstance().getOperationManager() - .updateOperation(activityStatus.getDeviceIdentifier(), operation); + List activities = DeviceManagementDataHolder.getInstance().getOperationManager() + .getActivities(deviceTypes, operationTimeoutConfig.getCode(), timeMillis, + operationTimeoutConfig.getInitialStatus()); + for (Activity activity : activities) { + for (ActivityStatus activityStatus : activity.getActivityStatus()) { + String operationId = activity.getActivityId().replace("ACTIVITY_", ""); + Operation operation = DeviceManagementDataHolder.getInstance().getOperationManager() + .getOperation(Integer.parseInt(operationId)); + operation.setStatus(Operation.Status.valueOf(operationTimeoutConfig.getNextStatus())); + DeviceManagementDataHolder.getInstance().getOperationManager() + .updateOperation(activityStatus.getDeviceIdentifier(), operation); + } } - } - } catch (OperationManagementException e) { - String msg = "Error occurred while retrieving operations."; - log.error(msg, e); + } catch (OperationManagementException e) { + String msg = "Error occurred while retrieving operations."; + log.error(msg, e); + } } + } + private boolean isQualifiedToExecuteTask() { + if (isDynamicTaskEligible()) { + try { + return DeviceManagementDataHolder.getInstance().getHeartBeatService().isQualifiedToExecuteTask(); + } catch (HeartBeatManagementException e) { + log.error("Error while checking is qualified to execute task", e); + } + } else { + return true; + } + return false; + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/timeout/task/impl/OperationTimeoutTaskManagerServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/timeout/task/impl/OperationTimeoutTaskManagerServiceImpl.java index 4da31f9f41..6875b62125 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/timeout/task/impl/OperationTimeoutTaskManagerServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/operation/timeout/task/impl/OperationTimeoutTaskManagerServiceImpl.java @@ -57,14 +57,14 @@ public class OperationTimeoutTaskManagerServiceImpl implements OperationTimeoutT log.debug("Operation timeout task is started for the device type(s) : " + config.getDeviceTypes() + ", operation code : " + config.getInitialStatus()); log.debug( - "Operation timeout task is at frequency of : " + config.getTimeout() + " minutes"); + "Operation timeout task is at frequency of : " + config.getTimeout() + " milliseconds"); } TaskManager taskManager = taskService.getTaskManager(OPERATION_TIMEOUT_TASK); TaskInfo.TriggerInfo triggerInfo = new TaskInfo.TriggerInfo(); //Convert to milli seconds - triggerInfo.setIntervalMillis(config.getTimeout() * 60 * 1000); + triggerInfo.setIntervalMillis(config.getTimeout()); triggerInfo.setRepeatCount(-1); Gson gson = new Gson(); @@ -125,7 +125,7 @@ public class OperationTimeoutTaskManagerServiceImpl implements OperationTimeoutT if (taskManager.isTaskScheduled(taskName)) { taskManager.deleteTask(taskName); TaskInfo.TriggerInfo triggerInfo = new TaskInfo.TriggerInfo(); - triggerInfo.setIntervalMillis(config.getTimeout() * 60 * 1000); + triggerInfo.setIntervalMillis(config.getTimeout()); triggerInfo.setRepeatCount(-1); Map properties = new HashMap<>(); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java index 074eb8eed7..bff66f7489 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java @@ -266,9 +266,7 @@ public class OTPManagementServiceImpl implements OTPManagementService { public OneTimePinDTO generateOneTimePin(OneTimePinDTO oneTimePinDTO, boolean persistPin) throws OTPManagementException { String otpValue = UUID.randomUUID().toString(); - - Gson gson = new Gson(); - String metaInfo = gson.toJson(oneTimePinDTO.getMetaInfo()); + String metaInfo = oneTimePinDTO.getMetaInfo(); oneTimePinDTO.setMetaInfo(metaInfo); oneTimePinDTO.setOtpToken(otpValue); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/push/notification/mgt/task/PushNotificationSchedulerTask.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/push/notification/mgt/task/PushNotificationSchedulerTask.java index 223535a29a..c4c9df0e56 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/push/notification/mgt/task/PushNotificationSchedulerTask.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/push/notification/mgt/task/PushNotificationSchedulerTask.java @@ -17,6 +17,12 @@ */ package io.entgra.device.mgt.core.device.mgt.core.push.notification.mgt.task; +import io.entgra.device.mgt.core.device.mgt.common.ServerCtxInfo; +import io.entgra.device.mgt.core.server.bootup.heartbeat.beacon.exception.HeartBeatManagementException; +import io.entgra.device.mgt.core.server.bootup.heartbeat.beacon.service.HeartBeatManagementService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; import io.entgra.device.mgt.core.device.mgt.common.exceptions.TransactionManagementException; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationManagementException; @@ -32,9 +38,6 @@ import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationMana import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationMappingDAO; import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.context.PrivilegedCarbonContext; import java.util.HashMap; import java.util.LinkedList; @@ -63,9 +66,27 @@ public class PushNotificationSchedulerTask implements Runnable { try { //Get next available operation list per device batch OperationManagementDAOFactory.openConnection(); - operationMappingsTenantMap = operationDAO.getOperationMappingsByStatus(Operation.Status - .PENDING, Operation.PushNotificationStatus.SCHEDULED, DeviceConfigurationManager.getInstance() - .getDeviceManagementConfig().getPushNotificationConfiguration().getSchedulerBatchSize()); + try { + if (DeviceManagementDataHolder.getInstance().getHeartBeatService().isTaskPartitioningEnabled()) { + ServerCtxInfo serverCtxInfo = DeviceManagementDataHolder.getInstance().getHeartBeatService().getServerCtxInfo(); + if (serverCtxInfo != null) { + operationMappingsTenantMap = operationDAO.getAllocatedOperationMappingsByStatus(Operation.Status + .PENDING, Operation.PushNotificationStatus.SCHEDULED, DeviceConfigurationManager.getInstance() + .getDeviceManagementConfig().getPushNotificationConfiguration().getSchedulerBatchSize(), + serverCtxInfo.getActiveServerCount(), serverCtxInfo.getLocalServerHashIdx()); + } else { + if (log.isDebugEnabled()) { + log.debug("Active server information not recorded yet."); + } + } + } else { + operationMappingsTenantMap = operationDAO.getOperationMappingsByStatus(Operation.Status + .PENDING, Operation.PushNotificationStatus.SCHEDULED, DeviceConfigurationManager.getInstance() + .getDeviceManagementConfig().getPushNotificationConfiguration().getSchedulerBatchSize()); + } + } catch (HeartBeatManagementException e) { + throw new RuntimeException(e); + } } catch (OperationManagementDAOException e) { log.error("Unable to retrieve scheduled pending operations for task.", e); } finally { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderService.java index 1b3d57f171..382bdd6456 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderService.java @@ -31,6 +31,7 @@ import io.entgra.device.mgt.core.device.mgt.common.geo.service.GeoQuery; import io.entgra.device.mgt.core.device.mgt.common.invitation.mgt.DeviceEnrollmentInvitationDetails; import io.entgra.device.mgt.core.device.mgt.common.license.mgt.License; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.DeviceActivity; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Operation; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationManagementException; import io.entgra.device.mgt.core.device.mgt.common.policy.mgt.PolicyMonitoringManager; @@ -996,6 +997,11 @@ public interface DeviceManagementProviderService { int getActivitiesCount(ActivityPaginationRequest activityPaginationRequest) throws OperationManagementException; + List getDeviceActivities(ActivityPaginationRequest activityPaginationRequest) throws OperationManagementException; + + int getDeviceActivitiesCount(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementException; + License getLicenseConfig (String deviceTypeName) throws DeviceManagementException; /** diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index 0a526d0283..33c3fa49bd 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -77,6 +77,7 @@ import io.entgra.device.mgt.core.device.mgt.common.license.mgt.LicenseManagement import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata; import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity; +import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.DeviceActivity; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Operation; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationManagementException; import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.OperationManager; @@ -139,6 +140,7 @@ import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.stratos.common.beans.TenantInfoBean; import org.wso2.carbon.tenant.mgt.services.TenantMgtAdminService; import org.wso2.carbon.user.api.UserStoreException; +import org.wso2.carbon.utils.multitenancy.MultitenantConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -652,6 +654,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv Map deviceManagerMap = new HashMap<>(); List deviceCacheKeyList = new ArrayList<>(); List existingDevices; + List validDevices = new ArrayList<>(); int tenantId = this.getTenantId(); try { @@ -684,6 +687,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv deviceCacheKey.setDeviceType(device.getType()); deviceCacheKey.setTenantId(tenantId); deviceCacheKeyList.add(deviceCacheKey); + validDevices.add(device); deviceIds.add(device.getId()); validDeviceIdentifiers.add(device.getDeviceIdentifier()); enrollmentIds.add(device.getEnrolmentInfo().getId()); @@ -713,7 +717,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv try { DeviceManagementDAOFactory.beginTransaction(); //deleting device from the core - deviceDAO.deleteDevices(validDeviceIdentifiers, new ArrayList<>(deviceIds), enrollmentIds); + deviceDAO.deleteDevices(validDeviceIdentifiers, new ArrayList<>(deviceIds), enrollmentIds, validDevices); for (Map.Entry entry : deviceManagerMap.entrySet()) { try { // deleting device from the plugin level @@ -1032,7 +1036,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv * @return Whether status is changed or not * @throws DeviceManagementException on errors while trying to calculate Cost */ - public BillingResponse calculateCost(String tenantDomain, Timestamp startDate, Timestamp endDate, List allDevices) throws MetadataManagementDAOException, DeviceManagementException { + public BillingResponse calculateUsage(String tenantDomain, Timestamp startDate, Timestamp endDate, List allDevices) throws MetadataManagementDAOException, DeviceManagementException { BillingResponse billingResponse = new BillingResponse(); List deviceStatusNotAvailable = new ArrayList<>(); @@ -1045,55 +1049,19 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv Gson g = new Gson(); Collection costData = null; + int tenantIdContext = CarbonContext.getThreadLocalCarbonContext().getTenantId(); Type collectionType = new TypeToken>() { }.getType(); - if (metadata != null) { + if (tenantIdContext == MultitenantConstants.SUPER_TENANT_ID && metadata != null) { costData = g.fromJson(metadata.getMetaValue(), collectionType); for (Cost tenantCost : costData) { if (tenantCost.getTenantDomain().equals(tenantDomain)) { - for (Device device : allDevices) { - long dateDiff = 0; - device.setDeviceStatusInfo(getDeviceStatusHistory(device, null, endDate, true)); - List deviceStatus = device.getDeviceStatusInfo(); - if (device.getEnrolmentInfo().getDateOfEnrolment() < startDate.getTime()) { - if (!deviceStatus.isEmpty() && String.valueOf(deviceStatus.get(0).getStatus()).equals("REMOVED")) { - if (deviceStatus.get(0).getUpdateTime().getTime() >= startDate.getTime()) { - dateDiff = deviceStatus.get(0).getUpdateTime().getTime() - startDate.getTime(); - } - } else if (!deviceStatus.isEmpty() && !String.valueOf(deviceStatus.get(0).getStatus()).equals("REMOVED")) { - dateDiff = endDate.getTime() - startDate.getTime(); - } - } else { - if (!deviceStatus.isEmpty() && String.valueOf(deviceStatus.get(0).getStatus()).equals("REMOVED")) { - if (deviceStatus.get(0).getUpdateTime().getTime() >= device.getEnrolmentInfo().getDateOfEnrolment()) { - dateDiff = deviceStatus.get(0).getUpdateTime().getTime() - device.getEnrolmentInfo().getDateOfEnrolment(); - } - } else if (!deviceStatus.isEmpty() && !String.valueOf(deviceStatus.get(0).getStatus()).equals("REMOVED")) { - dateDiff = endDate.getTime() - device.getEnrolmentInfo().getDateOfEnrolment(); - } - } - - // Convert dateDiff to days as a decimal value - double dateDiffInDays = (double) dateDiff / (24 * 60 * 60 * 1000); - - if (dateDiffInDays % 1 >= 0.9) { - dateDiffInDays = Math.ceil(dateDiffInDays); - } - - long dateInDays = (long) dateDiffInDays; - double cost = (tenantCost.getCost() / 365) * dateInDays; - totalCost += cost; - device.setCost(Math.round(cost * 100.0) / 100.0); - long totalDays = dateInDays + device.getDaysUsed(); - device.setDaysUsed((int) totalDays); - if (deviceStatus.isEmpty()) { - deviceStatusNotAvailable.add(device); - } - } - + totalCost = generateCost(allDevices, startDate, endDate, tenantCost, deviceStatusNotAvailable, totalCost); } } + } else { + totalCost = generateCost(allDevices, startDate, endDate, null, deviceStatusNotAvailable, totalCost); } } catch (DeviceManagementException e) { String msg = "Error occurred calculating cost of devices"; @@ -1125,6 +1093,56 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv return billingResponse; } + public double generateCost(List allDevices, Timestamp startDate, Timestamp endDate, Cost tenantCost, List deviceStatusNotAvailable, double totalCost) throws DeviceManagementException { + for (Device device : allDevices) { + long dateDiff = 0; + device.setDeviceStatusInfo(getDeviceStatusHistory(device, null, endDate, true)); + List deviceStatus = device.getDeviceStatusInfo(); + if (device.getEnrolmentInfo().getDateOfEnrolment() < startDate.getTime()) { + if (!deviceStatus.isEmpty() && (String.valueOf(deviceStatus.get(0).getStatus()).equals("REMOVED") + || String.valueOf(deviceStatus.get(0).getStatus()).equals("DELETED"))) { + if (deviceStatus.get(0).getUpdateTime().getTime() >= startDate.getTime()) { + dateDiff = deviceStatus.get(0).getUpdateTime().getTime() - startDate.getTime(); + } + } else if (!deviceStatus.isEmpty() && (!String.valueOf(deviceStatus.get(0).getStatus()).equals("REMOVED") + && !String.valueOf(deviceStatus.get(0).getStatus()).equals("DELETED"))) { + dateDiff = endDate.getTime() - startDate.getTime(); + } + } else { + if (!deviceStatus.isEmpty() && (String.valueOf(deviceStatus.get(0).getStatus()).equals("REMOVED") + || String.valueOf(deviceStatus.get(0).getStatus()).equals("DELETED"))) { + if (deviceStatus.get(0).getUpdateTime().getTime() >= device.getEnrolmentInfo().getDateOfEnrolment()) { + dateDiff = deviceStatus.get(0).getUpdateTime().getTime() - device.getEnrolmentInfo().getDateOfEnrolment(); + } + } else if (!deviceStatus.isEmpty() && (!String.valueOf(deviceStatus.get(0).getStatus()).equals("REMOVED") + && !String.valueOf(deviceStatus.get(0).getStatus()).equals("DELETED"))) { + dateDiff = endDate.getTime() - device.getEnrolmentInfo().getDateOfEnrolment(); + } + } + + // Convert dateDiff to days as a decimal value + double dateDiffInDays = (double) dateDiff / (24 * 60 * 60 * 1000); + + if (dateDiffInDays % 1 >= 0.9) { + dateDiffInDays = Math.ceil(dateDiffInDays); + } + + long dateInDays = (long) dateDiffInDays; + double cost = 0; + if (tenantCost != null) { + cost = (tenantCost.getCost() / 365) * dateInDays; + } + totalCost += cost; + device.setCost(Math.round(cost * 100.0) / 100.0); + long totalDays = dateInDays + device.getDaysUsed(); + device.setDaysUsed((int) totalDays); + if (deviceStatus.isEmpty()) { + deviceStatusNotAvailable.add(device); + } + } + return totalCost; + } + @Override public PaginationResult createBillingFile(int tenantId, String tenantDomain, Timestamp startDate, Timestamp endDate) throws DeviceManagementException { @@ -1186,7 +1204,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv // The query returns devices which are enrolled prior this year now in removed state allDevicesPerYear.addAll(deviceDAO.getRemovedPriorYearsDeviceList(tenantId, newStartDate, newEndDate)); - BillingResponse billingResponse = calculateCost(tenantDomain, newStartDate, newEndDate, allDevicesPerYear); + BillingResponse billingResponse = calculateUsage(tenantDomain, newStartDate, newEndDate, allDevicesPerYear); billingResponseList.add(billingResponse); allDevices.addAll(billingResponse.getDevice()); totalCost = totalCost + billingResponse.getTotalCostPerYear(); @@ -1210,7 +1228,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv // The query returns devices which are enrolled prior this year now in removed state allDevicesPerRemainingDays.addAll(deviceDAO.getRemovedPriorYearsDeviceList(tenantId, startDate, endDate)); - BillingResponse billingResponse = calculateCost(tenantDomain, startDate, endDate, allDevicesPerRemainingDays); + BillingResponse billingResponse = calculateUsage(tenantDomain, startDate, endDate, allDevicesPerRemainingDays); billingResponseList.add(billingResponse); allDevices.addAll(billingResponse.getDevice()); totalCost = totalCost + billingResponse.getTotalCostPerYear(); @@ -2548,6 +2566,19 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv .getActivitiesCount(activityPaginationRequest); } + @Override + public List getDeviceActivities(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementException { + return DeviceManagementDataHolder.getInstance().getOperationManager().getDeviceActivities(activityPaginationRequest); + } + + @Override + public int getDeviceActivitiesCount(ActivityPaginationRequest activityPaginationRequest) + throws OperationManagementException { + return DeviceManagementDataHolder.getInstance().getOperationManager() + .getDeviceActivitiesCount(activityPaginationRequest); + } + @Override public List getMonitoringOperationList(String deviceType) { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderService.java index cea303b522..d6040274ef 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderService.java @@ -183,6 +183,14 @@ public interface GroupManagementProviderService { PaginationResult getGroupsWithHierarchy(String username, GroupPaginationRequest request, boolean requireGroupProps) throws GroupManagementException; + /** + * Get all hierarchical device groups count in tenant + * + * @return hierarchical group count + * @throws GroupManagementException + */ + int getHierarchicalGroupCount() throws GroupManagementException; + /** * Get all device group count in tenant * @@ -209,6 +217,16 @@ public interface GroupManagementProviderService { */ int getGroupCount(String username, String parentPath) throws GroupManagementException; + /** + * Get hierarchical device groups count of user + * + * @param username of the user + * @param parentPath of the group + * @return hierarchical group count + * @throws GroupManagementException + */ + int getHierarchicalGroupCount(String username, String parentPath) throws GroupManagementException; + /** * Manage device group sharing with user with list of roles. * diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderServiceImpl.java index 29654efe0e..9bcd5f7e7a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderServiceImpl.java @@ -842,6 +842,28 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid return groupResult; } + @Override + public int getHierarchicalGroupCount() throws GroupManagementException { + if (log.isDebugEnabled()) { + log.debug("Get groups count"); + } + try { + GroupManagementDAOFactory.openConnection(); + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + return groupDAO.getGroupCount(tenantId, null); + } catch (GroupManagementDAOException e) { + String msg = "Error occurred while retrieving all groups in tenant"; + log.error(msg, e); + throw new GroupManagementException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while opening a connection to the data source."; + log.error(msg, e); + throw new GroupManagementException(msg, e); + } finally { + GroupManagementDAOFactory.closeConnection(); + } + } + @Override public int getGroupCount() throws GroupManagementException { if (log.isDebugEnabled()) { @@ -950,6 +972,52 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid } } + /** + * {@inheritDoc} + */ + @Override + public int getHierarchicalGroupCount(String username, String parentPath) throws GroupManagementException { + if (username == null || username.isEmpty()) { + String msg = "Received empty user name for getHierarchicalGroupCount"; + log.error(msg); + throw new GroupManagementException(msg); + } + if (log.isDebugEnabled()) { + log.debug("Get groups count of '" + username + "'"); + } + UserStoreManager userStoreManager; + int count; + try { + GroupManagementDAOFactory.openConnection(); + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) + .getUserStoreManager(); + if (isAdminUser(username, userStoreManager)) { + count = groupDAO.getGroupCount(tenantId, null); + return count; + } else { + String[] roleList = userStoreManager.getRoleListOfUser(username); + count = groupDAO.getOwnGroupsCount(username, tenantId, parentPath); + count += groupDAO.getGroupsCount(roleList, tenantId, parentPath); + return count; + } + } catch (UserStoreException e) { + String msg = "Error occurred while retrieving role list of user '" + username + "'"; + log.error(msg, e); + throw new GroupManagementException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while opening db connection to get group count."; + log.error(msg, e); + throw new GroupManagementException(msg, e); + } catch (GroupManagementDAOException e) { + String msg = "Error occurred while retrieving group count of user '" + username + "'"; + log.error(msg, e); + throw new GroupManagementException(msg, e); + } finally { + GroupManagementDAOFactory.closeConnection(); + } + } + /** * {@inheritDoc} */ diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/util/HttpReportingUtil.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/util/HttpReportingUtil.java index 642b50da81..005274375a 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/util/HttpReportingUtil.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/util/HttpReportingUtil.java @@ -23,6 +23,7 @@ import io.entgra.device.mgt.core.device.mgt.core.DeviceManagementConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; @@ -32,6 +33,7 @@ import org.apache.http.protocol.HTTP; import org.json.JSONObject; import java.io.IOException; +import java.net.ConnectException; public class HttpReportingUtil { @@ -57,6 +59,9 @@ public class HttpReportingUtil { apiEndpoint.setEntity(requestEntity); HttpResponse response = client.execute(apiEndpoint); return response.getStatusLine().getStatusCode(); + } catch (ConnectException e) { + log.error("Connection refused to API endpoint: " + endpoint, e); + return HttpStatus.SC_SERVICE_UNAVAILABLE; } catch (IOException e) { throw new EventPublishingException("Error occurred when " + "invoking API. API endpoint: " + endpoint, e); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/java/io/entgra/device/mgt/core/device/mgt/core/TestHeartBeatManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/java/io/entgra/device/mgt/core/device/mgt/core/TestHeartBeatManagementService.java index 93140f9a55..9cda4c3a74 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/java/io/entgra/device/mgt/core/device/mgt/core/TestHeartBeatManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/java/io/entgra/device/mgt/core/device/mgt/core/TestHeartBeatManagementService.java @@ -66,4 +66,9 @@ public class TestHeartBeatManagementService implements HeartBeatManagementServic @Override public Map getActiveServers() throws HeartBeatManagementException { return null; } + + @Override + public void notifyClusterFormationChanged(int elapsedTimeInSeconds) throws HeartBeatManagementException { + + } } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/java/io/entgra/device/mgt/core/device/mgt/core/push/notification/mgt/task/PushNotificationSchedulerTaskTest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/java/io/entgra/device/mgt/core/device/mgt/core/push/notification/mgt/task/PushNotificationSchedulerTaskTest.java index bc593718d3..df04c2fb88 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/java/io/entgra/device/mgt/core/device/mgt/core/push/notification/mgt/task/PushNotificationSchedulerTaskTest.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/java/io/entgra/device/mgt/core/device/mgt/core/push/notification/mgt/task/PushNotificationSchedulerTaskTest.java @@ -31,6 +31,8 @@ import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationMana import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderServiceImpl; +import io.entgra.device.mgt.core.server.bootup.heartbeat.beacon.exception.HeartBeatManagementException; +import io.entgra.device.mgt.core.server.bootup.heartbeat.beacon.service.HeartBeatManagementService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mockito.Mockito; @@ -52,13 +54,16 @@ public class PushNotificationSchedulerTaskTest extends BaseDeviceManagementTest private PushNotificationSchedulerTask pushNotificationSchedulerTask; private OperationDAO operationDAO; + private HeartBeatManagementService heartBeatManagementService; @BeforeClass public void init() throws DeviceManagementException, RegistryException { DeviceConfigurationManager.getInstance().initConfig(); log.info("Initializing Push Notification Scheduler Test Class"); DeviceManagementServiceComponent.notifyStartupListeners(); this.deviceMgtProviderService = Mockito.mock(DeviceManagementProviderServiceImpl.class, Mockito.CALLS_REAL_METHODS); + this.heartBeatManagementService = Mockito.mock(HeartBeatManagementService.class, Mockito.CALLS_REAL_METHODS); DeviceManagementDataHolder.getInstance().setDeviceManagementProvider(this.deviceMgtProviderService); + DeviceManagementDataHolder.getInstance().setHeartBeatService(this.heartBeatManagementService); this.operationDAO = OperationManagementDAOFactory.getOperationDAO(); this.pushNotificationSchedulerTask = new PushNotificationSchedulerTask(); } @@ -69,6 +74,7 @@ public class PushNotificationSchedulerTaskTest extends BaseDeviceManagementTest OperationManagementDAOException { try { log.info("Attempting to execute push notification task scheduler"); + Mockito.when(this.heartBeatManagementService.isTaskPartitioningEnabled()).thenReturn(false); Mockito.doReturn(new TestNotificationStrategy()).when(this.deviceMgtProviderService) .getNotificationStrategyByDeviceType(Mockito.anyString()); Mockito.doReturn(new io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Operation()) @@ -81,6 +87,8 @@ public class PushNotificationSchedulerTaskTest extends BaseDeviceManagementTest .getPushNotificationConfiguration().getSchedulerBatchSize()); Assert.assertEquals(operationMappingsTenantMap.size(), 0); log.info("Push notification task execution complete."); + } catch (HeartBeatManagementException e) { + throw new RuntimeException(e); } finally { OperationManagementDAOFactory.closeConnection(); } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/resources/sql/h2.sql b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/resources/sql/h2.sql index ace89fc192..c326ee6d32 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/resources/sql/h2.sql +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/test/resources/sql/h2.sql @@ -73,6 +73,65 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_MAP ( REFERENCES DM_GROUP (ID) ON DELETE CASCADE ON UPDATE CASCADE ); +-- DM_GEOFENCE TABLE-- +CREATE TABLE IF NOT EXISTS DM_GEOFENCE +( + ID INT NOT NULL AUTO_INCREMENT, + FENCE_NAME VARCHAR(255) NOT NULL, + DESCRIPTION TEXT DEFAULT NULL, + LATITUDE DOUBLE DEFAULT NULL, + LONGITUDE DOUBLE DEFAULT NULL, + RADIUS DOUBLE DEFAULT NULL, + GEO_JSON TEXT DEFAULT NULL, + FENCE_SHAPE VARCHAR(100) DEFAULT NULL, + CREATED_TIMESTAMP TIMESTAMP NOT NULL, + OWNER VARCHAR(255) NOT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +); +-- END OF DM_GEOFENCE TABLE-- + +-- DM_GEOFENCE_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_GEOFENCE_GROUP_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + FENCE_ID INT NOT NULL, + GROUP_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_geofence_group_mapping_geofence FOREIGN KEY (FENCE_ID) REFERENCES + DM_GEOFENCE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_geofence_group_mapping_group FOREIGN KEY (GROUP_ID) REFERENCES + DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); +-- END OF DM_GEOFENCE_GROUP_MAPPING TABLE-- + +-- DM_DEVICE_EVENT TABLE -- +CREATE TABLE IF NOT EXISTS DM_DEVICE_EVENT +( + ID INT NOT NULL AUTO_INCREMENT, + EVENT_SOURCE VARCHAR(100) NOT NULL, + EVENT_LOGIC VARCHAR(100) NOT NULL, + ACTIONS TEXT DEFAULT NULL, + CREATED_TIMESTAMP TIMESTAMP NOT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +); +-- END OF DM_DEVICE_EVENT TABLE -- + +-- DM_DEVICE_EVENT_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_EVENT_GROUP_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + EVENT_ID INT NOT NULL, + GROUP_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_event_group_mapping_event FOREIGN KEY (EVENT_ID) REFERENCES + DM_DEVICE_EVENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_event_group_mapping_group FOREIGN KEY (GROUP_ID) REFERENCES + DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); +-- END OF DM_DEVICE_EVENT_GROUP_MAPPING TABLE-- + CREATE TABLE IF NOT EXISTS DM_OPERATION ( ID INTEGER AUTO_INCREMENT NOT NULL, TYPE VARCHAR(50) NOT NULL, @@ -82,6 +141,7 @@ CREATE TABLE IF NOT EXISTS DM_OPERATION ( INITIATED_BY VARCHAR(100) NULL, OPERATION_DETAILS BLOB DEFAULT NULL, ENABLED BOOLEAN NOT NULL DEFAULT FALSE, + TENANT_ID INTEGER NOT NULL, PRIMARY KEY (ID) ); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.extensions/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.extensions/pom.xml index 86ab9fe65d..093a8444d6 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.extensions/pom.xml +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.extensions/pom.xml @@ -22,7 +22,7 @@ device-mgt io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.extensions/src/test/resources/sql-files/h2.sql b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.extensions/src/test/resources/sql-files/h2.sql index a1cf506655..a67b29fa20 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.extensions/src/test/resources/sql-files/h2.sql +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.extensions/src/test/resources/sql-files/h2.sql @@ -68,6 +68,10 @@ CREATE TABLE IF NOT EXISTS DM_OPERATION ( CREATED_TIMESTAMP BIGINT NOT NULL, RECEIVED_TIMESTAMP BIGINT NULL, OPERATION_CODE VARCHAR(1000) NOT NULL, + INITIATED_BY VARCHAR(100) NULL, + OPERATION_DETAILS BLOB DEFAULT NULL, + ENABLED BOOLEAN NOT NULL DEFAULT FALSE, + TENANT_ID INTEGER NOT NULL, PRIMARY KEY (ID) ); diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.url.printer/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.url.printer/pom.xml index 3fb64a0407..6cb6789f7f 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.url.printer/pom.xml +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.url.printer/pom.xml @@ -23,7 +23,7 @@ device-mgt io.entgra.device.mgt.core - 5.0.29-SNAPSHOT + 5.0.31-SNAPSHOT ../pom.xml diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.ui/pom.xml deleted file mode 100644 index 94a0662265..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - device-mgt - io.entgra.device.mgt.core - 5.0.0-SNAPSHOT - ../pom.xml - - - 4.0.0 - org.wso2.carbon.device.mgt.ui - pom - WSO2 Carbon - Device Management Base UI - WSO2 Carbon - Device Management Base UI - https://entgra.io - - - - - maven-assembly-plugin - 2.5.5 - - ${project.artifactId}-${io.entgra.device.mgt.core.version} - false - - src/assembly/src.xml - - - - - create-archive - package - - single - - - - - - - - diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/assembly/src.xml b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/assembly/src.xml deleted file mode 100644 index 065aacf774..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/assembly/src.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - src - - zip - - false - ${basedir}/src - - - - ${basedir}/src/main/resources/jaggeryapps/devicemgt - /jaggeryapps/devicemgt-cdmf/ - true - - - - ${basedir}/src/main/resources/jaggeryapps/uuf-template-app - /jaggeryapps/uuf-template-app/ - true - - - ${basedir}/src/main/resources/jaggery-modules - /jaggery-modules/ - true - - - \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/module.xml b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/module.xml deleted file mode 100644 index 14f93c74aa..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/module.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/exception/exception.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/exception/exception.js deleted file mode 100644 index 2ee810e3aa..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/exception/exception.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Description: The response of the currently invoked api enpoint is organized - */ - -var exception = {}; -var log = new Log('exception_module'); - -(function(exception) { - /** - * - * @param message The exception description - * @param code HTTP STATUS CODE related to the exception - * @return The error object - */ - exception.buildExceptionObject = function(message, code) { - var error = {}; - error.message = message; - error.code = code; - return error; - }; - - exception.handleError = function (exception, type, code){ - var constants = require('rxt').constants; - - if (type == constants.THROW_EXCEPTION_TO_CLIENT) { - log.debug(exception); - var e = exceptionModule.buildExceptionObject(exception, code); - throw e; - } else if (type == constants.LOG_AND_THROW_EXCEPTION) { - log.error(exception); - throw exception; - } else if (type == constants.LOG_EXCEPTION_AND_TERMINATE) { - log.error(exception); - var msg = 'An error occurred while serving the request!'; - var e = exceptionModule.buildExceptionObject(msg, constants.STATUS_CODES.INTERNAL_SERVER_ERROR); - throw e; - } else if (type == constants.LOG_EXCEPTION_AND_CONTINUE) { - log.debug(exception); - } - else { - log.error(exception); - throw e; - } - }; -}(exception)) - diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/file/file.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/file/file.js deleted file mode 100644 index 94d0141bbf..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/file/file.js +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 file = {}; -(function() { - var log = new Log('utils-file'); - var CONTENT_MAP = { - 'js': 'application/javascript', - 'css': 'text/css', - 'csv': 'text/csv', - 'html': 'text/html', - 'json': 'application/json', - 'png': 'image/png', - 'jpeg': 'image/jpeg', - 'gif': 'image/gif', - 'svg': 'image/svg+xml', - 'ttf': 'application/x-font-ttf', - 'eot': 'application/vnd.ms-fontobject', - 'woff': 'application/font-woff', - 'otf': 'application/x-font-otf', - 'zip': 'application/zip', - 'xml': 'text/xml', - 'xhtml': 'application/xhtml+xml', - 'pdf': 'application/pdf' - }; - /** - * The function checks whether a directory contains a particular file - * @param dir The directory in which the file must be checked - * @param file A File object if the file exists,else null - */ - file.getFileInDir = function(dir, fileName) { - var isFilePresent = false; - var files = dir.listFiles(); - for (var index in files) { - if (files[index].getName() == fileName) { - return files[index]; - } - } - return null; - }; - /** - * The function returns the file extension of a filename - * @param file - * @return: The extension of the file - */ - file.getExtension = function(file) { - var baseFileName = file.getName(); - //Break up the name by . - var baseNameComponents = baseFileName.split('.'); - var extension = baseNameComponents[baseNameComponents.length - 1]; - return extension; - }; - /** - * The function obtains the MIME type based on the extension - * @param The extension - * @return The mime type - */ - file.getMimeType = function(extension) { - return CONTENT_MAP[extension]; - }; - /** - * The function returns the name of the file without the file extension - * @param file A file object - * @return: The name of the file without the extension - */ - file.getFileName = function(file) { - //Get the name of the file - var baseFileName = file.getName(); - //Break up the name by . - var baseNameComponents = baseFileName.split('.'); - //Get all of the components except the last one - baseNameComponents.splice(baseNameComponents.length - 1, 1); - return baseNameComponents.join('.'); - }; - /** - * The function returns the contents of a directory as a JSON object.The name of the - * file is used as the property names without the extensions. - * NOTE: The method will not traverse sub folders. - * @param The directory to be inspected - * @return A JSON object which contains the files in the directory - */ - file.getDirectoryContents = function(dir) { - var dirContents = {}; - //Check if it is a directory - if (!dir.isDirectory()) { - log.info('Not a directory'); - return dirContents; - } - //Obtain a list of all files - var files = this.getAllFiles(dir); - var name; - log.info('Files: ' + files); - //Create the directory object with each file been a property - for (var index in files) { - dirContents[this.getFileName(files[index])] = files[index]; - } - return dirContents; - }; - /** - * The function obtains a list of files that are not directories - * @param dir The directory to be inspected - * @return An array with all of the files in the directory - */ - file.getAllFiles = function(dir) { - var filesInDir = []; - if (!dir.isDirectory()) { - return filesInDir; - } - //Obtain a list of all files - var files = dir.listFiles(); - for (var index in files) { - log.info('Checking file: ' + files[index].getName()); - //Check if the file is a directory - if (!files[index].isDirectory()) { - filesInDir.push(files[index]); - } - } - return filesInDir; - }; - /** - * The function returns a list of all file names in a directory - * @param dir The directory to be inspected - * @return {An array containing the name of all files in a directory - */ - file.getAllFileNames = function(dir) { - var files = dir.listFiles(); - var list = []; - var fileName; - for (var index in files) { - if (files[index].isDirectory()) { - fileName=this.getFileName(files[index].getName()); - list.push(fileName); - } - } - return list; - }; - /** - * The function returns a list of all sub directories in a given directory - * @param dir The root directory - * @return: An array containing all sub directories - */ - file.getAllSubDirs = function(dir) { - var files = dir.listFiles(); - var subDirs = []; - for (var index in files) { - if (files[index].isDirectory()) { - subDirs.push(files[index]); - } - } - return subDirs; - }; -}()); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/patterns/patterns.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/patterns/patterns.js deleted file mode 100644 index 635be4a5fd..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/patterns/patterns.js +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 patterns = {}; - -(function () { - - var DEF_ERR_ARITY = 3; - var DEF_HANDLE_ARITY = 2; - var log = new Log('utils.patterns.GenericPipe'); - - function GenericPipe(options) { - this.errHandlerArity = DEF_ERR_ARITY || options.errArity; - this.handlerArity = DEF_HANDLE_ARITY || options.handlerArity; - this.plugins = []; - this.finalHandler = function () { - }; - } - - - /** - *The function registers the provided plugin - */ - GenericPipe.prototype.plug = function (plugin, options) { - var options = options || {}; - //Only a function - if (plugin instanceof Function) { - this.plugins.push({ - handle: plugin, - options: options - }); - } - //Is it a plugin object - else if (plugin instanceof Object) { - plugin.options = options; - this.plugins.push(plugin); - } - - return this; - }; - - GenericPipe.prototype.finally = function (plugin) { - this.finalHandler = plugin; - return this; - }; - - GenericPipe.prototype.resolve = function (data, req, res, session) { - var context = {}; - context.req = req; - context.res = res; - context.session = session; - context.data = data; - handle(context, this.plugins, this.errHandlerArity, this.handlerArity, this.finalHandler); - }; - - var handle = function (context, plugins, errArity, handlerArity, finallyHandler) { - var index = 0; - var currentPlugin; - - var recursiveHandle = function (err) { - - currentPlugin = plugins[index]; - - index++; - - //Check if there is a plugin - if (!currentPlugin) { - //log.warn('No plugin found at index: ' + index); - return; - } - - //Populate the options object for the plugin - context.options=currentPlugin.options;; - - //Check if an error has been provided - if (err) { - //Can the current plugin handle the err - if (currentPlugin.handle.length == errArity) { - try { - currentPlugin.handle(err, context,recursiveHandle); - } - catch (e) { - recursiveHandle(e); - } - } - else { - recursiveHandle(err); - } - } - //There is no error so try to invoke the current plugin - else { - if (currentPlugin.handle.length == handlerArity) { - try { - - - currentPlugin.handle(context,recursiveHandle); - } catch (e) { - recursiveHandle(e); - } - } - else { - recursiveHandle(); - } - } - }; - - recursiveHandle(); - finallyHandler(context); - }; - - patterns.GenericPipe = GenericPipe; - -}()); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/reflection/reflection.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/reflection/reflection.js deleted file mode 100644 index 5f290ddae9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/reflection/reflection.js +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 reflection = {}; -/** - * Description: The script encapsulates any reflection related utility functions - */ -(function() { - var log = new Log('utils-reflection'); - reflection.copyPropKeys = function(from, to) { - for (var key in from) { - if (from.hasOwnProperty(key)) { - to[key] = ''; - } - } - return to; - }; - /** - * The function recursively copies all property keys in an object - * @param from - * @param to - */ - reflection.copyAllPropKeys = function(from, to) { - recurse(from, to, function(from, to, key) { - if (from[key] instanceof Object) { - to[key] = from[key]; - } else { - to[key] = null; - } - }); - }; - reflection.copyAllPropValues = function(from, to) { - recurse(from, to, function(from, to, key) { - //Create an instance if the property does not exist - if (!to[key]) { - to[key] = {}; - } - //Copy the values over - if (!(from[key] instanceof Object)) { - to[key] = from[key]; - } else { - log.debug('Not copying values of key: ' + key); - } - }); - }; - /** - * The function will only copy public properties - * @param from - * @param to - */ - reflection.copyPublicPropValues = function(from, to) { - recurse(from, to, function(from, to, key) { - //Ignore any hidden properties - if (key.charAt(0) == '_') { - log.warn('Drop key: ' + key); - return; - } - //Create an instance if the property does not exist - if (!to[key]) { - to[key] = {}; - } - //Copy the values over - if (!(from[key] instanceof Object)) { - to[key] = from[key]; - } else { - log.warn('Not copying values of key: ' + key); - } - }); - }; - reflection.inspect = function(from, to, cb) { - recurse(from, to, cb); - }; - /** - * The function recursively traverses an object and then invokes the provided - * callback - * @param root - * @param clone - * @param cb - */ - var recurse = function(root, clone, cb) { - var key; - //Check if the root is an object - if (!(root instanceof Object)) { - return; - } else { - var keys = Object.keys(root); - //Go through all the other keys in the current root - for (var index in keys) { - key = keys[index]; - cb(root, clone, key); - recurse(root[key], clone[key], cb); - } - } - }; - reflection.copyProps = function(from, to) { - for (var key in from) { - if (from.hasOwnProperty(key)) { - to[key] = from[key]; - } - } - return to; - }; - reflection.getProps = function(obj) { - var props = {}; - for (var key in obj) { - if (!(obj[key] instanceof Function)) { - props[key] = obj[key]; - } - } - return props; - }; - reflection.printProps = function(obj) { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - log.info('key: ' + key); - } - } - }; - /** - * The function determines if a property is hidden based on _ - * @param key - * @returns {boolean} - */ - reflection.isHiddenProp = function(key) { - if (key == '') { - return false; - } - return (key.charAt(0) == '_') ? true : false; - }; - var getDiff = function(a, b, diff) {}; - /** - * The function calculates the differences between two simple JSON objects - * @param a The object with which b is compared - * @param b The target of the comparison - * @return An object which records the differences between the two objects - */ - reflection.diff = function(a, b) {}; - /** - * The function merges the two provided objects to create a new - * object.In the case where b has the same property as a; the property of b - * will have precedence - * @param {[type]} a [description] - * @param {[type]} b [description] - * @return A new object having the properties of both object a and b - */ - reflection.merge = function(a, b) { - var newObj = {}; - //Copy the properties of a first - for (var key in a) { - newObj[key] = b[key]; - } - //Override with the properties of b - for (var key in b) { - newObj[key] = b[key]; - } - return newObj; - }; - /** - * The function allows a child class to override a select set of methods of - * a parent class.The original methods of the parent can be accessed - * using the this._super keyword - * @param {[type]} parent The parent class instance to be overriden - * @param {[type]} child The child class instance containing methods which will override the parent - */ - reflection.override = function(parent, child) { - //Make a clone of the parent - var super = parse(stringify(parent)); - for (var childKey in child) { - for (var parentKey in parent) { - //Only override those methods that are common - if (childKey === parentKey) { - var parentPtr = parent[parentKey]; - var childPtr = child[childKey]; - //Update the clone with the old parent method - super[parentKey] = parentPtr; - parent[parentKey] = childPtr; - /*parent[parentKey] = function() { - var result=childPtr.apply(this, arguments)||null; - return result; - };*/ - } - } - } - //Allow the child object to call methods of the parent - parent._super = super; - }; - reflection.overrideAll=function(parent,child){ - //Make a clone of the parent - var super = parse(stringify(parent)); - for (var childKey in child) { - for (var parentKey in parent) { - //Only override those methods that are common - if ( (child.hasOwnProperty(childKey))&&(parent.hasOwnProperty(parentKey)) ) { - var parentPtr = parent[parentKey]; - var childPtr = child[childKey]; - //Update the clone with the old parent method - super[parentKey] = parentPtr; - parent[parentKey] = childPtr; - /*parent[parentKey] = function() { - var result=childPtr.apply(this, arguments)||null; - return result; - };*/ - } - } - } - //Allow the child object to call methods of the parent - parent._super = super; - }; - reflection.isArray = function(object) { - if (Object.prototype.toString.call(object) === '[object Array]') { - return true; - } - return false; - }; -}()); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/request/request.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/request/request.js deleted file mode 100644 index dd8aba4a59..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/request/request.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 request = {}; -(function(request) { - var hasOwnProperty = function(obj, element) { - return Object.prototype.hasOwnProperty.call(obj, element); - }; - var isObject = function(object) {; - return typeof object === 'object'; - }; - /* - * ECMA Standard (ECMA-262 : 5.1 Edition)*/ - var decodes = function(encodedURI) { - return decodeURIComponent(encodedURI); - }; - request.getQueryOptions = function(queryString) { - var opt={}; - var sep = opt.sep || '&', - assign = opt.assign || '=', - compoArray = []; - var obj = {}; - var decodedURI = decodes(queryString); - decodedURI.split(sep).forEach(function(comp) { - comp.split(assign).some(function(element, index, array) { - if (hasOwnProperty(obj, element.toString())) { - compoArray.push(obj[element]); - compoArray.push(array[1]); - obj[element] = compoArray; - } else { - Object.defineProperty(obj, element, { - enumerable: true, - writable: true, - value: array[1] - }); - } - return true; - }); - }); - return obj; - }; -}(request)) \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/response/response.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/response/response.js deleted file mode 100644 index 0887f9b8cf..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/response/response.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Description: The response of the currently invoked api endpoint is organized - */ - -var response = {}; -var log = new Log("response"); - -(function(response) { - - /** - * Build Error response - * @param resp jaggery-response object to retrieve to client - * @param code status code - * @param message message to the client side - * @return return response - */ - response.buildErrorResponse = function(resp,code,message) { - var content={}; - content.error = message; - resp = processResponse(resp,code,content); - return resp; - }; - - /** - * Build success response - * @param resp jaggery response object - * @param code status code - * @param data the result to client - * @return return response - */ - response.buildSuccessResponse= function(resp, code, data){ - var content={}; - content.data = data; - resp = processResponse(resp,code,content); - return resp; - }; - - /** - * process General response - * @param resp jaggery response - * @param code status code - * @param data success result - * @return resp jaggery response - */ - response.buildSuccessResponseForRxt= function(resp, code, data){ - resp.status = code; - resp.content = data; - return resp; - }; - - /** - * General response builder - * @param resp jaggery response - * @param code status code - * @param content what ever the content to be sent as response - * @return resp jaggery response - */ - function processResponse(resp, code, content){ - resp.status = code; - resp.contentType = 'application/json'; - resp.content = content; - return resp; - - }; - - /** - * - * @param resp - * @param code - * @param data - * @return The http response - */ - response.buildSuccessResponseForRxt= function(resp, code, data){ - resp.contentType = 'application/json'; - resp.status = code; - resp.content = data; - return resp; - }; - -}(response)) \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/time/time.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/time/time.js deleted file mode 100644 index e696ba3dd3..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/time/time.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 time = {}; -(function(time) { - time.getCurrentTime = function(dateLength) { - var dateLength=dateLength||20; - var now = new String(new Date().valueOf()); - var length = now.length; - var prefix = dateLength; - var onsetVal = ''; - if (length != prefix) { - var onset = prefix - length; - for (var i = 0; i < onset; i++) { - onsetVal += '0'; - } - } - return onsetVal + now; - }; -}(time)); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/url/url.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/url/url.js deleted file mode 100644 index a725a15aca..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/url/url.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 url = {}; -(function() { - var log=new Log('utils-url'); - url.popServerDetails = function(obj) { - var process = require('process'); - var localIP = process.getProperty('server.host'); - var httpPort = process.getProperty('http.port'); - var httpsPort = process.getProperty('https.port'); - var value = ''; - var carbonLocalIP = process.getProperty('carbon.local.ip'); - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - value = obj[key]; - if ((typeof value === 'string') && value.indexOf('%https.host%') > -1) { - value=value.replace('%https.host%', 'https://' + localIP + ':' + httpsPort); - } else if ((typeof value === 'string') && value.indexOf('%http.host%') > -1) { - value=value.replace('%http.host%', 'http://' + localIP + ':' + httpPort); - } else if ((typeof value === 'string') && value.indexOf('%https.carbon.local.ip%') > -1) { - value=value.replace('%https.carbon.local.ip%', 'https://' + carbonLocalIP + ':' + httpsPort); - } else if ((typeof value === 'string') && value.indexOf('%http.carbon.local.ip%') > -1) { - value=value.replace('%http.carbon.local.ip%', 'http://' + carbonLocalIP + ':' + httpPort); - } - obj[key] = value; - } - } - return obj; - }; -}(url)); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/xml/xml.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/xml/xml.js deleted file mode 100644 index 19c3f52892..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/xml/xml.js +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 xml = {}; - -(function () { - - var log=new Log('util.xml') - - /* - The method is used to create a JSON object using - an xml object. - @xmlElement: An xml element object to be processed - @return: A pseudo object containing the properties of the - xml element. - */ - var createJSONObject = function (xmlElement) { - - var pseudo = {}; - - //Extract all attributes - var attributes = xmlElement.@*; - - //Fill the pseudo object with the attributes of the element - for (var attributeKey in attributes) { - var attribute = attributes[attributeKey]; - pseudo[attribute.localName()] = attribute.toString(); - } - - return pseudo; - }; - - /* - The function converts an E4X Xml object to a JSON object - This function has been adapted from the work of Oleg Podsechin available at - https://gist.github.com/olegp/642667 - It uses a slightly modified version of his algorithm , therefore - all credit should be attributed to Oleg Podsechin. - IMPORTANT: - 1. It does not create a 1..1 mapping due to the differences - between Xml and JSON.It is IMPORTANT that you verify the structure - of the object generated before using it. - 2. The input xml object must not contain the xml header information - This is a known bug 336551 (Mozilla Developer Network) - Source: https://developer.mozilla.org/en/docs/E4X - Please remove the header prior to sending the xml object for processing. - @root: A starting element in an E4X Xml object - @return: A JSON object mirroring the provided Xml object - */ - var recursiveConvertE4XtoJSON = function (root) { - - log.debug('Root: ' + root.localName()); - - //Obtain child nodes - var children = root.*; - - //The number of children - var numChildren = children.length(); - - //No children - if (numChildren == 0) { - - //Extract contents - return createJSONObject(root); - } - else { - - //Create an empty object - var rootObject = createJSONObject(root); - - //Could be multiple children - for (var childElementKey in children) { - - var child = children[childElementKey]; - - log.debug('Examining child: ' + child.localName()); - - //If the child just contains a single value then stop - if (child.localName() == undefined) { - - log.debug('Child is undefined: ' + child.toString()); - - //Change the object to just a key value pair - rootObject[root.localName()] = child.toString(); - return rootObject; - } - - //Make a recursive call to construct the child element - var createdObject = recursiveConvertE4XtoJSON(child); - - log.debug('Converted object: ' + stringify(createdObject)); - - //Check if the root object has the property - if (rootObject.hasOwnProperty(child.localName())) { - - log.debug('key: ' + child.localName() + ' already present.'); - rootObject[child.localName()].push(createdObject); - } - else { - - log.debug('key: ' + child.localName() + ' not present.'); - rootObject[child.localName()] = []; - rootObject[child.localName()].push(createdObject); - - } - } - - log.debug('root: ' + root.localName()); - - return rootObject; - } - }; - - /** - * The function is used to convert an E4X xml to JSON - * @param root - */ - xml.convertE4XtoJSON = function (root) { - return recursiveConvertE4XtoJSON(root); - }; - - -}()); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/data-tables-invoker-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/data-tables-invoker-api.jag deleted file mode 100644 index 58e5099007..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/data-tables-invoker-api.jag +++ /dev/null @@ -1,113 +0,0 @@ -<% -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -var log = new Log("api/data-tables-invoker-api.jag"); - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; -var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; -var utility = require("/app/modules/utility.js")["utility"]; -var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; -var EnrolmentInfo = Packages.io.entgra.device.mgt.core.device.mgt.common.EnrolmentInfo; - -var DTYPE_CONF_DEVICE_TYPE_KEY = "deviceType"; -var DTYPE_CONF_DEVICE_TYPE_LABEL_KEY = "label"; - -function appendQueryParam (url, queryParam , value) { - if (url.indexOf("?") > 0) { - return url + "&" + queryParam + "=" + value; - } - return url + "?" + queryParam + "=" + value; -} - -if (uriMatcher.match("/{context}/api/data-tables/invoker/filters")) { - var result = {}; - var i; - //Fetching Status types - var status = EnrolmentInfo.Status.values(); - var statusArr = []; - for(i = 0; i < status.length; i++){ - statusArr.push(status[i].name()); - } - result.status = statusArr; - //Fetching Ownership types - var ownership = EnrolmentInfo.OwnerShip.values(); - var ownershipArr = []; - for(i = 0; i < ownership.length; i++){ - ownershipArr.push(ownership[i].name()); - } - result.ownership = ownershipArr; - //Fetching Device Types - result.deviceTypes = []; - var deviceTypesRes = deviceModule.getDeviceTypes(); - if (deviceTypesRes.status === "success") { - var deviceTypes = deviceTypesRes["content"]; - for (i = 0; i < deviceTypes.length; i++) { - var deviceTypeName = deviceTypes[i].name; - var deviceTypeLabel = deviceTypeName.charAt(0).toUpperCase() + deviceTypeName.slice(1); - var configs = utility.getDeviceTypeConfig(deviceTypeLabel); - if (configs) { - if (configs[DTYPE_CONF_DEVICE_TYPE_KEY][DTYPE_CONF_DEVICE_TYPE_LABEL_KEY]) { - deviceTypeLabel = configs[DTYPE_CONF_DEVICE_TYPE_KEY][DTYPE_CONF_DEVICE_TYPE_LABEL_KEY]; - } - } - result.deviceTypes.push({"name": deviceTypeLabel, "value": deviceTypeName}); - } - } - //Adding policy compliance - result.compliance = ["MONITOR", "ENFORCE", "WARN", "BLOCK"]; - result.depStatus = ["Empty", "Assigned", "Pushed", "Removed"]; - response["status"] = 200; - response["content"] = result; - response["contentType"] = "application/json"; -} else if (uriMatcher.match("/{context}/api/data-tables/invoker")) { - var url = request.getParameter("url"); - var targetURL = devicemgtProps["httpsURL"] + request.getParameter("url"); - //noinspection JSUnresolvedFunction getAllParameters - var allParams = request.getAllParameters(); - - for (var allParamsKey in allParams) { - if (allParams.hasOwnProperty(allParamsKey)) { - if (allParamsKey == "limit" || allParamsKey == "offset") { - targetURL = appendQueryParam(targetURL, allParamsKey, allParams[allParamsKey]); - } else if (allParamsKey == "filter") { - if (allParams[allParamsKey]) { - var searchPayload = JSON.parse(allParams[allParamsKey]); - for (var searchPayloadKey in searchPayload) { - if (searchPayload.hasOwnProperty(searchPayloadKey)) { - targetURL = appendQueryParam(targetURL, searchPayloadKey, searchPayload[searchPayloadKey]); - } - } - } - } - } - } - - serviceInvokers.XMLHttp.get( - targetURL, - // response callback - function (backendResponse) { - response["status"] = backendResponse["status"]; - response["content"] = utility.encodeJson(backendResponse["responseText"]); - response["contentType"] = "application/json"; - } - ); -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/device-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/device-api.jag deleted file mode 100644 index a214f536e9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/device-api.jag +++ /dev/null @@ -1,227 +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. - */ - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var log = new Log("api/device-api.jag"); -var constants = require("/app/modules/constants.js"); -var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; -var utility = require("/app/modules/utility.js").utility; -var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; -var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; -var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - -var user = session.get(constants.USER_SESSION_KEY); -var result; - -response.contentType = 'application/json'; - -if (!user) { - response.sendRedirect("/devicemgt/login?#login-required"); - exit(); -} else { - if (uriMatcher.match("/{context}/api/devices/sketch/download")) { - // works as a proxy to pass the relavant query string to back end api. - var queryString = request.getQueryString(); - if (!queryString) { - queryString = ""; - } else { - queryString = "?" + queryString; - } - - var deviceType = request.getParameter("deviceType"); // need a better solution here - deviceTypeConfig = utility.getDeviceTypeConfig(deviceType); - if (deviceTypeConfig && deviceTypeConfig.deviceType.downloadAgentUri) { - hearders = [{"name": constants["ACCEPT_IDENTIFIER"], "value": constants["APPLICATION_ZIP"]}]; - sketchDownloadEndPoint = devicemgtProps["httpsURL"] + "/" + deviceTypeConfig.deviceType.downloadAgentUri; - serviceInvokers.HttpClient.get(sketchDownloadEndPoint + queryString, function (responsePayload, responseHeaders) { - if (responseHeaders) { - for (var i = 0; i < responseHeaders.length; i++) { - var header = responseHeaders[i]; - var headerName = String(header.getName()); - var headerValue = String(header.getValue()); - response.addHeader(headerName, headerValue); - } - var streamObject = new Stream(responsePayload); - print(streamObject); - } else { - return responsePayload; - } - }, function (responsePayload) { - log.error(responsePayload); - var response = {}; - response["status"] = "error"; - return response; - } - , hearders); - } else { - result = 400; - } - } else if (uriMatcher.match("/{context}/api/devices/sketch/generate_link")) { - - if (!request.getContent()){ - log.error("Request Payload Is Empty"); - // HTTP status code 400 refers to - Bad request. - result = 400; - } else{ - deviceType = request.getContent()["deviceType"]; - queryString = "?deviceName=" + request.getContent()["deviceName"] +"&deviceType="+ - request.getContent()["deviceType"]+"&sketchType="+request.getContent()["sketchType"]; - deviceTypeConfig = utility.getDeviceTypeConfig(deviceType); - if (deviceTypeConfig && deviceTypeConfig.deviceType.downloadAgentUri) { - - sketchDownloadEndPoint = devicemgtProps["httpsURL"] + "/" + deviceTypeConfig.deviceType.downloadAgentUri; - - var requestUrl = sketchDownloadEndPoint + queryString - result = "curl -k -o "+request.getContent()["deviceName"]+".zip -H \"Authorization: Bearer " - +JSON.parse(session.get(constants["TOKEN_PAIR"])).accessToken+"\" " +"'"+requestUrl+"'"; - - } else { - // HTTP status code 400 refers to - Bad request. - result = 400; - } - } - - } else if (uriMatcher.match("/{context}/api/devices/all")) { - result = deviceModule.getOwnDevices(); - - } else if (uriMatcher.match("/{context}/api/devices/count")) { - var count = deviceModule.getOwnDevicesCount().data; - result = count.toString(); - - } else if (uriMatcher.match("/{context}/api/devices/types")) { - result = deviceModule.listDeviceTypes(); - - } else if (uriMatcher.match("/{context}/api/devices/{deviceType}/{deviceId}/remove")) { - var elements = uriMatcher.elements(); - var deviceId = elements.deviceId; - var deviceType = elements.deviceType; - result = deviceModule.removeDevice(deviceType, deviceId); - - } else if (uriMatcher.match("/{context}/api/devices/{deviceType}/{deviceId}/update")) { - var elements = uriMatcher.elements(); - var deviceId = elements.deviceId; - var deviceType = elements.deviceType; - var deviceName = request.getParameter("name"); - result = deviceModule.updateDevice(deviceType, deviceId, deviceName); - } else if (uriMatcher.match("/{context}/api/devices")) { - var url = request.getParameter("url"); - var draw = request.getParameter("draw"); - var length = request.getParameter("length"); - var start = request.getParameter("start"); - var search = request.getParameter("search[value]"); - var deviceName = request.getParameter("columns[1][search][value]"); - var owner = request.getParameter("columns[2][search][value]"); - var status = request.getParameter("columns[3][search][value]"); - var platform = request.getParameter("columns[4][search][value]"); - var ownership = request.getParameter("columns[5][search][value]"); - var targetURL; - - function appendQueryParam (url, queryParam , value) { - if (url.indexOf("?") > 0) { - return url + "&" + queryParam + "=" + value; - } - return url + "?" + queryParam + "=" + value; - } - targetURL = devicemgtProps.httpsURL + request.getParameter("url"); - targetURL = appendQueryParam(targetURL, "draw", draw); - targetURL = appendQueryParam(targetURL, "start", start); - targetURL = appendQueryParam(targetURL, "length", length); - - if (search && search !== "") { - targetURL = appendQueryParam(targetURL, "search", search); - } - - if (deviceName && deviceName !== "") { - targetURL = appendQueryParam(targetURL, "device-name", deviceName); - } - - if (owner && owner !== "") { - targetURL = appendQueryParam(targetURL, "user", owner); - } - - if (status && status !== "") { - targetURL = appendQueryParam(targetURL, "status", status); - } - - if (platform && platform !== "") { - targetURL = appendQueryParam(targetURL, "type", platform); - } - - if (ownership && ownership !== "") { - targetURL = appendQueryParam(targetURL, "ownership", ownership); - } - - serviceInvokers.XMLHttp.get( - targetURL, function (responsePayload) { - response.status = 200; - result = responsePayload; - }, - function (responsePayload) { - response.status = responsePayload.status; - result = responsePayload.responseText; - }); - } else if (uriMatcher.match("/{context}/api/devices/")) { - if (userModule.isAuthorized("/permission/admin/device-mgt/devices/list")) { - result = deviceModule.listDevices(); - } else { - response.sendError(403); - } - } else if (uriMatcher.match("/{context}/api/devices/{type}/{deviceId}")) { - elements = uriMatcher.elements(); - deviceId = elements.deviceId; - type = elements.type; - if (userModule.isAuthorized("/permission/admin/device-mgt/devices/list")) { - result = deviceModule.viewDevice(type, deviceId); - }else { - response.sendError(403); - } - } else if (uriMatcher.match("/{context}/api/devices/agent/{type}/{deviceId}/config")) { - elements = uriMatcher.elements(); - deviceId = elements.deviceId; - type = elements.type; - operation = elements.operation; - if (userModule.isAuthorized("/permission/admin/device-mgt/devices/owning-device")) { - result = deviceModule.getDeviceAgentConfig(type, deviceId); - if (!result) { - response.sendError(500); - } - } else { - response.sendError(403); - } - } else if (uriMatcher.match("{context}/api/devices/{type}/{deviceId}/{operation}")) { - elements = uriMatcher.elements(); - deviceId = elements.deviceId; - type = elements.type; - operation = elements.operation; - if (userModule.isAuthorized("/permission/admin/device-mgt/devices/operation")) { - result = deviceModule.performOperation(deviceId, operation, [], type); - } else { - response.sendError(403); - } - } -} - -// Returning the result. -if (result) { - print(result); -} - -%> \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/enterprise.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/enterprise.jag deleted file mode 100644 index b131ac6ab3..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/enterprise.jag +++ /dev/null @@ -1,138 +0,0 @@ -<% -var log = new Log("api/enterprise.jag"); - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var constants = require("/app/modules/constants.js"); -var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; -var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; -var restAPIRequestDetails = request.getContent(); -var result; -var user = session.get(constants.USER_SESSION_KEY); - -// This checks if the session is valid -getAccessToken = function() { - if (session) { - var tokenPair = session.get(constants["TOKEN_PAIR"]); - if (tokenPair) { - return parse(tokenPair)["accessToken"]; - } - } - return null; -}; - -callBackend = function(url, token, method, payload) { - var xmlHttpRequest = new XMLHttpRequest(); - xmlHttpRequest.open(method, url); - xmlHttpRequest.setRequestHeader(constants["AUTHORIZATION_HEADER"], constants["BEARER_PREFIX"] + token); - xmlHttpRequest.setRequestHeader(constants["CONTENT_TYPE_IDENTIFIER"], constants["APPLICATION_JSON"]); - xmlHttpRequest.setRequestHeader(constants["ACCEPT_IDENTIFIER"], constants["APPLICATION_JSON"]); - if (payload) { - xmlHttpRequest.send(payload); - } else { - xmlHttpRequest.send(); - } - response["status"] = xmlHttpRequest["status"]; - if (xmlHttpRequest["responseText"]) { - result = xmlHttpRequest["responseText"]; - response["content"] = xmlHttpRequest["responseText"]; - } -}; - -var accessToken = getAccessToken(); -if (!user || accessToken == null) { - response.sendRedirect("/devicemgt/login?#login-required"); - exit(); -} else { - response.contentType = 'application/json'; - if (uriMatcher.match("/{context}/api/enterprise/token")) { - session.put("externalEndpoint", restAPIRequestDetails["endpoint"]); - session.put("externalToken", restAPIRequestDetails["externalToken"]); - log.info("Calling get token"); - callBackend(restAPIRequestDetails["endpoint"], session.get("externalToken"), "POST", restAPIRequestDetails); - if (response["status"] && response["status"] == 200) { - var completionToken = parse(result)["completionToken"]; - if (completionToken) { - log.info("Token received"); - session.put("completionToken", completionToken) - } - } - } else if (uriMatcher.match("/{context}/api/enterprise/enroll-complete")) { - var tokenEndpoint = session.get("externalEndpoint") - var enterpriseEndpoint = tokenEndpoint.replace("signup-url", "complete-signup"); - - var completionToken = session.get("completionToken"); - var enterpriseToken = request.getParameter("enterpriseToken"); - - log.debug("completionToken" + completionToken + ", enterpriseEndpoint" + enterpriseEndpoint + - ", enterpriseToken" + enterpriseToken); - - var requestPayload = {} - requestPayload.completionToken = completionToken; - requestPayload.enterpriseToken = enterpriseToken; - log.info("Calling complete-signup"); - callBackend(enterpriseEndpoint, session.get("externalToken"), "POST", requestPayload); - - var enterpriseId = parse(result)["id"]; - if (enterpriseId) { - log.info("Calling complete-signup success"); - var serviceAccountRequest = {}; - serviceAccountRequest.enterpriseId = enterpriseId; - serviceAccountRequest.keyType = "googleCredentials" - - var enterpriseEndpoint = tokenEndpoint.replace("signup-url", "create-esa"); - - log.info("Calling create-esa"); - callBackend(enterpriseEndpoint, session.get("externalToken"), "POST", serviceAccountRequest); - var data = parse(result)["data"]; - log.info("Calling create-esa success" + data); - - var androidConfigAPI = devicemgtProps["httpsURL"] + "/api/device-mgt/android/v1.0/configuration"; - log.info("fetching platform configs"); - callBackend(androidConfigAPI, accessToken, "GET"); - - var configurationsList = parse(result); - - for (var x = 0; x < configurationsList.configuration.length; x++) { - if (configurationsList.configuration[x].name == "esa" || configurationsList.configuration[x].name == "enterpriseId") { - configurationsList.configuration.splice(x, 1); - } - } - log.info("fetching platform configs success"); - var payloadToAdd = {}; - payloadToAdd.contentType = "text"; - payloadToAdd.name = "esa"; - payloadToAdd.value = data; - - var enterpriseIdPayload = {}; - enterpriseIdPayload.contentType = "text"; - enterpriseIdPayload.name = "enterpriseId"; - enterpriseIdPayload.value = enterpriseId; - - configurationsList.configuration[configurationsList.configuration.length] = payloadToAdd; - configurationsList.configuration[configurationsList.configuration.length] = enterpriseIdPayload; - - log.info("saving platform configs"); - callBackend(androidConfigAPI, accessToken, "PUT", configurationsList); - log.info("saving platform configs success"); - if (response["status"] == 200) { - log.info("Process successful!! Redirecting..."); - response.sendRedirect("/devicemgt/platform-configuration?enterprise-success=true"); - } - } - } else if (uriMatcher.match("/{context}/api/enterprise/unenroll")) { - session.put("externalEndpoint", restAPIRequestDetails["endpoint"]); - session.put("externalToken", restAPIRequestDetails["externalToken"]); - callBackend(restAPIRequestDetails["endpoint"], session.get("externalToken"), "GET", restAPIRequestDetails); - log.info("Calling unenroll"); - if (response["status"] == 200) { - log.info("Unenroll success, wiping devices."); - var wipeURL = devicemgtProps["httpsURL"] + "/api/device-mgt/android/v1.0/enterprise/wipe-device" - callBackend(wipeURL, accessToken, "GET"); - } - } - -} - -%> diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/group-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/group-api.jag deleted file mode 100644 index 2ba4ebba9e..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/group-api.jag +++ /dev/null @@ -1,87 +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. - */ - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var log = new Log("api/device-api.jag"); -var constants = require("/app/modules/constants.js"); -var utility = require("/app/modules/utility.js").utility; -var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; -var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - -var user = session.get(constants.USER_SESSION_KEY); -var result; - -response.contentType = 'application/json'; - -if (!user) { - response.sendRedirect("/devicemgt/login?#login-required"); - exit(); -} else { - if (uriMatcher.match("/{context}/api/groups")) { - var url = request.getParameter("url"); - var draw = request.getParameter("draw"); - var length = request.getParameter("length"); - var start = request.getParameter("start"); - var search = request.getParameter("search[value]"); - var groupName = request.getParameter("columns[1][search][value]"); - var owner = request.getParameter("columns[2][search][value]"); - var targetURL; - - function appendQueryParam(url, queryParam, value) { - if (url.indexOf("?") > 0) { - return url + "&" + queryParam + "=" + value; - } - return url + "?" + queryParam + "=" + value; - } - - targetURL = devicemgtProps.httpsURL + request.getParameter("url"); - targetURL = appendQueryParam(targetURL, "start", start); - targetURL = appendQueryParam(targetURL, "length", length); - - if (search && search !== "") { - targetURL = appendQueryParam(targetURL, "search", search); - } - - if (groupName && groupName !== "") { - targetURL = appendQueryParam(targetURL, "group-name", groupName); - } - - if (owner && owner !== "") { - targetURL = appendQueryParam(targetURL, "user", owner); - } - - serviceInvokers.XMLHttp.get( - targetURL, function (responsePayload) { - response.status = 200; - result = responsePayload; - }, - function (responsePayload) { - response.status = responsePayload.status; - result = responsePayload.responseText; - }); - } -} - -if (result) { - print(result); -} - -%> \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/invoker-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/invoker-api.jag deleted file mode 100644 index 8ac28da95f..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/invoker-api.jag +++ /dev/null @@ -1,119 +0,0 @@ -<% -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -var log = new Log("api/invoker-api.jag"); - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var constants = require("/app/modules/constants.js"); -var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; -var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - -if (uriMatcher.match("/{context}/api/invoker/execute/")) { - //NOTE: We are only interested in Content-Type headers. Appending all request headers to the back-end call - // will cause unforeseen security issues. - var contentType = request.getHeader(constants.CONTENT_TYPE_IDENTIFIER); - var acceptType = request.getHeader(constants.ACCEPT_IDENTIFIER); - var requestHeaders = []; - requestHeaders.push({"name": constants.CONTENT_TYPE_IDENTIFIER, "value" : contentType}); - requestHeaders.push({"name": constants.ACCEPT_IDENTIFIER, "value" : acceptType}); - - var restAPIRequestDetails = request.getContent(); - - var requestMethod = restAPIRequestDetails["requestMethod"]; - var requestURL = restAPIRequestDetails["requestURL"]; - var requestPayload = restAPIRequestDetails["requestPayload"]; - - if (!requestMethod) { - requestMethod = parse(restAPIRequestDetails)["requestMethod"]; - } - - if (!requestURL) { - requestURL = parse(restAPIRequestDetails)["requestURL"]; - } - - if (!requestPayload) { - requestPayload = parse(restAPIRequestDetails)["requestPayload"]; - } - - var restAPIEndpoint = devicemgtProps["httpsURL"] + requestURL; - - try { - switch (requestMethod) { - case constants["HTTP_GET"]: - serviceInvokers.XMLHttp.get( - restAPIEndpoint, - function (restAPIResponse) { - response["status"] = restAPIResponse["status"]; - if (restAPIResponse["responseText"]) { - response["content"] = restAPIResponse["responseText"]; - } - }, - requestHeaders - ); - break; - case constants["HTTP_POST"]: - serviceInvokers.XMLHttp.post( - restAPIEndpoint, - requestPayload, - function (restAPIResponse) { - response["status"] = restAPIResponse["status"]; - if (restAPIResponse["responseText"]) { - response["content"] = restAPIResponse["responseText"]; - } - }, - requestHeaders - ); - break; - case constants["HTTP_PUT"]: - serviceInvokers.XMLHttp.put( - restAPIEndpoint, - requestPayload, - function (restAPIResponse) { - response["status"] = restAPIResponse["status"]; - if (restAPIResponse["responseText"]) { - response["content"] = restAPIResponse["responseText"]; - } - }, - requestHeaders - ); - break; - case constants["HTTP_DELETE"]: - serviceInvokers.XMLHttp.delete( - restAPIEndpoint, - function (restAPIResponse) { - response["status"] = restAPIResponse["status"]; - if (restAPIResponse["responseText"]) { - response["content"] = restAPIResponse["responseText"]; - } - }, - requestHeaders - ); - break; - } - } catch (e) { - //Since this is an API we'll log the error message. - log.error(e.message); // JavaScript error message - log.error(e.stack); // Executed JavaScript file stack - throw new Error("Exception occurred while trying to access " + - "backend REST API services from Jaggery API invoker layer", e); - } -} -%> diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/operation-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/operation-api.jag deleted file mode 100644 index 9fa2a37353..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/operation-api.jag +++ /dev/null @@ -1,68 +0,0 @@ -<% -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var log = new Log("api/operation-api.jag"); - -var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; -var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - -if (uriMatcher.match("/{context}/api/operation/paginate")) { - var deviceType = request.getParameter("deviceType"); - var deviceId = request.getParameter("deviceId"); - var owner = request.getParameter("owner"); - var ownership = request.getParameter("ownership"); - var index = request.getParameter("start"); - var length = request.getParameter("length"); - var search = request.getParameter("search[value]"); - - var restAPIEndpoint = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/devices/" + deviceType + "/" + deviceId + "/operations?owner=" + owner + "&ownership=" + ownership + - "&offset=" + index + "&limit=" + length; - - serviceInvokers.XMLHttp.get( - restAPIEndpoint, - function (restAPIResponse) { - if (restAPIResponse["status"] == 200 && restAPIResponse["responseText"]) { - var responsePayload = parse(restAPIResponse["responseText"]); - - var paginatedResult = {}; - paginatedResult["recordsTotal"] = responsePayload["count"]; - paginatedResult["recordsFiltered"] = responsePayload["count"]; - paginatedResult["data"] = responsePayload["operations"]; - - response["status"] = restAPIResponse["status"]; - response["content"] = paginatedResult; - } else { - response["status"] = restAPIResponse["status"]; - if (restAPIResponse["responseText"]) { - var responseText = ""; - try { - response["content"] = parse(restAPIResponse["responseText"]); - } catch (e) { - responseText = restAPIResponse["responseText"]; - } - } - } - } - ); -} -%> \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/policy-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/policy-api.jag deleted file mode 100644 index 5ae93fdde7..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/policy-api.jag +++ /dev/null @@ -1,52 +0,0 @@ -<% -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/* - @Deprecated - */ - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var log = new Log("api/policy-api.jag"); - -var constants = require("/modules/constants.js"); -var policyModule = require("/app/modules/business-controllers/group.js")["groupModule"]; - -var result; -if (uriMatcher.match("/{context}/api/policies/update")) { - payload = request.getContent(); - policyModule.updatePolicyPriorities(payload); -} else if (uriMatcher.match("/{context}/api/policies/{id}/delete")) { - elements = uriMatcher.elements(); - policyId = elements.id; - try { - result = policyModule.deletePolicy(policyId); - } catch (e) { - log.error("Exception occurred while trying to delete policy for id:" + policyId, e); - // http status code 500 refers to - Internal Server Error. - result = 500; - } -} - -// returning the result. -if (result) { - response.content = result; -} -%> \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/stats-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/stats-api.jag deleted file mode 100644 index 6919a492a3..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/stats-api.jag +++ /dev/null @@ -1,77 +0,0 @@ -<% -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var log = new Log("api/stats-api.jag"); - -var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; -var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - -if (uriMatcher.match("/{context}/api/stats/paginate")) { - var deviceType = request.getParameter("deviceType"); - var deviceId = request.getParameter("deviceId"); - var from = request.getParameter("from"); - var to = request.getParameter("to"); - var index = request.getParameter("start"); - var length = request.getParameter("length"); - var keys = request.getParameter("attributes"); - keys = JSON.parse(keys); - var restAPIEndpoint = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/events/" - + deviceType + "/" + deviceId + "?offset=" + index +"&limit=" + length + "&from="+ from + "&to=" + to; - serviceInvokers.XMLHttp.get( - restAPIEndpoint, - function (restAPIResponse) { - if (restAPIResponse["status"] == 200 && restAPIResponse["responseText"]) { - var responsePayload = parse(restAPIResponse["responseText"]); - - var paginatedResult = {}; - paginatedResult["recordsTotal"] = responsePayload["count"]; - paginatedResult["recordsFiltered"] = responsePayload["count"]; - var records = responsePayload["records"]; - var dataSet = []; - for (var i = 0; i < records.length; i++){ - var record = records[i]; - var timestamp = record["timestamp"]; - var dataRow = []; - dataRow.push(timestamp); - for (var j = 0; j < keys.length; j++) { - var key = keys[j]; - dataRow.push(record.values[key]); - } - //dataSet.push(dataRow); - dataSet.push(dataRow); - } - paginatedResult["data"] = dataSet; - response["status"] = restAPIResponse["status"]; - response["content"] = paginatedResult; - } else { - response["status"] = 204; - var paginatedResult = {}; - var dataSet = []; - paginatedResult["recordsTotal"] = 0; - paginatedResult["recordsFiltered"] = 0; - paginatedResult["data"] = dataSet; - response["content"] = paginatedResult; - } - } - ); -} -%> \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/user-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/user-api.jag deleted file mode 100644 index 60076acf83..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/user-api.jag +++ /dev/null @@ -1,211 +0,0 @@ -<% -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -var uri = request.getRequestURI(); -var uriMatcher = new URIMatcher(String(uri)); - -var log = new Log("api/user-api.jag"); - -var constants = require("/app/modules/constants.js"); -var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; -var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; -var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; -var utility = require("/app/modules/utility.js")["utility"]; -var apiWrapperUtil = require("/app/modules/oauth/token-handlers.js")["handlers"]; -var util = require("/app/modules/oauth/token-handler-utils.js")["utils"]; - -var responseProcessor = require("utils").response; - -var result; -if (uriMatcher.match("/{context}/api/user/clearBilling")) { - - carbonUser = session.get(constants.USER_SESSION_KEY); - session.put('BILLING_INFO_' + carbonUser.domain, null); - log.info("billing info cleared for " + carbonUser.domain); - -} else if (uriMatcher.match("/{context}/api/user/authenticate")) { - var username = request.getParameter("username"); - var password = request.getParameter("password"); - //Check if a username and password is provided - if ((!username) || (!password)) { - response = responseProcessor.buildErrorResponse(response, 400, 'Username and Password must be provided'); - } else { - try { - userModule.login(username, password, function (user) { - if (log.isDebugEnabled()) { - log.debug("User Logged In : " + user); - } - apiWrapperUtil.setupTokenPairByPasswordGrantType(username, password); - }, function () { - response = responseProcessor.buildSuccessResponse(response, 200, {'sessionId': session.getId()}); - }); - } catch (e) { - log.error("Exception occurred while a user tried to login to MDM", e); - response = responseProcessor.buildErrorResponse(response, 401, 'username/password is incorrect'); - } - } -} else if (uriMatcher.match("/{context}/api/user/login/")) { - username = request.getParameter("username"); - password = request.getParameter("password"); - username = util.decode(username); - password = util.decode(password); - try { - userModule.login(username, password, function (user) { - if (log.isDebugEnabled()) { - log.debug("User Logged In : " + user); - } - - apiWrapperUtil.setupTokenPairByPasswordGrantType(username, password); - var permissions = userModule.getUIPermissions(); - if (permissions.VIEW_DASHBOARD) { - response.sendRedirect(devicemgtProps["appContext"]); - } else { - response.sendRedirect(devicemgtProps["appContext"] + "devices"); - } - }, function () { - response.sendRedirect(devicemgtProps.appContext + "login?#auth-failed"); - }); - } catch (e) { - log.error("Exception occurred while a user tried to login to MDM", e); - response.sendRedirect(devicemgtProps.appContext + "login?#error"); - } -} else if (uriMatcher.match("/{context}/api/user/logout/")) { - userModule.logout(function () { - response.sendRedirect(devicemgtProps.appContext + "login"); - }); -} else if (uriMatcher.match("/{context}/api/user/devices/")) { - /* - @Deprecated - */ - if (userModule.isAuthorized("/permission/admin/device-mgt/user/devices/list")) { - carbonUser = session.get(constants.USER_SESSION_KEY); - result = deviceModule.listDevicesForUser(carbonUser.username); - } else { - response.sendError(403); - } -} else if (uriMatcher.match("/{context}/api/user/{username}/invite")) { - /* - @Deprecated - */ - if (userModule.isAuthorized("/permission/admin/device-mgt/user/invite")) { - elements = uriMatcher.elements(); - username = elements.username; - userModule.inviteUser(username); - } else { - response.sendError(403); - } -} else if (uriMatcher.match("/{context}/api/user/add")) { - /* - @Deprecated - */ - if (userModule.isAuthorized("/permission/admin/device-mgt/user/add")) { - addUserFormData = request.getContent(); - username = addUserFormData.username; - firstname = addUserFormData.firstname; - lastname = addUserFormData.lastname; - emailAddress = addUserFormData.emailAddress; - - if (!addUserFormData.userRoles) { - userRoles = null; - } else { - userRoles = String(addUserFormData.userRoles).split(","); - } - if (username.length < devicemgtProps.userValidationConfig.usernameLength) { - log.error("Username Must be between 1 and " + devicemgtProps.userValidationConfig.usernameLength + " characters long"); - result = "Username Must be between 1 and " + devicemgtProps.userValidationConfig.usernameLength + " characters long"; - } else { - try { - result = userModule.addUser(username, firstname, lastname, emailAddress, userRoles); - } catch (e) { - log.error("Exception occurred while trying to add a user to MDM User Store", e); - // http status code 400 refers to - Bad request. - result = 400; - } - } - } else { - // http status code 403 refers to - forbidden. - result = 403; - } -} else if (uriMatcher.match("/{context}/api/user/register")) { - - addUserFormData = request.getContent(); - username = addUserFormData.username; - firstname = addUserFormData.firstname; - lastname = addUserFormData.lastname; - emailAddress = addUserFormData.emailAddress; - password = addUserFormData.password; - userRoles = ["internal/devicemgt-user"]; - - try { - result = userModule.registerUser(username, firstname, lastname, emailAddress, password, - userRoles); - } catch (e) { - log.error("Exception occurred while trying to registering a new user to DC User Store", e); - // http status code 400 refers to - Bad request. - result = 400; - } - -} else if (uriMatcher.match("/{context}/api/user/{username}/remove")) { - /* - @Deprecated - */ - if (userModule.isAuthorized("/permission/admin/device-mgt/user/remove")) { - elements = uriMatcher.elements(); - username = elements.username; - try { - result = userModule.removeUser(username); - } catch (e) { - log.error("Exception occurred while trying to remove a user from MDM User Store", e); - // http status code 400 refers to - Bad request. - result = 400; - } - } else { - // http status code 403 refers to - forbidden. - result = 403; - } -} else if (uriMatcher.match("/{context}/api/user/all")) { - result = userModule.getUsers(); -} else if (uriMatcher.match("/{context}/api/user/environment-loaded")) { - try { - var carbonUser = session.get(constants.USER_SESSION_KEY); - if (!carbonUser) { - response.sendRedirect("/devicemgt/login?#login-required"); - exit(); - } - utility.startTenantFlow(carbonUser); - var APIManagementProviderService = utility.getAPIManagementProviderService(); - var isLoaded = APIManagementProviderService.isTierLoaded(); - result = {"isLoaded": isLoaded}; - if (isLoaded) { - var samlToken = session.get(constants.SAML_TOKEN_KEY); - if (samlToken) { - apiWrapperUtil.setupTokenPairByJWTGrantType(carbonUser.username + '@' + carbonUser.domain, samlToken); - } - } - response.contentType = 'application/json'; - } finally { - utility.endTenantFlow(); - } -} - -// returning the result. -if (result) { - print(result); -} -%> diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/app-conf.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/app-conf.json deleted file mode 100644 index 6367533b95..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/app-conf.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "appName": "Entgra IoT Server", - "cachingEnabled": false, - "debuggingEnabled": false, - "permissionRoot": "/", - "portalURL": "https://${server.ip}:9445", - "loginPage": "cdmf.page.sign-in.login-do", - "adminServicesUrl": "https://${server.ip}:${server.https_port}/admin/services/", - "authModule": { - "enabled": true, - "login": { - "onSuccess": { - "script": "/app/modules/login.js", - "page": "cdmf.page.processing" - }, - "onFail": { - "script": "/app/modules/login.js", - "page": "cdmf.page.sign-in.login-do" - } - }, - "logout": { - "onSuccess": { - "page": "cdmf.page.sign-in.login-do" - }, - "onFail": { - "page": "cdmf.page.dashboard" - } - }, - "sso": { - "enabled": true, - "issuer" : "devicemgt", - "appName" : "devicemgt", - "identityProviderUrl" : "https://%iot.keymanager.host%:%iot.keymanager.https.port%/samlsso", - "acs": "https://%iot.manager.host%:%iot.manager.https.port%/devicemgt/uuf/sso/acs", - "identityAlias": "wso2carbon", - "defaultNameIDPolicy": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "isPassive":false, - "responseSigningEnabled" : true, - "validateAssertionValidityPeriod": true, - "validateAudienceRestriction": true, - "assertionSigningEnabled": true - } - }, - "errorPages": { - "default": "uuf.page.error" - } -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/config.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/config.json deleted file mode 100644 index d17c6c8a4e..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/config.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "appContext": "/devicemgt/", - "isCloud": false, - "isDeviceOwnerEnabled": false, - "managerHTTPSURL": "https://%iot.manager.host%:%iot.manager.https.port%", - "httpsURL": "https://%iot.gateway.host%:%iot.gateway.https.port%", - "httpURL": "http://%iot.gateway.host%:%iot.gateway.http.port%", - "wssURL": "https://%iot.core.host%:%iot.core.https.port%", - "remoteSessionWSURL": "https://%iot.manager.host%:%iot.manager.https.port%", - "portalURL": "https://%iot.analytics.host%:%iot.analytics.https.port%", - "dashboardServerURL": "%https.ip%", - "androidAgentDownloadURL": "https://%iot.manager.host%:%iot.manager.https.port%/devicemgt/public/cdmf.unit.device.type.android.type-view/assets/android-agent.apk", - "windowsEnrollmentDir": "/windows-web-agent/enrollment", - "iOSEnrollmentDir": "/ios-web-agent/enrollment", - "iOSConfigRoot": "https://%iot.manager.host%:%iot.manager.https.port%/ios-enrollment/", - "iOSAPIRoot": "https://%iot.manager.host%:%iot.manager.https.port%/ios/", - "adminService": "https://%iot.manager.host%:%iot.manager.https.port%", - "deviceInfoServiceAPI" : "/api/device-mgt/%device-type%/v1.0/admin/devices/info", - "deviceLocationServiceAPI" : "/api/device-mgt/%device-type%/v1.0/admin/devices/location", - "iOSDeviceInfoServiceAPI" : "/api/device-mgt/%device-type%/v1.0/admin/devices/info", - "gatewayEnabled": true, - "oauthProvider": { - "appRegistration": { - "appType": "webapp", - "clientName": "iot_ui", - "owner": "admin@carbon.super", - "dynamicClientAppRegistrationServiceURL": "https://%iot.gateway.host%:%iot.gateway.https.port%/dynamic-client-web/register", - "apiManagerClientAppRegistrationServiceURL": "https://%iot.gateway.host%:%iot.gateway.https.port%/api-application-registration/register/tenants", - "grantType": "password refresh_token urn:ietf:params:oauth:grant-type:saml2-bearer urn:ietf:params:oauth:grant-type:jwt-bearer", - "tokenScope": "admin", - "callbackUrl": "https://%iot.gateway.host%:%iot.gateway.https.port%/api/device-mgt/v1.0", - "samlGrantTypeName": "urn:ietf:params:oauth:grant-type:saml2-bearer" - }, - "tokenServiceURL": "https://%iot.gateway.host%:%iot.gateway.https.port%/token" - }, - "adminUser": "admin@carbon.super", - "adminUserTenantId": "-1234", - "adminRole": "admin", - "userValidationConfig": { - "usernameLength": 30, - "usernameJSRegEx": "^[\\S]{3,30}$", - "usernameRegExViolationErrorMsg": "Provided username is invalid.", - "usernameHelpMsg": "Should be in minimum 3 characters long and do not include any whitespaces.", - "firstnameJSRegEx": "^.{3,30}$", - "firstnameRegExViolationErrorMsg": "Provided first name is invalid.", - "lastnameJSRegEx": "^.{3,30}$", - "lastnameRegExViolationErrorMsg": "Provided last name is invalid.", - "emailJSRegEx": "/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/", - "emailRegExViolationErrorMsg": "Provided email is invalid." - }, - "groupValidationConfig": { - "groupNameJSRegEx": "^[\\S]{3,30}$", - "groupNameRegExViolationErrorMsg": "Group name should be in minimum 3 characters long and should not include any whitespaces.", - "groupNameHelpMsg": "Should be in minimum 3 characters long and should not include any whitespaces." - }, - "roleValidationConfig": { - "roleNameJSRegEx": "^[\\S]{3,30}$", - "roleNameRegExViolationErrorMsg": "Provided role name is invalid.", - "roleNameHelpMsg": "should be in minimum 3 characters long and do not include any whitespaces." - }, - "generalConfig": { - "host": "https://%iot.manager.host%:%iot.manager.https.port%", - "companyName": "Entgra Carbon Device Manager", - "browserTitle": "Entgra Device Manager", - "copyrightPrefix": "\u00A9 %date-year%, ", - "copyrightOwner": "Entgra", - "copyrightOwnersSite": "https://www.entgra.io/", - "copyrightSuffix": " All Rights Reserved." - }, - "scopes": [ - "perm:sign-csr", - "perm:admin:devices:view", - "perm:admin:topics:view", - "perm:roles:add", - "perm:roles:add-users", - "perm:roles:update", - "perm:roles:permissions", - "perm:roles:details", - "perm:roles:view", - "perm:roles:create-combined-role", - "perm:roles:delete", - "perm:dashboard:vulnerabilities", - "perm:dashboard:non-compliant-count", - "perm:dashboard:non-compliant", - "perm:dashboard:by-groups", - "perm:dashboard:device-counts", - "perm:dashboard:feature-non-compliant", - "perm:dashboard:count-overview", - "perm:dashboard:filtered-count", - "perm:dashboard:details", - "perm:get-activity", - "perm:devices:delete", - "perm:devices:applications", - "perm:devices:effective-policy", - "perm:devices:compliance-data", - "perm:devices:features", - "perm:devices:operations", - "perm:devices:search", - "perm:devices:details", - "perm:devices:update", - "perm:devices:view", - "perm:view-configuration", - "perm:manage-configuration", - "perm:policies:remove", - "perm:policies:priorities", - "perm:policies:deactivate", - "perm:policies:get-policy-details", - "perm:policies:manage", - "perm:policies:activate", - "perm:policies:update", - "perm:policies:changes", - "perm:policies:get-details", - "perm:users:add", - "perm:users:details", - "perm:users:count", - "perm:users:delete", - "perm:users:roles", - "perm:users:user-details", - "perm:users:credentials", - "perm:users:search", - "perm:users:is-exist", - "perm:users:update", - "perm:users:send-invitation", - "perm:admin-users:view", - "perm:admin:devices:update-enrollment", - "perm:groups:devices", - "perm:groups:update", - "perm:groups:add", - "perm:groups:device", - "perm:groups:devices-count", - "perm:groups:remove", - "perm:groups:groups", - "perm:groups:groups-view", - "perm:groups:share", - "perm:groups:count", - "perm:groups:roles", - "perm:groups:devices-remove", - "perm:groups:devices-add", - "perm:groups:assign", - "perm:device-types:configs", - "perm:device-types:features", - "perm:device-types:types", - "perm:applications:install", - "perm:applications:uninstall", - "perm:admin-groups:count", - "perm:admin-groups:view", - "perm:notifications:mark-checked", - "perm:notifications:view", - "perm:admin:certificates:delete", - "perm:admin:certificates:details", - "perm:admin:certificates:view", - "perm:admin:certificates:add", - "perm:admin:certificates:verify", - "perm:admin", - "perm:devicetype:deployment", - "perm:device-types:events", - "perm:device-types:events:view", - "perm:admin:device-type", - "perm:admin:device-type:view", - "perm:admin:device-type:configs", - "perm:device:enroll", - "perm:geo-service:analytics-view", - "perm:geo-service:alerts-manage", - "perm:devices:permanent-delete", - "appm:read", - "perm:enterprise:modify", - "perm:enterprise:view" - ], - "isOAuthEnabled": true, - "backendRestEndpoints": { - "deviceMgt": "/api/device-mgt/v1.0", - "appMgt": "/api/application-mgt-store/v1.0" - } -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/toplink-menu.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/toplink-menu.json deleted file mode 100644 index aaac58445a..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/conf/toplink-menu.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "Logo": { - "name": "Cloud", - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt", - "target": "_parent" - }, - "Main": { - "Domain": { - "url": "#", - "icon": "fw fw-organization", - "isAdminOnly": false, - "target": "_parent", - "dropDown": { - "Organization": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/organization.jag", - "icon": "fw fw-organization", - "dropDown": "false", - "target": "_self" - }, - "Members": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user.jag", - "icon": "fa fa-users", - "dropDown": "false", - "target": "_self" - } - } - }, - "Account": { - "url": "#", - "icon": "fw fw-resource", - "isAdminOnly": false, - "billingEnabled": true, - "billingApi": { - "username": "admin", - "password": "admin" - }, - "cloudMgtHost" : "https://cloudmgt.cloudstaging.wso2.com", - "cloudMgtIndexPage": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/index.jag", - "dropDown": { - "Upgrade Now": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/payment-plans.jag?cloud-type=device_cloud", - "icon": "fw fw-export", - "dropDown": "true", - "target": "_self" - }, - "Request Extension": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/contact-us.jag?cloud-type=device_cloud&request-extension=true", - "icon": "fa fa-mail", - "dropDown": "true", - "target": "_self" - } - } - }, - "Support": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/contact-us.jag?cloud-type=device_cloud", - "icon": "fw fw-mail", - "isAdminOnly": false, - "target": "_self", - "dropDown": "false" - }, - "Documentation": { - "url": "#", - "icon": "fw fw-document", - "isAdminOnly": false, - "dropDown": { - "Device Cloud": { - "id": "device_cloud", - "url": "https://docs.wso2.com/display/DeviceCloud/WSO2+Device+Cloud+Documentation", - "icon": "fw fw-mobile", - "target": "_blank" - } - } - } - }, - "User": { - "url": "#", - "icon": "fw fw-user", - "dropDown": { - "Profile": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user-profile.jag", - "icon": "fw fw-user", - "dropDown": "true", - "target": "_self" - }, - "Change Password": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/change-password.jag", - "icon": "fw fw-lock", - "dropDown": "true", - "target": "_self" - }, - "Logout": { - "url": "https://device.cloud.wso2.com/devicemgt/logout", - "icon": "fw fw-sign-out", - "dropDown": "true", - "target": "_self" - } - } - }, - "Expand": { - "Clouds": { - "API Cloud": { - "id": "api_cloud", - "url": "https://api.cloud.wso2.com/publisher", - "icon": "fw fw-api fw-3x", - "dropDown": "true", - "target": "_self" - }, - "Integration Cloud": { - "id": "integration_cloud", - "url": "https://integration.cloud.wso2.com/appmgt", - "icon": "fw fw-service fw-3x", - "dropDown": "true", - "target": "_self" - }, - "Identity Cloud": { - "id": "integration_cloud", - "url": "https://identity.cloud.wso2.com/admin", - "icon": "fw fw-security fw-3x", - "dropDown": "true", - "target": "_self" - } - }, - "Actions": { - "Organization": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/organization.jag", - "icon": "fw fw-organization fw-3x", - "dropDown": "true", - "target": "_self" - }, - "Members": { - "url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user.jag", - "icon": "fa fa-users fa-3x", - "dropDown": "true", - "target": "_self" - } - } - } -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.default.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.default.hbs deleted file mode 100644 index cf5837c383..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.default.hbs +++ /dev/null @@ -1,82 +0,0 @@ -{{!-- Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - -WSO2 Inc. licenses this file to you under the Apache License, -Version 2.0 (the "License"); you may not use this file except -in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -either express or implied. See the License for the -specific language governing permissions and limitations -under the License. --}} - - - - - - - - {{defineZone "favicon"}} - - {{defineZone "title"}} - - {{defineZone "topLibCss"}} - {{defineZone "topCss"}} - {{defineZone "topJs"}} - - - - - - - - {{defineZone "header"}} - - {{defineZone "sidePanes"}} - - -
- - - - {{!defineZone "contentTitle"}} - -
-
- {{defineZone "content"}} -
-
-
- - -
-
- {{defineZone "footer"}} -
-
- - {{defineZone "bottomModalContent"}} - {{defineZone "bottomLibJs"}} - {{defineZone "bottomJs"}} - - \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.error.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.error.hbs deleted file mode 100644 index d14f195c32..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.error.hbs +++ /dev/null @@ -1,48 +0,0 @@ -{{!-- Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - -WSO2 Inc. licenses this file to you under the Apache License, -Version 2.0 (the "License"); you may not use this file except -in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -either express or implied. See the License for the -specific language governing permissions and limitations -under the License. --}} - - - - - - - - {{defineZone "title"}} - - - -
-
-
- -
-
-

{{#defineZone "messageTitle"}}Oops something went wrong{{/defineZone}}

-

{{defineZone "messageDescription"}}

-
- -
-
- -
-
-
-
- - \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.loading.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.loading.hbs deleted file mode 100644 index ab70bdc1cf..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/layouts/cdmf.layout.loading.hbs +++ /dev/null @@ -1,57 +0,0 @@ -{{!-- Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - -WSO2 Inc. licenses this file to you under the Apache License, -Version 2.0 (the "License"); you may not use this file except -in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -either express or implied. See the License for the -specific language governing permissions and limitations -under the License. --}} - - - - - - - - {{defineZone "favicon"}} - - {{defineZone "title"}} - - {{defineZone "topLibCss"}} - {{defineZone "topCss"}} - {{defineZone "topJs"}} - - - - - - - - {{defineZone "content"}} - - {{defineZone "bottomModalContent"}} - {{defineZone "bottomLibJs"}} - {{defineZone "bottomJs"}} - - \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/batch-provider-api.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/batch-provider-api.js deleted file mode 100644 index 2c56bde07d..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/batch-provider-api.js +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 batchProviders; - -batchProviders = function () { - var operations = {}; - var CONTENT_TYPE_JSON = "application/json"; - var JS_MAX_VALUE = "9007199254740992"; - var JS_MIN_VALUE = "-9007199254740992"; - - var TABLENAME_ANDROID = "ORG_WSO2_GEO_FUSEDSPATIALEVENT"; - var TABLENAME_ANDROID_SENSE = "ORG_WSO2_IOT_ANDROID_LOCATION"; - - var tableName = function (deviceType) { - switch (deviceType) { - case "android" : - return TABLENAME_ANDROID; - break; - case "android_sense" : - return TABLENAME_ANDROID_SENSE; - break; - default: - return null; - - } - }; - - var typeMap = { - "bool": "string", - "boolean": "string", - "string": "string", - "int": "number", - "integer": "number", - "long": "number", - "double": "number", - "float": "number", - "time": "time" - }; - - var log = new Log(); - var carbon = require('carbon'); - var JSUtils = Packages.org.wso2.carbon.analytics.jsservice.Utils; - var AnalyticsCachedJSServiceConnector = Packages.org.wso2.carbon.analytics.jsservice.AnalyticsCachedJSServiceConnector; - var AnalyticsCache = Packages.org.wso2.carbon.analytics.jsservice.AnalyticsCachedJSServiceConnector.AnalyticsCache; - var cacheTimeoutSeconds = 5; - - var cacheSizeBytes = 1024 * 1024 * 1024; // 1GB - response.contentType = CONTENT_TYPE_JSON; - - - var cache = application.get("AnalyticsWebServiceCache"); - if (cache == null) { - cache = new AnalyticsCache(cacheTimeoutSeconds, cacheSizeBytes); - application.put("AnalyticsWebServiceCache", cache); - } - var connector = new AnalyticsCachedJSServiceConnector(cache); - - - /** - * returns an array of column names & types - * @param providerConfig - */ - operations.getSchema = function (loggedInUser) { - var tablename = tableName(deviceType); - if (tablename == null) { - return []; - } - var schema = []; - var result = connector.getTableSchema(loggedInUser, tablename).getMessage(); - result = JSON.parse(result); - - var columns = result.columns; - Object.getOwnPropertyNames(columns).forEach(function (name, idx, array) { - var type = "ordinal"; - if (columns[name]['type']) { - type = columns[name]['type']; - } - schema.push({ - fieldName: name, - fieldType: typeMap[type.toLowerCase()] - }); - }); - // log.info(schema); - return schema; - }; - - /** - * returns the actual data - * @param providerConfig - * @param limit - */ - operations.getData = function (loggedInUser, deviceId, deviceType) { - var luceneQuery = ""; - var limit = 100; - var result; - var tablename = tableName(deviceType); - if (tablename == null) { - return []; - } - //if there's a filter present, we should perform a Lucene search instead of reading the table - if (luceneQuery) { - luceneQuery = 'id:"' + deviceId + '" AND type:"' + deviceType + '"'; - var filter = { - "query": luceneQuery, - "start": 0, - "count": limit - }; - result = connector.search(loggedInUser, tablename, stringify(filter)).getMessage(); - } else { - var from = JS_MIN_VALUE; - var to = JS_MAX_VALUE; - result = connector.getRecordsByRange(loggedInUser, tablename, from, to, 0, limit, null).getMessage(); - - } - - // error handling ---- - var resultString = result.toString(); - if (resultString.contains("Failed to get records from table")) { - return null; - } - - result = JSON.parse(result); - var data = []; - for (var i = 0; i < result.length; i++) { - var values = result[i].values; - data.push(values); - } - return data; - }; - - - - return operations; -}(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/device.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/device.js deleted file mode 100644 index 2e604c3ad1..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/device.js +++ /dev/null @@ -1,467 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 deviceModule; -deviceModule = function () { - var log = new Log("/app/modules/business-controllers/device.js"); - - var utility = require('/app/modules/utility.js')["utility"]; - var constants = require('/app/modules/constants.js'); - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - var batchProvider = require("/app/modules/batch-provider-api.js")["batchProviders"]; - var process = require("process"); - var carbon = require("carbon"); - var publicMethods = {}; - var privateMethods = {}; - - /** - * Only GET method is implemented for now since there are no other type of methods used this method. - * @param url - URL to call the backend without the host - * @param method - HTTP Method (GET, POST) - * @returns An object with 'status': 'success'|'error', 'content': {} - */ - privateMethods.callBackend = function (url, method) { - if (constants["HTTP_GET"] == method) { - return serviceInvokers.XMLHttp.get(url, - function (backendResponse) { - var response = {}; - response.content = backendResponse.responseText; - if (backendResponse.status == 200) { - response.status = "success"; - } else if (backendResponse.status == 400 || backendResponse.status == 401 || - backendResponse.status == 404 || backendResponse.status == 500) { - response.status = "error"; - } - return response; - } - ); - } else { - log.error("Runtime error : This method only support HTTP GET requests."); - } - }; - - privateMethods.validateAndReturn = function (value) { - return (value == undefined || value == null) ? constants["UNSPECIFIED"] : value; - }; - - /* - @Updated - */ - publicMethods.viewDevice = function (deviceType, deviceId, owner, ownership) { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - if (!carbonUser) { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - var userName = carbonUser.username + "@" + carbonUser.domain; - var locationHistory = []; - var geoServicesEnabled = devicemgtProps.serverConfig.geoLocationConfiguration.enabled; - if (geoServicesEnabled) { - try { - var fromDate = new Date(); - fromDate.setHours(fromDate.getHours() - 2); - var toDate = new Date(); - var serviceUrl = devicemgtProps["httpsURL"] + '/api/device-mgt/v1.0/geo-services/stats/' + deviceType + '/' + deviceId + '?from=' + fromDate.getTime() + '&to=' + toDate.getTime(); - serviceInvokers.XMLHttp.get(serviceUrl, - function (backendResponse) { - if (backendResponse.status === 200 && backendResponse.responseText) { - locationHistory = JSON.parse(backendResponse.responseText); - } - }); - } catch (e) { - log.error(e.message, e); - } - } - - var locationInfo = {}; - try { - var url = devicemgtProps["httpsURL"] + "/api/device-mgt/v1.0/devices/" + deviceType + "/" + deviceId + "/location"; - serviceInvokers.XMLHttp.get( - url, - function (backendResponse) { - - if (backendResponse.status == 200 && backendResponse.responseText) { - var device = parse(backendResponse.responseText); - locationInfo.latitude = device.latitude; - locationInfo.longitude = device.longitude; - locationInfo.updatedOn = device.updatedTime; - } - }); - } catch (e) { - log.error(e.message, e); - } - - var utility = require('/app/modules/utility.js')["utility"]; - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + "/api/device-mgt/v1.0/devices/" + deviceType + "/" + deviceId; - if (owner) { - url = url + "?owner=" + owner; - if (ownership){ - url = url + "&ownership=" + ownership; - } - } else if (ownership){ - url = url + "?ownership=" + ownership; - } - return serviceInvokers.XMLHttp.get( - url, - function (backendResponse) { - var response = {}; - if (backendResponse.status == 200 && backendResponse.responseText) { - var device = parse(backendResponse.responseText); - - var filteredDeviceData = {}; - if (device["deviceIdentifier"]) { - filteredDeviceData["deviceIdentifier"] = device["deviceIdentifier"]; - } - if (device["type"]) { - filteredDeviceData["type"] = device["type"]; - } - if (device["name"]) { - filteredDeviceData["name"] = device["name"]; - } - if (device["enrolmentInfo"]) { - var enrolmentInfo = {}; - if (device["enrolmentInfo"]["status"]) { - enrolmentInfo["status"] = device["enrolmentInfo"]["status"]; - } - if (device["enrolmentInfo"]["owner"]) { - enrolmentInfo["owner"] = device["enrolmentInfo"]["owner"]; - } - if (device["enrolmentInfo"]["ownership"]) { - enrolmentInfo["ownership"] = device["enrolmentInfo"]["ownership"]; - } - filteredDeviceData["enrolmentInfo"] = enrolmentInfo; - } - if (device["properties"] && device["properties"].length > 0) { - var propertiesList = device["properties"]; - var properties = {}; - if (propertiesList) { - for (var i = 0; i < propertiesList.length; i++) { - if (propertiesList[i]["value"]) { - properties[propertiesList[i]["name"]] = - propertiesList[i]["value"]; - } - } - } - - filteredDeviceData["initialDeviceInfo"] = properties; - - if (properties["DEVICE_INFO"]) { - var initialDeviceInfoList = parse(properties["DEVICE_INFO"]); - var initialDeviceInfo = {}; - if (Array.isArray(initialDeviceInfoList)) { - for (var j = 0; j < initialDeviceInfoList.length; j++) { - if (initialDeviceInfoList[j]["value"]) { - initialDeviceInfo[initialDeviceInfoList[j]["name"]] = - initialDeviceInfoList[j]["value"]; - } - } - } else { - initialDeviceInfo = initialDeviceInfoList; - } - - - filteredDeviceData["initialDeviceInfo"]["DEVICE_INFO"] = initialDeviceInfo; - } - } - - if (filteredDeviceData["type"]) { - if (filteredDeviceData["type"] == constants["PLATFORM_IOS"]) { - if (filteredDeviceData["properties"]) { - filteredDeviceData["properties"]["VENDOR"] = "Apple"; - } - } - } - - if (device["deviceInfo"]) { - filteredDeviceData["latestDeviceInfo"] = device["deviceInfo"]; - } else { - filteredDeviceData["latestDeviceInfo"] = {}; - filteredDeviceData["latestDeviceInfo"]["location"] = {}; - } - - //location related verification and modifications - // adding the location histry for the movement path. - filteredDeviceData["locationHistory"] = locationHistory; - - //checking for the latest location information based on historical data. - if (locationHistory) { - var infoDate; - var locationDate; - var historicalLatestLoc = locationHistory[locationHistory.length - 1]; - if (historicalLatestLoc && filteredDeviceData.latestDeviceInfo && filteredDeviceData.latestDeviceInfo.location) { - infoDate = new Date(filteredDeviceData.latestDeviceInfo.location.updatedTime); - locationDate = new Date(historicalLatestLoc.values.timeStamp); - } - if (infoDate < locationDate || filteredDeviceData.latestDeviceInfo.length === 0) { - filteredDeviceData.latestDeviceInfo.location = {}; - filteredDeviceData.latestDeviceInfo.location.longitude = historicalLatestLoc.values.longitude; - filteredDeviceData.latestDeviceInfo.location.latitude = historicalLatestLoc.values.latitude; - filteredDeviceData.latestDeviceInfo.location.updatedTime = historicalLatestLoc.values.timeStamp; - } - } - - //checking for the latest location information. - if (filteredDeviceData.latestDeviceInfo.location && locationInfo) { - var infoDate = new Date(filteredDeviceData.latestDeviceInfo.location.updatedTime); - var locationDate = new Date(locationInfo.updatedOn); - if (infoDate < locationDate) { - filteredDeviceData.latestDeviceInfo.location.longitude = locationInfo.longitude; - filteredDeviceData.latestDeviceInfo.location.latitude = locationInfo.latitude; - filteredDeviceData.latestDeviceInfo.location.updatedTime = locationInfo.updatedOn; - } - } - - response["content"] = filteredDeviceData; - response["status"] = "success"; - return response; - } else if (backendResponse.status == 401) { - response["status"] = "unauthorized"; - return response; - } else if (backendResponse.status == 404) { - response["status"] = "notFound"; - return response; - } else { - response["status"] = "error"; - return response; - } - } - ); - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - // Refactored methods - publicMethods.getDevicesCount = function () { - var carbonUser = session.get(constants.USER_SESSION_KEY); - if (carbonUser) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var uiPermissions = userModule.getUIPermissions(); - var url; - if (uiPermissions.LIST_DEVICES) { - url = devicemgtProps["httpsURL"] + - devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/devices?offset=0&limit=1"; - } else if (uiPermissions.LIST_OWN_DEVICES) { - url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/devices?offset=0&limit=1&user=" + carbonUser.username; - } else { - log.error("Access denied for user: " + carbonUser.username); - return -1; - } - return serviceInvokers.XMLHttp.get( - url, function (responsePayload) { - if(!responsePayload["responseText"]){ - log.error("Error while fetching device count. API `" + url + "` returns HTTP: " + responsePayload["status"]); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - return parse(responsePayload["responseText"])["count"]; - }, - function (responsePayload) { - log.error(responsePayload["responseText"]); - return -1; - } - ); - } else { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - }; - - publicMethods.getDeviceTypeCount = function () { - var carbonUser = session.get(constants.USER_SESSION_KEY); - if (carbonUser) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var uiPermissions = userModule.getUIPermissions(); - var url; - if (uiPermissions.LIST_OWN_DEVICES) { - url = devicemgtProps["httpsURL"] + - devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/device-types"; - } else { - log.error("Access denied for user: " + carbonUser.username); - return -1; - } - return serviceInvokers.XMLHttp.get( - url, function (responsePayload) { - return parse(responsePayload["responseText"]).length; - }, - function (responsePayload) { - log.error(responsePayload["responseText"]); - return -1; - } - ); - } else { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - }; - - publicMethods.getDeviceTypes = function () { - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/device-types"; - var response = privateMethods.callBackend(url, constants["HTTP_GET"]); - if (response.status == "success") { - response.content = parse(response.content); - } - return response; - }; - - /* - @Updated - */ - // publicMethods.getLicense = function (deviceType) { - // var url; - // var license; - // if (deviceType == "windows") { - // url = mdmProps["httpURL"] + "/mdm-windows-agent/services/device/license"; - // } else if (deviceType == "ios") { - // url = mdmProps["httpsURL"] + "/ios-enrollment/license/"; - // } - - // if (url != null && url != undefined) { - // serviceInvokers.XMLHttp.get(url, function (responsePayload) { - // license = responsePayload.text; - // }, function (responsePayload) { - // return null; - // }); - // } - // return license; - // }; - - publicMethods.getDevices = function (userName) { - var url = devicemgtProps["httpsURL"] + - devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/devices"; - if (userName && userName !== "") { - url = url + "?user=" + userName; - } - return serviceInvokers.XMLHttp.get( - url, function (responsePayload) { - var devices = JSON.parse(responsePayload.responseText).devices; - for (var i = 0; i < devices.length; i++) { - devices[i].thumb = utility.getDeviceThumb(devices[i].type); - } - return devices; - }, - function (responsePayload) { - log.error(responsePayload); - return -1; - } - ); - }; - - publicMethods.getDeviceAgentConfig = function (type, deviceId) { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - if (!carbonUser) { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - var userName = carbonUser.username + "@" + carbonUser.domain; - var config = {}; - config.type = type; - config.deviceId = deviceId; - // register a tenant based app at API Manager - var applicationName = type.replace(" ", "") + "_" + carbonUser.domain; - var requestURL = (devicemgtProps["oauthProvider"]["appRegistration"] - ["apiManagerClientAppRegistrationServiceURL"]).replace("/tenants",""); - var payload = {applicationName:applicationName, tags:["device_agent"], - isAllowedToAllDomains:false, validityPeriod: 3600}; - - serviceInvokers.XMLHttp.post( - requestURL, payload, function (responsePayload) { - var app = JSON.parse(responsePayload.responseText); - - config.clientId = app["client_id"]; - config.clientSecret = app["client_secret"]; - if (config.clientId && config.clientSecret) { - var JWTClientManagerServicePackagePath = - "io.entgra.device.mgt.core.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 deviceScope = "device_" + type.replace(" ", "") + "_" + deviceId + " perm:device:enroll " + - "perm:device:disenroll perm:device:modify perm:device:operations perm:device:publish-event"; - var tokenInfo = jwtClient.getAccessToken(config.clientId, config.clientSecret, - userName, deviceScope); - config.accessToken = tokenInfo.getAccessToken(); - config.refreshToken = tokenInfo.getRefreshToken(); - if (config.accessToken == null) { - return null; - } - config.mqttGateway = "tcp://" + process.getProperty("mqtt.broker.host") + ":" + process.getProperty("mqtt.broker.port"); - config.httpsGateway = "https://" + process.getProperty("iot.gateway.host") + ":" + process.getProperty("iot.gateway.https.port"); - config.httpGateway = "http://" + process.getProperty("iot.gateway.host") + ":" + process.getProperty("iot.gateway.http.port"); - return config; - } else { - return null; - } - return config; - }, - function (responsePayload) { - log.error(responsePayload); - return null; - } - ); - return config; - - }; - - /** - * Retrieve device info details of a device - * @param deviceType - Type of the device i.e ios, android - * @param deviceId - Device ID of te device - */ - publicMethods.getDeviceInfo = function (deviceType, deviceId) { - try { - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] - + "/devices/" + deviceType + "/" + deviceId + "/info"; - var response = {}; - return serviceInvokers.XMLHttp.get( - url, - function (backendResponse) { - if (backendResponse.status === 200 && backendResponse.responseText) { - response["status"] = "success"; - response["content"] = parse(backendResponse.responseText); - } else { - log.error("Error occurred while retrieving device info via " + url + ". Error code: " - + backendResponse.status + ". Reason: " + backendResponse.responseText); - response["status"] = "error"; - } - return response; - }); - } catch (e) { - log.error("Error occurred while retrieving device info via " + url, e); - } - }; - - return publicMethods; -}(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/group.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/group.js deleted file mode 100644 index 9868f9d867..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/group.js +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 groupModule = {}; -(function (groupModule) { - var log = new Log("/app/modules/business-controllers/group.js"); - - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var constants = require('/app/modules/constants.js'); - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var utility = require("/app/modules/utility.js").utility; - var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - - var deviceServiceEndpoint = devicemgtProps["httpsURL"] + "/api/device-mgt/v1.0"; - - var user = session.get(constants.USER_SESSION_KEY); - - var endPoint; - - groupModule.getGroupCount = function () { - var permissions = userModule.getUIPermissions(); - if (permissions.LIST_ALL_GROUPS) { - endPoint = deviceServiceEndpoint + "/admin/groups/count"; - } else if (permissions.LIST_GROUPS) { - endPoint = deviceServiceEndpoint + "/groups/count"; - } else { - if (!user) { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - log.error("Access denied for user: " + user.username); - return -1; - } - return serviceInvokers.XMLHttp.get( - endPoint, function (responsePayload) { - return parse(responsePayload["responseText"]); - }, - function (responsePayload) { - log.error(responsePayload["responseText"]); - return -1; - } - ); - }; - - groupModule.getGroupDeviceCount = function (groupId) { - endPoint = deviceServiceEndpoint + "/groups/id/" + groupId + "/devices/count"; - return serviceInvokers.XMLHttp.get( - endPoint, function (responsePayload) { - return responsePayload["responseText"]; - }, - function (responsePayload) { - log.error(responsePayload); - return -1; - } - ); - }; - - groupModule.getGroupDevices = function (groupId) { - endPoint = deviceServiceEndpoint + "/groups/id/" + groupId + "/devices?limit=10"; - return serviceInvokers.XMLHttp.get( - endPoint, function (responsePayload) { - return responsePayload; - }, - function (responsePayload) { - log.error(responsePayload); - return responsePayload; - } - ); - }; - - groupModule.getGroups = function () { - var permissions = userModule.getUIPermissions(); - if (permissions.LIST_ALL_GROUPS) { - endPoint = deviceServiceEndpoint + "/admin/groups"; - } else if (permissions.LIST_GROUPS) { - endPoint = deviceServiceEndpoint + "/groups"; - } else { - log.error("Access denied for user: " + carbonUser.username); - return -1; - } - return serviceInvokers.XMLHttp.get( - endPoint, function (responsePayload) { - var data = JSON.parse(responsePayload.responseText); - if(data) { - return data.deviceGroups; - } else { - return []; - } - }, - function (responsePayload) { - log.error(responsePayload); - return -1; - } - ); - }; - - groupModule.getGroup = function (groupId) { - return serviceInvokers.XMLHttp.get( - deviceServiceEndpoint + "/groups/id/" + groupId, function (responsePayload) { - return JSON.parse(responsePayload.responseText); - }, - function (responsePayload) { - log.error(responsePayload); - return -1; - } - ); - }; - - groupModule.getRolesOfGroup = function (groupId) { - return serviceInvokers.XMLHttp.get( - deviceServiceEndpoint + "/groups/id/" + groupId + "/roles", function (responsePayload) { - var data = JSON.parse(responsePayload.responseText); - if(data) { - return data.roles; - } else { - return []; - } - }, - function (responsePayload) { - log.error(responsePayload); - return -1; - } - ); - }; - -}(groupModule)); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/operation.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/operation.js deleted file mode 100644 index d2401d86f0..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/operation.js +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 operationModule = function () { - var log = new Log("/app/modules/business-controllers/operation.js"); - var utility = require('/app/modules/utility.js').utility; - var constants = require('/app/modules/constants.js'); - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - - var publicMethods = {}; - var privateMethods = {}; - - /** - * This method reads the token from the Token client and return the access token. - * If the token pair s not set in the session this will send a redirect to the login page. - */ - function getAccessToken(deviceType, owner, deviceId) { - var TokenClient = Packages.org.wso2.carbon.device.mgt.iot.apimgt.TokenClient; - var accessTokenClient = new TokenClient(deviceType); - var accessTokenInfo = accessTokenClient.getAccessToken(owner, deviceId); - return accessTokenInfo.getAccess_token(); - } - - privateMethods.getOperationsFromFeatures = function (deviceType, operationType) { - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/device-types/" - + deviceType + "/features?featureType=" + operationType + "&hidden=false"; - return serviceInvokers.XMLHttp.get(url, function (responsePayload) { - var features = JSON.parse(responsePayload.responseText); - var featureList = []; - var feature; - for (var i = 0; i < features.length; i++) { - feature = {}; - feature["operation"] = features[i].code; - feature["name"] = features[i].name; - feature["description"] = features[i].description; - feature["contentType"] = features[i].contentType; - feature["deviceType"] = deviceType; - feature["params"] = []; - var metaData = features[i].metadataEntries; - if (metaData) { - for (var j = 0; j < metaData.length; j++) { - if (metaData[j].name === "operationMeta") { - var operationMeta = metaData[j].value; - var params = {}; - params["method"] = operationMeta.method; - params["pathParams"] = operationMeta.pathParams; - params["queryParams"] = operationMeta.queryParams; - params["formParams"] = operationMeta.formParams ? operationMeta.formParams : []; - params["uri"] = operationMeta.uri; - params["contentType"] = operationMeta.contentType; - feature["params"].push(params); - feature["permission"] = operationMeta.permission; - if (operationMeta.icon) { - //Check if icon is a path or font - if (operationMeta.icon.indexOf("path:") === 0) { - feature["icon"] = operationMeta.icon.replace("path:", ""); - } else { - feature["iconFont"] = operationMeta.icon; - } - } - if (operationMeta.uiParams && operationMeta.uiParams.length > 0) { - feature["uiParams"] = operationMeta.uiParams; - } - if (operationMeta.filters) { - feature["filters"] = operationMeta.filters; - } - if (operationMeta.ownershipDescription) { - feature["ownershipDescription"] = operationMeta.ownershipDescription; - } - continue; - } - feature["metadata"].push(metaData[j].value); - } - featureList.push(feature); - } - } - return featureList; - }, function (responsePayload) { - var response = {}; - response["status"] = "error"; - return response; - } - ); - }; - - publicMethods.getControlOperations = function (device) { - var deviceType = device.type; - var operations = privateMethods.getOperationsFromFeatures(deviceType, "operation"); - for (var op in operations) { - if (operations.hasOwnProperty(op)) { - operations[op]["isDisabled"] = false; - if (device && operations[op].filters && operations[op].filters.length > 0) { - var filters = operations[op].filters; - for (var filter in filters) { - if (filters.hasOwnProperty(filter)) { - if (device[filters[filter].property] !== filters[filter].value) { - operations[op]["isDisabled"] = true; - operations[op]["disabledText"] = operations[op]["disabledText"] ? - operations[op]["disabledText"] + ", " + filters[filter].description : - filters[filter].description; - } - } - } - } - } - } - return operations; - }; - - publicMethods.getMonitorOperations = function (deviceType) { - return privateMethods.getOperationsFromFeatures(deviceType, "monitor"); - }; - - publicMethods.handlePOSTOperation = function (deviceType, operation, deviceId, params) { - var user = session.get(constants.USER_SESSION_KEY); - var endPoint = devicemgtProps["httpsURL"] + '/' + deviceType + "/controller/" + operation; - var header = '{"owner":"' + user.username + '","deviceId":"' + deviceId + - '","protocol":"mqtt", "sessionId":"' + session.getId() + '", "' + - constants.AUTHORIZATION_HEADER + '":"' + constants.BEARER_PREFIX + - getAccessToken(deviceType, user.username, deviceId) + '"}'; - return post(endPoint, params, JSON.parse(header), "json"); - }; - - publicMethods.handleGETOperation = function (deviceType, operation, operationName, deviceId) { - var user = session.get(constants.USER_SESSION_KEY); - var endPoint = devicemgtProps["httpsURL"] + '/' + deviceType + "/controller/" + operation; - var header = '{"owner":"' + user.username + '","deviceId":"' + deviceId + - '","protocol":"mqtt", "' + constants.AUTHORIZATION_HEADER + '":"' + - constants.BEARER_PREFIX + getAccessToken(deviceType, user.username, deviceId) + - '"}'; - var result = get(endPoint, {}, JSON.parse(header), "json"); - if (result.data) { - var values = result.data.sensorValue.split(','); - if (operationName == 'gps') { - result.data.map = { - lat: parseFloat(values[0]), - lng: parseFloat(values[1]) - } - } else { - var sqSum = 0; - for (var v in values) { - sqSum += Math.pow(values[v], 2); - } - result.data[operationName] = Math.sqrt(sqSum); - } - delete result.data['sensorValue']; - } - return result; - }; - - return publicMethods; -}(); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/policy.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/policy.js deleted file mode 100644 index b16dabac5e..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/policy.js +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 policyModule; -policyModule = function () { - var log = new Log("/app/modules/business-controllers/policy.js"); - - var constants = require('/app/modules/constants.js'); - var utility = require("/app/modules/utility.js")["utility"]; - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - - var publicMethods = {}; - var privateMethods = {}; - - privateMethods.handleGetAllPoliciesResponse = function (backendResponse) { - var response = {}; - if (backendResponse.status == 200 && backendResponse.responseText) { - var isUpdated = false; - var policyListFromRestEndpoint = parse(backendResponse.responseText)["policies"]; - - var policyListToView = []; - var i, policyObjectFromRestEndpoint, policyObjectToView; - for (i = 0; i < policyListFromRestEndpoint.length; i++) { - // get list object - policyObjectFromRestEndpoint = policyListFromRestEndpoint[i]; - // populate list object values to view-object - policyObjectToView = {}; - policyObjectToView["id"] = policyObjectFromRestEndpoint["id"]; - policyObjectToView["priorityId"] = policyObjectFromRestEndpoint["priorityId"]; - policyObjectToView["name"] = policyObjectFromRestEndpoint["policyName"]; - policyObjectToView["platform"] = policyObjectFromRestEndpoint["profile"]["deviceType"]; - policyObjectFromRestEndpoint["policyType"] = policyListFromRestEndpoint["policyType"]; - var payloadVersion = policyObjectFromRestEndpoint["policyPayloadVersion"]; - if (!parseFloat(payloadVersion) >= 2.0) { - policyObjectFromRestEndpoint["correctiveActions"] = policyListFromRestEndpoint["correctiveActions"]; - } - if (policyObjectToView["platform"] == "ios") { - policyObjectToView["deviceTypeIcon"] = "apple"; - } else { - policyObjectToView["deviceTypeIcon"] = policyObjectToView["platform"]; - } - var ownershipType = "None"; - var deviceGroups = policyObjectFromRestEndpoint["deviceGroups"]; - if (deviceGroups) { - for (var j = 0; j < deviceGroups.length; j++) { - var deviceGroup = deviceGroups[j]; - if (deviceGroup.name === "COPE") { - ownershipType = (ownershipType === "BYOD") ? "BYOD & COPE" : "COPE"; - } else if (deviceGroup.name === "BYOD") { - ownershipType = (ownershipType === "COPE") ? "BYOD & COPE" : "BYOD"; - } - } - } - policyObjectToView["ownershipType"] = ownershipType; - - var assignedRoleCount = policyObjectFromRestEndpoint["roles"].length; - var assignedUserCount = policyObjectFromRestEndpoint["users"].length; - - if (assignedRoleCount == 0) { - policyObjectToView["roles"] = "None"; - } else if (assignedRoleCount == 1) { - policyObjectToView["roles"] = policyObjectFromRestEndpoint["roles"][0]; - } else if (assignedRoleCount > 1) { - policyObjectToView["roles"] = policyObjectFromRestEndpoint["roles"][0] + ", ..."; - } - - if (assignedUserCount == 0) { - policyObjectToView["users"] = "None"; - } else if (assignedUserCount == 1) { - policyObjectToView["users"] = policyObjectFromRestEndpoint["users"][0]; - } else if (assignedUserCount > 1) { - policyObjectToView["users"] = policyObjectFromRestEndpoint["users"][0] + ", ..."; - } - - policyObjectToView["compliance"] = policyObjectFromRestEndpoint["compliance"]; - - if (policyObjectFromRestEndpoint["active"] == true && - policyObjectFromRestEndpoint["updated"] == true) { - policyObjectToView["status"] = "Active/Updated"; - isUpdated = true; - } else if (policyObjectFromRestEndpoint["active"] == true && - policyObjectFromRestEndpoint["updated"] == false) { - policyObjectToView["status"] = "Active"; - } else if (policyObjectFromRestEndpoint["active"] == false && - policyObjectFromRestEndpoint["updated"] == true) { - policyObjectToView["status"] = "Inactive/Updated"; - isUpdated = true; - } else if (policyObjectFromRestEndpoint["active"] == false && - policyObjectFromRestEndpoint["updated"] == false) { - policyObjectToView["status"] = "Inactive"; - } - // push view-objects to list - policyListToView.push(policyObjectToView); - } - // generate response - response.updated = isUpdated; - response.status = "success"; - response.content = policyListToView; - - return response; - } else { - response.status = "error"; - /* backendResponse.responseText == "Scope validation failed" - Here the response.context("Scope validation failed") is used other then response.status(401). - Reason for this is IDP return 401 as the status in 4 different situations such as, - 1. UnAuthorized. - 2. Scope Validation Failed. - 3. Permission Denied. - 4. Access Token Expired. - 5. Access Token Invalid. - In these cases in order to identify the correct situation we have to compare the unique value from status and - context which is context. - */ - if (backendResponse.responseText == "Scope validation failed") { - response.content = "Permission Denied"; - } else { - response.content = backendResponse.responseText; - } - return response; - } - }; - - /* - @Updated - */ - publicMethods.getAllPolicies = function () { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - if (!carbonUser) { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - try { - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/policies?offset=0&limit=100"; - return serviceInvokers.XMLHttp.get(url, privateMethods.handleGetAllPoliciesResponse); - } catch (e) { - throw e; - } - }; - - /** - * Retrieve all policies based on policy type - */ - publicMethods.getAllPoliciesByType = function (policyType) { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - if (!carbonUser) { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - try { - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/policies/type/" + policyType + "?offset=0&limit=100"; - return serviceInvokers.XMLHttp.get(url, privateMethods.handleGetAllPoliciesResponse); - } catch (e) { - log.error("Error occurred while retrieving policies by policy type " + policyType); - throw e; - } - }; - - /* - Get policies count from backend services. - */ - publicMethods.getPoliciesCount = function () { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - if (!carbonUser) { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - try { - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/policies?offset=0&limit=1"; - return serviceInvokers.XMLHttp.get( - url, function (responsePayload) { - return parse(responsePayload["responseText"])["count"]; - }, - function (responsePayload) { - log.error(responsePayload["responseText"]); - return -1; - } - ); - } catch (e) { - throw e; - } - }; - - /* - Get apps available in the store from backend service. - */ - publicMethods.getStoreAppsForPolicy = function () { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - if (!carbonUser) { - log.error("User object was not found in the session"); - userModule.logout(function () { - response.sendRedirect(devicemgtProps["appContext"] + "login"); - }); - } - try { - var url = devicemgtProps["managerHTTPSURL"] + devicemgtProps["backendRestEndpoints"]["appMgt"] + - "/applications"; - var data = { - limit: -1 - }; - return serviceInvokers.XMLHttp.post(url, data, - function (backendResponse) { - var response = {}; - if (backendResponse.status === 200 && backendResponse.responseText) { - var appListFromRestEndpoint = parse(backendResponse.responseText)["applications"]; - var storeApps = []; - var i, appObjectFromRestEndpoint, appObjectToView; - for (i=0; i 0) { - domain = username.substr(0, username.indexOf('/')); - username = username.substr(username.indexOf('/') + 1); - } - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/users/" + - encodeURIComponent(username); - if (domain) { - url += '?domain=' + encodeURIComponent(domain); - } - var response = privateMethods.callBackend(url, constants["HTTP_GET"]); - response["content"] = parse(response.content); - response["userDomain"] = carbonUser.domain; - return response; - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /** - * Returns a set of roles assigned to a particular user - * @param username - * @returns {object} a response object with status and content on success. - */ - publicMethods.getRolesByUsername = function (username) { - var carbonUser = publicMethods.getCarbonUser(); - var domain; - if (username.indexOf('/') > 0) { - domain = username.substr(0, username.indexOf('/')); - username = username.substr(username.indexOf('/') + 1); - } - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/users/" + - encodeURIComponent(username) + "/roles"; - if (domain) { - url += '?domain=' + encodeURIComponent(domain); - } - var response = privateMethods.callBackend(url, constants["HTTP_GET"]); - if (response.status == "success") { - response.content = parse(response.content).roles; - } - return response; - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /* - @NewlyAdded - */ - publicMethods.getUsersByUsername = function () { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - var utility = require("/app/modules/utility.js")["utility"]; - if (!carbonUser) { - log.error("User object was not found in the session"); - throw constants["ERRORS"]["USER_NOT_FOUND"]; - } - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + "/mdm-admin/users/users-by-username"; - return privateMethods.callBackend(url, constants["HTTP_GET"]); - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /* - @Updated - */ - /** - * Get User Roles from user store (Internal roles not included). - */ - publicMethods.getRoles = function () { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - var utility = require("/app/modules/utility.js")["utility"]; - if (!carbonUser) { - log.error("User object was not found in the session"); - throw constants["ERRORS"]["USER_NOT_FOUND"]; - } - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/roles?offset=0&limit=100&user-store=all"; - var response = privateMethods.callBackend(url, constants["HTTP_GET"]); - if (response.status == "success") { - response.content = parse(response.content).roles; - } - return response; - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /** - * Get User Roles from user store (Internal roles not included). - */ - publicMethods.getFilteredRoles = function (prefix) { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - var utility = require("/app/modules/utility.js")["utility"]; - if (!carbonUser) { - log.error("User object was not found in the session"); - throw constants["ERRORS"]["USER_NOT_FOUND"]; - } - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/roles/filter/" + prefix + "?offset=0&limit=100&user-store=all"; - var response = privateMethods.callBackend(url, constants["HTTP_GET"]); - if (response.status == "success") { - response.content = parse(response.content); - } - return response; - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /** - * Get User Roles count from user store (Internal roles not included). - */ - publicMethods.getRolesCount = function () { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - var utility = require("/app/modules/utility.js")["utility"]; - if (!carbonUser) { - log.error("User object was not found in the session"); - throw constants["ERRORS"]["USER_NOT_FOUND"]; - } - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/roles?offset=0&limit=1&user-store=all"; - return serviceInvokers.XMLHttp.get( - url, function (responsePayload) { - return parse(responsePayload["responseText"])["count"]; - }, - function (responsePayload) { - log.error(responsePayload["responseText"]); - return -1; - } - ); - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /* - @Updated - */ - /** - * Get User Roles from user store (Internal roles not included). - * @returns {object} a response object with status and content on success. - */ - publicMethods.getRolesByUserStore = function (userStore) { - userStore = userStore ? userStore : "all"; - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - var utility = require("/app/modules/utility.js")["utility"]; - if (!carbonUser) { - log.error("User object was not found in the session"); - throw constants["ERRORS"]["USER_NOT_FOUND"]; - } - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/roles?user-store=" + encodeURIComponent(userStore) + "&limit=100"; - var response = privateMethods.callBackend(url, constants["HTTP_GET"]); - if (response.status == "success") { - response.content = parse(response.content).roles; - } - return response; - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /** - * Get Platforms. - * @deprecated moved this device module under getDeviceTypes. - */ - //TODO Move this piece of logic out of user.js to somewhere else appropriate. - publicMethods.getPlatforms = function () { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - var utility = require("/app/modules/utility.js")["utility"]; - if (!carbonUser) { - log.error("User object was not found in the session"); - throw constants["ERRORS"]["USER_NOT_FOUND"]; - } - try { - utility.startTenantFlow(carbonUser); - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/device-types"; - var response = privateMethods.callBackend(url, constants["HTTP_GET"]); - if (response.status == "success") { - response.content = parse(response.content); - } - return response; - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /** - * Get role - */ - publicMethods.getRole = function (roleName) { - var carbonUser = session.get(constants["USER_SESSION_KEY"]); - var utility = require("/app/modules/utility.js")["utility"]; - var userStore; - if (!carbonUser) { - log.error("User object was not found in the session"); - throw constants["ERRORS"]["USER_NOT_FOUND"]; - } - try { - utility.startTenantFlow(carbonUser); - if (roleName.indexOf('/') > 0) { - userStore = roleName.substr(0, roleName.indexOf('/')); - roleName = roleName.substr(roleName.indexOf('/') + 1); - } - var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/roles/" + encodeURIComponent(roleName); - if (userStore) { - url += "?user-store=" + encodeURIComponent(userStore); - } - var response = privateMethods.callBackend(url, constants["HTTP_GET"]); - if (response.status == "success") { - response.content = parse(response.content); - } - return response; - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - /** - * Authenticate a user when he or she attempts to login to MDM. - * - * @param username Username of the user - * @param password Password of the user - * @param successCallback Function to be called at the event of successful authentication - * @param failureCallback Function to be called at the event of failed authentication - */ - publicMethods.login = function (username, password, successCallback, failureCallback) { - var carbonModule = require("carbon"); - var carbonServer = application.get("carbonServer"); - try { - // check if the user is an authenticated user. - var isAuthenticated = carbonServer.authenticate(username, password); - if (!isAuthenticated) { - failureCallback("authentication"); - return; - } - var tenantUser = carbonModule.server.tenantUser(username); - var isAuthorizedToLogin = privateMethods.isAuthorizedToLogin(tenantUser); - if (!isAuthorizedToLogin) { - failureCallback("authorization"); - return; - } - session.put(constants.USER_SESSION_KEY, tenantUser); - successCallback(tenantUser); - } catch (e) { - throw e; - } - }; - - publicMethods.logout = function (successCallback) { - session.invalidate(); - successCallback(); - }; - - publicMethods.isAuthorized = function (permission) { - var carbon = require("carbon"); - var carbonServer = application.get("carbonServer"); - var carbonUser; - try { - carbonUser = session.get(constants.USER_SESSION_KEY); - } catch (e) { - log.error("User object was not found in the session"); - carbonUser = null; - } - var utility = require('/app/modules/utility.js').utility; - if (!carbonUser) { - log.error("User object was not found in the session"); - response.sendError(401, constants.ERRORS.USER_NOT_FOUND); - exit(); - } - - try { - utility.startTenantFlow(carbonUser); - var tenantId = carbon.server.tenantId(); - var userManager = new carbon.user.UserManager(server, tenantId); - var user = new carbon.user.User(userManager, carbonUser.username); - return user.isAuthorized(permission, "ui.execute"); - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - privateMethods.isAuthorizedToLogin = function(carbonUser) { - var utility = require('/app/modules/utility.js').utility; - try { - utility.startTenantFlow(carbonUser); - var tenantId = carbon.server.tenantId(); - var userManager = new carbon.user.UserManager(server, tenantId); - var user = new carbon.user.User(userManager, carbonUser.username); - return user.isAuthorized("/permission/admin/login", "ui.execute"); - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - }; - - publicMethods.getUIPermissions = function () { - var permissions = {}; - if (publicMethods.isAuthorized("/permission/admin/device-mgt/devices/any-device")) { - permissions["LIST_DEVICES"] = true; - permissions["LIST_OWN_DEVICES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/devices/owning-device/view")) { - permissions["LIST_OWN_DEVICES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/admin/groups/view")) { - permissions["LIST_ALL_GROUPS"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/view")) { - permissions["LIST_GROUPS"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/users/list")) { - permissions["LIST_USERS"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/roles/list")) { - permissions["LIST_ROLES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/policies/list")) { - permissions["LIST_ALL_POLICIES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/user/policies/list")) { - permissions["LIST_POLICIES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/devices/enroll")) { - permissions["ADD_DEVICE"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/add")) { - permissions["ADD_GROUP"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/users/add")) { - permissions["ADD_USER"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/devices/add")) { - permissions["ADD_GROUP_DEVICES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/devices/remove")) { - permissions["REMOVE_GROUP_DEVICES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/devices/view")) { - permissions["VIEW_GROUP_DEVICES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/roles/view")) { - permissions["VIEW_GROUP_ROLES"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/update")) { - permissions["UPDATE_GROUP"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/share")) { - permissions["SHARE_GROUP"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/users/remove")) { - permissions["REMOVE_USER"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/groups/remove")) { - permissions["REMOVE_GROUP"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/roles/add")) { - permissions["ADD_ROLE"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/policies/add")) { - permissions["ADD_ADMIN_POLICY"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/user/policies/add")) { - permissions["ADD_POLICY"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/policies/priority")) { - permissions["CHANGE_POLICY_PRIORITY"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/dashboard/view")) { - permissions["VIEW_DASHBOARD"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/platform-configurations/view")) { - permissions["TENANT_CONFIGURATION"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/certificates/manage")) { - permissions["CERTIFICATE_MANAGEMENT"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/devices/change-status")) { - permissions["CHANGE_DEVICE_STATUS"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt")) { - permissions["IS_ADMIN"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/topics/view")) { - permissions["VIEW_TOPICS"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/admin/devices/update-enrollment")) { - permissions["UPDATE_ENROLLMENT"] = true; - } - if (publicMethods.isAuthorized("/permission/admin/device-mgt/admin/devices/permanent-delete")) { - permissions["PERMANENT_DELETE"] = true; - } - - return permissions; - }; - - /** - * Add new role with permissions. - * - * @param roleName Name of the role - * @param users List of users to assign the role - * @param permissions List of permissions - */ - publicMethods.addRole = function (roleName, users, permissions) { - var carbon = require('carbon'); - var tenantId = carbon.server.tenantId(); - var url = carbon.server.address('https') + "/admin/services"; - var server = new carbon.server.Server(url); - var userManager = new carbon.user.UserManager(server, tenantId); - - try { - if (!userManager.roleExists(roleName)) { - userManager.addRole(roleName, users, permissions); - } else { - var array = Object.keys(permissions); - var i, permission; - for (i = 0; i < array.length; i++) { - permission = array[i]; - userManager.authorizeRole(roleName, permission, "ui.execute"); - } - } - } catch (e) { - throw e; - } - }; - - publicMethods.addPermissions = function (permissionList, path, init) { - var registry, carbon = require("carbon"); - var carbonServer = application.get("carbonServer"); - var utility = require('/app/modules/utility.js').utility; - var options = {system: true}; - if (init == "login") { - try { - var carbonUser = session.get(constants.USER_SESSION_KEY); - if (!carbonUser) { - log.error("User object was not found in the session"); - throw constants.ERRORS.USER_NOT_FOUND; - } - utility.startTenantFlow(carbonUser); - var tenantId = carbon.server.tenantId(); - if (carbonUser) { - options.tenantId = tenantId; - } - registry = new carbon.registry.Registry(carbonServer, options); - var i, permission, resource; - for (i = 0; i < permissionList.length; i++) { - permission = permissionList[i]; - resource = { - collection: true, - name: permission.name, - properties: { - name: permission.name - } - }; - if (path != "") { - registry.put("/_system/governance/permission/admin/" + path + "/" + permission.key, resource); - } else { - registry.put("/_system/governance/permission/admin/" + permission.key, resource); - } - } - } catch (e) { - throw e; - } finally { - utility.endTenantFlow(); - } - } else { - registry = new carbon.registry.Registry(carbonServer, options); - var i, permission, resource; - for (i = 0; i < permissionList.length; i++) { - permission = permissionList[i]; - resource = { - collection: true, - name: permission.name, - properties: { - name: permission.name - } - }; - if (path != "") { - registry.put("/_system/governance/permission/admin/" + path + "/" + permission.key, resource); - } else { - registry.put("/_system/governance/permission/admin/" + permission.key, resource); - } - } - } - }; - - /** - * Private method to be used by addUser() to - * retrieve secondary user stores. - * This needs Authentication since the method access admin services. - * - * @returns Array of secondary user stores. - */ - publicMethods.getSecondaryUserStores = function () { - var returnVal = []; - // To call the userstore admin service, user needs to have admin permission - if (publicMethods.isAuthorized("/permission/admin")) { - var endpoint = devicemgtProps["adminService"] + constants["USER_STORE_CONFIG_ADMIN_SERVICE_END_POINT"]; - var wsPayload = ""; - serviceInvokers.WS.soapRequest( - "urn:getSecondaryRealmConfigurations", - wsPayload, - endpoint, - function (wsResponse) { - var domainIDs = stringify(wsResponse. * ::['return']. * ::domainId.text()); - if (domainIDs != "\"\"") { - var regExpForSearch = new RegExp(constants["USER_STORES_NOISY_CHAR"], "g"); - domainIDs = domainIDs.replace(regExpForSearch, ""); - returnVal = domainIDs.split(constants["USER_STORES_SPLITTING_CHAR"]); - } - }, function (e) { - log.error("Error retrieving secondary user stores", e); - }, - constants["SOAP_VERSION"]); - } else { - if (log.isDebugEnabled()) { - log.debug("User does not have admin permission to get the secondary user store details."); - } - } - return returnVal; - }; - - return publicMethods; -}(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/cloud.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/cloud.js deleted file mode 100644 index 9427ed8b95..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/cloud.js +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 conf = function () { - var cloudConf = application.get("CLOUD_CONF"); - if (!cloudConf) { - cloudConf = require("/app/conf/toplink-menu.json"); - var pinch = require("/app/modules/conf-reader/pinch.min.js")["pinch"]; - var server = require("carbon")["server"]; - var process = require("process"); - pinch(cloudConf, /^/, - function (path, key, value) { - if ((typeof value === "string") && value.indexOf("%https.ip%") > -1) { - //noinspection JSUnresolvedFunction - return value.replace("%https.ip%", server.address("https")); - } else if ((typeof value === "string") && value.indexOf("%http.ip%") > -1) { - //noinspection JSUnresolvedFunction - return value.replace("%http.ip%", server.address("http")); - } else if ((typeof value === "string") && value.indexOf("%date-year%") > -1) { - var year = new Date().getFullYear(); - return value.replace("%date-year%", year); - } else if ((typeof value === "string") && value.indexOf("%server.ip%") > -1) { - var getProperty = require("process").getProperty; - return value.replace("%server.ip%", getProperty("carbon.local.ip")); - } else { - var paramPattern = new RegExp("%(.*?)%", "g"); - var out = value; - while ((matches = paramPattern.exec(value)) !== null) { - // This is necessary to avoid infinite loops with zero-width matches - if (matches.index === paramPattern.lastIndex) { - paramPattern.lastIndex++; - } - if (matches.length == 2) { - var property = process.getProperty(matches[1]); - if (property) { - out = out.replace(new RegExp("%" + matches[1] + "%", "g"), property); - } - } - } - return out; - } - } - ); - application.put("CLOUD_CONF", cloudConf); - } - return cloudConf; -}(); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/main.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/main.js deleted file mode 100644 index 4ff8c8ce77..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/main.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 conf = function () { - var conf = application.get("CONF"); - if (!conf) { - conf = require("/app/conf/config.json"); - var pinch = require("/app/modules/conf-reader/pinch.min.js")["pinch"]; - var server = require("carbon")["server"]; - var process = require("process"); - pinch(conf, /^/, - function (path, key, value) { - if ((typeof value === "string") && value.indexOf("%https.ip%") > -1) { - //noinspection JSUnresolvedFunction - return value.replace("%https.ip%", server.address("https")); - } else if ((typeof value === "string") && value.indexOf("%http.ip%") > -1) { - //noinspection JSUnresolvedFunction - return value.replace("%http.ip%", server.address("http")); - } else if ((typeof value === "string") && value.indexOf("%date-year%") > -1) { - var year = new Date().getFullYear(); - return value.replace("%date-year%", year); - } else if ((typeof value === "string") && value.indexOf("%server.ip%") > -1) { - var getProperty = require("process").getProperty; - return value.replace("%server.ip%", getProperty("carbon.local.ip")); - } else { - var paramPattern = new RegExp("%(.*?)%", "g"); - var out = value; - while ((matches = paramPattern.exec(value)) !== null) { - // This is necessary to avoid infinite loops with zero-width matches - if (matches.index === paramPattern.lastIndex) { - paramPattern.lastIndex++; - } - if (matches.length == 2) { - var property = process.getProperty(matches[1]); - if (property) { - out = out.replace(new RegExp("%" + matches[1] + "%", "g"), property); - } - } - } - return out; - } - } - ); - var DeviceConfigurationManager = Packages.io.entgra.device.mgt.core.device.mgt.core.config.DeviceConfigurationManager; - conf["serverConfig"] = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(); - application.put("CONF", conf); - } - return conf; -}(); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/pinch.min.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/pinch.min.js deleted file mode 100644 index 5d22ca0eb7..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/conf-reader/pinch.min.js +++ /dev/null @@ -1,26 +0,0 @@ -/* -* Copyright (c) 2011 František Hába -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the 'Software'), to deal in -* the Software without restriction, including without limitation the rights to use, -* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the -* Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. - -* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -* -* Reference:- https://github.com/Baggz/Pinch -* */ -(function(){var k=function(a,c){return a.length!==c.length?!1:a.every(function(a,b){return c[b]===a})},j=function(a,c,d){var b,e;if("[object Array]"===Object.prototype.toString.call(a)){b=0;for(e=a.length;b= 200 && status < 300) { - if (constants["STREAMING_FILES_ACCEPT_HEADERS"].indexOf(acceptTypeValue) > -1) { - return successCallback(httpMethodObject.getResponseBodyAsStream(), - httpMethodObject.getResponseHeaders()); - } else { - return successCallback(httpMethodObject.getResponseBodyAsString(), - httpMethodObject.getResponseHeaders()); - } - } else { - return errorCallback(httpMethodObject.getResponseBodyAsString(), - httpMethodObject.getResponseHeaders()); - } - } catch (e) { - return errorCallback(response); - } finally { - //noinspection JSUnresolvedFunction - if (method != constants["HTTP_GET"]) { - method.releaseConnection(); - } - } - }; - - /** - * This method invokes return initiateHTTPClientRequest for get calls. - * @param url target url. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. - * @param headers a list of name value pairs for additional http headers. - */ - publicHTTPClientInvokers["get"] = function (url, successCallback, errorCallback, headers) { - var requestPayload = null; - return privateMethods.initiateHTTPClientRequest(constants["HTTP_GET"], url, successCallback, errorCallback, - requestPayload, headers); - }; - - /** - * This method invokes return initiateHTTPClientRequest for post calls. - * @param url target url. - * @param payload payload/data which need to be send. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. - * @param headers a list of name value pairs for additional http headers. - */ - publicHTTPClientInvokers["post"] = function (url, payload, successCallback, errorCallback, headers) { - return privateMethods.initiateHTTPClientRequest(constants["HTTP_POST"], url, successCallback, errorCallback, - payload, headers); - }; - - /** - * This method invokes return initiateHTTPClientRequest for put calls. - * @param url target url. - * @param payload payload/data which need to be send. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. - * @param headers a list of name value pairs for additional http headers. - */ - publicHTTPClientInvokers["put"] = function (url, payload, successCallback, errorCallback, headers) { - return privateMethods.initiateHTTPClientRequest(constants["HTTP_PUT"], url, successCallback, errorCallback, - payload, headers); - }; - - /** - * This method invokes return initiateHTTPClientRequest for delete calls. - * @param url target url. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. - * @param headers a list of name value pairs for additional http headers. - */ - publicHTTPClientInvokers["delete"] = function (url, successCallback, errorCallback, headers) { - var requestPayload = null; - return privateMethods.initiateHTTPClientRequest(constants["HTTP_DELETE"], url, successCallback, errorCallback, - requestPayload, headers); - }; - - var publicMethods = {}; - publicMethods.XMLHttp = publicXMLHTTPInvokers; - publicMethods.WS = publicWSInvokers; - publicMethods.HttpClient = publicHTTPClientInvokers; - - return publicMethods; -}(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/utility.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/utility.js deleted file mode 100644 index 452c9f5df5..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/utility.js +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 utility; -utility = function () { - - var constants = require('/app/modules/constants.js'); - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var log = new Log("/app/modules/utility.js"); - var JavaClass = Packages.java.lang.Class; - var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext; - var server = require("carbon")["server"]; - - var getOsgiService = function (className) { - return PrivilegedCarbonContext.getThreadLocalCarbonContext().getOSGiService(JavaClass.forName(className)); - }; - - var deviceTypeConfigMap = {}; - - var publicMethods = {}; - - publicMethods.startTenantFlow = function (userInfo) { - var context, carbon = require('carbon'); - PrivilegedCarbonContext.startTenantFlow(); - context = PrivilegedCarbonContext.getThreadLocalCarbonContext(); - context.setTenantDomain(carbon.server.tenantDomain({ - tenantId: userInfo.tenantId - })); - context.setTenantId(userInfo.tenantId); - context.setUsername(userInfo.username || null); - }; - - publicMethods.endTenantFlow = function () { - PrivilegedCarbonContext.endTenantFlow(); - }; - - publicMethods.getDeviceManagementService = function () { - return getOsgiService('io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService'); - }; - - publicMethods.getAPIManagementProviderService = function () { - return getOsgiService('io.entgra.device.mgt.core.apimgt.application.extension.APIManagementProviderService'); - }; - - publicMethods.getUserManagementService = function () { - return getOsgiService("org.wso2.carbon.device.mgt.user.core.UserManager"); - }; - - publicMethods.getPolicyManagementService = function () { - return getOsgiService("io.entgra.device.mgt.core.policy.mgt.core.PolicyManagerService"); - }; - - publicMethods.getDeviceTypeConfig = function (deviceType) { - var unitName = publicMethods.getTenantedDeviceUnitName(deviceType, "type-view"); - if (!unitName) { - return null; - } - - if (deviceType in deviceTypeConfigMap) { - return deviceTypeConfigMap[deviceType]; - } - var deviceTypeConfig; - var deviceTypeConfigFile = new File("/app/units/" + unitName + "/private/config.json"); - if (deviceTypeConfigFile.isExists()) { - try { - deviceTypeConfigFile.open("r"); - var config = deviceTypeConfigFile.readAll(); - config = config.replace("%https.ip%", server.address("https")); - config = config.replace("%http.ip%", server.address("http")); - deviceTypeConfig = parse(config); - } catch (err) { - log.error("Error while reading device config file for `" + deviceType + "`: " + err); - } finally { - deviceTypeConfigFile.close(); - } - } - deviceTypeConfigMap[deviceType] = deviceTypeConfig; - return deviceTypeConfig; - }; - - publicMethods.getOperationIcon = function (deviceType, operation) { - var unitName = publicMethods.getTenantedDeviceUnitName(deviceType, "type-view"); - var iconPath = "/app/units/" + unitName + "/public/images/operations/" + operation + ".png"; - var icon = new File(iconPath); - if (icon.isExists()) { - return devicemgtProps["appContext"] + "public/" + unitName + "/images/operations/" + operation + ".png"; - } else { - return null; - } - }; - - publicMethods.getDeviceThumb = function (deviceType) { - var unitName = publicMethods.getTenantedDeviceUnitName(deviceType, "type-view"); - if (!unitName) { - unitName = "cdmf.unit.default.device.type.type-view"; - } - var iconPath = "/app/units/" + unitName + "/public/images/thumb.png"; - var icon = new File(iconPath); - if (icon.isExists()) { - return devicemgtProps["appContext"] + "public/" + unitName + "/images/thumb.png"; - } else { - return null; - } - }; - - publicMethods.getTenantedDeviceUnitName = function (deviceType, unitPostfix) { - var user = session.get(constants.USER_SESSION_KEY); - if (!user) { - log.error("User object was not found in the session"); - throw constants.ERRORS.USER_NOT_FOUND; - } - var unitName = user.domain + ".cdmf.unit.device.type." + deviceType + "." + unitPostfix; - if (new File("/app/units/" + unitName).isExists()) { - return unitName; - } - unitName = "cdmf.unit.device.type." + deviceType + "." + unitPostfix; - if (new File("/app/units/" + unitName).isExists()) { - return unitName; - } - return null; - }; - - publicMethods.getDeviceTypesScopesList = function () { - var dirs = new File("/app/units/").listFiles(); - var scopesList = []; - for (var i = 0; i < dirs.length; i++) { - var unitName = dirs[i].getName(); - if (unitName.match(/^cdmf\.unit\.device\.type\..*\.type-view$/g)) { - var deviceTypeConfigFile = new File("/app/units/" + unitName + "/private/config.json"); - if (deviceTypeConfigFile.isExists()) { - try { - deviceTypeConfigFile.open("r"); - var config = deviceTypeConfigFile.readAll(); - config = config.replace("%https.ip%", server.address("https")); - config = config.replace("%http.ip%", server.address("http")); - var deviceTypeConfig = parse(config); - if (deviceTypeConfig.deviceType && deviceTypeConfig.deviceType.scopes) { - scopesList = scopesList.concat(deviceTypeConfig.deviceType.scopes); - } - } catch (err) { - log.error("Error while reading device config file for `" + deviceType + "`: " + err); - } finally { - deviceTypeConfigFile.close(); - } - } - } - } - return scopesList; - }; - - - /** - * Escapes special characters such as <,>,',",...etc - * This will prevent XSS attacks upon JSON. - * @param text - * @returns {*} - */ - publicMethods.encodeJson = function (text) { - if (text) { - return text - .replace(/\\u003c/g, "<") - .replace(//g, ">") - .replace(/\\u0027/g, "'") - .replace(/'/g, "'") - .replace(/\\"/g, """) - .replace(/\\u0022/g, """); - } else { - return ""; - } - }; - - publicMethods.md5 = function (s) { - function L(k, d) { - return (k << d) | (k >>> (32 - d)) - } - - function K(G, k) { - var I, d, F, H, x; - F = (G & 2147483648); - H = (k & 2147483648); - I = (G & 1073741824); - d = (k & 1073741824); - x = (G & 1073741823) + (k & 1073741823); - if (I & d) { - return (x ^ 2147483648 ^ F ^ H) - } - if (I | d) { - if (x & 1073741824) { - return (x ^ 3221225472 ^ F ^ H) - } else { - return (x ^ 1073741824 ^ F ^ H) - } - } else { - return (x ^ F ^ H) - } - } - - function r(d, F, k) { - return (d & F) | ((~d) & k) - } - - function q(d, F, k) { - return (d & k) | (F & (~k)) - } - - function p(d, F, k) { - return (d ^ F ^ k) - } - - function n(d, F, k) { - return (F ^ (d | (~k))) - } - - function u(G, F, aa, Z, k, H, I) { - G = K(G, K(K(r(F, aa, Z), k), I)); - return K(L(G, H), F) - } - - function f(G, F, aa, Z, k, H, I) { - G = K(G, K(K(q(F, aa, Z), k), I)); - return K(L(G, H), F) - } - - function D(G, F, aa, Z, k, H, I) { - G = K(G, K(K(p(F, aa, Z), k), I)); - return K(L(G, H), F) - } - - function t(G, F, aa, Z, k, H, I) { - G = K(G, K(K(n(F, aa, Z), k), I)); - return K(L(G, H), F) - } - - function e(G) { - var Z; - var F = G.length; - var x = F + 8; - var k = (x - (x % 64)) / 64; - var I = (k + 1) * 16; - var aa = Array(I - 1); - var d = 0; - var H = 0; - while (H < F) { - Z = (H - (H % 4)) / 4; - d = (H % 4) * 8; - aa[Z] = (aa[Z] | (G.charCodeAt(H) << d)); - H++ - } - Z = (H - (H % 4)) / 4; - d = (H % 4) * 8; - aa[Z] = aa[Z] | (128 << d); - aa[I - 2] = F << 3; - aa[I - 1] = F >>> 29; - return aa - } - - function B(x) { - var k = "", F = "", G, d; - for (d = 0; d <= 3; d++) { - G = (x >>> (d * 8)) & 255; - F = "0" + G.toString(16); - k = k + F.substr(F.length - 2, 2) - } - return k - } - - function J(k) { - k = k.replace(/rn/g, "n"); - var d = ""; - for (var F = 0; F < k.length; F++) { - var x = k.charCodeAt(F); - if (x < 128) { - d += String.fromCharCode(x) - } else { - if ((x > 127) && (x < 2048)) { - d += String.fromCharCode((x >> 6) | 192); - d += String.fromCharCode((x & 63) | 128) - } else { - d += String.fromCharCode((x >> 12) | 224); - d += String.fromCharCode(((x >> 6) & 63) | 128); - d += String.fromCharCode((x & 63) | 128) - } - } - } - return d - } - - var C = Array(); - var P, h, E, v, g, Y, X, W, V; - var S = 7, Q = 12, N = 17, M = 22; - var A = 5, z = 9, y = 14, w = 20; - var o = 4, m = 11, l = 16, j = 23; - var U = 6, T = 10, R = 15, O = 21; - s = J(s); - C = e(s); - Y = 1732584193; - X = 4023233417; - W = 2562383102; - V = 271733878; - for (P = 0; P < C.length; P += 16) { - h = Y; - E = X; - v = W; - g = V; - Y = u(Y, X, W, V, C[P + 0], S, 3614090360); - V = u(V, Y, X, W, C[P + 1], Q, 3905402710); - W = u(W, V, Y, X, C[P + 2], N, 606105819); - X = u(X, W, V, Y, C[P + 3], M, 3250441966); - Y = u(Y, X, W, V, C[P + 4], S, 4118548399); - V = u(V, Y, X, W, C[P + 5], Q, 1200080426); - W = u(W, V, Y, X, C[P + 6], N, 2821735955); - X = u(X, W, V, Y, C[P + 7], M, 4249261313); - Y = u(Y, X, W, V, C[P + 8], S, 1770035416); - V = u(V, Y, X, W, C[P + 9], Q, 2336552879); - W = u(W, V, Y, X, C[P + 10], N, 4294925233); - X = u(X, W, V, Y, C[P + 11], M, 2304563134); - Y = u(Y, X, W, V, C[P + 12], S, 1804603682); - V = u(V, Y, X, W, C[P + 13], Q, 4254626195); - W = u(W, V, Y, X, C[P + 14], N, 2792965006); - X = u(X, W, V, Y, C[P + 15], M, 1236535329); - Y = f(Y, X, W, V, C[P + 1], A, 4129170786); - V = f(V, Y, X, W, C[P + 6], z, 3225465664); - W = f(W, V, Y, X, C[P + 11], y, 643717713); - X = f(X, W, V, Y, C[P + 0], w, 3921069994); - Y = f(Y, X, W, V, C[P + 5], A, 3593408605); - V = f(V, Y, X, W, C[P + 10], z, 38016083); - W = f(W, V, Y, X, C[P + 15], y, 3634488961); - X = f(X, W, V, Y, C[P + 4], w, 3889429448); - Y = f(Y, X, W, V, C[P + 9], A, 568446438); - V = f(V, Y, X, W, C[P + 14], z, 3275163606); - W = f(W, V, Y, X, C[P + 3], y, 4107603335); - X = f(X, W, V, Y, C[P + 8], w, 1163531501); - Y = f(Y, X, W, V, C[P + 13], A, 2850285829); - V = f(V, Y, X, W, C[P + 2], z, 4243563512); - W = f(W, V, Y, X, C[P + 7], y, 1735328473); - X = f(X, W, V, Y, C[P + 12], w, 2368359562); - Y = D(Y, X, W, V, C[P + 5], o, 4294588738); - V = D(V, Y, X, W, C[P + 8], m, 2272392833); - W = D(W, V, Y, X, C[P + 11], l, 1839030562); - X = D(X, W, V, Y, C[P + 14], j, 4259657740); - Y = D(Y, X, W, V, C[P + 1], o, 2763975236); - V = D(V, Y, X, W, C[P + 4], m, 1272893353); - W = D(W, V, Y, X, C[P + 7], l, 4139469664); - X = D(X, W, V, Y, C[P + 10], j, 3200236656); - Y = D(Y, X, W, V, C[P + 13], o, 681279174); - V = D(V, Y, X, W, C[P + 0], m, 3936430074); - W = D(W, V, Y, X, C[P + 3], l, 3572445317); - X = D(X, W, V, Y, C[P + 6], j, 76029189); - Y = D(Y, X, W, V, C[P + 9], o, 3654602809); - V = D(V, Y, X, W, C[P + 12], m, 3873151461); - W = D(W, V, Y, X, C[P + 15], l, 530742520); - X = D(X, W, V, Y, C[P + 2], j, 3299628645); - Y = t(Y, X, W, V, C[P + 0], U, 4096336452); - V = t(V, Y, X, W, C[P + 7], T, 1126891415); - W = t(W, V, Y, X, C[P + 14], R, 2878612391); - X = t(X, W, V, Y, C[P + 5], O, 4237533241); - Y = t(Y, X, W, V, C[P + 12], U, 1700485571); - V = t(V, Y, X, W, C[P + 3], T, 2399980690); - W = t(W, V, Y, X, C[P + 10], R, 4293915773); - X = t(X, W, V, Y, C[P + 1], O, 2240044497); - Y = t(Y, X, W, V, C[P + 8], U, 1873313359); - V = t(V, Y, X, W, C[P + 15], T, 4264355552); - W = t(W, V, Y, X, C[P + 6], R, 2734768916); - X = t(X, W, V, Y, C[P + 13], O, 1309151649); - Y = t(Y, X, W, V, C[P + 4], U, 4149444226); - V = t(V, Y, X, W, C[P + 11], T, 3174756917); - W = t(W, V, Y, X, C[P + 2], R, 718787259); - X = t(X, W, V, Y, C[P + 9], O, 3951481745); - Y = K(Y, h); - X = K(X, E); - W = K(W, v); - V = K(V, g) - } - var i = B(Y) + B(X) + B(W) + B(V); - return i.toLowerCase() - }; - - return publicMethods; -}(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.hbs deleted file mode 100644 index b128ceaf92..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.hbs +++ /dev/null @@ -1,111 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Add Certificate"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Certificates - -
  • -
  • - - Add - -
  • -{{/zone}} - -{{#zone "content"}} - {{#if isAuthorized}} - -
    -
    - -
    -
    -

    Add Certificate

    -

    Please note that * sign represents required fields of data.

    -
    -
    -
    - - - -
    -
    - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - -
    -
    - - {{else}} -

    - Permission Denied -

    -
    - You not authorized to enter Certificate Management Section. -
    - {{/if}} -{{/zone}} - -{{#zone "bottomJs"}} - {{js "/js/certificate-create.js"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.js deleted file mode 100644 index c9a7ab5d00..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Returns the dynamic state to be populated by add-user page. - * - * @param viewModel Object that gets updated with the dynamic state of this page to be presented - * @returns {*} A viewModel object that returns the dynamic state of this page to be presented - */ -function onRequest(context) { - // var log = new Log("units/user-create/create.js"); - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var mdmProps = require("/app/modules/conf-reader/main.js")["conf"]; - var viewModel = {}; - viewModel.isAuthorized = userModule.isAuthorized("/permission/admin/device-mgt/certificates/manage"); - var response = userModule.getRolesByUserStore(); - if (response["status"] == "success") { - viewModel["roles"] = response["content"]; - } - - viewModel["charLimit"] = mdmProps["userValidationConfig"]["usernameLength"]; - viewModel["usernameJSRegEx"] = mdmProps["userValidationConfig"]["usernameJSRegEx"]; - viewModel["usernameHelpText"] = mdmProps["userValidationConfig"]["usernameHelpMsg"]; - viewModel["usernameRegExViolationErrorMsg"] = mdmProps["userValidationConfig"]["usernameRegExViolationErrorMsg"]; - viewModel["firstnameJSRegEx"] = mdmProps["userValidationConfig"]["firstnameJSRegEx"]; - viewModel["firstnameRegExViolationErrorMsg"] = mdmProps["userValidationConfig"]["firstnameRegExViolationErrorMsg"]; - viewModel["lastnameJSRegEx"] = mdmProps["userValidationConfig"]["lastnameJSRegEx"]; - viewModel["lastnameRegExViolationErrorMsg"] = mdmProps["userValidationConfig"]["lastnameRegExViolationErrorMsg"]; - - return viewModel; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.json deleted file mode 100644 index db293d5ab1..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/create.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/certificates/add", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/public/js/certificate-create.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/public/js/certificate-create.js deleted file mode 100644 index e9a4a53641..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificate.create/public/js/certificate-create.js +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 pemContent = ""; -var errorMsgWrapper = "#certificate-create-error-msg"; -var errorMsg = "#certificate-create-error-msg span"; -var validateInline = {}; -var clearInline = {}; - -var base_api_url = "/api/certificate-mgt/v1.0"; - -var enableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).addClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).removeClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).removeClass(" hidden"); - } -}; - -var disableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).removeClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).addClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).addClass(" hidden"); - } -}; - -function readSingleFile(evt) { - var f = evt.target.files[0]; - if (f) { - var r = new FileReader(); - r.onload = function (e) { - var contents = e.target.result; - if (f.type == "application/x-x509-ca-cert") { - pemContent = contents; - console.log(contents); - console.log(pemContent); - pemContent = pemContent.substring(28, pemContent.length - 27); - console.log(pemContent); - $(errorMsgWrapper).addClass("hidden"); - } else { - $(errorMsg).text("Certificate must be a .pem file containing a valid certificate data."); - $(errorMsgWrapper).removeClass("hidden"); - } - } - r.readAsText(f); - } else { - //inline error - } -} - -$(document).ready(function () { - pemContent = ""; - document.getElementById('certificate').addEventListener('change', readSingleFile, false); - - /** - * Following click function would execute - * when a user clicks on "Add Certificate" button. - */ - $("button#add-certificate-btn").click(function () { - var serialNoInput = $("input#serialNo"); - var serialNo = serialNoInput.val(); - if (!serialNo) { - $(errorMsg).text("Serial Number is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!pemContent) { - $(errorMsg).text(" .pem file must contains certificate information."); - $(errorMsgWrapper).removeClass("hidden"); - } else { - var addCertificateFormData = {}; - addCertificateFormData.serial = serialNo; - addCertificateFormData.pem = pemContent; - var certificateList = []; - certificateList.push(addCertificateFormData); - - var serviceUrl = base_api_url + "/admin/certificates"; - invokerUtil.post( - serviceUrl, - certificateList, - function (data) { - // Refreshing with success message - $("#certificate-create-form").addClass("hidden"); - $("#certificate-created-msg").removeClass("hidden"); - }, function (data) { - if (data["status"] == 500) { - $(errorMsg).text("An unexpected error occurred at backend server. Please try again later."); - } else { - $(errorMsg).text(data); - } - $(errorMsgWrapper).removeClass("hidden"); - } - ); - } - }); -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.hbs deleted file mode 100644 index 276bc83048..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.hbs +++ /dev/null @@ -1,122 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Add Certificate"}} -{{unit "cdmf.unit.ui.modal"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Certificate - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#if removePermitted}} -
  • - - - - - - Add Certificate - -
  • - {{/if}} -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.data-tables-extended"}} - - -
    - {{#if removePermitted}} - - {{/if}} - {{#if viewPermitted}} - - {{/if}} - - Loading Certificates . . . -
    -
    - - - - -
    - -{{/zone}} - -{{#zone "bottomJs"}} - - - {{js "/js/certificate-listing.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.json deleted file mode 100644 index 39fb7ff01b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/certificates.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/certificates", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/public/js/certificate-listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/public/js/certificate-listing.js deleted file mode 100644 index 3e73a11999..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/public/js/certificate-listing.js +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/* - * Sorting function of certificates - * listed on Certificate Management page in WSO2 MDM Console. - */ -$(function () { - var sortableElem = '.wr-sortable'; - $(sortableElem).sortable({ - beforeStop: function () { - var sortedIDs = $(this).sortable('toArray'); - } - }); - $(sortableElem).disableSelection(); -}); - -var modalPopup = ".modal"; -var modalPopupContainer = modalPopup + " .modal-content"; -var modalPopupContent = modalPopup + " .modal-content"; -var body = "body"; -var isInit = true; - -var base_api_url = "/api/certificate-mgt/v1.0"; - -$(".icon .text").res_text(0.2); - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).modal('show'); -} - -/* - * hide popup function. - */ -function hidePopup() { - $(modalPopupContent).html(''); - $(modalPopup).modal('hide'); - $('body').removeClass('modal-open').css('padding-right','0px'); - $('.modal-backdrop').remove(); -} - -/** - * Following click function would execute - * when a user clicks on "Remove" link - * on Certificate Listing page in WSO2 MDM Console. - */ -function removeCertificate(serialNumber) { - var serviceUrl = base_api_url + "/admin/certificates/" + serialNumber; - modalDialog.header('Do you really want to remove this certificate ?'); - modalDialog.footer(''); - modalDialog.show(); - - $("a#remove-certificate-yes-link").click(function () { - invokerUtil.delete( - serviceUrl, - function () { - $("#" + serialNumber).remove(); - var newCertificateListCount = $(".user-list > span").length; - $("#certificate-listing-status-msg").text("Total number of Certificates found : " + - newCertificateListCount); - modalDialog.header('Done. Certificate was successfully removed.'); - modalDialog.footer(''); - $("a#remove-certificate-success-link").click(function () { - modalDialog.hide(); - }); - }, - function () { - modalDialog.header('An unexpected error occurred. Please try again later.'); - modalDialog.footer(''); - modalDialog.showAsError(); - $("a#remove-certificate-error-link").click(function () { - modalDialog.hide(); - }); - } - ); - }); - - $("a#remove-certificate-cancel-link").click(function () { - modalDialog.hide(); - }); -} - -/** - * Following on click function would execute - * when a user type on the search field on certificate Listing page in - * WSO2 MDM Console then click on the search button. - */ -$("#search-btn").click(function () { - var searchQuery = $("#search-by-certificate").val(); - $("#ast-container").empty(); - loadCertificates(searchQuery); -}); - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption() { - if ($("#can-view").val()) { - $(location).attr('href', $(this).data("url")); - } else { - modalDialog.header('Unauthorized action!'); - modalDialog.content('You do not have permission to view this certificate.'); - modalDialog.showAsAWarning(); - } -} - -function loadCertificates(searchParam) { - $("#loading-content").show(); - var certificateListing = $("#certificate-listing"); - var certificateListingSrc = certificateListing.attr("src"); - $.template("certificate-listing", certificateListingSrc, function (template) { - var serviceURL = base_api_url + "/admin/certificates"; - - if (searchParam != null && searchParam != undefined && searchParam.trim() != '') { - serviceURL = base_api_url + "/admin/certificates?" + searchParam; - } - - var successCallback = function (data, textStatus, jqXHR) { - if (jqXHR.status == 200 && data) { - data = JSON.parse(data); - - var viewModel = {}; - viewModel.certificates = data.certificates; - - for (var i = 0; i < viewModel.certificates.length; i++) { - viewModel.certificates[i].removePermitted = true; - viewModel.certificates[i].viewPermitted = true; - } - - if (viewModel.certificates.length > 0) { - $('#certificate-table').removeClass('hidden'); - $('#ast-container').removeClass('hidden'); - $('#certificate-listing-status-msg').text(""); - var content = template(viewModel); - $("#ast-container").html(content); - } else { - $('#certificate-table').addClass('hidden'); - $('#certificate-listing-status-msg').text('No certificate is available to be displayed.'); - $('#certificate-listing-status').removeClass('hidden'); - } - - $("#loading-content").hide(); - - if (isInit) { - $('#certificate-grid').datatables_extended(); - isInit = false; - } - - $(".icon .text").res_text(0.2); - } - }; - invokerUtil.get(serviceURL, - successCallback, - function (message) { - $('#ast-container').addClass('hidden'); - $('#certificate-listing-status-msg'). - text('Invalid search query. Try again with a valid search query'); - } - ); - }); -} - -$(document).ready(function () { - loadCertificates(); - - $(".viewEnabledIcon").click(function () { - InitiateViewOption(); - }); -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/public/templates/certificate-listing.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/public/templates/certificate-listing.hbs deleted file mode 100644 index 8097c3e987..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.certificates/public/templates/certificate-listing.hbs +++ /dev/null @@ -1,30 +0,0 @@ -{{#each certificates}} - - - -
    - -
    - - {{serialNumber}} - {{subject}} - - {{#unequal adminUser serialNumber }} - {{#if removePermitted}} - - - - - - - - {{/if}} - {{/unequal}} - - - -{{/each}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.cookie-policy/cookie-policy.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.cookie-policy/cookie-policy.hbs deleted file mode 100644 index 85fdd17be9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.cookie-policy/cookie-policy.hbs +++ /dev/null @@ -1,172 +0,0 @@ -{{! - Copyright (c) 2018, 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. -}} -{{#zone "title"}}{{! to override parent page title }}{{/zone}} -{{unit "cdmf.unit.ui.title" pageTitle="Consent Page"}} - -{{#zone "content"}} -
    -
    - -

    COOKIE POLICY

    - -
    -

    About Entgra IoT Server

    -

    Entgra IoT Server 4.1.0 is a complete solution that enables device manufacturers and enterprises to - connect and manage their devices, build apps, manage events, secure devices and data, and visualize - sensor data in a scalable manner.

    -

    It also offers a complete and secure Enterprise Mobility Management (EMM/MDM) solution that aims to - address mobile computing challenges faced by enterprises today. Supporting iOS, Android, and Windows - devices, it helps organizations deal with both Corporate Owned, Personally Enabled (COPE) and - employee-owned devices with the Bring Your Own Device (BYOD) concept.

    -

    Entgra IoT Server 4.1.0 comes with advanced analytics, enabling users to analyze speed, proximity, - and - geo-fencing information of devices including details of those in motion and stationary state.

    -

    -

    Cookie Policy

    -

    IoT Server uses cookies to provide you with the best user experience, and to securely identify you. - You can disable cookies if you so wish . However you might not be able to access some of the services - if you disable cookies.

    -

    What is a cookie?

    -

    A browser cookie is a small piece of data that is stored on your device to help websites and mobile - apps remember things about you. Other technologies, including Web storage and identifiers associated - with your device, may be used for similar purposes. In this policy, we use the term “cookies” to - discuss all of these technologies.

    -

    How does Entgra IoT Server 4.1.0 process cookies?

    -

    Entgra IoT Server 4.1.0 uses cookies to store and retrieve information on your browser. This - information is used to provide a better user experience. Some cookies serve the purpose of allowing a - user to log in to the system, maintain sessions, and keep track of activities within the login - session.

    -

    Some cookies in Entgra IoT Server 4.1.0 are used to personally identify you. However, the cookie - lifetime ends once your session ends, i.e., after you log-out, or after the session expiry time has - elapsed.

    -

    Some cookies are simply used to give you a more personalised web experience, and these cannot be used - to identify you or your activities personally.

    -

    This Cookie Policy is part of the IoT Server Privacy Policy. -

    -

    What does Entgra IoT Server 4.1.0 use cookies for?

    -

    Cookies are used for two purposes in Entgra IoT Server 4.1.0.

    -
      -
    1. To identify you and provide security
    2. -
    3. To provide a satisfying user experience.
    4. -
    - -

    Preferences

    -

    Entgra IoT Server 4.1.0 uses cookies to remember your settings and preferences and to auto-fill the - fields to make your interactions with the site easier.

    -

    These cookies can not be used to personally identify you.

    - -

    Security

    -
      -
    1. Entgra IoT Server 4.1.0 uses selected cookies to identify and prevent security risks. For - example, - Entgra IoT Server 4.1.0 may use cookies to store your session information to prevent others from - changing your password without your username and password. -
    2. -
    3. Entgra IoT Server 4.1.0 uses session cookie to maintain your active session.
    4. -
    5. Entgra IoT Server 4.1.0 may use a temporary cookie when performing multi-factor authentication - and - federated authentication. -
    6. -
    7. Entgra IoT Server 4.1.0 may use permanent cookies to detect the devices you have logged in - previously. This is to to calculate the risk level associated with your current login - attempt. Using these cookies protects you and your account from possible attacks. -
    8. -
    -

    Performance

    -

    Entgra IoT Server 4.1.0 may use cookies to allow Remember Me functionalities.

    -

    Analytics

    -

    Entgra IoT Server 4.1.0 as a product does not use cookies for analytical purposes.

    -

    Third party cookies

    -

    Using Entgra IoT Server 4.1.0 may cause third-party cookie to be set in your browser. Entgra IoT - Server - 4.1.0 has no control over how any of them operate. The third-party cookies that maybe set - include:

    -
      -
    1. Any social login sites. For example, third-party cookies may be set when Entgra IoT Server 4.1.0 - is configured to use “social” or “federated” login, and you opt to login with your “Social - Account”. -
    2. -
    3. Any third party federated login.
    4. -
    -

    Entgra strongly advises you to refer the respective cookie policies of such sites carefully as Entgra has - no knowledge or use on these cookies.

    -

    What type of cookies does Entgra IoT Server 4.1.0 use?

    -

    Entgra IoT Server 4.1.0 uses persistent cookies and session cookies. A persistent cookie helps - Entgra IS - 3.8.0 to recognize you as an existing user so that it is easier to return to Entgra or interact with - Entgra IS 3.8.0 without signing in again. After you sign in, a persistent cookie stays in your browser - and will be read by Entgra IoT Server 4.1.0 when you return to Entgra IoT Server 4.1.0.

    -

    A session cookie is a cookie that is erased when the user closes the Web browser. The session cookie - is stored in temporarily and is not retained after the browser is closed. Session cookies do not - collect information from the user’s computer.

    -

    How do I control my cookies?

    -

    Most browsers allow you to control cookies through settings. However, if you limit the given ability - for websites to set cookies, you may worsen your overall user experience since it will no longer be - personalized to you. It may also stop you from saving customized settings like login information. - Most likely, disabling cookies will make it unable for you to use authentication and authorization - functionalities offered by Entgra IoT Server 4.1.0.

    -

    If you have any questions or concerns regarding the use of cookies, please contact the entity or - individuals (or their data protection officer, if applicable) running this Entgra IoT Server 4.1.0 - instance.

    -

    What are the cookies used?

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Cookie NamePurposeRetention
    JSESSIONIDTo keep your session data in order to give you a good user experience.Session
    commonAuthIdUsed to authenticate the the logged in session.Session
    samlssoTokenIdUsed to map the logged in user with the SAML token.Request
    requestedURIThe URI you are accessing.Session
    -

    Disclaimer

    -

    This cookie policy is only for illustrative purposes of the product Entgra IoT Server 4.1.0. The - content in the policy is technically correct at the time of the product shipment. The - entity,organization or individual that runs this Entgra IoT Server 4.1.0 instance has full authority - and responsibility with regard to the effective Cookie Policy. Entgra, its employees, partners, and - affiliates do not have access to and do not require, store, process or control any of the data, - including personal data contained in Entgra IoT Server 4.1.0. All data, including personal data is - controlled and processed by the entity, organization or individual running Entgra IoT Server 4.1.0. - Entgra, its employees partners and affiliates are not a data processor or a data controller within the - meaning of any data privacy regulations. Entgra does not provide any warranties or undertake any - responsibility or liability in connection with the lawfulness or the manner and purposes for which - Entgra IoT Server 4.1.0 is used by such entities, organizations or persons.

    -
    -
    -
    -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.cookie-policy/cookie-policy.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.cookie-policy/cookie-policy.json deleted file mode 100644 index b531aa0319..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.cookie-policy/cookie-policy.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0.0", - "layout": "uuf.layout.sign-in", - "uri": "/cookie-policy", - "isAnonymous": true -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.hbs deleted file mode 100644 index 689312a441..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.hbs +++ /dev/null @@ -1,234 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Home"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -{{/zone}} - -{{#zone "content"}} -
    - {{#if permissions.VIEW_DASHBOARD}} -
    -
    -
    Devices
    -
    -
    -
    - {{deviceCount}} - - - {{#if deviceCount}} - - - - - - View - - {{/if}} - - - - - - - Add - - -
    -
    -
    -
    -
    -
    -
    Groups
    -
    -
    -
    - {{groupCount}} - - {{#if groupCount}} - - - - - - - View - - {{/if}} - - - - - - - - Add - - - -
    -
    -
    -
    -
    -
    -
    Users
    -
    -
    -
    - {{userCount}} - - {{#if userCount}} - - - - - - - View - - {{/if}} - - {{#unless isCloud}} - - - - - - Add - - {{/unless}} - -
    -
    -
    -
    -
    -
    -
    Policies
    -
    -
    -
    - {{policyCount}} - - {{#if policyCount}} - - - - - - - View - - {{/if}} - - - - - - - - Add - - - -
    -
    -
    -
    -
    -
    -
    Roles
    -
    -
    -
    - {{roleCount}} - - {{#if roleCount}} - - - - - - - View - - {{/if}} - - {{#unless isCloud}} - - - - - - Add - - {{/unless}} - -
    -
    -
    -
    - {{#if permissions.IS_ADMIN}} -
    -
    -
    Device Types
    -
    -
    -
    - {{deviceTypeCount}} - - - {{#if deviceTypeCount}} - - - - - - View - - {{/if}} - - - - - - - Add - - -
    -
    -
    -
    - {{/if}} - - {{else}} -

    - Permitted None -

    - {{/if}} -
    -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.js deleted file mode 100644 index d61bb67833..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var constants = require("/app/modules/constants.js"); - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; - var groupModule = require("/app/modules/business-controllers/group.js")["groupModule"]; - var policyModule = require("/app/modules/business-controllers/policy.js")["policyModule"]; - - if(!session.get(constants["TOKEN_PAIR"])){ - response.sendRedirect(context.app.context + "/welcome"); - return; - } - - var user = session.get(constants["USER_SESSION_KEY"]); - var permissions = userModule.getUIPermissions(); - - if (!permissions.VIEW_DASHBOARD) { - response.sendRedirect(devicemgtProps["appContext"] + "devices"); - return; - } - - var viewModel = {}; - viewModel.permissions = permissions; - viewModel.enrollmentURL = devicemgtProps.enrollmentURL; - viewModel.deviceCount = deviceModule.getDevicesCount(); - viewModel.groupCount = groupModule.getGroupCount(); - viewModel.userCount = userModule.getUsersCount(); - viewModel.policyCount = policyModule.getPoliciesCount(); - viewModel.deviceTypeCount = deviceModule.getDeviceTypeCount(); - viewModel.isCloud = devicemgtProps.isCloud; - if (devicemgtProps.isCloud) { - viewModel.roleCount = userModule.getFilteredRoles("devicemgt").content.count; - } else { - viewModel.roleCount = userModule.getRolesCount(); - } - return viewModel; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.json deleted file mode 100644 index 9674ea3a9b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.dashboard/dashboard.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.hbs deleted file mode 100644 index f2120857e0..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.hbs +++ /dev/null @@ -1,67 +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. -}} -{{#zone "topCss"}} - {{css "css/analytics.css"}} -{{/zone}} - -{{unit "cdmf.unit.ui.title" pageTitle="Analytics"}} -{{unit "cdmf.unit.ui.content.title" pageHeader=title}} -{{unit "cdmf.unit.lib.service-invoker-utility"}} -{{unit "cdmf.unit.lib.handlebars"}} -{{unit "cdmf.unit.lib.rickshaw-graph"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Devices - -
  • -
  • - - {{deviceName}} - -
  • -
  • - - Analytics - -
  • -{{/zone}} - -{{#zone "content"}} -
    -
    -
    -
    -

    {{deviceName}} Analytics

    -
    - {{unit "cdmf.unit.analytics.date-range-picker"}} -
    -
    -
    -
    - {{unit deviceAnalyticsViewUnitName}} -
    -
    -
    -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.js deleted file mode 100644 index ca0ba7c9d9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var utility = require("/app/modules/utility.js").utility; - var deviceType = context.uriParams.deviceType; - var deviceName = request.getParameter("deviceName"); - var deviceId = request.getParameter("deviceId"); - var unitName = utility.getTenantedDeviceUnitName(deviceType, "analytics-view"); - if (!unitName) { - unitName = "cdmf.unit.default.device.type.analytics-view"; - } - return { - "deviceAnalyticsViewUnitName": unitName, - "deviceType": deviceType, - "deviceName": deviceName, - "deviceId": deviceId - }; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.json deleted file mode 100644 index 846ee092b8..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.analytics/analytics.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device/{deviceType}/analytics", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.hbs deleted file mode 100644 index cab8dffe4a..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.hbs +++ /dev/null @@ -1,66 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Device Types"}} -{{unit "cdmf.unit.ui.content.title" pageHeader="Device List"}} - -{{unit "cdmf.unit.lib.data-table"}} -{{unit "cdmf.unit.lib.handlebars"}} -{{unit "cdmf.unit.lib.service-invoker-utility"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Devices - -
  • -
  • - - Enroll Device - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#if isCloud}} -
  • - - - - - - Request new device type - -
  • - {{/if}} -{{/zone}} - -{{#zone "content"}} -
    -
    -
    -
    - {{unit "cdmf.unit.device.types.listing"}} -
    -
    -
    -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.js deleted file mode 100644 index 3c5739ea60..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Returns the dynamic state to be populated by device-enrollment page. - * - * @param context Object that gets updated with the dynamic state of this page to be presented - * @returns {*} A context object that returns the dynamic state of this page to be presented - */ -function onRequest(context) { - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var page = {}; - page["isCloud"] = devicemgtProps.isCloud; - page["contact_form_url"] = "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/contact-us.jag?cloud-type=device_cloud&subject=Requesting for a new device type"; - return page; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.json deleted file mode 100644 index 3155ee3cec..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.enroll/enroll.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device/enroll", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/public/js/bottomJs.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/public/js/bottomJs.js deleted file mode 100644 index 7858a3678b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/public/js/bottomJs.js +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 removeCustomParam = function () { - $(this).parent().parent().remove(); -}; - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption() { - $(location).attr('href', $(this).data("url")); -} - -$("#back-to-search").click(function () { - $('#advance-search-result').addClass('hidden'); - $("#advance-search-form").removeClass('hidden'); - $("#view-search-param").addClass('hidden'); - $("#back-to-search").addClass('hidden'); -}); - -$("#view-search-param").click(function () { - $("#advance-search-form").removeClass('hidden'); - $(".title-result").addClass('hidden'); - $("#view-search-param").addClass('hidden'); -}); - -var dynamicForm = '
    ' - + '
    ' - + '
    ' - + '
    ' - + '
    '; - -var nonNumericKeyValuePair = ["deviceModel", "vendor", "osVersion", "connectionType", "ssid", "pluggedIn"]; - -$(document).ready(function () { - var isInit = true; - $("#add-custom-param").click(function () { - $("#customSearchParam").prepend(dynamicForm); - $(".close-button-div").unbind("click"); - $(".close-button-div").bind("click", removeCustomParam); - $(".no-tag").select2({tags: false}); - $(".txt-key").select2({tags: true}).on('change', function() { - // Based on the selected key, relevant operations are changed - var operationsForSelectedKey = getOperators($(this).val()); - $("#operators").empty(); - $("#operators").append(operationsForSelectedKey); - $("#operators").select2("val", "="); - }); - }); - - /** Function to get operators based on the key Value - * - * @param keyValue - */ - function getOperators(keyValue) { - if (nonNumericKeyValuePair.indexOf(keyValue) < 0) { - return ''; - } else { - return ''; - } - } - - /** To validate the key and value before sending that to back-end - * - * @param key Key of the search - * @param value value given for the search - */ - function isValidKeyAndValue(key, value) { - if (nonNumericKeyValuePair.indexOf(key) < 0) { - if (!isNaN(parseFloat(value)) && isFinite(value)){ - return true; - } - } else { - return true; - } - } - - $("#device-search-btn").click(function () { - var location = $("#location").val(); - var payload_obj = {}; - var conditions = []; - var hasError = false; - if (location) { - var conditionObject = {}; - conditionObject.key = "LOCATION"; - conditionObject.value = location; - conditionObject.operator = "="; - conditionObject.state = "OR"; - conditions.push(conditionObject) - } - - $("#customSearchParam .dynamic-search-param").each(function () { - var value = $(this).find(".txt-value").val(); - var key = $(this).find(".txt-key").val(); - if (!hasError && value && key ) { - if (isValidKeyAndValue(key, value)) { - var conditionObject = {}; - conditionObject.key = key; - conditionObject.value = value; - conditionObject.operator = $(this).find(".operator").val(); - conditionObject.state = $(this).find(".state").val(); - conditions.push(conditionObject); - } else { - hasError = true; - $("#advance-search-result").addClass("hidden"); - $("#advance-search-form").removeClass(" hidden"); - $('#device-listing-status').removeClass('hidden'); - $('#device-listing-status-msg').text('Error in user input values. ' + key + " requires a" + - " numerical value as the search value"); - } - } - }); - - // Sent the search conditions to back-end only, if all the values compliant with there key values - if (hasError) { - hasError = false; - } else { - payload_obj.conditions = conditions; - var deviceSearchAPI = "/api/device-mgt/v1.0/devices/search-devices"; - $("#advance-search-form").addClass(" hidden"); - $("#loading-content").removeClass('hidden'); - var deviceListing = $("#device-listing"); - var deviceListingSrc = deviceListing.attr("src"); - $.template("device-listing", deviceListingSrc, function (template) { - var successCallback = function (data) { - if (!data) { - $("#loading-content").addClass('hidden'); - $("#advance-search-result").addClass("hidden"); - $("#advance-search-form").removeClass(" hidden"); - $('#device-listing-status').removeClass('hidden'); - $('#device-listing-status-msg').text('No Device are available to be displayed.'); - return; - } - data = JSON.parse(data); - if (data.devices.length == 0) { - $("#loading-content").addClass('hidden'); - $("#advance-search-result").addClass("hidden"); - $("#advance-search-form").removeClass(" hidden"); - $('#device-listing-status').removeClass('hidden'); - $('#device-listing-status-msg').text('No Device are available to be displayed.'); - return; - } - var viewModel = {}; - var devices = []; - if (data.devices.length > 0) { - for (i = 0; i < data.devices.length; i++) { - var tempDevice = data.devices[i]; - var device = {}; - device.type = tempDevice.type; - device.name = tempDevice.name; - device.deviceIdentifier = tempDevice.deviceIdentifier; - var properties = {}; - var enrolmentInfo = {}; - properties.VENDOR = tempDevice.deviceInfo.vendor; - properties.DEVICE_MODEL = tempDevice.deviceInfo.deviceModel; - device.enrolmentInfo = tempDevice.enrolmentInfo; - device.properties = properties; - devices.push(device); - } - viewModel.devices = devices; - $('#advance-search-result').removeClass('hidden'); - $("#view-search-param").removeClass('hidden'); - $("#back-to-search").removeClass('hidden'); - $('#device-grid').removeClass('hidden'); - $('#ast-container').removeClass('hidden'); - $('#user-listing-status-msg').text(""); - var content = template(viewModel); - $("#ast-container").html(content); - } else { - $('#device-listing-status').removeClass('hidden'); - $('#device-listing-status-msg').text('No Device are available to be displayed.'); - } - $("#loading-content").addClass('hidden'); - if (isInit) { - $('#device-grid').datatables_extended(); - isInit = false; - } - $(".icon .text").res_text(0.2); - }; - invokerUtil.post(deviceSearchAPI, - payload_obj, - successCallback, - function (message) { - $("#loading-content").addClass('hidden'); - $("#advance-search-result").addClass("hidden"); - $("#advance-search-form").removeClass(" hidden"); - $('#device-listing-status').removeClass('hidden'); - $('#device-listing-status-msg').text('Server is unable to perform the search please enroll at least one device or check the search query'); - } - ); - }); - } - }); -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/public/templates/device-listing.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/public/templates/device-listing.hbs deleted file mode 100644 index 53cb478806..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/public/templates/device-listing.hbs +++ /dev/null @@ -1,44 +0,0 @@ - - - {{#each devices}} - - - -
    - -
    - - -

    Device {{name}}

    - {{#if properties.DEVICE_MODEL}} -
    ({{properties.VENDOR}} - {{properties.DEVICE_MODEL}})
    - {{/if}} - - {{enrolmentInfo.owner}} - - {{#equal enrolmentInfo.status "ACTIVE"}} Active{{/equal}} - {{#equal enrolmentInfo.status "INACTIVE"}} Inactive{{/equal}} - {{#equal enrolmentInfo.status "BLOCKED"}} Blocked{{/equal}} - {{#equal enrolmentInfo.status "REMOVED"}} Removed{{/equal}} - - {{type}} - {{enrolmentInfo.ownership}} - - - - - {{/each}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/search.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/search.hbs deleted file mode 100644 index 5fe3223246..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/search.hbs +++ /dev/null @@ -1,164 +0,0 @@ - -{{unit "cdmf.unit.ui.title" pageTitle="Advanced Search"}} -{{unit "cdmf.unit.ui.modal"}} -{{unit "cdmf.unit.data-tables-extended"}} -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Devices - -
  • -
  • - - - Search - -
  • -{{/zone}} - - -{{#zone "content"}} - -
    -
    - -
    -
    - - -
    -
    -
    -
    -

    Advanced Device Search

    -
    - -
    -
    - - - -
    -
    -
    - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    - -
    - - - - - - - -
    -
    - - -{{/zone}} -{{#zone "bottomJs"}} - {{js "/js/bottomJs.js"}} - -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/search.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/search.json deleted file mode 100644 index c202f579cf..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/search.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/devices/search", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.hbs deleted file mode 100644 index 70c449653c..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.hbs +++ /dev/null @@ -1,58 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Device"}} -{{! unit "cdmf.unit.ui.content.title" pageHeader="Device Download"}} - -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.lib.handlebars"}} -{{unit "cdmf.unit.lib.service-invoker-utility"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Devices - -
  • -
  • - - Enroll Device - -
  • -
  • - - {{label}} - -
  • -{{/zone}} - -{{#zone "content"}} -
    -
    -
    -
    - {{! dynamically resolves device type-view unit according to deviceType URI param }} - {{unit deviceTypeViewUnitName}} -
    -
    -
    -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.js deleted file mode 100644 index 981126bbb3..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - /** - * {{#itr context}}key : {{key}} value : {{value}}{{/itr}} - */ - context.handlebars.registerHelper("itr", function (obj, options) { - var key, buffer = ''; - for (key in obj) { - if (obj.hasOwnProperty(key)) { - buffer += options.fn({key: key, value: obj[key]}); - } - } - return buffer; - }); - - var utility = require("/app/modules/utility.js").utility; - var deviceType = context.uriParams.deviceType; - var configs = utility.getDeviceTypeConfig(deviceType); - var label = deviceType; - if (configs) { - label = configs["deviceType"]["label"]; - } - var unitName = utility.getTenantedDeviceUnitName(deviceType, "type-view"); - if (!unitName) { - unitName = "cdmf.unit.default.device.type.type-view"; - } - return { - "deviceTypeViewUnitName": unitName, - "deviceType": deviceType, - "label" : label - }; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.json deleted file mode 100644 index dd1754fc08..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.type.view/view.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device/{deviceType}/enroll", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.hbs deleted file mode 100644 index 1a58360409..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.hbs +++ /dev/null @@ -1,46 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Device Details"}} -{{unit "cdmf.unit.lib.service-invoker-utility"}} -{{unit "cdmf.unit.lib.handlebars"}} - - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Devices - -
  • -
  • - - Device Details - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit deviceViewUnitName}} - {{unit "cdmf.unit.lib.data-table"}} - {{unit "cdmf.unit.device.operation-mod"}} - {{unit "cdmf.unit.device.view"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.js deleted file mode 100644 index 13f1c108ec..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context){ - var utility = require("/app/modules/utility.js").utility; - context.handlebars.registerHelper('equal', function (lvalue, rvalue, options) { - if (arguments.length < 3) - throw new Error("Handlebars Helper equal needs 2 parameters"); - if( lvalue!=rvalue ) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - var deviceType = context.uriParams.deviceType; - var unitName = utility.getTenantedDeviceUnitName(deviceType, "device-view"); - if (!unitName) { - unitName = "cdmf.unit.default.device.type.device-view"; - } - return {"deviceViewUnitName": unitName}; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.json deleted file mode 100644 index 614f89ba43..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.view/view.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device/{deviceType}", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicelocations/devicelocations.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicelocations/devicelocations.hbs deleted file mode 100644 index 0dd4d4016e..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicelocations/devicelocations.hbs +++ /dev/null @@ -1,35 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Device Location"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Device Locations - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.geo-devices"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicelocations/devicelocations.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicelocations/devicelocations.json deleted file mode 100644 index 5021ee3906..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicelocations/devicelocations.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device-locations", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.hbs deleted file mode 100644 index 3a12ea975e..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.hbs +++ /dev/null @@ -1,760 +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. -}} - -{{! - Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - - Entgra (Pvt) Ltd. 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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Device Management"}} - -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.lib.ui-permissions-utility"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • - {{#if group}} -
  • - - Groups - -
  • -
  • - - {{group.name}} - -
  • - {{else}} -
  • - - Devices - -
  • - {{/if}} -{{/zone}} - -{{#zone "navbarActions"}} - {{#if group}} -
  • - - - - - - Assign from My Devices - -
  • - - {{else}} - {{#if permissions.enroll}} -
  • - - - - - - Enroll Device - -
  • - {{/if}} - {{/if}} -{{/zone}} - -{{#zone "content"}} - {{#if group}} -

    - {{group.name}} group -

    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - Overview -
    - - - - - - - - - - - - - - - - - - - -
    Owner{{group.owner}}
    Shared with roles - {{#each roles}} - {{this}}
    - {{/each}} -
    Device Count{{deviceCount}}
    Description{{group.description}}
    -
    -
    -
    -
    -
    -

    - Devices in {{group.name}} group -

    - {{/if}} -
    -
    -
    -
    - - {{unit "cdmf.unit.device.operation-mod"}} - {{#if deviceCount}} -
    - - Loading devices . . . -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    - - {{else}} -
    - -
    - {{/if}} - -
    - - - -
    - -
    - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - -
    - -
    -
    -
    -{{/zone}} - -{{#zone "bottomJs"}} - - {{js "js/listing.js"}} -{{/zone}} - -{{#zone "topCss"}} - -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.js deleted file mode 100644 index 7fb6f87b20..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.js +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var constants = require("/app/modules/constants.js"); - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; - var groupModule = require("/app/modules/business-controllers/group.js")["groupModule"]; - - var groupId = request.getParameter("groupId"); - - var viewModel = {}; - var title = "Devices"; - if (groupId) { - var group = groupModule.getGroup(groupId); - if (group) { - title = group.name + " " + title; - viewModel.roles = groupModule.getRolesOfGroup(groupId); - viewModel.group = group; - } - } - viewModel.title = title; - var currentUser = session.get(constants.USER_SESSION_KEY); - if (currentUser) { - viewModel.permissions = {}; - var uiPermissions = userModule.getUIPermissions(); - viewModel.permissions.list = stringify(uiPermissions); - if (uiPermissions.ADD_DEVICE) { - viewModel.permissions.enroll = true; - } - if (uiPermissions.UPDATE_ENROLLMENT) { - viewModel.permissions.updateEnrollment = true; - } - if (uiPermissions.PERMANENT_DELETE) { - viewModel.permissions.permanentDelete = true; - } - viewModel.currentUser = currentUser; - var deviceCount = 0; - if (groupId) { - deviceCount = groupModule.getGroupDeviceCount(groupId); - } else { - deviceCount = deviceModule.getDevicesCount(); - } - if (deviceCount > 0) { - viewModel.deviceCount = deviceCount; - var utility = require("/app/modules/utility.js").utility; - var typesListResponse = deviceModule.getDeviceTypes(); - var deviceTypes = []; - if (typesListResponse["status"] == "success") { - var data = typesListResponse.content; - if (data) { - for (var i = 0; i < data.length; i++) { - var config = utility.getDeviceTypeConfig(data[i].name); - var category = "iot"; - var label = data[i].name; - var analyticsEnabled = "false"; - var groupingEnabled = "true"; - var analyticsView = null; - if (config) { - var deviceType = config.deviceType; - category = deviceType.category; - label = deviceType.label; - analyticsEnabled = deviceType.analyticsEnabled; - groupingEnabled = deviceType.groupingEnabled; - analyticsView = deviceType.analyticsView; - } - - deviceTypes.push({ - "type": data[i].name, - "category": category, - "label": label, - "thumb": utility.getDeviceThumb(data[i].name), - "analyticsEnabled": analyticsEnabled, - "groupingEnabled": groupingEnabled, - "analyticsView" : analyticsView - }); - } - } - } - viewModel.deviceTypes = stringify(deviceTypes); - } - } - - var mdmProps = require("/app/modules/conf-reader/main.js")["conf"]; - var serverUrl = mdmProps["httpsURL"]; - var portalUrl = mdmProps["portalURL"]; - var backendRestEndpoints = mdmProps["backendRestEndpoints"]; - var userDomain = context.user.domain; - viewModel.serverUrl = serverUrl; - viewModel.portalUrl = portalUrl; - viewModel.userDomain = userDomain; - viewModel.apiContext = backendRestEndpoints["deviceMgt"]; - return viewModel; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.json deleted file mode 100644 index cba60e495a..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/devices", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/public/js/listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/public/js/listing.js deleted file mode 100644 index eab877ed83..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/public/js/listing.js +++ /dev/null @@ -1,1310 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption(url) { - if ($(".select-enable-btn").text() == "Select" && !$(this).hasClass("btn")) { - url = $(this).parent().data("url"); - $(location).attr('href', url); - } -} - -(function () { - var cache = {}; - var validateAndReturn = function (value) { - return (value == undefined || value == null) ? "Unspecified" : value; - }; - Handlebars.registerHelper("deviceMap", function (device) { - device.owner = validateAndReturn(device.owner); - device.ownership = validateAndReturn(device.ownership); - var arr = device.properties; - if (arr) { - device.properties = arr.reduce(function (total, current) { - total[current.name] = validateAndReturn(current.value); - return total; - }, {}); - } - }); -})(); - -/* - * Setting-up global variables. - */ -var deviceCheckbox = "#ast-container .ctrl-wr-asset .itm-select input[type='checkbox']"; -var assetContainer = "#ast-container"; - -var deviceListing, currentUser, groupId, hasDeletePermission; - -/* - * DOM ready functions. - */ -$(document).ready(function () { - - var permissionSet = {}; - $.setPermission = function (permission) { - permissionSet[permission] = true; - }; - - $.hasPermission = function (permission) { - return permissionSet[permission]; - }; - - deviceListing = $("#device-listing"); - hasDeletePermission = $("#permission").data("permission")['PERMANENT_DELETE']; - currentUser = deviceListing.data("current-user"); - groupId = getParameterByName("groupId"); - - /* Adding selected class for selected devices */ - $(deviceCheckbox).each(function () { - addDeviceSelectedClass(this); - }); - - /* for device list sorting drop down */ - $(".ctrl-filter-type-switcher").popover({ - html: true, - content: function () { - return $("#content-filter-types").html(); - } - }); -}); - -/* - * On Select All Device button click function. - * - * @param button: Select All Device button - */ -function selectAllDevices(button) { - if (!$(button).data('select')) { - $(deviceCheckbox).each(function (index) { - $(this).prop('checked', true); - addDeviceSelectedClass(this); - }); - $(button).data('select', true); - $(button).html('Deselect All Devices'); - } else { - $(deviceCheckbox).each(function (index) { - $(this).prop('checked', false); - addDeviceSelectedClass(this); - }); - $(button).data('select', false); - $(button).html('Select All Devices'); - } -} - -/* - * On listing layout toggle buttons click function. - * - * @param view: Selected view type - * @param selection: Selection button - */ -function changeDeviceView(view, selection) { - $(".view-toggle").each(function () { - $(this).removeClass("selected"); - }); - $(selection).addClass("selected"); - if (view == "list") { - $(assetContainer).addClass("list-view"); - } else { - $(assetContainer).removeClass("list-view"); - } -} - -/* - * Add selected style class to the parent element function. - * - * @param checkbox: Selected checkbox - */ -function addDeviceSelectedClass(checkbox) { - if ($(checkbox).is(":checked")) { - $(checkbox).closest(".ctrl-wr-asset").addClass("selected device-select"); - } else { - $(checkbox).closest(".ctrl-wr-asset").removeClass("selected device-select"); - } -} - -function toTitleCase(str) { - return str.replace(/\w\S*/g, function (txt) { - return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); - }); -} - -function loadDevices(searchType, searchParam) { - var serviceURL; - if (groupId && $.hasPermission("LIST_OWN_DEVICES")) { - serviceURL = "/api/device-mgt/v1.0/groups/id/" + groupId + "/devices"; - } else if ($.hasPermission("LIST_DEVICES")) { - serviceURL = "/api/device-mgt/v1.0/devices"; - } else if (permissionsUtil.hasPermission("LIST_OWN_DEVICES")) { - //Get authenticated users devices - serviceURL = "/api/device-mgt/v1.0/devices?user=" + currentUser; - } else { - $("#loading-content").remove(); - $('#device-table').addClass('hidden'); - $('#device-listing-status-msg').text('Permission denied.'); - $("#device-listing-status").removeClass(' hidden'); - return; - } - - function getPropertyValue(deviceProperties, propertyName) { - if (!deviceProperties) { - return; - } - var property; - for (var i = 0; i < deviceProperties.length; i++) { - property = deviceProperties[i]; - if (property.name == propertyName) { - return property.value; - } - } - return {}; - } - - function getDeviceTypeLabel(type) { - var deviceTypes = deviceListing.data("deviceTypes"); - for (var i = 0; i < deviceTypes.length; i++) { - if (deviceTypes[i].type == type) { - return deviceTypes[i].label; - } - } - return type; - } - - function getDeviceTypeCategory(type) { - var deviceTypes = deviceListing.data("deviceTypes"); - for (var i = 0; i < deviceTypes.length; i++) { - if (deviceTypes[i].type == type) { - return deviceTypes[i].category; - } - } - return type; - } - - function getDeviceTypeThumb(type) { - var deviceTypes = deviceListing.data("deviceTypes"); - for (var i = 0; i < deviceTypes.length; i++) { - if (deviceTypes[i].type == type) { - return deviceTypes[i].thumb; - } - } - return type; - } - - function analyticsEnabled(type) { - var deviceTypes = deviceListing.data("deviceTypes"); - for (var i = 0; i < deviceTypes.length; i++) { - if (deviceTypes[i].type == type) { - var analyticsEnabled = deviceTypes[i].analyticsEnabled; - if (analyticsEnabled == undefined) { - // By default it should be enabled - return true; - } - // In JS Boolean("false") returns TRUE => http://stackoverflow.com/a/264037/1560536 - return (analyticsEnabled == "true"); - } - } - return true; - } - - // Read "analyticsView" from config.json and return value if exists - function getAnalyticsView(type) { - var deviceTypes = deviceListing.data("deviceTypes"); - for (var i = 0; i < deviceTypes.length; i++) { - if (deviceTypes[i].type == type) { - var analyticsView = deviceTypes[i].analyticsView; - if (analyticsEnabled == undefined) { - // if undefined go to default analytics view - return "none"; - } - return analyticsView; - } - } - return "none"; - } - - function groupingEnabled(type) { - var deviceTypes = deviceListing.data("deviceTypes"); - for (var i = 0; i < deviceTypes.length; i++) { - if (deviceTypes[i].type == type) { - var groupingEnabled = deviceTypes[i].groupingEnabled; - if (groupingEnabled == undefined) { - // By default it should be enabled - return true; - } - // In JS Boolean("false") returns TRUE => http://stackoverflow.com/a/264037/1560536 - return (groupingEnabled == "true"); - } - } - return true; - } - - var columns = [ - { - targets: 0, - data: 'namePattern', - class: 'remove-padding icon-only content-fill viewEnabledIcon', - render: function (data, type, row, meta) { - return '
    '; - } - }, - { - targets: 1, - data: 'name', - class: 'viewEnabledIcon', - render: function (name, type, row, meta) { - var model = getPropertyValue(row.properties, 'DEVICE_MODEL'); - var vendor = getPropertyValue(row.properties, 'VENDOR'); - var html = '

    ' + name + '

    '; - if (model) { - html += '
    (' + vendor + '-' + model + ')
    '; - } - return html; - } - }, - { - targets: 2, - data: 'userPattern', - class: 'remove-padding-top viewEnabledIcon' - }, - { - targets: 3, - data: 'status', - class: 'remove-padding-top viewEnabledIcon', - render: function (status, type, row, meta) { - var html; - switch (status) { - case 'ACTIVE' : - html = ' Active'; - break; - case 'INACTIVE' : - html = ' Inactive'; - break; - case 'BLOCKED' : - html = ' Blocked'; - break; - case 'REMOVED' : - html = ' Removed'; - break; - case 'UNREACHABLE' : - html = ' Unreachable'; - break; - case 'CREATED' : - html = ' Created'; - break; - } - return html; - } - }, - { - targets: 4, - data: 'type', - class: 'remove-padding-top viewEnabledIcon', - render: function (status, type, row, meta) { - return getDeviceTypeLabel(row.deviceType); - } - }, - { - targets: 5, - data: 'ownership', - class: 'remove-padding-top viewEnabledIcon', - render: function (status, type, row, meta) { - if (getDeviceTypeCategory(row.deviceType) === 'mobile' - || getDeviceTypeCategory(row.deviceType) === 'hybrid') { - return row.ownership; - } else { - return null; - } - } - }, - { - targets: 6, - data: 'action-buttons', - class: 'text-right content-fill text-left-on-grid-view no-wrap tooltip-overflow-fix', - render: function (status, type, row, meta) { - var deviceType = row.deviceType; - var deviceIdentifier = row.deviceIdentifier; - var html = ''; - var portalUrl = $("#device-listing").data("portal-url"); - var serverUrl = $("#device-listing").data("server-url"); - var userDomain = $("#device-listing").data("userDomain"); - var statusCode = row.status; - var statURL; - if (statusCode != 'REMOVED') { - html = ''; - - if (analyticsEnabled(row.deviceType)) { - // redirecting to respective analytics view depending on device configs - switch (getAnalyticsView(deviceType)) { - case "DAS" : { statURL =portalUrl + "/portal/t/"+ userDomain+ "/dashboards/android-iot/battery?owner=" +currentUser+"&deviceId=";break;} - default : {statURL=context+ "/device/" + row.deviceType +"/analytics?deviceId="} - } - - html += '' + - '' + - ''; - } - - if (!groupId && groupingEnabled(row.deviceType)) { - html += - '' + - '' + - ''; - } - - html += - '' - + '' - + '' - + ''; - var groupOwner = $('#group_owner').text(); - if (groupId && groupOwner != "wso2.system.user") { - html += - '' - + '' - + '' - + ''; - } else { - html += - '' - + '' - + '' - + ''; - } - } else if (statusCode == 'REMOVED' && hasDeletePermission) { - html = ''; - - if (analyticsEnabled(row.deviceType)) { - // redirecting to respective analytics view depending on device configs - switch (getAnalyticsView(deviceType)) { - case "DAS" : { - statURL = portalUrl + "/portal/t/" + userDomain + "/dashboards/android-iot/battery?owner=" + currentUser + "&deviceId="; - break; - } - default : { - statURL = context + "/device/" + row.deviceType + "/analytics?deviceId=" - } - } - - html += '' + - '' + - ''; - } - - if (!groupId && groupingEnabled(row.deviceType)) { - html += - '' + - '' + - ''; - } - - html += - '' - + '' - + '' - + ''; - var groupOwner = $('#group_owner').text(); - if (groupId && groupOwner != "wso2.system.user") { - html += - '' - + '' - + '' - + ''; - } else { - html += - '' - + '' - + '' - + ''; - } - } else { - html = ''; - - if (analyticsEnabled(row.deviceType)) { - // redirecting to respective analytics view depending on device configs - switch (getAnalyticsView(deviceType)) { - case "DAS" : { - statURL = portalUrl + "/portal/t/" + userDomain + "/dashboards/android-iot/battery?owner=" + currentUser + "&deviceId="; - break; - } - default : { - statURL = context + "/device/" + row.deviceType + "/analytics?deviceId=" - } - } - - html += '' + - '' + - ''; - } - - if (!groupId && groupingEnabled(row.deviceType)) { - html += - '' + - '' + - ''; - } - - html += - '' - + '' - + '' - + ''; - } - return html; - } - } - ]; - - var fnCreatedRow = function (row, data, dataIndex) { - if (data.status != "REMOVED") { - $(row).attr('data-type', 'selectable'); - } else { - $(row).attr('data-type', 'non-selectable'); - } - var model = htmlspecialchars(getPropertyValue(data.properties, 'DEVICE_MODEL')); - var vendor = htmlspecialchars(getPropertyValue(data.properties, 'VENDOR')); - var owner = htmlspecialchars(data.userPattern); - var status = htmlspecialchars(data.status); - var ownership = htmlspecialchars(data.ownership); - var deviceType = htmlspecialchars(data.deviceType); - var category = getDeviceTypeCategory(deviceType); - $(row).attr('data-deviceid', htmlspecialchars(data.deviceIdentifier)); - $(row).attr('data-devicetype', deviceType); - $(row).attr('data-url', context + '/device/' + htmlspecialchars(data.deviceType) + '?id=' - + htmlspecialchars(data.deviceIdentifier) + '&owner=' + owner + '&ownership=' + ownership) ; - $.each($('td', row), function (colIndex) { - switch (colIndex) { - case 1: - $(this).attr('data-search', model + ',' + vendor); - $(this).attr('data-display', model); - break; - case 2: - $(this).attr('data-grid-label', "Owner"); - $(this).attr('data-search', owner); - $(this).attr('data-display', owner); - break; - case 3: - $(this).attr('data-grid-label', "Status"); - $(this).attr('data-search', status); - $(this).attr('data-display', status); - break; - case 4: - $(this).attr('data-grid-label', "Type"); - $(this).attr('data-search', deviceType); - $(this).attr('data-display', getDeviceTypeLabel(deviceType)); - break; - case 5: - if (category === 'mobile' || category === 'hybrid') { - $(this).attr('data-grid-label', "Ownership"); - $(this).attr('data-search', ownership); - $(this).attr('data-display', ownership); - } - break; - } - }); - }; - - function htmlspecialchars(text) { - return jQuery('
    ').text(text).html(); - } - - var dataFilter = function (data) { - data = JSON.parse(data); - var objects = []; - - $(data.devices).each(function (index) { - objects.push( - { - model: getPropertyValue(data.devices[index].properties, "DEVICE_MODEL"), - vendor: getPropertyValue(data.devices[index].properties, "VENDOR"), - userPattern: data.devices[index].enrolmentInfo.owner, - status: data.devices[index].enrolmentInfo.status, - ownership: data.devices[index].enrolmentInfo.ownership, - deviceType: data.devices[index].type, - deviceIdentifier: data.devices[index].deviceIdentifier, - name: data.devices[index].name, - namePattern: data.devices[index].name - } - ); - }); - - var json = { - "recordsTotal": data.count, - "recordsFiltered": data.count, - "data": objects - }; - return JSON.stringify(json); - }; - - $('#device-grid').datatables_extended_serverside_paging( - null, - "/api/device-mgt/v1.0/devices/", - dataFilter, - columns, - fnCreatedRow, - function () { - $(".icon .text").res_text(0.2); - $('#device-grid').removeClass('hidden'); - $("#loading-content").remove(); - attachDeviceEvents(); - - - if ($('.advance-search').length < 1) { - $(this).closest('.dataTables_wrapper').find('div[id$=_filter] input') - .after('Advanced Search'); - } - - }, { - "placeholder": "Top-Device-Name-Search", - "searchKey": "namePattern", - "groupId": groupId - } - ); - - $(deviceCheckbox).click(function () { - addDeviceSelectedClass(this); - }); -} - -function openCollapsedNav() { - $('.wr-hidden-nav-toggle-btn').addClass('active'); - $('#hiddenNav').slideToggle('slideDown', function () { - if ($(this).css('display') == 'none') { - $('.wr-hidden-nav-toggle-btn').removeClass('active'); - } - }); -} - -/* - * DOM ready functions. - */ -$(document).ready(function () { - /* Adding selected class for selected devices */ - $(deviceCheckbox).each(function () { - addDeviceSelectedClass(this); - }); - - var permissionList = $("#permission").data("permission"); - for (var key in permissionList) { - if (permissionList.hasOwnProperty(key)) { - $.setPermission(key); - } - } - - loadDevices(); - - /* for device list sorting drop down */ - $(".ctrl-filter-type-switcher").popover({ - html: true, - content: function () { - return $("#content-filter-types").html(); - } - }); - - /* for data tables*/ - $('[data-toggle="tooltip"]').tooltip(); - - $("[data-toggle=popover]").popover(); - - $(".ctrl-filter-type-switcher").popover({ - html: true, - content: function () { - return $('#content-filter-types').html(); - } - }); - - $('#nav').affix({ - offset: { - top: $('header').height() - } - }); - - //Hide the search by device-name input - $("input[placeholder='Top-Device-Name-Search']").hide(); - -}); - -var modalPopup = ".modal"; -var modalPopupContainer = modalPopup + " .modal-content"; -var modalPopupContent = modalPopup + " .modal-content"; -var body = "body"; - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).modal('show'); -} - -/* - * hide popup function. - */ -function hidePopup() { - $(modalPopupContent).html(""); - $(modalPopupContent).removeClass("operation-data"); - $(modalPopup).modal('hide'); - $('body').removeClass('modal-open').css('padding-right', '0px'); - $('.modal-backdrop').remove(); -} - -function markAlreadyAssignedGroups(deviceId, deviceType) { - var successCallback = function (data, textStatus, xhr) { - data = JSON.parse(data); - if (xhr.status == 200) { - if (data.length > 0) { - var selectedValues = []; - for (var i = 0; i < data.length; i++) { - if (data[i].owner != "wso2.system.user") { - selectedValues.push(data[i].id); - } - } - $("#groups").val(selectedValues).trigger("change"); - } - } else { - displayErrors(xhr); - } - }; - - invokerUtil.get("/api/device-mgt/v1.0/groups/device?deviceId=" + deviceId + "&deviceType=" + deviceType, - successCallback, function (message) { - displayErrors(message); - }); -} - -/** - * Following functions should be triggered after AJAX request is made. - */ -function attachDeviceEvents() { - - /** - * Following click function would execute - * when a user clicks on "Group" link - * on Device Management page in WSO2 DeviceMgt Console. - */ - if ($("a.group-device-link").length > 0) { - $("a.group-device-link").click(function () { - var deviceId = $(this).data("deviceid"); - var deviceType = $(this).data("devicetype"); - $(modalPopupContent).html($('#group-device-modal-content').html()); - $('#user-groups').html( - '
    '); - $("a#group-device-update-link").hide(); - showPopup(); - - var serviceURL; - if ($.hasPermission("LIST_ALL_GROUPS")) { - serviceURL = "/api/device-mgt/v1.0/admin/groups?limit=100"; - } else if ($.hasPermission("LIST_GROUPS")) { - //Get authenticated users groups - serviceURL = "/api/device-mgt/v1.0/groups?limit=100"; - } - - invokerUtil.get(serviceURL, function (data) { - $("a#group-device-add-link").hide(); - var groups = JSON.parse(data); - var html = ''; - var hasGroups = false; - for (var i = 0; i < groups.deviceGroups.length; i++) { - if (groups.deviceGroups[i].owner != "wso2.system.user") { - html += ''; - hasGroups = true; - } - } - if (hasGroups) { - html = '

    Please select device group(s)


    ' + - '
    ' + - '
    '; - markAlreadyAssignedGroups(deviceId, deviceType); - $("a#group-device-update-link").show(); - $("a#group-add-link").hide(); - } else { - $("a#group-device-update-link").hide(); - $("a#group-add-link").show(); - html += '

    You don\'t have any existing device groups. Please add new device group first.

    ' - } - $('#user-groups').html(html); - $("select.select2[multiple=multiple]").select2({ - tags: false - }); - $("a#group-device-update-link").click(function () { - var deviceIdentifier = {"id": deviceId, "type": deviceType}; - var deviceGroupIds = $("#groups").val(); - if (!deviceGroupIds) { - deviceGroupIds = []; - } - var deviceToGroupsAssignment = { - deviceIdentifier: deviceIdentifier, - deviceGroupIds: deviceGroupIds - }; - serviceURL = "/api/device-mgt/v1.0/groups/device/assign"; - invokerUtil.post(serviceURL, deviceToGroupsAssignment, function (data) { - $(modalPopupContent).html($('#group-associate-device-200-content').html()); - setTimeout(function () { - hidePopup(); - location.reload(false); - }, 2000); - }, function (jqXHR) { - displayDeviceErrors(jqXHR); - }); - }); - }, function (jqXHR) { - if (jqXHR.status == 404) { - $(modalPopupContent).html($('#group-404-content').html()); - $("a#cancel-link").click(function () { - hidePopup(); - }); - } else { - displayDeviceErrors(jqXHR); - } - }); - - $("a#group-device-cancel-link").click(function () { - hidePopup(); - }); - }); - - } - - /** - * Following click function would execute - * when a user clicks on "Remove" link - * on Device Management page in WSO2 MDM Console. - */ - $("a.remove-device-link").click(function () { - var deviceIdentifiers = []; - var deviceId = $(this).data("deviceid"); - var deviceType = $(this).data("devicetype"); - - if (deviceId && deviceType) { - deviceIdentifiers = [{"id": deviceId, "type": deviceType}]; - } else { - deviceIdentifiers = getSelectedDevices(); - } - - if (deviceIdentifiers.length == 0) { - $(modalPopupContent).html($('#no-device-selected').html()); - $("a#no-device-selected-link").click(function () { - hidePopup(); - }); - showPopup(); - return; - } - - $(modalPopupContent).html($('#remove-device-modal-content').html()); - showPopup(); - - $("a#remove-device-yes-link").click(function () { - if (groupId) { - var serviceURL = "/api/device-mgt/v1.0/groups/id/" + groupId + "/devices/remove"; - invokerUtil.post(serviceURL, deviceIdentifiers, function (message) { - $(modalPopupContent).html($('#remove-device-200-content').html()); - setTimeout(function () { - hidePopup(); - location.reload(false); - }, 2000); - }, function (jqXHR) { - displayDeviceErrors(jqXHR); - }); - } else { - removeDevices(deviceIdentifiers); - } - }); - - $("a#remove-device-cancel-link").click(function () { - hidePopup(); - }); - }); - - /** - * Following click function would execute - * when a user clicks on "Delete" link - * on Device Management page in Entgra MDM Console. - */ - $("a.delete-device-link").click(function () { - var deviceIdentifiers = []; - var deviceId = $(this).data("deviceid"); - if (deviceId) { - deviceIdentifiers = [deviceId]; - $(modalPopupContent).html($('#delete-device-modal-content').html()); - showPopup(); - } else { - var selectedDevices = getSelectedDevices(); - if (selectedDevices.length == 0) { - $(modalPopupContent).html($('#no-device-selected').html()); - $("a#no-device-selected-link").click(function () { - hidePopup(); - }); - showPopup(); - return; - } else { - var hasEnrolledDevice; - for (var i = 0; i < selectedDevices.length; i++) { - if (selectedDevices[i].selectability == 'selectable') { - hasEnrolledDevice = true; - break; - } else { - deviceIdentifiers.push(selectedDevices[i].id); - } - } - if (hasEnrolledDevice) { - $(modalPopupContent).html($('#enrolled-device-delete-content').html()); - $("a#enrolled-device-delete-link").click(function () { - hidePopup(); - }); - showPopup(); - } else { - $(modalPopupContent).html($('#delete-device-modal-content').html()); - showPopup(); - } - } - } - - - $("a#delete-device-yes-link").click(function () { - deleteDevices(deviceIdentifiers); - }); - - $("a#delete-device-cancel-link").click(function () { - hidePopup(); - }); - }); - - /** - * Following click function would execute - * when a user clicks on "Edit" link - * on Device Management page in WSO2 MDM Console. - */ - $("a.edit-device-link").click(function () { - var deviceId = $(this).data("deviceid"); - var deviceType = $(this).data("devicetype"); - var deviceName = $(this).data("devicename"); - var serviceURL = "/api/device-mgt/v1.0/devices/type/" + deviceType + "/id/" + deviceId + "/rename"; - - $(modalPopupContent).html($('#edit-device-modal-content').html()); - $('#edit-device-name').val(deviceName); - showPopup(); - - $("a#edit-device-yes-link").click(function () { - var newDeviceName = $('#edit-device-name').val(); - var request = {}; - request['name'] = newDeviceName; - invokerUtil.post(serviceURL, request, function (message) { - $(modalPopupContent).html($('#edit-device-200-content').html()); - setTimeout(function () { - hidePopup(); - location.reload(false); - }, 2000); - }, function (jqXHR) { - displayDeviceErrors(jqXHR); - }); - }); - - $("a#edit-device-cancel-link").click(function () { - hidePopup(); - }); - }); - - /** - * Following click function would execute - * when a user clicks on "Update Enrollment" link - * on Device Management page. - */ - $("a.update-enrollment-link").click(function () { - var deviceIdentifiers = []; - var deviceId = $(this).data("deviceid"); - var deviceType = $(this).data("devicetype"); - - if (deviceId && deviceType) { - deviceIdentifiers = [{"id": deviceId, "type": deviceType}]; - } else { - deviceIdentifiers = getSelectedDevices(); - } - - if (deviceIdentifiers.length === 0) { - $(modalPopupContent).html($('#no-device-selected').html()); - $("a#no-device-selected-link").click(function () { - hidePopup(); - }); - showPopup(); - return; - } - - $(modalPopupContent).html($('#update-enrollment-modal-content').html()); - showPopup(); - - $("a#update-enrollment-yes-link").click(function () { - var username = $("#update-enrollment-name").val(); - console.log(username); - if (username) { - var i; - var deviceIds = []; - for (i=0; i
    '); - $("a#group-device-add-link").hide(); - showPopup(); - - var serviceURL; - if ($.hasPermission("LIST_ALL_GROUPS")) { - serviceURL = "/api/device-mgt/v1.0/admin/groups?limit=100"; - } else if ($.hasPermission("LIST_GROUPS")) { - //Get authenticated users groups - serviceURL = "/api/device-mgt/v1.0/groups?limit=100"; - } - - invokerUtil.get(serviceURL, function (data) { - var groups = JSON.parse(data); - var html = ''; - var hasGroups = false; - for (var i = 0; i < groups.deviceGroups.length; i++) { - if (groups.deviceGroups[i].owner != "wso2.system.user") { - html += ''; - hasGroups = true; - } - } - if (hasGroups) { - html = '
    '; - $("a#group-add-link").hide(); - $("a#group-device-add-link").show(); - } else { - html += '

    You don\'t have any existing device groups. Please add new device group first.

    '; - $("a#group-add-link").show(); - $("a#group-device-add-link").hide(); - } - $('#user-groups').html(html); - $("a#group-device-add-link").click(function () { - var selectedGroup = $('#assign-group-selector').val(); - serviceURL = "/api/device-mgt/v1.0/groups/id/" + selectedGroup + "/devices/add"; - invokerUtil.post(serviceURL, deviceIdentifiers, function (data) { - $(modalPopupContent).html($('#group-associate-device-200-content').html()); - setTimeout(function () { - hidePopup(); - location.reload(false); - }, 2000); - }, function (jqXHR) { - displayDeviceErrors(jqXHR); - }); - }); - }, function (jqXHR) { - if (jqXHR.status == 404) { - $(modalPopupContent).html($('#group-404-content').html()); - $("a#cancel-link").click(function () { - hidePopup(); - }); - } else { - displayDeviceErrors(jqXHR); - } - }); - - $("a#group-device-cancel-link").click(function () { - hidePopup(); - }); - }); - - /** - * Following click function would execute when a user clicks on "Add Operation" link - * on Device Management page in device mgt Console. - */ - $('a.add-operation-link').click(function () { - var operationsRow = $("#device-type-operations-bar"); - if (!operationsRow.hasClass("hidden")) { - operationsRow.addClass("hidden"); - $("#device-type-operations").html(""); - return; - } - var deviceIdentifiers = getSelectedDevices(); - if (deviceIdentifiers.length === 0) { - $(modalPopupContent).html($('#no-device-selected').html()); - $("a#no-device-selected-link").click(function () { - hidePopup(); - }); - showPopup(); - return; - } - - var selectedDeviceType = deviceIdentifiers[0].type; - var deviceList = ""; - var count = 1; - deviceIdentifiers.forEach(function (deviceIdentifier) { - if (selectedDeviceType !== deviceIdentifier.type) { - ++count; - } - deviceList = !deviceList ? deviceIdentifier.id : deviceList + "," + deviceIdentifier.id; - }); - - // If multiple devices of multiple device types selected - if (count > 1) { - $(modalPopupContent).html($('#multiple-device-types-selected').html()); - $("a#multiple-device-types-selected-link").click(function () { - hidePopup(); - }); - showPopup(); - return; - } - var apiContext = $("#device-listing").data("api-context"); - var serviceURL = apiContext + "/device-types/" + selectedDeviceType + "/features?featureType=operation" + - "&hidden=false"; - invokerUtil.get(serviceURL, function (data) { - showOperationBar(JSON.parse(data), selectedDeviceType, deviceList); - }); - }); -} - -function showOperationBar(features, deviceType, deviceList) { - var featureList = []; - var feature; - for (var i = 0; i < features.length; i++) { - feature = {}; - feature.operation = features[i].code; - feature.name = features[i].name; - feature.description = features[i].description; - feature.deviceType = deviceType; - feature.params = []; - var metaData = features[i].metadataEntries; - if (metaData) { - for (var j = 0; j < metaData.length; j++) { - if (metaData[j].name === "operationMeta") { - var operationMeta = metaData[j].value; - var params = {}; - params.method = operationMeta.method; - params.pathParams = operationMeta.pathParams; - params.queryParams = operationMeta.queryParams; - params.formParams = operationMeta.formParams ? operationMeta.formParams : []; - params.uri = operationMeta.uri; - params.contentType = operationMeta.contentType; - feature.params.push(params); - feature.permission = operationMeta.permission; - if (operationMeta.icon) { - if (operationMeta.icon.indexOf("path:") === 0) { - feature.icon = operationMeta.icon.replace("path:", ""); - } else { - feature.iconFont = operationMeta.icon; - } - } - if (operationMeta.uiParams && operationMeta.uiParams.length > 0) { - feature.uiParams = operationMeta.uiParams; - } - continue; - } - feature.metadata.push(metaData[j].value); - } - featureList.push(feature); - } - } - - if (featureList.length > 0) { - var baseUnitPath = context + "/public/cdmf.unit.device.type." + deviceType + ".operation-bar"; - var operationBarScriptSrc = baseUnitPath + "/js/operation-bar.js"; - var operationBarTemplateSrc = baseUnitPath + "/templates/operation-bar.hbs"; - var operationBarCacheKey = deviceType + "-operation-bar"; - - $.template(operationBarCacheKey, operationBarTemplateSrc, function (template) { - var content = template({"controlOperations": featureList, "devices" : deviceList}); - $("#device-type-operations").html(content); - var operationRow = $("#device-type-operations-bar"); - var script = document.createElement("script"); - script.type = "text/javascript"; - script.src = operationBarScriptSrc; - operationRow.prepend(script); - operationRow.removeClass("hidden"); - }); - } else { - $(modalPopupContent).html($('#no-features-available').html()); - $("a#no-features-available-selected-link").click(function () { - hidePopup(); - }); - showPopup(); - } -} - -function removeDevices(deviceIdentifiers) { - var serviceURL = "/api/device-mgt/v1.0/devices/type/" + deviceIdentifiers[0].type + "/id/" + deviceIdentifiers[0].id; - invokerUtil.delete(serviceURL, function (message) { - if (deviceIdentifiers.length > 1) { - deviceIdentifiers.shift(); - removeDevices(deviceIdentifiers); - } else { - $(modalPopupContent).html($('#remove-device-200-content').html()); - setTimeout(function () { - hidePopup(); - location.reload(false); - }, 2000); - } - }, function (jqXHR) { - displayDeviceErrors(jqXHR); - }); -} - -function deleteDevices(deviceIdentifiers) { - var serviceURL = "/api/device-mgt/v1.0/admin/devices/permanent-delete"; - invokerUtil.put(serviceURL, deviceIdentifiers, function (message) { - $(modalPopupContent).html($('#delete-device-200-content').html()); - setTimeout(function () { - hidePopup(); - location.reload(false); - }, 2000); - }, function (jqXHR) { - displayDeviceErrors(jqXHR); - }); -} - -function displayDeviceErrors(jqXHR) { - showPopup(); - if (jqXHR.status == 400) { - $(modalPopupContent).html($('#device-400-content').html()); - $("a#device-400-link").click(function () { - hidePopup(); - }); - } else if (jqXHR.status == 403) { - $(modalPopupContent).html($('#device-403-content').html()); - $("a#device-403-link").click(function () { - hidePopup(); - }); - } else if (jqXHR.status == 409) { - $(modalPopupContent).html($('#device-409-content').html()); - $("a#device-409-link").click(function () { - hidePopup(); - }); - } else { - $(modalPopupContent).html($('#device-unexpected-error-content').html()); - $("a#device-unexpected-error-link").click(function () { - hidePopup(); - }); - console.log("Error code: " + jqXHR.status); - } -} - -function getParameterByName(name) { - name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); - var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), - results = regex.exec(location.search); - return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); -} - -/* - * Function to get selected devices. - */ -function getSelectedDevices() { - var deviceList = []; - var thisTable = $(".DTTT_selected").closest('.dataTables_wrapper').find('.dataTable').dataTable(); - thisTable.api().rows().every(function () { - if ($(this.node()).hasClass('DTTT_selected')) { - deviceList.push( - { - "id": $(thisTable.api().row(this).node()).data('deviceid'), - "type": $(thisTable.api().row(this).node()).data('devicetype'), - "selectability": $(thisTable.api().row(this).node()).data('type') - } - ); - } - }); - - return deviceList; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.hbs deleted file mode 100644 index 9227e4e312..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.hbs +++ /dev/null @@ -1,264 +0,0 @@ -{{! - Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - - WSO2 Inc. licenses this file to you under the Apache License, - Version 2.0 (the "License"); you may not use this file except - in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Device Type Management"}} - -{{#zone "topCss"}} - {{css "css/devicetype.css"}} -{{/zone}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Device Types - -
  • -
  • - - - Add - -
  • -{{/zone}} - -{{#zone "content"}} - {{#if canManage}} - -
    -
    - -
    -
    -

    Create Device Type

    -
    -
    -
    -
    -
    -
    1
    - -
    -
    -
    -
    -
    2
    - -
    -
    -
    -
    -

    -
    - - - - - -
    - -
    - - -
    - -
    - - -
    - -
    - - - -
    -
    -
    - -
    -
    - -
    -
    - -
    - -
    -
    - - - -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    -
    - - - - - - - - -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    -
    - - - - -
    - -
    - -
    -
    - - - - - - - -
    -
    - - {{else}} -

    - Permission Denied -

    -
    - You not authorized to create device type. -
    - {{/if}} -{{/zone}} - -{{#zone "bottomJs"}} - {{js "js/bottomJs.js"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.js deleted file mode 100644 index 163141cbc0..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var displayData = {}; - - if (userModule.isAuthorized("/permission/admin/device-mgt/admin/device-type")) { - displayData.canManage = true; - } - - return displayData; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.json deleted file mode 100644 index 0de47dfc78..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/create.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device-type/add", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/public/css/devicetype.css b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/public/css/devicetype.css deleted file mode 100644 index 01233a0851..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/public/css/devicetype.css +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -.wr-btn-horizontal{ - padding: 7px 10px; -} - -.dontfloat { - clear:both; -} - -.hidden-div { - display: none; -} - -.feature-wrapper{ - margin-top: 10px; -} - -.wr-btn-secondary{ - background-color: #617d8b; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/public/js/bottomJs.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/public/js/bottomJs.js deleted file mode 100644 index 18022238fc..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.create/public/js/bottomJs.js +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -var validateInline = {}; -var clearInline = {}; - -var apiBasePath = "/api/device-mgt/v1.0"; - - -var enableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).addClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).removeClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).removeClass(" hidden"); - } -}; - -var disableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).removeClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).addClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).addClass(" hidden"); - } -}; - - -function formatRepo(user) { - if (user.loading) { - return user.text - } - if (!user.username) { - return; - } - var markup = '
    ' + - '
    ' + - '
    ' + - '
    ' + user.username + '
    '; - if (user.name || user.name != undefined) { - markup += '
    ( ' + user.name + ' )
    '; - } - markup += '
    '; - return markup; -} - -function formatRepoSelection(user) { - return user.username || user.text; -} - - - -$(document).ready(function () { - - $('[data-toggle="tooltip"]').tooltip(); - var appContext = $("#app-context").data("app-context"); - - var maxField = 100; //Input fields increment limitation - var addButton = $('.add_button'); //Add button selector - var wrapper = $('.attribute_field_wrapper'); //Input field wrapper - var fieldHTML = $('#add-attribute-field').html(); //New input field html - $(addButton).click(function(){ //Once add button is clicked - $(wrapper).append(fieldHTML); // Add field html - }); - $(wrapper).on('click', '.remove_button', function(e){ //Once remove button is clicked - e.preventDefault(); - $(this).parent('div').remove(); - }); - - var addOperationButton = $('.add_operation_button'); //Add button selector - var operationWrapper = $('.operation_field_wrapper'); //Input field wrapper - var operationFieldHTML = $('#add-operation-field').html(); //New input field html - $(addOperationButton).click(function(){ //Once add button is clicked - $(operationWrapper).append(operationFieldHTML); // Add field html - }); - $(operationWrapper).on('click', '.remove_operation_button', function(e){ //Once remove button is clicked - e.preventDefault(); - $(this).parent('div').remove(); - }); - - - var addFeatureButton = $('.add_feature_button'); //Add button selector - var featureWrapper = $('.feature_field_wrapper'); //Input field wrapper - $(addFeatureButton).click(function(){ //Once add button is clicked - var featureFieldHtml = '
    ' + - '
    ' + - '
    ' + - '
    ' - $(featureWrapper).append(featureFieldHtml); // Add field html - }); - $(featureWrapper).on('click', '.remove_feature_button', function(e){ //Once remove button is clicked - e.preventDefault(); - $(this).parent('div').remove(); //Remove field html - }); - - /** - * Following click function would execute - * when a user clicks on "Add Device type" button. - */ - $("button#add-devicetype-btn").click(function () { - - var errorMsgWrapper = "#devicetype-create-error-msg"; - var errorMsg = "#devicetype-create-error-msg span"; - var deviceType = {}; - var deviceTypeName = $("#deviceTypeName").val(); - var deviceTypeDescription = $("#deviceTypeDescription").val(); - if (!deviceTypeName || deviceTypeName.trim() == "" ) { - $(errorMsg).text("Device Type Name Cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - return; - } - - if (!deviceTypeDescription || deviceTypeDescription.trim() == "" ) { - $(errorMsg).text("Device Type Description Cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - return - } - - deviceType.name = deviceTypeName.trim(); - deviceType.deviceTypeMetaDefinition = {} - deviceType.deviceTypeMetaDefinition.description = deviceTypeDescription.trim(); - - var pushNotification = $("#pushNotification").val(); - if (pushNotification != "NONE") { - deviceType.deviceTypeMetaDefinition.pushNotificationConfig = {}; - deviceType.deviceTypeMetaDefinition.pushNotificationConfig.scheduled = true; - deviceType.deviceTypeMetaDefinition.pushNotificationConfig.type = pushNotification; - } - - var propertyValues = []; - $('input[name^="attribute"]').each(function() { - var propertyValue = $(this).val(); - if (propertyValue.trim() != "") { - propertyValues.push(propertyValue.trim()); - } - }); - deviceType.deviceTypeMetaDefinition.properties = propertyValues; - - var operationValues = []; - $('input[name^="operation"]').each(function() { - var operationValue = $(this).val(); - if (operationValue.trim() != "") { - operationValues.push(operationValue.trim()); - } - }); - if (operationValues.length > 0) { - deviceType.deviceTypeMetaDefinition.initialOperationConfig = {}; - deviceType.deviceTypeMetaDefinition.initialOperationConfig.operations = operationValues; - } - - var features = []; - $('div[name^="deviceFeature"]').each(function() { - var featureName = $(this).find("#feature-name").val(); - var featureCode = $(this).find("#feature-code").val(); - var featureDescription = $(this).find("#feature-description").val(); - if (featureName && featureName.trim() != "" && featureCode && featureCode.trim() != "") { - var feature = {}; - feature.name = featureName.trim(); - feature.code = featureCode.trim(); - feature.description = featureDescription.trim(); - features.push(feature); - } - }); - deviceType.deviceTypeMetaDefinition.features = features; - - var addRoleAPI = apiBasePath + "/admin/device-types"; - - invokerUtil.post( - addRoleAPI, - deviceType, - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200) { - window.location.href = appContext + "/device-type/edit-event?type=" + - encodeURIComponent(deviceTypeName); - } - }, - function (jqXHR) { - if (jqXHR.status == 500) { - $(errorMsg).text("Unexpected error."); - $(errorMsgWrapper).removeClass("hidden"); - } - if (jqXHR.status == 400) { - $(errorMsg).text("Device type name should not contain whitespaces."); - $(errorMsgWrapper).removeClass("hidden"); - } - - if (jqXHR.status == 409) { - $(errorMsg).text("Device type already exists"); - $(errorMsgWrapper).removeClass("hidden"); - } - } - ); - }); - -}); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.hbs deleted file mode 100644 index 1203de1aea..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.hbs +++ /dev/null @@ -1,272 +0,0 @@ -{{! - Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - - WSO2 Inc. licenses this file to you under the Apache License, - Version 2.0 (the "License"); you may not use this file except - in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Device Type Management"}} - -{{#zone "topCss"}} - {{css "css/devicetype.css"}} -{{/zone}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Device Types - -
  • -
  • - - - Edit - -
  • -{{/zone}} - -{{#zone "content"}} - {{#if canManage}} - -
    -
    - -
    -
    -

    {{name}}

    -
    -
    -
    - -
    - - -
    - -
    - -
    - -
    - -
    - - -
    -
    - - -
    -
    - {{#if type.deviceTypeMetaDefinition.features}} - {{#each type.deviceTypeMetaDefinition.features}} -
    -
    -
    - -
    -
    - -
    -
    - -
    - -
    -
    - {{/each}} - {{/if}} -
    -
    -
    - -
    -
    - -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - {{#if type.deviceTypeMetaDefinition.properties}} - {{#each type.deviceTypeMetaDefinition.properties}} -
    -
    -
    - -
    - -
    -
    - {{/each}} - {{/if}} -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    -
    - - - - - - -
    - {{#if type.deviceTypeMetaDefinition.initialOperationConfig}} - {{#each type.deviceTypeMetaDefinition.initialOperationConfig.operations}} -
    -
    -
    - -
    - -
    -
    - {{/each}} - {{/if}} -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    -
    - - - - -
    - -
    -
    - - -
    -
    - - - - -
    -
    - - {{else}} -

    - Permission Denied -

    -
    - You not authorized to edit device type. -
    - {{/if}} -{{/zone}} - -{{#zone "bottomJs"}} - {{js "js/bottomJs.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.js deleted file mode 100644 index 5e6deb2198..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var displayData = {}; - - - if (userModule.isAuthorized("/permission/admin/device-mgt/admin/device-type")) { - displayData.canManage = true; - } - context.handlebars.registerHelper('if_eq', function(a, b, opts) { - if(a == b) // Or === depending on your needs - return opts.fn(this); - else - return opts.inverse(this); - }); - - var deviceType = request.getParameter("type"); - var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - var restAPIEndpoint = deviceMgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] - + "/device-types/" + deviceType; - displayData.name = deviceType; - serviceInvokers.XMLHttp.get( - restAPIEndpoint, - function (restAPIResponse) { - if (restAPIResponse["status"] == 200 && restAPIResponse["responseText"]) { - var typeData = parse(restAPIResponse["responseText"]); - displayData.type = typeData; - - } - } - ); - - return displayData; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.json deleted file mode 100644 index 26088b9d86..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/edit.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device-type/edit", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/public/css/devicetype.css b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/public/css/devicetype.css deleted file mode 100644 index 25203e2b1c..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/public/css/devicetype.css +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -.wr-btn-horizontal{ - padding: 7px 10px; -} - -.dontfloat { - clear:both; -} - -.hidden-div { - display: none; -} - -.hidden-input { - display: none; -} - -.feature-wrapper{ - margin-top: 10px; -} -.wr-btn-secondary{ - background-color: #617d8b; -} -.wr-btn-secondary{ - background-color: #617d8b; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/public/js/bottomJs.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/public/js/bottomJs.js deleted file mode 100644 index a388654574..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.edit/public/js/bottomJs.js +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -var validateInline = {}; -var clearInline = {}; - -var apiBasePath = "/api/device-mgt/v1.0"; -var domain = $("#domain").val(); - - -var enableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).addClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).removeClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).removeClass(" hidden"); - } -}; - -var disableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).removeClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).addClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).addClass(" hidden"); - } -}; - -function formatRepo(user) { - if (user.loading) { - return user.text - } - if (!user.username) { - return; - } - var markup = '
    ' + - '
    ' + - '
    ' + - '
    ' + user.username + '
    '; - if (user.name || user.name != undefined) { - markup += '
    ( ' + user.name + ' )
    '; - } - markup += '
    '; - return markup; -} - -function formatRepoSelection(user) { - return user.username || user.text; -} - -$(document).ready(function () { - - var appContext = $("#app-context").data("app-context"); - - var addButton = $('.add_button'); //Add button selector - var wrapper = $('.attribute_field_wrapper'); //Input field wrapper - var fieldHTML = $('#add-attribute-field').html(); //New input field html - $(addButton).click(function(){ //Once add button is clicked - $(wrapper).append(fieldHTML); // Add field html - }); - $(wrapper).on('click', '.remove_button', function(e){ //Once remove button is clicked - e.preventDefault(); - $(this).parent('div').remove(); //Remove field html - }); - - var addOperationButton = $('.add_operation_button'); //Add button selector - var operationWrapper = $('.operation_field_wrapper'); //Input field wrapper - var operationFieldHTML = $('#add-operation-field').html(); //New input field html - $(addOperationButton).click(function(){ //Once add button is clicked - $(operationWrapper).append(operationFieldHTML); // Add field html - }); - $(operationWrapper).on('click', '.remove_operation_button', function(e){ //Once remove button is clicked - e.preventDefault(); - $(this).parent('div').remove(); - }); - - - var addFeatureButton = $('.add_feature_button'); //Add button selector - var featureWrapper = $('.feature_field_wrapper'); //Input field wrapper - $(addFeatureButton).click(function(){ //Once add button is clicked - var featureFieldHtml = '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    '; - $(featureWrapper).append(featureFieldHtml); // Add field html - - }); - $(featureWrapper).on('click', '.remove_feature_button', function(e){ //Once remove button is clicked - e.preventDefault(); - $(this).parent('div').remove(); //Remove field html - }); - - /** - * Following click function would execute - * when a user clicks on "Add Device type" button. - */ - $("button#edit-devicetype-btn").click(function () { - - var errorMsgWrapper = "#devicetype-create-error-msg"; - var errorMsg = "#devicetype-create-error-msg span"; - var successMsgWrapper = "#devicetype-create-success-msg"; - var successMsg = "#devicetype-create-success-msg span"; - var deviceType = {}; - var deviceTypeName = $("#deviceTypeName").val(); - var deviceTypeDescription = $("#deviceTypeDescription").val(); - if (!deviceTypeName || deviceTypeName.trim() == "" ) { - $(errorMsg).text("Device Type Name Cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - $([document.documentElement, document.body]).animate({ - scrollTop: $(".page-sub-title").offset().top - }, 500); - return; - } - - if (!deviceTypeDescription || deviceTypeDescription.trim() == "") { - $(errorMsg).text("Device Type Description Cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - $([document.documentElement, document.body]).animate({ - scrollTop: $(".page-sub-title").offset().top - }, 500); - return; - } - - deviceType.name = deviceTypeName.trim(); - deviceType.deviceTypeMetaDefinition = {} - deviceType.deviceTypeMetaDefinition.description = deviceTypeDescription.trim(); - - var pushNotification = $("#pushNotification").val(); - if (pushNotification != "NONE") { - deviceType.deviceTypeMetaDefinition.pushNotificationConfig = {}; - deviceType.deviceTypeMetaDefinition.pushNotificationConfig.scheduled = true; - deviceType.deviceTypeMetaDefinition.pushNotificationConfig.type = pushNotification; - } - - var propertyValues = []; - $('input[name^="attribute"]').each(function() { - var propertyValue = $(this).val(); - if (propertyValue.trim() != "") { - propertyValues.push(propertyValue.trim()); - } - }); - deviceType.deviceTypeMetaDefinition.properties = propertyValues; - - var operationValues = []; - $('input[name^="operation"]').each(function() { - var operationValue = $(this).val(); - if (operationValue.trim() != "") { - operationValues.push(operationValue.trim()); - } - }); - if (operationValues.length > 0) { - deviceType.deviceTypeMetaDefinition.initialOperationConfig = {}; - deviceType.deviceTypeMetaDefinition.initialOperationConfig.operations = operationValues; - } - - var features = []; - var featureCodesValidation = true; - var regexp = /^[a-zA-Z0-9-_]+$/; - $('div[name^="deviceFeature"]').each(function() { - var featureName = $(this).find(".feature-name").val(); - var featureCode = $(this).find(".feature-code").val(); - var featureDescription = $(this).find(".feature-description").val(); - if (featureName && featureName.trim() != "" && featureCode && featureCode.trim() != "") { - featureCodesValidation = featureCodesValidation && (featureCode.search(regexp) != -1); - var feature = {}; - feature.name = featureName.trim(); - feature.code = featureCode.trim(); - feature.description = featureDescription; - features.push(feature); - } - }); - if (!featureCodesValidation) { - $(errorMsg).text("Device Type feature code can only contain alphanumeric, underscore and dash characters."); - $(errorMsgWrapper).removeClass("hidden"); - $([document.documentElement, document.body]).animate({ - scrollTop: $(".page-sub-title").offset().top - }, 500); - return; - } - deviceType.deviceTypeMetaDefinition.features = features; - - var addRoleAPI = apiBasePath + "/admin/device-types/" + deviceType.name; - - invokerUtil.put( - addRoleAPI, - deviceType, - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200) { - $(errorMsgWrapper).addClass(" hidden"); - $("#modalDevice").modal('show'); - } - }, - function (jqXHR) { - if (jqXHR.status == 500) { - $(errorMsg).text("Unexpected error."); - $(errorMsgWrapper).removeClass("hidden"); - } - - if (jqXHR.status == 409) { - $(errorMsg).text("Device type already exists"); - $(errorMsgWrapper).removeClass("hidden"); - } - } - ); - }); - -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.hbs deleted file mode 100644 index d4ac26f6d5..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.hbs +++ /dev/null @@ -1,181 +0,0 @@ -{{! - Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - - WSO2 Inc. licenses this file to you under the Apache License, - Version 2.0 (the "License"); you may not use this file except - in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Device Type Management"}} - -{{#zone "topCss"}} - {{css "css/devicetype.css"}} -{{/zone}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Device Types - -
  • -
  • - - - Event - -
  • -{{/zone}} - -{{#zone "content"}} - {{#if canManage}} - -
    -
    - -
    -
    -

    {{name}}

    -
    -
    -
    - -
    - - - -
    - - -
    - - -
    -
    - {{#if event.eventAttributes}} - {{#each event.eventAttributes.attributes}} -
    -
    -
    - -
    -
    - -
    - -
    -
    - {{/each}} - {{/if}} -
    -
    -
    - -
    -
    - -
    - -
    -
    -
    - -
    - {{#if event}} - - {{else}} - - {{/if}} - - -
    -
    -
    -
    - - - -
    -
    - - - - {{else}} -

    - Permission Denied -

    -
    - You not authorized to edit device type. -
    - {{/if}} -{{/zone}} - -{{#zone "bottomJs"}} - {{js "js/bottomJs.js"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.js deleted file mode 100644 index 3945f57686..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var displayData = {}; - - - if (userModule.isAuthorized("/permission/admin/device-mgt/admin/device-type")) { - displayData.canManage = true; - } - context.handlebars.registerHelper('selected', function(a, b, opts) { - if(a == b) // Or === depending on your needs - return "selected"; - else - return ""; - }); - - var deviceType = request.getParameter("type"); - var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"]; - var restAPIEndpoint = deviceMgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] - + "/events/" + deviceType; - displayData.name = deviceType; - serviceInvokers.XMLHttp.get( - restAPIEndpoint, - function (restAPIResponse) { - if (restAPIResponse["status"] == 200 && restAPIResponse["responseText"]) { - var typeData = parse(restAPIResponse["responseText"]); - displayData.event = typeData; - } - } - ); - - return displayData; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.json deleted file mode 100644 index 9e773121e5..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/edit.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device-type/edit-event", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/public/js/bottomJs.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/public/js/bottomJs.js deleted file mode 100644 index 46cd46a361..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetype.event.edit/public/js/bottomJs.js +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -var validateInline = {}; -var clearInline = {}; - -var apiBasePath = "/api/device-mgt/v1.0"; -var domain = $("#domain").val(); - - -var enableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).addClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).removeClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).removeClass(" hidden"); - } -}; - -var disableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).removeClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).addClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).addClass(" hidden"); - } -}; - -function formatRepo(user) { - if (user.loading) { - return user.text - } - if (!user.username) { - return; - } - var markup = '
    ' + - '
    ' + - '
    ' + - '
    ' + user.username + '
    '; - if (user.name || user.name != undefined) { - markup += '
    ( ' + user.name + ' )
    '; - } - markup += '
    '; - return markup; -} - -function formatRepoSelection(user) { - return user.username || user.text; -} - - - -$(document).ready(function () { - - var appContext = $("#app-context").data("app-context"); - var addEventButton = $('.add_event_button'); //Add button selector - var eventWrapper = $('.event_field_wrapper'); //Input field wrapper - $(addEventButton).click(function(){ //Once add button is clicked - var eventFieldHtml = '
    ' + - '
    ' + - '
    ' + - '
    ' - $(eventWrapper).append(eventFieldHtml); // Add field html - - }); - $(eventWrapper).on('click', '.remove_event_button', function(e){ //Once remove button is clicked - e.preventDefault(); - $(this).parent('div').remove(); - }); - - /** - * Following click function would execute - * when a user clicks on "Add Device type" button. - */ - $("button#add-event-btn").click(function () { - - var errorMsgWrapper = "#devicetype-create-error-msg"; - var errorMsg = "#devicetype-create-error-msg span"; - var successMsgWrapper = "#devicetype-create-success-msg"; - var successMsg = "#devicetype-create-success-msg span"; - var deviceTypeEvent = {}; - var deviceTypeName = $("#deviceTypeName").val(); - var deviceTypeDescription = $("#deviceTypeDescription").val(); - if (!deviceTypeName || deviceTypeName.trim() == "" ) { - $(errorMsg).text("Device Type Name Cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - return; - } - - - deviceTypeEvent.eventAttributes = {}; - - deviceTypeEvent.transport = $("#transport").val(); - - var attributes = []; - $('div[name^="deviceEvent"]').each(function() { - var eventName = $(this).find("#event-name").val(); - var eventType = $(this).find("#event-type").val(); - if (eventName && eventName.trim() != "" && eventType && eventType.trim() != "" && eventName != "deviceId") { - var attribute = {}; - attribute.name = eventName.trim(); - attribute.type = eventType.trim(); - attributes.push(attribute); - } - }); - deviceTypeEvent.eventAttributes.attributes = attributes; - - var addEventsAPI = apiBasePath + "/events/" + deviceTypeName; - - invokerUtil.post( - addEventsAPI, - deviceTypeEvent, - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200) { - $("#modalDevice").modal('show'); - } - }, - function (jqXHR) { - if (jqXHR.status == 500) { - $(errorMsg).text("Failed to deploy event definition, Please Contact Administrator"); - $(errorMsgWrapper).removeClass("hidden"); - } - - if (jqXHR.status == 409) { - $(errorMsg).text("Device type definition cannot be updated"); - $(errorMsgWrapper).removeClass("hidden"); - } - } - ); - }); - - - -}); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.hbs deleted file mode 100644 index e59b248e4f..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.hbs +++ /dev/null @@ -1,114 +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. -}} - -{{unit "cdmf.unit.ui.title" pageTitle="Device Type Management"}} -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.ui.modal"}} - -{{#zone "topCss"}} - {{css "css/custom.css"}} -{{/zone}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Device Types - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#unless isCloud}} -
  • - - - - - - - Create Device Type - -
  • - {{/unless}} -{{/zone}} - -{{#zone "content"}} - {{#if hasDeviceTypes}} -
    - - - Loading device types . . . -
    -
    - -
    - - - - - - - - - - -
    By Device Type Name
    -
    - - - - {{else}} - -
    -
    -

    You Haven't created device types yet.

    -
    Please click "Create a Device Type", if you wish to create a device type. -
    - - - - - - - Create Device Type - -
    -
    - - {{/if}} -{{/zone}} - -{{#zone "bottomJs"}} - - - {{js "js/devicetype-listing.js"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.json deleted file mode 100644 index 4dfd684380..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/devicetypes.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/device-types", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/css/custom.css b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/css/custom.css deleted file mode 100644 index e7d3595bec..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/css/custom.css +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -#devicetype-table .dataTablesTop{ - Display : none; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/js/devicetype-listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/js/devicetype-listing.js deleted file mode 100644 index e2002277c3..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/js/devicetype-listing.js +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 loadDeviceTypeBasedActionURL = function (action, deviceTypeName) { - href = $("#ast-container").data("app-context") + "device-type/" + action + "?type=" + encodeURIComponent(deviceTypeName); - $(location).attr('href', href); -}; - -$(function () { - var sortableElem = '.wr-sortable'; - $(sortableElem).sortable({ - beforeStop: function () { - $(this).sortable('toArray'); - } - }); - $(sortableElem).disableSelection(); -}); - -var apiBasePath = "/api/device-mgt/v1.0"; -var modalPopup = ".modal"; -var modalPopupContainer = modalPopup + " .modal-content"; -var modalPopupContent = modalPopup + " .modal-content"; -var body = "body"; -var isInit = true; -var isCloud = false; - - -/** - * - * Fires the res_text when ever a data table redraw occurs making - * the font icons change the size to respective screen resolution. - * - */ -$(document).on('draw.dt', function () { - $(".icon .text").res_text(0.2); -}); - - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).modal('show'); - //setPopupMaxHeight(); -} - -/* - * hide popup function. - */ -function hidePopup() { - $(modalPopupContent).html(''); - $(modalPopup).modal('hide'); - $('body').removeClass('modal-open').css('padding-right', '0px'); - $('.modal-backdrop').remove(); -} - - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption() { - // $(location).attr('href', $(this).data("url")); -} - -function htmlspecialchars(text) { - return jQuery('
    ').text(text).html(); -} - -function loadDeviceTypes() { - var loadingContent = $("#loading-content"); - loadingContent.show(); - - var dataFilter = function (data) { - data = JSON.parse(data); - var objects = []; - $(data).each(function (index) { - objects.push( - { - name: htmlspecialchars(data[index].name), - DT_RowId: "devicetype-" + htmlspecialchars(data[index].name), - metaDefinition: (data[index].deviceTypeMetaDefinition ? true : false) - } - ) - }); - - var json = { - "recordsTotal": data.length, - "recordsFiltered": data.length, - "data": objects - }; - - return JSON.stringify(json); - }; - - //noinspection JSUnusedLocalSymbols - var fnCreatedRow = function (nRow, aData, iDataIndex) { - $(nRow).attr('data-type', 'selectable'); - }; - - //noinspection JSUnusedLocalSymbols - var columns = [ - { - class: "remove-padding content-fill", - data: null, - defaultContent: "
    " + - "" + - "
    " - }, - { - class: "", - data: "name", - render: function (name, type, row, meta) { - return '

    ' + name.replace("devicemgt", "") + '

    '; - } - }, - { - class: "text-right content-fill text-left-on-grid-view no-wrap", - data: null, - render: function (data, type, row, meta) { - var isCloud = false; - if ($('#is-cloud').length > 0) { - isCloud = true; - } - - var innerhtml = ''; - if (data.metaDefinition) { - - var editLink = '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - ''; - - var editEventLink = '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - ''; - - innerhtml = editLink + editEventLink; - } - return innerhtml; - } - } - ]; - - var options = { - "placeholder": "Search By Device Type Name", - "searchKey": "filter", - "searching": false - }; - var settings = { - "sorting": false - }; - var deviceTypeApiUrl = '/api/device-mgt/v1.0/admin/device-types'; - - $('#devicetype-grid').datatables_extended_serverside_paging(settings, deviceTypeApiUrl, dataFilter, columns, fnCreatedRow, null, options); - loadingContent.hide(); - -} - -$(document).ready(function () { - loadDeviceTypes(); -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/templates/devicetype-listing.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/templates/devicetype-listing.hbs deleted file mode 100644 index 6835f28e9c..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devicetypes/public/templates/devicetype-listing.hbs +++ /dev/null @@ -1,44 +0,0 @@ -{{#each deviceTypes}} - - -
    - -
    - - {{deviceTypeName}} - - - {{#if canEdit}} - - - - - - - - - - - - - - - - - - - - - - - - - {{/if}} - - -{{/each}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.hbs deleted file mode 100644 index c8c9b5e23c..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.hbs +++ /dev/null @@ -1,44 +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. -}} - -{{unit "cdmf.unit.ui.title" pageTitle="Policy Management | View Policy"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Policies - -
  • -
  • - - View - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.device.operation-mod"}} - {{unit "cdmf.unit.effective-policy.view"}} - {{unit "cdmf.unit.lib.data-table"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.js deleted file mode 100644 index 9293982898..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var utility = require("/app/modules/utility.js")["utility"]; - var deviceType = context.uriParams.deviceType; - var deviceId = context.uriParams.deviceId; - return {"deviceTypePolicyView": utility.getTenantedDeviceUnitName(deviceType, deviceId,"policy-view")}; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.json deleted file mode 100644 index ec79d2b203..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.effective-policy.view/view.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/policy/effective-policy/", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.error/error.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.error/error.hbs deleted file mode 100644 index a1a620b4b8..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.error/error.hbs +++ /dev/null @@ -1,22 +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. -}} -{{#zone "title"}}Error | {{@app.conf.appName}}{{/zone}} - -{{#zone "messageDescription"}} - {{@page.params.status}} - {{@page.params.message}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.error/error.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.error/error.json deleted file mode 100644 index adad4c3291..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.error/error.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/errors/default", - "layout" : "cdmf.layout.error" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.hbs deleted file mode 100644 index 8b81fdd212..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.hbs +++ /dev/null @@ -1,84 +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. -}} -{{#zone "topCss"}} - {{css "css/analytics.css"}} -{{/zone}} - -{{unit "cdmf.unit.ui.title" pageTitle="Analytics"}} -{{unit "cdmf.unit.ui.content.title" pageHeader=title}} -{{unit "cdmf.unit.lib.service-invoker-utility"}} -{{unit "cdmf.unit.lib.handlebars"}} -{{unit "cdmf.unit.lib.rickshaw-graph"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Groups - -
  • -
  • - - {{groupName}} - -
  • -
  • - - Analytics - -
  • -{{/zone}} - -{{#zone "content"}} -
    -
    - {{#if deviceTypes}} -
    - {{unit "cdmf.unit.analytics.date-range-picker" deviceTypes=deviceTypes}} -
    -
    -
    -
    - {{#each deviceTypes}} - {{unit deviceAnalyticsViewUnitName devices=devices}} - {{/each}} -
    - {{else}} -
    - -
    - {{/if}} -
    -
    -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.js deleted file mode 100644 index 2436a3495d..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var utility = require("/app/modules/utility.js").utility; - var groupModule = require("/app/modules/business-controllers/group.js")["groupModule"]; - var groupId = context.uriParams.id; - var group = groupModule.getGroup(groupId); - var devices = []; - var deviceResponse = groupModule.getGroupDevices(groupId).responseText; - - if(deviceResponse != null) { - var deviceResponseObj = parse(deviceResponse); - devices = deviceResponseObj.devices; - } - var page = { - "groupId": groupId, - "groupName": group.name, - "title": group.name + " Analytics" - }; - if (devices) { - var deviceTypes = []; - for (var i = 0; i < devices.length; i++) { - var hasDeviceType = false; - for (var j = 0; j < deviceTypes.length; j++) { - if (deviceTypes[j].type === devices[i].type) { - deviceTypes[j].devices.push(devices[i]); - hasDeviceType = true; - break; - } - } - if (!hasDeviceType) { - var deviceType = {}; - deviceType.type = devices[i].type; - deviceType.devices = []; - deviceType.devices.push(devices[i]); - deviceType.deviceAnalyticsViewUnitName = utility.getTenantedDeviceUnitName(deviceType.type, "analytics-view"); - deviceTypes.push(deviceType); - } - } - page.deviceTypes = deviceTypes; - page.devices = devices; - } - - return page; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.json deleted file mode 100644 index 8535dab982..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/analytics.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/group/{id}/analytics", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/public/css/analytics.css b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/public/css/analytics.css deleted file mode 100644 index 99514d0545..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.analytics/public/css/analytics.css +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -#rangeSliderWrapper { - margin-top: 25px; -} - -#chart { - display: inline-block; -} - -#legend { - display: inline-block; - position: relative; - left: 8px; -} - -#legend_container { - position: absolute; - right: 0; - bottom: 26px; - width: 0; -} - -#chart_container { - float: left; - position: relative; -} - -.ast-container { - padding-bottom: 30px; -} - -.container { - width: auto; -} - -.shrink { - margin-right: 20px; - margin-left: 20px; -} -.date-range{ - border: 1px solid #ccc; -} - -#dateRangePickerContainer button.active{ - background-color: #e6e6e6 !important; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.hbs deleted file mode 100644 index 62cea7955e..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.hbs +++ /dev/null @@ -1,84 +0,0 @@ -{{unit "cdmf.unit.ui.title" pageTitle="Group Management"}} -{{unit "cdmf.unit.ui.modal"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Groups - -
  • -
  • - - Add - -
  • -{{/zone}} - -{{#zone "content"}} -
    - - - - -
    -{{/zone}} -{{#zone "bottomJs"}} - {{js "js/group-add.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.js deleted file mode 100644 index f4ec0e15d6..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Returns the dynamic state to be populated by add-group page. - * - * @param context Object that gets updated with the dynamic state of this page to be presented - * @returns {*} A context object that returns the dynamic state of this page to be presented - */ -function onRequest(context) { - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var page = {}; - page["isCloud"] = devicemgtProps.isCloud; - page["groupNameJSRegEx"] = devicemgtProps.groupValidationConfig.groupNameJSRegEx; - page["groupNameRegExViolationErrorMsg"] = devicemgtProps.groupValidationConfig.groupNameRegExViolationErrorMsg; - page["groupNameHelpMsg"] = devicemgtProps.groupValidationConfig.groupNameHelpMsg; - return page; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.json deleted file mode 100644 index fe82d18f2d..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/create.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/group/add", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/public/js/group-add.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/public/js/group-add.js deleted file mode 100644 index c2ed21ecba..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.group.create/public/js/group-add.js +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -$(function () { - $("button#add-group-btn").click(function () { - - var name = $("input#name").val(); - var description = $("input#description").val(); - - if (!name) { - triggerError($("input#name"),"Group Name is a required field. It cannot be empty."); - return false; - } else if (!inputIsValid($("input#name").data("regex"), name)) { - triggerError($("input#name"),$("input#name").data("errormsg")); - return false; - } else { - var group = {"name": name, "description": description}; - - var successCallback = function (jqXHR, status, resp) { - if (resp.status == 201) { - $("#group-create-form").addClass("hidden"); - $("#group-created-msg").removeClass("hidden"); - setTimeout(function() { - window.location.href = "/devicemgt/groups"; - }, 1000); - } else { - displayErrors(resp.status); - } - }; - - invokerUtil.post("/api/device-mgt/v1.0/groups", group, - successCallback, function (message) { - displayErrors(message); - }); - - return false; - } - }); -}); - -/** - * @param el - * @param errorMsg - * - * Triggers validation error for provided element. - * Note : the basic jQuery validation elements should be present in the markup - * - */ -function triggerError(el,errorMsg){ - var parent = el.parents('.form-group'), - errorSpan = parent.find('span'), - errorMsgContainer = parent.find('label'); - - errorSpan.on('click',function(event){ - event.stopPropagation(); - removeErrorStyling($(this)); - el.unbind('.errorspace'); - }); - - el.bind('focusin.errorspace',function(){ - removeErrorStyling($(this)) - }).bind('focusout.errorspace',function(){ - addErrorStyling($(this)); - }).bind('keypress.errorspace',function(){ - $(this).unbind('.errorspace'); - removeErrorStyling($(this)); - }); - - errorMsgContainer.text(errorMsg); - - parent.addClass('has-error has-feedback'); - errorSpan.removeClass('hidden'); - errorMsgContainer.removeClass('hidden'); - - function removeErrorStyling(el){ - var parent = el.parents('.form-group'), - errorSpan = parent.find('span'), - errorMsgContainer = parent.find('label'); - - parent.removeClass('has-error has-feedback'); - errorSpan.addClass('hidden'); - errorMsgContainer.addClass('hidden'); - } - - function addErrorStyling(el){ - var parent = el.parents('.form-group'), - errorSpan = parent.find('span'), - errorMsgContainer = parent.find('label'); - - parent.addClass('has-error has-feedback'); - errorSpan.removeClass('hidden'); - errorMsgContainer.removeClass('hidden'); - } -} - -function displayErrors(message) { - $('#error-msg').html(message.responseText); - modalDialog.header('Unexpected error occurred!'); - modalDialog.content('

    ' + message.responseText + '

    '); - modalDialog.footer(''); - modalDialog.showAsError(); - $("a#group-unexpected-error-link").click(function () { - modalDialog.hide(); - }); -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.hbs deleted file mode 100644 index 7e556c556c..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.hbs +++ /dev/null @@ -1,428 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Group Management"}} -{{unit "cdmf.unit.ui.content.title" pageHeader="Groups"}} - -{{unit "cdmf.unit.lib.service-invoker-utility"}} -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.lib.ui-permissions-utility"}} - -{{#zone "topCss"}} - {{css "css/groups.css"}} -{{/zone}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Groups - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#if permissions.ADD_GROUP}} -
  • - - - - - - Add Group - -
  • - {{/if}} -{{/zone}} - -{{#zone "content"}} -
    -
    -
    -
    - - - {{#if groupCount}} -
    - - - - - - - - - - - - - - - - -
    By Owner
    -
    - {{else}} -
    - -
    - {{/if}} - -
    - - - -
    - -
    - - - -
    - -
    -
    -
    -
    -

    Group successfully updated.

    -
    - Do you want to manage users? - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -

    New Role was successfully created.

    -
    - Do you need to Add / Remove users from the chosen roles? - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -

    Do you really want to remove this group?

    - - -
    -
    -
    -
    - -
    -
    -
    -
    -

    Successfully removed the group.

    -
    -
    -
    -
    - -
    - - - -
    - -
    -
    -
    -
    -

    Group was successfully updated.

    -
    -
    -
    -
    - -
    -
    -
    -
    -

    Bad Request. Please contact your administrator.

    - -
    -
    -
    -
    - -
    -
    -
    -
    -

    Operation not permitted.

    - - -
    -
    -
    -
    - -
    -
    -
    -
    -

    Not found.

    - - -
    -
    -
    -
    - -
    -
    -
    -
    -

    Group does not exist.

    - - -
    -
    -
    -
    - -
    -
    -
    -
    -

    Unexpected error occurred!

    - - -
    -
    -
    -
    -
    -
    -
    -{{/zone}} - -{{#zone "bottomJs"}} - {{#if groupCount}} - {{js "js/listing.js"}} - {{/if}} -{{/zone}} - -{{#zone "topCss"}} - -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.js deleted file mode 100644 index c600f0515b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var groupModule = require("/app/modules/business-controllers/group.js")["groupModule"]; - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var constants = require("/app/modules/constants.js"); - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var currentUser = session.get(constants.USER_SESSION_KEY); - var page = {}; - if (currentUser) { - page.permissions = userModule.getUIPermissions(); - page.permissions.list = stringify(page.permissions); - page.currentUser = currentUser; - var groupCount = groupModule.getGroupCount(); - if (groupCount > 0) { - page.groupCount = groupCount; - } - } - page.isCloud = deviceMgtProps.isCloud; - return page; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.json deleted file mode 100644 index 4c9f556503..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/groups.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/groups", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/css/groups.css b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/css/groups.css deleted file mode 100644 index 58e0371132..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/css/groups.css +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -.dataTablesTop .dataTables_toolbar ul li:nth-child(1), .dataTables_toolbar ul li:nth-child(2) { - display: none; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/images/group-icon.png b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/images/group-icon.png deleted file mode 100644 index 156fbc6edc..0000000000 Binary files a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/images/group-icon.png and /dev/null differ diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/js/listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/js/listing.js deleted file mode 100644 index e53fdd38db..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.groups/public/js/listing.js +++ /dev/null @@ -1,646 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption(url) { - if ($(".select-enable-btn").text() == "Select") { - url = $(this).parent().data("url"); - $(location).attr('href', url); - } -} - -(function () { - var cache = {}; - var validateAndReturn = function (value) { - return (value == undefined || value == null) ? "Unspecified" : value; - }; - Handlebars.registerHelper("deviceMap", function (device) { - device.owner = validateAndReturn(device.owner); - device.ownership = validateAndReturn(device.ownership); - var arr = device.properties; - if (arr) { - device.properties = arr.reduce(function (total, current) { - total[current.name] = validateAndReturn(current.value); - return total; - }, {}); - } - }); -})(); - -/* - * Setting-up global variables. - */ -var groupCheckbox = "#ast-container .ctrl-wr-asset .itm-select input[type='checkbox']"; -var assetContainer = "#ast-container"; - -/* - * On Select All Groups button click function. - * - * @param button: Select All Groups button - */ -function selectAllDevices(button) { - if (!$(button).data('select')) { - $(groupCheckbox).each(function (index) { - $(this).prop('checked', true); - addGroupSelectedClass(this); - }); - $(button).data('select', true); - $(button).html('Deselect All Groups'); - } else { - $(groupCheckbox).each(function (index) { - $(this).prop('checked', false); - addGroupSelectedClass(this); - }); - $(button).data('select', false); - $(button).html('Select All Groups'); - } -} - -/* - * On listing layout toggle buttons click function. - * - * @param view: Selected view type - * @param selection: Selection button - */ -function changeDeviceView(view, selection) { - $(".view-toggle").each(function () { - $(this).removeClass("selected"); - }); - $(selection).addClass("selected"); - if (view == "list") { - $(assetContainer).addClass("list-view"); - } else { - $(assetContainer).removeClass("list-view"); - } -} - -/* - * Add selected style class to the parent element function. - * - * @param checkbox: Selected checkbox - */ -function addGroupSelectedClass(checkbox) { - if ($(checkbox).is(":checked")) { - $(checkbox).closest(".ctrl-wr-asset").addClass("selected device-select"); - } else { - $(checkbox).closest(".ctrl-wr-asset").removeClass("selected device-select"); - } -} - -function toTitleCase(str) { - return str.replace(/\w\S*/g, function (txt) { - return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); - }); -} - -function htmlspecialchars(text) { - return jQuery('
    ').text(text).html(); -} - -function loadGroups() { - var groupListing = $("#group-listing"); - var currentUser = groupListing.data("currentUser"); - var serviceURL; - if ($.hasPermission("LIST_ALL_GROUPS")) { - serviceURL = "/api/device-mgt/v1.0/admin/groups"; - } else if ($.hasPermission("LIST_GROUPS")) { - //Get authenticated users groups - serviceURL = "/api/device-mgt/v1.0/groups"; - } else { - $("#loading-content").remove(); - $('#device-table').addClass('hidden'); - $('#device-listing-status-msg').text('Permission denied.'); - $("#device-listing-status").removeClass(' hidden'); - return; - } - - var dataFilter = function (data) { - data = JSON.parse(data); - var objects = []; - $(data.deviceGroups).each(function (index) { - objects.push({ - groupId: htmlspecialchars(data.deviceGroups[index].id), - name: htmlspecialchars(data.deviceGroups[index].name), - description: htmlspecialchars(data.deviceGroups[index].description), - owner: htmlspecialchars(data.deviceGroups[index].owner) - }) - }); - var json = { - "recordsTotal": data.count, - "recordsFiltered": data.count, - "data": objects - }; - return JSON.stringify(json); - }; - - var columns = [ - { - targets: 0, - data: 'id', - class: 'remove-padding icon-only content-fill viewEnabledIcon', - render: function (data, type, row, meta) { - return '
    '; - } - }, - { - targets: 1, - data: 'name', - class: 'viewEnabledIcon' - }, - { - targets: 2, - data: 'owner', - class: 'remove-padding-top viewEnabledIcon' - }, - { - targets: 3, - data: 'description', - class: 'remove-padding-top viewEnabledIcon' - }, - { - targets: 4, - data: 'id', - class: 'text-right content-fill text-left-on-grid-view no-wrap tooltip-overflow-fix', - render: function (id, type, row, meta) { - var html = ''; - if ($.hasPermission("VIEW_GROUP_DEVICES")) { - /*html += '' + - '' - + - '';*/ - } - if (row.owner != "wso2.system.user") { - if ($.hasPermission("SHARE_GROUP")) { - html += - ''; - } - if ($.hasPermission("UPDATE_GROUP")) { - html += - '' + - ''; - } - if ($.hasPermission("REMOVE_GROUP")) { - html += - '' - + - ''; - } - } - return html; - } - } - ]; - - var fnCreatedRow = function (row, data) { - $(row).attr('data-type', 'selectable'); - if ($.hasPermission("VIEW_GROUP_DEVICES")) { - $(row).attr('data-url', 'devices?groupId=' + data.groupId + '&groupName=' + data.name); - } - $.each($('td', row), function (colIndex) { - switch (colIndex) { - case 1: - //TODO : The following line encodes html entities. - //Should check for a better solution since it only changes the presentation layer - $(this).text($("").html(this.innerText).text()) - $(this).attr('data-grid-label', "Name"); - $(this).attr('data-search', data.name); - $(this).attr('data-display', data.name); - break; - case 2: - $(this).attr('data-grid-label', "Owner"); - $(this).attr('data-search', data.owner); - $(this).attr('data-display', data.owner); - break; - case 3: - $(this).attr('data-grid-label', "Description"); - $(this).attr('data-search', data.description); - $(this).attr('data-display', data.description); - break; - } - }); - }; - - $('#group-grid').datatables_extended_serverside_paging( - null, - serviceURL, - dataFilter, - columns, - fnCreatedRow, - function (oSettings) { - $(".icon .text").res_text(0.2); - attachEvents(); - var thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable(); - thisTable.removeClass("table-selectable"); - }, - { - "placeholder": "Search By Group Name", - "searchKey": "name" - } - ); - $(groupCheckbox).click(function () { - addGroupSelectedClass(this); - }); -} - -function openCollapsedNav() { - $('.wr-hidden-nav-toggle-btn').addClass('active'); - $('#hiddenNav').slideToggle('slideDown', function () { - if ($(this).css('display') == 'none') { - $('.wr-hidden-nav-toggle-btn').removeClass('active'); - } - }); -} - -/* - * DOM ready functions. - */ -$(document).ready(function () { - - /* Adding selected class for selected devices */ - $(groupCheckbox).each(function () { - addGroupSelectedClass(this); - }); - - var permissionSet = {}; - - //This method is used to setup permission for device listing - $.setPermission = function (permission) { - permissionSet[permission] = true; - }; - - $.hasPermission = function (permission) { - return permissionSet[permission]; - }; - - var permissionList = $("#permission").data("permission"); - for (var key in permissionList) { - if (permissionList.hasOwnProperty(key)) { - $.setPermission(key); - } - } - - loadGroups(); - //$('#device-grid').datatables_extended(); - - /* for device list sorting drop down */ - $(".ctrl-filter-type-switcher").popover( - { - html: true, - content: function () { - return $("#content-filter-types").html(); - } - } - ); - - /* for data tables*/ - $('[data-toggle="tooltip"]').tooltip(); - - $("[data-toggle=popover]").popover(); - - $(".ctrl-filter-type-switcher").popover( - { - html: true, - content: function () { - return $('#content-filter-types').html(); - } - } - ); - - $('#nav').affix( - { - offset: { - top: $('header').height() - } - } - ); - -}); - -var modalPopup = ".modal"; -var modalPopupContainer = modalPopup + " .modal-content"; -var modalPopupContent = modalPopup + " .modal-content"; -var body = "body"; - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).modal('show'); -} - -/* - * hide popup function. - */ -function hidePopup() { - $(modalPopupContent).html(""); - $(modalPopupContent).removeClass("operation-data"); - $(modalPopup).modal('hide'); - $('body').removeClass('modal-open').css('padding-right', '0px'); - $('.modal-backdrop').remove(); -} - -/** - * Following functions should be triggered after AJAX request is made. - */ -function attachEvents() { - /** - * Following click function would execute - * when a user clicks on "Share" link - * on Group Management page in WSO2 Device Management Server Console. - */ - $("a.share-group-link").click(function () { - var groupId = $(this).data("group-id"); - var groupOwner = $(this).data("group-owner"); - - $(modalPopupContent).html($('#share-group-w1-modal-content').html()); - showPopup(); - - listAllRoles(groupId); - var shareGroupNextLink = $("a#share-group-next-link"); - shareGroupNextLink.click(function () { - var roles = $("#roles").val(); - updateGroupShare(groupId, roles); - }); - - var shareGroupNewRoleFromSelectionLink = $("a#share-group-new-role-from-selection"); - shareGroupNewRoleFromSelectionLink.click(function () { - var roles = $("#roles").val(); - if (roles && roles.length >= 2) { - addNewRole(roles); - } else { - var errorMsgWrapper = "#notification-error-msg"; - var errorMsg = "#notification-error-msg span"; - $(errorMsg).text("To create a new role with the combination of roles, at least two roles should be" + - " selected."); - $(errorMsgWrapper).removeClass("hidden"); - } - }); - }); - - /** - * Following click function would execute - * when a user clicks on "Remove" link - * on Group Management page in WSO2 IoT Server Console. - */ - $("a.remove-group-link").click(function () { - var groupId = $(this).data("group-id"); - var groupOwner = $(this).data("group-owner"); - - $(modalPopupContent).html($('#remove-group-modal-content').html()); - showPopup(); - - $("a#remove-group-yes-link").click(function () { - var successCallback = function (data, textStatus, xhr) { - if (xhr.status == 200) { - $(modalPopupContent).html($('#remove-group-200-content').html()); - setTimeout(function () { - hidePopup(); - location.reload(false); - }, 2000); - } else { - displayErrors(xhr); - } - }; - - invokerUtil.delete("/api/device-mgt/v1.0/groups/id/" + groupId, - successCallback, function (message) { - displayErrors(message); - }); - }); - - $("a#remove-group-cancel-link").click(function () { - hidePopup(); - }); - - }); - - /** - * Following click function would execute - * when a user clicks on "Edit" link - * on Device Management page in WSO2 MDM Console. - */ - $("a.edit-group-link").click(function () { - var groupId = $(this).data("group-id"); - var groupName = $(this).data("group-name"); - var groupOwner = $(this).data("group-owner"); - var groupDescription = $(this).data("group-description"); - - $(modalPopupContent).html($('#edit-group-modal-content').html()); - $('#edit-group-name').val(groupName); - $('#edit-group-description').val(groupDescription); - showPopup(); - - $("a#edit-group-yes-link").click(function () { - var newGroupName = $('#edit-group-name').val(); - var newGroupDescription = $('#edit-group-description').val(); - var group = {"name": newGroupName, "description": newGroupDescription, "owner": groupOwner}; - - var successCallback = function (data, textStatus, xhr) { - if (xhr.status == 200) { - $(modalPopupContent).html($('#edit-group-200-content').html()); - setTimeout(function () { - hidePopup(); - location.reload(false); - }, 2000); - } else { - displayErrors(xhr); - } - }; - - invokerUtil.put("/api/device-mgt/v1.0/groups/id/" + groupId, group, - successCallback, function (message) { - displayErrors(message); - }); - }); - - $("a#edit-group-cancel-link").click(function () { - hidePopup(); - }); - }); -} - -function markAlreadySavedUsersRoles(groupId) { - var successCallback = function (data, textStatus, xhr) { - data = JSON.parse(data); - if (xhr.status == 200) { - if (data.roles.length > 0) { - var selectedValues = []; - for (var i = 0; i < data.roles.length; i++) { - selectedValues.push(data.roles[i]); - } - $("#roles").val(selectedValues).trigger("change"); - } else { - return; - } - } else { - displayErrors(xhr); - } - }; - - invokerUtil.get("/api/device-mgt/v1.0/groups/id/" + groupId + "/roles", - successCallback, function (message) { - displayErrors(message); - }); -} - -function listAllRoles(groupId) { - var successCallback = function (data, textStatus, xhr) { - data = JSON.parse(data); - if (xhr.status == 200) { - if (data.roles.length > 0) { - var html = ''; - $("#rolesListing").html(html); - markAlreadySavedUsersRoles(groupId); - $("select.select2[multiple=multiple]").select2({tags: false}).on("select2:select", function () { - $("#notification-error-msg").addClass("hidden"); - }); - } else { - $("#rolesListing").html("No roles available"); - } - } else { - displayErrors(xhr); - } - }; - - invokerUtil.get("/api/device-mgt/v1.0/roles?offset=0&limit=100&user-store=all", - successCallback, function (message) { - displayErrors(message); - }); -} - -function addNewRole(roles) { - $(modalPopupContent).html($('#share-group-w3-modal-content').html()); - $("a#share-group-w3-yes-link").click(function () { - var roleName = $('#group-sharing-role-name').val(); - if (roleName) { - createNewCombinedRole(roleName, roles); - } else { - var errorMsgWrapper = "#notification-error-msg"; - var errorMsg = "#notification-error-msg span"; - $(errorMsg).text("Role name cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } - }); - $("a#share-group-w3-cancel-link").click(function () { - hidePopup(); - }); -} - -function togglePermissionAction(element) { - $(element).data('value', 'checked'); - var icon = $(element).find("i")[1]; - if ($(icon).hasClass('fw-minus')) { - $(icon).removeClass('fw-minus'); - $(icon).addClass('fw-add'); - $(element).data('value', 'unchecked'); - } else { - $(icon).removeClass('fw-add'); - $(icon).addClass('fw-minus'); - $(element).data('value', 'checked'); - } -} - -function updateGroupShare(groupId, roles) { - var successCallback = function (data) { - $(modalPopupContent).html($('#share-group-200-content').html()); - }; - - invokerUtil.post("/api/device-mgt/v1.0/groups/id/" + groupId + "/share", - roles, successCallback, function (message) { - displayErrors(message); - }); -} - -function createNewCombinedRole(roleName, roleList) { - var successCallback = function (data, status, jqXHR, isLast) { - $(modalPopupContent).html($('#create-combined-role-200-content').html()); - showPopup(); - }; - invokerUtil.post("/api/device-mgt/v1.0/roles/create-combined-role/" + roleName, roleList, - successCallback, function (message) { - displayErrors(message); - }); -} - -function displayErrors(jqXHR) { - showPopup(); - if (jqXHR.status == 400) { - $(modalPopupContent).html($('#group-400-content').html()); - if (jqXHR.responseText) { - $('#error-msg').html(jqXHR.responseText.replace(new RegExp("\"", 'g'), "")); - } - $("a#group-400-link").click(function () { - hidePopup(); - }); - } else if (jqXHR.status == 403) { - $(modalPopupContent).html($('#group-403-content').html()); - $("a#group-403-link").click(function () { - hidePopup(); - }); - } else if (jqXHR.status == 404) { - $(modalPopupContent).html($('#group-404-content').html()); - $("#group-404-message").html(jqXHR.responseText); - $("a#group-404-link").click(function () { - hidePopup(); - }); - } else if (jqXHR.status == 409) { - $(modalPopupContent).html($('#group-409-content').html()); - $("a#group-409-link").click(function () { - hidePopup(); - }); - } else { - $(modalPopupContent).html($('#group-unexpected-error-content').html()); - if (jqXHR.responseText) { - $('#unexp-error-msg').html(jqXHR.responseText.replace(new RegExp("\"", 'g'), "")); - } - $("a#group-unexpected-error-link").click(function () { - hidePopup(); - }); - console.log("Error code: " + jqXHR.status); - } -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.notification.listing/listing.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.notification.listing/listing.hbs deleted file mode 100644 index 7e91f28497..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.notification.listing/listing.hbs +++ /dev/null @@ -1,34 +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. -}} -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.ui.title" pageTitle="Notification Listing"}} -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Notifications - -
  • -{{/zone}} -{{#zone "content"}} - {{unit "cdmf.unit.notification.listing"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.notification.listing/listing.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.notification.listing/listing.json deleted file mode 100644 index 99d43a16b4..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.notification.listing/listing.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/notification-listing", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.platform.configuration/configuration.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.platform.configuration/configuration.hbs deleted file mode 100644 index b4c5c8af10..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.platform.configuration/configuration.hbs +++ /dev/null @@ -1,35 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Platform Configuration"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Platform Configuration - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.platform.configuration"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.platform.configuration/configuration.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.platform.configuration/configuration.json deleted file mode 100644 index 7316b1146c..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.platform.configuration/configuration.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/platform-configuration", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.hbs deleted file mode 100644 index 6742acaba5..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.hbs +++ /dev/null @@ -1,278 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Policy Management"}} -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.ui.modal"}} - -{{#zone "topCss"}} - -{{/zone}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Policies - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#if permissions.ADD_ADMIN_POLICY}} - {{#equal noPolicy false}} -
  • - - - - - - - Add New Policy - -
  • - {{/equal}} - {{/if}} - {{#if permissions.CHANGE_POLICY_PRIORITY}} - {{#equal noPolicy false}} -
  • - - - - - - - Policy Priority - -
  • - {{/equal}} - {{/if}} -
  • - - - - - - Apply Changes To Devices - -
  • -{{/zone}} - -{{#zone "content"}} - {{#equal isUpdated true}} - - {{/equal}} - {{#equal noPolicy true}} -
    - -
    - {{/equal}} - {{#equal noPolicy false}} -
    - - Loading policies . . . -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{#each policyListToView}} - - - - - - - - - - - - {{/each}} -
    - - - {{/equal}} -
    - - -{{/zone}} - -{{#zone "bottomJs"}} - {{js "js/policy-list.js"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.js deleted file mode 100644 index f4e7459293..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - context.handlebars.registerHelper('equal', function (lvalue, rvalue, options) { - if (arguments.length < 3) { - throw new Error("Handlebars Helper equal needs 2 parameters"); - } - if (lvalue != rvalue) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - var page = {}; - var policyModule = require("/app/modules/business-controllers/policy.js")["policyModule"]; - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var utility = require("/app/modules/utility.js")["utility"]; - var response = policyModule.getAllPolicies(); - if (response["status"] == "success") { - var policyListToView = response["content"]; - for(var index in policyListToView) { - if(policyListToView.hasOwnProperty(index)) { - policyListToView[index]["icon"] = utility.getDeviceThumb(policyListToView[index]["platform"]); - } - } - page["policyListToView"] = policyListToView; - var policyCount = policyListToView.length; - if (policyCount == 0) { - page["policyListingStatusMsg"] = "No policy is available to be displayed."; - page["noPolicy"] = true; - } else { - page["noPolicy"] = false; - page["isUpdated"] = response["updated"]; - } - } else { - // here, response["status"] == "error" - page["policyListingStatusMsg"] = "An unexpected error occurred. Please try again later."; - page["noPolicy"] = true; - } - - if (userModule.isAuthorized("/permission/admin/device-mgt/policies/remove")) { - page["removePermitted"] = true; - } - if (userModule.isAuthorized("/permission/admin/device-mgt/policies/update")) { - page["editPermitted"] = true; - } - page.permissions = userModule.getUIPermissions(); - return page; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.json deleted file mode 100644 index 07fd9fe9df..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/policies.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/policies", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/public/js/policy-list.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/public/js/policy-list.js deleted file mode 100644 index 437775da39..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policies/public/js/policy-list.js +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/* sorting function */ -var sortUpdateBtn = "#sortUpdateBtn"; -// var sortedIDs; -// var dataTableSelection = ".DTTT_selected"; -var settings = { - "sorting": false -}; -$('#policy-grid').datatables_extended(settings); -// $(".icon .text").res_text(0.2); - -var saveNewPrioritiesButton = "#save-new-priorities-button"; -var saveNewPrioritiesButtonEnabled = Boolean($(saveNewPrioritiesButton).data("enabled")); -if (saveNewPrioritiesButtonEnabled) { - $(saveNewPrioritiesButton).removeClass("hide"); -} - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption() { - $(location).attr('href', $(this).data("url")); -} - -/** - * Modal related stuff are as follows. - */ - -var modalPopup = ".modal"; -var modalPopupContainer = modalPopup + " .modal-content"; -var modalPopupContent = modalPopup + " .modal-content"; -var body = "body"; - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - var maxHeight = "max-height"; - var marginTop = "margin-top"; - var body = "body"; - $(modalPopupContent).css(maxHeight, ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css(marginTop, (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).modal('show'); -} - -/* - * hide popup function. - */ -function hidePopup() { - $(modalPopupContent).html(""); - $(modalPopupContent).removeClass("operation-data"); - $(modalPopup).modal('hide'); - $('body').removeClass('modal-open').css('padding-right','0px'); - $('.modal-backdrop').remove(); -} - -/* - * Function to get selected policies. - */ -function getSelectedPolicyStates() { - var policyList = []; - var thisTable = $(".DTTT_selected").closest('.dataTables_wrapper').find('.dataTable').dataTable(); - thisTable.api().rows().every(function () { - if ($(this.node()).hasClass('DTTT_selected')) { - policyList.push($(thisTable.api().row(this).node()).data('status')); - } - }); - - return policyList; -} - -/* - * Function to get selected policies. - */ -function getSelectedPolicies() { - var policyList = []; - var thisTable = $(".DTTT_selected").closest('.dataTables_wrapper').find('.dataTable').dataTable(); - thisTable.api().rows().every(function () { - if ($(this.node()).hasClass('DTTT_selected')) { - policyList.push($(thisTable.api().row(this).node()).data('id')); - } - }); - - return policyList; -} - - -$(document).ready(function () { - - /** - * ******************************************** - * Click functions related to Policy Listing - * ******************************************** - */ - - // [1] logic for running apply-changes-for-devices use-case - - var applyChangesButtonId = "#appbar-btn-apply-changes"; - - var isUpdated = $("#is-updated").val(); - if (!isUpdated) { - // if no updated policies found, hide button from app bar - $(applyChangesButtonId).addClass("hidden"); - } else { - // if updated policies found, show button from app bar - $(applyChangesButtonId).removeClass("hidden"); - } - - // click-event function for applyChangesButton - $(applyChangesButtonId).click(function () { - var serviceURL = "/api/device-mgt/v1.0/policies/apply-changes"; - modalDialog.header('Do you really want to apply changes to all policies?'); - modalDialog.footer(''); - modalDialog.show(); - - $("a#change-policy-yes-link").click(function () { - invokerUtil.put( - serviceURL, - null, - // on success - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200) { - modalDialog.header('Done. Changes applied successfully.'); - modalDialog.footer(''); - $("a#change-policy-success-link").click(function () { - modalDialog.hide(); - location.reload(); - }); - } - }, - // on error - function (jqXHR) { - console.log(stringify(jqXHR.data)); - modalDialog.header('An unexpected error occurred. Please try again later.'); - modalDialog.footer(''); - modalDialog.showAsError(); - $("a#change-policy-error-link").click(function () { - modalDialog.hide(); - }); - } - ); - }); - - $("a#change-policy-cancel-link").click(function () { - modalDialog.hide(); - }); - }); - - // [2] logic for un-publishing a selected set of Active, Active/Updated policies - - $(".policy-unpublish-link").click(function () { - var policyList = getSelectedPolicies(); - var statusList = getSelectedPolicyStates(); - if (($.inArray("Inactive/Updated", statusList) > -1) || ($.inArray("Inactive", statusList) > -1)) { - // if policies found in Inactive or Inactive/Updated states with in the selection, - // pop-up an error saying - // "You cannot select already inactive policies. Please deselect inactive policies and try again." - modalDialog.header('Action cannot be performed !'); - modalDialog.content('You cannot select already inactive policies to be unpublished. Please deselect ' + - 'inactive policies and try again.'); - modalDialog.footer('
    Ok' + - '
    '); - modalDialog.showAsAWarning(); - } else { - var serviceURL = "/api/device-mgt/v1.0/policies/deactivate-policy"; - if (policyList.length == 0) { - modalDialog.header('Action cannot be performed !'); - modalDialog.content('Please select a policy or a list of policies to un-publish.'); - modalDialog.footer(''); - modalDialog.showAsAWarning(); - } else { - modalDialog.header('Do you really want to unpublish the selected policy(s)?'); - modalDialog.footer(''); - modalDialog.show(); - } - - // on-click function for policy un-publishing "yes" button - $("a#unpublish-policy-yes-link").click(function () { - invokerUtil.post( - serviceURL, - policyList, - // on success - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200 && data) { - modalDialog.header('Done. Selected policy was successfully unpublished.'); - modalDialog.footer(''); - $("a#unpublish-policy-success-link").click(function () { - modalDialog.hide(); - location.reload(); - }); - } - }, - // on error - function (jqXHR) { - console.log(stringify(jqXHR.data)); - modalDialog.header('An unexpected error occurred. Please try again later.'); - modalDialog.footer(''); - modalDialog.showAsError(); - $("a#unpublish-policy-error-link").click(function () { - modalDialog.hide(); - }); - } - ); - }); - - // on-click function for policy un-publishing "cancel" button - $("a#unpublish-policy-cancel-link").click(function () { - modalDialog.hide(); - }); - } - }); - - // [3] logic for publishing a selected set of Inactive, Inactive/Updated policies - - $(".policy-publish-link").click(function () { - var policyList = getSelectedPolicies(); - var statusList = getSelectedPolicyStates(); - if (($.inArray("Active/Updated", statusList) > -1) || ($.inArray("Active", statusList) > -1)) { - // if policies found in Active or Active/Updated states with in the selection, - // pop-up an error saying - // "You cannot select already active policies. Please deselect active policies and try again." - modalDialog.header('Action cannot be performed !'); - modalDialog.content('You cannot select already active policies. Please deselect active policies and try ' + - 'again.'); - modalDialog.footer(''); - modalDialog.showAsAWarning(); - } else { - var serviceURL = "/api/device-mgt/v1.0/policies/activate-policy"; - if (policyList.length == 0) { - modalDialog.header('Action cannot be performed !'); - modalDialog.content('Please select a policy or a list of policies to publish.'); - modalDialog.footer(''); - modalDialog.showAsAWarning(); - } else { - modalDialog.header('Do you really want to publish the selected policy(s)?'); - modalDialog.footer(''); - modalDialog.show(); - } - // on-click function for policy removing "yes" button - $("a#publish-policy-yes-link").click(function () { - invokerUtil.post( - serviceURL, - policyList, - // on success - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200 && data) { - modalDialog.header('Done. Selected policy was successfully published.'); - modalDialog.footer(''); - $("a#publish-policy-success-link").click(function () { - modalDialog.hide(); - location.reload(); - }); - } - }, - // on error - function (jqXHR) { - console.log(stringify(jqXHR.data)); - modalDialog.header('An unexpected error occurred. Please try again later.'); - modalDialog.footer(''); - modalDialog.showAsError(); - $("a#publish-policy-error-link").click(function () { - modalDialog.hide(); - }); - } - ); - }); - - // on-click function for policy removing "cancel" button - $("a#publish-policy-cancel-link").click(function () { - modalDialog.hide(); - }); - } - }); - - // [4] logic for removing a selected set of policies - - $(".policy-remove-link").click(function () { - var policyList = getSelectedPolicies(); - var statusList = getSelectedPolicyStates(); - if (($.inArray("Active/Updated", statusList) > -1) || ($.inArray("Active", statusList) > -1)) { - // if policies found in Active or Active/Updated states with in the selection, - // pop-up an error saying - // "You cannot remove already active policies. Please deselect active policies and try again." - modalDialog.header('Action cannot be performed !'); - modalDialog.content('You cannot select already active policies. Please deselect active policies and try ' + - 'again.'); - modalDialog.footer(''); - modalDialog.showAsAWarning(); - } else { - var serviceURL = "/api/device-mgt/v1.0/policies/remove-policy"; - if (policyList.length == 0) { - modalDialog.header('Action cannot be performed !'); - modalDialog.content('Please select a policy or a list of policies to remove.'); - modalDialog.footer(''); - modalDialog.showAsAWarning(); - } else { - modalDialog.header('Do you really want to remove the selected policy(s)?'); - modalDialog.footer(''); - modalDialog.show(); - } - - // on-click function for policy removing "yes" button - $("a#remove-policy-yes-link").click(function () { - invokerUtil.post( - serviceURL, - policyList, - // on success - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200 && data) { - modalDialog.header('Done. Selected policy was successfully removed.'); - modalDialog.footer(''); - $("a#remove-policy-success-link").click(function () { - modalDialog.hide(); - location.reload(); - }); - } - }, - // on error - function (jqXHR) { - console.log(stringify(jqXHR.data)); - modalDialog.header('An unexpected error occurred. Please try again later.'); - modalDialog.footer(''); - modalDialog.showAsError(); - $("a#remove-policy-error-link").click(function () { - modalDialog.hide(); - }); - } - ); - }); - - // on-click function for policy removing "cancel" button - $("a#remove-policy-cancel-link").click(function () { - modalDialog.hide(); - }); - } - }); - - $("#loading-content").remove(); - if ($("#policy-listing-status-msg").text()) { - $("#policy-listing-status").removeClass("hidden"); - } - $("#policy-grid").removeClass("hidden"); - - $('[data-toggle="tooltip"]').tooltip(); - -}); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.hbs deleted file mode 100644 index f78cb71f65..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.hbs +++ /dev/null @@ -1,40 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Policy Management"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Policies - -
  • -
  • - - Add - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit policyWizardUnitName}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.js deleted file mode 100644 index 427af8deb6..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var utility = require("/app/modules/utility.js").utility; - context.handlebars.registerHelper('equal', function (lvalue, rvalue, options) { - if (arguments.length < 3) { - throw new Error("Handlebars Helper equal needs 2 parameters"); - } - if (lvalue != rvalue) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - var deviceType = context.uriParams.deviceType; - - return {"policyWizardUnitName": utility.getTenantedDeviceUnitName(deviceType, "policy-wizard")}; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.json deleted file mode 100644 index 5322b6ff2b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create.wizard/wizard.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/policy/add/{deviceType}", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.hbs deleted file mode 100644 index 52c43d2be9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.hbs +++ /dev/null @@ -1,61 +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. - - - Copyright (c) 2018, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - - Entgra (Pvt) Ltd. 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. -}} - -{{unit "cdmf.unit.ui.title" pageTitle="Policy Management | Add Policy"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Policies - -
  • -
  • - - Add - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.device.operation-mod"}} - {{unit "cdmf.unit.policy.create"}} - {{unit "cdmf.unit.lib.data-table"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.js deleted file mode 100644 index ad7dcceaae..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context){ - context.handlebars.registerHelper('equal', function (lvalue, rvalue, options) { - if (arguments.length < 3) - throw new Error("Handlebars Helper equal needs 2 parameters"); - if( lvalue!=rvalue ) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.json deleted file mode 100644 index 761dcb2d2d..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.create/create.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/policy/add", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.hbs deleted file mode 100644 index 89c472b4be..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.hbs +++ /dev/null @@ -1,61 +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. - - - Copyright (c) 2018, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - - Entgra (Pvt) Ltd. 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. -}} - -{{unit "cdmf.unit.ui.title" pageTitle="Policy Management | Edit Policy"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Policies - -
  • -
  • - - Edit - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.device.operation-mod"}} - {{unit "cdmf.unit.policy.edit"}} - {{unit "cdmf.unit.lib.data-table"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.js deleted file mode 100644 index c02a343604..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var utility = require("/app/modules/utility.js").utility; - var deviceType = request.getParameter("type"); - return {"deviceTypePolicyEdit": utility.getTenantedDeviceUnitName(deviceType, "policy-edit")}; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.json deleted file mode 100644 index f2122eb998..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.edit/edit.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/policy/edit", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.hbs deleted file mode 100644 index e526b7eaf4..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.hbs +++ /dev/null @@ -1,51 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Policy Management | Policy Priorities"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Policies - -
  • -
  • - - - Priorities - -
  • -{{/zone}} - -{{#zone "content"}} - {{#if isAuthorized}} - {{unit "cdmf.unit.policy.priority"}} - {{else}} -

    - Permission Denied -

    -
    - You not authorized to enter Policy Management Section. -
    - {{/if}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.js deleted file mode 100644 index 72b72edace..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context){ - context.handlebars.registerHelper('equal', function (lvalue, rvalue, options) { - if (arguments.length < 3) - throw new Error("Handlebars Helper equal needs 2 parameters"); - if( lvalue!=rvalue ) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - var viewModel = {}; - viewModel.isAuthorized = userModule.isAuthorized("/permission/admin/device-mgt/policies/manage"); - return viewModel; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.json deleted file mode 100644 index b8be6d8bbb..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.priority/priority.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/policy/priority", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.hbs deleted file mode 100644 index fdbbaf6016..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.hbs +++ /dev/null @@ -1,69 +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. - - - Copyright (c) 2018, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - - Entgra (Pvt) Ltd. 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. -}} - -{{unit "cdmf.unit.ui.title" pageTitle="Policy Management | View Policy"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Policies - -
  • -
  • - - View - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#if canEdit}} -
  • - -
  • - {{/if}} -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.device.operation-mod"}} - {{unit "cdmf.unit.policy.view"}} - {{unit "cdmf.unit.lib.data-table"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.json deleted file mode 100644 index a4d19525f6..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.policy.view/view.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/policy/view", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.privacy-policy/privacy-policy.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.privacy-policy/privacy-policy.hbs deleted file mode 100644 index bfed7576e9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.privacy-policy/privacy-policy.hbs +++ /dev/null @@ -1,195 +0,0 @@ -{{! - Copyright (c) 2018, 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. -}} -{{#zone "title"}}{{! to override parent page title }}{{/zone}} -{{unit "cdmf.unit.ui.title" pageTitle="Consent Page"}} - -{{#zone "content"}} -
    -
    - -

    PRIVACY POLICY

    - -
    -

    About Entgra IoT Server

    -

    Entgra IoT Server is a complete solution that enables device manufacturers and enterprises to connect - and manage their devices, build apps, manage events, secure devices and data, and visualize sensor - data in a scalable manner.

    -

    It also offers a complete and secure Enterprise Mobility Management (EMM/MDM) solution that aims to - address mobile computing challenges faced by enterprises today. Supporting iOS, Android, and Windows - devices, it helps organizations deal with both Corporate Owned, Personally Enabled (COPE) and - employee-owned devices with the Bring Your Own Device (BYOD) concept.

    -

    Entgra IoT Server comes with advanced analytics, enabling users to analyze speed, proximity, and - geo-fencing information of devices including details of those in motion and stationary state.

    -

    Privacy Policy

    -

    This policy describes how Entgra IoT Server 4.1.0 captures your personal information, the purposes of - collection, and information about the retention of your personal information. -

    Please note that this policy is for reference only, and is applicable for the software as a product. - Entgra and its developers have no access to the information held within Entgra IoT Server - 4.1.0.Please see the Disclaimer section for more information. Entities, organisations or individuals - controlling the use and administration of Entgra IoT Server 4.1.0 should create their own privacy - policies setting out the manner in which data is controlled or processed by the respective entity, - organisation or individual. -

    What is personal information?

    -

    Entgra IoT Server 4.1.0 considers anything related to you and by which you may be identified as your - personal information.

    -

    Signing in to Entgra IoT Server 4.1.0

    -
      -
    1. Your user name (except in cases where the user name created by your employer is under - contract) -
    2. -
    3. IP address used to log in
    4. -
    5. Email address
    6. -
    -

    Enrolling a device with Entgra IoT Server 4.1.0

    -
      -
    • Your device ID (e.g., phone or tablet), mobile number, IMEI number, and IMSI number
    • -
    • Your device’s location
    • -
    • Your device’s application list, and memory usage
    • -
    • Your device’s usage statistics, such as RAM, battery level, connected hotspot details, and - memory usage -
    • -
    -

    However, Entgra IoT Server 4.1.0 also collects the following information that is not considered - personal information, but is used only for statistical purposes. The reason for this is that - this information can not be used to track you. -

      -
    • City/Country from which you originated the TCP/IP connection
    • -
    • Time of the day that you logged in (year, month, week, hour or minute)
    • -
    • Type of device that you used to log in (e.g., phone or tablet)
    • -
    • Operating system and generic browser information
    • -
    -

    Collection of personal information

    -

    Entgra IoT Server 4.1.0 collects your information only to serve your access requirements. For - example: -

      -
    • Entgra IoT Server 4.1.0 uses your IP address to detect any suspicious login attempts to your - account. -
    • Entgra IoT Server 4.1.0 uses attributes like your first name, last name, etc., to provide a rich - and personalized user experience. -
    • Entgra IoT Server 4.1.0 uses your security questions and answers only to allow account recovery. -
    • -
    -

    Tracking Technologies

    -

    Entgra IoT Server 4.1.0 collects your information by:

    -
      -
    • Collecting information from the user profile page where you enter your personal data.
    • -
    • Tracking your IP address with HTTP request, HTTP headers, and TCP/IP.
    • -
    • Tracking your geographic information with the IP address.
    • -
    • Tracking your login history with browser cookies. Please see our cookie policy - for more - information. -
    • -
    -

    Use of personal information

    -

    Entgra IoT Server 4.1.0 will only use your personal information for the purposes for which it was - collected (or for a use identified as consistent with that purpose).

    -

    Entgra IoT Server 4.1.0 uses your personal information only for the following purposes.

    -
      -
    • To provide you with a personalized user experience. Entgra IoT Server 4.1.0 uses your name and - uploaded profile pictures for this purpose. -
    • -
    • To protect your account from unauthorized access or potential hacking attempts. Entgra IoT Server - 4.1.0 uses HTTP or TCP/IP Headers for this purpose. -
    • -
    • -

      This includes:

      -
        -
      1. IP address
      2. -
      3. Browser fingerprinting
      4. -
      5. Cookies
      6. -
      -
    • -
    • Derive statistical data for analytical purposes on system performance improvements. Entgra IoT - Server 4.1.0 will not keep any personal information after statistical calculations. Therefore, - the statistical report has no means of identifying an individual person. -
    • -
    • Entgra IoT Server 4.1.0 may use:
    • -
    • -
        -
      1. IP Address to derive geographic information
      2. -
      3. Browser fingerprinting to determine the browser technology or/and version
      4. -
      -
    • -
    -

    Disclosure of personal information

    -

    Entgra IoT Server 4.1.0 only discloses personal information to the relevant applications (also - known as - “Service Providers”) that are registered with Entgra IoT Server 4.1.0. These applications are - registered by the identity administrator of your entity or organization. Personal information is - disclosed only for the purposes for which it was collected (or for a use identified as consistent - with that purpose) as controlled by such Service Providers, unless you have consented otherwise or - where it is required by law.

    -

    Legal process

    -

    Please note that the organisation, entity or individual running Entgra IoT Server 4.1.0 may be - compelled to disclose your personal information with or without your consent when it is required by - law following due and lawful process.

    -

    Storage of personal information

    -

    Where your personal information is stored

    -

    Entgra IoT Server 4.1.0 stores your personal information in secured databases. Entgra IoT Server - 4.1.0 exercises proper industry accepted security measures to protect the database where your - personal information is held.Entgra IoT Server 4.1.0 as a product does not transfer or share your - data with any third parties or locations.

    -

    Entgra IoT Server 4.1.0 may use encryption to keep your personal data with an added level of - security.

    -

    How long your personal information is retained

    -

    Entgra IoT Server 4.1.0 retains your personal data as long as you are an active user of our system. - You can update your personal data at any time using the given self-care user portals.

    -

    Entgra IoT Server 4.1.0 may keep hashed secrets to provide you with an added level of security. This - includes:

    -
      -
    • Current password
    • -
    • Previously used passwords
    • -
    -

    How to request removal of your personal information

    -

    You can request the administrator to delete your account. The administrator is the administrator of - the tenant you are registered under, or the super-administrator if you do not use the tenant - feature.

    -

    Additionally, you can request to anonymize all traces of your activities that Entgra IoT Server 4.1.0 - may have retained in logs, databases or analytical storage.

    -

    More information

    -

    Changes to this policy

    -

    Upgraded versions of Entgra IoT Server 4.1.0 may contain changes to this policy. Revisions to this - policy will be packaged within such upgrades and would only apply to users who choose to use upgraded - versions.

    -

    Your choices

    -

    If you are already have an user account within Entgra IoT Server 4.1.0 ; you have the right to - deactivate your account if you find that this privacy policy is unacceptable to you.

    -

    If you do not have an account and you do not agree with our privacy policy, you can chose not to - create one.

    -

    Contact us

    -

    Please contact Entgra if you have any question or concerns regarding this privacy policy.

    -

    https://entgra.io.com/contact/

    -

    Disclaimer

    -

    Entgra, its employees, partners, and affiliates do not have access to and do not require, store, - process or control any of the data, including personal data contained in Entgra IoT Server 4.1.0. All - data, including personal data is controlled and processed by the entity or individual running Entgra - IoT Server 4.1.0. Entgra, its employees partners and affiliates are not a data processor or a data - controller within the meaning of any data privacy regulations. Entgra does not provide any warranties - or undertake any responsibility or liability in connection with the lawfulness or the manner and - purposes for which Entgra IoT Server 4.1.0 is used by such entities or persons.

    -

    This privacy policy is for the informational purposes of the entity or persons running Entgra IoT - Server 4.1.0 and sets out the processes and functionality contained within Entgra IoT Server 4.1.0 - regarding personal data protection. It is the responsibility of entities and persons running Entgra IoT - Server 4.1.0 to create and administer its own rules and processes governing users’ personal data, - Please note that the creation of such rules and processes may change the use, storage and disclosure - policies contained herein. Therefore users should consult the entity or persons running Entgra IoT - Server 4.1.0 for its own privacy policy for details governing users’ personal data.

    -
    -
    -
    -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.privacy-policy/privacy-policy.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.privacy-policy/privacy-policy.json deleted file mode 100644 index 2f12cb7da9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.privacy-policy/privacy-policy.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0.0", - "layout": "uuf.layout.sign-in", - "uri": "/privacy-policy", - "isAnonymous": true -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.hbs deleted file mode 100644 index ac4e28107d..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.hbs +++ /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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Home"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -{{/zone}} - -{{#zone "content"}} -
    -
    - Loading...Please Wait -
    -
    -{{/zone}} - -{{#zone "bottomJs"}} - - {{js "/js/script.js"}} -{{/zone}} - -{{#zone "topCss"}} - -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.js deleted file mode 100644 index f9f9a814a6..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var constants = require("/app/modules/constants.js"); - var skipWelcomeScreen = session.get(constants.SKIP_WELCOME_SCREEN); - if (skipWelcomeScreen) { - response.sendRedirect(context.app.context + "/"); - exit(); - } - return {}; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.json deleted file mode 100644 index add6d0c2de..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/processing.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/welcome", - "layout": "cdmf.layout.loading" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/public/js/script.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/public/js/script.js deleted file mode 100644 index 58f49e86eb..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.processing/public/js/script.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 pollingCount = 24; -function poll() { - $.ajax({ - url: context + "/api/user/environment-loaded", - type: "GET", - success: function (data) { - if (data.isLoaded) { - window.location = context + "/"; - } - }, - dataType: "json", - complete: setTimeout(function () { - pollingCount = pollingCount - 1; - if (pollingCount > 0) { - poll(); - } else { - $(".loading-animation .logo").hide(); - $(".loading-animation").prepend( - ''); - $(".loading-animation p").css("width", "150%") - .html("Ops... it seems something went wrong.
    Refresh the page to retry!"); - } - }, 5000), - timeout: 5000 - }); -} - -$(document).ready(function () { - poll(); -}); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/public/js/validate-register.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/public/js/validate-register.js deleted file mode 100644 index 0be9a12ab7..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/public/js/validate-register.js +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -/** - * Checks if an email address has the valid format or not. - * - * @param email Email address - * @returns {boolean} true if email has the valid format, otherwise false. - */ -function emailIsValid(email) { - var regExp = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; - return regExp.test(email); -} - -$(document).ready(function(){ - - /** - * Following click function would execute - * when a user clicks on "Add User" button - * on Add User page in WSO2 Devicemgt Console. - */ - $("button#add-user-btn").click(function () { - - var usernameInput = $("input#user_name"); - var firstnameInput = $("input#first_name"); - var lastnameInput = $("input#last_name"); - var emailInput = $("input#email"); - var passwordInput = $("input#password"); - var passwordConfirmationInput = $("input#password_confirmation"); - var privacyPolicyConsentInput = $("input#privacy-consent"); - - var username = usernameInput.val().trim(); - var firstname = firstnameInput.val(); - var lastname = lastnameInput.val(); - var emailAddress = emailInput.val(); - var password = passwordInput.val(); - var passwordConfirmation = passwordConfirmationInput.val(); - var privacyPolicyConsentChecked = privacyPolicyConsentInput.is(':checked'); - var errorMsgWrapper = "#user-create-error-msg"; - var errorMsg = "#user-create-error-msg span"; - - if (!firstname) { - $(errorMsg).text("Firstname is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(firstnameInput.data("regex"), firstname)) { - $(errorMsg).text(firstnameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!lastname) { - $(errorMsg).text("Lastname is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(lastnameInput.data("regex"), lastname)) { - $(errorMsg).text(lastnameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!username) { - $(errorMsg).text("Username is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(usernameInput.data("regex"), username)) { - $(errorMsg).text(usernameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!emailAddress) { - $(errorMsg).text("Email is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!emailIsValid(emailAddress)) { - $(errorMsg).text(emailInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!password) { - $(errorMsg).text("Password is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (password.length < 6) { - $(errorMsg).text("Password should contain a minimum of 6 characters."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (password != passwordConfirmation) { - $(errorMsg).text("Please enter the same password for confirmation."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!privacyPolicyConsentChecked) { - $(errorMsg).text("You need to agree with the Privacy policy in order to register with IoT Server."); - $(errorMsgWrapper).removeClass("hidden"); - } else { - $(errorMsgWrapper).addClass("hidden"); - $("#add-user-btn").prop('disabled', true); - - var addUserFormData = {}; - addUserFormData.username = username; - addUserFormData.firstname = firstname; - addUserFormData.lastname = lastname; - addUserFormData.emailAddress = emailAddress; - addUserFormData.password = $("input#password").val(); - addUserFormData.userRoles = null; - - var context = $(".form-login-box").data("context"); - var addUserAPI = context + "/api/user/register"; - - $.ajax({ - type: 'POST', - url: addUserAPI, - contentType: 'application/json', - data: JSON.stringify(addUserFormData), - success: function (data) { - $("#add-user-btn").prop('disabled', false); - if (data == 200) { - $('.wr-validation-summary strong').html( - " Successfully Submitted."); - $('.wr-validation-summary').removeClass("alert-danger"); - $('.wr-validation-summary').addClass("alert-success"); - } else if (data == 201) { - $('.wr-validation-summary strong').html( - " User created succssfully. You will be " + - "redirected to login page."); - $('.wr-validation-summary').removeClass("alert-danger"); - $('.wr-validation-summary').addClass("alert-success"); - $("#add-user-btn").prop('disabled', true); - setTimeout(function () { - window.location = context + "/login"; - }, 2000); - } else if (data == 400) { - $('.wr-validation-summary strong').html( - " Exception at backend."); - $('.wr-validation-summary').removeClass("alert-danger"); - $('.wr-validation-summary').addClass("alert-warning"); - } else if (data == 403) { - $('.wr-validation-summary strong').html("Action not permitted."); - } else if (data == 409) { - $('.wr-validation-summary strong').html( - " User name already exists."); - $('.wr-validation-summary').removeClass("alert-default"); - $('.wr-validation-summary').addClass("alert-success"); - } - $('.wr-validation-summary').removeClass("hidden"); - $('#password').val(''); - $('#password_confirmation').val(''); - }, - error: function (err) { - $("#add-user-btn").prop('disabled', false); - $('.wr-validation-summary strong').html( - " An unexpected error occurred."); - $('.wr-validation-summary').removeClass("hidden"); - } - }); - } - }); -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.hbs deleted file mode 100644 index 98ee528e40..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.hbs +++ /dev/null @@ -1,98 +0,0 @@ -{{unit "cdmf.unit.ui.title" pageTitle="Register"}} - -{{#zone "content"}} - {{unit "uuf.unit.lib.form-validation"}} - -
    - -

    Register

    - -

    Create a new account in Entgra IoT Server(All fields are required.)

    -
    - - - - -
    -{{/zone}} - -{{#zone "bottomJs"}} - {{js "js/validate-register.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.js deleted file mode 100644 index 88cec36cde..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Returns the dynamic state to be populated by add-user page. - * - * @param context Object that gets updated with the dynamic state of this page to be presented - * @returns {*} A context object that returns the dynamic state of this page to be presented - */ -function onRequest(context) { - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var page = {}; - page["usernameJSRegEx"] = devicemgtProps.userValidationConfig.usernameJSRegEx; - page["usernameHelpText"] = devicemgtProps.userValidationConfig.usernameHelpMsg; - page["usernameRegExViolationErrorMsg"] = devicemgtProps.userValidationConfig.usernameRegExViolationErrorMsg; - page["firstnameJSRegEx"] = devicemgtProps.userValidationConfig.firstnameJSRegEx; - page["firstnameRegExViolationErrorMsg"] = devicemgtProps.userValidationConfig.firstnameRegExViolationErrorMsg; - page["lastnameJSRegEx"] = devicemgtProps.userValidationConfig.lastnameJSRegEx; - page["lastnameRegExViolationErrorMsg"] = devicemgtProps.userValidationConfig.lastnameRegExViolationErrorMsg; - page["emailJSRegEx"] = devicemgtProps.userValidationConfig.emailJSRegEx; - page["emailRegExViolationErrorMsg"] = devicemgtProps.userValidationConfig.emailRegExViolationErrorMsg; - return page; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.json deleted file mode 100644 index 58346ba14a..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.register/register.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/register", - "isAnonymous": true, - "layout": "uuf.layout.sign-in" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.hbs deleted file mode 100644 index 45411b407f..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.hbs +++ /dev/null @@ -1,161 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Role Management"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Roles - -
  • -
  • - - - Add - -
  • -{{/zone}} - -{{#zone "content"}} - {{#if canManage}} - -
    -
    - -
    -
    -

    Add Role

    -
    -
    -
    -
    -
    -
    -
    1
    - -
    -
    -
    -
    -
    2
    - -
    -
    -
    -
    -

    -
    - - -
    - - -
    - - -
    - - {{#if isCloud}} -
    - - devicemgt - - {{else}} -
    - - - {{/if}} - - -
    - {{#if canViewUsers}} - - -
    - - -
    - {{/if}} -
    -
    -
    - -
    -
    - - - -
    -
    - - {{else}} -

    - Permission Denied -

    -
    - You not authorized to enter Role Management Section. -
    - {{/if}} -{{/zone}} -{{#zone "bottomJs"}} - {{js "js/bottomJs.js"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.js deleted file mode 100644 index c24bbffbd9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Returns the dynamic state to be populated by add-user page. - * - * @param context Object that gets updated with the dynamic state of this page to be presented - * @returns {*} A displayData object that returns the dynamic state of this page to be presented - */ -function onRequest(context) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var displayData = {}; - - displayData["userStores"] = userModule.getSecondaryUserStores(); - displayData["roleNameJSRegEx"] = deviceMgtProps["roleValidationConfig"]["roleNameJSRegEx"]; - displayData["roleNameHelpText"] = deviceMgtProps["roleValidationConfig"]["roleNameHelpMsg"]; - displayData["roleNameRegExViolationErrorMsg"] = deviceMgtProps["roleValidationConfig"]["roleNameRegExViolationErrorMsg"]; - - if (userModule.isAuthorized("/permission/admin/device-mgt/roles/manage")) { - displayData.canManage = true; - } - if (userModule.isAuthorized("/permission/admin/device-mgt/users/view")) { - displayData.canViewUsers = true; - } - displayData.isCloud = deviceMgtProps.isCloud; - - return displayData; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.json deleted file mode 100644 index adab2be0f6..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/create.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/role/add", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/public/js/bottomJs.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/public/js/bottomJs.js deleted file mode 100644 index 0e3c0f6d5f..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.create/public/js/bottomJs.js +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -var validateInline = {}; -var clearInline = {}; - -var apiBasePath = "/api/device-mgt/v1.0"; -var domain = $("#domain").val(); -var isCloud = $("#role-create-form").data("cloud"); - - -var enableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).addClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).removeClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).removeClass(" hidden"); - } -}; - -var disableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).removeClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).addClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).addClass(" hidden"); - } -}; - -/** - *clear inline validation messages. - */ -clearInline["role-name"] = function () { - disableInlineError("roleNameField", "roleNameEmpty", "roleNameError"); -}; - - -/** - * Validate if provided role-name is valid against RegEx configures. - */ -validateInline["role-name"] = function () { - var roleNameInput = $("input#roleName"); - var roleName = roleNameInput.val(); - if (inputIsValid(roleNameInput.data("regex"), roleName) && roleName.indexOf("@") < 0 && roleName.indexOf("/") < 0) { - disableInlineError("roleNameField", "roleNameEmpty", "roleNameError"); - } else { - enableInlineError("roleNameField", "roleNameEmpty", "roleNameError"); - } -}; - -function formatRepo(user) { - if (user.loading) { - return user.text - } - if (!user.username) { - return; - } - var markup = '
    ' + - '
    ' + - '
    ' + - '
    ' + user.username + '
    '; - if (user.name || user.name != undefined) { - markup += '
    ( ' + user.name + ' )
    '; - } - markup += '
    '; - return markup; -} - -function formatRepoSelection(user) { - return user.username || user.text; -} - -$(document).ready(function () { - isCloud = $("#role-create-form").data("cloud"); - - var appContext = $("#app-context").data("app-context"); - $("#users").select2({ - multiple: true, - tags: false, - ajax: { - url: appContext + "/api/invoker/execute/", - method: "POST", - dataType: 'json', - delay: 250, - id: function (user) { - return user.username; - }, - data: function (params) { - var postData = {}; - postData.requestMethod = "GET"; - postData.requestURL = "/api/device-mgt/v1.0/users/search/usernames?filter=" + params.term + - "&domain=" + encodeURIComponent(domain); - postData.requestPayload = null; - return JSON.stringify(postData); - }, - processResults: function (data) { - var newData = []; - $.each(data, function (index, value) { - var user = {}; - user.id = value.username; - user.username = value.username; - if (value.firstname && value.lastname) { - user.name = value.firstname + " " + value.lastname; - } - newData.push(user); - }); - return { - results: newData - }; - }, - cache: true - }, - escapeMarkup: function (markup) { - return markup; - }, // let our custom formatter work - minimumInputLength: 1, - templateResult: formatRepo, // omitted for brevity, see the source of this page - templateSelection: formatRepoSelection // omitted for brevity, see the source of this page - }); - - /** - * Following click function would execute - * when a user clicks on "Add Role" button - * on Add Role page in WSO2 MDM Console. - */ - $("button#add-role-btn").click(function () { - - var domain = $("#domain").val(); - var roleNameInput = $("input#roleName"); - var roleName = roleNameInput.val(); - var users = $("#users").val(); - - var errorMsgWrapper = "#role-create-error-msg"; - var errorMsg = "#role-create-error-msg span"; - if (!roleName) { - $(errorMsg).text("Role name is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(roleNameInput.data("regex"), roleName) || roleName.indexOf("@") >= 0 || - roleName.indexOf("/") >= 0) { - $(errorMsg).text(roleNameInput.data("error-msg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!domain) { - $(errorMsg).text("Domain is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(/^[^~?!#$:;%^*`+={}\[\]\\()|<>,'"]/, domain)) { - $(errorMsg).text("Provided domain is invalid."); - $(errorMsgWrapper).removeClass("hidden"); - } else { - var addRoleFormData = {}; - if (isCloud) { - addRoleFormData.roleName = "devicemgt" + roleName; - } else { - addRoleFormData.roleName = roleName; - } - if (domain != "PRIMARY") { - addRoleFormData.roleName = domain + "/" + roleName; - } - if (users == null) { - users = []; - } - addRoleFormData.users = users; - - var addRoleAPI = apiBasePath + "/roles"; - - invokerUtil.post( - addRoleAPI, - addRoleFormData, - function (data, textStatus, jqXHR) { - if (jqXHR.status == 201) { - // Clearing user input fields. - $("input#roleName").val(""); - $("#domain").val("PRIMARY"); - $("#users").val(""); - window.location.href = appContext + "/role/edit-permission/?rolename=" + - encodeURIComponent(addRoleFormData.roleName); - } - }, - function (jqXHR) { - if (jqXHR.status == 500) { - $(errorMsg).text("Either role already exists or unexpected error."); - $(errorMsgWrapper).removeClass("hidden"); - } - } - ); - } - }); - - var roleNameInputElement = "#roleName"; - $(roleNameInputElement).focus(function () { - clearInline["role-name"](); - }); - - $(roleNameInputElement).blur(function () { - validateInline["role-name"](); - }); - - /* When the user store domain value is changed, the users who are assigned to that role should be removed, as - user and role can be mapped only if both are in same user store - */ - $("#domain").change(function () { - $("#users").select2("val", ""); - domain = $("#domain").val(); - }); -}); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit.permission/permission.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit.permission/permission.hbs deleted file mode 100644 index a05a504ca0..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit.permission/permission.hbs +++ /dev/null @@ -1,44 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Role Management"}} - -{{unit "cdmf.unit.lib.service-invoker-utility"}} -{{unit "cdmf.unit.lib.data-table"}} -{{unit "cdmf.unit.lib.handlebars"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Roles - -
  • -
  • - - Edit Permission - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.role.edit.permission"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit.permission/permission.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit.permission/permission.json deleted file mode 100644 index 952c4abe20..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit.permission/permission.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/role/edit-permission/", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit/edit.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit/edit.hbs deleted file mode 100644 index d1c488dbef..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit/edit.hbs +++ /dev/null @@ -1,43 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="Role Management"}} - -{{unit "cdmf.unit.lib.select2"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Roles - -
  • -
  • - - Edit - -
  • -{{/zone}} - -{{#zone "content"}} - {{unit "cdmf.unit.role.edit"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit/edit.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit/edit.json deleted file mode 100644 index 6959b98af0..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.role.edit/edit.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/role/edit/", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/public/js/role-listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/public/js/role-listing.js deleted file mode 100644 index 1e8a7156c2..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/public/js/role-listing.js +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 loadRoleBasedActionURL = function (action, rolename) { - href = $("#ast-container").data("app-context") + "role/" + action + "/?rolename=" + encodeURIComponent(rolename); - $(location).attr('href', href); -}; - -$(function () { - var sortableElem = '.wr-sortable'; - $(sortableElem).sortable({ - beforeStop: function () { - $(this).sortable('toArray'); - } - }); - $(sortableElem).disableSelection(); -}); - -var apiBasePath = "/api/device-mgt/v1.0"; -var modalPopup = ".modal"; -var modalPopupContainer = modalPopup + " .modal-content"; -var modalPopupContent = modalPopup + " .modal-content"; -var body = "body"; -var isInit = true; -var isCloud = false; - - -/** - * - * Fires the res_text when ever a data table redraw occurs making - * the font icons change the size to respective screen resolution. - * - */ -$(document).on('draw.dt', function () { - $(".icon .text").res_text(0.2); -}); - - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).modal('show'); - //setPopupMaxHeight(); -} - -/* - * hide popup function. - */ -function hidePopup() { - $(modalPopupContent).html(''); - $(modalPopup).modal('hide'); - $('body').removeClass('modal-open').css('padding-right', '0px'); - $('.modal-backdrop').remove(); -} - - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption() { - // $(location).attr('href', $(this).data("url")); -} - -function htmlspecialchars(text) { - return jQuery('
    ').text(text).html(); -} - -function loadRoles() { - isCloud = $("#role-table").data("cloud"); - var loadingContent = $("#loading-content"); - loadingContent.show(); - - var dataFilter = function (data) { - data = JSON.parse(data); - var objects = []; - var count = 0; - $(data.roles).each(function (index) { - objects.push( - { - name: htmlspecialchars(data.roles[index]), - DT_RowId: "role-" + htmlspecialchars(data.roles[index]) - } - ) - }); - - var json = { - "recordsTotal": data.count, - "recordsFiltered": data.count, - "data": objects - }; - - return JSON.stringify(json); - }; - - //noinspection JSUnusedLocalSymbols - var fnCreatedRow = function (nRow, aData, iDataIndex) { - $(nRow).attr('data-type', 'selectable'); - }; - - //noinspection JSUnusedLocalSymbols - var columns = [ - { - class: "remove-padding icon-only content-fill", - data: null, - defaultContent: "
    " + - "" + - "
    " - }, - { - class: "", - data: "name", - render: function (name, type, row, meta) { - return '

    ' + name.replace("devicemgt", ""); + '

    '; - } - }, - { - class: "text-right content-fill text-left-on-grid-view no-wrap tooltip-overflow-fix", - data: null, - render: function (data, type, row, meta) { - var isCloud = false; - if ($('#is-cloud').length > 0) { - isCloud = true; - } - - var innerhtml = ''; - - var isAdminRole = $("#role-table").data("role") === data.name; - - var editLink = ' ' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - ''; - - var editPermissionLink = '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - ''; - - var removeLink = '' + - '' + - '' + - '' + - '' + - '' + - ''; - - if (!isCloud && !isAdminRole) { - innerhtml = editLink + editPermissionLink + removeLink; - } - return innerhtml; - } - } - ]; - - var options = { - "placeholder": "Search By Role Name", - "searchKey": "filter" - }; - var settings = { - "sorting": false - }; - var roleApiUrl = '/api/device-mgt/v1.0/roles?user-store=all'; - if (isCloud) { - roleApiUrl = '/api/device-mgt/v1.0/roles/filter/devicemgt?user-store=all'; - } - - $('#role-grid').datatables_extended_serverside_paging(settings, roleApiUrl, dataFilter, columns, fnCreatedRow, null, options); - loadingContent.hide(); - -} - - -/** - * Following click function would execute - * when a user clicks on "Remove" link - * on Role Listing page in WSO2 Devicemgt Console. - */ -$("#role-grid").on("click", ".remove-role-link", function () { - var role = $(this).data("role"); - var userStore; - if (role.indexOf('/') > 0) { - userStore = role.substr(0, role.indexOf('/')); - role = role.substr(role.indexOf('/') + 1); - } - var removeRoleAPI = apiBasePath + "/roles/" + encodeURIComponent(role); - if (userStore) { - removeRoleAPI += "?user-store=" + encodeURIComponent(userStore); - } - modalDialog.header('Do you really want to remove this role ?'); - modalDialog.footer(''); - modalDialog.show(); - - $("a#remove-role-yes-link").click(function () { - invokerUtil.delete( - removeRoleAPI, - function () { - if (userStore) { - role = userStore + '/' + role; - } - $('[id="role-' + role + '"]').remove(); - modalDialog.header('Done. Role was successfully removed.'); - modalDialog.footer(''); - $("a#remove-role-success-link").click(function () { - modalDialog.hide(); - }); - }, - function () { - // $(modalPopupContent).html($('#remove-role-error-content').html()); - modalDialog.header('An unexpected error occurred. Please try again later.'); - modalDialog.footer(''); - modalDialog.showAsError(); - $("a#remove-role-error-link").click(function () { - modalDialog.hide(); - }); - } - ); - }); - - $("a#remove-role-cancel-link").click(function () { - modalDialog.hide(); - }); -}); - -$(document).ready(function () { - loadRoles(); - $(function () { - $('[data-toggle="tooltip"]').tooltip() - }); -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/public/templates/role-listing.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/public/templates/role-listing.hbs deleted file mode 100644 index 3f752a185a..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/public/templates/role-listing.hbs +++ /dev/null @@ -1,56 +0,0 @@ -{{#each roles}} - - -
    - -
    - - {{roleName}} - - - {{#unequal adminRole roleName }} - {{#if canEdit}} - - - - - - - - - - - - - - - - - - - - - - - - - {{/if}} - {{#if canRemove}} - - - - - - - - {{/if}} - {{/unequal}} - - -{{/each}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.hbs deleted file mode 100644 index 98f85e8137..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.hbs +++ /dev/null @@ -1,120 +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. -}} - -{{unit "cdmf.unit.ui.title" pageTitle="Role Management"}} -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.ui.modal"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Roles - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#unless isCloud}} -
  • - - - - - - - Add Role - -
  • - {{/unless}} -{{/zone}} - -{{#zone "content"}} - {{#if hasRoles}} -
    - {{#unless isCloud}} - {{#if removePermitted}} - - {{/if}} - {{#if editPermitted}} - - {{/if}} - {{/unless}} - {{#if isCloud}} - - {{/if}} - - Loading roles . . . -
    -
    - -
    - - - - - - - - - - -
    By Role Name
    -
    - - - - {{else}} - -
    -
    -

    You Haven't created roles yet.

    -
    Please click "Add A New Role", if you wish to add a role. -
    - - - - - - - Add Role - -
    -
    - - {{/if}} -{{/zone}} - -{{#zone "bottomJs"}} - - - {{js "js/role-listing.js"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.js deleted file mode 100644 index d2abe1a56b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - - context["permissions"] = userModule.getUIPermissions(); - if (userModule.isAuthorized("/permission/admin/device-mgt/roles/delete")) { - context["removePermitted"] = true; - } - if (userModule.isAuthorized("/permission/admin/device-mgt/roles/update")) { - context["editPermitted"] = true; - } - if (userModule.isAuthorized("/permission/admin/device-mgt/roles/remove")) { - context["removePermitted"] = true; - } - - context["adminRole"] = deviceMgtProps["adminRole"]; - context["isCloud"] = deviceMgtProps["isCloud"]; - var roleCount = userModule.getRolesCount() - if (deviceMgtProps["isCloud"]) { - roleCount = userModule.getFilteredRoles("devicemgt").content.count; - } - - if (roleCount > 0) { - context["hasRoles"] = true; - } else { - context["hasRoles"] = false; - } - - return context; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.json deleted file mode 100644 index 44d4ee20c8..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.roles/roles.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/roles", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.hbs deleted file mode 100644 index 22869a4828..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.hbs +++ /dev/null @@ -1,75 +0,0 @@ -{{! - Copyright (c) 2018, 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. -}} -{{#zone "title"}}{{! to override parent page title }}{{/zone}} -{{unit "cdmf.unit.ui.title" pageTitle="Consent Page"}} - -{{#zone "content"}} -
    -
    - -

    User Consents

    -
    -
    - {{appName}} application requests access to your profile information -
    - -
    -
    -

    By selecting following attributes I agree to share them with the above service provider.

    - {{#unless singleMandatoryClaim}} -
    - -
    - {{/unless}} -
    - {{#each mandatoryClaims}} - - {{/each}} -
    -
    - {{#each requestedClaims}} - - {{/each}} -
    -

    Mandatory claims are marked with an asterisk ( * )

    -
    - - - - -
    -
    -
    -
    -
    -{{/zone}} -{{#zone "bottomJs"}} - {{js "js/script.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.js deleted file mode 100644 index 6e8ed84016..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var Encode = Packages.org.owasp.encoder.Encode; - var viewModel = {}; - - // if sp is received, its a saml request or else its oidc - if(request.getParameter("sp") !== null) { - viewModel.appName = Encode.forHtml(request.getParameter("sp")); - viewModel.action = "/commonauth"; - viewModel.sessionDataKey = Encode.forHtmlAttribute(request.getParameter("sessionDataKey")); - viewModel.sessionDataKeyName = "sessionDataKey"; - viewModel.ssoProtocol = "saml"; - } else { - viewModel.appName = Encode.forHtml(request.getParameter("application")); - viewModel.action = "../oauth2/authorize"; - viewModel.sessionDataKey = Encode.forHtmlAttribute(request.getParameter("sessionDataKeyConsent")); - viewModel.sessionDataKeyName = "sessionDataKeyConsent"; - viewModel.ssoProtocol = "oidc"; - } - var mandatoryClaims = []; - var requestedClaims = []; - var singleMandatoryClaim = false; - - var mandatoryClaimsList, requestedClaimsList; - var i, j, partOne, partTwo; - if (request.getParameter("mandatoryClaims")) { - mandatoryClaimsList = request.getParameter("mandatoryClaims").split(","); - singleMandatoryClaim = (mandatoryClaimsList.length === 1); - for (j = 0; j < mandatoryClaimsList.length; j++) { - var mandatoryClaimsStr = mandatoryClaimsList[j]; - i = mandatoryClaimsStr.indexOf('_'); - partOne = mandatoryClaimsStr.slice(0, i); - partTwo = mandatoryClaimsStr.slice(i + 1, mandatoryClaimsStr.length); - mandatoryClaims.push( - {"claimId": Encode.forHtmlAttribute(partOne), "displayName": Encode.forHtmlAttribute(partTwo)} - ); - } - } - if (request.getParameter("requestedClaims")) { - requestedClaimsList = request.getParameter("requestedClaims").split(","); - for (j = 0; j < requestedClaimsList.length; j++) { - var requestedClaimsStr = requestedClaimsList[j]; - i = requestedClaimsStr.indexOf('_'); - partOne = requestedClaimsStr.slice(0, i); - partTwo = requestedClaimsStr.slice(i + 1, requestedClaimsStr.length); - requestedClaims.push( - {"claimId": Encode.forHtmlAttribute(partOne), "displayName": Encode.forHtmlAttribute(partTwo)} - ); - } - } - viewModel.mandatoryClaims = mandatoryClaims; - viewModel.requestedClaims = requestedClaims; - viewModel.singleMandatoryClaim = singleMandatoryClaim; - return viewModel; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.json deleted file mode 100644 index 4ca8fc3a6c..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/consent-do.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0.0", - "layout": "uuf.layout.sign-in", - "uri": "/consent.do", - "isAnonymous": true -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/public/js/script.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/public/js/script.js deleted file mode 100644 index 63a02f526f..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.consent-do/public/js/script.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function approved(ssoProtocol) { - var mandatoryClaimCBs = $(".mandatory-claim"); - var checkedMandatoryClaimCBs = $(".mandatory-claim:checked"); - - if (checkedMandatoryClaimCBs.length == mandatoryClaimCBs.length) { - if(ssoProtocol === "saml") { - document.getElementById('consent').value = "approve"; - } else if(ssoProtocol === "oidc") { - document.getElementById('consent').value = "approveAlways"; - } - document.getElementById("consentForm").submit(); - } else { - $("#modal_claim_validation").modal(); - } -} - -function deny() { - document.getElementById('consent').value = "deny"; - document.getElementById("consentForm").submit(); -} - -$(document).ready(function () { - $("#consent_select_all").click(function () { - if (this.checked) { - $('.checkbox input:checkbox').each(function () { - $(this).prop("checked", true); - }); - } else { - $('.checkbox :checkbox').each(function () { - $(this).prop("checked", false); - }); - } - }); - $(".checkbox input").click(function (e) { - if (e.target.id !== 'consent_select_all') { - $("#consent_select_all").prop("checked", false); - } - }); -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.hbs deleted file mode 100644 index e2e0a92c1f..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.hbs +++ /dev/null @@ -1,68 +0,0 @@ -{{! - Copyright (c) 2018, 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. -}} -{{#zone "title"}}{{! to override parent page title }}{{/zone}} -{{unit "cdmf.unit.ui.title" pageTitle="Login"}} - -{{#zone "content"}} -
    -
    - -

    Login

    -
    - {{#if message}} -
    - {{message}}! -
    - {{/if}} - -
    -
    -
    - - -
    -
    - - -
    - {{#if sessionDataKey}} - - {{/if}} - {{#if referer}} - - {{/if}} - -
    -
    - -
    - -
    -
    -
    -
    -
    -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.js deleted file mode 100644 index 0b0a29d8ef..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var authModuleConfigs = context.app.conf["authModule"]; - var sessionDataKey = request.getParameter("sessionDataKey"); - var authFailure = request.getParameter("authFailure"); - - //if sso enabled and sessionDataKey is empty redirect - var ssoConfigs = authModuleConfigs["sso"]; - if (ssoConfigs && (ssoConfigs["enabled"].toString() == "true") && !sessionDataKey) { - // SSO is enabled in Auth module. - var redirectUri = context.app.context + "/uuf/login"; - var queryString = request.getQueryString(); - if (queryString && (queryString.length > 0)) { - redirectUri = redirectUri + "?" + queryString; - } - response.sendRedirect(encodeURI(redirectUri)); - exit(); - } - - var viewModel = {}; - var loginActionUrl = context.app.context + "/uuf/login"; - if (sessionDataKey) { - loginActionUrl = "/commonauth"; - } - - if (authFailure) { - viewModel.message = "Login failed! Please recheck the username and password and try again."; - } - - viewModel.sessionDataKey = sessionDataKey; - viewModel.loginActionUrl = loginActionUrl; - return viewModel; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.json deleted file mode 100644 index 467bcc522b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.login-do/login-do.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0.0", - "layout": "uuf.layout.sign-in", - "uri": "/login.do", - "isAnonymous": true -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.hbs deleted file mode 100644 index db89a9d7bc..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.hbs +++ /dev/null @@ -1,32 +0,0 @@ -{{! - Copyright (c) 2018, 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. -}} -{{#zone "title"}}{{! to override parent page title }}{{/zone}} -{{unit "cdmf.unit.ui.title" pageTitle="Authentication Failed!"}} - -{{#zone "content"}} -
    -
    - -

    {{stat}}

    -
    -
    - {{statusMessage}} -
    -
    -
    -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.json deleted file mode 100644 index b66acf55c9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in.retry-do/retry-do.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0.0", - "layout": "uuf.layout.sign-in", - "uri": "/retry.do", - "isAnonymous": true -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.hbs deleted file mode 100644 index 104579406b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.hbs +++ /dev/null @@ -1,23 +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. -}} -{{#zone "title"}}{{! to override parent page title }}{{/zone}} -{{unit "cdmf.unit.ui.title" pageTitle="Login"}} - -{{#zone "content"}} - Redirecting, Please wait... -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.js deleted file mode 100644 index a300ba0785..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - response.sendRedirect(context.app.context + "/uuf/login"); -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.json deleted file mode 100644 index 91d4a819bd..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-in/sign-in.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0.0", - "layout": "uuf.layout.sign-in", - "uri": "/login", - "isAnonymous": true -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-out/sign-out.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-out/sign-out.json deleted file mode 100644 index 48f1ee4829..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.sign-out/sign-out.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/logout", - "extends": "uuf.page.sign-out" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/public/js/topic-listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/public/js/topic-listing.js deleted file mode 100644 index 568c2b80a3..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/public/js/topic-listing.js +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption(url) { - if (!$(".select-enable-btn").text() == "Select" && !$(this).hasClass("btn")) { - url = $(this).parent().data("url"); - $(location).attr('href', url); - } -} - -/* - * DOM ready functions. - */ -$(document).ready(function () { - - var permissionSet = {}; - $.setPermission = function (permission) { - permissionSet[permission] = true; - }; - - $.hasPermission = function (permission) { - return permissionSet[permission]; - }; - - name = getParameterByName("name"); - - /* for device list sorting drop down */ - $(".ctrl-filter-type-switcher").popover({ - html: true, - content: function () { - return $("#content-filter-types").html(); - } - }); -}); - -function loadTopics(searchType, searchParam) { - - var serviceURL; - if ($.hasPermission("VIEW_TOPICS")) { - serviceURL = "/api/mqtt-topics/v1.0/admin/topics"; - } else { - $("#loading-content").remove(); - $('#topics-table').addClass('hidden'); - $('#topics-listing-status-msg').text('Permission denied.'); - $("#topics-listing-status").removeClass(' hidden'); - return; - } - - var columns = [ - { - targets: 0, - data: 'localSubscribedQueueOrTopicName', - class: 'remove-padding-top viewEnabledIcon', - render: function (data, type, row, meta) { - return '
    '; - } - }, - { - targets: 1, - data: 'localSubscribedQueueOrTopicName', - class: 'remove-padding-top viewEnabledIcon', - }, - { - targets: 2, - data: 'localNumberOfMessagesRemainingForSubscriber', - class: 'remove-padding-top viewEnabledIcon', - }, - { - targets: 3, - data: 'localActive', - class: 'remove-padding-top viewEnabledIcon', - }, - { - targets: 4, - data: 'localDurable', - class: 'remove-padding-top viewEnabledIcon', - }, - { - targets: 5, - data: 'localSubscriberQueueName', - class: 'remove-padding-top viewEnabledIcon', - }, - { - targets: 6, - data: 'localSubscriptionIdentifier', - class: 'remove-padding-top viewEnabledIcon', - } - ]; - - var fnCreatedRow = function (row, data, dataIndex) { - $(row).attr('data-type', 'selectable'); - $(row).attr('localSubscribedQueueOrTopicName', htmlspecialchars(data.localSubscribedQueueOrTopicName)); - $(row).attr('localNumberOfMessagesRemainingForSubscriber', htmlspecialchars(data.localNumberOfMessagesRemainingForSubscriber)); - $(row).attr('data-url', context + '/device/' + htmlspecialchars(data.localSubscribedQueueOrTopicName) + '?id=' + htmlspecialchars(data.localNumberOfMessagesRemainingForSubscriber)); - - var topicName = htmlspecialchars(data.localSubscribedQueueOrTopicName); - var remainingMesgCount = htmlspecialchars(data.localNumberOfMessagesRemainingForSubscriber); - var isActive = htmlspecialchars(data.localActive); - var isDurable = htmlspecialchars(data.localDurable); - var localSubscriberQueueName = htmlspecialchars(data.localSubscriberQueueName); - var subscriptionIdentifier = htmlspecialchars(data.localSubscriptionIdentifier); - $.each($('td', row), function (colIndex) { - switch (colIndex) { - case 1: - $(this).attr('data-grid-label', "Topic Name"); - $(this).attr('data-search', topicName); - $(this).attr('data-display', topicName); - break; - case 2: - $(this).attr('data-grid-label', "Remaining Messages"); - $(this).attr('data-search', remainingMesgCount); - $(this).attr('data-display', remainingMesgCount); - break; - case 3: - $(this).attr('data-grid-label', "Active"); - $(this).attr('data-search', isActive); - $(this).attr('data-display', isActive); - break; - case 4: - $(this).attr('data-grid-label', "Durable"); - $(this).attr('data-search', isDurable); - $(this).attr('data-display', isDurable); - break; - case 5: - $(this).attr('data-grid-label', "Subscriber Queue Name"); - $(this).attr('data-search', localSubscriberQueueName); - $(this).attr('data-display', localSubscriberQueueName); - break; - case 6: - $(this).attr('data-grid-label', "SubscriptionIdentifier"); - $(this).attr('data-search', subscriptionIdentifier); - $(this).attr('data-display', subscriptionIdentifier); - break; - } - }); - }; - - function htmlspecialchars(text) { - return jQuery('
    ').text(text).html(); - } - - var dataFilter = function (data) { - data = JSON.parse(data); - var objects = []; - $(data.subscriptions).each(function (index) { - objects.push( - { - localSubscribedQueueOrTopicName: data.subscriptions[index].localSubscribedQueueOrTopicName, - localNumberOfMessagesRemainingForSubscriber: data.subscriptions[index].localNumberOfMessagesRemainingForSubscriber, - localActive: data.subscriptions[index].localActive, - localDurable: data.subscriptions[index].localDurable, - localSubscriberQueueName: data.subscriptions[index].localSubscriberQueueName, - localSubscriptionIdentifier: data.subscriptions[index].localSubscriptionIdentifier, - name: data.subscriptions[index].localSubscribedQueueOrTopicName - } - ); - }); - - var json = { - "recordsTotal": data.count, - "recordsFiltered": data.count, - "data": objects - }; - - return JSON.stringify(json); - }; - - $('#topics-grid').datatables_extended_serverside_paging( - null, - serviceURL, - dataFilter, - columns, - fnCreatedRow, - function () { - $(".icon .text").res_text(0.2); - $('#topics-grid').removeClass('hidden'); - $("#loading-content").remove(); - }, { - "placeholder": "Search By Topic Name", - "searchKey": "name" - } - ); -} - -/* - * DOM ready functions. - */ -$(document).ready(function () { - /* Adding selected class for selected devices */ - var permissionList = $("#permission").data("permission"); - for (var key in permissionList) { - if (permissionList.hasOwnProperty(key)) { - $.setPermission(key); - } - } - loadTopics(); - $(".dataTables_toolbar").css("display", "none"); - - /* for topic list sorting drop down */ - $(".ctrl-filter-type-switcher").popover({ - html: true, - content: function () { - return $("#content-filter-types").html(); - } - }); - - /* for data tables*/ - $('[data-toggle="tooltip"]').tooltip(); - - $("[data-toggle=popover]").popover(); - - $(".ctrl-filter-type-switcher").popover({ - html: true, - content: function () { - return $('#content-filter-types').html(); - } - }); - - $('#nav').affix({ - offset: { - top: $('header').height() - } - }); - -}); - -var modalPopup = ".modal"; -var modalPopupContainer = modalPopup + " .modal-content"; -var modalPopupContent = modalPopup + " .modal-content"; -var body = "body"; - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).modal('show'); -} - -/* - * hide popup function. - */ -function hidePopup() { - $(modalPopupContent).html(""); - $(modalPopupContent).removeClass("operation-data"); - $(modalPopup).modal('hide'); - $('body').removeClass('modal-open').css('padding-right', '0px'); - $('.modal-backdrop').remove(); -} - -function getParameterByName(name) { - name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); - var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), - results = regex.exec(location.search); - return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.hbs deleted file mode 100644 index e34956912d..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.hbs +++ /dev/null @@ -1,131 +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. -}}` -{{unit "cdmf.unit.ui.title" pageTitle="MQTT Dashboard"}} - -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.lib.ui-permissions-utility"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - Dashboard - -
  • -
  • - - MQTT - -
  • -{{/zone}} - - -{{#zone "content"}} -
    -
    -
    -
    - -
    - - Loading subscriptions . . . -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    - -
    -
    -
    -{{/zone}} - -{{#zone "bottomJs"}} - - {{js "js/topic-listing.js"}} -{{/zone}} - -{{#zone "topCss"}} - -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.js deleted file mode 100644 index df6a76b512..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var constants = require("/app/modules/constants.js"); - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; - var groupModule = require("/app/modules/business-controllers/group.js")["groupModule"]; - - var groupId = request.getParameter("groupId"); - - var viewModel = {}; - var title = "Topics"; - viewModel.title = title; - var currentUser = session.get(constants.USER_SESSION_KEY); - if (currentUser) { - viewModel.permissions = {}; - var uiPermissions = userModule.getUIPermissions(); - viewModel.permissions.list = stringify(uiPermissions); - if (uiPermissions.VIEW_TOPICS) { - viewModel.permissions.enroll = true; - } - viewModel.currentUser = currentUser; - var deviceCount = 1; - viewModel.deviceCount = deviceCount; - var utility = require("/app/modules/utility.js").utility; - } - return viewModel; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.json deleted file mode 100644 index a7f2976443..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.topic/topic.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/topics", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.hbs deleted file mode 100644 index 6dc712ad2c..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.hbs +++ /dev/null @@ -1,154 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="User Management | Add User"}} -{{unit "cdmf.unit.ui.modal"}} -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Users - -
  • -
  • - - Add - -
  • -{{/zone}} - -{{#zone "content"}} - {{#if canManage}} - -
    -
    - -
    -
    -

    Add User

    -

    Please note that * sign represents required fields of data.

    -
    -
    -
    - - -
    - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - - -
    - {{#if canViewRoles}} - -
    - -
    - {{/if}} -
    -
    -
    - -
    -
    - - - - -
    -
    - {{else}} -

    - Permission Denied -

    -
    - You not authorized to enter User Management Section. -
    - {{/if}} -{{/zone}} - -{{#zone "bottomJs"}} - {{js "js/bottomJs.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.js deleted file mode 100644 index 09861e8564..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Returns the dynamic state to be populated by add-user page. - * @returns {*} A context object that returns the dynamic state of this page to be presented - */ -function onRequest() { - //var log = new Log("/app/pages/cdmf.page.user.create server-side js"); - - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - - var page = {}; - var response = userModule.getRolesByUserStore("PRIMARY"); - if (response["status"] == "success") { - page["roles"] = response["content"]; - } - - if (userModule.isAuthorized("/permission/admin/device-mgt/users/manage")) { - page.canManage = true; - } - if (userModule.isAuthorized("/permission/admin/device-mgt/roles/view")) { - page.canViewRoles = true; - } - var userStores = userModule.getSecondaryUserStores(); - page["userStores"] = userStores; - page["charLimit"] = devicemgtProps["userValidationConfig"]["usernameLength"]; - page["usernameJSRegEx"] = devicemgtProps["userValidationConfig"]["usernameJSRegEx"]; - page["usernameHelpMsg"] = devicemgtProps["userValidationConfig"]["usernameHelpMsg"]; - page["usernameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["usernameRegExViolationErrorMsg"]; - page["firstnameJSRegEx"] = devicemgtProps["userValidationConfig"]["firstnameJSRegEx"]; - page["firstnameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["firstnameRegExViolationErrorMsg"]; - page["lastnameJSRegEx"] = devicemgtProps["userValidationConfig"]["lastnameJSRegEx"]; - page["lastnameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["lastnameRegExViolationErrorMsg"]; - page["enrollmentURL"] = devicemgtProps["generalConfig"]["host"] + devicemgtProps["enrollmentDir"]; - - return page; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.json deleted file mode 100644 index f13f2d4902..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/create.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/user/add", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/public/js/bottomJs.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/public/js/bottomJs.js deleted file mode 100644 index ad6f25f51e..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.create/public/js/bottomJs.js +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -var validateInline = {}; -var clearInline = {}; -var deviceMgtAPIsBasePath = "/api/device-mgt/v1.0"; - -var enableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).addClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).removeClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).removeClass(" hidden"); - } -}; - -var disableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).removeClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).addClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).addClass(" hidden"); - } -}; - -/** - * Validate if provided username is valid against RegEx configures. - */ -validateInline["user-name"] = function () { - var usernameInput = $("input#username"); - if (inputIsValid(usernameInput.data("regex"), usernameInput.val())) { - disableInlineError("usernameInputField", "usernameEmpty", "usernameError"); - } else { - enableInlineError("usernameInputField", "usernameEmpty", "usernameError"); - } -}; - -/** - * Validate if provided first name is valid against RegEx configures. - */ -validateInline["first-name"] = function () { - var firstnameInput = $("input#firstname"); - if (firstnameInput.val()) { - disableInlineError("firstNameField", "fnError"); - } else { - enableInlineError("firstNameField", "fnError"); - } -}; - -/** - * Validate if provided last name is valid against RegEx configures. - */ -validateInline["last-name"] = function () { - var lastnameInput = $("input#lastname"); - if (lastnameInput.val()) { - disableInlineError("lastNameField", "lnError"); - } else { - enableInlineError("lastNameField", "lnError"); - } -}; - -/** - * Checks if provided email address is valid against - * the email format. - */ -validateInline["emailAddress"] = function () { - var email = $("#emailAddress").val(); - if (!email) { - enableInlineError("emailField", "email-required", "emailError"); - } else if (emailIsValid(email)) { - disableInlineError("emailField", "email-required", "emailError"); - disableInlineError("emailField", "email-invalid", "emailError"); - } else { - enableInlineError("emailField", "email-invalid", "emailError"); - } -}; - -/** - * clear Validation messages when gain focus to the field. - */ -clearInline["user-name"] = function () { - disableInlineError("usernameInputField", "usernameEmpty", "usernameError"); -}; - -/** - * clear Validation messages when gain focus to the field. - */ -clearInline["first-name"] = function () { - disableInlineError("firstNameField", "fnError"); -}; - -/** - * clear Validation messages when gain focus to the field. - */ -clearInline["last-name"] = function () { - disableInlineError("lastNameField", "lnError"); -}; - - -/** - * clear Validation messages when gain focus to the field. - */ -clearInline["emailAddress"] = function () { - disableInlineError("emailField", "email-required", "emailError"); - disableInlineError("emailField", "email-invalid", "emailError"); -}; - -/** - * Checks if an email address has the valid format or not. - * - * @param email Email address - * @returns {boolean} true if email has the valid format, otherwise false. - */ -function emailIsValid(email) { - var regExp = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; - return regExp.test(email); -} - -/* - * QR-code generation function. - */ -function generateQRCode(qrCodeClass) { - var enrollmentURL = $("#qr-code-modal").data("enrollment-url"); - $(qrCodeClass).qrcode({ - text: enrollmentURL, - width: 200, - height: 200 - }); -} - -$("#userStore").change( - function () { - var str = ""; - $("select option:selected").each(function () { - str += $(this).text() + ""; - }); - if ($("#roles").length > 0) { - var getRolesAPI = deviceMgtAPIsBasePath + "/roles?user-store=" + encodeURIComponent(str) + "&limit=100"; - invokerUtil.get( - getRolesAPI, - function (data) { - data = JSON.parse(data); - if (data.errorMessage) { - $(errorMsg).text("Selected user store prompted an error : " + data.errorMessage); - $(errorMsgWrapper).removeClass("hidden"); - } else { - $("#roles").empty(); - for (var i = 0; i < data.roles.length; i++) { - var newOption = $(''); - $('#roles').append(newOption); - } - } - }, - function (jqXHR) { - - } - ); - - } - }).change(); - -$(document).ready(function () { - $("#emailValidationText").hide(); - $("select.select2[multiple=multiple]").select2({ - tags: false - }); - - /** - * Following click function would execute - * when a user clicks on "Add User" button - * on Add User page in WSO2 Devicemgt Console. - */ - $("button#add-user-btn").click(function () { - - var usernameInput = $("input#username"); - var firstnameInput = $("input#firstname"); - var lastnameInput = $("input#lastname"); - var charLimit = parseInt($("input#username").attr("limit")); - var domain = $("#userStore").val(); - var username = usernameInput.val().trim(); - var firstname = firstnameInput.val(); - var lastname = lastnameInput.val(); - var emailAddress = $("input#emailAddress").val(); - var roles; - if ($("#roles").length > 0) { - roles = $("select#roles").val(); - } - var errorMsgWrapper = "#user-create-error-msg"; - var errorMsg = "#user-create-error-msg span"; - if (!username) { - $(errorMsg).text("Username is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(usernameInput.data("regex"), username)) { - $(errorMsg).text(usernameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!firstname) { - $(errorMsg).text("Firstname is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(firstnameInput.data("regex"), firstname)) { - $(errorMsg).text(firstnameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!lastname) { - $(errorMsg).text("Lastname is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(lastnameInput.data("regex"), lastname)) { - $(errorMsg).text(lastnameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!emailAddress) { - $(errorMsg).text("Email is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!emailIsValid(emailAddress)) { - $(errorMsg).text("Provided email is invalid."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!roles) { - $(errorMsg).text("Role is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else { - var addUserFormData = {}; - - addUserFormData.username = domain + "/" + username; - addUserFormData.firstname = firstname; - addUserFormData.lastname = lastname; - addUserFormData.emailAddress = emailAddress; - addUserFormData.roles = roles; - - var addUserAPI = deviceMgtAPIsBasePath + "/users"; - - invokerUtil.post( - addUserAPI, - addUserFormData, - function (data, textStatus, jqXHR) { - if (jqXHR.status == 201) { - var response = JSON.parse(data); - // Clearing user input fields. - $("input#username").val(""); - $("input#firstname").val(""); - $("input#lastname").val(""); - $("input#email").val(""); - if ($("#roles").length > 0) { - $("select#roles").select2("val", ""); - } - // Refreshing with success message - $("#user-create-form").addClass("hidden"); - modalDialog.header('' + - ' User was added successfully'); - if (response.message) { - $("#modal-content-user-created-with-message").append("

    " + response.message + "

    "); - modalDialog.content($("#modal-content-user-created-with-message").html()); - } else { - modalDialog.content($("#modal-content-user-created").html()); - } - modalDialog.footer('
    ' + - ' OK' + - '
    '); - modalDialog.show(); - generateQRCode("#user-created-msg .qr-code"); - - } - }, function (data) { - var payload = JSON.parse(data.responseText); - if (data.status == 409) { - $(errorMsg).text("User : " + username + " already exists. Pick another username."); - } else if (data.status == 500) { - $(errorMsg).text("An unexpected error occurred at backend server. Please try again later."); - } else { - $(errorMsg).text(payload.message); - } - $(errorMsgWrapper).removeClass("hidden"); - } - ); - } - }); - - $("#username").focus(function () { - clearInline["user-name"](); - }); - - $("#username").blur(function () { - validateInline["user-name"](); - }); - - $("#emailAddress").focus(function () { - clearInline["emailAddress"](); - }); - - $("#emailAddress").blur(function () { - validateInline["emailAddress"](); - }); - - $("#lastname").focus(function () { - clearInline["last-name"](); - }); - - $("#lastname").blur(function () { - validateInline["last-name"](); - }); - - $("#firstname").focus(function () { - clearInline["first-name"](); - }); - - $("#firstname").blur(function () { - validateInline["first-name"](); - }); -}); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.hbs deleted file mode 100644 index 41728ad0a8..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.hbs +++ /dev/null @@ -1,146 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="User Management | Edit User"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Users - -
  • -
  • - - Edit - -
  • -{{/zone}} - -{{#zone "content"}} - {{#if canManage}} - -
    -
    - -
    -
    -

    Edit User

    -

    Please note that * sign represents required fields of data.

    -
    -
    -
    - - -
    - -
    - -
    - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - - -
    - {{#if canViewRoles}} - -
    - -
    - {{/if}} -
    -
    -
    - -
    -
    - - -
    -
    - - {{else}} -

    - Permission Denied -

    -
    - You not authorized to enter User Management Section. -
    - {{/if}} - -{{/zone}} - -{{#zone "bottomJs"}} - {{js "js/bottomJs.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.js deleted file mode 100644 index 5d067bac11..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.js +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest() { - var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - - var userName = request.getParameter("username"); - var user = userModule.getUser(userName)["content"]; - - if (user) { - var title; - if (user.firstname && user.lastname) { - title = user.firstname + " " + user.lastname; - } else { - title = user.username; - } - var page = {"user": user, "title": title}; - - var userStore = "PRIMARY"; - if (userName.indexOf("/") > -1) { - userStore = userName.substr(0, userName.indexOf('/')); - } - page["userStore"] = userStore; - - var response = userModule.getUser(userName); - - if (response["status"] == "success") { - page["editUser"] = response["content"]; - } - - response = userModule.getRolesByUsername(userName); - var rolesByUsername; - if (response["status"] == "success") { - rolesByUsername = response["content"]; - } - - response = userModule.getRolesByUserStore(userStore); - var rolesByUserStore; - if (response["status"] == "success") { - rolesByUserStore = response["content"]; - } - - page["rolesByUsername"] = rolesByUsername; - page["rolesByUserStore"] = rolesByUserStore; - } - - if (userModule.isAuthorized("/permission/admin/device-mgt/users/manage")) { - page.canManage = true; - } - if (userModule.isAuthorized("/permission/admin/device-mgt/roles/view")) { - page.canViewRoles = true; - } - - page["usernameJSRegEx"] = devicemgtProps["userValidationConfig"]["usernameJSRegEx"]; - page["usernameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["usernameRegExViolationErrorMsg"]; - page["firstnameJSRegEx"] = devicemgtProps["userValidationConfig"]["firstnameJSRegEx"]; - page["firstnameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["firstnameRegExViolationErrorMsg"]; - page["lastnameJSRegEx"] = devicemgtProps["userValidationConfig"]["lastnameJSRegEx"]; - page["lastnameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["lastnameRegExViolationErrorMsg"]; - - return page; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.json deleted file mode 100644 index cfa389ca80..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/edit.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/user/edit", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/public/js/bottomJs.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/public/js/bottomJs.js deleted file mode 100644 index 5d26f65ff4..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.edit/public/js/bottomJs.js +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -//holds the list of inline validation methods -var validateInline = {}; -var clearInline = {}; - -var deviceMgtBasePath = "/api/device-mgt/v1.0"; - -var enableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).addClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).removeClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).removeClass(" hidden"); - } -}; - -var disableInlineError = function (inputField, errorMsg, errorSign) { - var fieldIdentifier = "#" + inputField; - var errorMsgIdentifier = "#" + inputField + " ." + errorMsg; - var errorSignIdentifier = "#" + inputField + " ." + errorSign; - - if (inputField) { - $(fieldIdentifier).removeClass(" has-error has-feedback"); - } - - if (errorMsg) { - $(errorMsgIdentifier).addClass(" hidden"); - } - - if (errorSign) { - $(errorSignIdentifier).addClass(" hidden"); - } -}; - -/** - * Validate if provided username is valid against RegEx configures. - */ -validateInline["user-name"] = function () { - var usernameinput = $("input#username"); - if (inputIsValid(usernameinput.data("regex"), usernameinput.val())) { - disableInlineError("usernameInputField", "usernameEmpty", "usernameError"); - } else { - enableInlineError("usernameInputField", "usernameEmpty", "usernameError"); - } -}; - -/** - * Validate if provided first name is valid against RegEx configures. - */ -validateInline["first-name"] = function () { - var firstnameinput = $("input#firstname"); - if (firstnameinput.val()) { - disableInlineError("firstNameField", "fnError"); - } else { - enableInlineError("firstNameField", "fnError"); - } -}; - -/** - * Validate if provided last name is valid against RegEx configures. - */ -validateInline["last-name"] = function () { - var lastnameinput = $("input#lastname"); - if (lastnameinput.val()) { - disableInlineError("lastNameField", "lnError"); - } else { - enableInlineError("lastNameField", "lnError"); - } -}; - -/** - * Checks if provided email address is valid against - * the email format. - */ -validateInline["emailAddress"] = function () { - var email = $("#emailAddress").val(); - if (!email) { - enableInlineError("emailField", "email-required", "emailError"); - } else if (emailIsValid(email)) { - disableInlineError("emailField", "email-required", "emailError"); - disableInlineError("emailField", "email-invalid", "emailError"); - } else { - enableInlineError("emailField", "email-invalid", "emailError"); - } -}; - -/** - * clear Validation messages when gain focus to the field. - */ -clearInline["user-name"] = function () { - disableInlineError("usernameInputField", "usernameEmpty", "usernameError"); -}; - -/** - * clear Validation messages when gain focus to the field. - */ -clearInline["first-name"] = function () { - disableInlineError("firstNameField", "fnError"); -}; - -/** - * clear Validation messages when gain focus to the field. - */ -clearInline["last-name"] = function () { - disableInlineError("lastNameField", "lnError"); -}; - - -/** - * clear Validation messages when gain focus to the field. - */ -clearInline["emailAddress"] = function () { - disableInlineError("emailField", "email-required", "emailError"); - disableInlineError("emailField", "email-invalid", "emailError"); -}; - -/** - * Checks if an email address has the valid format or not. - * - * @param email Email address - * @returns {boolean} true if email has the valid format, otherwise false. - */ -function emailIsValid(email) { - var regExp = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; - return regExp.test(email); -} - -$(document).ready(function () { - $("#emailValidationText").hide(); - $("select.select2[multiple=multiple]").select2({ - tags: false - }); - var roleList, roleArr; - if ($("#roles").length > 0) { - roleList = $("#roles").attr("selectedVals").trim().replace(/ /g, ""); - roleList = roleList.replace(/(\r\n|\n|\r)/gm, ""); - roleArr = roleList.split(","); - } - - if ($("#roles").length > 0) { - $("#roles").val(roleArr).trigger("change"); - } - /** - * Following click function would execute - * when a user clicks on "Add User" button - * on Add User page in WSO2 Devicemgt Console. - */ - $("button#add-user-btn").click(function () { - var usernameInput = $("input#username"); - var firstnameInput = $("input#firstname"); - var lastnameInput = $("input#lastname"); - // var charLimit = parseInt($("input#username").attr("limit")); - var domain = $("#userStore").val(); - var username = usernameInput.val().trim(); - var firstname = firstnameInput.val(); - var lastname = lastnameInput.val(); - var emailAddress = $("input#emailAddress").val(); - var roles; - if ($("#roles").length > 0) { - var roles = $("select#roles").val(); - } - var errorMsgWrapper = "#user-create-error-msg"; - var errorMsg = "#user-create-error-msg span"; - if (!username) { - $(errorMsg).text("Username is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(usernameInput.data("regex"), username)) { - $(errorMsg).text(usernameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!firstname) { - $(errorMsg).text("Firstname is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(firstnameInput.data("regex"), firstname)) { - $(errorMsg).text(firstnameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!lastname) { - $(errorMsg).text("Lastname is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(lastnameInput.data("regex"), lastname)) { - $(errorMsg).text(lastnameInput.data("errormsg")); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!emailAddress) { - $(errorMsg).text("Email is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!emailIsValid(emailAddress)) { - $(errorMsg).text("Provided email is invalid."); - $(errorMsgWrapper).removeClass("hidden"); - } else { - var addUserFormData = {}; - - addUserFormData.username = domain + "/" + username; - addUserFormData.firstname = firstname; - addUserFormData.lastname = lastname; - addUserFormData.emailAddress = emailAddress; - - if (!roles) { - roles = []; - } - addUserFormData.roles = roles; - username = username.substr(username.indexOf('/') + 1); - var addUserAPI = deviceMgtBasePath + "/users/" + encodeURIComponent(username) + "?domain=" + - encodeURIComponent(domain); - - invokerUtil.put( - addUserAPI, - addUserFormData, - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200) { - // Clearing user input fields. - // Refreshing with success message - $("#user-create-form").addClass("hidden"); - $("#user-created-msg").removeClass("hidden"); - setTimeout(function () { - window.location.href = "/devicemgt/users" - }, 1000); - - } - }, function (jqXHR) { - var payload = JSON.parse(jqXHR.responseText); - if (jqXHR.status == 409) { - $(errorMsg).text("User : " + username + " doesn't exists. You cannot proceed."); - } else if (jqXHR.status == 500) { - $(errorMsg).text("An unexpected error occurred at backend server. Please try again later."); - } else { - $(errorMsg).text(payload.message); - } - $(errorMsgWrapper).removeClass("hidden"); - } - ); - } - }); - - $("#emailAddress").focus(function () { - clearInline["emailAddress"](); - }); - - $("#emailAddress").blur(function () { - validateInline["emailAddress"](); - }); - - $("#lastname").focus(function () { - clearInline["last-name"](); - }); - - $("#lastname").blur(function () { - validateInline["last-name"](); - }); - - $("#firstname").focus(function () { - clearInline["first-name"](); - }); - - $("#firstname").blur(function () { - validateInline["first-name"](); - }); -}); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.hbs deleted file mode 100644 index fb9420eb52..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.hbs +++ /dev/null @@ -1,218 +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. -}} -{{unit "cdmf.unit.ui.title" pageTitle="User Management"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - Users - -
  • -
  • - - {{user.username}} - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#if canEdit}} -
  • - - - - - - Edit - -
  • - {{/if}} -{{/zone}} - -{{#zone "content"}} - {{#if canView}} - {{#if exists}} - {{#zone "contentTitle"}} -
    -
    - -
    -
    - {{/zone}} - -
    -
    -
    -
    -
    -
    - - {{#unless isCloud}} - {{#if editPermitted}} - - {{/if}} - {{/unless}} -
    -
    -
    -
    Profile Overview -
    - {{#defineZone "user-detail-properties"}} - - - - - - - - - - - - - - - - - - - - - - - -
    Username{{user.username}}
    First Name{{user.firstname}}
    Last Name{{user.lastname}}
    Email{{user.emailAddress}}
    Roles - {{#each userRoles}} - - {{/each}} -
    - {{/defineZone}} -
    -
    -
    -
    - -
    - {{#defineZone "user-enrolled-devices"}} -
    -
    -
    -
    Enrolled Devices by - {{#if user.firstname}} - {{user.firstname}} {{user.lastname}} - {{else}} - {{user.username}} - {{/if}} -
    -
    -
    -
    - {{#each devices}} -
    - -
    -
    - -
    - -
    -
    - -

    {{name}}

    -
    -
    -
    -
    - -
    -
    -
    - {{/each}} -
    -
    -
    -
    -
    -
    -
    - {{/defineZone}} -
    -
    - {{else}} -
    -
    -

    User not found.

    -
    Please click "Add A New User", if you wish to add user or click - "View User List" to navigate to the user list. -
    - - - - - - - Add Another User - -
    -
    - {{/if}} - {{else}} -

    - Permission Denied -

    -
    - You not authorized to enter User Management Section. -
    - {{/if}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.js deleted file mode 100644 index c308e39f1e..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - var isExsistingUser = false; - var userName = request.getParameter("username"); - - var user, userRoles, devices; - - if (userName) { - var response = userModule.getUser(userName); - - if (response["status"] == "success") { - user = response["content"]; - user.domain = response["userDomain"]; - isExsistingUser = true; - } - - response = userModule.getRolesByUsername(userName); - if (response["status"] == "success") { - userRoles = response["content"]; - } - var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; - devices = deviceModule.getDevices(userName); - } - - var canView = false; - if (userModule.isAuthorized("/permission/admin/device-mgt/users/view")) { - canView = true; - } - - var canEdit = false; - if (userModule.isAuthorized("/permission/admin/device-mgt/users/edit") && - userName !== deviceMgtProps['adminUser'].split("@")[0]) { - canEdit = true; - } - - var isCloud = deviceMgtProps.isCloud; - - return {"exists": isExsistingUser, "user": user, "userRoles": userRoles, "devices": devices, "canEdit": canEdit, - "canView": canView, "isCloud" : isCloud}; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.json deleted file mode 100644 index dada092ce4..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.user.view/view.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/user/view", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/js/listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/js/listing.js deleted file mode 100644 index 3d800fe736..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/js/listing.js +++ /dev/null @@ -1,460 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/** - * Checks if provided input is valid against RegEx input. - * - * @param regExp Regular expression - * @param inputString Input string to check - * @returns {boolean} Returns true if input matches RegEx - */ -function inputIsValid(regExp, inputString) { - regExp = new RegExp(regExp); - return regExp.test(inputString); -} - -$(function () { - var sortableElem = '.wr-sortable'; - $(sortableElem).sortable({ - beforeStop: function () { - $(this).sortable('toArray'); - } - }); - $(sortableElem).disableSelection(); -}); - -var apiBasePath = "/api/device-mgt/v1.0"; -var body = "body"; - -/** - * - * Fires the res_text when ever a data table redraw occurs making - * the font icons change the size to respective screen resolution. - * - */ -$(document).on('draw.dt', function () { - $(".icon .text").res_text(0.2); -}); - -/** - * Following click function would execute - * when a user clicks on "Invite" link - * on User Management page in WSO2 MDM Console. - */ -$("a#invite-user-link").click(function () { - var usernameList = getSelectedUsernames(); - var inviteUserAPI = apiBasePath + "/users/send-invitation"; - - if (usernameList.length == 0) { - modalDialog.header("Operation cannot be performed !"); - modalDialog.content("Please select a user or a list of users to send invitation emails."); - modalDialog.footer(''); - modalDialog.showAsError(); - } else { - modalDialog.header(""); - modalDialog.content("An invitation mail will be sent to the selected user(s) to initiate an enrolment " + - "process. Do you wish to continue ?"); - modalDialog.footer('
    yes' + - 'No
    '); - modalDialog.show(); - - } - - $("a#invite-user-yes-link").click(function () { - invokerUtil.post( - inviteUserAPI, - usernameList, - function () { - modalDialog.header("User invitation email for enrollment was successfully sent."); - modalDialog.content(""); - modalDialog.footer(''); - $("a#invite-user-success-link").click(function () { - modalDialog.hide(); - }); - }, - function (data) { - var msg = JSON.parse(data.responseText); - modalDialog.header(' Unexpected Error !'); - modalDialog.content(msg.message); - modalDialog.footer(''); - $("a#invite-user-error-link").click(function () { - modalDialog.hide(); - }); - } - ); - }); - - $("a#invite-user-cancel-link").click(function () { - modalDialog.hide(); - }); -}); - -/* - * Function to get selected usernames. - */ -function getSelectedUsernames() { - const tbl = $('#user-grid').DataTable(); - let usernameList = []; - let userList = $("#user-grid").find("tr.DTTT_selected"); - userList.each(function (idx, el) { - usernameList.push(tbl.row(el).data().username); - }); - return usernameList; -} - -/** - * Following click function would execute - * when a user clicks on "Reset Password" link - * on User Listing page in WSO2 MDM Console. - */ -function resetPassword(username) { - modalDialog.header(' Reset Password'); - modalDialog.content($("#modal-content-reset-password").html()); - modalDialog.footer(''); - modalDialog.show(); - - $("a#reset-password-yes-link").click(function () { - var newPassword = $("#basic-modal-view .new-password").val(); - var confirmedPassword = $("#basic-modal-view .confirmed-password").val(); - var errorMsgWrapper = ".modal #notification-error-msg"; - var errorMsg = ".modal #notification-error-msg span"; - if (!newPassword) { - $(errorMsg).text("New password is a required field. It cannot be empty."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!confirmedPassword) { - $(errorMsg).text("Retyping the new password is required."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (confirmedPassword != newPassword) { - $(errorMsg).text("New password doesn't match the confirmation."); - $(errorMsgWrapper).removeClass("hidden"); - } else if (!inputIsValid(/^[\S]{5,30}$/, confirmedPassword)) { - $(errorMsg).text("Password should be minimum 5 characters long, should not include any whitespaces."); - $(errorMsgWrapper).removeClass("hidden"); - } else { - var resetPasswordFormData = {}; - resetPasswordFormData.newPassword = unescape(confirmedPassword); - var domain; - if (username.indexOf('/') > 0) { - domain = username.substr(0, username.indexOf('/')); - username = username.substr(username.indexOf('/') + 1); - } - var resetPasswordServiceURL = apiBasePath + "/admin/users/" + encodeURIComponent(username) + "/credentials"; - if (domain) { - resetPasswordServiceURL += '?domain=' + encodeURIComponent(domain); - } - invokerUtil.post( - resetPasswordServiceURL, - resetPasswordFormData, - // The success callback - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200) { - modalDialog.header("Password reset is successful."); - modalDialog.content(""); - modalDialog.footer('
    Ok
    '); - } - }, - // The error callback - function (jqXHR) { - var payload = JSON.parse(jqXHR.responseText); - $(errorMsg).text(payload.message); - $(errorMsgWrapper).removeClass("hidden"); - } - ); - } - }); - - $("a#reset-password-cancel-link").click(function () { - modalDialog.hide(); - }); -} - -/** - * Following click function would execute - * when a user clicks on "Remove" link - * on User Listing page in WSO2 MDM Console. - */ -function removeUser(username) { - var domain; - if (username.indexOf('/') > 0) { - domain = username.substr(0, username.indexOf('/')); - username = username.substr(username.indexOf('/') + 1); - } - var removeUserAPI = apiBasePath + "/users/" + encodeURIComponent(username); - if (domain) { - removeUserAPI += '?domain=' + encodeURIComponent(domain); - } - modalDialog.header("Remove User"); - modalDialog.content("Do you really want to remove this user ?"); - modalDialog.footer('
    Remove ' + - 'Cancel
    '); - modalDialog.showAsAWarning(); - - $("a#remove-user-cancel-link").click(function () { - modalDialog.hide(); - }); - - $("a#remove-user-yes-link").click(function () { - invokerUtil.delete( - removeUserAPI, - function (data, textStatus, jqXHR) { - if (jqXHR.status == 200) { - if (domain) { - username = domain + '/' + username; - } - $('[id="user-' + username + '"]').remove(); - // update modal-content with success message - modalDialog.header("User Removed."); - modalDialog.content("Done. User was successfully removed."); - modalDialog.footer('
    Ok
    '); - - } - }, - function () { - modalDialog.hide(); - modalDialog.header("Operation cannot be performed !"); - modalDialog.content("An unexpected error occurred. Please try again later."); - modalDialog.footer('
    Ok
    '); - modalDialog.showAsError(); - } - ); - }); - -} - -/** - * Following function would execute - * when a user clicks on the list item - * initial mode and with out select mode. - */ -function InitiateViewOption() { - if ($("#can-view").val()) { - $(location).attr('href', $(this).data("url")); - } else { - modalDialog.header("Unauthorized action!"); - modalDialog.content("You don't have permissions to view users"); - modalDialog.footer('
    Ok
    '); - modalDialog.showAsError(); - } -} - -function htmlspecialchars(text){ - return jQuery('
    ').text(text).html(); -} - -function loadUsers() { - var loadingContentView = "#loading-content"; - $(loadingContentView).show(); - - var dataFilter = function (data) { - data = JSON.parse(data); - - var objects = []; - - $(data.users).each(function (index) { - objects.push({ - username: htmlspecialchars(data.users[index].username), - firstName: htmlspecialchars(data.users[index].firstname) ? htmlspecialchars(data.users[index].firstname) : "", - lastName: htmlspecialchars(data.users[index].lastname) ? htmlspecialchars(data.users[index].lastname) : "", - emailAddress: htmlspecialchars(data.users[index].emailAddress) ? htmlspecialchars(data.users[index].emailAddress) : "", - namePattern: htmlspecialchars(data.users[index].firstname) + ' ' + htmlspecialchars(data.users[index].lastname), - DT_RowId: "user-" + htmlspecialchars(data.users[index].username) - }) - }); - - var json = { - "recordsTotal": data.count, - "recordsFiltered": data.count, - "data": objects - }; - - return JSON.stringify(json); - }; - - //noinspection JSUnusedLocalSymbols - var fnCreatedRow = function (nRow, aData, iDataIndex) { - var adminUser = $("#user-table").data("user"); - if (adminUser !== aData["filter"]) { - $(nRow).attr('data-type', 'selectable'); - } - $(nRow).attr('data-username', aData["filter"]); - }; - - //noinspection JSUnusedLocalSymbols - var columns = [ - { - targets: 0, - class: "remove-padding icon-only content-fill", - data: 'username', - render: function (username, type, row, meta) { - return '
    ' + - '' + - '
    '; - } - }, - { - targets: 1, - class: "", - data: 'namePattern', - render: function (namePattern, type, row, meta) { - if (!namePattern) { - return ""; - } else { - return "

    " + namePattern + "

    "; - } - } - }, - { - targets: 2, - class: "remove-padding-top", - data: 'username', - render: function (username, type, row, meta) { - return '' + username; - } - }, - { - targets: 3, - class: "hidden", - data: 'firstName', - render: function (firstName, type, row, meta) { - if (!firstName) { - return ""; - } else if (firstName) { - return "

    " + firstName + "

    "; - } - } - }, - { - targets: 4, - class: "hidden", - data: 'lastName', - render: function (lastName, type, row, meta) { - if (!lastName) { - return ""; - } else if (lastName) { - return "

    " + lastName + "

    "; - } - } - }, - { - targets: 5, - class: "remove-padding-top", - data: 'emailAddress', - render: function (emailAddress, type, row, meta) { - if (!emailAddress) { - return ""; - } else { - return "" + emailAddress + ""; - } - } - }, - { - targets: 6, - class: "text-right content-fill text-left-on-grid-view no-wrap tooltip-overflow-fix", - data: null, - render: function (data, type, row, meta) { - var editbtn = ' ' + - ' ' + - '' + - '' + - ''; - - var resetPasswordbtn = '' + - '' + - '' + - '' + - ''; - - var removebtn = '' + - '' + - '' + - '' + - ''; - - var returnbtnSet = ''; - var adminUser = $("#user-table").data("user"); - var currentUser = $("#user-table").data("logged-user"); - if ($("#can-edit").length > 0 && adminUser !== data.username) { - returnbtnSet = returnbtnSet + editbtn; - } - if ($("#can-reset-password").length > 0 && adminUser !== data.username) { - returnbtnSet = returnbtnSet + resetPasswordbtn; - } - if ($("#can-remove").length > 0 && adminUser !== data.username && currentUser !== data.username) { - returnbtnSet = returnbtnSet + removebtn; - } - - return returnbtnSet; - } - } - ]; - - var options = { - "placeholder": "Search By Username", - "searchKey": "filter" - }; - - var settings = { - "sorting": false - }; - - $('#user-grid').datatables_extended_serverside_paging( - settings, - '/api/device-mgt/v1.0/users/search', - dataFilter, - columns, - fnCreatedRow, - null, - options - ); - - $(loadingContentView).hide(); - -} - -$(document).ready(function () { - loadUsers(); - - $(function () { - $('[data-toggle="tooltip"]').tooltip() - }); - - if (!$("#can-invite").val()) { - $("#invite-user-button").remove(); - } - - $("#user-grid_filter").hide(); - -}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/templates/listing.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/templates/listing.hbs deleted file mode 100644 index 3fc0078c99..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/templates/listing.hbs +++ /dev/null @@ -1,67 +0,0 @@ -{{#each users}} - - -
    - -
    - - -

    {{firstname}} {{lastname}}

    - - {{username}} - - - {{emailAddress}} - - - - {{#unequal adminUser username }} - {{#if canEdit}} - - - - - - - - {{/if}} - {{/unequal}} - - {{#unequal adminUser username }} - {{#if canRemove}} - - - - - - - - {{/if}} - {{/unequal}} - - {{#unequal adminUser username }} - {{#if canResetPassword}} - - - - - - - - - - - - - {{/if}} - {{/unequal}} - - -{{/each}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.hbs deleted file mode 100644 index 34071d41b9..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.hbs +++ /dev/null @@ -1,158 +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. -}} - -{{unit "cdmf.unit.ui.title" pageTitle="User Management"}} -{{unit "cdmf.unit.data-tables-extended"}} -{{unit "cdmf.unit.ui.modal"}} - -{{#zone "breadcrumbs"}} -
  • - - - -
  • -
  • - - - USERS - -
  • -{{/zone}} - -{{#zone "navbarActions"}} - {{#unless isCloud}} -
  • - - - - - - - Add User - -
  • - {{/unless}} -{{/zone}} - -{{#zone "content"}} - - -
    - {{#unless isCloud}} - {{#if canManage}} - - - - - {{/if}} - {{/unless}} - {{#if canView}} - - {{/if}} - - - Loading users . . . -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    By UsernameBy First NameBy Last NameBy Email
    -
    - - - - - -{{/zone}} -{{#zone "common-navigation"}} - -{{/zone}} -{{#zone "bottomJs"}} - - - {{js "js/listing.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.js deleted file mode 100644 index 58711710f7..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -function onRequest(context) { - context.handlebars.registerHelper('unequal', function (lvalue, rvalue, options) { - if (arguments.length < 3) - throw new Error("Handlebars Helper equal needs 2 parameters"); - if (lvalue == rvalue) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - var page = {}; - var userModule = require("/app/modules/business-controllers/user.js")["userModule"]; - var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; - - page["currentUser"] = userModule.getCarbonUser().username; - page["adminUser"] = deviceMgtProps["adminUser"].split("@")[0]; - page["isCloud"] = deviceMgtProps["isCloud"]; - - if (userModule.isAuthorized("/permission/admin/device-mgt/users/manage")) { - page.canManage = true; - } - - if (userModule.isAuthorized("/permission/admin/device-mgt/users/view")) { - page.canView = true; - } - return page; -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.json deleted file mode 100644 index cd0eb1438d..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0.0", - "uri": "/users", - "layout": "cdmf.layout.default" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.hbs deleted file mode 100755 index 6a7f2bb962..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.hbs +++ /dev/null @@ -1,48 +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. -}} -{{#zone "topCss"}} - {{css "css/daterangepicker.css"}} -{{/zone}} - -
    -
    -
    - - - - - -
    -
    -
    -{{#zone "bottomJs"}} - {{js "js/moment.js"}} - {{js "js/jquery.daterangepicker.js"}} - {{js "js/date-picker.js"}} -{{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.json deleted file mode 100755 index 688e939808..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/date-range-picker.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "version": "1.0.0" -} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/css/daterangepicker.css b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/css/daterangepicker.css deleted file mode 100644 index fed735c97b..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/css/daterangepicker.css +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -.date-picker { - width: 170px; - height: 25px; - padding: 0; - border: 0; - line-height: 25px; - padding-left: 10px; - font-size: 12px; - font-family: Arial; - font-weight: bold; - cursor: pointer; - color: #303030; - position: relative; - z-index: 2; -} - -.date-picker-wrapper { - position: absolute; - z-index: 1; - border: 1px solid #bfbfbf; - background-color: #efefef; - width: 448px; - padding: 5px 12px; - font-size: 12px; - line-height: 20px; - color: #aaa; - font-family: Arial; - box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5); -} - -.date-picker-wrapper.single-date { - width: auto; -} - -.date-picker-wrapper.no-shortcuts { - padding-bottom: 12px; -} - -.date-picker-wrapper .footer { - display: none; - font-size: 11px; - padding-top: 3px; -} - -.date-picker-wrapper b { - color: #666; - font-weight: 700; -} - -.date-picker-wrapper a { - color: rgb(107, 180, 214); - text-decoration: underline; -} - -.date-picker-wrapper .month-wrapper { - border: 1px solid #bfbfbf; - border-radius: 3px; - background-color: #fff; - padding: 5px; - cursor: default; - position: relative; - _overflow: hidden; -} - -.date-picker-wrapper .month-wrapper table { - width: 190px; - float: left; -} - -.date-picker-wrapper .month-wrapper table.month2 { - width: 190px; - float: right; -} - -.date-picker-wrapper .month-wrapper table th, -.date-picker-wrapper .month-wrapper table td { - vertical-align: middle; - text-align: center; - line-height: 14px; - margin: 0px; - padding: 0px; -} - -.date-picker-wrapper .month-wrapper table .day { - height: 19px; - line-height: 19px; - font-size: 12px; - margin-bottom: 1px; - color: #999; - cursor: default; -} - -.date-picker-wrapper .month-wrapper table div.day.lastMonth, -.date-picker-wrapper .month-wrapper table div.day.nextMonth { - color: #999; - cursor: default; -} - -.date-picker-wrapper .month-wrapper table .day.checked { - background-color: rgb(156, 219, 247); -} - -.date-picker-wrapper .month-wrapper table .week-name { - height: 20px; - line-height: 20px; - font-weight: 100; -} - -.date-picker-wrapper .month-wrapper table .day.has-tooltip { - cursor: help !important; -} - -.date-picker-wrapper .month-wrapper table .day.toMonth.valid { - color: #333; - cursor: pointer; -} - -.date-picker-wrapper .month-wrapper table .day.real-today { - background-color: rgb(255, 230, 132); -} - -.date-picker-wrapper .month-wrapper table .day.real-today.checked { - background-color: rgb(112, 204, 213); -} - -.date-picker-wrapper table .caption { - height: 40px; -} - -.date-picker-wrapper table .caption .next, -.date-picker-wrapper table .caption .prev { - padding: 0 5px; - cursor: pointer; -} - -.date-picker-wrapper table .caption .next:hover, -.date-picker-wrapper table .caption .prev:hover { - background-color: #ccc; - color: white; -} - -.date-picker-wrapper .gap { - position: absolute; - display: none; - top: 0px; - left: 204px; - z-index: 1; - width: 15px; - height: 100%; - background-color: red; - font-size: 0; - line-height: 0; -} - -.date-picker-wrapper .gap .gap-lines { - height: 100%; - overflow: hidden; -} - -.date-picker-wrapper .gap .gap-line { - height: 15px; - width: 15px; - position: relative; -} - -.date-picker-wrapper .gap .gap-line .gap-1 { - z-index: 1; - height: 0; - border-left: 8px solid white; - border-top: 8px solid #eee; - border-bottom: 8px solid #eee; -} - -.date-picker-wrapper .gap .gap-line .gap-2 { - position: absolute; - right: 0; - top: 0px; - z-index: 2; - height: 0; - border-left: 8px solid transparent; - border-top: 8px solid white; -} - -.date-picker-wrapper .gap .gap-line .gap-3 { - position: absolute; - right: 0; - top: 8px; - z-index: 2; - height: 0; - border-left: 8px solid transparent; - border-bottom: 8px solid white; -} - -.date-picker-wrapper .gap .gap-top-mask { - width: 6px; - height: 1px; - position: absolute; - top: -1px; - left: 1px; - background-color: #eee; - z-index: 3; -} - -.date-picker-wrapper .gap .gap-bottom-mask { - width: 6px; - height: 1px; - position: absolute; - bottom: -1px; - left: 7px; - background-color: #eee; - z-index: 3; -} - -.date-picker-wrapper .selected-days { - display: none; -} - -.date-picker-wrapper .drp_top-bar { - line-height: 40px; - height: 40px; - position: relative; -} - -.date-picker-wrapper .drp_top-bar .error-top { - display: none; -} - -.date-picker-wrapper .drp_top-bar .normal-top { - display: none; -} - -.date-picker-wrapper .drp_top-bar .default-top { - display: block; -} - -.date-picker-wrapper .drp_top-bar.error .default-top { - display: none; -} - -.date-picker-wrapper .drp_top-bar.error .error-top { - display: block; - color: red; -} - -.date-picker-wrapper .drp_top-bar.normal .default-top { - display: none; -} - -.date-picker-wrapper .drp_top-bar.normal .normal-top { - display: block; -} - -.date-picker-wrapper .drp_top-bar .apply-btn { - position: absolute; - right: 0px; - top: 6px; - padding: 3px 5px; - margin: 0; - font-size: 12px; - border-radius: 4px; - cursor: pointer; - - color: #d9eef7; - border: solid 1px #0076a3; - background: #0095cd; - background: -webkit-gradient(linear, left top, left bottom, from(#00adee), to(#0078a5)); - background: -moz-linear-gradient(top, #00adee, #0078a5); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00adee', endColorstr='#0078a5'); - color: white; -} - -.date-picker-wrapper .drp_top-bar .apply-btn.disabled { - pointer-events: none; - color: #606060; - border: solid 1px #b7b7b7; - background: #fff; - background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#ededed)); - background: -moz-linear-gradient(top, #fff, #ededed); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ededed'); -} - -/*time styling*/ -.time { - position: relative; -} - -.time input[type=range] { - vertical-align: middle; -} - -.time1, .time2 { - width: 180px; - padding: 0 5px; - text-align: center; -} - -.time1 { - float: left; -} - -.time2 { - float: right; -} - -.hour, .minute { - text-align: left; -} - -.hide { - display: none; -} - -input.hour-range, input.minute-range { - width: 150px; -} - -#dateRangePickerContainer .date-range, #dateRangePickerContainer .input-append { - background: none !important; -} - -#date-range { - padding-right: 30px; - width: 300px; - height: 100%; - display: inline-block; -} - -#dateRangePickerContainer { - float: right; -} - -.date-range { - border: 1px solid #ccc; -} - -#dateRangePickerContainer button.active { - background-color: #e6e6e6 !important; -} - -#dateRangePickerContainer .btn-default:hover { - background-color: #b2b2b2; - border-color: #000000; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/date-picker.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/date-picker.js deleted file mode 100755 index 5fc42a3a6d..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/date-picker.js +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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 fromDate, toDate, currentDay = new Date(); -var startDate = new Date(currentDay.getTime() - (60 * 60 * 24 * 100)); -var endDate = new Date(currentDay.getTime()); - -function initDate() { - currentDay = new Date(); -} - -var DateRange = convertDate(startDate) + " to " + convertDate(endDate); - -$(document).ready(function () { - initDate(); - var configObject = { - startOfWeek: 'monday', - separator: ' to ', - format: 'YYYY-MM-DD HH:mm', - autoClose: false, - time: { - enabled: true - }, - shortcuts: 'hide', - endDate: currentDay, - maxDays: 2, - getValue: function () { - return this.value; - }, - setValue: function (s) { - this.value = s; - } - }; - $('#date-range').html(DateRange); - $('#date-range').dateRangePicker(configObject) - .bind('datepicker-apply', function (event, dateRange) { - $(this).addClass('active'); - $(this).siblings().removeClass('active'); - fromDate = dateRange.date1 != "Invalid Date" ? dateRange.date1.getTime() / 1000 : null; - toDate = dateRange.date2 != "Invalid Date" ? dateRange.date2.getTime() / 1000 : null; - drawGraph(fromDate, toDate); - } - ); - setDateTime(currentDay.getTime() - 3600000, currentDay.getTime()); - $('#hour-btn').addClass('active'); -}); - -//hour -$('#hour-btn').on('click', function () { - initDate(); - setDateTime(currentDay.getTime() - 3600000, currentDay.getTime()); -}); - -//12 hours -$('#h12-btn').on('click', function () { - initDate(); - setDateTime(currentDay.getTime() - (3600000 * 12), currentDay.getTime()); -}); - -//24 hours -$('#h24-btn').on('click', function () { - initDate(); - setDateTime(currentDay.getTime() - (3600000 * 24), currentDay.getTime()); -}); - -//48 hours -$('#h48-btn').on('click', function () { - initDate(); - setDateTime(currentDay.getTime() - (3600000 * 48), currentDay.getTime()); -}); - -$('body').on('click', '.btn-group button', function (e) { - $(this).addClass('active'); - $(this).siblings().removeClass('active'); -}); - -function setDateTime(from, to) { - fromDate = from; - toDate = to; - startDate = new Date(from); - endDate = new Date(to); - DateRange = convertDate(startDate) + " to " + convertDate(endDate); - $('#date-range').html(DateRange); - var tzOffset = new Date().getTimezoneOffset() * 60 / 1000; - from += tzOffset; - to += tzOffset; - - // Implement drawGraph_ method in your UI unit for analytics. - var deviceTypes = $("#device-type-details").data("devicetypes"); - for (var i = 0; i < deviceTypes.length; i++){ - try{ - window["drawGraph_" + deviceTypes](parseInt(from / 1000), parseInt(to / 1000)); - }catch(e){ - } - try{ - window["drawTable"](parseInt(from / 1000), parseInt(to / 1000)); - }catch(e){ - } - } -} - -function convertDate(date) { - var month = date.getMonth() + 1; - var day = date.getDate(); - var hour = date.getHours(); - var minute = date.getMinutes(); - return date.getFullYear() + '-' + (('' + month).length < 2 ? '0' : '') + month + '-' + - (('' + day).length < 2 ? '0' : '') + day + " " + (('' + hour).length < 2 ? '0' : '') + - hour + ":" + (('' + minute).length < 2 ? '0' : '') + minute; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/jquery-ui-timepicker-addon.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/jquery-ui-timepicker-addon.js deleted file mode 100644 index 180a8f8c92..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/jquery-ui-timepicker-addon.js +++ /dev/null @@ -1,2238 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -(function ($) { - - /* - * Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded" - */ - $.ui.timepicker = $.ui.timepicker || {}; - if ($.ui.timepicker.version) { - return; - } - - /* - * Extend jQueryUI, get it started with our version number - */ - $.extend($.ui, { - timepicker: { - version: "1.5.0" - } - }); - - /* - * Timepicker manager. - * Use the singleton instance of this class, $.timepicker, to interact with the time picker. - * Settings for (groups of) time pickers are maintained in an instance object, - * allowing multiple different settings on the same page. - */ - var Timepicker = function () { - this.regional = []; // Available regional settings, indexed by language code - this.regional[''] = { // Default regional settings - currentText: 'Now', - closeText: 'Done', - amNames: ['AM', 'A'], - pmNames: ['PM', 'P'], - timeFormat: 'HH:mm', - timeSuffix: '', - timeOnlyTitle: 'Choose Time', - timeText: 'Time', - hourText: 'Hour', - minuteText: 'Minute', - secondText: 'Second', - millisecText: 'Millisecond', - microsecText: 'Microsecond', - timezoneText: 'Time Zone', - isRTL: false - }; - this._defaults = { // Global defaults for all the datetime picker instances - showButtonPanel: true, - timeOnly: false, - timeOnlyShowDate: false, - showHour: null, - showMinute: null, - showSecond: null, - showMillisec: null, - showMicrosec: null, - showTimezone: null, - showTime: true, - stepHour: 1, - stepMinute: 1, - stepSecond: 1, - stepMillisec: 1, - stepMicrosec: 1, - hour: 0, - minute: 0, - second: 0, - millisec: 0, - microsec: 0, - timezone: null, - hourMin: 0, - minuteMin: 0, - secondMin: 0, - millisecMin: 0, - microsecMin: 0, - hourMax: 23, - minuteMax: 59, - secondMax: 59, - millisecMax: 999, - microsecMax: 999, - minDateTime: null, - maxDateTime: null, - maxTime: null, - minTime: null, - onSelect: null, - hourGrid: 0, - minuteGrid: 0, - secondGrid: 0, - millisecGrid: 0, - microsecGrid: 0, - alwaysSetTime: true, - separator: ' ', - altFieldTimeOnly: true, - altTimeFormat: null, - altSeparator: null, - altTimeSuffix: null, - altRedirectFocus: true, - pickerTimeFormat: null, - pickerTimeSuffix: null, - showTimepicker: true, - timezoneList: null, - addSliderAccess: false, - sliderAccessArgs: null, - controlType: 'slider', - defaultValue: null, - parse: 'strict' - }; - $.extend(this._defaults, this.regional['']); - }; - - $.extend(Timepicker.prototype, { - $input: null, - $altInput: null, - $timeObj: null, - inst: null, - hour_slider: null, - minute_slider: null, - second_slider: null, - millisec_slider: null, - microsec_slider: null, - timezone_select: null, - maxTime: null, - minTime: null, - hour: 0, - minute: 0, - second: 0, - millisec: 0, - microsec: 0, - timezone: null, - hourMinOriginal: null, - minuteMinOriginal: null, - secondMinOriginal: null, - millisecMinOriginal: null, - microsecMinOriginal: null, - hourMaxOriginal: null, - minuteMaxOriginal: null, - secondMaxOriginal: null, - millisecMaxOriginal: null, - microsecMaxOriginal: null, - ampm: '', - formattedDate: '', - formattedTime: '', - formattedDateTime: '', - timezoneList: null, - units: ['hour', 'minute', 'second', 'millisec', 'microsec'], - support: {}, - control: null, - - /* - * Override the default settings for all instances of the time picker. - * @param {Object} settings object - the new settings to use as defaults (anonymous object) - * @return {Object} the manager object - */ - setDefaults: function (settings) { - extendRemove(this._defaults, settings || {}); - return this; - }, - - /* - * Create a new Timepicker instance - */ - _newInst: function ($input, opts) { - var tp_inst = new Timepicker(), - inlineSettings = {}, - fns = {}, - overrides, i; - - for (var attrName in this._defaults) { - if (this._defaults.hasOwnProperty(attrName)) { - var attrValue = $input.attr('time:' + attrName); - if (attrValue) { - try { - inlineSettings[attrName] = eval(attrValue); - } catch (err) { - inlineSettings[attrName] = attrValue; - } - } - } - } - - overrides = { - beforeShow: function (input, dp_inst) { - if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) { - return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst); - } - }, - onChangeMonthYear: function (year, month, dp_inst) { - // Update the time as well : this prevents the time from disappearing from the $input field. - tp_inst._updateDateTime(dp_inst); - if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) { - tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst); - } - }, - onClose: function (dateText, dp_inst) { - if (tp_inst.timeDefined === true && $input.val() !== '') { - tp_inst._updateDateTime(dp_inst); - } - if ($.isFunction(tp_inst._defaults.evnts.onClose)) { - tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst); - } - } - }; - for (i in overrides) { - if (overrides.hasOwnProperty(i)) { - fns[i] = opts[i] || null; - } - } - - tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, { - evnts: fns, - timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); - }); - tp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) { - return val.toUpperCase(); - }); - tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) { - return val.toUpperCase(); - }); - - // detect which units are supported - tp_inst.support = detectSupport( - tp_inst._defaults.timeFormat + - (tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') + - (tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : '')); - - // controlType is string - key to our this._controls - if (typeof(tp_inst._defaults.controlType) === 'string') { - if (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') { - tp_inst._defaults.controlType = 'select'; - } - tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType]; - } - // controlType is an object and must implement create, options, value methods - else { - tp_inst.control = tp_inst._defaults.controlType; - } - - // prep the timezone options - var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60, - 0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840]; - if (tp_inst._defaults.timezoneList !== null) { - timezoneList = tp_inst._defaults.timezoneList; - } - var tzl = timezoneList.length, tzi = 0, tzv = null; - if (tzl > 0 && typeof timezoneList[0] !== 'object') { - for (; tzi < tzl; tzi++) { - tzv = timezoneList[tzi]; - timezoneList[tzi] = { value: tzv, label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601) }; - } - } - tp_inst._defaults.timezoneList = timezoneList; - - // set the default units - tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) : - ((new Date()).getTimezoneOffset() * -1); - tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin : - tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour; - tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin : - tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute; - tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin : - tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second; - tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin : - tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec; - tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin : - tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec; - tp_inst.ampm = ''; - tp_inst.$input = $input; - - if (tp_inst._defaults.altField) { - tp_inst.$altInput = $(tp_inst._defaults.altField); - if (tp_inst._defaults.altRedirectFocus === true) { - tp_inst.$altInput.css({ - cursor: 'pointer' - }).focus(function () { - $input.trigger("focus"); - }); - } - } - - if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) { - tp_inst._defaults.minDate = new Date(); - } - if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) { - tp_inst._defaults.maxDate = new Date(); - } - - // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. - if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) { - tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); - } - if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) { - tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); - } - if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) { - tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); - } - if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) { - tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); - } - tp_inst.$input.bind('focus', function () { - tp_inst._onFocus(); - }); - - return tp_inst; - }, - - /* - * add our sliders to the calendar - */ - _addTimePicker: function (dp_inst) { - var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val(); - - this.timeDefined = this._parseTime(currDT); - this._limitMinMaxDateTime(dp_inst, false); - this._injectTimePicker(); - }, - - /* - * parse the time string from input value or _setTime - */ - _parseTime: function (timeString, withDate) { - if (!this.inst) { - this.inst = $.datepicker._getInst(this.$input[0]); - } - - if (withDate || !this._defaults.timeOnly) { - var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); - try { - var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults); - if (!parseRes.timeObj) { - return false; - } - $.extend(this, parseRes.timeObj); - } catch (err) { - $.timepicker.log("Error parsing the date/time string: " + err + - "\ndate/time string = " + timeString + - "\ntimeFormat = " + this._defaults.timeFormat + - "\ndateFormat = " + dp_dateFormat); - return false; - } - return true; - } else { - var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults); - if (!timeObj) { - return false; - } - $.extend(this, timeObj); - return true; - } - }, - - /* - * generate and inject html for timepicker into ui datepicker - */ - _injectTimePicker: function () { - var $dp = this.inst.dpDiv, - o = this.inst.settings, - tp_inst = this, - litem = '', - uitem = '', - show = null, - max = {}, - gridSize = {}, - size = null, - i = 0, - l = 0; - - // Prevent displaying twice - if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) { - var noDisplay = ' style="display:none;"', - html = '
    ' + '
    ' + o.timeText + '
    ' + - '
    '; - - // Create the markup - for (i = 0, l = this.units.length; i < l; i++) { - litem = this.units[i]; - uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1); - show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; - - // Added by Peter Medeiros: - // - Figure out what the hour/minute/second max should be based on the step values. - // - Example: if stepMinute is 15, then minMax is 45. - max[litem] = parseInt((o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10); - gridSize[litem] = 0; - - html += '
    ' + o[litem + 'Text'] + '
    ' + - '
    '; - - if (show && o[litem + 'Grid'] > 0) { - html += '
    '; - - if (litem === 'hour') { - for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) { - gridSize[litem]++; - var tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {hour: h}, o); - html += ''; - } - } - else { - for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) { - gridSize[litem]++; - html += ''; - } - } - - html += '
    ' + tmph + '' + ((m < 10) ? '0' : '') + m + '
    '; - } - html += '
    '; - } - - // Timezone - var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone; - html += '
    ' + o.timezoneText + '
    '; - html += '
    '; - - // Create the elements from string - html += '
    '; - var $tp = $(html); - - // if we only want time picker... - if (o.timeOnly === true) { - $tp.prepend('
    ' + '
    ' + o.timeOnlyTitle + '
    ' + '
    '); - $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); - } - - // add sliders, adjust grids, add events - for (i = 0, l = tp_inst.units.length; i < l; i++) { - litem = tp_inst.units[i]; - uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1); - show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; - - // add the slider - tp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]); - - // adjust the grid and add click event - if (show && o[litem + 'Grid'] > 0) { - size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']); - $tp.find('.ui_tpicker_' + litem + ' table').css({ - width: size + "%", - marginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + "%"), - marginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + "%") : '0', - borderCollapse: 'collapse' - }).find("td").click(function (e) { - var $t = $(this), - h = $t.html(), - n = parseInt(h.replace(/[^0-9]/g), 10), - ap = h.replace(/[^apm]/ig), - f = $t.data('for'); // loses scope, so we use data-for - - if (f === 'hour') { - if (ap.indexOf('p') !== -1 && n < 12) { - n += 12; - } - else { - if (ap.indexOf('a') !== -1 && n === 12) { - n = 0; - } - } - } - - tp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n); - - tp_inst._onTimeChange(); - tp_inst._onSelectHandler(); - }).css({ - cursor: 'pointer', - width: (100 / gridSize[litem]) + '%', - textAlign: 'center', - overflow: 'hidden' - }); - } // end if grid > 0 - } // end for loop - - // Add timezone options - this.timezone_select = $tp.find('.ui_tpicker_timezone').append('').find("select"); - $.fn.append.apply(this.timezone_select, - $.map(o.timezoneList, function (val, idx) { - return $("
    '; - - - return $(html); - } - - function getHideClass() - { - if (opt.autoClose === true) { - return 'hide'; - } - return ''; - } - - function getWeekHead() - { - if (opt.startOfWeek == 'monday') - { - return ''+lang('week-1')+'\ - '+lang('week-2')+'\ - '+lang('week-3')+'\ - '+lang('week-4')+'\ - '+lang('week-5')+'\ - '+lang('week-6')+'\ - '+lang('week-7')+''; - } - else - { - return ''+lang('week-7')+'\ - '+lang('week-1')+'\ - '+lang('week-2')+'\ - '+lang('week-3')+'\ - '+lang('week-4')+'\ - '+lang('week-5')+'\ - '+lang('week-6')+''; - } - } - function isMonthOutOfBounds(month) - { - var month = moment(month); - if (opt.startDate && month.endOf('month').isBefore(opt.startDate)) - { - return true; - } - if (opt.endDate && month.startOf('month').isAfter(opt.endDate)) - { - return true; - } - return false; - } - - function getGapHTML() - { - var html = ['
    ']; - for(var i=0;i<20;i++) - { - html.push('
    \ -
    \ -
    \ -
    \ -
    '); - } - html.push('
    '); - return html.join(''); - } - - function createMonthHTML(d) - { - var days = []; - d.setDate(1); - var lastMonth = new Date(d.getTime() - 86400000); - var now = new Date(); - - var dayOfWeek = d.getDay(); - if((dayOfWeek == 0) && (opt.startOfWeek == 'monday')) { - // add one week - dayOfWeek = 7; - } - - if (dayOfWeek > 0) - { - for (var i = dayOfWeek; i > 0; i--) - { - var day = new Date(d.getTime() - 86400000*i); - var valid = true; - if (opt.startDate && compare_day(day,opt.startDate) < 0) valid = false; - if (opt.endDate && compare_day(day,opt.endDate) > 0) valid = false; - days.push({type:'lastMonth',day: day.getDate(),time:day.getTime(), valid:valid }); - } - } - var toMonth = d.getMonth(); - for(var i=0; i<40; i++) - { - var today = moment(d).add(i,'days').toDate(); - var valid = true; - if (opt.startDate && compare_day(today,opt.startDate) < 0) valid = false; - if (opt.endDate && compare_day(today,opt.endDate) > 0) valid = false; - days.push({type: today.getMonth() == toMonth ? 'toMonth' : 'nextMonth',day: today.getDate(),time:today.getTime(), valid:valid }); - } - var html = []; - for(var week=0; week<6; week++) - { - if (days[week*7].type == 'nextMonth') break; - html.push(''); - for(var day = 0; day<7; day++) - { - var _day = (opt.startOfWeek == 'monday') ? day+1 : day; - var today = days[week*7+_day]; - var highlightToday = moment(today.time).format('L') == moment(now).format('L'); - today.extraClass = ''; - today.tooltip = ''; - if(opt.beforeShowDay && typeof opt.beforeShowDay == 'function') - { - var _r = opt.beforeShowDay(moment(today.time).toDate()); - today.valid = _r[0]; - today.extraClass = _r[1] || ''; - today.tooltip = _r[2] || ''; - if (today.tooltip != '') today.extraClass += ' has-tooltip '; - } - html.push('
    '+today.day+'
    '); - } - html.push(''); - } - return html.join(''); - } - - function getLanguages() - { - if (opt.language == 'auto') - { - var language = navigator.language ? navigator.language : navigator.browserLanguage; - if (!language) return $.dateRangePickerLanguages['en']; - var language = language.toLowerCase(); - for(var key in $.dateRangePickerLanguages) - { - if (language.indexOf(key) != -1) - { - return $.dateRangePickerLanguages[key]; - } - } - return $.dateRangePickerLanguages['en']; - } - else if ( opt.language && opt.language in $.dateRangePickerLanguages) - { - return $.dateRangePickerLanguages[opt.language]; - } - else - { - return $.dateRangePickerLanguages['en']; - } - } - - function lang(t) - { - return (t in langs)? langs[t] : t; - } - - - }; -})(jQuery); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/moment.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/moment.js deleted file mode 100755 index bb7dff4542..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.analytics.date-range-picker/public/js/moment.js +++ /dev/null @@ -1,4058 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -//! moment.js -//! version : 2.13.0 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - global.moment = factory() -}(this, function () { 'use strict'; - - var hookCallback; - - function utils_hooks__hooks () { - return hookCallback.apply(null, arguments); - } - - // This is done to register the method called with moment() - // without creating circular dependencies. - function setHookCallback (callback) { - hookCallback = callback; - } - - function isArray(input) { - return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; - } - - function isDate(input) { - return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; - } - - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } - - function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); - } - - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; - } - - function create_utc__createUTC (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); - } - - function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso : false, - parsedDateParts : [], - meridiem : null - }; - } - - function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; - } - - var some; - if (Array.prototype.some) { - some = Array.prototype.some; - } else { - some = function (fun) { - var t = Object(this); - var len = t.length >>> 0; - - for (var i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } - - return false; - }; - } - - function valid__isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m); - var parsedParts = some.call(flags.parsedDateParts, function (i) { - return i != null; - }); - m._isValid = !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); - - if (m._strict) { - m._isValid = m._isValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } - } - return m._isValid; - } - - function valid__createInvalid (flags) { - var m = create_utc__createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } - else { - getParsingFlags(m).userInvalidated = true; - } - - return m; - } - - function isUndefined(input) { - return input === void 0; - } - - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - var momentProperties = utils_hooks__hooks.momentProperties = []; - - function copyConfig(to, from) { - var i, prop, val; - - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i in momentProperties) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } - - return to; - } - - var updateInProgress = false; - - // Moment prototype object - function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - utils_hooks__hooks.updateOffset(this); - updateInProgress = false; - } - } - - function isMoment (obj) { - return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); - } - - function absFloor (number) { - if (number < 0) { - return Math.ceil(number); - } else { - return Math.floor(number); - } - } - - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } - - return value; - } - - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; - } - - function warn(msg) { - if (utils_hooks__hooks.suppressDeprecationWarnings === false && - (typeof console !== 'undefined') && console.warn) { - console.warn('Deprecation warning: ' + msg); - } - } - - function deprecate(msg, fn) { - var firstTime = true; - - return extend(function () { - if (utils_hooks__hooks.deprecationHandler != null) { - utils_hooks__hooks.deprecationHandler(null, msg); - } - if (firstTime) { - warn(msg + '\nArguments: ' + Array.prototype.slice.call(arguments).join(', ') + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - var deprecations = {}; - - function deprecateSimple(name, msg) { - if (utils_hooks__hooks.deprecationHandler != null) { - utils_hooks__hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } - } - - utils_hooks__hooks.suppressDeprecationWarnings = false; - utils_hooks__hooks.deprecationHandler = null; - - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } - - function isObject(input) { - return Object.prototype.toString.call(input) === '[object Object]'; - } - - function locale_set__set (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _ordinalParseLenient. - this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source); - } - - function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } - } - return res; - } - - function Locale(config) { - if (config != null) { - this.set(config); - } - } - - var keys; - - if (Object.keys) { - keys = Object.keys; - } else { - keys = function (obj) { - var i, res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } - } - return res; - }; - } - - // internal storage for locale config files - var locales = {}; - var globalLocale; - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return null; - } - - function loadLocale(name) { - var oldLocale = null; - // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && (typeof module !== 'undefined') && - module && module.exports) { - try { - oldLocale = globalLocale._abbr; - require('./locale/' + name); - // because defineLocale currently also sets the global locale, we - // want to undo that for lazy loaded locales - locale_locales__getSetGlobalLocale(oldLocale); - } catch (e) { } - } - return locales[name]; - } - - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - function locale_locales__getSetGlobalLocale (key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = locale_locales__getLocale(key); - } - else { - data = defineLocale(key, values); - } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; - } - } - - return globalLocale._abbr; - } - - function defineLocale (name, config) { - if (config !== null) { - config.abbr = name; - if (locales[name] != null) { - deprecateSimple('defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale'); - config = mergeConfigs(locales[name]._config, config); - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - config = mergeConfigs(locales[config.parentLocale]._config, config); - } else { - // treat as if there is no base config - deprecateSimple('parentLocaleUndefined', - 'specified parentLocale is not defined yet'); - } - } - locales[name] = new Locale(config); - - // backwards compat for now: also set the locale - locale_locales__getSetGlobalLocale(name); - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - } - - function updateLocale(name, config) { - if (config != null) { - var locale; - if (locales[name] != null) { - config = mergeConfigs(locales[name]._config, config); - } - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; - - // backwards compat for now: also set the locale - locale_locales__getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; - } - - // returns locale data - function locale_locales__getLocale (key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return globalLocale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); - } - - function locale_locales__listLocales() { - return keys(locales); - } - - var aliases = {}; - - function addUnitAlias (unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; - } - - function normalizeUnits(units) { - return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; - } - - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; - } - - function makeGetSet (unit, keepTime) { - return function (value) { - if (value != null) { - get_set__set(this, unit, value); - utils_hooks__hooks.updateOffset(this, keepTime); - return this; - } else { - return get_set__get(this, unit); - } - }; - } - - function get_set__get (mom, unit) { - return mom.isValid() ? - mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; - } - - function get_set__set (mom, unit, value) { - if (mom.isValid()) { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } - - // MOMENTS - - function getSet (units, value) { - var unit; - if (typeof units === 'object') { - for (unit in units) { - this.set(unit, units[unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; - } - - function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; - } - - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; - - var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; - - var formatFunctions = {}; - - var formatTokenFunctions = {}; - - // token: 'M' - // padded: ['MM', 2] - // ordinal: 'Mo' - // callback: function () { this.month() + 1 } - function addFormatToken (token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal(func.apply(this, arguments), token); - }; - } - } - - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); - } - - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = '', i; - for (i = 0; i < length; i++) { - output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; - } - return output; - }; - } - - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); - - return formatFunctions[format](m); - } - - function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - var match1 = /\d/; // 0 - 9 - var match2 = /\d\d/; // 00 - 99 - var match3 = /\d{3}/; // 000 - 999 - var match4 = /\d{4}/; // 0000 - 9999 - var match6 = /[+-]?\d{6}/; // -999999 - 999999 - var match1to2 = /\d\d?/; // 0 - 99 - var match3to4 = /\d\d\d\d?/; // 999 - 9999 - var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 - var match1to3 = /\d{1,3}/; // 0 - 999 - var match1to4 = /\d{1,4}/; // 0 - 9999 - var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - - var matchUnsigned = /\d+/; // 0 - inf - var matchSigned = /[+-]?\d+/; // -inf - inf - - var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z - var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - - var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - - // any word (or two) characters or numbers including two/three word month in arabic. - // includes scottish gaelic two word and hyphenated months - var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; - - - var regexes = {}; - - function addRegexToken (token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { - return (isStrict && strictRegex) ? strictRegex : regex; - }; - } - - function getParseRegexForToken (token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); - } - - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function unescapeFormat(s) { - return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - })); - } - - function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } - - var tokens = {}; - - function addParseToken (token, callback) { - var i, func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (typeof callback === 'number') { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; - } - } - - function addWeekParseToken (token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); - } - - function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); - } - } - - var YEAR = 0; - var MONTH = 1; - var DATE = 2; - var HOUR = 3; - var MINUTE = 4; - var SECOND = 5; - var MILLISECOND = 6; - var WEEK = 7; - var WEEKDAY = 8; - - var indexOf; - - if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; - } else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; - } - - function daysInMonth(year, month) { - return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); - } - - // FORMATTING - - addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; - }); - - addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); - }); - - addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); - }); - - // ALIASES - - addUnitAlias('month', 'M'); - - // PARSING - - addRegexToken('M', match1to2); - addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); - }); - addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); - }); - - addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; - }); - - addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } - }); - - // LOCALES - - var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/; - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); - function localeMonths (m, format) { - return isArray(this._months) ? this._months[m.month()] : - this._months[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; - } - - var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); - function localeMonthsShort (m, format) { - return isArray(this._monthsShort) ? this._monthsShort[m.month()] : - this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; - } - - function units_month__handleStrictParse(monthName, format, strict) { - var i, ii, mom, llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = create_utc__createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeMonthsParse (monthName, format, strict) { - var i, mom, regex; - - if (this._monthsParseExact) { - return units_month__handleStrictParse.call(this, monthName, format, strict); - } - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = create_utc__createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - } - - // MOMENTS - - function setMonth (mom, value) { - var dayOfMonth; - - if (!mom.isValid()) { - // No op - return mom; - } - - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (typeof value !== 'number') { - return mom; - } - } - } - - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - - function getSetMonth (value) { - if (value != null) { - setMonth(this, value); - utils_hooks__hooks.updateOffset(this, true); - return this; - } else { - return get_set__get(this, 'Month'); - } - } - - function getDaysInMonth () { - return daysInMonth(this.year(), this.month()); - } - - var defaultMonthsShortRegex = matchWord; - function monthsShortRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - return this._monthsShortStrictRegex && isStrict ? - this._monthsShortStrictRegex : this._monthsShortRegex; - } - } - - var defaultMonthsRegex = matchWord; - function monthsRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; - } else { - return this._monthsRegex; - } - } else { - return this._monthsStrictRegex && isStrict ? - this._monthsStrictRegex : this._monthsRegex; - } - } - - function computeMonthsParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var shortPieces = [], longPieces = [], mixedPieces = [], - i, mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = create_utc__createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - } - - function checkOverflow (m) { - var overflow; - var a = m._a; - - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : - a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : - a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : - a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : - a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : - a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } - - getParsingFlags(m).overflow = overflow; - } - - return m; - } - - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; - var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; - - var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; - - var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - // YYYYMM is NOT allowed by the standard - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/] - ]; - - // iso time formats and regexes - var isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/] - ]; - - var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; - - // date from iso format - function configFromISO(config) { - var i, l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, dateFormat, timeFormat, tzFormat; - - if (match) { - getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; - return; - } - } - if (!allowTime && timeFormat != null) { - config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } - } - - // date from iso format or fallback - function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); - - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } - - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - utils_hooks__hooks.createFromInputFallback(config); - } - } - - utils_hooks__hooks.createFromInputFallback = deprecate( - 'moment construction falls back to js Date. This is ' + - 'discouraged and will be removed in upcoming major ' + - 'release. Please refer to ' + - 'https://github.com/moment/moment/issues/1407 for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); - - function createDate (y, m, d, h, M, s, ms) { - //can't just apply() to create a date: - //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply - var date = new Date(y, m, d, h, M, s, ms); - - //the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { - date.setFullYear(y); - } - return date; - } - - function createUTCDate (y) { - var date = new Date(Date.UTC.apply(null, arguments)); - - //the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); - } - return date; - } - - // FORMATTING - - addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? '' + y : '+' + y; - }); - - addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; - }); - - addFormatToken(0, ['YYYY', 4], 0, 'year'); - addFormatToken(0, ['YYYYY', 5], 0, 'year'); - addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - - // ALIASES - - addUnitAlias('year', 'y'); - - // PARSING - - addRegexToken('Y', matchSigned); - addRegexToken('YY', match1to2, match2); - addRegexToken('YYYY', match1to4, match4); - addRegexToken('YYYYY', match1to6, match6); - addRegexToken('YYYYYY', match1to6, match6); - - addParseToken(['YYYYY', 'YYYYYY'], YEAR); - addParseToken('YYYY', function (input, array) { - array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input); - }); - addParseToken('YY', function (input, array) { - array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input); - }); - addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); - }); - - // HELPERS - - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } - - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } - - // HOOKS - - utils_hooks__hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; - - // MOMENTS - - var getSetYear = makeGetSet('FullYear', true); - - function getIsLeapYear () { - return isLeapYear(this.year()); - } - - // start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - - return -fwdlw + fwd - 1; - } - - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, resDayOfYear; - - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } - - return { - year: resYear, - dayOfYear: resDayOfYear - }; - } - - function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, resYear; - - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; - } - - return { - week: resWeek, - year: resYear - }; - } - - function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; - } - - // Pick the first defined of two or three arguments. - function defaults(a, b, c) { - if (a != null) { - return a; - } - if (b != null) { - return b; - } - return c; - } - - function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(utils_hooks__hooks.now()); - if (config._useUTC) { - return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; - } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; - } - - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function configFromArray (config) { - var i, date, input = [], currentDate, yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse)) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } - } - - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year); - week = defaults(w.w, 1); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to begining of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - } - - // constant that refers to the ISO standard - utils_hooks__hooks.ISO_8601 = function () {}; - - // date from string and format string - function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === utils_hooks__hooks.ISO_8601) { - configFromISO(config); - return; - } - - config._a = []; - getParsingFlags(config).empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; - - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - // console.log('token', token, 'parsedInput', parsedInput, - // 'regex', getParseRegexForToken(token, config)); - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } - else { - getParsingFlags(config).unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if (getParsingFlags(config).bigHour === true && - config._a[HOUR] <= 12 && - config._a[HOUR] > 0) { - getParsingFlags(config).bigHour = undefined; - } - - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); - - configFromArray(config); - checkOverflow(config); - } - - - function meridiemFixWrap (locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; - } - } - - // date from string and array of format strings - function configFromStringAndArray(config) { - var tempConfig, - bestMoment, - - scoreToBeat, - i, - currentScore; - - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); - - if (!valid__isValid(tempConfig)) { - continue; - } - - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; - - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - - getParsingFlags(tempConfig).score = currentScore; - - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - - extend(config, bestMoment || tempConfig); - } - - function configFromObject(config) { - if (config._d) { - return; - } - - var i = normalizeObjectUnits(config._i); - config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { - return obj && parseInt(obj, 10); - }); - - configFromArray(config); - } - - function createFromConfig (config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; - } - - function prepareConfig (config) { - var input = config._i, - format = config._f; - - config._locale = config._locale || locale_locales__getLocale(config._l); - - if (input === null || (format === undefined && input === '')) { - return valid__createInvalid({nullInput: true}); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else if (isDate(input)) { - config._d = input; - } else { - configFromInput(config); - } - - if (!valid__isValid(config)) { - config._d = null; - } - - return config; - } - - function configFromInput(config) { - var input = config._i; - if (input === undefined) { - config._d = new Date(utils_hooks__hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (typeof(input) === 'object') { - configFromObject(config); - } else if (typeof(input) === 'number') { - // from milliseconds - config._d = new Date(input); - } else { - utils_hooks__hooks.createFromInputFallback(config); - } - } - - function createLocalOrUTC (input, format, locale, strict, isUTC) { - var c = {}; - - if (typeof(locale) === 'boolean') { - strict = locale; - locale = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - - return createFromConfig(c); - } - - function local__createLocal (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); - } - - var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', - function () { - var other = local__createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; - } else { - return valid__createInvalid(); - } - } - ); - - var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', - function () { - var other = local__createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; - } else { - return valid__createInvalid(); - } - } - ); - - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return local__createLocal(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } - - // TODO: Use [].sort instead? - function min () { - var args = [].slice.call(arguments, 0); - - return pickBy('isBefore', args); - } - - function max () { - var args = [].slice.call(arguments, 0); - - return pickBy('isAfter', args); - } - - var now = function () { - return Date.now ? Date.now() : +(new Date()); - }; - - function Duration (duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = locale_locales__getLocale(); - - this._bubble(); - } - - function isDuration (obj) { - return obj instanceof Duration; - } - - // FORMATTING - - function offset (token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(); - var sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); - }); - } - - offset('Z', ':'); - offset('ZZ', ''); - - // PARSING - - addRegexToken('Z', matchShortOffset); - addRegexToken('ZZ', matchShortOffset); - addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); - }); - - // HELPERS - - // timezone chunker - // '+10:00' > ['10', '00'] - // '-1530' > ['-15', '30'] - var chunkOffset = /([\+\-]|\d\d)/gi; - - function offsetFromString(matcher, string) { - var matches = ((string || '').match(matcher) || []); - var chunk = matches[matches.length - 1] || []; - var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - var minutes = +(parts[1] * 60) + toInt(parts[2]); - - return parts[0] === '+' ? minutes : -minutes; - } - - // Return a moment from input, that is local/utc/zone equivalent to model. - function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (isMoment(input) || isDate(input) ? input.valueOf() : local__createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - utils_hooks__hooks.updateOffset(res, false); - return res; - } else { - return local__createLocal(input).local(); - } - } - - function getDateOffset (m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset() / 15) * 15; - } - - // HOOKS - - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - utils_hooks__hooks.updateOffset = function () {}; - - // MOMENTS - - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - function getSetOffset (input, keepLocalTime) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - } else if (Math.abs(input) < 16) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - utils_hooks__hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); - } - } - - function getSetZone (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } - - this.utcOffset(input, keepLocalTime); - - return this; - } else { - return -this.utcOffset(); - } - } - - function setOffsetToUTC (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - } - - function setOffsetToLocal (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); - } - } - return this; - } - - function setOffsetToParsedOffset () { - if (this._tzm) { - this.utcOffset(this._tzm); - } else if (typeof this._i === 'string') { - this.utcOffset(offsetFromString(matchOffset, this._i)); - } - return this; - } - - function hasAlignedHourOffset (input) { - if (!this.isValid()) { - return false; - } - input = input ? local__createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; - } - - function isDaylightSavingTime () { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); - } - - function isDaylightSavingTimeShifted () { - if (!isUndefined(this._isDSTShifted)) { - return this._isDSTShifted; - } - - var c = {}; - - copyConfig(c, this); - c = prepareConfig(c); - - if (c._a) { - var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a); - this._isDSTShifted = this.isValid() && - compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; - } - - return this._isDSTShifted; - } - - function isLocal () { - return this.isValid() ? !this._isUTC : false; - } - - function isUtcOffset () { - return this.isValid() ? this._isUTC : false; - } - - function isUtc () { - return this.isValid() ? this._isUTC && this._offset === 0 : false; - } - - // ASP.NET json date format regex - var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/; - - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - // and further modified to allow for strings containing both week and day - var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/; - - function create__createDuration (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; - - if (isDuration(input)) { - duration = { - ms : input._milliseconds, - d : input._days, - M : input._months - }; - } else if (typeof input === 'number') { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : 0, - d : toInt(match[DATE]) * sign, - h : toInt(match[HOUR]) * sign, - m : toInt(match[MINUTE]) * sign, - s : toInt(match[SECOND]) * sign, - ms : toInt(match[MILLISECOND]) * sign - }; - } else if (!!(match = isoRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : parseIso(match[2], sign), - M : parseIso(match[3], sign), - w : parseIso(match[4], sign), - d : parseIso(match[5], sign), - h : parseIso(match[6], sign), - m : parseIso(match[7], sign), - s : parseIso(match[8], sign) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to)); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } - - ret = new Duration(duration); - - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - return ret; - } - - create__createDuration.fn = Duration.prototype; - - function parseIso (inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - } - - function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; - } - - function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return {milliseconds: 0, months: 0}; - } - - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; - } - - function absRound (number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); - } - } - - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); - tmp = val; val = period; period = tmp; - } - - val = typeof val === 'string' ? +val : val; - dur = create__createDuration(val, period); - add_subtract__addSubtract(this, dur, direction); - return this; - }; - } - - function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); - - if (!mom.isValid()) { - // No op - return; - } - - updateOffset = updateOffset == null ? true : updateOffset; - - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (days) { - get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding); - } - if (months) { - setMonth(mom, get_set__get(mom, 'Month') + months * isAdding); - } - if (updateOffset) { - utils_hooks__hooks.updateOffset(mom, days || months); - } - } - - var add_subtract__add = createAdder(1, 'add'); - var add_subtract__subtract = createAdder(-1, 'subtract'); - - function moment_calendar__calendar (time, formats) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || local__createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - diff = this.diff(sod, 'days', true), - format = diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - - var output = formats && (isFunction(formats[format]) ? formats[format]() : formats[format]); - - return this.format(output || this.localeData().calendar(format, this, local__createLocal(now))); - } - - function clone () { - return new Moment(this); - } - - function isAfter (input, units) { - var localInput = isMoment(input) ? input : local__createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } - } - - function isBefore (input, units) { - var localInput = isMoment(input) ? input : local__createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } - } - - function isBetween (from, to, units, inclusivity) { - inclusivity = inclusivity || '()'; - return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && - (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); - } - - function isSame (input, units) { - var localInput = isMoment(input) ? input : local__createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); - } - } - - function isSameOrAfter (input, units) { - return this.isSame(input, units) || this.isAfter(input,units); - } - - function isSameOrBefore (input, units) { - return this.isSame(input, units) || this.isBefore(input,units); - } - - function diff (input, units, asFloat) { - var that, - zoneDelta, - delta, output; - - if (!this.isValid()) { - return NaN; - } - - that = cloneWithOffset(input, this); - - if (!that.isValid()) { - return NaN; - } - - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - - units = normalizeUnits(units); - - if (units === 'year' || units === 'month' || units === 'quarter') { - output = monthDiff(this, that); - if (units === 'quarter') { - output = output / 3; - } else if (units === 'year') { - output = output / 12; - } - } else { - delta = this - that; - output = units === 'second' ? delta / 1e3 : // 1000 - units === 'minute' ? delta / 6e4 : // 1000 * 60 - units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - delta; - } - return asFloat ? output : absFloor(output); - } - - function monthDiff (a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; - } - - utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; - utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; - - function toString () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } - - function moment_format__toISOString () { - var m = this.clone().utc(); - if (0 < m.year() && m.year() <= 9999) { - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - return this.toDate().toISOString(); - } else { - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - } else { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - } - - function format (inputString) { - if (!inputString) { - inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); - } - - function from (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - local__createLocal(time).isValid())) { - return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function fromNow (withoutSuffix) { - return this.from(local__createLocal(), withoutSuffix); - } - - function to (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - local__createLocal(time).isValid())) { - return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function toNow (withoutSuffix) { - return this.to(local__createLocal(), withoutSuffix); - } - - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - function locale (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = locale_locales__getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } - } - - var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } - ); - - function localeData () { - return this._locale; - } - - function startOf (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - case 'date': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - } - - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } - if (units === 'isoWeek') { - this.isoWeekday(1); - } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } - - return this; - } - - function endOf (units) { - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond') { - return this; - } - - // 'date' is an alias for 'day', so it should be considered as such. - if (units === 'date') { - units = 'day'; - } - - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); - } - - function to_type__valueOf () { - return this._d.valueOf() - ((this._offset || 0) * 60000); - } - - function unix () { - return Math.floor(this.valueOf() / 1000); - } - - function toDate () { - return this._offset ? new Date(this.valueOf()) : this._d; - } - - function toArray () { - var m = this; - return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; - } - - function toObject () { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds() - }; - } - - function toJSON () { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; - } - - function moment_valid__isValid () { - return valid__isValid(this); - } - - function parsingFlags () { - return extend({}, getParsingFlags(this)); - } - - function invalidAt () { - return getParsingFlags(this).overflow; - } - - function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - }; - } - - // FORMATTING - - addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; - }); - - addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; - }); - - function addWeekYearFormatToken (token, getter) { - addFormatToken(0, [token, token.length], 0, getter); - } - - addWeekYearFormatToken('gggg', 'weekYear'); - addWeekYearFormatToken('ggggg', 'weekYear'); - addWeekYearFormatToken('GGGG', 'isoWeekYear'); - addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - - // ALIASES - - addUnitAlias('weekYear', 'gg'); - addUnitAlias('isoWeekYear', 'GG'); - - // PARSING - - addRegexToken('G', matchSigned); - addRegexToken('g', matchSigned); - addRegexToken('GG', match1to2, match2); - addRegexToken('gg', match1to2, match2); - addRegexToken('GGGG', match1to4, match4); - addRegexToken('gggg', match1to4, match4); - addRegexToken('GGGGG', match1to6, match6); - addRegexToken('ggggg', match1to6, match6); - - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { - week[token.substr(0, 2)] = toInt(input); - }); - - addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = utils_hooks__hooks.parseTwoDigitYear(input); - }); - - // MOMENTS - - function getSetWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy); - } - - function getSetISOWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, this.isoWeek(), this.isoWeekday(), 1, 4); - } - - function getISOWeeksInYear () { - return weeksInYear(this.year(), 1, 4); - } - - function getWeeksInYear () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - } - - function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; - } - return setWeekAll.call(this, input, week, weekday, dow, doy); - } - } - - function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; - } - - // FORMATTING - - addFormatToken('Q', 0, 'Qo', 'quarter'); - - // ALIASES - - addUnitAlias('quarter', 'Q'); - - // PARSING - - addRegexToken('Q', match1); - addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; - }); - - // MOMENTS - - function getSetQuarter (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - } - - // FORMATTING - - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - - // ALIASES - - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); - - // PARSING - - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); - - addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); - }); - - // HELPERS - - // LOCALES - - function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } - - var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }; - - function localeFirstDayOfWeek () { - return this._week.dow; - } - - function localeFirstDayOfYear () { - return this._week.doy; - } - - // MOMENTS - - function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - // FORMATTING - - addFormatToken('D', ['DD', 2], 'Do', 'date'); - - // ALIASES - - addUnitAlias('date', 'D'); - - // PARSING - - addRegexToken('D', match1to2); - addRegexToken('DD', match1to2, match2); - addRegexToken('Do', function (isStrict, locale) { - return isStrict ? locale._ordinalParse : locale._ordinalParseLenient; - }); - - addParseToken(['D', 'DD'], DATE); - addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0], 10); - }); - - // MOMENTS - - var getSetDayOfMonth = makeGetSet('Date', true); - - // FORMATTING - - addFormatToken('d', 0, 'do', 'day'); - - addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); - }); - - addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); - }); - - addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); - }); - - addFormatToken('e', 0, 0, 'weekday'); - addFormatToken('E', 0, 0, 'isoWeekday'); - - // ALIASES - - addUnitAlias('day', 'd'); - addUnitAlias('weekday', 'e'); - addUnitAlias('isoWeekday', 'E'); - - // PARSING - - addRegexToken('d', match1to2); - addRegexToken('e', match1to2); - addRegexToken('E', match1to2); - addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); - }); - addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); - }); - addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); - }); - - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } - }); - - addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); - }); - - // HELPERS - - function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } - - if (!isNaN(input)) { - return parseInt(input, 10); - } - - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } - - return null; - } - - // LOCALES - - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); - function localeWeekdays (m, format) { - return isArray(this._weekdays) ? this._weekdays[m.day()] : - this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; - } - - var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); - function localeWeekdaysShort (m) { - return this._weekdaysShort[m.day()]; - } - - var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); - function localeWeekdaysMin (m) { - return this._weekdaysMin[m.day()]; - } - - function day_of_week__handleStrictParse(weekdayName, format, strict) { - var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; - - for (i = 0; i < 7; ++i) { - mom = create_utc__createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeWeekdaysParse (weekdayName, format, strict) { - var i, mom, regex; - - if (this._weekdaysParseExact) { - return day_of_week__handleStrictParse.call(this, weekdayName, format, strict); - } - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - - mom = create_utc__createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); - this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); - this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); - } - if (!this._weekdaysParse[i]) { - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - } - - // MOMENTS - - function getSetDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - } - - function getSetLocaleDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - } - - function getSetISODayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); - } - - var defaultWeekdaysRegex = matchWord; - function weekdaysRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - return this._weekdaysStrictRegex && isStrict ? - this._weekdaysStrictRegex : this._weekdaysRegex; - } - } - - var defaultWeekdaysShortRegex = matchWord; - function weekdaysShortRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - return this._weekdaysShortStrictRegex && isStrict ? - this._weekdaysShortStrictRegex : this._weekdaysShortRegex; - } - } - - var defaultWeekdaysMinRegex = matchWord; - function weekdaysMinRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; - } else { - return this._weekdaysMinRegex; - } - } else { - return this._weekdaysMinStrictRegex && isStrict ? - this._weekdaysMinStrictRegex : this._weekdaysMinRegex; - } - } - - - function computeWeekdaysParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], - i, mom, minp, shortp, longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = create_utc__createUTC([2000, 1]).day(i); - minp = this.weekdaysMin(mom, ''); - shortp = this.weekdaysShort(mom, ''); - longp = this.weekdays(mom, ''); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 7; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; - - this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); - } - - // FORMATTING - - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - - // ALIASES - - addUnitAlias('dayOfYear', 'DDD'); - - // PARSING - - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); - }); - - // HELPERS - - // MOMENTS - - function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - } - - // FORMATTING - - function hFormat() { - return this.hours() % 12 || 12; - } - - function kFormat() { - return this.hours() || 24; - } - - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, hFormat); - addFormatToken('k', ['kk', 2], 0, kFormat); - - addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); - }); - - addFormatToken('hmmss', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); - }); - - addFormatToken('Hmmss', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - function meridiem (token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); - }); - } - - meridiem('a', true); - meridiem('A', false); - - // ALIASES - - addUnitAlias('hour', 'h'); - - // PARSING - - function matchMeridiem (isStrict, locale) { - return locale._meridiemParse; - } - - addRegexToken('a', matchMeridiem); - addRegexToken('A', matchMeridiem); - addRegexToken('H', match1to2); - addRegexToken('h', match1to2); - addRegexToken('HH', match1to2, match2); - addRegexToken('hh', match1to2, match2); - - addRegexToken('hmm', match3to4); - addRegexToken('hmmss', match5to6); - addRegexToken('Hmm', match3to4); - addRegexToken('Hmmss', match5to6); - - addParseToken(['H', 'HH'], HOUR); - addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; - }); - addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - }); - addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - }); - - // LOCALES - - function localeIsPM (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - } - - var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; - function localeMeridiem (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } - } - - - // MOMENTS - - // Setting the hour should keep the time, because the user explicitly - // specified which hour he wants. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - var getSetHour = makeGetSet('Hours', true); - - // FORMATTING - - addFormatToken('m', ['mm', 2], 0, 'minute'); - - // ALIASES - - addUnitAlias('minute', 'm'); - - // PARSING - - addRegexToken('m', match1to2); - addRegexToken('mm', match1to2, match2); - addParseToken(['m', 'mm'], MINUTE); - - // MOMENTS - - var getSetMinute = makeGetSet('Minutes', false); - - // FORMATTING - - addFormatToken('s', ['ss', 2], 0, 'second'); - - // ALIASES - - addUnitAlias('second', 's'); - - // PARSING - - addRegexToken('s', match1to2); - addRegexToken('ss', match1to2, match2); - addParseToken(['s', 'ss'], SECOND); - - // MOMENTS - - var getSetSecond = makeGetSet('Seconds', false); - - // FORMATTING - - addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); - }); - - addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); - }); - - addFormatToken(0, ['SSS', 3], 0, 'millisecond'); - addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; - }); - addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; - }); - addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; - }); - addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; - }); - addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; - }); - addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; - }); - - - // ALIASES - - addUnitAlias('millisecond', 'ms'); - - // PARSING - - addRegexToken('S', match1to3, match1); - addRegexToken('SS', match1to3, match2); - addRegexToken('SSS', match1to3, match3); - - var token; - for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); - } - - function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); - } - - for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); - } - // MOMENTS - - var getSetMillisecond = makeGetSet('Milliseconds', false); - - // FORMATTING - - addFormatToken('z', 0, 0, 'zoneAbbr'); - addFormatToken('zz', 0, 0, 'zoneName'); - - // MOMENTS - - function getZoneAbbr () { - return this._isUTC ? 'UTC' : ''; - } - - function getZoneName () { - return this._isUTC ? 'Coordinated Universal Time' : ''; - } - - var momentPrototype__proto = Moment.prototype; - - momentPrototype__proto.add = add_subtract__add; - momentPrototype__proto.calendar = moment_calendar__calendar; - momentPrototype__proto.clone = clone; - momentPrototype__proto.diff = diff; - momentPrototype__proto.endOf = endOf; - momentPrototype__proto.format = format; - momentPrototype__proto.from = from; - momentPrototype__proto.fromNow = fromNow; - momentPrototype__proto.to = to; - momentPrototype__proto.toNow = toNow; - momentPrototype__proto.get = getSet; - momentPrototype__proto.invalidAt = invalidAt; - momentPrototype__proto.isAfter = isAfter; - momentPrototype__proto.isBefore = isBefore; - momentPrototype__proto.isBetween = isBetween; - momentPrototype__proto.isSame = isSame; - momentPrototype__proto.isSameOrAfter = isSameOrAfter; - momentPrototype__proto.isSameOrBefore = isSameOrBefore; - momentPrototype__proto.isValid = moment_valid__isValid; - momentPrototype__proto.lang = lang; - momentPrototype__proto.locale = locale; - momentPrototype__proto.localeData = localeData; - momentPrototype__proto.max = prototypeMax; - momentPrototype__proto.min = prototypeMin; - momentPrototype__proto.parsingFlags = parsingFlags; - momentPrototype__proto.set = getSet; - momentPrototype__proto.startOf = startOf; - momentPrototype__proto.subtract = add_subtract__subtract; - momentPrototype__proto.toArray = toArray; - momentPrototype__proto.toObject = toObject; - momentPrototype__proto.toDate = toDate; - momentPrototype__proto.toISOString = moment_format__toISOString; - momentPrototype__proto.toJSON = toJSON; - momentPrototype__proto.toString = toString; - momentPrototype__proto.unix = unix; - momentPrototype__proto.valueOf = to_type__valueOf; - momentPrototype__proto.creationData = creationData; - - // Year - momentPrototype__proto.year = getSetYear; - momentPrototype__proto.isLeapYear = getIsLeapYear; - - // Week Year - momentPrototype__proto.weekYear = getSetWeekYear; - momentPrototype__proto.isoWeekYear = getSetISOWeekYear; - - // Quarter - momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter; - - // Month - momentPrototype__proto.month = getSetMonth; - momentPrototype__proto.daysInMonth = getDaysInMonth; - - // Week - momentPrototype__proto.week = momentPrototype__proto.weeks = getSetWeek; - momentPrototype__proto.isoWeek = momentPrototype__proto.isoWeeks = getSetISOWeek; - momentPrototype__proto.weeksInYear = getWeeksInYear; - momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear; - - // Day - momentPrototype__proto.date = getSetDayOfMonth; - momentPrototype__proto.day = momentPrototype__proto.days = getSetDayOfWeek; - momentPrototype__proto.weekday = getSetLocaleDayOfWeek; - momentPrototype__proto.isoWeekday = getSetISODayOfWeek; - momentPrototype__proto.dayOfYear = getSetDayOfYear; - - // Hour - momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour; - - // Minute - momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute; - - // Second - momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond; - - // Millisecond - momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond; - - // Offset - momentPrototype__proto.utcOffset = getSetOffset; - momentPrototype__proto.utc = setOffsetToUTC; - momentPrototype__proto.local = setOffsetToLocal; - momentPrototype__proto.parseZone = setOffsetToParsedOffset; - momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset; - momentPrototype__proto.isDST = isDaylightSavingTime; - momentPrototype__proto.isDSTShifted = isDaylightSavingTimeShifted; - momentPrototype__proto.isLocal = isLocal; - momentPrototype__proto.isUtcOffset = isUtcOffset; - momentPrototype__proto.isUtc = isUtc; - momentPrototype__proto.isUTC = isUtc; - - // Timezone - momentPrototype__proto.zoneAbbr = getZoneAbbr; - momentPrototype__proto.zoneName = getZoneName; - - // Deprecations - momentPrototype__proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); - momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); - momentPrototype__proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); - momentPrototype__proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone); - - var momentPrototype = momentPrototype__proto; - - function moment__createUnix (input) { - return local__createLocal(input * 1000); - } - - function moment__createInZone () { - return local__createLocal.apply(null, arguments).parseZone(); - } - - var defaultCalendar = { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }; - - function locale_calendar__calendar (key, mom, now) { - var output = this._calendar[key]; - return isFunction(output) ? output.call(mom, now) : output; - } - - var defaultLongDateFormat = { - LTS : 'h:mm:ss A', - LT : 'h:mm A', - L : 'MM/DD/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }; - - function longDateFormat (key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; - - if (format || !formatUpper) { - return format; - } - - this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - - return this._longDateFormat[key]; - } - - var defaultInvalidDate = 'Invalid date'; - - function invalidDate () { - return this._invalidDate; - } - - var defaultOrdinal = '%d'; - var defaultOrdinalParse = /\d{1,2}/; - - function ordinal (number) { - return this._ordinal.replace('%d', number); - } - - function preParsePostFormat (string) { - return string; - } - - var defaultRelativeTime = { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }; - - function relative__relativeTime (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (isFunction(output)) ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - } - - function pastFuture (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); - } - - var prototype__proto = Locale.prototype; - - prototype__proto._calendar = defaultCalendar; - prototype__proto.calendar = locale_calendar__calendar; - prototype__proto._longDateFormat = defaultLongDateFormat; - prototype__proto.longDateFormat = longDateFormat; - prototype__proto._invalidDate = defaultInvalidDate; - prototype__proto.invalidDate = invalidDate; - prototype__proto._ordinal = defaultOrdinal; - prototype__proto.ordinal = ordinal; - prototype__proto._ordinalParse = defaultOrdinalParse; - prototype__proto.preparse = preParsePostFormat; - prototype__proto.postformat = preParsePostFormat; - prototype__proto._relativeTime = defaultRelativeTime; - prototype__proto.relativeTime = relative__relativeTime; - prototype__proto.pastFuture = pastFuture; - prototype__proto.set = locale_set__set; - - // Month - prototype__proto.months = localeMonths; - prototype__proto._months = defaultLocaleMonths; - prototype__proto.monthsShort = localeMonthsShort; - prototype__proto._monthsShort = defaultLocaleMonthsShort; - prototype__proto.monthsParse = localeMonthsParse; - prototype__proto._monthsRegex = defaultMonthsRegex; - prototype__proto.monthsRegex = monthsRegex; - prototype__proto._monthsShortRegex = defaultMonthsShortRegex; - prototype__proto.monthsShortRegex = monthsShortRegex; - - // Week - prototype__proto.week = localeWeek; - prototype__proto._week = defaultLocaleWeek; - prototype__proto.firstDayOfYear = localeFirstDayOfYear; - prototype__proto.firstDayOfWeek = localeFirstDayOfWeek; - - // Day of Week - prototype__proto.weekdays = localeWeekdays; - prototype__proto._weekdays = defaultLocaleWeekdays; - prototype__proto.weekdaysMin = localeWeekdaysMin; - prototype__proto._weekdaysMin = defaultLocaleWeekdaysMin; - prototype__proto.weekdaysShort = localeWeekdaysShort; - prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort; - prototype__proto.weekdaysParse = localeWeekdaysParse; - - prototype__proto._weekdaysRegex = defaultWeekdaysRegex; - prototype__proto.weekdaysRegex = weekdaysRegex; - prototype__proto._weekdaysShortRegex = defaultWeekdaysShortRegex; - prototype__proto.weekdaysShortRegex = weekdaysShortRegex; - prototype__proto._weekdaysMinRegex = defaultWeekdaysMinRegex; - prototype__proto.weekdaysMinRegex = weekdaysMinRegex; - - // Hours - prototype__proto.isPM = localeIsPM; - prototype__proto._meridiemParse = defaultLocaleMeridiemParse; - prototype__proto.meridiem = localeMeridiem; - - function lists__get (format, index, field, setter) { - var locale = locale_locales__getLocale(); - var utc = create_utc__createUTC().set(setter, index); - return locale[field](utc, format); - } - - function listMonthsImpl (format, index, field) { - if (typeof format === 'number') { - index = format; - format = undefined; - } - - format = format || ''; - - if (index != null) { - return lists__get(format, index, field, 'month'); - } - - var i; - var out = []; - for (i = 0; i < 12; i++) { - out[i] = lists__get(format, i, field, 'month'); - } - return out; - } - - // () - // (5) - // (fmt, 5) - // (fmt) - // (true) - // (true, 5) - // (true, fmt, 5) - // (true, fmt) - function listWeekdaysImpl (localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (typeof format === 'number') { - index = format; - format = undefined; - } - - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; - - if (typeof format === 'number') { - index = format; - format = undefined; - } - - format = format || ''; - } - - var locale = locale_locales__getLocale(), - shift = localeSorted ? locale._week.dow : 0; - - if (index != null) { - return lists__get(format, (index + shift) % 7, field, 'day'); - } - - var i; - var out = []; - for (i = 0; i < 7; i++) { - out[i] = lists__get(format, (i + shift) % 7, field, 'day'); - } - return out; - } - - function lists__listMonths (format, index) { - return listMonthsImpl(format, index, 'months'); - } - - function lists__listMonthsShort (format, index) { - return listMonthsImpl(format, index, 'monthsShort'); - } - - function lists__listWeekdays (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); - } - - function lists__listWeekdaysShort (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); - } - - function lists__listWeekdaysMin (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); - } - - locale_locales__getSetGlobalLocale('en', { - ordinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - // Side effect imports - utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale); - utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale); - - var mathAbs = Math.abs; - - function duration_abs__abs () { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; - } - - function duration_add_subtract__addSubtract (duration, input, value, direction) { - var other = create__createDuration(input, value); - - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - - return duration._bubble(); - } - - // supports only 2.0-style add(1, 's') or add(duration) - function duration_add_subtract__add (input, value) { - return duration_add_subtract__addSubtract(this, input, value, 1); - } - - // supports only 2.0-style subtract(1, 's') or subtract(duration) - function duration_add_subtract__subtract (input, value) { - return duration_add_subtract__addSubtract(this, input, value, -1); - } - - function absCeil (number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } - } - - function bubble () { - var milliseconds = this._milliseconds; - var days = this._days; - var months = this._months; - var data = this._data; - var seconds, minutes, hours, years, monthsFromDays; - - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if (!((milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0))) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; - } - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; - - days += absFloor(hours / 24); - - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - - return this; - } - - function daysToMonths (days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return days * 4800 / 146097; - } - - function monthsToDays (months) { - // the reverse of daysToMonths - return months * 146097 / 4800; - } - - function as (units) { - var days; - var months; - var milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); - switch (units) { - case 'week' : return days / 7 + milliseconds / 6048e5; - case 'day' : return days + milliseconds / 864e5; - case 'hour' : return days * 24 + milliseconds / 36e5; - case 'minute' : return days * 1440 + milliseconds / 6e4; - case 'second' : return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 864e5) + milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } - } - - // TODO: Use this.as('ms')? - function duration_as__valueOf () { - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 - ); - } - - function makeAs (alias) { - return function () { - return this.as(alias); - }; - } - - var asMilliseconds = makeAs('ms'); - var asSeconds = makeAs('s'); - var asMinutes = makeAs('m'); - var asHours = makeAs('h'); - var asDays = makeAs('d'); - var asWeeks = makeAs('w'); - var asMonths = makeAs('M'); - var asYears = makeAs('y'); - - function duration_get__get (units) { - units = normalizeUnits(units); - return this[units + 's'](); - } - - function makeGetter(name) { - return function () { - return this._data[name]; - }; - } - - var milliseconds = makeGetter('milliseconds'); - var seconds = makeGetter('seconds'); - var minutes = makeGetter('minutes'); - var hours = makeGetter('hours'); - var days = makeGetter('days'); - var months = makeGetter('months'); - var years = makeGetter('years'); - - function weeks () { - return absFloor(this.days() / 7); - } - - var round = Math.round; - var thresholds = { - s: 45, // seconds to minute - m: 45, // minutes to hour - h: 22, // hours to day - d: 26, // days to month - M: 11 // months to year - }; - - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } - - function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) { - var duration = create__createDuration(posNegDuration).abs(); - var seconds = round(duration.as('s')); - var minutes = round(duration.as('m')); - var hours = round(duration.as('h')); - var days = round(duration.as('d')); - var months = round(duration.as('M')); - var years = round(duration.as('y')); - - var a = seconds < thresholds.s && ['s', seconds] || - minutes <= 1 && ['m'] || - minutes < thresholds.m && ['mm', minutes] || - hours <= 1 && ['h'] || - hours < thresholds.h && ['hh', hours] || - days <= 1 && ['d'] || - days < thresholds.d && ['dd', days] || - months <= 1 && ['M'] || - months < thresholds.M && ['MM', months] || - years <= 1 && ['y'] || ['yy', years]; - - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); - } - - // This function allows you to set a threshold for relative time strings - function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - return true; - } - - function humanize (withSuffix) { - var locale = this.localeData(); - var output = duration_humanize__relativeTime(this, !withSuffix, locale); - - if (withSuffix) { - output = locale.pastFuture(+this, output); - } - - return locale.postformat(output); - } - - var iso_string__abs = Math.abs; - - function iso_string__toISOString() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - var seconds = iso_string__abs(this._milliseconds) / 1000; - var days = iso_string__abs(this._days); - var months = iso_string__abs(this._months); - var minutes, hours, years; - - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = years; - var M = months; - var D = days; - var h = hours; - var m = minutes; - var s = seconds; - var total = this.asSeconds(); - - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - - return (total < 0 ? '-' : '') + - 'P' + - (Y ? Y + 'Y' : '') + - (M ? M + 'M' : '') + - (D ? D + 'D' : '') + - ((h || m || s) ? 'T' : '') + - (h ? h + 'H' : '') + - (m ? m + 'M' : '') + - (s ? s + 'S' : ''); - } - - var duration_prototype__proto = Duration.prototype; - - duration_prototype__proto.abs = duration_abs__abs; - duration_prototype__proto.add = duration_add_subtract__add; - duration_prototype__proto.subtract = duration_add_subtract__subtract; - duration_prototype__proto.as = as; - duration_prototype__proto.asMilliseconds = asMilliseconds; - duration_prototype__proto.asSeconds = asSeconds; - duration_prototype__proto.asMinutes = asMinutes; - duration_prototype__proto.asHours = asHours; - duration_prototype__proto.asDays = asDays; - duration_prototype__proto.asWeeks = asWeeks; - duration_prototype__proto.asMonths = asMonths; - duration_prototype__proto.asYears = asYears; - duration_prototype__proto.valueOf = duration_as__valueOf; - duration_prototype__proto._bubble = bubble; - duration_prototype__proto.get = duration_get__get; - duration_prototype__proto.milliseconds = milliseconds; - duration_prototype__proto.seconds = seconds; - duration_prototype__proto.minutes = minutes; - duration_prototype__proto.hours = hours; - duration_prototype__proto.days = days; - duration_prototype__proto.weeks = weeks; - duration_prototype__proto.months = months; - duration_prototype__proto.years = years; - duration_prototype__proto.humanize = humanize; - duration_prototype__proto.toISOString = iso_string__toISOString; - duration_prototype__proto.toString = iso_string__toISOString; - duration_prototype__proto.toJSON = iso_string__toISOString; - duration_prototype__proto.locale = locale; - duration_prototype__proto.localeData = localeData; - - // Deprecations - duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString); - duration_prototype__proto.lang = lang; - - // Side effect imports - - // FORMATTING - - addFormatToken('X', 0, 0, 'unix'); - addFormatToken('x', 0, 0, 'valueOf'); - - // PARSING - - addRegexToken('x', matchSigned); - addRegexToken('X', matchTimestamp); - addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input, 10) * 1000); - }); - addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); - }); - - // Side effect imports - - - utils_hooks__hooks.version = '2.13.0'; - - setHookCallback(local__createLocal); - - utils_hooks__hooks.fn = momentPrototype; - utils_hooks__hooks.min = min; - utils_hooks__hooks.max = max; - utils_hooks__hooks.now = now; - utils_hooks__hooks.utc = create_utc__createUTC; - utils_hooks__hooks.unix = moment__createUnix; - utils_hooks__hooks.months = lists__listMonths; - utils_hooks__hooks.isDate = isDate; - utils_hooks__hooks.locale = locale_locales__getSetGlobalLocale; - utils_hooks__hooks.invalid = valid__createInvalid; - utils_hooks__hooks.duration = create__createDuration; - utils_hooks__hooks.isMoment = isMoment; - utils_hooks__hooks.weekdays = lists__listWeekdays; - utils_hooks__hooks.parseZone = moment__createInZone; - utils_hooks__hooks.localeData = locale_locales__getLocale; - utils_hooks__hooks.isDuration = isDuration; - utils_hooks__hooks.monthsShort = lists__listMonthsShort; - utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin; - utils_hooks__hooks.defineLocale = defineLocale; - utils_hooks__hooks.updateLocale = updateLocale; - utils_hooks__hooks.locales = locale_locales__listLocales; - utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort; - utils_hooks__hooks.normalizeUnits = normalizeUnits; - utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold; - utils_hooks__hooks.prototype = momentPrototype; - - var _moment = utils_hooks__hooks; - - return _moment; - -})); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.hbs deleted file mode 100644 index 497a259d45..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.hbs +++ /dev/null @@ -1,29 +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. -}} -{{#zone "topCss"}} - {{~css "css/dataTables.bootstrap.css"}} - {{~css "css/dataTables.responsive.css"}} -{{/zone}} -{{#zone "bottomJs"}} - {{~js "js/jquery.dataTables.min.js"}} - {{~js "js/dataTables.bootstrap.js"}} - {{~js "js/dataTables.responsive.min.js"}} - {{~js "js/dataTables.extended.js"}} - {{~js "js/dataTables.fnSetFilteringDelay.js"}} - {{~js "js/dataTables.extended.serversidepaging.js"}} -{{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.js deleted file mode 100644 index 9ce9112cdb..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.json b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.json deleted file mode 100644 index ea6d636876..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "version" : "1.0.0" -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/css/dataTables.bootstrap.css b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/css/dataTables.bootstrap.css deleted file mode 100644 index 94e35f77a2..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/css/dataTables.bootstrap.css +++ /dev/null @@ -1,390 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -div.dataTables_length label { - font-weight: normal; - text-align: left; - white-space: nowrap; -} - -div.dataTables_length select { - width: 75px; - display: inline-block; -} - -div.dataTables_filter { - text-align: right; -} - -div.dataTables_filter label { - font-weight: normal; - white-space: nowrap; - text-align: left; -} - -div.dataTables_filter input { - margin-left: 0.5em; - display: inline-block; - width: auto; -} - -div.dataTables_info { - padding-top: 8px; - white-space: nowrap; -} - -div.dataTables_paginate { - margin: 0; - white-space: nowrap; - text-align: right; -} - -div.dataTables_paginate ul.pagination { - margin: 2px 0; - white-space: nowrap; -} - -@media screen and (max-width: 767px) { - div.dataTables_wrapper > div.row > div, - div.dataTables_length, - div.dataTables_filter, - div.dataTables_info, - div.dataTables_paginate { - text-align: center; - } - - div.DTTT { - margin-bottom: 0.5em; - } -} - - -table.dataTable td, -table.dataTable th { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - - -table.dataTable { - clear: both; - margin-top: 6px !important; - margin-bottom: 6px !important; - max-width: none !important; -} - -table.dataTable thead .sorting, -table.dataTable thead .sorting_asc, -table.dataTable thead .sorting_desc, -table.dataTable thead .sorting_asc_disabled, -table.dataTable thead .sorting_desc_disabled { - cursor: pointer; - position: relative; -} - -table.dataTable thead .sorting:after, -table.dataTable thead .sorting_asc:after, -table.dataTable thead .sorting_desc:after { - position: absolute; - top: 8px; - right: 8px; - display: block; - font-family: 'Glyphicons Halflings'; - opacity: 0.5; -} -table.dataTable thead .sorting:after { - opacity: 0.2; - content: "\e150"; /* sort */ -} -table.dataTable thead .sorting_asc:after { - content: "\e155"; /* sort-by-attributes */ -} -table.dataTable thead .sorting_desc:after { - content: "\e156"; /* sort-by-attributes-alt */ -} -div.dataTables_scrollBody table.dataTable thead .sorting:after, -div.dataTables_scrollBody table.dataTable thead .sorting_asc:after, -div.dataTables_scrollBody table.dataTable thead .sorting_desc:after { - display: none; -} - -table.dataTable thead .sorting_asc_disabled:after, -table.dataTable thead .sorting_desc_disabled:after { - color: #eee; -} - -table.dataTable thead > tr > th { - padding-right: 30px; -} - -table.dataTable th:active { - outline: none; -} - - -/* Condensed */ -table.dataTable.table-condensed thead > tr > th { - padding-right: 20px; -} - -table.dataTable.table-condensed thead .sorting:after, -table.dataTable.table-condensed thead .sorting_asc:after, -table.dataTable.table-condensed thead .sorting_desc:after { - top: 6px; - right: 6px; -} - -/* Scrolling */ -div.dataTables_scrollHead table { - margin-bottom: 0 !important; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -div.dataTables_scrollHead table thead tr:last-child th:first-child, -div.dataTables_scrollHead table thead tr:last-child td:first-child { - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -div.dataTables_scrollBody table { - border-top: none; - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -div.dataTables_scrollBody tbody tr:first-child th, -div.dataTables_scrollBody tbody tr:first-child td { - border-top: none; -} - -div.dataTables_scrollFoot table { - margin-top: 0 !important; - border-top: none; -} - -/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column - width calculations when using scrolling impossible to align columns. We have - to use separate - */ -table.table-bordered.dataTable { - border-collapse: separate !important; -} -table.table-bordered thead th, -table.table-bordered thead td { - border-left-width: 0; - border-top-width: 0; -} -table.table-bordered tbody th, -table.table-bordered tbody td { - border-left-width: 0; - border-bottom-width: 0; -} -table.table-bordered tfoot th, -table.table-bordered tfoot td { - border-left-width: 0; - border-bottom-width: 0; -} -table.table-bordered th:last-child, -table.table-bordered td:last-child { - border-right-width: 0; -} -div.dataTables_scrollHead table.table-bordered { - border-bottom-width: 0; -} - - - - -/* - * TableTools styles - */ -.table.dataTable tbody tr.active td, -.table.dataTable tbody tr.active th { - background-color: #08C; - color: white; -} - -.table.dataTable tbody tr.active:hover td, -.table.dataTable tbody tr.active:hover th { - background-color: #0075b0 !important; -} - -.table.dataTable tbody tr.active th > a, -.table.dataTable tbody tr.active td > a { - color: white; -} - -.table-striped.dataTable tbody tr.active:nth-child(odd) td, -.table-striped.dataTable tbody tr.active:nth-child(odd) th { - background-color: #017ebc; -} - -table.DTTT_selectable tbody tr { - cursor: pointer; -} - -div.DTTT .btn:hover { - text-decoration: none !important; -} - -ul.DTTT_dropdown.dropdown-menu { - z-index: 2003; -} - -ul.DTTT_dropdown.dropdown-menu a { - color: #333 !important; /* needed only when demo_page.css is included */ -} - -ul.DTTT_dropdown.dropdown-menu li { - position: relative; -} - -ul.DTTT_dropdown.dropdown-menu li:hover a { - background-color: #0088cc; - color: white !important; -} - -div.DTTT_collection_background { - z-index: 2002; -} - -/* TableTools information display */ -div.DTTT_print_info { - position: fixed; - top: 50%; - left: 50%; - width: 400px; - height: 150px; - margin-left: -200px; - margin-top: -75px; - text-align: center; - color: #333; - padding: 10px 30px; - opacity: 0.95; - - background-color: white; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); -} - -div.DTTT_print_info h6 { - font-weight: normal; - font-size: 28px; - line-height: 28px; - margin: 1em; -} - -div.DTTT_print_info p { - font-size: 14px; - line-height: 20px; -} - -div.dataTables_processing { - position: absolute; - top: 50%; - left: 50%; - width: 100%; - height: 60px; - margin-left: -50%; - margin-top: -25px; - padding-top: 20px; - padding-bottom: 20px; - text-align: center; - font-size: 1.2em; - background-color: white; - background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0))); - background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); - background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); - background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); - background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); - background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); -} - - - -/* - * FixedColumns styles - */ -div.DTFC_LeftHeadWrapper table, -div.DTFC_LeftFootWrapper table, -div.DTFC_RightHeadWrapper table, -div.DTFC_RightFootWrapper table, -table.DTFC_Cloned tr.even { - background-color: white; - margin-bottom: 0; -} - -div.DTFC_RightHeadWrapper table , -div.DTFC_LeftHeadWrapper table { - border-bottom: none !important; - margin-bottom: 0 !important; - border-top-right-radius: 0 !important; - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child, -div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child, -div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child, -div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child { - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -div.DTFC_RightBodyWrapper table, -div.DTFC_LeftBodyWrapper table { - border-top: none; - margin: 0 !important; -} - -div.DTFC_RightBodyWrapper tbody tr:first-child th, -div.DTFC_RightBodyWrapper tbody tr:first-child td, -div.DTFC_LeftBodyWrapper tbody tr:first-child th, -div.DTFC_LeftBodyWrapper tbody tr:first-child td { - border-top: none; -} - -div.DTFC_RightFootWrapper table, -div.DTFC_LeftFootWrapper table { - border-top: none; - margin-top: 0 !important; -} - - -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting:after, -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_asc:after, -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_desc:after, -div.DTFC_RightBodyWrapper table.dataTable thead .sorting:after, -div.DTFC_RightBodyWrapper table.dataTable thead .sorting_asc:after, -div.DTFC_RightBodyWrapper table.dataTable thead .sorting_desc:after { - display: none; -} - - -/* - * FixedHeader styles - */ -div.FixedHeader_Cloned table { - margin: 0 !important -} - diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/css/dataTables.responsive.css b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/css/dataTables.responsive.css deleted file mode 100644 index 91ff7a1270..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/css/dataTables.responsive.css +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child, -table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child { - position: relative; - padding-left: 30px; - cursor: pointer; -} -table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child:before, -table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child:before { - top: 8px; - left: 4px; - height: 16px; - width: 16px; - display: block; - position: absolute; - color: white; - border: 2px solid white; - border-radius: 16px; - text-align: center; - line-height: 14px; - box-shadow: 0 0 3px #444; - box-sizing: content-box; - content: '+'; - background-color: #31b131; -} -table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child.dataTables_empty:before, -table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child.dataTables_empty:before { - display: none; -} -table.dataTable.dtr-inline.collapsed > tbody > tr.parent > td:first-child:before, -table.dataTable.dtr-inline.collapsed > tbody > tr.parent > th:first-child:before { - content: '-'; - background-color: #d33333; -} -table.dataTable.dtr-inline.collapsed > tbody > tr.child td:before { - display: none; -} -table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child, -table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child { - padding-left: 27px; -} -table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child:before, -table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child:before { - top: 5px; - left: 4px; - height: 14px; - width: 14px; - border-radius: 14px; - line-height: 12px; -} -table.dataTable.dtr-column > tbody > tr > td.control, -table.dataTable.dtr-column > tbody > tr > th.control { - position: relative; - cursor: pointer; -} -table.dataTable.dtr-column > tbody > tr > td.control:before, -table.dataTable.dtr-column > tbody > tr > th.control:before { - top: 50%; - left: 50%; - height: 16px; - width: 16px; - margin-top: -10px; - margin-left: -10px; - display: block; - position: absolute; - color: white; - border: 2px solid white; - border-radius: 16px; - text-align: center; - line-height: 14px; - box-shadow: 0 0 3px #444; - box-sizing: content-box; - content: '+'; - background-color: #31b131; -} -table.dataTable.dtr-column > tbody > tr.parent td.control:before, -table.dataTable.dtr-column > tbody > tr.parent th.control:before { - content: '-'; - background-color: #d33333; -} -table.dataTable > tbody > tr.child { - padding: 0.5em 1em; -} -table.dataTable > tbody > tr.child:hover { - background: transparent !important; -} -table.dataTable > tbody > tr.child ul { - display: inline-block; - list-style-type: none; - margin: 0; - padding: 0; -} -table.dataTable > tbody > tr.child ul li { - border-bottom: 1px solid #efefef; - padding: 0.5em 0; -} -table.dataTable > tbody > tr.child ul li:first-child { - padding-top: 0; -} -table.dataTable > tbody > tr.child ul li:last-child { - border-bottom: none; -} -table.dataTable > tbody > tr.child span.dtr-title { - display: inline-block; - min-width: 75px; - font-weight: bold; -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/js/dataTables.bootstrap.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/js/dataTables.bootstrap.js deleted file mode 100644 index 241f7094a8..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/js/dataTables.bootstrap.js +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. 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. - */ - -/*! DataTables Bootstrap 3 integration - * ©2011-2014 SpryMedia Ltd - datatables.net/license - */ - -/** - * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and - * DataTables 1.10 or newer. - * - * This file sets the defaults and adds options to DataTables to style its - * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap - * for further information. - */ -(function(window, document, undefined){ - -var factory = function( $, DataTable ) { -"use strict"; - - -/* Set the defaults for DataTables initialisation */ -$.extend( true, DataTable.defaults, { - dom: - "<'row'<'col-sm-6'l><'col-sm-6'f>>" + - "<'row'<'col-sm-12'tr>>" + - "<'row'<'col-sm-5'i><'col-sm-7'p>>", - renderer: 'bootstrap' -} ); - - -/* Default class modification */ -$.extend( DataTable.ext.classes, { - sWrapper: "dataTables_wrapper form-inline dt-bootstrap", - sFilterInput: "form-control input-sm", - sLengthSelect: "form-control input-sm" -} ); - - -/* Bootstrap paging button renderer */ -DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) { - var api = new DataTable.Api( settings ); - var classes = settings.oClasses; - var lang = settings.oLanguage.oPaginate; - var btnDisplay, btnClass, counter=0; - - var attach = function( container, buttons ) { - var i, ien, node, button; - var clickHandler = function ( e ) { - e.preventDefault(); - if ( !$(e.currentTarget).hasClass('disabled') ) { - api.page( e.data.action ).draw( false ); - } - }; - - for ( i=0, ien=buttons.length ; i 0 ? - '' : ' disabled'); - break; - - case 'previous': - btnDisplay = lang.sPrevious; - btnClass = button + (page > 0 ? - '' : ' disabled'); - break; - - case 'next': - btnDisplay = lang.sNext; - btnClass = button + (page < pages-1 ? - '' : ' disabled'); - break; - - case 'last': - btnDisplay = lang.sLast; - btnClass = button + (page < pages-1 ? - '' : ' disabled'); - break; - - default: - btnDisplay = button + 1; - btnClass = page === button ? - 'active' : ''; - break; - } - - if ( btnDisplay ) { - node = $('
  • ', { - 'class': classes.sPageButton+' '+btnClass, - 'id': idx === 0 && typeof button === 'string' ? - settings.sTableId +'_'+ button : - null - } ) - .append( $('', { - 'href': '#', - 'aria-controls': settings.sTableId, - 'data-dt-idx': counter, - 'tabindex': settings.iTabIndex - } ) - .html( btnDisplay ) - ) - .appendTo( container ); - - settings.oApi._fnBindAction( - node, {action: button}, clickHandler - ); - - counter++; - } - } - } - }; - - // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. - var activeEl; - - try { - // Because this approach is destroying and recreating the paging - // elements, focus is lost on the select button which is bad for - // accessibility. So we want to restore focus once the draw has - // completed - activeEl = $(document.activeElement).data('dt-idx'); - } - catch (e) {} - - attach( - $(host).empty().html('