using CircleSDK.Model; using Newtonsoft.Json; using System.Reflection; using System.Reflection.Metadata.Ecma335; using System.Reflection.PortableExecutable; namespace CDPShared { // All the code in this file is included in all platforms. public class CDPWorker { private CircleAPIHelper _apiHelper; private string _userName = ""; private string _machine = ""; Boolean _bReady = false; public Boolean Ready => _bReady; public string Status { get { return _apiHelper.Status; } } public CircleAPIHelper API => _apiHelper; public List Circles { get; set; } public string DefaultTopicId { get; set; } = "87654321-a314-4202-b959-c981a6bc3c24"; public string DefaultCircleId { get; set; } public CDPWorker() { using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name)) { Circles = new List(); _apiHelper = new CircleAPIHelper(Constants.CustomerCode, Constants.AppKey, Constants.EndUserId, Constants.Secret); _userName = Environment.UserDomainName + "\\" + Environment.UserName; _machine = Environment.MachineName; Task.Run(async () => {await AsyncStartup(); }); } } async Task AsyncStartup() { while (!_apiHelper.Ready) { Thread.Sleep(250); } Circles = await _apiHelper.EnumCircles(); _bReady = true; } public async Task Decrypt(string file) { YellowFile yf = new YellowFile(file); DecryptRequest request = new DecryptRequest(); request.CircleId = yf.CircleId; request.TopicId = yf.TopicId; request.ToDecrypt = Convert.ToBase64String(File.ReadAllBytes(file)); DecryptReply result = null; result = await _apiHelper.Api.DecryptAsync(request, "Bearer " + _apiHelper.Token, "Dashboard"); if (!result.Status.Result.GetValueOrDefault(false)) return null; return result; //byte[] buf = Convert.FromBase64String(result.DecryptedData); //string ext = Path.GetExtension(result.FileName); //fileName = result.FileName; //return buf; } public async Task GetCircle(string circleId) { return await _apiHelper.GetCircleById(circleId); } public async Task GetTopic(string circleId, string topicId) { return await _apiHelper.GetTopicById(circleId, topicId); } public async Task TrackAuthorizedAccess(YellowFile yf, string fileName, Dictionary metaData) { using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name)) { try { DataGather g = new DataGather(_apiHelper); foreach (KeyValuePair keyValuePair in metaData) { g.AddHead(keyValuePair.Key, keyValuePair.Value); } g.AddTail("File Id", yf.FileId); WhoAmIReply wr = await _apiHelper.WhoAmI(yf.CircleId); List members = await _apiHelper.EnumCircleMembers(yf.CircleId); string senderName = yf.OwnerId; ProfileInfo sender = members.FirstOrDefault(dr => dr.ProfileId == yf.OwnerId); if (sender != null) senderName = sender.DisplayName; g.AddHead("Sender", senderName); g.AddTail("Sender Id", yf.OwnerId); string viewerName = ""; ProfileInfo viewer = members.FirstOrDefault(dr => dr.ProfileId == wr.MemberId); if (viewer != null) viewerName = viewer.DisplayName; g.AddHead("Viewer", viewerName); g.AddTail("Viewer Id", wr.MemberId); yf.UpdateOwner(wr.MemberId); await AddMessage($"{fileName} decrypted by {_userName}", (Int32)CircleViewMessages.FileViewed, g); } catch (Exception e) { MinLogging.LogIt(e.Message); } } } public async Task TrackUnauthorizedAccess(YellowFile yf, string sourcePath) { using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name)) { try { DataGather g = new DataGather(_apiHelper); g.AddHead($"Full path", sourcePath); g.AddTail("File Id", yf.FileId); string senderName = yf.OwnerId; g.AddTail("Sender Id", yf.OwnerId); string message = $"{_userName} was blocked attempting to view a protected file"; // we can't use the filename since it's in the encrypted header await PostCircleViewEvent(yf.CircleId, yf.FileId, (Int32)CircleViewMessages.BlockedViewAttempt, message, JsonConvert.SerializeObject(g.Gather())); } catch (Exception e) { MinLogging.LogIt(e.Message); } } } async Task PostCircleViewEvent(string circleId, string fileId, Int32 msgType, string message, string meta) { using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name)) { var url = Constants.CircleViewEventUrl + "?circleId=" + circleId; var data = new { FileId = fileId, MsgId = Guid.NewGuid().ToString(), Event = DateTime.UtcNow, MsgType = msgType, Message = message, Meta = meta }; try { HttpClient client = new HttpClient(); var json = JsonConvert.SerializeObject(data); var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); MinLogging.LogIt(url); MinLogging.LogIt(json); var response = await client.PostAsync(url, content); response.EnsureSuccessStatusCode(); string result = await response.Content.ReadAsStringAsync(); MinLogging.LogIt(result); } catch (Exception e) { MinLogging.LogIt(" **** " + e.Message); } } } public async Task> EnumTopics(string circleId) { return await _apiHelper.EnumTopics(circleId); } public async Task EncryptFile(string circleId, string topicId, string fileName) { return await _apiHelper.EncryptFile(circleId, topicId, fileName); } /// /// this adds a message to the default circle and topic /// public async Task AddMessage(string message, Int32 msgId, DataGather g = null) { return await API.AddMessage(DefaultCircleId, DefaultTopicId, message, msgId, g); } public async Task GetCircleViewwMessages() { return await API.GetCircleViewwMessages(DefaultCircleId, DefaultTopicId); } } }