using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using C4IT.HTTP; using C4IT.MsGraph; using Newtonsoft.Json.Linq; using C4IT.Logging; using static C4IT.Logging.cLogManager; using C4IT.DataHistoryProvider; namespace C4IT.FASD.Communication.Citrix { public class cCitrixCommunication : cHttpApiBase { public const int constMaxPageSize = 1000; public const string constCitrixBaseUrl = "https://api.cloud.com/{Request}"; public const string constCitrixUserList = "monitorodata/Users?$top={top}&$skip={skip}&$select=Id,Sid,Upn,Domain&$filter=Domain ne ''"; public const string constCitrixUserSessions = "monitorodata/Sessions?$filter=UserId eq {UserId} and (EndDate eq null or StartDate ge {MinStartDate})&$expand=Machine($select=Id,DnsName,Name)&$select=SessionKey,StartDate,EndDate,ConnectionState"; public cCitrixCommunication() : base("Citrix ID tenant", "https://api.cloud.com/cctrustoauth2/{Tenant}/tokens/clients", "Citrix Comunication") { KnownAutoRetryErrors.Add(HttpStatusCode.Forbidden); autoRetryCount = 2; autoRetryDelay = 100; } private protected override List> GetRequestHeaders(cOAuthLogonInfo privLogonInfo) { return new List>() { new KeyValuePair("Authorization", $"CwsAuth Bearer={AccessToken}"), new KeyValuePair("Citrix-CustomerId", privLogonInfo.Tenant), new KeyValuePair("Citrix-InstanceId", privLogonInfo.InstanceId) }; } public async Task RequestAsync(string Request, eHttpMethod httpMethod = eHttpMethod.get, object JsonData = null, bool retryForbidden = false, string nameProperty = null, bool noAutoRelogon = false) { MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); } try { var strUrl = constCitrixBaseUrl; strUrl = strUrl.Replace("{Request}", Request); var data = await privRequestAsync(strUrl, httpMethod, JsonData, retryForbidden, noAutoRelogon: noAutoRelogon); if (data == null) return null; if (data is bool isValid) { if (isValid) return new cCitrixResultBase(null); else return null; } var RetVal = new cCitrixResultBase(data, nameProperty); return RetVal; } catch (Exception E) { cLogManager.LogException(E); } finally { if (CM != null) LogMethodEnd(CM); } return null; } public async Task RequestListAsync(string Request, bool loadPaged = false, bool retryForbidden = false) { try { // get the request url var strUrl = constCitrixBaseUrl; strUrl = strUrl.Replace("{Request}", Request); var res = await privRequestAsync(strUrl, autoRetry: retryForbidden); if (res != null) { var RetVal = new cCitrixResultList(retryForbidden); RetVal.AddResult(res); if (!RetVal.hasRemaining || loadPaged) return RetVal; while (RetVal.hasRemaining) { if (!await RequestNextAsync(RetVal)) return RetVal; } return RetVal; } } catch (Exception E) { cLogManager.DefaultLogger.LogException(E); } return null; } public async Task RequestNextAsync(cCitrixResultList List) { try { var res = await privRequestAsync(List.NextResultUrl, autoRetry: List.retryForbidden); if (res != null) { List.AddResult(res); return true; } } catch (Exception E) { cLogManager.DefaultLogger.LogException(E); } return false; } public class cCitrixResultList : List { public string NextResultUrl { get; private set; } = null; public bool retryForbidden { get; private set; } = false; public cCitrixResultList(bool retryForbidden) { this.retryForbidden = retryForbidden; } public bool hasRemaining { get { return !string.IsNullOrEmpty(NextResultUrl); } } public void AddResult(dynamic Result) { try { NextResultUrl = null; if (Result.TryGetValue("@odata.nextLink", out JToken JT)) { var JO = (JValue)JT; NextResultUrl = Result["@odata.nextLink"]; } if (Result.TryGetValue("value", out JToken JT2)) { foreach (dynamic Entry in Result.value) try { var val = new cCitrixResultBase(Entry); this.Add(val); } catch (Exception E) { cLogManager.DefaultLogger.LogException(E); } } } catch (Exception E) { cLogManager.DefaultLogger.LogException(E); } } } public class cCitrixResultBase { public string ID { get; private set; } = null; public string ODataId { get; private set; } = null; public string DisplayName { get; private set; } = null; public string Context { get; private set; } = null; public dynamic Result { get; private set; } = null; public cCitrixResultBase(dynamic Result, string namePropery = null) { this.Result = Result; try { ID = Result.Id; } catch { } ; try { if (namePropery == null) namePropery = "displayName"; if (Result.TryGetValue(namePropery, out JToken JT1)) { var _ty = JT1.GetType().ToString(); if (JT1 is JValue _jVal) DisplayName = _jVal.Value?.ToString(); } else if (Result.TryGetValue("name", out JToken JT2)) DisplayName = Result.name; } catch { } try { Context = Result["@odata.context"]; } catch { } ODataId = GetStringFromDynamic(Result, "@odata.id"); if (string.IsNullOrEmpty(ODataId)) ODataId = @"https://api.cloud.com/" + ID; } public cCitrixResultBase(cCitrixResultBase Result) { if (Result == null) return; this.Result = Result.Result; ID = Result.ID; ODataId = Result.ODataId; DisplayName = Result.DisplayName; Context = Result.Context; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string GetStringFromDynamic(dynamic O, string ProperyName) { try { return (string)O[ProperyName]; } catch { } return null; } } } }