From d911281ad1459bd75454e1986f38ca36b498e779 Mon Sep 17 00:00:00 2001 From: geethkokila Date: Thu, 8 Dec 2016 12:34:50 +0530 Subject: [PATCH 1/4] Merging master branch with release-2.0.x --- .../lifecycle/util/AnnotationProcessor.java | 2 +- .../ExtendedFileProtocolIteratorFactory.java | 2 +- .../util/ExtendedIteratorFactory.java | 4 +- .../pom.xml | 6 +- .../mgt/core/impl/CertificateGenerator.java | 154 ++-- .../provider/gcm/GCMNotificationStrategy.java | 9 +- .../mgt/jaxrs/beans/PasswordResetWrapper.java | 3 +- .../device/mgt/jaxrs/beans/PolicyList.java | 3 +- .../device/mgt/jaxrs/beans/Profile.java | 38 +- .../mgt/jaxrs/beans/ProfileFeature.java | 31 +- .../mgt/jaxrs/service/api/Dashboard.java | 713 ++++++++++++++++-- .../impl/UserManagementServiceImpl.java | 17 + .../ExtendedFileProtocolIteratorFactory.java | 2 +- .../permission/ExtendedIteratorFactory.java | 4 +- .../carbon/device/mgt/core/dao/DeviceDAO.java | 11 + .../core/dao/impl/AbstractDeviceDAOImpl.java | 34 + .../mgt/core/search/mgt/dao/SearchDAO.java | 9 +- .../search/mgt/dao/impl/SearchDAOImpl.java | 435 ++++++----- .../core/search/mgt/impl/ProcessorImpl.java | 202 ++++- .../search/mgt/impl/QueryBuilderImpl.java | 63 +- .../DeviceManagementProviderService.java | 9 + .../DeviceManagementProviderServiceImpl.java | 68 ++ .../src/test/resources/testng.xml | 2 +- .../devicemgt/app/conf/app-conf.json | 6 +- .../app/modules/business-controllers/user.js | 39 +- .../pages/cdmf.page.dashboard/dashboard.hbs | 4 +- .../public/js/bottomJs.js | 243 +++--- .../public/templates/device-listing.hbs | 2 +- .../pages/cdmf.page.device.search/search.hbs | 21 +- .../pages/cdmf.page.device.search/search.js | 44 -- .../app/pages/cdmf.page.sign-in/sign-in.hbs | 4 +- .../cdmf.page.users/public/js/listing.js | 6 +- .../app/pages/cdmf.page.users/users.hbs | 4 +- .../configuration.hbs | 2 +- .../user-menu.hbs | 6 +- .../devicemgt/error-pages/error400.html | 33 + .../devicemgt/error-pages/error401.html | 33 + .../devicemgt/error-pages/error403.html | 34 + .../devicemgt/error-pages/error404.html | 33 + .../devicemgt/error-pages/error405.html | 33 + .../devicemgt/error-pages/error500.html | 32 + .../jaggeryapps/devicemgt/jaggery.conf | 82 +- .../app/pages/uuf.page.sign-in/sign-in.hbs | 2 +- .../jaggeryapps/uuf-template-app/jaggery.conf | 49 +- .../uuf-template-app/lib/modules/auth/auth.js | 40 +- .../pom.xml | 2 + .../wso2/carbon/policy/mgt/common/Policy.java | 140 +++- .../carbon/policy/mgt/common/Profile.java | 65 +- .../policy/mgt/common/ProfileFeature.java | 39 +- .../oauth/impl/LocalOAuthValidator.java | 4 + .../src/main/resources/conf/cdm-config.xml | 1 + 51 files changed, 2078 insertions(+), 746 deletions(-) delete mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.device.search/search.js create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error400.html create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error401.html create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error403.html create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error404.html create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error405.html create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error500.html diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java index d36e1442f4..5611b563ca 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java @@ -359,7 +359,7 @@ public class AnnotationProcessor { * @param servletContext * @return null if cannot determin /WEB-INF/classes */ - public static URL findWebInfClassesPath(ServletContext servletContext) + private static URL findWebInfClassesPath(ServletContext servletContext) { String path = servletContext.getRealPath("/WEB-INF/classes"); if (path == null) return null; diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/ExtendedFileProtocolIteratorFactory.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/ExtendedFileProtocolIteratorFactory.java index 34936f61c8..3d5ad74087 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/ExtendedFileProtocolIteratorFactory.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/ExtendedFileProtocolIteratorFactory.java @@ -21,7 +21,7 @@ import java.io.File; import java.io.IOException; import java.net.URL; -public class ExtendedFileProtocolIteratorFactory implements DirectoryIteratorFactory { +class ExtendedFileProtocolIteratorFactory implements DirectoryIteratorFactory { private static final String ENCODING_SCHEME = "UTF-8"; diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/ExtendedIteratorFactory.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/ExtendedIteratorFactory.java index e20b4ba467..2fe56fc930 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/ExtendedIteratorFactory.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/ExtendedIteratorFactory.java @@ -25,11 +25,11 @@ import java.io.IOException; import java.net.URL; import java.util.concurrent.ConcurrentHashMap; -public class ExtendedIteratorFactory { +class ExtendedIteratorFactory { private static final ConcurrentHashMap registry = new ConcurrentHashMap(); - public static StreamIterator create(URL url, Filter filter) throws IOException { + static StreamIterator create(URL url, Filter filter) throws IOException { String urlString = url.toString(); if(urlString.endsWith("!/")) { urlString = urlString.substring(4); diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml index bae82a92b0..cf23d12014 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml @@ -50,7 +50,10 @@ ${project.artifactId} ${carbon.device.mgt.version} Device Management Core Bundle - org.wso2.carbon.certificate.mgt.core.internal + + org.wso2.carbon.certificate.mgt.core.internal, + org.wso2.carbon.certificate.mgt.core.util + org.osgi.framework, org.osgi.service.component, @@ -95,6 +98,7 @@ !org.wso2.carbon.certificate.mgt.core.internal.*, + !org.wso2.carbon.certificate.mgt.core.util, org.wso2.carbon.certificate.mgt.core.* diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java index 854d88794a..8f47afc688 100755 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java @@ -526,61 +526,61 @@ public class CertificateGenerator { } } - private PrivateKey getSignerKey(String signerPrivateKeyPath) throws KeystoreException { - - File file = new File(signerPrivateKeyPath); - FileInputStream fis; - - try { - fis = new FileInputStream(file); - DataInputStream dis = new DataInputStream(fis); - byte[] keyBytes = new byte[(int) file.length()]; - dis.readFully(keyBytes); - dis.close(); - - String temp = new String(keyBytes); - String privateKeyPEM = temp.replace( - CertificateManagementConstants.RSA_PRIVATE_KEY_BEGIN_TEXT, CertificateManagementConstants.EMPTY_TEXT); - privateKeyPEM = privateKeyPEM - .replace(CertificateManagementConstants.RSA_PRIVATE_KEY_END_TEXT, CertificateManagementConstants.EMPTY_TEXT); - - byte[] decoded = Base64.decodeBase64(privateKeyPEM); - PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(decoded); - KeyFactory keyFactory = KeyFactory.getInstance(CertificateManagementConstants.RSA); - - return keyFactory.generatePrivate(encodedKeySpec); - } catch (FileNotFoundException e) { - String errorMsg = "Private key file not found in getSignerKey"; - throw new KeystoreException(errorMsg, e); - } catch (IOException e) { - String errorMsg = "Input output issue in getSignerKey"; - throw new KeystoreException(errorMsg, e); - } catch (NoSuchAlgorithmException e) { - String errorMsg = "Algorithm not not found in getSignerKey"; - throw new KeystoreException(errorMsg, e); - } catch (InvalidKeySpecException e) { - String errorMsg = "Invalid key found in getSignerKey"; - throw new KeystoreException(errorMsg, e); - } - } - - private X509Certificate getSigner(String signerCertificatePath) throws KeystoreException { - - X509Certificate certificate; - try { - CertificateFactory certificateFactory = CertificateFactory.getInstance(CertificateManagementConstants.X_509); - certificate = (X509Certificate) certificateFactory.generateCertificate( - new FileInputStream(signerCertificatePath)); - - return certificate; - } catch (CertificateException e) { - String errorMsg = "Certificate related issue occurred in getSigner"; - throw new KeystoreException(errorMsg, e); - } catch (FileNotFoundException e) { - String errorMsg = "Signer certificate path not found in getSigner"; - throw new KeystoreException(errorMsg, e); - } - } +// private PrivateKey getSignerKey(String signerPrivateKeyPath) throws KeystoreException { +// +// File file = new File(signerPrivateKeyPath); +// FileInputStream fis; +// +// try { +// fis = new FileInputStream(file); +// DataInputStream dis = new DataInputStream(fis); +// byte[] keyBytes = new byte[(int) file.length()]; +// dis.readFully(keyBytes); +// dis.close(); +// +// String temp = new String(keyBytes); +// String privateKeyPEM = temp.replace( +// CertificateManagementConstants.RSA_PRIVATE_KEY_BEGIN_TEXT, CertificateManagementConstants.EMPTY_TEXT); +// privateKeyPEM = privateKeyPEM +// .replace(CertificateManagementConstants.RSA_PRIVATE_KEY_END_TEXT, CertificateManagementConstants.EMPTY_TEXT); +// +// byte[] decoded = Base64.decodeBase64(privateKeyPEM); +// PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(decoded); +// KeyFactory keyFactory = KeyFactory.getInstance(CertificateManagementConstants.RSA); +// +// return keyFactory.generatePrivate(encodedKeySpec); +// } catch (FileNotFoundException e) { +// String errorMsg = "Private key file not found in getSignerKey"; +// throw new KeystoreException(errorMsg, e); +// } catch (IOException e) { +// String errorMsg = "Input output issue in getSignerKey"; +// throw new KeystoreException(errorMsg, e); +// } catch (NoSuchAlgorithmException e) { +// String errorMsg = "Algorithm not not found in getSignerKey"; +// throw new KeystoreException(errorMsg, e); +// } catch (InvalidKeySpecException e) { +// String errorMsg = "Invalid key found in getSignerKey"; +// throw new KeystoreException(errorMsg, e); +// } +// } +// +// private X509Certificate getSigner(String signerCertificatePath) throws KeystoreException { +// +// X509Certificate certificate; +// try { +// CertificateFactory certificateFactory = CertificateFactory.getInstance(CertificateManagementConstants.X_509); +// certificate = (X509Certificate) certificateFactory.generateCertificate( +// new FileInputStream(signerCertificatePath)); +// +// return certificate; +// } catch (CertificateException e) { +// String errorMsg = "Certificate related issue occurred in getSigner"; +// throw new KeystoreException(errorMsg, e); +// } catch (FileNotFoundException e) { +// String errorMsg = "Signer certificate path not found in getSigner"; +// throw new KeystoreException(errorMsg, e); +// } +// } public SCEPResponse getCACert() throws KeystoreException { @@ -657,28 +657,28 @@ public class CertificateGenerator { return null; } - private ASN1Primitive toASN1Primitive(byte[] data) { - - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data); - ASN1InputStream inputStream = new ASN1InputStream(byteArrayInputStream); - - try { - return inputStream.readObject(); - } catch (IOException e) { - String errorMsg = "IOException occurred when converting binary array to ASN1Primitive"; - log.error(errorMsg, e); - } finally { - try { - byteArrayInputStream.close(); - inputStream.close(); - } catch (IOException e) { - String errorMsg = "IOException occurred when closing streams"; - log.error(errorMsg, e); - } - } - - return null; - } +// private ASN1Primitive toASN1Primitive(byte[] data) { +// +// ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data); +// ASN1InputStream inputStream = new ASN1InputStream(byteArrayInputStream); +// +// try { +// return inputStream.readObject(); +// } catch (IOException e) { +// String errorMsg = "IOException occurred when converting binary array to ASN1Primitive"; +// log.error(errorMsg, e); +// } finally { +// try { +// byteArrayInputStream.close(); +// inputStream.close(); +// } catch (IOException e) { +// String errorMsg = "IOException occurred when closing streams"; +// log.error(errorMsg, e); +// } +// } +// +// return null; +// } /** * This method is used to retrieve signed certificate from certificate signing request. diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMNotificationStrategy.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMNotificationStrategy.java index 4990de95f5..af93b692a4 100644 --- a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMNotificationStrategy.java +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMNotificationStrategy.java @@ -38,7 +38,7 @@ import java.util.List; public class GCMNotificationStrategy implements NotificationStrategy { private static final String GCM_TOKEN = "GCM_TOKEN"; - private final static String GCM_ENDPOINT = "https://gcm-http.googleapis.com/gcm/send"; + private final static String GCM_ENDPOINT = "https://fcm.googleapis.com/fcm/send"; private static final String GCM_API_KEY = "gcmAPIKey"; private static final int TIME_TO_LIVE = 60; private static final int HTTP_STATUS_CODE_OK = 200; @@ -84,13 +84,10 @@ public class GCMNotificationStrategy implements NotificationStrategy { HttpURLConnection conn = null; try { conn = (HttpURLConnection) new URL(GCM_ENDPOINT).openConnection(); - conn.setDoOutput(true); - conn.setUseCaches(false); - conn.setFixedLengthStreamingMode(bytes.length); - conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Authorization", "key=" + config.getProperty(GCM_API_KEY)); - + conn.setRequestMethod("POST"); + conn.setDoOutput(true); os = conn.getOutputStream(); os.write(bytes); } finally { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PasswordResetWrapper.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PasswordResetWrapper.java index 7bd67c2028..f1e186835a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PasswordResetWrapper.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PasswordResetWrapper.java @@ -27,7 +27,8 @@ public class PasswordResetWrapper { /* Base64 encoded password */ - @ApiModelProperty(name = "newPassword", value = "New password of the user.", required = true ) + @ApiModelProperty(name = "newPassword", value = "New password of the user.", required = true, + example = "JiM&100%pW") private String newPassword; public String getNewPassword() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PolicyList.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PolicyList.java index 8710f2bb74..5087fc81b5 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PolicyList.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PolicyList.java @@ -30,7 +30,8 @@ public class PolicyList extends BasePaginatedResult { private List policies; - @ApiModelProperty(value = "List of policies returned") + @ApiModelProperty(value = "Returns the list of policies that match the offset and limit parameter values" + + " that were specified.") @JsonProperty("policies") public List getList() { return policies; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/Profile.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/Profile.java index 77bd4f9b63..89f0dbff7d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/Profile.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/Profile.java @@ -30,23 +30,39 @@ import java.util.List; @ApiModel(value = "Profile", description = "This class carries all information related to policy profiles") public class Profile { - @ApiModelProperty(name = "profileId", value = "The ID of each profile that is in the selected policy", - required = true) + @ApiModelProperty(name = "profileId", + value = "The ID of each profile that is in the selected policy", + required = true, + example = "1") private int profileId; - @ApiModelProperty(name = "profileName", value = "The name of the profile", required = true) + @ApiModelProperty(name = "profileName", + value = "The name of the profile", + required = true, + example = "Block Camera") private String profileName; - @ApiModelProperty(name = "tenantId", value = "The ID of the tenant that added the policy", required = true) + @ApiModelProperty(name = "tenantId", + value = "The ID of the tenant that added the policy", + required = true, + example = "-1234") private int tenantId; - @ApiModelProperty(name = "deviceType", value = "Contains the device type details the policy was created " - + "for", required = true) + @ApiModelProperty(name = "deviceType", + value = "Contains the device type details the policy was created for", + required = true, + example = "android") private String deviceType; - @ApiModelProperty(name = "createdDate", value = "The date the policy was created", required = true) + @ApiModelProperty(name = "createdDate", + value = "The date the policy was created", + required = true, + example = "Thu, 6 Oct 2016 14:39:32 +0530") private Timestamp createdDate; - @ApiModelProperty(name = "updatedDate", value = "The date the changes made to the policy was published to" - + " the devices registered with the EMM", required = true) + @ApiModelProperty(name = "updatedDate", + value = "The date the changes made to the policy was published to the devices registered with the EMM", + required = true, + example = "Thu, 6 Oct 2016 14:39:32 +0530") private Timestamp updatedDate; - @ApiModelProperty(name = "profileFeaturesList", value = "Contains the features specific to each profile " - + "in the policy", required = true) + @ApiModelProperty(name = "profileFeaturesList", + value = "Contains the features specific to each profile in the policy", + required = true) private List profileFeaturesList; // Features included in the policies. public String getDeviceType() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/ProfileFeature.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/ProfileFeature.java index 7a214c308c..b32c7613f4 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/ProfileFeature.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/ProfileFeature.java @@ -28,20 +28,33 @@ import java.io.Serializable; + "features") public class ProfileFeature implements Serializable { - @ApiModelProperty(name = "id", value = "Define the ID", required = true) + @ApiModelProperty(name = "id", + value = "Define the ID", + required = true, + example = "1") private int id; - @ApiModelProperty(name = "featureCode", value = "Provide the code that defines the policy you wish to add", - required = true) + @ApiModelProperty(name = "featureCode", + value = "Provide the code that defines the policy you wish to add", + required = true, + example = "CAMERA") private String featureCode; - @ApiModelProperty(name = "profileId", value = "Define the ID of the profile", required = true) + @ApiModelProperty(name = "profileId", + value = "Define the ID of the profile", + required = true, + example = "1") private int profileId; - @ApiModelProperty(name = "deviceTypeId", value = "The ID used to define the type of the device platform", - required = true) + @ApiModelProperty(name = "deviceTypeId", + value = "The ID used to define the type of the device platform", + required = true, + example = "android") private String deviceType; - @ApiModelProperty(name = "content", value = "The list of parameters that define the policy", - required = true) + @ApiModelProperty(name = "content", + value = "The list of parameters that define the policy", + required = true, + example = "{\\\"enabled\\\":false}") private Object content; - @ApiModelProperty(name = "payLoad", value = "The payload which is submitted to each feature", + @ApiModelProperty(name = "payLoad", + value = "The payload which is submitted to each feature", required = true) private String payLoad; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/Dashboard.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/Dashboard.java index 22126d9042..5fcb651b45 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/Dashboard.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/Dashboard.java @@ -1,57 +1,24 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - package org.wso2.carbon.device.mgt.jaxrs.service.api; -import io.swagger.annotations.SwaggerDefinition; -import io.swagger.annotations.Info; -import io.swagger.annotations.ExtensionProperty; -import io.swagger.annotations.Extension; -import io.swagger.annotations.Tag; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.ResponseHeader; import org.wso2.carbon.apimgt.annotations.api.Permission; +import org.wso2.carbon.device.mgt.analytics.dashboard.bean.DeviceCountByGroup; +import org.wso2.carbon.device.mgt.jaxrs.beans.DashboardGadgetDataWrapper; +import org.wso2.carbon.device.mgt.jaxrs.beans.DashboardPaginationGadgetDataWrapper; +import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; +import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * Device Analytics Dashboard related REST-APIs. This can be used to obtain device related analytics. */ -@SwaggerDefinition( - info = @Info( - version = "1.0.0", - title = "", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = "name", value = "DeviceAnalyticsDashboard"), - @ExtensionProperty(name = "context", value = "/api/device-mgt/v1.0/dashboard"), - }) - } - ), - tags = { - @Tag(name = "device_management", description = "") - } -) @Path("/dashboard") @Api(value = "Device Analytics Dashboard", description = "Device Analytics Dashboard related information APIs are described here.") @@ -71,67 +38,667 @@ public interface Dashboard { @GET @Path("device-count-overview") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get the details of registered devices in WSO2 EMM.", + notes = "Get the details of active, inactive, removed and total number of registered devices in" + + " WSO2 EMM.", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DashboardGadgetDataWrapper.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 = 400, + message = "Bad Request. \n Invalid request or validation error.", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not 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 ErrorResponse in retrieving requested data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") Response getOverviewDeviceCounts(); @GET @Path("device-counts-by-potential-vulnerabilities") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get the number of unmonitored and non-compliant devices in WSO2 EMM.", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DashboardGadgetDataWrapper.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 = 400, + message = "Bad Request. \n Invalid request or validation error.", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not 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 activity data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") Response getDeviceCountsByPotentialVulnerabilities(); @GET @Path("non-compliant-device-counts-by-features") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get the number of devices that have not complied to a policy that was enforced on a " + + "device.", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DashboardPaginationGadgetDataWrapper.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 = 400, + message = "Bad Request. \n", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not Found. \n", + 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 ErrorResponse in retrieving requested data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") - Response getNonCompliantDeviceCountsByFeatures(@QueryParam(START_INDEX) int startIndex, - @QueryParam(RESULT_COUNT) int resultCount); + Response getNonCompliantDeviceCountsByFeatures( + @ApiParam( + name = "start", + value = "Provide the starting pagination index. Example 10", + required = true) + @QueryParam(START_INDEX) int startIndex, + @ApiParam( + name = "length", + value = "Provide how many policy details you require from the starting pagination index." + + " For example if you require the non-compliant policy details from the 10th " + + "pagination index to the 15th, you must define 10 as the value for start and " + + "5 as the value for length.", + required = true) + @QueryParam(RESULT_COUNT) int resultCount); @GET @Path("device-counts-by-groups") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get the number of devices for a given device type, such as connectivity status, " + + "potential vulnerability, platform, and ownership.\n", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DeviceCountByGroup.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 = 400, + message = "Bad Request.", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not 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 ErrorResponse in retrieving requested data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") - Response getDeviceCountsByGroups(@QueryParam(CONNECTIVITY_STATUS) String connectivityStatus, - @QueryParam(POTENTIAL_VULNERABILITY) String potentialVulnerability, - @QueryParam(PLATFORM) String platform, - @QueryParam(OWNERSHIP) String ownership); + Response getDeviceCountsByGroups( + @ApiParam( + name = "connectivity-status", + value = "Provide the connectivity status of the device. The following values can be assigned:\n" + + "active: The devices that are registered with WSO2 EMM and are actively " + + "communicating with the server.\n" + + "inactive: The devices that are registered with WSO2 EMM but unable to " + + "actively communicate with the server.\n" + + "removed: The devices that have unregistered from WSO2 EMM", + required = true) + @QueryParam(CONNECTIVITY_STATUS) String connectivityStatus, + @ApiParam( + name = "potential-vulnerability", + value = "Provide details of the potential vulnerabilities of the device. The following " + + "values can be assigned:\n" + + "non-compliant: Devices that have not complied to the policies enforced on the " + + "device by WSO2 EMM.\n" + + "unmonitored: Devices that have no policy assigned to them.", + required = true) + @QueryParam(POTENTIAL_VULNERABILITY) String potentialVulnerability, + @ApiParam( + name = "platform", + value = "Provide the platform that the device is running on. The following values can " + + "be assigned:\n" + + "iOS\n" + "Android\n" + "Windows", + required = true) + @QueryParam(PLATFORM) String platform, + @ApiParam( + name = "ownership", + value = "Provide the ownership status of the device. The following values can be assigned:\n" + + "BYOD: Bring Your Own Device\n" + "COPE: Corporate-Owned, Personally-Enabled", + required = true) + @QueryParam(OWNERSHIP) String ownership); @GET @Path("feature-non-compliant-device-counts-by-groups") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get the number of devices that have not complied to a given policy based on a particular" + + " device type.", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DeviceCountByGroup.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 = 400, + message = "Bad Request.", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not 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 ErrorResponse in retrieving requested data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") - Response getFeatureNonCompliantDeviceCountsByGroups(@QueryParam(NON_COMPLIANT_FEATURE_CODE) String nonCompliantFeatureCode, - @QueryParam(PLATFORM) String platform, - @QueryParam(OWNERSHIP) String ownership); + Response getFeatureNonCompliantDeviceCountsByGroups( + @ApiParam( + name = "non-compliant-feature-code", + value = "As the value for this parameter, the policy feature code or ID can be used. Some" + + " examples for feature codes are: PASSCODE_POLICY,CAMERA and WIFI.", + required = true) + @QueryParam(NON_COMPLIANT_FEATURE_CODE) String nonCompliantFeatureCode, + @ApiParam( + name = "platform", + value = "Provide the platform that the device is running on. The following values can " + + "be assigned:\n" + + "iOS\n" + "Android\n" + "Windows", + required = false) + @QueryParam(PLATFORM) String platform, + @ApiParam( + name = "ownership", + value = "Provide the ownership status of the device. The following values can be assigned:\n" + + "BYOD: Bring Your Own Device\n" + "COPE: Corporate-Owned, Personally-Enabled", + required = false) + @QueryParam(OWNERSHIP) String ownership); + @GET @Path("filtered-device-count-over-total") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get the number of devices that are registered with WSO2 EMM filtered by one of the " + + "following attributes:\n" + + "Connectivity status of the device, such as active, inactive or removed.\n" + + "The device ownership type, such as BYOD or COPE.\n" + "The device platform.\n" + + "The potential vulnerabilities faced by the devices.", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DashboardGadgetDataWrapper.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 = 400, + message = "Bad Request.", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not 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 ErrorResponse in retrieving requested data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") - Response getFilteredDeviceCountOverTotal(@QueryParam(CONNECTIVITY_STATUS) String connectivityStatus, - @QueryParam(POTENTIAL_VULNERABILITY) String potentialVulnerability, - @QueryParam(PLATFORM) String platform, - @QueryParam(OWNERSHIP) String ownership); + Response getFilteredDeviceCountOverTotal( + @ApiParam( + name = "connectivity-status", + value = "Provide the connectivity status of the device. You can assign any of the values " + + "given below:\n" + + "Total: All the devices that have registered with WSO2 EMM.\n" + + "active: The devices that are registered with WSO2 EMM and are actively " + + "communicating with the server.\n" + + "inactive: The devices that are registered with WSO2 EMM but unable to actively" + + " communicate with the server.\n" + + "removed: The devices that have unregistered from WSO2 EMM.", + required = true) + @QueryParam(CONNECTIVITY_STATUS) String connectivityStatus, + @ApiParam( + name = "potential-vulnerability", + value = "Provide details of the potential vulnerabilities of the device. You can assign" + + " any of the values given below:\n" + + "non-compliant: Devices that have not complied to the policies enforced on the " + + "device by WSO2 EMM.\n" + + "unmonitored: Devices that have no policy assigned to them.", + required = true) + @QueryParam(POTENTIAL_VULNERABILITY) String potentialVulnerability, + @ApiParam( + name = "platform", + value = "Provide the platform that the device is running on. You can assign any of the " + + "values given below:\n" + + "iOS\n" + "Android\n" + "Windows", + required = true) + @QueryParam(PLATFORM) String platform, + @ApiParam( + name = "ownership", + value = "Provide the ownership status of the device. You can assign any of the values " + + "given below:\n" + + "BYOD: Bring Your Own Device\n" + "COPE: Corporate-Owned, Personally-Enabled", + required = true) + @QueryParam(OWNERSHIP) String ownership); @GET @Path("feature-non-compliant-device-count-over-total") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get the number of devices that have not complied to a given policy over the total" + + " number of devices registered with WSO2 EMM.\n", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DashboardGadgetDataWrapper.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 = 400, + message = "Bad Request.", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not 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 ErrorResponse in retrieving requested data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") - Response getFeatureNonCompliantDeviceCountOverTotal(@QueryParam(NON_COMPLIANT_FEATURE_CODE) String nonCompliantFeatureCode, - @QueryParam(PLATFORM) String platform, - @QueryParam(OWNERSHIP) String ownership); + Response getFeatureNonCompliantDeviceCountOverTotal( + @ApiParam( + name = "non-compliant-feature-code", + value = "Provide the feature code or ID of the policy. Some examples for feature codes " + + "are: WIFI, PASSCODE_POLICY, CAMERA and ENCRYPT_STORAGE.", + required = true) + @QueryParam(NON_COMPLIANT_FEATURE_CODE) String nonCompliantFeatureCode, + @ApiParam( + name = "platform", + value = "Provide the platform that the device is running on. You can assign the values " + + "given below:\n" + + "iOS\n" + "Android\n" + "Windows", + required = true) + @QueryParam(PLATFORM) String platform, + @ApiParam( + name = "ownership", + value = "Provide the ownership status of the device. You can assign the values given below:\n" + + "BYOD: Bring Your Own Device\n" + "COPE: Corporate-Owned, Personally-Enabled", + required = true) + @QueryParam(OWNERSHIP) String ownership); @GET @Path("devices-with-details") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get device details of devices based on a particular device type.", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DashboardPaginationGadgetDataWrapper.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 = 400, + message = "Bad Request.", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not 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 ErrorResponse in retrieving requested data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") - Response getDevicesWithDetails(@QueryParam(CONNECTIVITY_STATUS) String connectivityStatus, - @QueryParam(POTENTIAL_VULNERABILITY) String potentialVulnerability, - @QueryParam(PLATFORM) String platform, - @QueryParam(OWNERSHIP) String ownership, - @QueryParam(PAGINATION_ENABLED) String paginationEnabled, - @QueryParam(START_INDEX) int startIndex, - @QueryParam(RESULT_COUNT) int resultCount); + Response getDevicesWithDetails( + @ApiParam( + name = "connectivity-status", + value = "Provide the connectivity status of the device. This can be one of the following:\n" + + "Total: All the devices that have registered with WSO2 EMM.\n" + + "active: The devices that are registered with WSO2 EMM and are actively " + + "communicating with the server.\n" + + "inactive: The devices that are registered with WSO2 EMM but unable to actively" + + " communicate with the server.\n" + + "removed: The devices that have unregistered from WSO2 EMM.", + required = true) + @QueryParam(CONNECTIVITY_STATUS) String connectivityStatus, + @ApiParam( + name = "potential-vulnerability", + value = "Provide details of the potential vulnerabilities of the device. This can be:\n" + + "non-compliant: Devices that have not complied to the policies enforced on " + + "the device by WSO2 EMM.\n" + + "unmonitored: Devices that have no policy assigned to them. ", + required = true) + @QueryParam(POTENTIAL_VULNERABILITY) String potentialVulnerability, + @ApiParam( + name = "platform", + value = "Provide the platform that the device is running on. This can be one of the following:\n" + + "iOS\n" + "Android\n" + "Windows", + required = true) + @QueryParam(PLATFORM) String platform, + @ApiParam( + name = "ownership", + value = "Provide the ownership status of the device. This can be one of the following:\n" + + "BYOD: Bring Your Own Device\n" + "COPE: Corporate-Owned, Personally-Enabled", + required = true) + @QueryParam(OWNERSHIP) String ownership, + @ApiParam( + name = "pagination-enabled", + value = "To enable/disable pagination set the value as true or false", + required = true) + @QueryParam(PAGINATION_ENABLED) String paginationEnabled, + @ApiParam( + name = "start", + value = "Provide the starting pagination index.", + required = true) + @QueryParam(START_INDEX) int startIndex, + @ApiParam( + name = "length", + value = "Provide how many policy details you require from the starting pagination index.", + required = true) + @QueryParam(RESULT_COUNT) int resultCount); @GET @Path("feature-non-compliant-devices-with-details") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get device details of non-compliant devices which do not comply to a given policy.", + tags = "Dashboard") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK.", + response = DashboardPaginationGadgetDataWrapper.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 = 400, + message = "Bad Request.", + response = ErrorResponse.class), + @ApiResponse( + code = 401, + message = "Unauthorized. \n Unauthorized request."), + @ApiResponse( + code = 404, + message = "Not 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 ErrorResponse in retrieving requested data.", + response = ErrorResponse.class) + }) @Permission(name = "View Dashboard", permission = "/device-mgt/dashboard/view") - Response getFeatureNonCompliantDevicesWithDetails(@QueryParam(NON_COMPLIANT_FEATURE_CODE) String nonCompliantFeatureCode, - @QueryParam(PLATFORM) String platform, - @QueryParam(OWNERSHIP) String ownership, - @QueryParam(PAGINATION_ENABLED) String paginationEnabled, - @QueryParam(START_INDEX) int startIndex, - @QueryParam(RESULT_COUNT) int resultCount); -} + Response getFeatureNonCompliantDevicesWithDetails( + @ApiParam( + name = "non-compliant-feature-code", + value = "Provide the code specific to the feature " + + "(examples for feature codes are: WIFI,PASSCODE_POLICY, CAMERA and ENCRYPT_STORAGE.)", + required = true) + @QueryParam(NON_COMPLIANT_FEATURE_CODE) String nonCompliantFeatureCode, + @ApiParam( + name = "platform", + value = "Provide the platform that the device is running on. This can be one of the following:\n" + + "iOS\n" + "Android\n" + "Windows", + required = true) + @QueryParam(PLATFORM) String platform, + @ApiParam( + name = "ownership", + value = "Provide the ownership status of the device. This can be one of the following:\n" + + "BYOD: Bring Your Own Device\n" + "COPE: Corporate-Owned, Personally-Enabled", + required = true) + @QueryParam(OWNERSHIP) String ownership, + @ApiParam( + name = "pagination-enabled", + value = "To enable/disable pagination set the value as true or false", + required = true) + @QueryParam(PAGINATION_ENABLED) String paginationEnabled, + @ApiParam( + name = "start", + value = "Provide the starting pagination index.", + required = true) + @QueryParam(START_INDEX) int startIndex, + @ApiParam( + name = "length", + value = "Provide how many policy details you require from the starting pagination index.", + required = true) + @QueryParam(RESULT_COUNT) int resultCount); +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/UserManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/UserManagementServiceImpl.java index 96d0cf2c12..1b527337c8 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/UserManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/UserManagementServiceImpl.java @@ -87,6 +87,17 @@ public class UserManagementServiceImpl implements UserManagementService { if (log.isDebugEnabled()) { log.debug("User by username: " + userInfo.getUsername() + " was found."); } + DeviceManagementProviderService dms = DeviceMgtAPIUtils.getDeviceManagementService(); + String[] bits = userInfo.getUsername().split("/"); + String username = bits[bits.length - 1]; + String recipient = userInfo.getEmailAddress(); + Properties props = new Properties(); + props.setProperty("first-name", userInfo.getFirstname()); + props.setProperty("username", username); + props.setProperty("password", initialUserPassword); + + EmailMetaInfo metaInfo = new EmailMetaInfo(recipient, props); + dms.sendRegistrationEmail(metaInfo); return Response.created(new URI(API_BASE_PATH + "/" + URIEncoder.encode(userInfo.getUsername(), "UTF-8"))) .entity( createdUserInfo).build(); @@ -108,6 +119,12 @@ public class UserManagementServiceImpl implements UserManagementService { log.error(msg, e); return Response.serverError().entity( new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); + } catch (DeviceManagementException e) { + String msg = "Error occurred while sending registration email to the user " + + userInfo.getUsername(); + log.error(msg, e); + return Response.serverError().entity( + new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/permission/ExtendedFileProtocolIteratorFactory.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/permission/ExtendedFileProtocolIteratorFactory.java index 1394375656..01780e26d6 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/permission/ExtendedFileProtocolIteratorFactory.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/permission/ExtendedFileProtocolIteratorFactory.java @@ -21,7 +21,7 @@ import java.io.File; import java.io.IOException; import java.net.URL; -public class ExtendedFileProtocolIteratorFactory implements DirectoryIteratorFactory { +final class ExtendedFileProtocolIteratorFactory implements DirectoryIteratorFactory { @Override public StreamIterator create(URL url, Filter filter) throws IOException { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/permission/ExtendedIteratorFactory.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/permission/ExtendedIteratorFactory.java index 18c8b7620c..0a05b1079c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/permission/ExtendedIteratorFactory.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/permission/ExtendedIteratorFactory.java @@ -24,11 +24,11 @@ import java.io.IOException; import java.net.URL; import java.util.concurrent.ConcurrentHashMap; -public class ExtendedIteratorFactory { +class ExtendedIteratorFactory { private static final ConcurrentHashMap registry = new ConcurrentHashMap(); - public static StreamIterator create(URL url, Filter filter) throws IOException { + static StreamIterator create(URL url, Filter filter) throws IOException { String urlString = url.toString(); if(urlString.endsWith("!/")) { urlString = urlString.substring(4); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceDAO.java index c688b5997f..1eb39fc502 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceDAO.java @@ -218,6 +218,17 @@ public interface DeviceDAO { */ List getDevicesOfUser(String username, int tenantId) throws DeviceManagementDAOException; + /** + * This method is used to retrieve the devices of given user of given device type. + * @param username user name. + * @param type device type. + * @param tenantId tenant id. + * @return + * @throws DeviceManagementDAOException + */ + List getDevicesOfUser(String username, String type, int tenantId) throws DeviceManagementDAOException; + + /** * This method is used to retrieve devices of a given user as a paginated result. * diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java index 3c08f86339..ac89c1cf49 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java @@ -368,6 +368,40 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { return devices; } + + @Override + public List getDevicesOfUser(String username, String type, int tenantId) throws DeviceManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + List devices = new ArrayList<>(); + try { + conn = this.getConnection(); + String sql = "SELECT e1.OWNER, e1.OWNERSHIP, e1.ENROLMENT_ID, e1.DEVICE_ID, e1.STATUS, e1.DATE_OF_LAST_UPDATE," + + " e1.DATE_OF_ENROLMENT, d.DESCRIPTION, d.NAME AS DEVICE_NAME, d.DEVICE_IDENTIFICATION, t.NAME " + + "AS DEVICE_TYPE FROM DM_DEVICE d, (SELECT e.OWNER, e.OWNERSHIP, e.ID AS ENROLMENT_ID, " + + "e.DEVICE_ID, e.STATUS, e.DATE_OF_LAST_UPDATE, e.DATE_OF_ENROLMENT FROM DM_ENROLMENT e WHERE " + + "e.TENANT_ID = ? AND e.OWNER = ?) e1, DM_DEVICE_TYPE t WHERE d.ID = e1.DEVICE_ID " + + "AND t.ID = d.DEVICE_TYPE_ID AND t.NAME= ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, tenantId); + stmt.setString(2, username); + stmt.setString(3, type); + rs = stmt.executeQuery(); + + while (rs.next()) { + Device device = DeviceManagementDAOUtil.loadDevice(rs); + devices.add(device); + } + } catch (SQLException e) { + throw new DeviceManagementDAOException("Error occurred while fetching the list of devices belongs to '" + + username + "'", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, rs); + } + return devices; + } + private Connection getConnection() throws SQLException { return DeviceManagementDAOFactory.getConnection(); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/dao/SearchDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/dao/SearchDAO.java index bd17d7c26e..f40c074d8c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/dao/SearchDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/dao/SearchDAO.java @@ -19,14 +19,11 @@ package org.wso2.carbon.device.mgt.core.search.mgt.dao; -import org.wso2.carbon.device.mgt.common.Device; - -import java.util.List; public interface SearchDAO { - List searchDeviceDetailsTable(String query) throws SearchDAOException; - - List searchDevicePropertyTable(String query) throws SearchDAOException; +// List searchDeviceDetailsTable(String query) throws SearchDAOException; +// +// List searchDevicePropertyTable(String query) throws SearchDAOException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/dao/impl/SearchDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/dao/impl/SearchDAOImpl.java index 1090e88c62..8d2c705699 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/dao/impl/SearchDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/dao/impl/SearchDAOImpl.java @@ -19,235 +19,220 @@ package org.wso2.carbon.device.mgt.core.search.mgt.dao.impl; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.mgt.common.Device; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo; -import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation; -import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; -import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAO; -import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAOException; -import org.wso2.carbon.device.mgt.core.search.mgt.impl.Utils; -import java.sql.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; public class SearchDAOImpl implements SearchDAO { - - private static final Log log = LogFactory.getLog(SearchDAOImpl.class); - - @Override - public List searchDeviceDetailsTable(String query) throws SearchDAOException { - if (log.isDebugEnabled()) { - log.debug("Query : " + query); - } - Connection conn; - PreparedStatement stmt = null; - ResultSet rs; - List devices = new ArrayList<>(); - Map devs = new HashMap<>(); - try { - conn = this.getConnection(); - stmt = conn.prepareStatement(query); - rs = stmt.executeQuery(); - while (rs.next()) { - if (!devs.containsKey(rs.getInt("ID"))) { - Device device = new Device(); - device.setId(rs.getInt("ID")); - device.setDescription(rs.getString("DESCRIPTION")); - device.setName("NAME"); - device.setType(rs.getString("DEVICE_TYPE_NAME")); - device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION")); - - DeviceIdentifier identifier = new DeviceIdentifier(); - identifier.setType(rs.getString("DEVICE_TYPE_NAME")); - identifier.setId(rs.getString("DEVICE_IDENTIFICATION")); - - DeviceInfo deviceInfo = new DeviceInfo(); - deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY")); - deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL")); - deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE")); - deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE")); - deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL")); - deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY")); - deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); - deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY")); - deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); - deviceInfo.setOsVersion(rs.getString("OS_VERSION")); - deviceInfo.setOsBuildDate(rs.getString("OS_BUILD_DATE")); - deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN")); - deviceInfo.setSsid(rs.getString("SSID")); - deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY")); - deviceInfo.setVendor(rs.getString("VENDOR")); - deviceInfo.setUpdatedTime(new java.util.Date(rs.getLong("UPDATE_TIMESTAMP"))); - - DeviceLocation deviceLocation = new DeviceLocation(); - deviceLocation.setLatitude(rs.getDouble("LATITUDE")); - deviceLocation.setLongitude(rs.getDouble("LONGITUDE")); - deviceLocation.setStreet1(rs.getString("STREET1")); - deviceLocation.setStreet2(rs.getString("STREET2")); - deviceLocation.setCity(rs.getString("CITY")); - deviceLocation.setState(rs.getString("STATE")); - deviceLocation.setZip(rs.getString("ZIP")); - deviceLocation.setCountry(rs.getString("COUNTRY")); - deviceLocation.setDeviceId(rs.getInt("ID")); - deviceLocation.setUpdatedTime(new java.util.Date(rs.getLong("DL_UPDATED_TIMESTAMP"))); - - deviceInfo.setLocation(deviceLocation); - device.setDeviceInfo(deviceInfo); - devices.add(device); - devs.put(device.getId(), device.getId()); - } - } - } catch (SQLException e) { - throw new SearchDAOException("Error occurred while acquiring the device details.", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, null); - } - - this.fillPropertiesOfDevices(devices); - - if (log.isDebugEnabled()) { - log.debug("Number of the device returned from the query : " + devices.size()); - } - return devices; - } - - @Override - public List searchDevicePropertyTable(String query) throws SearchDAOException { - if (log.isDebugEnabled()) { - log.debug("Query : " + query); - } - - Connection conn; - PreparedStatement stmt = null; - ResultSet rs; - List devices = new ArrayList<>(); - Map devs = new HashMap<>(); - try { - conn = this.getConnection(); - stmt = conn.prepareStatement(query); - rs = stmt.executeQuery(); - while (rs.next()) { - if (!devs.containsKey(rs.getInt("ID"))) { - Device device = new Device(); - device.setId(rs.getInt("ID")); - device.setDescription(rs.getString("DESCRIPTION")); - device.setName(rs.getString("NAME")); - device.setType(rs.getString("DEVICE_TYPE_NAME")); - device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION")); - - DeviceIdentifier identifier = new DeviceIdentifier(); - identifier.setType(rs.getString("DEVICE_TYPE_NAME")); - identifier.setId(rs.getString("DEVICE_IDENTIFICATION")); - - DeviceInfo deviceInfo = new DeviceInfo(); - deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY")); - deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL")); - deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE")); - deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE")); - deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL")); - deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY")); - deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); - deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY")); - deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); - deviceInfo.setOsVersion(rs.getString("OS_VERSION")); - deviceInfo.setOsBuildDate(rs.getString("OS_BUILD_DATE")); - deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN")); - deviceInfo.setSsid(rs.getString("SSID")); - deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY")); - deviceInfo.setVendor(rs.getString("VENDOR")); - deviceInfo.setUpdatedTime(new java.util.Date(rs.getLong("UPDATE_TIMESTAMP"))); - - DeviceLocation deviceLocation = new DeviceLocation(); - deviceLocation.setLatitude(rs.getDouble("LATITUDE")); - deviceLocation.setLongitude(rs.getDouble("LONGITUDE")); - deviceLocation.setStreet1(rs.getString("STREET1")); - deviceLocation.setStreet2(rs.getString("STREET2")); - deviceLocation.setCity(rs.getString("CITY")); - deviceLocation.setState(rs.getString("STATE")); - deviceLocation.setZip(rs.getString("ZIP")); - deviceLocation.setCountry(rs.getString("COUNTRY")); - deviceLocation.setDeviceId(rs.getInt("ID")); - deviceLocation.setUpdatedTime(new java.util.Date(rs.getLong("DL_UPDATED_TIMESTAMP"))); - - deviceInfo.setLocation(deviceLocation); - device.setDeviceInfo(deviceInfo); - devices.add(device); - devs.put(device.getId(), device.getId()); - } - - } - } catch (SQLException e) { - throw new SearchDAOException("Error occurred while aquiring the device details.", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, null); - } - - this.fillPropertiesOfDevices(devices); - - if (log.isDebugEnabled()) { - log.debug("Number of the device returned from the query : " + devices.size()); - } - - return devices; - } - - - private Connection getConnection() throws SQLException { - return DeviceManagementDAOFactory.getConnection(); - } - - private List fillPropertiesOfDevices(List devices) throws SearchDAOException { - if (devices.isEmpty()) { - return null; - } - - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - try { - conn = this.getConnection(); - String query = "SELECT * FROM DM_DEVICE_INFO WHERE DEVICE_ID IN (?) ORDER BY DEVICE_ID ;"; - stmt = conn.prepareStatement(query); - if (conn.getMetaData().getDatabaseProductName().contains("H2") || - conn.getMetaData().getDatabaseProductName().contains("MySQL")) { - String inData = Utils.getDeviceIdsAsString(devices); - stmt.setString(1, inData); - } else { - Array array = conn.createArrayOf("INT", Utils.getArrayOfDeviceIds(devices)); - stmt.setArray(1, array); - } - rs = stmt.executeQuery(); - - DeviceInfo dInfo; - while (rs.next()) { - dInfo = this.getDeviceInfo(devices, rs.getInt("DEVICE_ID")); - dInfo.getDeviceDetailsMap().put(rs.getString("KEY_FIELD"), rs.getString("VALUE_FIELD")); - } - } catch (SQLException e) { - throw new SearchDAOException("Error occurred while retrieving the device properties.", e); - } - return devices; - } - - private DeviceInfo getDeviceInfo(List devices, int deviceId) { - for (Device device : devices) { - if (device.getId() == deviceId) { - if (device.getDeviceInfo() == null) { - device.setDeviceInfo(new DeviceInfo()); - } - return device.getDeviceInfo(); - } - } - return null; - } +// +// private static final Log log = LogFactory.getLog(SearchDAOImpl.class); +// +// @Override +// public List searchDeviceDetailsTable(String query) throws SearchDAOException { +// if (log.isDebugEnabled()) { +// log.debug("Query : " + query); +// } +// Connection conn; +// PreparedStatement stmt = null; +// ResultSet rs; +// List devices = new ArrayList<>(); +// Map devs = new HashMap<>(); +// try { +// conn = this.getConnection(); +// stmt = conn.prepareStatement(query); +// rs = stmt.executeQuery(); +// while (rs.next()) { +// if (!devs.containsKey(rs.getInt("ID"))) { +// Device device = new Device(); +// device.setId(rs.getInt("ID")); +// device.setDescription(rs.getString("DESCRIPTION")); +// device.setName("NAME"); +// device.setType(rs.getString("DEVICE_TYPE_NAME")); +// device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION")); +// +// DeviceIdentifier identifier = new DeviceIdentifier(); +// identifier.setType(rs.getString("DEVICE_TYPE_NAME")); +// identifier.setId(rs.getString("DEVICE_IDENTIFICATION")); +// +// DeviceInfo deviceInfo = new DeviceInfo(); +// deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY")); +// deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL")); +// deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE")); +// deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE")); +// deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL")); +// deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY")); +// deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); +// deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY")); +// deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); +// deviceInfo.setOsVersion(rs.getString("OS_VERSION")); +// deviceInfo.setOsBuildDate(rs.getString("OS_BUILD_DATE")); +// deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN")); +// deviceInfo.setSsid(rs.getString("SSID")); +// deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY")); +// deviceInfo.setVendor(rs.getString("VENDOR")); +// deviceInfo.setUpdatedTime(new java.util.Date(rs.getLong("UPDATE_TIMESTAMP"))); +// +// DeviceLocation deviceLocation = new DeviceLocation(); +// deviceLocation.setLatitude(rs.getDouble("LATITUDE")); +// deviceLocation.setLongitude(rs.getDouble("LONGITUDE")); +// deviceLocation.setStreet1(rs.getString("STREET1")); +// deviceLocation.setStreet2(rs.getString("STREET2")); +// deviceLocation.setCity(rs.getString("CITY")); +// deviceLocation.setState(rs.getString("STATE")); +// deviceLocation.setZip(rs.getString("ZIP")); +// deviceLocation.setCountry(rs.getString("COUNTRY")); +// deviceLocation.setDeviceId(rs.getInt("ID")); +// deviceLocation.setUpdatedTime(new java.util.Date(rs.getLong("DL_UPDATED_TIMESTAMP"))); +// +// deviceInfo.setLocation(deviceLocation); +// device.setDeviceInfo(deviceInfo); +// devices.add(device); +// devs.put(device.getId(), device.getId()); +// } +// } +// } catch (SQLException e) { +// throw new SearchDAOException("Error occurred while acquiring the device details.", e); +// } finally { +// DeviceManagementDAOUtil.cleanupResources(stmt, null); +// } +// +// this.fillPropertiesOfDevices(devices); +// +// if (log.isDebugEnabled()) { +// log.debug("Number of the device returned from the query : " + devices.size()); +// } +// return devices; +// } +// +// @Override +// public List searchDevicePropertyTable(String query) throws SearchDAOException { +// if (log.isDebugEnabled()) { +// log.debug("Query : " + query); +// } +// +// Connection conn; +// PreparedStatement stmt = null; +// ResultSet rs; +// List devices = new ArrayList<>(); +// Map devs = new HashMap<>(); +// try { +// conn = this.getConnection(); +// stmt = conn.prepareStatement(query); +// rs = stmt.executeQuery(); +// while (rs.next()) { +// if (!devs.containsKey(rs.getInt("ID"))) { +// Device device = new Device(); +// device.setId(rs.getInt("ID")); +// device.setDescription(rs.getString("DESCRIPTION")); +// device.setName(rs.getString("NAME")); +// device.setType(rs.getString("DEVICE_TYPE_NAME")); +// device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION")); +// +// DeviceIdentifier identifier = new DeviceIdentifier(); +// identifier.setType(rs.getString("DEVICE_TYPE_NAME")); +// identifier.setId(rs.getString("DEVICE_IDENTIFICATION")); +// +// DeviceInfo deviceInfo = new DeviceInfo(); +// deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY")); +// deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL")); +// deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE")); +// deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE")); +// deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL")); +// deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY")); +// deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); +// deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY")); +// deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); +// deviceInfo.setOsVersion(rs.getString("OS_VERSION")); +// deviceInfo.setOsBuildDate(rs.getString("OS_BUILD_DATE")); +// deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN")); +// deviceInfo.setSsid(rs.getString("SSID")); +// deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY")); +// deviceInfo.setVendor(rs.getString("VENDOR")); +// deviceInfo.setUpdatedTime(new java.util.Date(rs.getLong("UPDATE_TIMESTAMP"))); +// +// DeviceLocation deviceLocation = new DeviceLocation(); +// deviceLocation.setLatitude(rs.getDouble("LATITUDE")); +// deviceLocation.setLongitude(rs.getDouble("LONGITUDE")); +// deviceLocation.setStreet1(rs.getString("STREET1")); +// deviceLocation.setStreet2(rs.getString("STREET2")); +// deviceLocation.setCity(rs.getString("CITY")); +// deviceLocation.setState(rs.getString("STATE")); +// deviceLocation.setZip(rs.getString("ZIP")); +// deviceLocation.setCountry(rs.getString("COUNTRY")); +// deviceLocation.setDeviceId(rs.getInt("ID")); +// deviceLocation.setUpdatedTime(new java.util.Date(rs.getLong("DL_UPDATED_TIMESTAMP"))); +// +// deviceInfo.setLocation(deviceLocation); +// device.setDeviceInfo(deviceInfo); +// devices.add(device); +// devs.put(device.getId(), device.getId()); +// } +// +// } +// } catch (SQLException e) { +// throw new SearchDAOException("Error occurred while aquiring the device details.", e); +// } finally { +// DeviceManagementDAOUtil.cleanupResources(stmt, null); +// } +// +// this.fillPropertiesOfDevices(devices); +// +// if (log.isDebugEnabled()) { +// log.debug("Number of the device returned from the query : " + devices.size()); +// } +// +// return devices; +// } +// +// +// private Connection getConnection() throws SQLException { +// return DeviceManagementDAOFactory.getConnection(); +// } +// +// private List fillPropertiesOfDevices(List devices) throws SearchDAOException { +// if (devices.isEmpty()) { +// return null; +// } +// +// Connection conn; +// PreparedStatement stmt; +// ResultSet rs; +// +// try { +// conn = this.getConnection(); +// String query = "SELECT * FROM DM_DEVICE_INFO WHERE DEVICE_ID IN (?) ORDER BY DEVICE_ID ;"; +// stmt = conn.prepareStatement(query); +// if (conn.getMetaData().getDatabaseProductName().contains("H2") || +// conn.getMetaData().getDatabaseProductName().contains("MySQL")) { +// String inData = Utils.getDeviceIdsAsString(devices); +// stmt.setString(1, inData); +// } else { +// Array array = conn.createArrayOf("INT", Utils.getArrayOfDeviceIds(devices)); +// stmt.setArray(1, array); +// } +// rs = stmt.executeQuery(); +// +// DeviceInfo dInfo; +// while (rs.next()) { +// dInfo = this.getDeviceInfo(devices, rs.getInt("DEVICE_ID")); +// dInfo.getDeviceDetailsMap().put(rs.getString("KEY_FIELD"), rs.getString("VALUE_FIELD")); +// } +// } catch (SQLException e) { +// throw new SearchDAOException("Error occurred while retrieving the device properties.", e); +// } +// return devices; +// } +// +// private DeviceInfo getDeviceInfo(List devices, int deviceId) { +// for (Device device : devices) { +// if (device.getId() == deviceId) { +// if (device.getDeviceInfo() == null) { +// device.setDeviceInfo(new DeviceInfo()); +// } +// return device.getDeviceInfo(); +// } +// } +// return null; +// } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/impl/ProcessorImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/impl/ProcessorImpl.java index 2673c3f263..7fe10ba8c4 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/impl/ProcessorImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/impl/ProcessorImpl.java @@ -19,29 +19,44 @@ package org.wso2.carbon.device.mgt.core.search.mgt.impl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.EnrolmentInfo; +import org.wso2.carbon.device.mgt.common.authorization.DeviceAccessAuthorizationException; +import org.wso2.carbon.device.mgt.common.authorization.DeviceAccessAuthorizationService; +import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo; +import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation; import org.wso2.carbon.device.mgt.common.search.SearchContext; import org.wso2.carbon.device.mgt.core.dao.ApplicationDAO; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; import org.wso2.carbon.device.mgt.core.search.mgt.*; -import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAO; import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAOException; -import java.sql.SQLException; +import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ProcessorImpl implements Processor { - - private SearchDAO searchDAO; private ApplicationDAO applicationDAO; + private static final Log log = LogFactory.getLog(ProcessorImpl.class); + private DeviceAccessAuthorizationService deviceAccessAuthorizationService; public ProcessorImpl() { - searchDAO = DeviceManagementDAOFactory.getSearchDAO(); applicationDAO = DeviceManagementDAOFactory.getApplicationDAO(); + deviceAccessAuthorizationService = DeviceManagementDataHolder.getInstance() + .getDeviceAccessAuthorizationService(); + if (deviceAccessAuthorizationService == null) { + String msg = "DeviceAccessAuthorization service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } } @Override @@ -57,23 +72,22 @@ public class ProcessorImpl implements Processor { DeviceManagementDAOFactory.openConnection(); if (queries.containsKey(Constants.GENERAL)) { - generalDevices = searchDAO.searchDeviceDetailsTable(queries.get(Constants.GENERAL).get(0)); + generalDevices = searchDeviceDetailsTable(queries.get(Constants.GENERAL).get(0)); } if (queries.containsKey(Constants.PROP_AND)) { for (String query : queries.get(Constants.PROP_AND)) { - List andDevices = searchDAO.searchDevicePropertyTable(query); + List andDevices = searchDeviceDetailsTable(query); allANDDevices.add(andDevices); } } if (queries.containsKey(Constants.PROP_OR)) { for (String query : queries.get(Constants.PROP_OR)) { - List orDevices = searchDAO.searchDevicePropertyTable(query); + List orDevices = searchDeviceDetailsTable(query); allORDevices.add(orDevices); } } if (queries.containsKey(Constants.LOCATION)) { - locationDevices = searchDAO.searchDevicePropertyTable( - queries.get(Constants.LOCATION).get(0)); + locationDevices = searchDeviceDetailsTable(queries.get(Constants.LOCATION).get(0)); } } catch (InvalidOperatorException e) { throw new SearchMgtException("Invalid operator was provided, so cannot execute the search.", e); @@ -95,10 +109,35 @@ public class ProcessorImpl implements Processor { devices.put(Constants.LOCATION, locationDevices); List finalDevices = aggregator.aggregate(devices); + finalDevices = authorizedDevices(finalDevices); this.setApplicationListOfDevices(finalDevices); return finalDevices; } + /** + * To get the authorized devices for a particular user + * + * @param devices Devices that satisfy search results + * @return Devices that satisfy search results and authorized to be viewed by particular user + */ + private List authorizedDevices(List devices) throws SearchMgtException { + List filteredList = new ArrayList<>(); + try { + for (Device device : devices) { + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(device.getDeviceIdentifier(), + device.getType()); + if (deviceAccessAuthorizationService != null && deviceAccessAuthorizationService + .isUserAuthorized(deviceIdentifier)) { + filteredList.add(device); + } + } + return filteredList; + } catch (DeviceAccessAuthorizationException e) { + log.error("Error getting authorized search results for logged in user"); + throw new SearchMgtException(e); + } + } + @Override public List getUpdatedDevices(long epochTime) throws SearchMgtException { @@ -107,9 +146,9 @@ public class ProcessorImpl implements Processor { } QueryBuilder queryBuilder = new QueryBuilderImpl(); try { - String query = queryBuilder.processUpdatedDevices(epochTime); + String query = queryBuilder.processUpdatedDevices(epochTime); DeviceManagementDAOFactory.openConnection(); - return searchDAO.searchDeviceDetailsTable(query); + return searchDeviceDetailsTable(query); } catch (InvalidOperatorException e) { throw new SearchMgtException("Invalid operator was provided, so cannot execute the search.", e); } catch (SQLException e) { @@ -202,5 +241,142 @@ public class ProcessorImpl implements Processor { } } -} + private List searchDeviceDetailsTable(String query) throws SearchDAOException { + if (log.isDebugEnabled()) { + log.debug("Query : " + query); + } + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + List devices = new ArrayList<>(); + Map devs = new HashMap<>(); + try { + conn = this.getConnection(); + stmt = conn.prepareStatement(query); + rs = stmt.executeQuery(); + while (rs.next()) { + if (!devs.containsKey(rs.getInt("ID"))) { + Device device = new Device(); + device.setId(rs.getInt("ID")); + device.setDescription(rs.getString("DESCRIPTION")); + device.setName(rs.getString("NAME")); + device.setType(rs.getString("DEVICE_TYPE_NAME")); + device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION")); + + EnrolmentInfo enrolmentInfo = new EnrolmentInfo(); + enrolmentInfo.setStatus(EnrolmentInfo.Status.valueOf(rs.getString("DE_STATUS"))); + enrolmentInfo.setOwner(rs.getString("OWNER")); + enrolmentInfo.setOwnership(EnrolmentInfo.OwnerShip.valueOf(rs.getString("OWNERSHIP"))); + device.setEnrolmentInfo(enrolmentInfo); + + DeviceIdentifier identifier = new DeviceIdentifier(); + identifier.setType(rs.getString("DEVICE_TYPE_NAME")); + identifier.setId(rs.getString("DEVICE_IDENTIFICATION")); + + DeviceInfo deviceInfo = new DeviceInfo(); + deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY")); + deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL")); + deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE")); + deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE")); + deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL")); + deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY")); + deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); + deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY")); + deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY")); + deviceInfo.setOsVersion(rs.getString("OS_VERSION")); + deviceInfo.setOsBuildDate(rs.getString("OS_BUILD_DATE")); + deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN")); + deviceInfo.setSsid(rs.getString("SSID")); + deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY")); + deviceInfo.setVendor(rs.getString("VENDOR")); + deviceInfo.setUpdatedTime(new java.util.Date(rs.getLong("UPDATE_TIMESTAMP"))); + + DeviceLocation deviceLocation = new DeviceLocation(); + deviceLocation.setLatitude(rs.getDouble("LATITUDE")); + deviceLocation.setLongitude(rs.getDouble("LONGITUDE")); + deviceLocation.setStreet1(rs.getString("STREET1")); + deviceLocation.setStreet2(rs.getString("STREET2")); + deviceLocation.setCity(rs.getString("CITY")); + deviceLocation.setState(rs.getString("STATE")); + deviceLocation.setZip(rs.getString("ZIP")); + deviceLocation.setCountry(rs.getString("COUNTRY")); + deviceLocation.setDeviceId(rs.getInt("ID")); + deviceLocation.setUpdatedTime(new java.util.Date(rs.getLong("DL_UPDATED_TIMESTAMP"))); + + deviceInfo.setLocation(deviceLocation); + device.setDeviceInfo(deviceInfo); + devices.add(device); + devs.put(device.getId(), device.getId()); + } + } + } catch (SQLException e) { + throw new SearchDAOException("Error occurred while aquiring the device details.", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, rs); + } + this.fillPropertiesOfDevices(devices); + if (log.isDebugEnabled()) { + log.debug("Number of the device returned from the query : " + devices.size()); + } + return devices; + } + + + private Connection getConnection() throws SQLException { + return DeviceManagementDAOFactory.getConnection(); + } + private List fillPropertiesOfDevices(List devices) throws SearchDAOException { + if (devices.isEmpty()) { + return null; + } + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + try { + conn = this.getConnection(); + String query = "SELECT * FROM DM_DEVICE_INFO WHERE DEVICE_ID IN ("; + if (conn.getMetaData().getDatabaseProductName().contains("H2") || conn.getMetaData() + .getDatabaseProductName().contains("MySQL")) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < devices.size(); i++) { + builder.append("?,"); + } + query += builder.deleteCharAt(builder.length() - 1).toString() + ") ORDER BY DEVICE_ID"; + stmt = conn.prepareStatement(query); + for (int i = 0; i < devices.size(); i++) { + stmt.setInt(i + 1, devices.get(i).getId()); + } + } else { + query += "?) ORDER BY DEVICE_ID"; + stmt = conn.prepareStatement(query); + Array array = conn.createArrayOf("INT", Utils.getArrayOfDeviceIds(devices)); + stmt.setArray(1, array); + } + rs = stmt.executeQuery(); + + DeviceInfo dInfo; + while (rs.next()) { + dInfo = this.getDeviceInfo(devices, rs.getInt("DEVICE_ID")); + dInfo.getDeviceDetailsMap().put(rs.getString("KEY_FIELD"), rs.getString("VALUE_FIELD")); + } + } catch (SQLException e) { + throw new SearchDAOException("Error occurred while retrieving the device properties.", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt,rs); + } + return devices; + } + + private DeviceInfo getDeviceInfo(List devices, int deviceId) { + for (Device device : devices) { + if (device.getId() == deviceId) { + if (device.getDeviceInfo() == null) { + device.setDeviceInfo(new DeviceInfo()); + } + return device.getDeviceInfo(); + } + } + return null; + } +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/impl/QueryBuilderImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/impl/QueryBuilderImpl.java index 3a841f2aa0..251b773123 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/impl/QueryBuilderImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/search/mgt/impl/QueryBuilderImpl.java @@ -36,10 +36,12 @@ public class QueryBuilderImpl implements QueryBuilder { private static final Log log = LogFactory.getLog(QueryBuilderImpl.class); + private final String WILDCARD_OPERATOR = "%"; + private String current_username; + private boolean isDeviceAdminUser; @Override public Map> buildQueries(List conditions) throws InvalidOperatorException { - List andColumns = new ArrayList<>(); List orColumns = new ArrayList<>(); List otherANDColumns = new ArrayList<>(); @@ -107,34 +109,40 @@ public class QueryBuilderImpl implements QueryBuilder { @Override public String processAND(List conditions) throws InvalidOperatorException { - String querySuffix = ""; - for (Condition con : conditions) { - if (Utils.checkDeviceDetailsColumns(con.getKey().toLowerCase())) { - querySuffix = querySuffix + " AND DD." + Utils.getDeviceDetailsColumnNames().get(con.getKey().toLowerCase()) + - con.getOperator() + Utils.getConvertedValue(con.getKey().toLowerCase(), con.getValue()); + if (Utils.checkDeviceDetailsColumns(con.getKey())) { + if (con.operator.equals(WILDCARD_OPERATOR)){ + querySuffix = querySuffix + " OR DD." + Utils.getDeviceDetailsColumnNames().get(con.getKey()) + + " LIKE \'%" + con.getValue() + "%\'"; + } else { + querySuffix = querySuffix + " AND DD." + Utils.getDeviceDetailsColumnNames().get(con.getKey()) + con + .getOperator() + Utils.getConvertedValue(con.getKey(), con.getValue()); + } } else if (Utils.checkDeviceLocationColumns(con.getKey().toLowerCase())) { querySuffix = querySuffix + " AND DL." + Utils.getDeviceLocationColumnNames().get(con.getKey().toLowerCase()) + con.getOperator() + con.getValue(); } } - return querySuffix; } @Override public String processOR(List conditions) throws InvalidOperatorException { - String querySuffix = ""; - for (Condition con : conditions) { - if (Utils.checkDeviceDetailsColumns(con.getKey().toLowerCase())) { - querySuffix = querySuffix + " OR DD." + Utils.getDeviceDetailsColumnNames().get(con.getKey().toLowerCase()) + - con.getOperator() + Utils.getConvertedValue(con.getKey(), con.getValue()); + if (Utils.checkDeviceDetailsColumns(con.getKey())) { + if (con.operator.equals(WILDCARD_OPERATOR)) { + querySuffix = querySuffix + " OR DD." + Utils.getDeviceDetailsColumnNames().get(con.getKey()) + + " LIKE \'%" + con.getValue() + "%\'"; + } else { + querySuffix = querySuffix + " OR DD." + Utils.getDeviceDetailsColumnNames().get(con.getKey()) + con + .getOperator() + Utils.getConvertedValue(con.getKey(), con.getValue()); + } } else if (Utils.checkDeviceLocationColumns(con.getKey().toLowerCase())) { - querySuffix = querySuffix + " OR DL." + Utils.getDeviceLocationColumnNames().get(con.getKey().toLowerCase()) + - con.getOperator() + con.getValue(); + querySuffix = + querySuffix + " OR DL." + Utils.getDeviceLocationColumnNames().get(con.getKey().toLowerCase()) + + con.getOperator() + con.getValue(); } } return querySuffix; @@ -177,17 +185,16 @@ public class QueryBuilderImpl implements QueryBuilder { private String buildLocationQuery(String location) { String query = this.getGenericQueryPart(); - query = query + " AND DL.STREET1 LIKE \'%" + location + "%\'"; + query = query + " AND (DL.STREET1 LIKE \'%" + location + "%\'"; query = query + " OR DL.STREET2 LIKE \'%" + location + "%\'"; query = query + " OR DL.CITY LIKE \'%" + location + "%\'"; query = query + " OR DL.STATE LIKE \'%" + location + "%\'"; query = query + " OR DL.COUNTRY LIKE \'%" + location + "%\'"; - query = query + " OR DL.ZIP LIKE \'%" + location + "%\'"; + query = query + " OR DL.ZIP LIKE \'%" + location + "%\')"; return query; } private String getGenericQueryPart() { - return "SELECT D.ID, D.DESCRIPTION, D.NAME, \n" + "D.DEVICE_TYPE_ID, D.DEVICE_IDENTIFICATION, DT.ID AS DEVICE_TYPE_ID, \n" + "DT.NAME AS DEVICE_TYPE_NAME, DD.DEVICE_ID, DD.DEVICE_MODEL, DD.VENDOR, \n" + @@ -195,18 +202,15 @@ public class QueryBuilderImpl implements QueryBuilder { "DD.EXTERNAL_TOTAL_MEMORY, DD.EXTERNAL_AVAILABLE_MEMORY, DD.CONNECTION_TYPE, \n" + "DD.SSID, DD.CPU_USAGE, DD.TOTAL_RAM_MEMORY, DD.AVAILABLE_RAM_MEMORY, \n" + "DD.PLUGGED_IN, DD.UPDATE_TIMESTAMP, DL.LATITUDE, DL.LONGITUDE, DL.STREET1, DL.STREET2, DL.CITY, DL.ZIP, \n" + - "DL.STATE, DL.COUNTRY, DL.UPDATE_TIMESTAMP AS DL_UPDATED_TIMESTAMP \n" + - "FROM DM_DEVICE_DETAIL AS DD INNER JOIN DM_DEVICE AS D ON D.ID=DD.DEVICE_ID\n" + + "DL.STATE, DL.COUNTRY, DL.UPDATE_TIMESTAMP AS DL_UPDATED_TIMESTAMP, DE.OWNER, DE.OWNERSHIP, DE.STATUS " + + "AS DE_STATUS FROM DM_DEVICE_DETAIL AS DD INNER JOIN DM_DEVICE AS D ON D.ID=DD.DEVICE_ID\n" + "LEFT JOIN DM_DEVICE_LOCATION AS DL ON DL.DEVICE_ID=D.ID \n" + - "INNER JOIN DM_DEVICE_TYPE AS DT ON DT.ID=D.DEVICE_TYPE_ID\n" + - "WHERE D.TENANT_ID = " + - PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); - - + "INNER JOIN DM_DEVICE_TYPE AS DT ON DT.ID=D.DEVICE_TYPE_ID\n" + + "INNER JOIN DM_ENROLMENT AS DE ON D.ID=DE.DEVICE_ID\n" + + "WHERE D.TENANT_ID = " + PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); } private String getPropertyQueryPart() { - return "SELECT D.ID, D.DESCRIPTION, D.NAME, \n" + "D.DEVICE_TYPE_ID, D.DEVICE_IDENTIFICATION, DT.ID AS DEVICE_TYPE_ID, \n" + "DT.NAME AS DEVICE_TYPE_NAME, DD.DEVICE_ID, DD.DEVICE_MODEL, DD.VENDOR, \n" + @@ -214,13 +218,14 @@ public class QueryBuilderImpl implements QueryBuilder { "DD.EXTERNAL_TOTAL_MEMORY, DD.EXTERNAL_AVAILABLE_MEMORY, DD.CONNECTION_TYPE, \n" + "DD.SSID, DD.CPU_USAGE, DD.TOTAL_RAM_MEMORY, DD.AVAILABLE_RAM_MEMORY, \n" + "DD.PLUGGED_IN, DD.UPDATE_TIMESTAMP, DL.LATITUDE, DL.LONGITUDE, DL.STREET1, DL.STREET2, DL.CITY, DL.ZIP, \n" + - "DL.STATE, DL.COUNTRY, DL.UPDATE_TIMESTAMP AS DL_UPDATED_TIMESTAMP, DI.KEY_FIELD, DI.VALUE_FIELD \n" + + "DL.STATE, DL.COUNTRY, DL.UPDATE_TIMESTAMP AS DL_UPDATED_TIMESTAMP, DI.KEY_FIELD, DI.VALUE_FIELD, \n" + + "DE.OWNER, DE.OWNERSHIP, DE.STATUS AS DE_STATUS " + "FROM DM_DEVICE_DETAIL AS DD INNER JOIN DM_DEVICE AS D ON D.ID=DD.DEVICE_ID\n" + "LEFT JOIN DM_DEVICE_LOCATION AS DL ON DL.DEVICE_ID=D.ID \n" + - "INNER JOIN DM_DEVICE_TYPE AS DT ON DT.ID=D.DEVICE_TYPE_ID\n" + + "INNER JOIN DM_DEVICE_TYPE AS DT ON DT.ID=D.DEVICE_TYPE_ID\n" + + "INNER JOIN DM_ENROLMENT AS DE ON D.ID=DE.DEVICE_ID\n" + "LEFT JOIN DM_DEVICE_INFO AS DI ON DI.DEVICE_ID=D.ID\n" + "WHERE D.TENANT_ID = " + PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); - } -} +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java index 317f875b1c..5d4e44efd5 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java @@ -120,6 +120,15 @@ public interface DeviceManagementProviderService { */ List getDevicesOfUser(String userName) throws DeviceManagementException; + /** + * This method returns the list of device owned by a user of given device type. + * @param userName user name. + * @param deviceType device type name + * @return + * @throws DeviceManagementException + */ + List getDevicesOfUser(String userName, String deviceType) throws DeviceManagementException; + /** * Method to get the list of devices owned by users of a particular user-role. * diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index aa6a9ba080..a5f6036d4d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -1304,6 +1304,74 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv return devices; } + @Override + public List getDevicesOfUser(String username, String deviceType) throws DeviceManagementException { + List devices = new ArrayList<>(); + List userDevices; + try { + DeviceManagementDAOFactory.openConnection(); + userDevices = deviceDAO.getDevicesOfUser(username, deviceType, this.getTenantId()); + } catch (DeviceManagementDAOException e) { + throw new DeviceManagementException("Error occurred while retrieving the list of devices that " + + "belong to the user '" + username + "'", e); + } catch (SQLException e) { + throw new DeviceManagementException("Error occurred while opening a connection to the data source", e); + } finally { + DeviceManagementDAOFactory.closeConnection(); + } + + for (Device device : userDevices) { + DeviceInfo info = null; + try { + DeviceManagementDAOFactory.openConnection(); + info = deviceInfoDAO.getDeviceInformation(device.getId()); + DeviceLocation location = deviceInfoDAO.getDeviceLocation(device.getId()); + if (info != null) { + info.setLocation(location); + } + } catch (DeviceDetailsMgtDAOException e) { + log.error("Error occurred while retrieving advance info of '" + device.getType() + + "' that carries the id '" + device.getDeviceIdentifier() + "'"); + } catch (SQLException e) { + log.error("Error occurred while opening a connection to the data source", e); + } finally { + DeviceManagementDAOFactory.closeConnection(); + } + device.setDeviceInfo(info); + + try { + DeviceManagementDAOFactory.openConnection(); + List applications = applicationDAO.getInstalledApplications(device.getId()); + device.setApplications(applications); + } catch (DeviceManagementDAOException e) { + log.error("Error occurred while retrieving the application list of '" + device.getType() + "', " + + "which carries the id '" + device.getId() + "'", e); + } catch (SQLException e) { + log.error("Error occurred while opening a connection to the data source", e); + } finally { + DeviceManagementDAOFactory.closeConnection(); + } + + DeviceManager deviceManager = this.getDeviceManager(device.getType()); + if (deviceManager == null) { + if (log.isDebugEnabled()) { + log.debug("Device Manager associated with the device type '" + device.getType() + "' is null. " + + "Therefore, not attempting method 'isEnrolled'"); + } + devices.add(device); + continue; + } + Device dmsDevice = + deviceManager.getDevice(new DeviceIdentifier(device.getDeviceIdentifier(), device.getType())); + if (dmsDevice != null) { + device.setFeatures(dmsDevice.getFeatures()); + device.setProperties(dmsDevice.getProperties()); + } + devices.add(device); + } + return devices; + } + @Override public PaginationResult getDevicesOfUser(PaginationRequest request) throws DeviceManagementException { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/testng.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/testng.xml index d050c5ada7..b30b66cb78 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/testng.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/testng.xml @@ -32,7 +32,7 @@ - + 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 index 2e2ad8b83a..ddce0b0204 100644 --- 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 @@ -33,8 +33,10 @@ "identityProviderUrl" : "https://localhost:9443/samlsso", "acs": "https://localhost:9443/devicemgt/uuf/sso/acs", "identityAlias": "wso2carbon", - "responseSigningEnabled" : "true", - "useTenantKey": false + "responseSigningEnabled" : true, + "validateAssertionValidityPeriod": true, + "validateAudienceRestriction": true, + "assertionSigningEnabled": true } }, "errorPages": { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/user.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/user.js index 693d00b236..51cbd25c64 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/user.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/user.js @@ -340,6 +340,7 @@ var userModule = function () { * @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) { @@ -673,23 +674,29 @@ var userModule = function () { */ publicMethods.getSecondaryUserStores = function () { var returnVal = []; - 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"]); + 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."); } - }, function (e) { - log.error("Error retrieving secondary user stores", e); - }, - constants["SOAP_VERSION"]); + } return returnVal; }; 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 index 199e362a46..6b466d90a3 100644 --- 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 @@ -15,12 +15,12 @@ specific language governing permissions and limitations under the License. }} -{{unit "cdmf.unit.ui.title" pageTitle="Resource Dashboard"}} +{{unit "cdmf.unit.ui.title" pageTitle="Home"}} {{#zone "breadcrumbs"}}
  • - Resource Dashboard +
  • {{/zone}} 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 index 0dc9a79602..c885566db8 100644 --- 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 @@ -1,13 +1,10 @@ /* 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, @@ -46,17 +43,23 @@ var dynamicForm = '' + '
    ' + - '
    '; + '
    ' + + '
    '; + +var nonNumericKeyValuePair = ["deviceModel", "vendor", "osVersion", "connectionType", "ssid", "pluggedIn"]; $(document).ready(function () { var isInit = true; @@ -64,14 +67,49 @@ $(document).ready(function () { $("#customSearchParam").prepend(dynamicForm); $(".close-button-div").unbind("click"); $(".close-button-div").bind("click", removeCustomParam); - $(".txt-key").select2({tags: true}); $(".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"; @@ -83,93 +121,104 @@ $(document).ready(function () { $("#customSearchParam .dynamic-search-param").each(function () { var value = $(this).find(".txt-value").val(); - var key = $(this).find(".txt-key").val() - if (value && key) { - var conditionObject = {}; - conditionObject.key = key; - conditionObject.value = value; - conditionObject.operator = $(this).find(".operator").val(); - conditionObject.state = $(this).find(".state").val(); - conditions.push(conditionObject) - } - }); - 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'); + 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('No Device are available to be displayed.'); - return; + $('#device-listing-status-msg').text('Error in user input values. ' + key + " requires a" + + " numerical value as the search value"); } - data = JSON.parse(data); - if (data.devices.length == 0) { + } + }); + + // 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'); - $("#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; - enrolmentInfo.status = "ACTIVE"; - enrolmentInfo.owner = "N/A"; - enrolmentInfo.ownership = "N/A"; - device.enrolmentInfo = enrolmentInfo; - device.properties = properties; - devices.push(device); + if (isInit) { + $('#device-grid').datatables_extended(); + isInit = false; } - 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'); - } - ); - }); + $(".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'); + } + ); + }); + } }); -}); +}); \ 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/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 index eafe9cd4b1..30b5f71e5f 100644 --- 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 @@ -5,7 +5,7 @@
    +
    - +
    {{#if sessionDataKey}} 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 index 6df9082eb3..3e3c64781f 100644 --- 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 @@ -85,7 +85,7 @@ $("a#invite-user-link").click(function () { modalDialog.footer(''); $("a#invite-user-success-link").click(function () { - modalPopup.hide(); + modalDialog.hide(); }); }, function () { @@ -95,14 +95,14 @@ $("a#invite-user-link").click(function () { modalDialog.footer(''); $("a#invite-user-error-link").click(function () { - modalPopup.hide(); + modalDialog.hide(); }); } ); }); $("a#invite-user-cancel-link").click(function () { - modalPopup.hide(); + modalDialog.hide(); }); }); 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 index b22af2dc10..5741aab8aa 100644 --- 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 @@ -108,14 +108,14 @@ Enter new password

    -

    Retype new password

    -

    diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.platform.configuration/configuration.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.platform.configuration/configuration.hbs index 1fdef264e8..0a1b45b09c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.platform.configuration/configuration.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.platform.configuration/configuration.hbs @@ -82,7 +82,7 @@
    - ( Should be in milliseconds ) + ( Should be in seconds )
    - +


    Type a new password *

    -


    Reconfirm your new password *

    - +


    diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error400.html b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error400.html new file mode 100644 index 0000000000..9213fa2e2f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error400.html @@ -0,0 +1,33 @@ + + + + + + + Bad request - Error 400 + + + + + + +

    Error 400

    +

    We are unable to understand the request and process it. Please re-check your request.

    + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error401.html b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error401.html new file mode 100644 index 0000000000..e803601a08 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error401.html @@ -0,0 +1,33 @@ + + + + + + + Unauthorized - Error 401 + + + + + + +

    Error 401

    +

    You do not have permission to access this page.Please contact your administrator and request permission.

    + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error403.html b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error403.html new file mode 100644 index 0000000000..e7615ea7de --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error403.html @@ -0,0 +1,34 @@ + + + + + + + Forbidden - Error 403 + + + + + + + +

    Error 403

    +

    We cannot process this request.

    + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error404.html b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error404.html new file mode 100644 index 0000000000..49c9ab87e4 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error404.html @@ -0,0 +1,33 @@ + + + + + + + Page not found - Error 404 + + + + + + +

    Error 404

    +

    We can't find what you are looking for.

    + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error405.html b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error405.html new file mode 100644 index 0000000000..d42ff5fe20 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error405.html @@ -0,0 +1,33 @@ + + + + + + + Method not allowed - Error 405 + + + + + + +

    Error 405

    +

    Method not allowed.

    + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error500.html b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error500.html new file mode 100644 index 0000000000..48cfdc4c97 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/error-pages/error500.html @@ -0,0 +1,32 @@ + + + + + + + Internal Server Error - Error 500 + + + + + +

    Error 500

    +

    Something went wrong and we're trying to fix it.

    + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/jaggery.conf b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/jaggery.conf index 76bfb37095..832c1ab252 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/jaggery.conf +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/jaggery.conf @@ -56,51 +56,59 @@ "path": "/api/operation-api.jag" } ], + "errorPages": { + "500": "/error-pages/error500.html", + "404": "/error-pages/error404.html", + "401": "/error-pages/error401.html", + "405": "/error-pages/error405.html", + "403": "/error-pages/error403.html", + "400": "/error-pages/error400.html" + }, "filters": [ + { + "name": "URLBasedCachePreventionFilter", + "class": "org.wso2.carbon.ui.filters.cache.URLBasedCachePreventionFilter" + }, + { + "name":"HttpHeaderSecurityFilter", + "class":"org.apache.catalina.filters.HttpHeaderSecurityFilter", + "params" : [{"name" : "hstsEnabled", "value" : "false"}] + } + ], + "filterMappings": [ + { + "name": "URLBasedCachePreventionFilter", + "url": "/api/*" + }, + { + "name":"HttpHeaderSecurityFilter", + "url":"*" + } + ], + "listeners" : [ { - "name": "URLBasedCachePreventionFilter", - "class": "org.wso2.carbon.ui.filters.cache.URLBasedCachePreventionFilter" + "class" : "org.owasp.csrfguard.CsrfGuardServletContextListener" }, { - "name":"HttpHeaderSecurityFilter", - "class":"org.apache.catalina.filters.HttpHeaderSecurityFilter", - "params" : [{"name" : "hstsEnabled", "value" : "false"}] + "class" : "org.owasp.csrfguard.CsrfGuardHttpSessionListener" } ], - "filterMappings": [ + "servlets" : [ { - "name": "URLBasedCachePreventionFilter", - "url": "/api/*" - }, + "name" : "JavaScriptServlet", + "class" : "org.owasp.csrfguard.servlet.JavaScriptServlet" + } + ], + "servletMappings" : [ { - "name":"HttpHeaderSecurityFilter", - "url":"*" + "name" : "JavaScriptServlet", + "url" : "/csrf.js" } ], - "listeners" : [ - { - "class" : "org.owasp.csrfguard.CsrfGuardServletContextListener" - }, - { - "class" : "org.owasp.csrfguard.CsrfGuardHttpSessionListener" - } - ], - "servlets" : [ - { - "name" : "JavaScriptServlet", - "class" : "org.owasp.csrfguard.servlet.JavaScriptServlet" - } - ], - "servletMappings" : [ - { - "name" : "JavaScriptServlet", - "url" : "/csrf.js" - } - ], - "contextParams" : [ - { - "name" : "Owasp.CsrfGuard.Config", - "value" : "/repository/conf/security/Owasp.CsrfGuard.Carbon.properties" - } - ] + "contextParams" : [ + { + "name" : "Owasp.CsrfGuard.Config", + "value" : "/repository/conf/security/Owasp.CsrfGuard.dashboard.properties" + } + ] } \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/pages/uuf.page.sign-in/sign-in.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/pages/uuf.page.sign-in/sign-in.hbs index 06fde86ec3..ba781f71b3 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/pages/uuf.page.sign-in/sign-in.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/pages/uuf.page.sign-in/sign-in.hbs @@ -39,7 +39,7 @@ placeholder="User Name" required="required" autofocus="autofocus" />
    -
    {{#if referer}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/jaggery.conf b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/jaggery.conf index 038abd25e5..f97bae72cf 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/jaggery.conf +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/jaggery.conf @@ -26,5 +26,52 @@ "url": "/*", "path": "/lib/pages.jag" } - ] + ], + "filters": [ + { + "name": "URLBasedCachePreventionFilter", + "class": "org.wso2.carbon.ui.filters.cache.URLBasedCachePreventionFilter" + }, + { + "name":"HttpHeaderSecurityFilter", + "class":"org.apache.catalina.filters.HttpHeaderSecurityFilter", + "params" : [{"name" : "hstsEnabled", "value" : "false"}] + } + ], + "filterMappings": [ + { + "name": "URLBasedCachePreventionFilter", + "url": "/api/*" + }, + { + "name":"HttpHeaderSecurityFilter", + "url":"*" + } + ], + "listeners" : [ + { + "class" : "org.owasp.csrfguard.CsrfGuardServletContextListener" + }, + { + "class" : "org.owasp.csrfguard.CsrfGuardHttpSessionListener" + } + ], + "servlets" : [ + { + "name" : "JavaScriptServlet", + "class" : "org.owasp.csrfguard.servlet.JavaScriptServlet" + } + ], + "servletMappings" : [ + { + "name" : "JavaScriptServlet", + "url" : "/csrf.js" + } + ], + "contextParams" : [ + { + "name" : "Owasp.CsrfGuard.Config", + "value" : "/repository/conf/security/Owasp.CsrfGuard.dashboard.properties" + } + ] } \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js index ab0f099fea..c850d68bac 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js @@ -502,26 +502,24 @@ var module = {}; // This is a logout response. module.logout(response); } else { - // This is a login response. - var ssoConfigs = getSsoConfigurations(); - var rsEnabled = ssoConfigs[constants.APP_CONF_AUTH_MODULE_SSO_RESPONSE_SIGNING_ENABLED]; - if (utils.parseBoolean(rsEnabled)) { - var CarbonUtils = Packages.org.wso2.carbon.utils.CarbonUtils; - var keyStorePassword = CarbonUtils.getServerConfiguration().getFirstProperty("Security.TrustStore.Password"); - var keyStoreName = CarbonUtils.getServerConfiguration().getFirstProperty("Security.TrustStore.Location"); - var identityAlias = ssoConfigs[constants.APP_CONF_AUTH_MODULE_SSO_IDENTITY_ALIAS]; - var keyStoreParams = { - KEY_STORE_NAME: keyStoreName, - KEY_STORE_PASSWORD: keyStorePassword, - IDP_ALIAS: identityAlias, - USE_ST_KEY: !ssoConfigs[constants.APP_CONF_AUTH_MODULE_SSO_USE_ST_KEY] - }; - if (!ssoClient.validateSignature(samlResponseObj, keyStoreParams)) { - var msg = "Invalid signature found in the SAML response."; - log.error(msg); - response.sendError(500, msg); - return; - } + // This is a login response. + var ssoConfigs = getSsoConfigurations(); + var CarbonUtils = Packages.org.wso2.carbon.utils.CarbonUtils; + var keyStorePassword = CarbonUtils.getServerConfiguration().getFirstProperty("Security.TrustStore.Password"); + var keyStoreName = CarbonUtils.getServerConfiguration().getFirstProperty("Security.TrustStore.Location"); + var identityAlias = ssoConfigs[constants.APP_CONF_AUTH_MODULE_SSO_IDENTITY_ALIAS]; + var keyStoreParams = { + KEY_STORE_NAME: keyStoreName, + KEY_STORE_PASSWORD: keyStorePassword, + IDP_ALIAS: identityAlias + }; + + if (!ssoClient.validateSamlResponse(samlResponseObj, ssoConfigs, keyStoreParams)) { + var msg = "Invalid signature found in the SAML response."; + log.error(msg); + response.sendError(500, msg); + return; + } } /** * @type {{sessionId: string, loggedInUser: string, sessionIndex: string, samlToken: @@ -532,7 +530,7 @@ var module = {}; if (ssoSession.sessionId) { var ssoSessions = getSsoSessions(); ssoSessions[ssoSession.sessionId] = ssoSession; - if (ssoSession.sessionIndex != null || ssoSession.sessionIndex != 'undefined') { + if (ssoSession.sessionIndex) { module.loadTenant(ssoSession.loggedInUser); var carbonUser = (require("carbon")).server.tenantUser(ssoSession.loggedInUser); utils.setCurrentUser(carbonUser.username, carbonUser.domain, carbonUser.tenantId); diff --git a/components/identity-extensions/org.wso2.carbon.device.mgt.oauth.extensions/pom.xml b/components/identity-extensions/org.wso2.carbon.device.mgt.oauth.extensions/pom.xml index 440e770ce5..c442a830b3 100644 --- a/components/identity-extensions/org.wso2.carbon.device.mgt.oauth.extensions/pom.xml +++ b/components/identity-extensions/org.wso2.carbon.device.mgt.oauth.extensions/pom.xml @@ -116,6 +116,8 @@ org.wso2.carbon.identity.application.authentication.framework.model, org.apache.oltu.oauth2.common, org.wso2.carbon.base, + org.apache.xerces.impl; resolution:=optional, + org.apache.xerces.util; resolution:=optional diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Policy.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Policy.java index 4620adb72e..d62fbbc0c1 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Policy.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Policy.java @@ -36,55 +36,133 @@ public class Policy implements Comparable, Serializable { private static final long serialVersionUID = 19981017L; - @ApiModelProperty(name = "id", value = "The policy ID", required = true) + @ApiModelProperty( + name = "id", + value = "The policy ID", + required = true, + example = "1") private int id; // Identifier of the policy. - @ApiModelProperty(name = "priorityId", value = "The priority order of the policy. 1 indicates the highest" - + " priority", required = true) + + @ApiModelProperty( + name = "priorityId", + value = "The priority order of the policy. 1 indicates the highest priority", + required = true, + example = "1") private int priorityId; // Priority of the policies. This will be used only for simple evaluation. - @ApiModelProperty(name = "profile", value = "Contains the details of the profile that is included in the " - + "policy", required = true) + + @ApiModelProperty( + name = "profile", + value = "Contains the details of the profile that is included in the policy", + required = true) private Profile profile; // Profile - @ApiModelProperty(name = "policyName", value = "The name of the policy", required = true) + + @ApiModelProperty( + name = "policyName", + value = "The name of the policy", + required = true, + example = "Block Camera") private String policyName; // Name of the policy. - @ApiModelProperty(name = "generic", value = "If true, this should be applied to all related device", - required = true) + + @ApiModelProperty( + name = "generic", + value = "If true, this should be applied to all related device", + required = true, + example = "false") private boolean generic; // If true, this should be applied to all related device. - @ApiModelProperty(name = "roles", value = "The roles to whom the policy is applied on", required = true) + + @ApiModelProperty( + name = "roles", + value = "The roles to whom the policy is applied on", + required = true, + example = "[ \n" + " \"ANY\"\n" + " ]") private List roles; // Roles which this policy should be applied. - @ApiModelProperty(name = "ownershipType", value = "The policy ownership type. It can be any of the " - + "following values:\n" - + "ANY - The policy will be applied on the BYOD and COPE device types\n" - + "BYOD (Bring Your Own Device) - The policy will only be applied on the BYOD device type\n" - + "COPE (Corporate-Owned, Personally-Enabled) - The policy will only be applied on the COPE " - + "device type\n", required = true) + + @ApiModelProperty( + name = "ownershipType", + value = "The policy ownership type. It can be any of the following values:\n" + + "ANY - The policy will be applied on the BYOD and COPE device types\n" + + "BYOD (Bring Your Own Device) - The policy will only be applied on the BYOD device type\n" + + "COPE (Corporate-Owned, Personally-Enabled) - The policy will only be applied on the COPE " + + "device type\n", + required = true, + example = "BYOD") private String ownershipType; // Ownership type (COPE, BYOD, CPE) - @ApiModelProperty(name = "devices", value = "Lists out the devices the policy is enforced on", - required = true) + + @ApiModelProperty( + name = "devices", + value = "Lists out the devices the policy is enforced on", + required = true, + example = "[]") private List devices; // Individual devices this policy should be applied - @ApiModelProperty(name = "users", value = "Lists out the users on whose devices the policy is enforced", - required = true) + + @ApiModelProperty( + name = "users", + value = "Lists out the users on whose devices the policy is enforced", + required = true, + example = "[]") private List users; - @ApiModelProperty(name = "active", value = "If the value is true it indicates that the policy is active. " - + "If the value is false it indicates that the policy is inactive", required = true) + + @ApiModelProperty( + name = "active", + value = "If the value is true it indicates that the policy is active. " + + "If the value is false it indicates that the policy is inactive", + required = true, + example = "false") private boolean active; - @ApiModelProperty(name = "updated", value = "If you have made changes to the policy but have not applied" - + " these changes to the devices that are registered with EMM, then the value is defined as true." - + " But if you have already applied any changes made to the policy then the value is defined as" - + " false.", required = true) + + @ApiModelProperty( + name = "updated", + value = "If you have made changes to the policy but have not applied" + + " these changes to the devices that are registered with EMM, then the value is defined as true." + + " But if you have already applied any changes made to the policy then the value is defined as" + + " false.", + required = true, + example = "false") private boolean updated; - @ApiModelProperty(name = "description", value = "Gives a description on the policy", required = true) + + @ApiModelProperty( + name = "description", + value = "Gives a description on the policy", + required = true, + example = "This will block the camera functionality") private String description; - /* Compliance data*/ - private String compliance; + @ApiModelProperty( + name = "compliance", + value = "Define the non-compliance rules. WSO2 EMM provides the following non-compliance rules:\n" + + "Enforce - Forcefully enforce the policies on the devices.\n" + + "Warning - If the device does not adhere to the given policies a warning message will " + + "be sent.\n" + + "Monitor - If the device does not adhere to the given policies the server is notified " + + "of the violation unknown to the user and the administrator can take the necessary " + + "actions with regard to the reported", + required = true, + example = "enforce") + private String compliance; /* Compliance data*/ /*Dynamic policy attributes*/ /* This is related criteria based policy */ + @ApiModelProperty( + name = "policyCriterias", + value = "", + required = true, + example = "[]") private List policyCriterias; + @ApiModelProperty( + name = "tenantId", + value = "", + required = true, + example = "-1234") private int tenantId; + + @ApiModelProperty( + name = "profileId", + value = "", + required = true, + example = "1") private int profileId; /*This will be used to record attributes which will be used by customer extended PDPs and PIPs*/ @@ -92,7 +170,11 @@ public class Policy implements Comparable, Serializable { private Map attributes; /*This will keep the list of groups to which the policy will be applied. */ - + @ApiModelProperty( + name = "deviceGroups", + value = "This will keep the list of groups to which the policy will be applied", + required = true, + example = "[]") private List deviceGroups; diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Profile.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Profile.java index 0d3d08026d..ddc1411330 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Profile.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Profile.java @@ -18,8 +18,8 @@ package org.wso2.carbon.policy.mgt.common; - - +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.device.mgt.core.dto.DeviceType; import javax.xml.bind.annotation.XmlElement; @@ -28,17 +28,61 @@ import java.io.Serializable; import java.sql.Timestamp; import java.util.List; @XmlRootElement +@ApiModel(value = "Profile", description = "This class carries all information related to policy profiles") + public class Profile implements Serializable { + @ApiModelProperty( + name = "profileId", + value = "The ID of each profile that is in the selected policy", + required = true, + example = "1") private int profileId; + + @ApiModelProperty( + name = "profileName", + value = "The name of the profile", + required = true, + example = "Block Camera") private String profileName; + + @ApiModelProperty( + name = "tenantId", + value = "The ID of the tenant that added the policy", + required = true, + example = "-1234") private int tenantId; + + @ApiModelProperty( + name = "deviceType", + value = "Contains the device type details the policy was created for", + required = true, + example = "android") private String deviceType; + + @ApiModelProperty( + name = "createdDate", + value = "The date the policy was created", + required = true, + example = "Thu, 6 Oct 2016 14:39:32 +0530") private Timestamp createdDate; + + @ApiModelProperty( + name = "updatedDate", + value = "The date the changes made to the policy was published to" + + " the devices registered with the EMM", + required = true, + example = "Thu, 6 Oct 2016 14:39:32 +0530") private Timestamp updatedDate; -// private List featuresList; // Features included in the policies. + + @ApiModelProperty( + name = "profileFeaturesList", + value = "Contains the features specific to each profile in the policy", + required = true) private List profileFeaturesList; // Features included in the policies. +// private List featuresList; // Features included in the policies. + public String getDeviceType() { return deviceType; } @@ -55,13 +99,12 @@ public class Profile implements Serializable { this.tenantId = tenantId; } -/* public List getFeaturesList() { - return featuresList; - } - - public void setFeaturesList(List featuresList) { - this.featuresList = featuresList; - }*/ + /* public List getFeaturesList() { + return featuresList; + } + public void setFeaturesList(List featuresList) { + this.featuresList = featuresList; + }*/ @XmlElement public int getProfileId() { return profileId; @@ -106,4 +149,4 @@ public class Profile implements Serializable { public void setProfileFeaturesList(List profileFeaturesList) { this.profileFeaturesList = profileFeaturesList; } -} +} \ No newline at end of file diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/ProfileFeature.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/ProfileFeature.java index 723f5fb49c..e5e353adc2 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/ProfileFeature.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/ProfileFeature.java @@ -29,18 +29,39 @@ public class ProfileFeature implements Serializable { private static final long serialVersionUID = 19981018L; - @ApiModelProperty(name = "id", value = "Define the ID", required = true) + @ApiModelProperty( + name = "id", + value = "Define the ID", + required = true, + example = "1") private int id; - @ApiModelProperty(name = "featureCode", value = "Provide the code that defines the policy you wish to add", - required = true) + + @ApiModelProperty( + name = "featureCode", + value = "Provide the code that defines the policy you wish to add", + required = true, + example = "CAMERA") private String featureCode; - @ApiModelProperty(name = "profileId", value = "Define the ID of the profile", required = true) + + @ApiModelProperty( + name = "profileId", + value = "Define the ID of the profile", + required = true, + example = "1") private int profileId; - @ApiModelProperty(name = "deviceTypeId", value = "The ID used to define the type of the device platform", - required = true) + + @ApiModelProperty( + name = "deviceType", + value = "The ID used to define the type of the device platform", + required = true, + example = "android") private String deviceType; - @ApiModelProperty(name = "content", value = "The list of parameters that define the policy", - required = true) + + @ApiModelProperty( + name = "content", + value = "The list of parameters that define the policy", + required = true, + example = "{\\\"enabled\\\":false}") private Object content; public int getId() { @@ -82,4 +103,4 @@ public class ProfileFeature implements Serializable { public void setContent(Object content) { this.content = content; } -} +} \ No newline at end of file diff --git a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authenticator/oauth/impl/LocalOAuthValidator.java b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authenticator/oauth/impl/LocalOAuthValidator.java index 352d8d8f62..e02f500119 100755 --- a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authenticator/oauth/impl/LocalOAuthValidator.java +++ b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authenticator/oauth/impl/LocalOAuthValidator.java @@ -19,6 +19,7 @@ package org.wso2.carbon.webapp.authenticator.framework.authenticator.oauth.impl; import org.wso2.carbon.identity.oauth2.dto.OAuth2TokenValidationRequestDTO; import org.wso2.carbon.identity.oauth2.dto.OAuth2TokenValidationResponseDTO; +import org.wso2.carbon.utils.multitenancy.MultitenantConstants; import org.wso2.carbon.utils.multitenancy.MultitenantUtils; import org.wso2.carbon.webapp.authenticator.framework.AuthenticatorFrameworkDataHolder; import org.wso2.carbon.webapp.authenticator.framework.authenticator.oauth.OAuth2TokenValidator; @@ -64,6 +65,9 @@ public class LocalOAuthValidator implements OAuth2TokenValidator { tokenValidationResponse.getAuthorizedUser()); tenantDomain = MultitenantUtils.getTenantDomain(tokenValidationResponse.getAuthorizedUser()); + if (MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equals(tenantDomain)) { + tenantDomain = MultitenantUtils.getTenantDomain(userName); + } } else { OAuthValidationResponse oAuthValidationResponse = new OAuthValidationResponse(); oAuthValidationResponse.setErrorMsg(tokenValidationResponse.getErrorMsg()); diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml index 462258c681..9a54ff8eab 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml @@ -27,6 +27,7 @@ org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.GCMBasedPushNotificationProvider + From 9def8aa609b314b82d38d4aeeaefce71475bd6c0 Mon Sep 17 00:00:00 2001 From: geethkokila Date: Thu, 8 Dec 2016 14:08:46 +0530 Subject: [PATCH 2/4] Fixing the login issue --- .../jaggeryapps/uuf-template-app/lib/modules/auth/auth.js | 1 + 1 file changed, 1 insertion(+) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js index c850d68bac..d03af765fd 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js @@ -533,6 +533,7 @@ var module = {}; if (ssoSession.sessionIndex) { module.loadTenant(ssoSession.loggedInUser); var carbonUser = (require("carbon")).server.tenantUser(ssoSession.loggedInUser); + module.loadTenant(ssoSession.loggedInUser); utils.setCurrentUser(carbonUser.username, carbonUser.domain, carbonUser.tenantId); var scriptArgument = {input: {samlToken: ssoSession.samlToken}, user: module.getCurrentUser()}; handleEvent(OPERATION_LOGIN, EVENT_SUCCESS, scriptArgument); From 87b2fb36036e1edef4f9dc7f8d12dadf14aa7478 Mon Sep 17 00:00:00 2001 From: geethkokila Date: Thu, 8 Dec 2016 14:28:33 +0530 Subject: [PATCH 3/4] Fixing the login issue --- .../jaggeryapps/uuf-template-app/lib/modules/auth/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js index d03af765fd..2cf9771bea 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/lib/modules/auth/auth.js @@ -520,7 +520,7 @@ var module = {}; response.sendError(500, msg); return; } - } + /** * @type {{sessionId: string, loggedInUser: string, sessionIndex: string, samlToken: * string}} From b9d104e9b2ea06eb05f05524fe9808a7dc9f957f Mon Sep 17 00:00:00 2001 From: geethkokila Date: Thu, 8 Dec 2016 14:38:42 +0530 Subject: [PATCH 4/4] Fixing the certificate mgt issue --- .../org.wso2.carbon.certificate.mgt.core/pom.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml index cf23d12014..69cbb3d958 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml @@ -51,8 +51,7 @@ ${carbon.device.mgt.version} Device Management Core Bundle - org.wso2.carbon.certificate.mgt.core.internal, - org.wso2.carbon.certificate.mgt.core.util + org.wso2.carbon.certificate.mgt.core.internal org.osgi.framework, @@ -60,7 +59,7 @@ org.apache.commons.logging, javax.security.auth.x500, javax.xml.*, - javax.xml.parsers;version="${javax.xml.parsers.import.pkg.version}";resolution:=optional, + javax.xml.parsers;version="${javax.xml.parsers.import.pkg.version}";resolution:=optional, org.apache.commons.codec.binary, org.bouncycastle.asn1, org.bouncycastle.asn1.x500, @@ -98,7 +97,6 @@ !org.wso2.carbon.certificate.mgt.core.internal.*, - !org.wso2.carbon.certificate.mgt.core.util, org.wso2.carbon.certificate.mgt.core.*