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.
236 lines
8.6 KiB
236 lines
8.6 KiB
using System.Net.Http.Headers;
|
|
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<CircleInfo> 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<CircleInfo>();
|
|
|
|
_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<DecryptReply> 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;
|
|
}
|
|
|
|
public async Task<CreateCircleReply> CreateCircle(string name, string description)
|
|
{
|
|
return await _apiHelper.CreateCircle(name, description);
|
|
}
|
|
|
|
public async Task<GenInviteReply> GenInvite(string circleId)
|
|
{
|
|
return await _apiHelper.GenInvite(circleId);
|
|
}
|
|
|
|
public async Task<ProcessInviteReply> ProcessInvite(string inviteCode, string authCode)
|
|
{
|
|
return await _apiHelper.ProcessInvite(inviteCode, authCode);
|
|
}
|
|
|
|
public async Task<RemoveMemberReply> RemoveMember(string circleId, string memberId)
|
|
{
|
|
return await _apiHelper.RemoveMember(circleId, memberId);
|
|
}
|
|
|
|
public async Task<List<ProfileInfo>> EnumCircleMembers(string circleId)
|
|
{
|
|
return await _apiHelper.EnumCircleMembers(circleId);
|
|
}
|
|
|
|
public async Task<CircleInfo> GetCircle(string circleId)
|
|
{
|
|
return await _apiHelper.GetCircleById(circleId);
|
|
}
|
|
|
|
public async Task<TopicInfo> GetTopic(string circleId, string topicId)
|
|
{
|
|
return await _apiHelper.GetTopicById(circleId, topicId);
|
|
}
|
|
|
|
public async Task TrackAuthorizedAccess(YellowFile yf, string fileName, Dictionary<string, string> metaData)
|
|
{
|
|
using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name))
|
|
{
|
|
try
|
|
{
|
|
DataGather g = new DataGather(_apiHelper);
|
|
foreach (KeyValuePair<string, string> keyValuePair in metaData)
|
|
{
|
|
g.AddHead(keyValuePair.Key, keyValuePair.Value);
|
|
}
|
|
g.AddTail("File Id", yf.FileId);
|
|
|
|
WhoAmIReply wr = await _apiHelper.WhoAmI(yf.CircleId);
|
|
List<ProfileInfo> 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<List<TopicInfo>> EnumTopics(string circleId)
|
|
{
|
|
return await _apiHelper.EnumTopics(circleId);
|
|
}
|
|
|
|
public async Task<byte[]> EncryptFile(string circleId, string topicId, string fileName)
|
|
{
|
|
return await _apiHelper.EncryptFile(circleId, topicId, fileName);
|
|
}
|
|
/// <summary>
|
|
/// this adds a message to the default circle and topic
|
|
/// </summary>
|
|
public async Task<AddMessageReply> AddMessage(string message, Int32 msgId, DataGather g = null)
|
|
{
|
|
return await _apiHelper.AddMessage(DefaultCircleId, DefaultTopicId, message, msgId, g);
|
|
}
|
|
public async Task<GetMessagesReply> GetCircleViewMessages(string circleId = "", string topicId = "")
|
|
{
|
|
if (string.IsNullOrEmpty(circleId)) circleId = DefaultCircleId;
|
|
if (string.IsNullOrEmpty(topicId)) topicId = DefaultTopicId;
|
|
return await _apiHelper.GetCircleViewwMessages(circleId, topicId);
|
|
}
|
|
|
|
}
|
|
}
|