mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
Merge branch 'fix-advance-search' into 'master'
Fix issue with advanced search to pick the correct enrollment Closes product-iots#14 and product-iots#13 See merge request entgra/carbon-device-mgt!36
This commit is contained in:
commit
b902763eac
@ -25,4 +25,7 @@ public class Constants {
|
|||||||
public static final String PROP_AND = "PROP_AND";
|
public static final String PROP_AND = "PROP_AND";
|
||||||
public static final String PROP_OR = "PROP_OR";
|
public static final String PROP_OR = "PROP_OR";
|
||||||
public static final String LOCATION = "LOCATION";
|
public static final String LOCATION = "LOCATION";
|
||||||
|
|
||||||
|
public static final String ANY_DEVICE_PERMISSION = "/device-mgt/devices/any-device";
|
||||||
|
public static final String UI_EXECUTE = "ui.execute";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,8 +25,6 @@ import org.wso2.carbon.device.mgt.common.Device;
|
|||||||
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
|
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
|
||||||
import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
|
import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
|
||||||
import org.wso2.carbon.device.mgt.common.EnrolmentInfo;
|
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.DeviceInfo;
|
||||||
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation;
|
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.common.search.SearchContext;
|
||||||
@ -34,11 +32,21 @@ 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.DeviceManagementDAOException;
|
||||||
import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory;
|
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.dao.util.DeviceManagementDAOUtil;
|
||||||
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
|
import org.wso2.carbon.device.mgt.core.search.mgt.Constants;
|
||||||
import org.wso2.carbon.device.mgt.core.search.mgt.*;
|
import org.wso2.carbon.device.mgt.core.search.mgt.InvalidOperatorException;
|
||||||
|
import org.wso2.carbon.device.mgt.core.search.mgt.Processor;
|
||||||
|
import org.wso2.carbon.device.mgt.core.search.mgt.QueryBuilder;
|
||||||
|
import org.wso2.carbon.device.mgt.core.search.mgt.QueryHolder;
|
||||||
|
import org.wso2.carbon.device.mgt.core.search.mgt.ResultSetAggregator;
|
||||||
|
import org.wso2.carbon.device.mgt.core.search.mgt.SearchMgtException;
|
||||||
|
import org.wso2.carbon.device.mgt.core.search.mgt.ValueType;
|
||||||
import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAOException;
|
import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAOException;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.Array;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -47,17 +55,9 @@ import java.util.Map;
|
|||||||
public class ProcessorImpl implements Processor {
|
public class ProcessorImpl implements Processor {
|
||||||
private ApplicationDAO applicationDAO;
|
private ApplicationDAO applicationDAO;
|
||||||
private static final Log log = LogFactory.getLog(ProcessorImpl.class);
|
private static final Log log = LogFactory.getLog(ProcessorImpl.class);
|
||||||
private DeviceAccessAuthorizationService deviceAccessAuthorizationService;
|
|
||||||
|
|
||||||
public ProcessorImpl() {
|
public ProcessorImpl() {
|
||||||
applicationDAO = DeviceManagementDAOFactory.getApplicationDAO();
|
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
|
@Override
|
||||||
@ -115,35 +115,10 @@ public class ProcessorImpl implements Processor {
|
|||||||
devices.put(Constants.LOCATION, locationDevices);
|
devices.put(Constants.LOCATION, locationDevices);
|
||||||
|
|
||||||
List<Device> finalDevices = aggregator.aggregate(devices);
|
List<Device> finalDevices = aggregator.aggregate(devices);
|
||||||
finalDevices = authorizedDevices(finalDevices);
|
|
||||||
this.setApplicationListOfDevices(finalDevices);
|
this.setApplicationListOfDevices(finalDevices);
|
||||||
return 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<Device> authorizedDevices(List<Device> devices) throws SearchMgtException {
|
|
||||||
List<Device> 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
|
@Override
|
||||||
public List<Device> getUpdatedDevices(long epochTime) throws SearchMgtException {
|
public List<Device> getUpdatedDevices(long epochTime) throws SearchMgtException {
|
||||||
|
|
||||||
@ -256,7 +231,6 @@ public class ProcessorImpl implements Processor {
|
|||||||
PreparedStatement stmt = null;
|
PreparedStatement stmt = null;
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
List<Device> devices = new ArrayList<>();
|
List<Device> devices = new ArrayList<>();
|
||||||
Map<Integer, Integer> devs = new HashMap<>();
|
|
||||||
try {
|
try {
|
||||||
conn = this.getConnection();
|
conn = this.getConnection();
|
||||||
stmt = conn.prepareStatement(queryHolder.getQuery());
|
stmt = conn.prepareStatement(queryHolder.getQuery());
|
||||||
@ -281,59 +255,57 @@ public class ProcessorImpl implements Processor {
|
|||||||
|
|
||||||
rs = stmt.executeQuery();
|
rs = stmt.executeQuery();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
if (!devs.containsKey(rs.getInt("ID"))) {
|
Device device = new Device();
|
||||||
Device device = new Device();
|
device.setId(rs.getInt("ID"));
|
||||||
device.setId(rs.getInt("ID"));
|
device.setDescription(rs.getString("DESCRIPTION"));
|
||||||
device.setDescription(rs.getString("DESCRIPTION"));
|
device.setName(rs.getString("NAME"));
|
||||||
device.setName(rs.getString("NAME"));
|
device.setType(rs.getString("DEVICE_TYPE_NAME"));
|
||||||
device.setType(rs.getString("DEVICE_TYPE_NAME"));
|
device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION"));
|
||||||
device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION"));
|
|
||||||
|
|
||||||
EnrolmentInfo enrolmentInfo = new EnrolmentInfo();
|
EnrolmentInfo enrolmentInfo = new EnrolmentInfo();
|
||||||
enrolmentInfo.setStatus(EnrolmentInfo.Status.valueOf(rs.getString("DE_STATUS")));
|
enrolmentInfo.setId(rs.getInt("ENROLLMENT_ID"));
|
||||||
enrolmentInfo.setOwner(rs.getString("OWNER"));
|
enrolmentInfo.setStatus(EnrolmentInfo.Status.valueOf(rs.getString("DE_STATUS")));
|
||||||
enrolmentInfo.setOwnership(EnrolmentInfo.OwnerShip.valueOf(rs.getString("OWNERSHIP")));
|
enrolmentInfo.setOwner(rs.getString("OWNER"));
|
||||||
device.setEnrolmentInfo(enrolmentInfo);
|
enrolmentInfo.setOwnership(EnrolmentInfo.OwnerShip.valueOf(rs.getString("OWNERSHIP")));
|
||||||
|
device.setEnrolmentInfo(enrolmentInfo);
|
||||||
|
|
||||||
DeviceIdentifier identifier = new DeviceIdentifier();
|
DeviceIdentifier identifier = new DeviceIdentifier();
|
||||||
identifier.setType(rs.getString("DEVICE_TYPE_NAME"));
|
identifier.setType(rs.getString("DEVICE_TYPE_NAME"));
|
||||||
identifier.setId(rs.getString("DEVICE_IDENTIFICATION"));
|
identifier.setId(rs.getString("DEVICE_IDENTIFICATION"));
|
||||||
|
|
||||||
DeviceInfo deviceInfo = new DeviceInfo();
|
DeviceInfo deviceInfo = new DeviceInfo();
|
||||||
deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY"));
|
deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY"));
|
||||||
deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL"));
|
deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL"));
|
||||||
deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE"));
|
deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE"));
|
||||||
deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE"));
|
deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE"));
|
||||||
deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL"));
|
deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL"));
|
||||||
deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY"));
|
deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY"));
|
||||||
deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
|
deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
|
||||||
deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY"));
|
deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY"));
|
||||||
deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
|
deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
|
||||||
deviceInfo.setOsVersion(rs.getString("OS_VERSION"));
|
deviceInfo.setOsVersion(rs.getString("OS_VERSION"));
|
||||||
deviceInfo.setOsBuildDate(rs.getString("OS_BUILD_DATE"));
|
deviceInfo.setOsBuildDate(rs.getString("OS_BUILD_DATE"));
|
||||||
deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN"));
|
deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN"));
|
||||||
deviceInfo.setSsid(rs.getString("SSID"));
|
deviceInfo.setSsid(rs.getString("SSID"));
|
||||||
deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY"));
|
deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY"));
|
||||||
deviceInfo.setVendor(rs.getString("VENDOR"));
|
deviceInfo.setVendor(rs.getString("VENDOR"));
|
||||||
deviceInfo.setUpdatedTime(new java.util.Date(rs.getLong("UPDATE_TIMESTAMP")));
|
deviceInfo.setUpdatedTime(new java.util.Date(rs.getLong("UPDATE_TIMESTAMP")));
|
||||||
|
|
||||||
DeviceLocation deviceLocation = new DeviceLocation();
|
DeviceLocation deviceLocation = new DeviceLocation();
|
||||||
deviceLocation.setLatitude(rs.getDouble("LATITUDE"));
|
deviceLocation.setLatitude(rs.getDouble("LATITUDE"));
|
||||||
deviceLocation.setLongitude(rs.getDouble("LONGITUDE"));
|
deviceLocation.setLongitude(rs.getDouble("LONGITUDE"));
|
||||||
deviceLocation.setStreet1(rs.getString("STREET1"));
|
deviceLocation.setStreet1(rs.getString("STREET1"));
|
||||||
deviceLocation.setStreet2(rs.getString("STREET2"));
|
deviceLocation.setStreet2(rs.getString("STREET2"));
|
||||||
deviceLocation.setCity(rs.getString("CITY"));
|
deviceLocation.setCity(rs.getString("CITY"));
|
||||||
deviceLocation.setState(rs.getString("STATE"));
|
deviceLocation.setState(rs.getString("STATE"));
|
||||||
deviceLocation.setZip(rs.getString("ZIP"));
|
deviceLocation.setZip(rs.getString("ZIP"));
|
||||||
deviceLocation.setCountry(rs.getString("COUNTRY"));
|
deviceLocation.setCountry(rs.getString("COUNTRY"));
|
||||||
deviceLocation.setDeviceId(rs.getInt("ID"));
|
deviceLocation.setDeviceId(rs.getInt("ID"));
|
||||||
deviceLocation.setUpdatedTime(new java.util.Date(rs.getLong("DL_UPDATED_TIMESTAMP")));
|
deviceLocation.setUpdatedTime(new java.util.Date(rs.getLong("DL_UPDATED_TIMESTAMP")));
|
||||||
|
|
||||||
deviceInfo.setLocation(deviceLocation);
|
deviceInfo.setLocation(deviceLocation);
|
||||||
device.setDeviceInfo(deviceInfo);
|
device.setDeviceInfo(deviceInfo);
|
||||||
devices.add(device);
|
devices.add(device);
|
||||||
devs.put(device.getId(), device.getId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
throw new SearchDAOException("Error occurred while aquiring the device details.", e);
|
throw new SearchDAOException("Error occurred while aquiring the device details.", e);
|
||||||
|
|||||||
@ -331,7 +331,7 @@ public class QueryBuilderImpl implements QueryBuilder {
|
|||||||
"DD.EXTERNAL_TOTAL_MEMORY, DD.EXTERNAL_AVAILABLE_MEMORY, DD.CONNECTION_TYPE, \n" +
|
"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.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" +
|
"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, DE.OWNER, DE.OWNERSHIP, DE.STATUS " +
|
"DL.STATE, DL.COUNTRY, DL.UPDATE_TIMESTAMP AS DL_UPDATED_TIMESTAMP, DE.ID AS ENROLLMENT_ID, DE.OWNER, DE.OWNERSHIP, DE.STATUS " +
|
||||||
"AS DE_STATUS FROM DM_DEVICE_DETAIL DD INNER JOIN DM_DEVICE D ON D.ID=DD.DEVICE_ID\n" +
|
"AS DE_STATUS FROM DM_DEVICE_DETAIL DD INNER JOIN DM_DEVICE D ON D.ID=DD.DEVICE_ID\n" +
|
||||||
"LEFT JOIN DM_DEVICE_LOCATION DL ON DL.DEVICE_ID=D.ID \n" +
|
"LEFT JOIN DM_DEVICE_LOCATION DL ON DL.DEVICE_ID=D.ID \n" +
|
||||||
"INNER JOIN DM_DEVICE_TYPE DT ON DT.ID=D.DEVICE_TYPE_ID\n" +
|
"INNER JOIN DM_DEVICE_TYPE DT ON DT.ID=D.DEVICE_TYPE_ID\n" +
|
||||||
@ -359,7 +359,7 @@ public class QueryBuilderImpl implements QueryBuilder {
|
|||||||
"DD.SSID, DD.CPU_USAGE, DD.TOTAL_RAM_MEMORY, DD.AVAILABLE_RAM_MEMORY, \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" +
|
"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 " +
|
"DE.ID ENROLLMENT_ID, DE.OWNER, DE.OWNERSHIP, DE.STATUS AS DE_STATUS " +
|
||||||
"FROM DM_DEVICE_DETAIL DD INNER JOIN DM_DEVICE D ON D.ID=DD.DEVICE_ID\n" +
|
"FROM DM_DEVICE_DETAIL DD INNER JOIN DM_DEVICE D ON D.ID=DD.DEVICE_ID\n" +
|
||||||
"LEFT JOIN DM_DEVICE_LOCATION DL ON DL.DEVICE_ID=D.ID \n" +
|
"LEFT JOIN DM_DEVICE_LOCATION DL ON DL.DEVICE_ID=D.ID \n" +
|
||||||
"INNER JOIN DM_DEVICE_TYPE DT ON DT.ID=D.DEVICE_TYPE_ID\n" +
|
"INNER JOIN DM_DEVICE_TYPE DT ON DT.ID=D.DEVICE_TYPE_ID\n" +
|
||||||
|
|||||||
@ -19,9 +19,16 @@
|
|||||||
|
|
||||||
package org.wso2.carbon.device.mgt.core.search.mgt.impl;
|
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.context.PrivilegedCarbonContext;
|
||||||
import org.wso2.carbon.device.mgt.common.Device;
|
import org.wso2.carbon.device.mgt.common.Device;
|
||||||
|
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
|
||||||
|
import org.wso2.carbon.device.mgt.core.permission.mgt.PermissionUtils;
|
||||||
import org.wso2.carbon.device.mgt.core.search.mgt.Constants;
|
import org.wso2.carbon.device.mgt.core.search.mgt.Constants;
|
||||||
import org.wso2.carbon.device.mgt.core.search.mgt.ResultSetAggregator;
|
import org.wso2.carbon.device.mgt.core.search.mgt.ResultSetAggregator;
|
||||||
|
import org.wso2.carbon.user.api.UserRealm;
|
||||||
|
import org.wso2.carbon.user.api.UserStoreException;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -29,16 +36,17 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class ResultSetAggregatorImpl implements ResultSetAggregator {
|
public class ResultSetAggregatorImpl implements ResultSetAggregator {
|
||||||
|
private static Log log = LogFactory.getLog(ResultSetAggregatorImpl.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Device> aggregate(Map<String, List<Device>> devices) {
|
public List<Device> aggregate(Map<String, List<Device>> devices) {
|
||||||
|
|
||||||
Map<Integer, Device> generalQueryMap = this.convertToMap(devices.get(Constants.GENERAL));
|
Map<Integer, Device> generalQueryMap = this.convertToMap(devices.get(Constants.GENERAL));
|
||||||
Map<Integer, Device> andMap = this.convertToMap(devices.get(Constants.PROP_AND));
|
Map<Integer, Device> andMap = this.convertToMap(devices.get(Constants.PROP_AND));
|
||||||
Map<Integer, Device> orMap = this.convertToMap(devices.get(Constants.PROP_OR));
|
Map<Integer, Device> orMap = this.convertToMap(devices.get(Constants.PROP_OR));
|
||||||
Map<Integer, Device> locationMap = this.convertToMap(devices.get(Constants.LOCATION));
|
Map<Integer, Device> locationMap = this.convertToMap(devices.get(Constants.LOCATION));
|
||||||
Map<Integer, Device> finalMap = new HashMap<>();
|
Map<Integer, Device> finalMap = new HashMap<>();
|
||||||
List<Device> finalResult = new ArrayList<>();
|
List<Device> finalResult = new ArrayList<>();
|
||||||
|
List<Device> ownDevices = new ArrayList<>();
|
||||||
|
|
||||||
if (andMap.isEmpty()) {
|
if (andMap.isEmpty()) {
|
||||||
finalMap = generalQueryMap;
|
finalMap = generalQueryMap;
|
||||||
@ -70,7 +78,23 @@ public class ResultSetAggregatorImpl implements ResultSetAggregator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return finalResult;
|
String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (isPermittedToViewAnyDevice(username)) {
|
||||||
|
return finalResult;
|
||||||
|
}
|
||||||
|
} catch (UserStoreException e) {
|
||||||
|
log.error("Unable to check permissions of the user: " + username, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Device device: finalResult) {
|
||||||
|
if (username.equals(device.getEnrolmentInfo().getOwner())) {
|
||||||
|
ownDevices.add(device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ownDevices;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<Integer, Device> convertToMap(List<Device> devices) {
|
private Map<Integer, Device> convertToMap(List<Device> devices) {
|
||||||
@ -79,7 +103,7 @@ public class ResultSetAggregatorImpl implements ResultSetAggregator {
|
|||||||
}
|
}
|
||||||
Map<Integer, Device> deviceWrapperMap = new HashMap<>();
|
Map<Integer, Device> deviceWrapperMap = new HashMap<>();
|
||||||
for (Device device : devices) {
|
for (Device device : devices) {
|
||||||
deviceWrapperMap.put(device.getId(), device);
|
deviceWrapperMap.put(device.getEnrolmentInfo().getId(), device);
|
||||||
}
|
}
|
||||||
return deviceWrapperMap;
|
return deviceWrapperMap;
|
||||||
}
|
}
|
||||||
@ -92,4 +116,20 @@ public class ResultSetAggregatorImpl implements ResultSetAggregator {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the user has permissions to view all devices.
|
||||||
|
*
|
||||||
|
* @param username username
|
||||||
|
* @return {@code true} if user is permitted
|
||||||
|
* @throws UserStoreException If unable to check user permissions
|
||||||
|
*/
|
||||||
|
private boolean isPermittedToViewAnyDevice(String username) throws UserStoreException {
|
||||||
|
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||||
|
UserRealm userRealm = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId);
|
||||||
|
return userRealm != null && userRealm.getAuthorizationManager() != null &&
|
||||||
|
userRealm.getAuthorizationManager().isUserAuthorized(username,
|
||||||
|
PermissionUtils.getAbsolutePermissionPath(Constants.ANY_DEVICE_PERMISSION),
|
||||||
|
Constants.UI_EXECUTE);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,14 +17,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.core.search;
|
package org.wso2.carbon.device.mgt.core.search;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.testng.Assert;
|
import org.testng.Assert;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
import org.wso2.carbon.device.mgt.common.Device;
|
import org.wso2.carbon.device.mgt.common.Device;
|
||||||
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
|
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
|
||||||
import org.wso2.carbon.device.mgt.common.authorization.DeviceAccessAuthorizationService;
|
|
||||||
import org.wso2.carbon.device.mgt.common.search.Condition;
|
import org.wso2.carbon.device.mgt.common.search.Condition;
|
||||||
import org.wso2.carbon.device.mgt.common.search.SearchContext;
|
import org.wso2.carbon.device.mgt.common.search.SearchContext;
|
||||||
import org.wso2.carbon.device.mgt.core.TestDeviceManagementService;
|
import org.wso2.carbon.device.mgt.core.TestDeviceManagementService;
|
||||||
@ -41,7 +38,6 @@ import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
|
|||||||
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl;
|
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl;
|
||||||
import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
|
import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -50,16 +46,12 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class ProcessorImplTest extends BaseDeviceManagementTest {
|
public class ProcessorImplTest extends BaseDeviceManagementTest {
|
||||||
|
|
||||||
private DeviceAccessAuthorizationService deviceAccessAuthorizationService;
|
|
||||||
private static final Log log = LogFactory.getLog(SearchManagementServiceTest.class);
|
|
||||||
private static List<DeviceIdentifier> deviceIdentifiers = new ArrayList<>();
|
private static List<DeviceIdentifier> deviceIdentifiers = new ArrayList<>();
|
||||||
private static final String DEVICE_ID_PREFIX = "SEARCH-DEVICE-ID-";
|
private static final String DEVICE_ID_PREFIX = "SEARCH-DEVICE-ID-";
|
||||||
private static final String DEVICE_TYPE = "SEARCH_TYPE";
|
private static final String DEVICE_TYPE = "SEARCH_TYPE";
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public void init() throws Exception {
|
public void init() throws Exception {
|
||||||
deviceAccessAuthorizationService = DeviceManagementDataHolder.getInstance()
|
|
||||||
.getDeviceAccessAuthorizationService();
|
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
deviceIdentifiers.add(new DeviceIdentifier(DEVICE_ID_PREFIX + i, DEVICE_TYPE));
|
deviceIdentifiers.add(new DeviceIdentifier(DEVICE_ID_PREFIX + i, DEVICE_TYPE));
|
||||||
}
|
}
|
||||||
@ -81,27 +73,59 @@ public class ProcessorImplTest extends BaseDeviceManagementTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(description = "Test the Search Processor")
|
@Test (description = "Search for device with and condition")
|
||||||
public void testWithNoDeviceAccessAuthorization() throws NoSuchFieldException, IllegalAccessException,
|
public void testSearchDevicesWIthAndCondition() throws SearchMgtException {
|
||||||
SearchMgtException {
|
|
||||||
SearchContext context = new SearchContext();
|
SearchContext context = new SearchContext();
|
||||||
List<Condition> conditions = new ArrayList<>();
|
List<Condition> conditions = new ArrayList<>();
|
||||||
Condition cond = new Condition();
|
|
||||||
cond.setKey("batteryLevel");
|
Condition condition = new Condition();
|
||||||
cond.setOperator("=");
|
condition.setKey("IMEI");
|
||||||
cond.setValue("40");
|
condition.setOperator("=");
|
||||||
cond.setState(Condition.State.AND);
|
condition.setValue("e6f236ac82537a8e");
|
||||||
conditions.add(cond);
|
condition.setState(Condition.State.AND);
|
||||||
|
conditions.add(condition);
|
||||||
|
|
||||||
context.setConditions(conditions);
|
context.setConditions(conditions);
|
||||||
ProcessorImpl processor = new ProcessorImpl();
|
ProcessorImpl processor = new ProcessorImpl();
|
||||||
Field deviceAccessAuthorizationServiceField = ProcessorImpl.class.getDeclaredField
|
List<Device> devices = processor.execute(context);
|
||||||
("deviceAccessAuthorizationService");
|
Assert.assertEquals(5, devices.size(), "There should be exactly 5 devices with matching search criteria");
|
||||||
deviceAccessAuthorizationServiceField.setAccessible(true);
|
|
||||||
deviceAccessAuthorizationServiceField.set(processor, null);
|
|
||||||
List<Device> searchedDevices = processor.execute(context);
|
|
||||||
Assert.assertEquals(0, searchedDevices.size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test (description = "Search for device with or condition")
|
||||||
|
public void testSearchDevicesWIthORCondition() throws SearchMgtException {
|
||||||
|
SearchContext context = new SearchContext();
|
||||||
|
List<Condition> conditions = new ArrayList<>();
|
||||||
|
|
||||||
|
Condition condition = new Condition();
|
||||||
|
condition.setKey("IMSI");
|
||||||
|
condition.setOperator("=");
|
||||||
|
condition.setValue("432659632123654845");
|
||||||
|
condition.setState(Condition.State.OR);
|
||||||
|
conditions.add(condition);
|
||||||
|
|
||||||
|
context.setConditions(conditions);
|
||||||
|
ProcessorImpl processor = new ProcessorImpl();
|
||||||
|
List<Device> devices = processor.execute(context);
|
||||||
|
Assert.assertEquals(5, devices.size(), "There should be exactly 5 devices with matching search criteria");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test (description = "Search for device with wrong condition")
|
||||||
|
public void testSearchDevicesWIthWrongCondition() throws SearchMgtException {
|
||||||
|
SearchContext context = new SearchContext();
|
||||||
|
List<Condition> conditions = new ArrayList<>();
|
||||||
|
|
||||||
|
Condition condition = new Condition();
|
||||||
|
condition.setKey("IMSI");
|
||||||
|
condition.setOperator("=");
|
||||||
|
condition.setValue("43265963212378466");
|
||||||
|
condition.setState(Condition.State.OR);
|
||||||
|
conditions.add(condition);
|
||||||
|
|
||||||
|
context.setConditions(conditions);
|
||||||
|
ProcessorImpl processor = new ProcessorImpl();
|
||||||
|
List<Device> devices = processor.execute(context);
|
||||||
|
Assert.assertEquals(0, devices.size(), "There should be no devices with matching search criteria");
|
||||||
|
}
|
||||||
|
|
||||||
@Test(description = "Test for invalid state")
|
@Test(description = "Test for invalid state")
|
||||||
public void testInvalidState() throws SearchMgtException {
|
public void testInvalidState() throws SearchMgtException {
|
||||||
@ -141,16 +165,4 @@ public class ProcessorImplTest extends BaseDeviceManagementTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(description = "Test when Device Access Authorization is null", expectedExceptions = {IllegalStateException
|
|
||||||
.class}, dependsOnMethods = {"testWithNoDeviceAccessAuthorization", "testInvalidState"})
|
|
||||||
public void testProcessorInitializationError() throws ClassNotFoundException, NoSuchMethodException,
|
|
||||||
NoSuchFieldException, IllegalAccessException, SearchMgtException {
|
|
||||||
DeviceManagementDataHolder deviceManagementDataHolder = DeviceManagementDataHolder.getInstance();
|
|
||||||
Field field = DeviceManagementDataHolder.class.getDeclaredField("deviceAccessAuthorizationService");
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(deviceManagementDataHolder, null);
|
|
||||||
ProcessorImpl processor = new ProcessorImpl();
|
|
||||||
processor.execute(null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user