From 2d58d69d2ff68914db4fef412b7c66d66ab03cd7 Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Wed, 2 Oct 2019 11:12:04 +0530 Subject: [PATCH] Fix incorrect device view issue for different ownerships. --- .../src/main/webapp/WEB-INF/web.xml | 4 + .../service/api/DeviceManagementService.java | 24 +-- .../impl/DeviceManagementServiceImpl.java | 78 ++++----- .../impl/DeviceManagementServiceImplTest.java | 6 +- .../mgt/common/device/details/DeviceData.java | 77 +++++++++ .../carbon/device/mgt/core/dao/DeviceDAO.java | 12 +- .../core/dao/impl/AbstractDeviceDAOImpl.java | 151 ++++++++++++++---- .../operation/mgt/OperationManagerImpl.java | 20 ++- .../DeviceManagementProviderService.java | 12 ++ .../DeviceManagementProviderServiceImpl.java | 52 +++++- ...tionManagementNegativeDBOperationTest.java | 2 + .../OperationManagementNoDBSchemaTests.java | 2 + .../operation/OperationManagementTests.java | 4 + .../devicemgt/api/operation-api.jag | 4 +- .../modules/business-controllers/device.js | 9 +- .../cdmf.page.devices/public/js/listing.js | 20 +-- .../device-view.js | 7 +- .../public/js/device-view.js | 4 +- .../app/units/cdmf.unit.device.view/view.js | 3 +- 19 files changed, 372 insertions(+), 119 deletions(-) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceData.java diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api/src/main/webapp/WEB-INF/web.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api/src/main/webapp/WEB-INF/web.xml index ca08169c8c..b1ae20d952 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api/src/main/webapp/WEB-INF/web.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api/src/main/webapp/WEB-INF/web.xml @@ -58,6 +58,10 @@ isSharedWithAllTenants true + + basicAuth + true + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceManagementService.java index aba6d9819c..76dfefaaef 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceManagementService.java @@ -462,17 +462,21 @@ public interface DeviceManagementService { String id, @ApiParam( name = "owner", - value = "The owner of the device you want ot get details.", - required = false) + value = "The owner of the device you want ot get details.") @QueryParam("owner") @Size(max = 100) String owner, + @ApiParam( + name = "ownership", + value = "Device ownership.") + @QueryParam("ownership") + @Size(max = 100) + String ownership, @ApiParam( name = "If-Modified-Since", value = "Checks if the requested variant was modified, since the specified date-time. \n" + "Provide the value in the following format: EEE, d MMM yyyy HH:mm:ss Z. \n" + - "Example: Mon, 05 Jan 2014 15:10:00 +0200", - required = false) + "Example: Mon, 05 Jan 2014 15:10:00 +0200") @HeaderParam("If-Modified-Since") String ifModifiedSince); @@ -1333,21 +1337,18 @@ public interface DeviceManagementService { name = "If-Modified-Since", value = "Checks if the requested variant was modified, since the specified date-time. \n" + "Provide the value in the following format: EEE, d MMM yyyy HH:mm:ss Z.\n" + - "Example: Mon, 05 Jan 2014 15:10:00 +0200", - required = false) + "Example: Mon, 05 Jan 2014 15:10:00 +0200") @HeaderParam("If-Modified-Since") String ifModifiedSince, @ApiParam( name = "offset", value = "The starting pagination index for the complete list of qualified items.", - required = false, defaultValue = "0") @QueryParam("offset") int offset, @ApiParam( name = "limit", value = "Provide how many activity details you require from the starting pagination index/offset.", - required = false, defaultValue = "5") @QueryParam("limit") int limit, @@ -1357,7 +1358,12 @@ public interface DeviceManagementService { required = true, defaultValue = "") @QueryParam("owner") - String owner); + String owner, + @ApiParam( + name = "ownership", + value = "Provides the ownership of the required device.") + @QueryParam("owner") + String ownership); @GET @Path("/{type}/{id}/effective-policy") diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImpl.java index 33cf2ec35b..3b1e880290 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImpl.java @@ -36,6 +36,7 @@ package org.wso2.carbon.device.mgt.jaxrs.service.impl; +import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -55,6 +56,7 @@ import org.wso2.carbon.device.mgt.common.app.mgt.Application; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; 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.DeviceData; 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.operation.mgt.Activity; @@ -103,6 +105,7 @@ import javax.ws.rs.core.Response; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; @@ -375,8 +378,10 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { @PathParam("type") @Size(max = 45) String type, @PathParam("id") @Size(max = 45) String id, @QueryParam("owner") @Size(max = 100) String owner, + @QueryParam("ownership") @Size(max = 100) String ownership, @HeaderParam("If-Modified-Since") String ifModifiedSince) { - Device device = null; + Device device; + Date sinceDate = null; try { RequestValidationUtil.validateDeviceIdentifier(type, id); DeviceManagementProviderService dms = DeviceMgtAPIUtils.getDeviceManagementService(); @@ -391,61 +396,32 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { String msg = "User '" + authorizedUser + "' is not authorized to retrieve the given device id '" + id + "'"; log.error(msg); return Response.status(Response.Status.UNAUTHORIZED).entity( - new ErrorResponse.ErrorResponseBuilder().setCode(401l).setMessage(msg).build()).build(); + new ErrorResponse.ErrorResponseBuilder().setCode(HttpStatus.SC_UNAUTHORIZED).setMessage(msg).build()).build(); } - Date sinceDate = null; - if (ifModifiedSince != null && !ifModifiedSince.isEmpty()) { + DeviceData deviceData = new DeviceData(); + deviceData.setDeviceIdentifier(deviceIdentifier); + + if (!StringUtils.isBlank(ifModifiedSince)){ SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); try { sinceDate = format.parse(ifModifiedSince); + deviceData.setLastModifiedDate(sinceDate); } catch (ParseException e) { + String msg = "Invalid date string is provided in 'If-Modified-Since' header"; + log.error(msg, e); return Response.status(Response.Status.BAD_REQUEST).entity( - new ErrorResponse.ErrorResponseBuilder().setMessage("Invalid date " + - "string is provided in 'If-Modified-Since' header").build()).build(); + new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); } } - if (!StringUtils.isEmpty(owner)) { - if (authorizedUser.equalsIgnoreCase(owner) || deviceAccessAuthorizationService.isDeviceAdminUser()) { - if (sinceDate != null) { - device = dms.getDevice(new DeviceIdentifier(id, type), owner, sinceDate, true); - if (device == null) { - return Response.status(Response.Status.NOT_MODIFIED).entity("No device is modified " + - "after the timestamp provided in 'If-Modified-Since' header").build(); - } - } else { - device = dms.getDevice(new DeviceIdentifier(id, type), owner, true); - } - } else { - String msg = "User '" + authorizedUser + "' is not authorized to retrieve the given device id '" + id + - "' which belongs to user '" + owner + "'"; - log.error(msg); - return Response.status(Response.Status.UNAUTHORIZED).entity( - new ErrorResponse.ErrorResponseBuilder().setCode(401l).setMessage(msg).build()).build(); - } - } else if (deviceAccessAuthorizationService.isDeviceAdminUser()) { - if (sinceDate != null) { - device = dms.getDevice(new DeviceIdentifier(id, type), sinceDate); - if (device == null) { - return Response.status(Response.Status.NOT_MODIFIED).entity("No device is modified " + - "after the timestamp provided in 'If-Modified-Since' header").build(); - } - } else { - device = dms.getDevice(new DeviceIdentifier(id, type)); - } - } else { - owner = authorizedUser; - if (sinceDate != null) { - device = dms.getDevice(new DeviceIdentifier(id, type), owner, sinceDate, true); - if (device == null) { - return Response.status(Response.Status.NOT_MODIFIED).entity("No device is modified " + - "after the timestamp provided in 'If-Modified-Since' header").build(); - } - } else { - device = dms.getDevice(new DeviceIdentifier(id, type), owner, true); - } + if (!StringUtils.isBlank(owner)){ + deviceData.setDeviceOwner(owner); } + if (!StringUtils.isBlank(ownership)){ + deviceData.setDeviceOwnership(ownership); + } + device = dms.getDevice(deviceData, true); } catch (DeviceManagementException e) { String msg = "Error occurred while fetching the device information."; log.error(msg, e); @@ -458,8 +434,12 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); } if (device == null) { + if (sinceDate != null) { + return Response.status(Response.Status.NOT_MODIFIED).entity("No device is modified " + + "after the timestamp provided in 'If-Modified-Since' header").build(); + } return Response.status(Response.Status.NOT_FOUND).entity( - new ErrorResponse.ErrorResponseBuilder().setCode(404l).setMessage("Requested device of type '" + + new ErrorResponse.ErrorResponseBuilder().setCode(HttpStatus.SC_NOT_FOUND).setMessage("Requested device of type '" + type + "', which carries id '" + id + "' does not exist").build()).build(); } return Response.status(Response.Status.OK).entity(device).build(); @@ -703,7 +683,8 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { @HeaderParam("If-Modified-Since") String ifModifiedSince, @QueryParam("offset") int offset, @QueryParam("limit") int limit, - @QueryParam("owner") String owner) { + @QueryParam("owner") String owner, + @QueryParam("ownership") String ownership) { OperationList operationsList = new OperationList(); RequestValidationUtil.validateOwnerParameter(owner); RequestValidationUtil.validatePaginationParameters(offset, limit); @@ -714,6 +695,9 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { try { RequestValidationUtil.validateDeviceIdentifier(type, id); dms = DeviceMgtAPIUtils.getDeviceManagementService(); + if (!StringUtils.isBlank(ownership)) { + request.setOwnership(ownership); + } result = dms.getOperations(new DeviceIdentifier(id, type), request); operationsList.setList((List) result.getData()); operationsList.setCount(result.getRecordsTotal()); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImplTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImplTest.java index fc26189f40..de01b0ae62 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImplTest.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImplTest.java @@ -627,7 +627,8 @@ public class DeviceManagementServiceImplTest { PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceManagementService")) .toReturn(this.deviceManagementProviderService); Response response = this.deviceManagementService - .getDeviceOperations(TEST_DEVICE_TYPE, UUID.randomUUID().toString(), "", 10, 5, DEFAULT_USERNAME); + .getDeviceOperations(TEST_DEVICE_TYPE, UUID.randomUUID().toString(), "", 10, 5, DEFAULT_USERNAME, + DEFAULT_OWNERSHIP); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), "Expects to return HTTP 200 when the operation is retrieved successfully."); } @@ -639,7 +640,8 @@ public class DeviceManagementServiceImplTest { Mockito.when(this.deviceManagementProviderService.getOperations(Mockito.any(DeviceIdentifier.class), Mockito.any(PaginationRequest.class))).thenThrow(new OperationManagementException()); Response response = this.deviceManagementService - .getDeviceOperations(TEST_DEVICE_TYPE, UUID.randomUUID().toString(), "", 10, 5, DEFAULT_USERNAME); + .getDeviceOperations(TEST_DEVICE_TYPE, UUID.randomUUID().toString(), "", 10, 5, DEFAULT_USERNAME, + DEFAULT_OWNERSHIP); Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), "Expects to return HTTP 500 when an exception occurred while retrieving operation list of the device"); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceData.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceData.java new file mode 100644 index 0000000000..7a65f39fad --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceData.java @@ -0,0 +1,77 @@ +/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.device.mgt.common.device.details; + +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; + +import java.util.Date; + +public class DeviceData { + + /*** + * Identifier of the device, which contains identifier and device ype. + */ + private DeviceIdentifier deviceIdentifier; + + /*** + * User who is enrolled the device. + */ + private String deviceOwner; + + /*** + * Last modified date. + */ + private Date lastModifiedDate; + + /*** + * Current status of the device, e.g ACTIVE, INACTIVE, REMOVED etc. + */ + private String deviceOwnership; + + public DeviceIdentifier getDeviceIdentifier() { + return deviceIdentifier; + } + + public void setDeviceIdentifier(DeviceIdentifier deviceIdentifier) { + this.deviceIdentifier = deviceIdentifier; + } + + public String getDeviceOwner() { + return deviceOwner; + } + + public void setDeviceOwner(String deviceOwner) { + this.deviceOwner = deviceOwner; + } + + public Date getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(Date lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } + + public String getDeviceOwnership() { + return deviceOwnership; + } + + public void setDeviceOwnership(String deviceOwnership) { + this.deviceOwnership = deviceOwnership; + } +} 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 f824a2255b..d125dd4cf7 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 @@ -41,6 +41,7 @@ import org.wso2.carbon.device.mgt.common.EnrolmentInfo; import org.wso2.carbon.device.mgt.common.EnrolmentInfo.Status; import org.wso2.carbon.device.mgt.common.PaginationRequest; import org.wso2.carbon.device.mgt.common.configuration.mgt.DevicePropertyInfo; +import org.wso2.carbon.device.mgt.common.device.details.DeviceData; import org.wso2.carbon.device.mgt.core.dto.DeviceType; import org.wso2.carbon.device.mgt.core.geo.GeoCluster; import org.wso2.carbon.device.mgt.core.geo.geoHash.GeoCoordinate; @@ -137,6 +138,9 @@ public interface DeviceDAO { */ boolean updateDevice(Device device, int tenantId) throws DeviceManagementDAOException; + Device getDevice(DeviceData deviceData, int tenantId) throws DeviceManagementDAOException; + + /** * This method is used to retrieve a device of a given device-identifier and tenant-id. * @@ -444,13 +448,13 @@ public interface DeviceDAO { * This method is used to retrieve current enrollment of a given device and user. * * @param deviceId device id. - * @param currentUser user name. + * @param request {@link PaginationRequest} * @param tenantId tenant id. * @return returns EnrolmentInfo object. - * @throws DeviceManagementDAOException + * @throws DeviceManagementDAOException if SQL error occurred while processing the query. */ - EnrolmentInfo getEnrolment(DeviceIdentifier deviceId, String currentUser, - int tenantId) throws DeviceManagementDAOException; + EnrolmentInfo getEnrolment(DeviceIdentifier deviceId, PaginationRequest request, int tenantId) + throws DeviceManagementDAOException; /** * This method is used to retrieve current active enrollment of a given device and tenant id. 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 6e5ef3a586..de507a7e1b 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 @@ -36,6 +36,7 @@ package org.wso2.carbon.device.mgt.core.dao.impl; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; @@ -43,6 +44,7 @@ import org.wso2.carbon.device.mgt.common.EnrolmentInfo; import org.wso2.carbon.device.mgt.common.EnrolmentInfo.Status; import org.wso2.carbon.device.mgt.common.PaginationRequest; import org.wso2.carbon.device.mgt.common.configuration.mgt.DevicePropertyInfo; +import org.wso2.carbon.device.mgt.common.device.details.DeviceData; import org.wso2.carbon.device.mgt.core.dao.DeviceDAO; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; @@ -63,7 +65,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringJoiner; -import java.util.concurrent.atomic.AtomicInteger; public abstract class AbstractDeviceDAOImpl implements DeviceDAO { @@ -137,6 +138,84 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { } } + @Override + public Device getDevice(DeviceData deviceData, int tenantId) throws DeviceManagementDAOException { + Device device = null; + try { + Connection conn = this.getConnection(); + String sql = "SELECT " + + "d1.ID AS DEVICE_ID, " + + "d1.DESCRIPTION, " + + "d1.NAME AS DEVICE_NAME, " + + "d1.DEVICE_TYPE, " + + "d1.DEVICE_IDENTIFICATION, " + + "e.OWNER, " + + "e.OWNERSHIP, " + + "e.STATUS, " + + "e.DATE_OF_LAST_UPDATE, " + + "e.DATE_OF_ENROLMENT, " + + "e.ID AS ENROLMENT_ID " + + "FROM DM_ENROLMENT e, " + + "(SELECT " + + "d.ID, " + + "d.DESCRIPTION, " + + "d.NAME, " + + "t.NAME AS DEVICE_TYPE, " + + "d.DEVICE_IDENTIFICATION " + + "FROM DM_DEVICE d, DM_DEVICE_TYPE t, DM_DEVICE_DETAIL dt " + + "WHERE " + + "t.NAME = ? AND " + + "t.ID = d.DEVICE_TYPE_ID AND " + + "d.DEVICE_IDENTIFICATION = ? AND " + + "d.TENANT_ID = ? AND " + + "dt.DEVICE_ID = d.ID"; + + if (deviceData.getLastModifiedDate() != null) { + sql += " AND dt.UPDATE_TIMESTAMP > ?"; + } + + sql += ") d1 WHERE d1.ID = e.DEVICE_ID AND "; + + if (!StringUtils.isBlank(deviceData.getDeviceOwner())) { + sql += "e.OWNER = ? AND "; + } + if (!StringUtils.isBlank(deviceData.getDeviceOwnership())) { + sql += "e.OWNERSHIP = ? AND "; + } + + sql += "TENANT_ID = ? ORDER BY e.DATE_OF_LAST_UPDATE DESC"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + int paramIndx = 1; + stmt.setString(paramIndx++, deviceData.getDeviceIdentifier().getType()); + stmt.setString(paramIndx++, deviceData.getDeviceIdentifier().getId()); + stmt.setInt(paramIndx++, tenantId); + if (deviceData.getLastModifiedDate() != null) { + stmt.setLong(paramIndx++, deviceData.getLastModifiedDate().getTime()); + } + if (!StringUtils.isBlank(deviceData.getDeviceOwner())) { + stmt.setString(paramIndx++, deviceData.getDeviceOwner()); + } + if (!StringUtils.isBlank(deviceData.getDeviceOwnership())) { + stmt.setString(paramIndx++, deviceData.getDeviceOwnership()); + } + stmt.setInt(paramIndx, tenantId); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + device = DeviceManagementDAOUtil.loadMatchingDevice(rs, false); + } + } + } + } catch (SQLException e) { + String msg = "Error occurred while getting device data for device identifier " + + deviceData.getDeviceIdentifier().getId() + " and device type " + + deviceData.getDeviceIdentifier().getType(); + log.error(msg, e); + throw new DeviceManagementDAOException(msg, e); + } + return device; + } + @Override public Device getDevice(DeviceIdentifier deviceIdentifier, int tenantId) throws DeviceManagementDAOException { Connection conn; @@ -237,7 +316,7 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { "e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID, d.DESCRIPTION, d.NAME, " + "t.NAME AS DEVICE_TYPE, d.DEVICE_IDENTIFICATION FROM DM_DEVICE d, DM_DEVICE_TYPE t WHERE " + "t.NAME = ? AND t.ID = d.DEVICE_TYPE_ID AND d.DEVICE_IDENTIFICATION = ? AND d.TENANT_ID = ?) d1 WHERE d1.ID = e.DEVICE_ID " + - "AND TENANT_ID = ? AND e.OWNER = ?"; + "AND TENANT_ID = ? AND e.OWNER = ? ORDER BY e.DATE_OF_LAST_UPDATE DESC"; stmt = conn.prepareStatement(sql); stmt.setString(1, deviceIdentifier.getType()); stmt.setString(2, deviceIdentifier.getId()); @@ -506,7 +585,7 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { "e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID, d.DESCRIPTION, d.NAME, " + "t.NAME AS DEVICE_TYPE, d.DEVICE_IDENTIFICATION FROM DM_DEVICE d, DM_DEVICE_TYPE t, DM_DEVICE_DETAIL dt " + "WHERE t.NAME = ? AND t.ID = d.DEVICE_TYPE_ID AND d.DEVICE_IDENTIFICATION = ? AND d.TENANT_ID = ? AND dt.DEVICE_ID = d.ID " + - "AND dt.UPDATE_TIMESTAMP > ?) d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ? AND e.OWNER = ?"; + "AND dt.UPDATE_TIMESTAMP > ?) d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ? AND e.OWNER = ? ORDER BY e.DATE_OF_LAST_UPDATE DESC"; stmt = conn.prepareStatement(sql); stmt.setString(1, deviceIdentifier.getType()); stmt.setString(2, deviceIdentifier.getId()); @@ -1281,36 +1360,54 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { } @Override - public EnrolmentInfo getEnrolment(DeviceIdentifier deviceId, String currentOwner, - int tenantId) throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; + public EnrolmentInfo getEnrolment(DeviceIdentifier deviceId, PaginationRequest request, int tenantId) + throws DeviceManagementDAOException { EnrolmentInfo enrolmentInfo = null; try { - conn = this.getConnection(); - String sql = "SELECT ID AS ENROLMENT_ID, DEVICE_ID, OWNER, OWNERSHIP, STATUS, DATE_OF_ENROLMENT, " + - "DATE_OF_LAST_UPDATE, TENANT_ID FROM DM_ENROLMENT WHERE DEVICE_ID = (SELECT d.ID " + + Connection conn = this.getConnection(); + String sql = "SELECT " + + "ID AS ENROLMENT_ID, " + + "DEVICE_ID, " + + "OWNER, " + + "OWNERSHIP, " + + "STATUS, " + + "DATE_OF_ENROLMENT, " + + "DATE_OF_LAST_UPDATE, " + + "TENANT_ID " + + "FROM DM_ENROLMENT " + + "WHERE " + + "DEVICE_ID = (SELECT d.ID " + "FROM DM_DEVICE d, DM_DEVICE_TYPE t WHERE d.DEVICE_TYPE_ID = t.ID " + - "AND d.DEVICE_IDENTIFICATION = ? AND t.NAME = ? AND d.TENANT_ID = ?) " + - "AND OWNER = ? AND TENANT_ID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setString(1, deviceId.getId()); - stmt.setString(2, deviceId.getType()); - stmt.setInt(3, tenantId); - stmt.setString(4, currentOwner); - stmt.setInt(5, tenantId); - rs = stmt.executeQuery(); - if (rs.next()) { - enrolmentInfo = DeviceManagementDAOUtil.loadMatchingEnrolment(rs); + "AND d.DEVICE_IDENTIFICATION = ? AND t.NAME = ? AND d.TENANT_ID = ?) " + + "AND OWNER = ? "; + + if (!StringUtils.isBlank(request.getOwnership())) { + sql += "AND OWNERSHIP = ? "; + } + sql += "AND TENANT_ID = ?"; + int paramIdx = 1; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(paramIdx++, deviceId.getId()); + stmt.setString(paramIdx++, deviceId.getType()); + stmt.setInt(paramIdx++, tenantId); + stmt.setString(paramIdx++, request.getOwner()); + if (!StringUtils.isBlank(request.getOwnership())) { + stmt.setString(paramIdx++, request.getOwnership()); + } + stmt.setInt(paramIdx, tenantId); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + enrolmentInfo = DeviceManagementDAOUtil.loadMatchingEnrolment(rs); + } + } } - return enrolmentInfo; } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while retrieving the enrolment " + - "information of user '" + currentOwner + "' upon device '" + deviceId + "'", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); + String msg = "Error occurred while retrieving the enrolment " + + "information of user '" + request.getOwner() + "' upon device '" + deviceId + "'"; + log.error(msg, e); + throw new DeviceManagementDAOException(msg, e); } + return enrolmentInfo; } @Override diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java index a6bc22a46d..236d78710a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java @@ -461,7 +461,12 @@ public class OperationManagerImpl implements OperationManager { deviceId.getType() + "' device, which carries the identifier '" + deviceId.getId() + "' of owner '" + owner + "'"); } - EnrolmentInfo enrolmentInfo = this.getEnrolmentInfo(deviceId, owner); + EnrolmentInfo enrolmentInfo = this.getEnrolmentInfo(deviceId, request); + if (enrolmentInfo == null){ + throw new OperationManagementException("Enrollment info not found for given device which has device " + + "Identifier:" + deviceId.getId() + " and device type: " + deviceId.getType() + "Further, device " + + "is own to: " + owner); + } int enrolmentId = enrolmentInfo.getId(); try { OperationManagementDAOFactory.openConnection(); @@ -1075,33 +1080,34 @@ public class OperationManagerImpl implements OperationManager { return isUserAuthorized; } - private EnrolmentInfo getEnrolmentInfo(DeviceIdentifier deviceId, String owner) throws OperationManagementException { + private EnrolmentInfo getEnrolmentInfo(DeviceIdentifier deviceId, PaginationRequest request) + throws OperationManagementException { EnrolmentInfo enrolmentInfo = null; try { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); String user = this.getUser(); DeviceManagementDAOFactory.openConnection(); - if (this.isSameUser(user, owner)) { - enrolmentInfo = deviceDAO.getEnrolment(deviceId, owner, tenantId); + if (this.isSameUser(user, request.getOwner())) { + enrolmentInfo = deviceDAO.getEnrolment(deviceId, request, tenantId); } else { boolean isAdminUser = DeviceManagementDataHolder.getInstance().getDeviceAccessAuthorizationService(). isDeviceAdminUser(); if (isAdminUser) { - enrolmentInfo = deviceDAO.getEnrolment(deviceId, owner, tenantId); + enrolmentInfo = deviceDAO.getEnrolment(deviceId, request, tenantId); } //TODO : Add a check for group admin if this fails } } catch (DeviceManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving enrollment data of '" + deviceId.getType() + "' device carrying the identifier '" + - deviceId.getId() + "' of owner '" + owner + "'", e); + deviceId.getId() + "' of owner '" + request.getOwner() + "'", e); } catch (SQLException e) { throw new OperationManagementException( "Error occurred while opening a connection to the data source", e); } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while checking the device access permissions for '" + deviceId.getType() + "' device carrying the identifier '" + - deviceId.getId() + "' of owner '" + owner + "'", e); + deviceId.getId() + "' of owner '" + request.getOwner() + "'", e); } finally { DeviceManagementDAOFactory.closeConnection(); } 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 8aa8f71626..68080e328c 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 @@ -55,6 +55,7 @@ import org.wso2.carbon.device.mgt.common.configuration.mgt.AmbiguousConfiguratio import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationManagementException; import org.wso2.carbon.device.mgt.common.configuration.mgt.DeviceConfiguration; import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration; +import org.wso2.carbon.device.mgt.common.device.details.DeviceData; import org.wso2.carbon.device.mgt.common.license.mgt.License; import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; @@ -260,6 +261,17 @@ public interface DeviceManagementProviderService { */ Device getDevice(DeviceIdentifier deviceId, Date since, boolean requireDeviceInfo) throws DeviceManagementException; + /*** + * + * @param deviceData Device data, + * @param requireDeviceInfo A boolean indicating whether the device-info (location, app-info etc) is also required + * along with the device data. + * @return {@link Device}, null when device is not available. + * @throws {@link DeviceManagementException} + */ + Device getDevice(DeviceData deviceData, boolean requireDeviceInfo) throws DeviceManagementException; + + /** * Retrieves a list of devices based on a given criteria of properties * 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 b590d18564..d8cd91481a 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 @@ -77,6 +77,7 @@ import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationManageme import org.wso2.carbon.device.mgt.common.configuration.mgt.DeviceConfiguration; import org.wso2.carbon.device.mgt.common.configuration.mgt.DevicePropertyInfo; import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration; +import org.wso2.carbon.device.mgt.common.device.details.DeviceData; 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.enrollment.notification.EnrollmentNotificationConfiguration; @@ -1216,6 +1217,54 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv return device; } + @Override + public Device getDevice(DeviceData deviceData, boolean requireDeviceInfo) + throws DeviceManagementException { + if (deviceData.getDeviceIdentifier() == null) { + String msg = "Received null device identifier for method getDevice"; + log.error(msg); + throw new DeviceManagementException(msg); + } + if (log.isDebugEnabled()) { + log.debug("Get device by device identifier :" + deviceData.getDeviceIdentifier().getId() + " of type '" + + deviceData.getDeviceIdentifier().getType() + "' and requiredDeviceInfo: " + requireDeviceInfo); + } + Device device = null; + int tenantId = this.getTenantId(); + try { + DeviceManagementDAOFactory.openConnection(); + device = deviceDAO.getDevice(deviceData, tenantId); + if (device == null) { + String msg = + "No device is found upon the type '" + deviceData.getDeviceIdentifier().getType() + "' and id '" + + deviceData.getDeviceIdentifier().getId() + "'"; + if (log.isDebugEnabled()) { + log.debug(msg); + } + return null; + } + } catch (DeviceManagementDAOException e) { + String msg = + "Error occurred while obtaining the device for '" + deviceData.getDeviceIdentifier().getId() + "'"; + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while opening a connection to the data source"; + log.error(msg); + throw new DeviceManagementException(msg, e); + } catch (Exception e) { + String msg = "Error occurred in getDevice: " + deviceData.getDeviceIdentifier().getId(); + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } finally { + DeviceManagementDAOFactory.closeConnection(); + } + if (requireDeviceInfo) { + return this.getAllDeviceInfo(device); + } + return device; + } + @Override public List getDevicesBasedOnProperties(Map deviceProps) throws DeviceManagementException { @@ -1695,9 +1744,8 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv @Override public PaginationResult getOperations(DeviceIdentifier deviceId, PaginationRequest request) throws OperationManagementException { - request = DeviceManagerUtil.validateOperationListPageSize(request); return pluginRepository.getOperationManager(deviceId.getType(), this.getTenantId()) - .getOperations(deviceId, request); + .getOperations(deviceId, DeviceManagerUtil.validateOperationListPageSize(request)); } @Override diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementNegativeDBOperationTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementNegativeDBOperationTest.java index b55c77d085..848f7c289e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementNegativeDBOperationTest.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementNegativeDBOperationTest.java @@ -55,6 +55,7 @@ public class OperationManagementNegativeDBOperationTest extends BaseDeviceManage private static final String DEVICE_ID_PREFIX = "NEGDB_OP-TEST-DEVICE-ID-"; private static final int NO_OF_DEVICES = 5; private static final String ADMIN_USER = "admin"; + private static final String OWNSERSHIP = "BYOD"; private List deviceIds = new ArrayList<>(); private OperationManager operationMgtService; @@ -111,6 +112,7 @@ public class OperationManagementNegativeDBOperationTest extends BaseDeviceManage PaginationRequest request = new PaginationRequest(1, 2); request.setDeviceType(DEVICE_TYPE); request.setOwner(ADMIN_USER); + request.setOwnership(OWNSERSHIP); this.dataSource.setThrowException(true); try { this.operationMgtService.getOperations(this.deviceIds.get(0), request); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementNoDBSchemaTests.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementNoDBSchemaTests.java index 92310af40c..af66ec593f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementNoDBSchemaTests.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementNoDBSchemaTests.java @@ -57,6 +57,7 @@ public class OperationManagementNoDBSchemaTests extends BaseDeviceManagementTest private static final String COMMAND_OPERATON_CODE = "COMMAND-TEST"; private static final int NO_OF_DEVICES = 5; private static final String ADMIN_USER = "admin"; + private static final String OWNERSHIP = "BYOD"; private List deviceIds = new ArrayList<>(); private OperationManager operationMgtService; @@ -124,6 +125,7 @@ public class OperationManagementNoDBSchemaTests extends BaseDeviceManagementTest PaginationRequest request = new PaginationRequest(1, 2); request.setDeviceType(DEVICE_TYPE); request.setOwner(ADMIN_USER); + request.setOwnership(OWNERSHIP); for (DeviceIdentifier deviceIdentifier : deviceIds) { this.operationMgtService.getOperations(deviceIdentifier, request); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementTests.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementTests.java index b1734948d4..3663a9ce50 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementTests.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementTests.java @@ -75,6 +75,7 @@ public class OperationManagementTests extends BaseDeviceManagementTest { private static final String ADMIN_USER = "admin"; private static final String NON_ADMIN_USER = "test"; private static final String INVALID_DEVICE = "ThisIsInvalid"; + private static final String OWNERSHIP = "BYOD"; private List deviceIds = new ArrayList<>(); private OperationManager operationMgtService; @@ -286,6 +287,7 @@ public class OperationManagementTests extends BaseDeviceManagementTest { PaginationRequest request = new PaginationRequest(1, 2); request.setDeviceType(DEVICE_TYPE); request.setOwner(ADMIN_USER); + request.setOwnership(OWNERSHIP); for (DeviceIdentifier deviceIdentifier : deviceIds) { PaginationResult result = this.operationMgtService.getOperations(deviceIdentifier, request); Assert.assertEquals(result.getRecordsFiltered(), 4); @@ -302,6 +304,7 @@ public class OperationManagementTests extends BaseDeviceManagementTest { PaginationRequest request = new PaginationRequest(1, 2); request.setDeviceType(DEVICE_TYPE); request.setOwner(ADMIN_USER); + request.setOwnership(OWNERSHIP); for (DeviceIdentifier deviceIdentifier : deviceIds) { try { this.operationMgtService.getOperations(deviceIdentifier, request); @@ -540,6 +543,7 @@ public class OperationManagementTests extends BaseDeviceManagementTest { PaginationRequest request = new PaginationRequest(1, 2); request.setDeviceType(DEVICE_TYPE); request.setOwner(ADMIN_USER); + request.setOwnership(OWNERSHIP); PaginationResult result = this.operationMgtService.getOperations (new DeviceIdentifier(INVALID_DEVICE, DEVICE_TYPE), request); Assert.assertEquals(result.getRecordsFiltered(), 4); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/operation-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/operation-api.jag index c581aad791..9fa2a37353 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/operation-api.jag +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/operation-api.jag @@ -29,12 +29,14 @@ if (uriMatcher.match("/{context}/api/operation/paginate")) { var deviceType = request.getParameter("deviceType"); var deviceId = request.getParameter("deviceId"); var owner = request.getParameter("owner"); + var ownership = request.getParameter("ownership"); var index = request.getParameter("start"); var length = request.getParameter("length"); var search = request.getParameter("search[value]"); var restAPIEndpoint = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + - "/devices/" + deviceType + "/" + deviceId + "/operations?owner=" + owner + "&offset=" + index + "&limit=" + length; + "/devices/" + deviceType + "/" + deviceId + "/operations?owner=" + owner + "&ownership=" + ownership + + "&offset=" + index + "&limit=" + length; serviceInvokers.XMLHttp.get( restAPIEndpoint, diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/device.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/device.js index c39e797bc2..b561c8a23e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/device.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/business-controllers/device.js @@ -63,7 +63,7 @@ deviceModule = function () { /* @Updated */ - publicMethods.viewDevice = function (deviceType, deviceId, owner) { + publicMethods.viewDevice = function (deviceType, deviceId, owner, ownership) { var carbonUser = session.get(constants["USER_SESSION_KEY"]); if (!carbonUser) { log.error("User object was not found in the session"); @@ -114,7 +114,12 @@ deviceModule = function () { utility.startTenantFlow(carbonUser); var url = devicemgtProps["httpsURL"] + "/api/device-mgt/v1.0/devices/" + deviceType + "/" + deviceId; if (owner) { - url = url + "?owner=" + owner; + url = url + "?owner=" + owner; + if (ownership){ + url = url + "&ownership=" + ownership; + } + } else if (ownership){ + url = url + "?ownership=" + ownership; } return serviceInvokers.XMLHttp.get( url, diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/public/js/listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/public/js/listing.js index 2448a89f8f..10c1542695 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/public/js/listing.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/public/js/listing.js @@ -342,7 +342,8 @@ function loadDevices(searchType, searchParam) { data: 'ownership', class: 'remove-padding-top viewEnabledIcon', render: function (status, type, row, meta) { - if (getDeviceTypeCategory(row.deviceType) == 'mobile') { + if (getDeviceTypeCategory(row.deviceType) === 'mobile' + || getDeviceTypeCategory(row.deviceType) === 'hybrid') { return row.ownership; } else { return null; @@ -422,17 +423,6 @@ function loadDevices(searchType, searchParam) { ]; var fnCreatedRow = function (row, data, dataIndex) { - - if(data.status != "REMOVED"){ - $(row).attr('data-type', 'selectable'); - }else{ - $(row).attr('data-type', 'non-selectable'); - } - - $(row).attr('data-deviceid', htmlspecialchars(data.deviceIdentifier)); - $(row).attr('data-devicetype', htmlspecialchars(data.deviceType)); - $(row).attr('data-url', context + '/device/' + htmlspecialchars(data.deviceType) + '?id=' - + htmlspecialchars(data.deviceIdentifier) + '&owner=' + htmlspecialchars(data.userPattern)) ; var model = htmlspecialchars(getPropertyValue(data.properties, 'DEVICE_MODEL')); var vendor = htmlspecialchars(getPropertyValue(data.properties, 'VENDOR')); var owner = htmlspecialchars(data.userPattern); @@ -440,6 +430,10 @@ function loadDevices(searchType, searchParam) { var ownership = htmlspecialchars(data.ownership); var deviceType = htmlspecialchars(data.deviceType); var category = getDeviceTypeCategory(deviceType); + $(row).attr('data-deviceid', htmlspecialchars(data.deviceIdentifier)); + $(row).attr('data-devicetype', deviceType); + $(row).attr('data-url', context + '/device/' + htmlspecialchars(data.deviceType) + '?id=' + + htmlspecialchars(data.deviceIdentifier) + '&owner=' + owner + '&ownership=' + ownership) ; $.each($('td', row), function (colIndex) { switch (colIndex) { case 1: @@ -462,7 +456,7 @@ function loadDevices(searchType, searchParam) { $(this).attr('data-display', getDeviceTypeLabel(deviceType)); break; case 5: - if (category == 'mobile') { + if (category === 'mobile' || category === 'hybrid') { $(this).attr('data-grid-label', "Ownership"); $(this).attr('data-search', ownership); $(this).attr('data-display', ownership); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.default.device.type.device-view/device-view.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.default.device.type.device-view/device-view.js index a431c66a71..62308cade4 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.default.device.type.device-view/device-view.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.default.device.type.device-view/device-view.js @@ -24,6 +24,7 @@ function onRequest(context) { var deviceType = context.uriParams.deviceType; var deviceId = request.getParameter("id"); var owner = request.getParameter("owner"); + var ownership = request.getParameter("ownership"); var attributes = []; var featureList = []; var user = userModule.getCarbonUser(); @@ -130,10 +131,10 @@ function onRequest(context) { displayData.tenantDomain = tenantDomain; - if (deviceType != null && deviceType != undefined && deviceId != null && deviceId != undefined) { + if (deviceType && deviceId) { var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; - var device = deviceModule.viewDevice(deviceType, deviceId, owner); - if (device && device.status != "error") { + var device = deviceModule.viewDevice(deviceType, deviceId, owner, ownership); + if (device && device.status !== "error") { displayData.device = device.content; displayData.autoCompleteParams = autoCompleteParams; displayData.encodedFeaturePayloads = ""; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.view/public/js/device-view.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.view/public/js/device-view.js index 7cce058c69..4564ef9512 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.view/public/js/device-view.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.view/public/js/device-view.js @@ -20,6 +20,7 @@ var deviceId = $(".device-id"); var deviceIdentifier = deviceId.data("deviceid"); var deviceType = deviceId.data("type"); var deviceOwner = deviceId.data("owner"); +var deviceOwnership = deviceId.data("ownership"); $(document).ready(function() { $(".panel-body").removeClass("hidden"); @@ -86,7 +87,8 @@ function loadOperationsLog(update) { data: { deviceId: deviceIdentifier, deviceType: deviceType, - owner: deviceOwner + owner: deviceOwner, + ownership: deviceOwnership }, dataSrc: function(json) { $("#operations-spinner").addClass("hidden"); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.view/view.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.view/view.js index af0baeaeac..2f9cc89126 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.view/view.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.view/view.js @@ -21,10 +21,11 @@ function onRequest(context) { var deviceType = context["uriParams"]["deviceType"]; var deviceId = request.getParameter("id"); var owner = request.getParameter("owner"); + var ownership = request.getParameter("ownership"); var deviceViewData = {}; if (deviceType && deviceId) { var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; - var response = deviceModule.viewDevice(deviceType, deviceId, owner); + var response = deviceModule.viewDevice(deviceType, deviceId, owner, ownership); if (response["status"] == "success") { deviceViewData["deviceFound"] = true; deviceViewData["isAuthorized"] = true;