internal static bool GetDeviceStatus(OrganizationId orgId, string deviceID, string externalUserObjectId, out bool isManaged, out bool isCompliant) { bool flag = false; bool flag2 = true; isManaged = false; isCompliant = false; try { AadDevice aadDevice; if (GraphApiHelper.deviceStatusCache.Value.TryGetValue(GraphApiHelper.GetCacheKey(externalUserObjectId, deviceID), out aadDevice)) { flag = true; isManaged = (aadDevice.IsManaged != null && aadDevice.IsManaged.Value); isCompliant = (aadDevice.IsCompliant != null && aadDevice.IsCompliant.Value); flag2 = (aadDevice.AccountEnabled == null || aadDevice.AccountEnabled.Value); AirSyncDiagnostics.TraceDebug <bool, bool, bool>(ExTraceGlobals.RequestsTracer, 0, "Retrieved device status from Cache. IsManaged:{0}, IsCompliant:{1}, IsEnabled:{2}", isManaged, isCompliant, flag2); return(flag2); } if (!GraphApiHelper.aadClients.ContainsKey(orgId)) { lock (GraphApiHelper.lockObject) { if (!GraphApiHelper.aadClients.ContainsKey(orgId)) { IAadClient aadClient = GraphApiHelper.CreateAadClient(orgId, GraphProxyVersions.Version122); if (!GlobalSettings.DisableAadClientCache && aadClient != null) { AirSyncDiagnostics.TraceDebug(ExTraceGlobals.RequestsTracer, 0, "Added AADClient to cache."); GraphApiHelper.aadClients.Add(orgId, aadClient); } } } } IAadClient aadClient2 = GraphApiHelper.aadClients.ContainsKey(orgId) ? GraphApiHelper.aadClients[orgId] : null; if (aadClient2 == null) { throw new InvalidOperationException(string.Format("Failed to create AAD client for Org {0}", orgId)); } List <AadDevice> userDevicesWithEasID = aadClient2.GetUserDevicesWithEasID(deviceID, externalUserObjectId); if (userDevicesWithEasID != null && userDevicesWithEasID.Count > 0) { AirSyncDiagnostics.TraceDebug <int>(ExTraceGlobals.RequestsTracer, 0, "Retrieved {0} devices from AAD ", userDevicesWithEasID.Count); userDevicesWithEasID.Sort((AadDevice device1, AadDevice device2) => device1.LastUpdated.CompareTo(device2.LastUpdated)); aadDevice = userDevicesWithEasID[0]; isManaged = (aadDevice.IsManaged != null && aadDevice.IsManaged.Value); isCompliant = (aadDevice.IsCompliant != null && aadDevice.IsCompliant.Value); TimeSpan expiration = (isManaged && isCompliant) ? GlobalSettings.DeviceStatusCacheExpirationInterval : GlobalSettings.NegativeDeviceStatusCacheExpirationInterval; if (!GlobalSettings.DisableDeviceHealthStatusCache && !GraphApiHelper.deviceStatusCache.Value.TryAddAbsolute(GraphApiHelper.GetCacheKey(externalUserObjectId, deviceID), aadDevice, expiration)) { AirSyncDiagnostics.TraceDebug <OrganizationId, string, string>(ExTraceGlobals.RequestsTracer, 0, "Failed to Add device {1} to Device Status Cache for user {2}. OrganizationId:{0} ", orgId, deviceID, externalUserObjectId); } if (Command.CurrentCommand != null) { Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.GraphApiCallData, string.Format("num:{0},id:{1}", userDevicesWithEasID.Count, aadDevice.DeviceId)); } return(aadDevice.AccountEnabled == null || aadDevice.AccountEnabled.Value); } AirSyncDiagnostics.TraceDebug(ExTraceGlobals.RequestsTracer, 0, "Device not found in AAD "); if (Command.CurrentCommand != null) { Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.GraphApiCallData, string.Format("msg:{0}", "DeviceNotFoundInAAD")); } } catch (AADException ex) { AADDataException ex2 = ex as AADDataException; string text = (ex2 != null) ? ex2.Code.ToString() : "n/a"; AirSyncDiagnostics.TraceDebug(ExTraceGlobals.RequestsTracer, "0", "Exception retrieving deviceStatus for device:{0}, user:{1},OrgId:{2},ErrorCode:{3},Message:{4} ", new object[] { deviceID, externalUserObjectId, orgId, text, ex.Message }); if (Command.CurrentCommand != null) { if (ex2 != null) { Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.Error, text); } AirSyncUtility.LogCompressedStackTrace(ex, Command.CurrentCommand.Context); } throw new AirSyncPermanentException(HttpStatusCode.InternalServerError, StatusCode.ServerError, ex, false); } finally { if (Command.CurrentCommand != null) { Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.GraphApiCallData, string.Format("cu:{0}", flag ? "F" : "T")); Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.GraphApiCallData, string.Format("Mngd:{0},Cmpl:{1},Enbld:{2}", isManaged, isCompliant, flag2)); } } return(flag2); }
internal static bool GetDeviceStatus(OrganizationId orgId, string deviceID, string externalUserObjectId, bool isSupportedDevice, out DeviceAccessState accessState, out DeviceAccessStateReason accessReason) { bool flag = false; bool flag2 = true; accessState = DeviceAccessState.Unknown; accessReason = DeviceAccessStateReason.Unknown; string text = string.Empty; try { if (!GlobalSettings.DisableDeviceHealthStatusCache && GraphApiHelper.deviceComplianceStatusCache.Value.TryGetValue(GraphApiHelper.GetCacheKey(externalUserObjectId, deviceID), out text)) { flag = true; flag2 = GraphApiHelper.ParsePolicyEvaluationStatusToAccessState(text, out accessState, out accessReason); AirSyncDiagnostics.TraceDebug(ExTraceGlobals.RequestsTracer, 0, "Retrieved device status from Cache. AccessState:{1}, AccessReason:{2}, IsEnabled:{3}, DeviceStatus:{0}, ", new object[] { accessState, accessReason, flag2, text }); return(flag2); } IAadClient aadClient = null; if (!GraphApiHelper.aadClients.ContainsKey(orgId)) { lock (GraphApiHelper.lockObject) { if (!GraphApiHelper.aadClients.ContainsKey(orgId)) { aadClient = GraphApiHelper.CreateAadClient(orgId, GraphProxyVersions.Version142); if (!GlobalSettings.DisableAadClientCache && aadClient != null) { AirSyncDiagnostics.TraceDebug(ExTraceGlobals.RequestsTracer, 0, "Added AADClient to cache."); GraphApiHelper.aadClients.Add(orgId, aadClient); } } } } if (aadClient == null) { if (!GraphApiHelper.aadClients.ContainsKey(orgId)) { throw new InvalidOperationException(string.Format("Failed to create AAD client for Org {0}", orgId)); } aadClient = GraphApiHelper.aadClients[orgId]; } text = aadClient.EvaluateAuthPolicy(deviceID, externalUserObjectId, isSupportedDevice); flag2 = GraphApiHelper.ParsePolicyEvaluationStatusToAccessState(text, out accessState, out accessReason); TimeSpan expiration = (accessState == DeviceAccessState.Allowed) ? GlobalSettings.DeviceStatusCacheExpirationInterval : GlobalSettings.NegativeDeviceStatusCacheExpirationInterval; if (!GlobalSettings.DisableDeviceHealthStatusCache && !GraphApiHelper.deviceComplianceStatusCache.Value.TryAddAbsolute(GraphApiHelper.GetCacheKey(externalUserObjectId, deviceID), text, expiration)) { AirSyncDiagnostics.TraceDebug <OrganizationId, string, string>(ExTraceGlobals.RequestsTracer, 0, "Failed to Add deviceStatus {1} to Device Status Cache for user {2}. UserId:{0} ", orgId, text, externalUserObjectId); } if (Command.CurrentCommand != null) { Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.GraphApiCallData, string.Format("msg:{0}", text)); } } catch (AADException ex) { AADDataException ex2 = ex as AADDataException; string text2 = (ex2 != null) ? ex2.Code.ToString() : "n/a"; AirSyncDiagnostics.TraceDebug(ExTraceGlobals.RequestsTracer, "0", "Exception retrieving deviceStatus for device:{0}, user:{1},OrgId:{2},ErrorCode:{3},Message:{4} ", new object[] { deviceID, externalUserObjectId, orgId, text2, ex.Message }); if (Command.CurrentCommand != null) { if (ex2 != null) { Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.Error, text2); } AirSyncUtility.LogCompressedStackTrace(ex, Command.CurrentCommand.Context); } throw new AirSyncPermanentException(HttpStatusCode.InternalServerError, StatusCode.ServerError, ex, false); } finally { if (Command.CurrentCommand != null) { Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.GraphApiCallData, string.Format("cu:{0}", flag ? "F" : "T")); Command.CurrentCommand.ProtocolLogger.AppendValue(ProtocolLoggerData.GraphApiCallData, string.Format("deviceStatus", text)); } } return(flag2); }