feature/traccar-sync
shamalka 2 years ago
commit b311908d47

@ -1737,12 +1737,24 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "AP_APP.NAME = ? AND " + "AP_APP.NAME = ? AND "
+ "AP_APP.DEVICE_TYPE_ID = ? AND " + "AP_APP.DEVICE_TYPE_ID = ? AND "
+ "AP_APP.TENANT_ID = ?"; + "AP_APP.TENANT_ID = ?";
if(deviceTypeId != -1){
sql = "SELECT AP_APP.ID AS ID "
+ "FROM AP_APP "
+ "WHERE "
+ "AP_APP.NAME = ? AND "
+ "AP_APP.TENANT_ID = ?";
}
try { try {
Connection conn = this.getDBConnection(); Connection conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)){ try (PreparedStatement stmt = conn.prepareStatement(sql)){
if(deviceTypeId != -1){
stmt.setString(1, appName);
stmt.setInt(2, tenantId);
} else {
stmt.setString(1, appName); stmt.setString(1, appName);
stmt.setInt(2, deviceTypeId); stmt.setInt(2, deviceTypeId);
stmt.setInt(3, tenantId); stmt.setInt(3, tenantId);
}
try (ResultSet rs = stmt.executeQuery()){ try (ResultSet rs = stmt.executeQuery()){
return rs.next(); return rs.next();
} }

@ -1129,11 +1129,15 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
app.setName(application.getInstallerName()); app.setName(application.getInstallerName());
if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) {
return MDMWindowsOperationUtil.createInstallAppOperation(app); return MDMWindowsOperationUtil.createInstallAppOperation(app);
} else {
if (SubAction.UNINSTALL.toString().equalsIgnoreCase(action)) {
return MDMWindowsOperationUtil.createUninstallAppOperation(app);
} else { } else {
String msg = "Invalid Action is found. Action: " + action; String msg = "Invalid Action is found. Action: " + action;
log.error(msg); log.error(msg);
throw new ApplicationManagementException(msg); throw new ApplicationManagementException(msg);
} }
}
} else { } else {
String msg = "Invalid device type is found. Device Type: " + deviceType; String msg = "Invalid device type is found. Device Type: " + deviceType;
log.error(msg); log.error(msg);

@ -218,7 +218,11 @@ public class GroupManagementServiceImpl implements GroupManagementService {
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (GroupNotExistException e) { } catch (GroupNotExistException e) {
String msg = "There is another group already exists with name '" + deviceGroup.getName() + "'."; String msg = "Group doesn't exist with ID '" + deviceGroup.getGroupId() + "'.";
log.warn(msg);
return Response.status(Response.Status.CONFLICT).entity(msg).build();
} catch (GroupAlreadyExistException e) {
String msg = "Group already exists with name '" + deviceGroup.getName() + "'.";
log.warn(msg); log.warn(msg);
return Response.status(Response.Status.CONFLICT).entity(msg).build(); return Response.status(Response.Status.CONFLICT).entity(msg).build();
} }

@ -205,7 +205,7 @@ public class GroupManagementServiceImplTest {
} }
@Test(description = "This method tests the functionality of updateGroup method under various conditions") @Test(description = "This method tests the functionality of updateGroup method under various conditions")
public void testUpdateGroup() throws GroupManagementException, GroupNotExistException { public void testUpdateGroup() throws GroupManagementException, GroupNotExistException, GroupAlreadyExistException {
PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getGroupManagementProviderService")) PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getGroupManagementProviderService"))
.toReturn(groupManagementProviderService); .toReturn(groupManagementProviderService);
DeviceGroup deviceGroup = new DeviceGroup(); DeviceGroup deviceGroup = new DeviceGroup();

@ -57,6 +57,7 @@ public class MDMAppConstants {
throw new AssertionError(); throw new AssertionError();
} }
public static final String INSTALL_ENTERPRISE_APPLICATION = "INSTALL_ENTERPRISE_APPLICATION"; public static final String INSTALL_ENTERPRISE_APPLICATION = "INSTALL_ENTERPRISE_APPLICATION";
public static final String UNINSTALL_ENTERPRISE_APPLICATION = "UNINSTALL_ENTERPRISE_APPLICATION";
//App type constants related to window device type //App type constants related to window device type
public static final String MSI = "MSI"; public static final String MSI = "MSI";
public static final String APPX = "APPX"; public static final String APPX = "APPX";

