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.
 
 

212 lines
7.7 KiB

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;
//byte[] buf = Convert.FromBase64String(result.DecryptedData);
//string ext = Path.GetExtension(result.FileName);
//fileName = result.FileName;
//return buf;
}
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 API.AddMessage(DefaultCircleId, DefaultTopicId, message, msgId, g);
}
public async Task<GetMessagesReply> GetCircleViewwMessages()
{
return await API.GetCircleViewwMessages(DefaultCircleId, DefaultTopicId);
}
}
}