Merge pull request #832 from hasuniea/master

Resolved wso2/product-iots#1428
revert-dabc3590
Harshan Liyanage 7 years ago committed by GitHub
commit 08eff44c40

@ -352,11 +352,10 @@ public final class PluginConstants {
private WindowsEnrollmentProperties() {
throw new AssertionError();
}
public static final String DEVICE_NAME = "DeviceName";
public static final String DEVICE_VERSION = "OSVersion";
public static final String DEVICE_ID = "DeviceID";
public static final String IMEI = "MobileEquipmentId";
public static final String TYPE = "DeviceType";
}
}

@ -38,9 +38,9 @@ public class ChallengeTag {
public void buildChallengeElement(Document doc, Element rootElement) {
Element challenge = doc.createElement(Constants.CHALLENGE);
rootElement.appendChild(challenge);
if (getMeta() != null) {
getMeta().buildMetaElement(doc, challenge);
}
rootElement.appendChild(challenge);
}
}

@ -44,6 +44,17 @@ public class StatusTag {
this.data = data;
}
public StatusTag(int commandId, int messageReference, int commandReference, String command,
ChallengeTag challengeTag, String targetReference, String data) {
this.commandId = commandId;
this.messageReference = messageReference;
this.commandReference = commandReference;
this.command = command;
this.challenge = challengeTag;
this.targetReference = targetReference;
this.data = data;
}
public StatusTag() {
}
@ -140,5 +151,4 @@ public class StatusTag {
status.appendChild(data);
}
}
}