@ -727,7 +727,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
Connection conn = GroupManagementDAOFactory.getConnection(); Connection conn = GroupManagementDAOFactory.getConnection();
String sql = String sql =
"SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP " "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP "
+ "WHERE GROUP_NAME = ? AND TENANT_ID = ?"; + "WHERE LOWER(GROUP_NAME) = LOWER(?) AND TENANT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
stmt.setString(1, groupName); stmt.setString(1, groupName);
stmt.setInt(2, tenantId); stmt.setInt(2, tenantId);

@ -71,7 +71,8 @@ public interface GroupManagementProviderService {
* @param groupId of the group. * @param groupId of the group.
* @throws GroupManagementException * @throws GroupManagementException
*/ */
void updateGroup(DeviceGroup deviceGroup, int groupId) throws GroupManagementException, GroupNotExistException; void updateGroup(DeviceGroup deviceGroup, int groupId)
throws GroupManagementException, GroupNotExistException, GroupAlreadyExistException;
/** /**
* Delete existing device group. * Delete existing device group.

@ -180,7 +180,7 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid
*/ */
@Override @Override
public void updateGroup(DeviceGroup deviceGroup, int groupId) public void updateGroup(DeviceGroup deviceGroup, int groupId)
throws GroupManagementException, GroupNotExistException { throws GroupManagementException, GroupNotExistException, GroupAlreadyExistException {
if (deviceGroup == null) { if (deviceGroup == null) {
String msg = "Received incomplete data for updateGroup"; String msg = "Received incomplete data for updateGroup";
log.error(msg); log.error(msg);
@ -194,6 +194,10 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid
GroupManagementDAOFactory.beginTransaction(); GroupManagementDAOFactory.beginTransaction();
DeviceGroup existingGroup = this.groupDAO.getGroup(groupId, tenantId); DeviceGroup existingGroup = this.groupDAO.getGroup(groupId, tenantId);
if (existingGroup != null) { if (existingGroup != null) {
boolean existingGroupName = this.groupDAO.getGroup(deviceGroup.getName(), tenantId) != null;
if (existingGroupName) {
throw new GroupAlreadyExistException("Group already exists with name '" + deviceGroup.getName() + "'.");
}
List<DeviceGroup> groupsToUpdate = new ArrayList<>(); List<DeviceGroup> groupsToUpdate = new ArrayList<>();
String immediateParentID = StringUtils.substringAfterLast(existingGroup.getParentPath(), DeviceGroupConstants.HierarchicalGroup.SEPERATOR); String immediateParentID = StringUtils.substringAfterLast(existingGroup.getParentPath(), DeviceGroupConstants.HierarchicalGroup.SEPERATOR);
String parentPath = ""; String parentPath = "";
@ -247,7 +251,7 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid
String msg = "Error occurred while initiating transaction."; String msg = "Error occurred while initiating transaction.";
log.error(msg, e); log.error(msg, e);
throw new GroupManagementException(msg, e); throw new GroupManagementException(msg, e);
} catch (GroupNotExistException ex) { } catch (GroupNotExistException | GroupAlreadyExistException ex) {
throw ex; throw ex;
} catch (Exception e) { } catch (Exception e) {
String msg = "Error occurred in updating the device group with ID - '" + groupId + "'."; String msg = "Error occurred in updating the device group with ID - '" + groupId + "'.";

@ -45,7 +45,7 @@ public class MDMWindowsOperationUtil {
private static final Log log = LogFactory.getLog(MDMWindowsOperationUtil.class); private static final Log log = LogFactory.getLog(MDMWindowsOperationUtil.class);
/** /**
* This method is used to create Install Authentication operation. * This method is used to create Install Application operation.
* *
* @param application MobileApp application * @param application MobileApp application
* @return operation object * @return operation object
@ -120,6 +120,82 @@ public class MDMWindowsOperationUtil {
return operation; return operation;
} }
/**
* This method is used to create Uninstall Application operation.
*
* @param application MobileApp application
* @return operation object
* @throws UnknownApplicationTypeException
*/
public static Operation createUninstallAppOperation(App application) throws UnknownApplicationTypeException {
ProfileOperation operation = new ProfileOperation();
operation.setCode(MDMAppConstants.WindowsConstants.UNINSTALL_ENTERPRISE_APPLICATION);
operation.setType(Operation.Type.PROFILE);
String appType = windowsAppType(application.getName());
String metaData = application.getMetaData();
JsonArray metaJsonArray = jsonStringToArray(metaData);
switch (application.getType()) {
case ENTERPRISE:
EnterpriseApplication enterpriseApplication = new EnterpriseApplication();
if (appType.equalsIgnoreCase(MDMAppConstants.WindowsConstants.APPX)) {
HostedAppxApplication hostedAppxApplication = new HostedAppxApplication();
List<String> dependencyPackageList = new ArrayList<>();
for (int i = 0; i < metaJsonArray.size(); i++) {
JsonElement metaElement = metaJsonArray.get(i);
JsonObject metaObject = metaElement.getAsJsonObject();
if (MDMAppConstants.WindowsConstants.APPX_PACKAGE_URI.equals(metaObject.get("key").getAsString())) {
hostedAppxApplication.setPackageUri(metaObject.get("value").getAsString().trim());
}
else if (MDMAppConstants.WindowsConstants.APPX_PACKAGE_FAMILY_NAME.equals(metaObject.get("key").getAsString())) {
hostedAppxApplication.setPackageFamilyName(metaObject.get("value").getAsString().trim());
}
else if (MDMAppConstants.WindowsConstants.APPX_DEPENDENCY_PACKAGE_URL.equals(metaObject.get("key").getAsString())
&& metaObject.has("value")) {
dependencyPackageList.add(metaObject.get("value").getAsString().trim());
hostedAppxApplication.setDependencyPackageUri(dependencyPackageList);
}
else if (MDMAppConstants.WindowsConstants.APPX_CERTIFICATE_HASH.equals(metaObject.get("key").getAsString())
&& metaObject.has("value")) {
hostedAppxApplication.setCertificateHash(metaObject.get("value").getAsString().trim());
}
else if (MDMAppConstants.WindowsConstants.APPX_ENCODED_CERT_CONTENT.equals(metaObject.get("key").getAsString())
&& metaObject.has("value")) {
hostedAppxApplication.setEncodedCertificate(metaObject.get("value").getAsString().trim());
}
}
enterpriseApplication.setHostedAppxApplication(hostedAppxApplication);
} else if (appType.equalsIgnoreCase(MDMAppConstants.WindowsConstants.MSI)) {
HostedMSIApplication hostedMSIApplication = new HostedMSIApplication();
for (int i = 0; i < metaJsonArray.size(); i++) {
JsonElement metaElement = metaJsonArray.get(i);
JsonObject metaObject = metaElement.getAsJsonObject();
if (MDMAppConstants.WindowsConstants.MSI_PRODUCT_ID.equals(metaObject.get("key").getAsString())) {
hostedMSIApplication.setProductId(metaObject.get("value").getAsString().trim());
}
else if (MDMAppConstants.WindowsConstants.MSI_CONTENT_URI.equals(metaObject.get("key").getAsString())) {
hostedMSIApplication.setContentUrl(metaObject.get("value").getAsString().trim());
}
else if (MDMAppConstants.WindowsConstants.MSI_FILE_HASH.equals(metaObject.get("key").getAsString())) {
hostedMSIApplication.setFileHash(metaObject.get("value").getAsString().trim());
}
}
enterpriseApplication.setHostedMSIApplication(hostedMSIApplication);
}
operation.setPayLoad(enterpriseApplication.toJSON());
break;
default:
String msg = "Application type " + application.getType() + " is not supported";
log.error(msg);
throw new UnknownApplicationTypeException(msg);
}
return operation;
}
/** /**
* Method to get the installer file extension type for windows type apps(either appx or msi) * Method to get the installer file extension type for windows type apps(either appx or msi)
* *

@ -103,7 +103,7 @@ public class GroupManagementProviderServiceTest extends BaseDeviceManagementTest
} }
@Test(dependsOnMethods = "createGroup") @Test(dependsOnMethods = "createGroup")
public void updateGroup() throws GroupManagementException, GroupNotExistException { public void updateGroup() throws GroupManagementException, GroupNotExistException, GroupAlreadyExistException {
DeviceGroup deviceGroup = groupManagementProviderService.getGroup(TestUtils.createDeviceGroup1().getName(), false); DeviceGroup deviceGroup = groupManagementProviderService.getGroup(TestUtils.createDeviceGroup1().getName(), false);
deviceGroup.setName(deviceGroup.getName() + "_UPDATED"); deviceGroup.setName(deviceGroup.getName() + "_UPDATED");
groupManagementProviderService.updateGroup(deviceGroup, deviceGroup.getGroupId()); groupManagementProviderService.updateGroup(deviceGroup, deviceGroup.getGroupId());
@ -116,19 +116,19 @@ public class GroupManagementProviderServiceTest extends BaseDeviceManagementTest
// Rename again to use in different place. // Rename again to use in different place.
@Test(dependsOnMethods = "updateGroup") @Test(dependsOnMethods = "updateGroup")
public void updateGroupSecondTime() throws GroupManagementException, GroupNotExistException { public void updateGroupSecondTime() throws GroupManagementException, GroupNotExistException, GroupAlreadyExistException {
DeviceGroup deviceGroup = groupManagementProviderService.getGroup(TestUtils.createDeviceGroup1().getName() + "_UPDATED", true); DeviceGroup deviceGroup = groupManagementProviderService.getGroup(TestUtils.createDeviceGroup1().getName() + "_UPDATED", true);
deviceGroup.setName(TestUtils.createDeviceGroup1().getName()); deviceGroup.setName(TestUtils.createDeviceGroup1().getName());
groupManagementProviderService.updateGroup(deviceGroup, deviceGroup.getGroupId()); groupManagementProviderService.updateGroup(deviceGroup, deviceGroup.getGroupId());
} }
@Test(dependsOnMethods = "createGroup", expectedExceptions = {GroupManagementException.class, GroupNotExistException.class}) @Test(dependsOnMethods = "createGroup", expectedExceptions = {GroupManagementException.class, GroupNotExistException.class, GroupAlreadyExistException.class})
public void updateGroupError() throws GroupManagementException, GroupNotExistException { public void updateGroupError() throws GroupManagementException, GroupNotExistException, GroupAlreadyExistException {
groupManagementProviderService.updateGroup(null, 1); groupManagementProviderService.updateGroup(null, 1);
} }
@Test(dependsOnMethods = "createGroup", expectedExceptions = {GroupManagementException.class, GroupNotExistException.class}) @Test(dependsOnMethods = "createGroup", expectedExceptions = {GroupManagementException.class, GroupNotExistException.class, GroupAlreadyExistException.class})
public void updateGroupErrorNotExist() throws GroupManagementException, GroupNotExistException { public void updateGroupErrorNotExist() throws GroupManagementException, GroupNotExistException, GroupAlreadyExistException {
DeviceGroup deviceGroup = groupManagementProviderService.getGroup(TestUtils.createDeviceGroup2().getName(), false); DeviceGroup deviceGroup = groupManagementProviderService.getGroup(TestUtils.createDeviceGroup2().getName(), false);
deviceGroup.setName(deviceGroup.getName() + "_UPDATED"); deviceGroup.setName(deviceGroup.getName() + "_UPDATED");
groupManagementProviderService.updateGroup(deviceGroup, 6); groupManagementProviderService.updateGroup(deviceGroup, 6);

@ -231,6 +231,7 @@
<Scope>perm:windows:lock-reset</Scope> <Scope>perm:windows:lock-reset</Scope>
<Scope>perm:windows:reboot</Scope> <Scope>perm:windows:reboot</Scope>
<Scope>perm:windows:location</Scope> <Scope>perm:windows:location</Scope>
<Scope>perm:android:authenticate-account</Scope>
{% if mdm_ui_conf.scopes is defined %} {% if mdm_ui_conf.scopes is defined %}
{%- for scope in mdm_ui_conf.scopes -%} {%- for scope in mdm_ui_conf.scopes -%}
<Scope>{{scope}}</Scope> <Scope>{{scope}}</Scope>

Loading…
Cancel
Save