You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
8.6 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. using System.Net.Http.Headers;
  2. using CircleSDK.Model;
  3. using Newtonsoft.Json;
  4. using System.Reflection;
  5. using System.Reflection.Metadata.Ecma335;
  6. using System.Reflection.PortableExecutable;
  7. namespace CDPShared
  8. {
  9. // All the code in this file is included in all platforms.
  10. public class CDPWorker
  11. {
  12. private CircleAPIHelper _apiHelper;
  13. private string _userName = "";
  14. private string _machine = "";
  15. Boolean _bReady = false;
  16. public Boolean Ready => _bReady;
  17. public string Status
  18. {
  19. get
  20. {
  21. return _apiHelper.Status;
  22. }
  23. }
  24. // public CircleAPIHelper API => _apiHelper;
  25. public List<CircleInfo> Circles { get; set; }
  26. public string DefaultTopicId { get; set; } = "87654321-a314-4202-b959-c981a6bc3c24";
  27. public string DefaultCircleId { get; set; }
  28. public CDPWorker()
  29. {
  30. using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name))
  31. {
  32. Circles = new List<CircleInfo>();
  33. _apiHelper = new CircleAPIHelper(Constants.CustomerCode, Constants.AppKey, Constants.EndUserId, Constants.Secret);
  34. _userName = Environment.UserDomainName + "\\" + Environment.UserName;
  35. _machine = Environment.MachineName;
  36. Task.Run(async () => {await AsyncStartup(); });
  37. }
  38. }
  39. async Task AsyncStartup()
  40. {
  41. while (!_apiHelper.Ready)
  42. {
  43. Thread.Sleep(250);
  44. }
  45. Circles = await _apiHelper.EnumCircles();
  46. _bReady = true;
  47. }
  48. public async Task<DecryptReply> Decrypt(string file)
  49. {
  50. YellowFile yf = new YellowFile(file);
  51. DecryptRequest request = new DecryptRequest();
  52. request.CircleId = yf.CircleId;
  53. request.TopicId = yf.TopicId;
  54. request.ToDecrypt = Convert.ToBase64String(File.ReadAllBytes(file));
  55. DecryptReply result = null;
  56. result = await _apiHelper.Api.DecryptAsync(request, "Bearer " + _apiHelper.Token, "Dashboard");
  57. if (!result.Status.Result.GetValueOrDefault(false))
  58. return null;
  59. return result;
  60. }
  61. public async Task<CreateCircleReply> CreateCircle(string name, string description)
  62. {
  63. return await _apiHelper.CreateCircle(name, description);
  64. }
  65. public async Task<GenInviteReply> GenInvite(string circleId)
  66. {
  67. return await _apiHelper.GenInvite(circleId);
  68. }
  69. public async Task<ProcessInviteReply> ProcessInvite(string inviteCode, string authCode)
  70. {
  71. return await _apiHelper.ProcessInvite(inviteCode, authCode);
  72. }
  73. public async Task<RemoveMemberReply> RemoveMember(string circleId, string memberId)
  74. {
  75. return await _apiHelper.RemoveMember(circleId, memberId);
  76. }
  77. public async Task<List<ProfileInfo>> EnumCircleMembers(string circleId)
  78. {
  79. return await _apiHelper.EnumCircleMembers(circleId);
  80. }
  81. public async Task<CircleInfo> GetCircle(string circleId)
  82. {
  83. return await _apiHelper.GetCircleById(circleId);
  84. }
  85. public async Task<TopicInfo> GetTopic(string circleId, string topicId)
  86. {
  87. return await _apiHelper.GetTopicById(circleId, topicId);
  88. }
  89. public async Task TrackAuthorizedAccess(YellowFile yf, string fileName, Dictionary<string, string> metaData)
  90. {
  91. using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name))
  92. {
  93. try
  94. {
  95. DataGather g = new DataGather(_apiHelper);
  96. foreach (KeyValuePair<string, string> keyValuePair in metaData)
  97. {
  98. g.AddHead(keyValuePair.Key, keyValuePair.Value);
  99. }
  100. g.AddTail("File Id", yf.FileId);
  101. WhoAmIReply wr = await _apiHelper.WhoAmI(yf.CircleId);
  102. List<ProfileInfo> members = await _apiHelper.EnumCircleMembers(yf.CircleId);
  103. string senderName = yf.OwnerId;
  104. ProfileInfo sender = members.FirstOrDefault(dr => dr.ProfileId == yf.OwnerId);
  105. if (sender != null)
  106. senderName = sender.DisplayName;
  107. g.AddHead("Sender", senderName);
  108. g.AddTail("Sender Id", yf.OwnerId);
  109. string viewerName = "";
  110. ProfileInfo viewer = members.FirstOrDefault(dr => dr.ProfileId == wr.MemberId);
  111. if (viewer != null)
  112. viewerName = viewer.DisplayName;
  113. g.AddHead("Viewer", viewerName);
  114. g.AddTail("Viewer Id", wr.MemberId);
  115. yf.UpdateOwner(wr.MemberId);
  116. await AddMessage($"{fileName} decrypted by {_userName}", (Int32)CircleViewMessages.FileViewed, g);
  117. }
  118. catch (Exception e)
  119. {
  120. MinLogging.LogIt(e.Message);
  121. }
  122. }
  123. }
  124. public async Task TrackUnauthorizedAccess(YellowFile yf, string sourcePath)
  125. {
  126. using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name))
  127. {
  128. try
  129. {
  130. DataGather g = new DataGather(_apiHelper);
  131. g.AddHead($"Full path", sourcePath);
  132. g.AddTail("File Id", yf.FileId);
  133. string senderName = yf.OwnerId;
  134. g.AddTail("Sender Id", yf.OwnerId);
  135. string message = $"{_userName} was blocked attempting to view a protected file"; // we can't use the filename since it's in the encrypted header
  136. await PostCircleViewEvent(yf.CircleId, yf.FileId, (Int32)CircleViewMessages.BlockedViewAttempt, message, JsonConvert.SerializeObject(g.Gather()));
  137. }
  138. catch (Exception e)
  139. {
  140. MinLogging.LogIt(e.Message);
  141. }
  142. }
  143. }
  144. async Task PostCircleViewEvent(string circleId, string fileId, Int32 msgType, string message, string meta)
  145. {
  146. using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name))
  147. {
  148. var url = Constants.CircleViewEventUrl + "?circleId=" + circleId;
  149. var data = new
  150. {
  151. FileId = fileId,
  152. MsgId = Guid.NewGuid().ToString(),
  153. Event = DateTime.UtcNow,
  154. MsgType = msgType,
  155. Message = message,
  156. Meta = meta
  157. };
  158. try
  159. {
  160. HttpClient client = new HttpClient();
  161. var json = JsonConvert.SerializeObject(data);
  162. var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
  163. MinLogging.LogIt(url);
  164. MinLogging.LogIt(json);
  165. var response = await client.PostAsync(url, content);
  166. response.EnsureSuccessStatusCode();
  167. string result = await response.Content.ReadAsStringAsync();
  168. MinLogging.LogIt(result);
  169. }
  170. catch (Exception e)
  171. {
  172. MinLogging.LogIt(" **** " + e.Message);
  173. }
  174. }
  175. }
  176. public async Task<List<TopicInfo>> EnumTopics(string circleId)
  177. {
  178. return await _apiHelper.EnumTopics(circleId);
  179. }
  180. public async Task<byte[]> EncryptFile(string circleId, string topicId, string fileName)
  181. {
  182. return await _apiHelper.EncryptFile(circleId, topicId, fileName);
  183. }
  184. /// <summary>
  185. /// this adds a message to the default circle and topic
  186. /// </summary>
  187. public async Task<AddMessageReply> AddMessage(string message, Int32 msgId, DataGather g = null)
  188. {
  189. return await _apiHelper.AddMessage(DefaultCircleId, DefaultTopicId, message, msgId, g);
  190. }
  191. public async Task<GetMessagesReply> GetCircleViewMessages(string circleId = "", string topicId = "")
  192. {
  193. if (string.IsNullOrEmpty(circleId)) circleId = DefaultCircleId;
  194. if (string.IsNullOrEmpty(topicId)) topicId = DefaultTopicId;
  195. return await _apiHelper.GetCircleViewwMessages(circleId, topicId);
  196. }
  197. }
  198. }