@ -87,6 +87,7 @@ public class Constants {
public final class SyncMLResponseCodes {
public static final String AUTHENTICATION_ACCEPTED = "212";
public static final String ACCEPTED = "200";
public static final String UNAUTHORIZED = "401";
public static final String ACCEPTED_FOR_PROCESSING = "202";
public static final String PIN_NOTFOUND = "405";
public static final String LOCK_RESET_NOTIFICATION = "Error occurred in Device Lock Operation. " +

@ -22,7 +22,6 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
@ -32,15 +31,21 @@ import org.wso2.carbon.device.mgt.common.notification.mgt.NotificationManagement
import org.wso2.carbon.device.mgt.common.notification.mgt.NotificationManagementService;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException;
import org.wso2.carbon.device.mgt.common.policy.mgt.ProfileFeature;
import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.ComplianceFeature;
import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.PolicyComplianceException;
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceDetailsMgtException;
import org.wso2.carbon.device.mgt.mobile.windows.api.common.PluginConstants;
import org.wso2.carbon.device.mgt.mobile.windows.api.common.util.WindowsAPIUtils;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.StatusTag;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.SyncmlDocument;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.SyncmlHeader;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.ItemTag;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.WindowsOperationException;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.ResultsTag;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.SyncmlBody;
import org.wso2.carbon.device.mgt.mobile.windows.api.services.syncml.beans.Profile;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.*;
import org.wso2.carbon.policy.mgt.common.PolicyManagementException;
import org.wso2.carbon.device.mgt.common.policy.mgt.ProfileFeature;
import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.ComplianceFeature;
import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.PolicyComplianceException;
import java.util.ArrayList;
import java.util.List;
@ -226,6 +231,20 @@ public class OperationHandler {
}
}
public void updateDisenrollOperationStatus(DeviceIdentifier deviceIdentifier) throws OperationManagementException {
List<? extends Operation> pendingDeviceInfoOperations;
try {
pendingDeviceInfoOperations = WindowsAPIUtils.getPendingOperations(deviceIdentifier);
} catch (DeviceManagementException e) {
throw new OperationManagementException("Error occurred while getting pending operations.");
}
for (Operation operation : pendingDeviceInfoOperations) {
if (PluginConstants.OperationCodes.DISENROLL.equals(operation.getCode())) {
operation.setStatus(Operation.Status.COMPLETED);
updateStatus(deviceIdentifier.getId(), pendingDeviceInfoOperations);
}
}
}
public void updateDeviceInfoStatus(DeviceIdentifier deviceIdentifier) throws OperationManagementException {
List<? extends Operation> pendingDeviceInfoOperations;
@ -294,6 +313,9 @@ public class OperationHandler {
if (OperationCode.Command.TOTAL_RAM.getCode().equals(itemTag.getSource().getLocURI())) {
updateDeviceInfo(syncmlDocument);
}
if (OperationCode.Command.BATTERY_CHARGE_REMAINING.equals(itemTag.getSource().getLocURI())) {
updateDeviceInfo(syncmlDocument);
}
}
}
UpdateUriOperations(syncmlDocument);
@ -562,6 +584,7 @@ public class OperationHandler {
String totalRAM;
String deviceID = null;
String totalStorage;
Double battery;
List<ItemTag> deviceInformations = syncmlDocument.getBody().getResults().getItem();
DeviceInfo deviceInfo = new DeviceInfo();
@ -598,6 +621,10 @@ public class OperationHandler {
if (OperationCode.Info.DEV_ID.getCode().equals(source)) {
deviceID = item.getData();
}
if (OperationCode.Info.BATTERY_CHARGE_REMAINING.getCode().equals(source)) {
battery = Double.valueOf(item.getData());
deviceInfo.setBatteryLevel(battery);
}
}
DeviceIdentifier deviceIdentifier = convertToDeviceIdentifierObject(deviceID);
try {
@ -636,6 +663,16 @@ public class OperationHandler {
} catch (OperationManagementException e) {
throw new WindowsOperationException("Error occurred while updating Device Location operation status.");
}
}
public void checkForDeviceWipe(List<? extends Operation> pendingDeviceInfoOperations
, DeviceIdentifier deviceIdentifier) throws OperationManagementException {
for (Operation operation : pendingDeviceInfoOperations) {
if (PluginConstants.OperationCodes.WIPE_DATA.equals(operation.getCode())) {
operation.setStatus(Operation.Status.COMPLETED);
updateStatus(deviceIdentifier.getId(), pendingDeviceInfoOperations);
}
}
}
}

@ -21,6 +21,8 @@ package org.wso2.carbon.device.mgt.mobile.windows.api.operations.util;
import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import org.wso2.carbon.device.mgt.mobile.windows.api.common.PluginConstants;
@ -162,22 +164,27 @@ public class OperationReply {
SyncmlBody sourceSyncmlBody = syncmlDocument.getBody();
SyncmlHeader sourceHeader = syncmlDocument.getHeader();
StatusTag headerStatus;
ChallengeTag challengeTag = new ChallengeTag();
MetaTag metaTag = new MetaTag();
metaTag.setFormat(Constants.CRED_FORMAT);
metaTag.setType(Constants.CRED_TYPE);
metaTag.setNextNonce(Constants.INITIAL_NONCE);
challengeTag.setMeta(metaTag);
SyncmlBody syncmlBodyReply = new SyncmlBody();
List<StatusTag> statuses = new ArrayList<>();
List<StatusTag> sourceStatuses = sourceSyncmlBody.getStatus();
if (sourceStatuses.isEmpty()) {
headerStatus =
new StatusTag(headerCommandId, sourceHeader.getMsgID(), HEADER_STATUS_ID,
HEADER_COMMAND_TEXT, sourceHeader.getSource().getLocURI(),
String.valueOf(Constants.SyncMLResponseCodes.AUTHENTICATION_ACCEPTED));
HEADER_COMMAND_TEXT, challengeTag,sourceHeader.getSource().getLocURI(),
String.valueOf(Constants.SyncMLResponseCodes.UNAUTHORIZED));
statuses.add(headerStatus);
} else {
for (StatusTag sourceStatus : sourceStatuses) {
if (sourceStatus.getChallenge() != null && HEADER_COMMAND_TEXT.equals(sourceStatus.getCommand())) {
headerStatus =
new StatusTag(headerCommandId, sourceHeader.getMsgID(), HEADER_STATUS_ID,
HEADER_COMMAND_TEXT, sourceHeader.getSource().getLocURI(),
HEADER_COMMAND_TEXT, challengeTag, sourceHeader.getSource().getLocURI(),
String.valueOf(Constants.SyncMLResponseCodes.AUTHENTICATION_ACCEPTED));
statuses.add(headerStatus);
}
@ -230,7 +237,6 @@ public class OperationReply {
private void appendOperations(SyncmlBody syncmlBody) throws PolicyManagementException,
FeatureManagementException, JSONException, SyncmlOperationException {
GetTag getElement = new GetTag();
List<ItemTag> getElements = new ArrayList<>();
List<ExecuteTag> executeElements = new ArrayList<>();

@ -18,6 +18,7 @@
package org.wso2.carbon.device.mgt.mobile.windows.api.services.enrollment.impl;
import com.google.gson.Gson;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.logging.Log;
@ -40,6 +41,7 @@ import org.wso2.carbon.device.mgt.mobile.windows.api.common.exceptions.WAPProvis
import org.wso2.carbon.device.mgt.mobile.windows.api.common.exceptions.WindowsDeviceEnrolmentException;
import org.wso2.carbon.device.mgt.mobile.windows.api.common.util.DeviceUtil;
import org.wso2.carbon.device.mgt.mobile.windows.api.common.util.WindowsAPIUtils;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.util.DeviceInfo;
import org.wso2.carbon.device.mgt.mobile.windows.api.operations.util.SyncmlCredentialUtil;
import org.wso2.carbon.device.mgt.mobile.windows.api.services.enrollment.EnrollmentService;
import org.wso2.carbon.device.mgt.mobile.windows.api.services.enrollment.beans.*;
@ -98,7 +100,6 @@ public class EnrollmentServiceImpl implements EnrollmentService {
AdditionalContext additionalContext,
Holder<RequestSecurityTokenResponse> response)
throws WindowsDeviceEnrolmentException, UnsupportedEncodingException, WAPProvisioningException {
String headerBinarySecurityToken = null;
String headerTo = null;
String encodedWap;
@ -199,7 +200,6 @@ public class EnrollmentServiceImpl implements EnrollmentService {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(DOMSource, streamResult);
return stringWriter.toString();
}
@ -220,14 +220,12 @@ public class EnrollmentServiceImpl implements EnrollmentService {
String signedCertEncodedString;
X509Certificate signedCertificate;
String provisioningXmlString;
CertificateManagementServiceImpl certMgtServiceImpl = CertificateManagementServiceImpl.getInstance();
Base64 base64Encoder = new Base64();
try {
X509Certificate rootCACertificate = (X509Certificate) certMgtServiceImpl.getCACertificate();
rootCertEncodedString = base64Encoder.encodeAsString(rootCACertificate.getEncoded());
signedCertificate = certMgtServiceImpl.getSignedCertificateFromCSR(binarySecurityToken);
signedCertEncodedString = base64Encoder.encodeAsString(signedCertificate.getEncoded());
@ -312,7 +310,6 @@ public class EnrollmentServiceImpl implements EnrollmentService {
Node pollValue = pollingAttributes.getNamedItem(PluginConstants.CertificateEnrolment.VALUE);
pollValue.setTextContent(pollingFrequency);
provisioningXmlString = convertDocumentToString(document);
} catch (ParserConfigurationException e) {
throw new WAPProvisioningException("Problem occurred while creating configuration request", e);
} catch (CertificateEncodingException e) {
@ -368,7 +365,7 @@ public class EnrollmentServiceImpl implements EnrollmentService {
* @return Value added Device.
*/
private Device generateDevice(WindowsDevice windowsDevice) {
Gson gson = new Gson();
Device generatedDevice = new Device();
Device.Property OSVersionProperty = new Device.Property();
@ -383,10 +380,20 @@ public class EnrollmentServiceImpl implements EnrollmentService {
IMEIProperty.setName(PluginConstants.SyncML.IMEI);
IMEIProperty.setValue(windowsDevice.getImei());
Device.Property deviceInfoProperties = new Device.Property();
deviceInfoProperties.setName(PluginConstants.WindowsEnrollmentProperties.TYPE);
deviceInfoProperties.setValue(windowsDevice.getWindowsType());
String deviceInfo = gson.toJson(deviceInfoProperties);
Device.Property winDeviceType = new Device.Property();
winDeviceType.setName(PluginConstants.SyncML.DEVICE_INFO);
winDeviceType.setValue(deviceInfo);
List<Device.Property> propertyList = new ArrayList<>();
propertyList.add(OSVersionProperty);
propertyList.add(IMSEIProperty);
propertyList.add(IMEIProperty);
propertyList.add(winDeviceType);
EnrolmentInfo enrolmentInfo = new EnrolmentInfo();
enrolmentInfo.setOwner(windowsDevice.getUser());
@ -430,6 +437,9 @@ public class EnrollmentServiceImpl implements EnrollmentService {
if (PluginConstants.WindowsEnrollmentProperties.DEVICE_VERSION.equals(contextItem.getName())) {
windowsDevice.setOsVersion(contextItem.getValue());
}
if (PluginConstants.WindowsEnrollmentProperties.TYPE.equals(contextItem.getName())) {
windowsDevice.setWindowsType(contextItem.getValue());
}
}
Device device = generateDevice(windowsDevice);
WindowsAPIUtils.getDeviceManagementService().enrollDevice(device);

@ -87,39 +87,54 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
if ((PluginConstants.SyncML.SYNCML_FIRST_MESSAGE_ID == msgId) &&
(PluginConstants.SyncML.SYNCML_FIRST_SESSION_ID == sessionId)) {
token = syncmlHeader.getCredential().getData();
MobileCacheEntry cacheToken = DeviceUtil.getTokenEntry(token);
DeviceUtil.persistChallengeToken(token, deviceIdentifier.getId(), user);
PrivilegedCarbonContext carbonCtx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
carbonCtx.setTenantId(cacheToken.getTenanatID(), true);
if ((cacheToken.getUsername() != null) && (cacheToken.getUsername().equals(user))) {
if (modifyEnrollWithMoreDetail(request, cacheToken.getTenantDomain(), cacheToken.getTenanatID())) {
pendingOperations = operationHandler.getPendingOperations(syncmlDocument);
response = operationReply.generateReply(syncmlDocument, pendingOperations);
return Response.status(Response.Status.OK).entity(response).build();
if (syncmlHeader.getCredential() != null) {
token = syncmlHeader.getCredential().getData();
MobileCacheEntry cacheToken = DeviceUtil.getTokenEntry(token);
DeviceUtil.persistChallengeToken(token, deviceIdentifier.getId(), user);
PrivilegedCarbonContext carbonCtx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
carbonCtx.setTenantId(cacheToken.getTenanatID(), true);
if ((cacheToken.getUsername() != null) && (cacheToken.getUsername().equals(user))) {
if (modifyEnrollWithMoreDetail(request, cacheToken.getTenantDomain(), cacheToken.getTenanatID())) {
pendingOperations = operationHandler.getPendingOperations(syncmlDocument);
operationHandler.checkForDeviceWipe(pendingOperations, deviceIdentifier);
response = operationReply.generateReply(syncmlDocument, pendingOperations);
return Response.status(Response.Status.OK).entity(response).build();
} else {
String msg = "Error occurred in while modify the enrollment.";
log.error(msg);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
} else {
String msg = "Error occurred in while modify the enrollment.";
String msg = "Authentication failure due to incorrect credentials.";
log.error(msg);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
return Response.status(Response.Status.UNAUTHORIZED).entity(msg).build();
}
} else {
String msg = "Authentication failure due to incorrect credentials.";
log.error(msg);
return Response.status(Response.Status.UNAUTHORIZED).entity(msg).build();
return Response.ok().entity(operationReply.generateReply(syncmlDocument, null)).build();
}
} else {
MobileCacheEntry cacheToken = DeviceUtil.getTokenEntryFromDeviceId(deviceIdentifier.getId());
PrivilegedCarbonContext carbonCtx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
carbonCtx.setTenantId(cacheToken.getTenanatID());
if (DeviceUtil.getTokenEntryFromDeviceId(deviceIdentifier.getId()) == null) {
if (syncmlHeader.getCredential() != null) {
token = syncmlHeader.getCredential().getData();
MobileCacheEntry cacheToken = DeviceUtil.getTokenEntry(token);
DeviceUtil.persistChallengeToken(token, deviceIdentifier.getId(), user);
PrivilegedCarbonContext carbonCtx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
carbonCtx.setTenantId(cacheToken.getTenanatID(), true);
}
} else {
MobileCacheEntry cacheToken = DeviceUtil.getTokenEntryFromDeviceId(deviceIdentifier.getId());
PrivilegedCarbonContext carbonCtx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
carbonCtx.setTenantId(cacheToken.getTenanatID());
}
if ((syncmlDocument.getBody().getAlert() != null)) {
if (!syncmlDocument.getBody().getAlert().getData().equals(Constants.DISENROLL_ALERT_DATA)) {
pendingOperations = operationHandler.getPendingOperations(syncmlDocument);
operationHandler.checkForDeviceWipe(pendingOperations, deviceIdentifier);
return Response.ok().entity(operationReply.generateReply(
syncmlDocument, pendingOperations)).build();
} else {
if (WindowsAPIUtils.getDeviceManagementService().getDevice(deviceIdentifier, false) != null) {
operationHandler.updateDisenrollOperationStatus(deviceIdentifier);
WindowsAPIUtils.getDeviceManagementService().disenrollDevice(deviceIdentifier);
return Response.ok().entity(operationReply.generateReply(syncmlDocument, null)).build();
} else {
@ -130,6 +145,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
}
} else {
pendingOperations = operationHandler.getPendingOperations(syncmlDocument);
operationHandler.checkForDeviceWipe(pendingOperations, deviceIdentifier);
return Response.ok().entity(operationReply.generateReply(
syncmlDocument, pendingOperations)).build();
}
@ -171,7 +187,6 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
boolean status = false;
String user;
SyncmlDocument syncmlDocument;
try {
syncmlDocument = SyncmlParser.parseSyncmlPayload(request);
ReplaceTag replace = syncmlDocument.getBody().getReplace();

@ -32,6 +32,15 @@ public class WindowsDevice {
private String model;
private String user;
private String deviceName;
private String windowsType;
public String getWindowsType() {
return windowsType;
}
public void setWindowsType(String windowsType) {
this.windowsType = windowsType;
}
public String getImei() {
return imei;

@ -29,7 +29,7 @@
</characteristic>
<characteristic type="APPLICATION">
<parm name="APPID" value="w7"/>
<parm name="PROVIDER-ID" value="TestMDMServer"/>
<parm name="PROVIDER-ID" value="MobiCDMServer"/>
<parm name="NAME" value="Microsoft"/>
<parm name="ADDR" value="https://DM.contoso.com:443/omadm/Windows.ashx"/>
<parm name="CONNRETRYFREQ" value="6" />
@ -42,8 +42,8 @@
<characteristic type="APPAUTH">
<parm name="AAUTHLEVEL" value="CLIENT"/>
<parm name="AAUTHTYPE" value="DIGEST"/>
<parm name="AAUTHSECRET" value="password1"/>
<parm name="AAUTHDATA" value="B64encodedBinaryNonceInsertedHere"/>
<parm name="AAUTHSECRET" value="dummy"/>
<parm name="AAUTHDATA" value="ZHVtbXk="/>
</characteristic>
<characteristic type="APPAUTH">
<parm name="AAUTHLEVEL" value="APPSRV"/>

Loading…
Cancel
Save