Browse Source

first commit

master
gene 2 years ago
commit
dbbd7a486b
  1. 21
      CDPShared/CDPShared.csproj
  2. 212
      CDPShared/CDPWorker.cs
  3. 331
      CDPShared/CircleAPIHelper.cs
  4. 60
      CDPShared/Constants.cs
  5. 185
      CDPShared/DataGather.cs
  6. 101
      CDPShared/MinLogging.cs
  7. 74
      CDPShared/YellowSupport.cs
  8. 113
      CDPShared/bin/Debug/net7.0/CDPShared.deps.json
  9. BIN
      CDPShared/bin/Debug/net7.0/CDPShared.dll
  10. BIN
      CDPShared/bin/Debug/net7.0/CDPShared.pdb
  11. BIN
      CDPShared/bin/Debug/net7.0/CircleSDK.dll
  12. BIN
      CDPShared/bin/Debug/net7.0/CircleSDK.pdb
  13. 88
      CDPShared/obj/CDPShared.csproj.nuget.dgspec.json
  14. 18
      CDPShared/obj/CDPShared.csproj.nuget.g.props
  15. 2
      CDPShared/obj/CDPShared.csproj.nuget.g.targets
  16. 4
      CDPShared/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs
  17. 23
      CDPShared/obj/Debug/net7.0/CDPShared.AssemblyInfo.cs
  18. 1
      CDPShared/obj/Debug/net7.0/CDPShared.AssemblyInfoInputs.cache
  19. 11
      CDPShared/obj/Debug/net7.0/CDPShared.GeneratedMSBuildEditorConfig.editorconfig
  20. 8
      CDPShared/obj/Debug/net7.0/CDPShared.GlobalUsings.g.cs
  21. BIN
      CDPShared/obj/Debug/net7.0/CDPShared.assets.cache
  22. BIN
      CDPShared/obj/Debug/net7.0/CDPShared.csproj.AssemblyReference.cache
  23. 0
      CDPShared/obj/Debug/net7.0/CDPShared.csproj.BuildWithSkipAnalyzers
  24. 0
      CDPShared/obj/Debug/net7.0/CDPShared.csproj.CopyComplete
  25. 1
      CDPShared/obj/Debug/net7.0/CDPShared.csproj.CoreCompileInputs.cache
  26. 20
      CDPShared/obj/Debug/net7.0/CDPShared.csproj.FileListAbsolute.txt
  27. BIN
      CDPShared/obj/Debug/net7.0/CDPShared.dll
  28. BIN
      CDPShared/obj/Debug/net7.0/CDPShared.pdb
  29. BIN
      CDPShared/obj/Debug/net7.0/ref/CDPShared.dll
  30. BIN
      CDPShared/obj/Debug/net7.0/refint/CDPShared.dll
  31. 278
      CDPShared/obj/project.assets.json
  32. 20
      CDPShared/obj/project.nuget.cache
  33. BIN
      CircleViewer/.vs/CircleViewer/DesignTimeBuild/.dtbcache.v2
  34. BIN
      CircleViewer/.vs/CircleViewer/FileContentIndex/10ed128a-d893-46cb-8aab-d26b54deee44.vsidx
  35. BIN
      CircleViewer/.vs/CircleViewer/FileContentIndex/18f06a28-74cf-4f20-8d99-44a6a34145c0.vsidx
  36. BIN
      CircleViewer/.vs/CircleViewer/FileContentIndex/5bbed564-64e6-45d0-aa62-25b57de649f3.vsidx
  37. BIN
      CircleViewer/.vs/CircleViewer/FileContentIndex/7f0e7f39-6fff-4f66-ab58-d81903bd964f.vsidx
  38. 0
      CircleViewer/.vs/CircleViewer/FileContentIndex/read.lock
  39. BIN
      CircleViewer/.vs/CircleViewer/v16/.suo
  40. BIN
      CircleViewer/.vs/CircleViewer/v17/.futdcache.v2
  41. BIN
      CircleViewer/.vs/CircleViewer/v17/.suo
  42. BIN
      CircleViewer/.vs/CircleViewer/v17/fileList.bin
  43. BIN
      CircleViewer/.vs/ProjectEvaluation/circleviewer.metadata.v6.1
  44. BIN
      CircleViewer/.vs/ProjectEvaluation/circleviewer.projects.v6.1
  45. 29
      CircleViewer/App.config
  46. 86
      CircleViewer/CircleViewer.csproj
  47. 48
      CircleViewer/CircleViewer.csproj.user
  48. 39
      CircleViewer/CircleViewer.sln
  49. 4
      CircleViewer/CircleViewer.sln.DotSettings.user
  50. 63
      CircleViewer/Constants.cs
  51. 46
      CircleViewer/DetailsCmd.cs
  52. 170
      CircleViewer/Dialogs/ActivityDlg.Designer.cs
  53. 115
      CircleViewer/Dialogs/ActivityDlg.cs
  54. 407
      CircleViewer/Dialogs/ActivityDlg.resx
  55. 93
      CircleViewer/Dialogs/ActivityDlgDefault.Designer.cs
  56. 156
      CircleViewer/Dialogs/ActivityDlgDefault.cs
  57. 407
      CircleViewer/Dialogs/ActivityDlgDefault.resx
  58. 144
      CircleViewer/Dialogs/CreateCircleDlg.Designer.cs
  59. 37
      CircleViewer/Dialogs/CreateCircleDlg.cs
  60. 407
      CircleViewer/Dialogs/CreateCircleDlg.resx
  61. 77
      CircleViewer/Dialogs/FilePropertiesDlg.Designer.cs
  62. 39
      CircleViewer/Dialogs/FilePropertiesDlg.cs
  63. 407
      CircleViewer/Dialogs/FilePropertiesDlg.resx
  64. 141
      CircleViewer/Dialogs/InviteMemberDlg.Designer.cs
  65. 51
      CircleViewer/Dialogs/InviteMemberDlg.cs
  66. 410
      CircleViewer/Dialogs/InviteMemberDlg.resx
  67. 141
      CircleViewer/Dialogs/JoinCircleDlg.Designer.cs
  68. 30
      CircleViewer/Dialogs/JoinCircleDlg.cs
  69. 407
      CircleViewer/Dialogs/JoinCircleDlg.resx
  70. 47
      CircleViewer/Dialogs/LicenseDlg.Designer.cs
  71. 20
      CircleViewer/Dialogs/LicenseDlg.cs
  72. 120
      CircleViewer/Dialogs/LicenseDlg.resx
  73. 130
      CircleViewer/Dialogs/RevokeDeviceDlg.Designer.cs
  74. 36
      CircleViewer/Dialogs/RevokeDeviceDlg.cs
  75. 407
      CircleViewer/Dialogs/RevokeDeviceDlg.resx
  76. 127
      CircleViewer/Dialogs/RevokeDlg.Designer.cs
  77. 20
      CircleViewer/Dialogs/RevokeDlg.cs
  78. 407
      CircleViewer/Dialogs/RevokeDlg.resx
  79. 133
      CircleViewer/Dialogs/RevokeMemberDlg.Designer.cs
  80. 59
      CircleViewer/Dialogs/RevokeMemberDlg.cs
  81. 407
      CircleViewer/Dialogs/RevokeMemberDlg.resx
  82. 196
      CircleViewer/Dialogs/SecureFileDlg.Designer.cs
  83. 140
      CircleViewer/Dialogs/SecureFileDlg.cs
  84. 1828
      CircleViewer/Dialogs/SecureFileDlg.resx
  85. 78
      CircleViewer/Dialogs/ViewMetaDlg.Designer.cs
  86. 65
      CircleViewer/Dialogs/ViewMetaDlg.cs
  87. 407
      CircleViewer/Dialogs/ViewMetaDlg.resx
  88. 374
      CircleViewer/Form1.Designer.cs
  89. 521
      CircleViewer/Form1.cs
  90. 799
      CircleViewer/Form1.resx
  91. 104
      CircleViewer/Logging.cs
  92. BIN
      CircleViewer/LogoCircle.ico
  93. BIN
      CircleViewer/LogoCircle.png
  94. 149
      CircleViewer/Models/ActivityRow.cs
  95. 26
      CircleViewer/Models/CircleViewEventRecord.cs
  96. 54
      CircleViewer/Program.cs
  97. 36
      CircleViewer/Properties/AssemblyInfo.cs
  98. 103
      CircleViewer/Properties/Resources.Designer.cs
  99. 133
      CircleViewer/Properties/Resources.resx
  100. 50
      CircleViewer/Properties/Settings.Designer.cs

21
CDPShared/CDPShared.csproj

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="RestSharp" Version="106.15.0" />
<PackageReference Include="System.Management" Version="7.0.1" />
</ItemGroup>
<ItemGroup>
<Reference Include="CircleSDK">
<HintPath>..\csharp\src\CircleSDK\bin\Debug\netstandard2.0\CircleSDK.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

212
CDPShared/CDPWorker.cs

@ -0,0 +1,212 @@
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);
}
}
}

331
CDPShared/CircleAPIHelper.cs

@ -0,0 +1,331 @@
using CircleSDK.Api;
using CircleSDK.Model;
using System.Diagnostics;
using System.Net.WebSockets;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;
namespace CDPShared
{
public class CircleAPIHelper
{
private string _customerCode;
private string _appKey;
private string _endUserId;
private string _secret;
private ClientWebSocket _socket;
private CancellationTokenSource _cts;
private string _token; // this needs to be kept up to date
public string Token => _token;
private Timer _refreshToken;
private CircleApi _api;
public CircleApi Api => _api;
private Boolean _authorized = false;
public Boolean Ready => _authorized;
public string Status { get; set; }
public CircleAPIHelper(string customerCode, string appKey, string endUserId, string secret)
{
_api = new CircleApi(); // to use CircleAPI, you need RESTSharp v105.0.0
_customerCode = customerCode;
_appKey = appKey;
_endUserId = endUserId;
_secret = secret;
_refreshToken = new Timer(RefreshToken, null, 100, 5 * 1000); // check every 30 seconds
Status = "Starting up";
}
private void RefreshToken(object state)
{
Status = "Looking for Circle Service";
Boolean bCircleServiceExists = Process.GetProcesses().Any(dr => (dr.ProcessName.ToLower() == "CircleServiceDebug".ToLower()) || (dr.ProcessName.ToLower() == "CircleService".ToLower()));
if (bCircleServiceExists)
{
// we found the service, switch to refresh every 9 minutes.
_refreshToken.Change(9 * 60 * 1000, 9 * 60 * 1000);
GetToken();
Authorize();
}
}
void GetToken()
{
Status = "Getting permission to call Circle Service.";
string nonce = Guid.NewGuid().ToString();
string query = string.Format($"customerId={_customerCode}&AppKey={_appKey}&EndUserId={_endUserId}&nonce={nonce}");
string signature = ComputeSignature(query, _secret);
string fullLine = query + "&signature=" + signature;
WebClient wc = new WebClient();
try
{
string s = wc.DownloadString("https://api.gocircle.ai/api/token?" + fullLine);
s = s.Replace("\\\"", "\"").Trim('\"');
PrettyJWT pt = JsonConvert.DeserializeObject<PrettyJWT>(s);
_token = pt.Token;
}
catch (Exception e)
{
Status = "Unable to get token.";
}
}
string ComputeSignature(string stringToSign, string secret)
{
using (var hmacsha256 = new HMACSHA256(System.Text.ASCIIEncoding.UTF8.GetBytes(secret)))
{
var bytes = Encoding.ASCII.GetBytes(stringToSign);
var hashedBytes = hmacsha256.ComputeHash(bytes);
return Convert.ToBase64String(hashedBytes);
}
}
private void Authorize()
{
Status = "Asking Circle Service for authorization";
var body = new AppAuthorizationRequest(); // AppAuthorizationRequest |
body.Token = _token;
_api.Configuration.AccessToken = _token;
var xCircleAppkey = "Dashboard"; // String | Application `AppKey`
try
{
// authorize
AppAuthorizationReply result = _api.Authorize(body, xCircleAppkey);
_authorized = true;
Debug.WriteLine(result);
Status = "Authorized to use Circle Service";
}
catch (Exception ex)
{
Debug.Print("Exception when calling CircleApi.authorize: " + ex.Message);
_authorized = false;
return;
}
}
public async Task<WhoAmIReply> WhoAmI(string circleId)
{
WhoAmIRequest body = new WhoAmIRequest();
body.CircleId = circleId;
WhoAmIReply result = await _api.WhoAmIAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result;
}
return null;
}
public async Task<CreateCircleReply> CreateCircle(string name, string description)
{
CreateCircleRequest body = new CreateCircleRequest();
body.CircleName = name;
body.CircleDescription = description;
body.CustomerId = Constants.CustomerCode;
body.CustomerToken = Constants.AuthCode;
CreateCircleReply result = await _api.CreateCircleAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result;
}
return null;
}
public async Task<GenInviteReply> GenInvite(string circleId)
{
GenInviteRequest body = new GenInviteRequest();
body.CircleId = circleId;
body.IsAddDevice = false;
GenInviteReply result = await _api.GenInviteAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result;
}
return null;
}
public async Task<ProcessInviteReply> ProcessInvite(string inviteCode, string authCode)
{
ProcessInviteRequest body = new ProcessInviteRequest();
body.InviteId = inviteCode;
body.AuthCode = authCode;
body.Wait20Second = true;
ProcessInviteReply result = await _api.ProcessInviteAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result;
}
return null;
}
public async Task<RevokeDeviceReply> RevokeDevice(string circleId, string deviceId)
{
RevokeDeviceRequest body = new RevokeDeviceRequest();
body.CircleId = circleId;
body.DeviceId = deviceId;
RevokeDeviceReply result = await _api.RevokeDeviceAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result;
}
return null;
}
public async Task<RemoveMemberReply> RemoveMember(string circleId, string memberId)
{
RemoveMemberRequest body = new RemoveMemberRequest();
body.CircleId = circleId;
body.MemberId = memberId;
RemoveMemberReply result = await _api.RemoveMemberAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result;
}
return null;
}
public async Task<List<ProfileInfo>> EnumCircleMembers(string circleId)
{
EnumCircleMembersRequest body = new EnumCircleMembersRequest();
body.CircleId = circleId;
EnumCircleMembersReply result = await _api.EnumCircleMembersAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result.Profiles;
}
return null;
}
public async Task<List<ProfileInfo>> EnumTopicMembers(string circleId, string topicId)
{
EnumTopicMembersRequest body = new EnumTopicMembersRequest();
body.CircleId = circleId;
body.TopicId = topicId;
EnumTopicMembersReply result = await _api.EnumTopicMembersAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result.Profiles;
}
return null;
}
public async Task<List<CircleInfo>> EnumCircles()
{
EnumCirclesRequest body = new EnumCirclesRequest();
EnumCirclesReply result = await _api.EnumCirclesAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result.CircleMeta;
}
return null;
}
public async Task<CircleInfo> GetCircleById(string circleId)
{
List<CircleInfo> circles = await EnumCircles();
if (circles == null)
return null;
foreach (CircleInfo info in circles)
{
if (string.Compare(info.CircleId, circleId,
StringComparison.CurrentCultureIgnoreCase) == 0)
{
return info;
}
}
return null;
}
public async Task<List<TopicInfo>> EnumTopics(string circleId)
{
EnumTopicsRequest body = new EnumTopicsRequest();
body.CircleId = circleId;
EnumTopicsReply result = await _api.EnumTopicsAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return result.Topics;
}
return null;
}
public async Task<TopicInfo> GetTopicById(string circleId, string topicId)
{
List<TopicInfo> topics = await EnumTopics(circleId);
foreach (TopicInfo info in topics)
{
if (string.Compare(info.TopicId, topicId,
StringComparison.CurrentCultureIgnoreCase) == 0)
{
return info;
}
}
return null;
}
public async Task<byte[]> EncryptFile(string circleId, string topicId, string filename)
{
EncryptRequest body = new EncryptRequest();
body.CircleId = circleId;
body.TopicId = topicId;
body.FileName = filename;
try
{
body.ToEncrypt = Convert.ToBase64String(File.ReadAllBytes(filename));
EncryptReply result = await _api.EncryptAsync(body, "Bearer " + Token, "Dashboard");
if (result.Status.Result.GetValueOrDefault(false))
{
return Convert.FromBase64String(result.EncryptedData);
}
}
catch (Exception e)
{
MinLogging.LogIt(" **** " + e.Message);
}
return null;
}
public async Task<AddMessageReply> AddMessage(string circleId, string topicId, string message, Int32 msgId, DataGather g = null)
{
if (g == null)
g = new DataGather(this);
AddMessageRequest msg = new AddMessageRequest(circleId, topicId, msgId);
msg.Message = message;
msg.AdditionalJson = JsonConvert.SerializeObject(g.Gather());
return await Api.AddMessageAsync(msg, "Bearer " + Token, "Dashboard");
}
public async Task<GetMessagesReply> GetCircleViewwMessages(string circleId, string topicId)
{
GetMessagesRequest gm = new GetMessagesRequest(circleId, topicId)
{
MsgTypeFilters = new List<int?>()
};
for (int i = (Int32)CircleViewMessages.FileViewed; i < (Int32)CircleViewMessages.LastMessage; i++)
{
gm.MsgTypeFilters.Add(i);
}
return await Api.GetMessagesAsync(gm, "Bearer " + Token, "Dashboard");
}
//public async Task<SetProfilePropertyReply> SetProfileProperty(string circleId, string name, string value)
//{
// SetProfilePropertyRequest gm = new SetProfilePropertyRequest(circleId, name, value);
// return await Api.SetProfilePropertyAsync(gm, "Bearer " + Token, "Dashboard");
//}
}
class PrettyJWT
{
public string Token { get; set; }
public DateTime Expiry { get; set; }
}
}

60
CDPShared/Constants.cs

@ -0,0 +1,60 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CDPShared
{
public class Constants
{
public static string CircleFolder
{
get
{
var folder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Circle");
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
return folder;
}
}
public static List<string> SupportedFiles
{
get
{
return new List<string>
{
".gif",
".jpeg",
".jpg",
".png",
".pdf"
};
}
}
public const string CustomerCode = "CIRCLE";
public const string AuthCode = "ORAMA";
public const string AppKey = "Dashboard";
public const string EndUserId = "userman";
public const string Secret = "2FDA4588-774B-4FA6-8B3D-6F08F5FA6E90";
public const string CircleViewEventUrl = "https://circlecloudfuncstaging.azurewebsites.net/api/CircleViewEvent";
}
// CircleView Messages
// for circle service to persist these messages, they have to be between 100000 and 1000000
public enum CircleViewMessages
{
FileViewed = 10001,
FileEncrypted = 10002,
InviteGenerated = 10003,
VerificationRequested = 10004,
// CircleCreated = 10005, // can't have this one since this is above the circle
MemberRevoked = 10006,
DeviceRevoked = 10007,
BlockedViewAttempt = 10008,
Unknown = 10009,
LastMessage = 10010 // don't use this one except for looping.
}
}

185
CDPShared/DataGather.cs

@ -0,0 +1,185 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading.Tasks;
namespace CDPShared
{
public class DataGather
{
private CircleAPIHelper _apiHelper;
List<string> _meta;
List<string> _head;
List<string> _tail;
public List<string> Meta
{
get
{
return _meta;
}
}
public DataGather(CircleAPIHelper apiHelper)
{
_apiHelper = apiHelper;
_meta = new List<string>();
_head = new List<string>();
_tail = new List<string>();
}
public void AddHead(string name, string value)
{
_head.Add(name + "|" + value);
}
public void AddTail(string name, string value)
{
_tail.Add(name + "|" + value);
}
public List<string> Gather()
{
try
{
_meta.AddRange(_head);
_meta.AddRange(GetSystemWMIStuff());
_meta.AddRange(GetSecurityWMIStuff());
_meta.Add(GetCountry());
_meta.Add($"OS username|{Environment.UserDomainName + "\\" + Environment.UserName}");
_meta.Add($"Machine name|{Environment.MachineName}");
_meta.AddRange(_tail);
}
catch (Exception e)
{
}
return _meta;
}
string GetCountry()
{
CultureInfo culture = CultureInfo.CurrentCulture;
RegionInfo region = new RegionInfo(culture.LCID);
return $"Country|{region.DisplayName}";
}
List<string> GetSystemWMIStuff()
{
List<string> systemWmiStuff = new List<string>();
try
{
// Connect to the WMI namespace
ManagementScope scope = new ManagementScope(@"\\.\root\CIMV2");
scope.Connect();
string wql = @"SELECT * FROM Win32_OperatingSystem";
// Create a new WMI query object and execute the query
ObjectQuery query = new ObjectQuery(wql);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection results = searcher.Get();
foreach (ManagementObject result in results)
{
string OS = result.Properties["Caption"].Value.ToString();
systemWmiStuff.Add($"Operating system|{OS}");
}
// IP Addresses
wql = @"SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'";
// Create a new WMI query object and execute the query
query = new ObjectQuery(wql);
searcher = new ManagementObjectSearcher(scope, query);
results = searcher.Get();
foreach (ManagementObject result in results)
{
string[] ipAddresses = (string[])result["IPAddress"];
if (ipAddresses != null && ipAddresses.Length > 0)
{
systemWmiStuff.Add($"IP Address|{ipAddresses[0]}");
}
}
// TimeZone
wql = @"SELECT * FROM Win32_TimeZone";
// Create a new WMI query object and execute the query
query = new ObjectQuery(wql);
searcher = new ManagementObjectSearcher(scope, query);
results = searcher.Get();
foreach (ManagementObject result in results)
{
string timeZoneName = (string)result["Caption"];
systemWmiStuff.Add($"TimeZone|{timeZoneName}");
}
}
catch (Exception e)
{
MinLogging.LogIt(e.Message);
}
return systemWmiStuff;
}
List<string> GetSecurityWMIStuff()
{
List<string> securityWMIStuff = new List<string>();
try
{
// Connect to the WMI namespace
ManagementScope scope = new ManagementScope(@"\\.\root\SecurityCenter2");
scope.Connect();
// WMI query to get the current patch level for the antivirus program
string wql = @"SELECT * FROM AntiVirusProduct";
// Create a new WMI query object and execute the query
ObjectQuery query = new ObjectQuery(wql);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection results = searcher.Get();
foreach (ManagementObject result in results)
{
string name = result.Properties["displayName"].Value.ToString();
string signatureDate = result.Properties["timestamp"].Value.ToString();
uint state = Convert.ToUInt32(result.Properties["productState"].Value);
uint avState = (state >> 12) & 0xf; // https://mcpforlife.com/2020/04/14/how-to-resolve-this-state-value-of-av-providers/
string running = "";
switch (avState)
{
case 0:
running = "Off";
break;
case 1:
running = "On";
break;
case 2:
running = "Snoozed";
break;
case 3:
running = "Expired";
break;
default:
running = "Unknown";
break;
}
string avLine = string.Format($"AntiVirus|{name} Signature file: {signatureDate} Active: {running}");
securityWMIStuff.Add(avLine);
}
}
catch (Exception e)
{
MinLogging.LogIt(e.Message);
}
return securityWMIStuff;
}
}
}

101
CDPShared/MinLogging.cs

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CDPShared
{
public class MinLogging
{
public string LoggerName = string.Empty;
static string LogFile = @"CircleViewer.txt";
static MinLogging()
{
try
{
LogFile = Path.Combine(Constants.CircleFolder, LogFile);
if (File.Exists(LogFile))
{
System.IO.FileInfo fi = new System.IO.FileInfo(LogFile);
if (fi.Length > 10000000) // don't let the log file get larger than 10MB
{
try
{
File.Delete(LogFile);
}
catch (Exception e)
{
Trace.WriteLine(e);
}
}
}
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
}
public static void LogIt(string str)
{
try
{
// only log to file if THIS is the same or higher level of detail as my desired logging level
str = string.Format("{0}|{1}|{2}", DateTime.Now, Thread.CurrentThread.ManagedThreadId, str);
lock (LogFile)
{
File.AppendAllText(LogFile, str + Environment.NewLine);
if (str.Length < 512)
{
byte[] data = Encoding.ASCII.GetBytes(str);
}
else
{
byte[] data = Encoding.ASCII.GetBytes(string.Format($"String to long. Length: {str.Length}"));
}
}
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
}
}
public class LogMethod : IDisposable
{
private string _methodName;
private Stopwatch _sw;
/// <summary>
/// Ctor now private - just called from the static Log method
/// </summary>
/// <param name="methodName">The name of the method being logged</param>
private LogMethod(string methodName)
{
_methodName = methodName;
_sw = new Stopwatch();
_sw.Start();
string msg = string.Format(">> Entering {0}", _methodName);
MinLogging.LogIt(msg);
}
/// <summary>
/// Tidy up
/// </summary>
public void Dispose()
{
_sw.Stop();
string msg = string.Format("<< Exiting {0}: elapsed Time: {1} ms", _methodName, _sw.ElapsedMilliseconds);
MinLogging.LogIt(msg);
}
public static IDisposable Log(string callingMethodTypeHardcode)
{
return new LogMethod(callingMethodTypeHardcode);
}
}
}

74
CDPShared/YellowSupport.cs

@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CDPShared
{
public class YellowFile
{
private string _filePath;
public string FileId { get; set; } // this is actually the FMAP Id internally
public string CloudId { get; set; } // this isn't being used yet. Gene 2021.11.17
public string CircleId { get; set; }
public string TopicId { get; set; }
public string DecryptionId { get; set; }
public string OwnerId { get; set; } // this is a device Id
public Int32 RevisionNo { get; set; }
public Int32 EncryptionMethod { get; set; }
public UInt64 EncryptedBlockSize { get; set; }
public DateTime FileAccessTime { get; set; } // I'm not sure when this gets 'set' or what it should be. but make it UTC
public DateTime FileModificationTime { get; set; } // this should be when the file header was built in UTC
public DateTime FileStatusTime { get; set; } // not sure on this one either.
public string Comment;
public YellowFile(string filePath)
{
_filePath = filePath;
using (FileStream fsIn = new FileStream(_filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
ReadHeader(fsIn);
}
}
protected void ReadHeader(FileStream fs)
{
BinaryReader br = new BinaryReader(fs);
var versionBytes = br.ReadBytes(8); // should be 'Circle1'
UInt64 encyptedDataPos = br.ReadUInt64();
FileId = new Guid(br.ReadBytes(16)).ToString();
CloudId = new Guid(br.ReadBytes(16)).ToString();
CircleId = new Guid(br.ReadBytes(16)).ToString();
TopicId = new Guid(br.ReadBytes(16)).ToString();
DecryptionId = new Guid(br.ReadBytes(16)).ToString();
OwnerId = new Guid(br.ReadBytes(16)).ToString();
// the file format has IV being 32 byte, but we only need 16
br.ReadBytes(16); // skip over IV
br.ReadBytes(16); // skip over the extra 16 bytes
RevisionNo = br.ReadInt32();
EncryptionMethod = br.ReadInt32();
EncryptedBlockSize = br.ReadUInt64();
FileAccessTime = DateTime.FromBinary(br.ReadInt64());
FileModificationTime = DateTime.FromBinary(br.ReadInt64());
FileStatusTime = DateTime.FromBinary(br.ReadInt64());
Comment = Encoding.Unicode.GetString(br.ReadBytes(256)).Trim('\0');
br.ReadBytes(40); // reserved
byte[] hash = br.ReadBytes(32);
Debug.Assert(fs.Position == 512);
}
public void UpdateOwner(string ownerId)
{
Guid owner = Guid.Parse(ownerId);
using (FileStream fs = new FileStream(_filePath, FileMode.Open))
{
fs.Position = 96;
byte[] guidBytes = owner.ToByteArray();
fs.Write(guidBytes, 0, guidBytes.Length);
}
}
}
}

113
CDPShared/bin/Debug/net7.0/CDPShared.deps.json

@ -0,0 +1,113 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"CDPShared/1.0.0": {
"dependencies": {
"Newtonsoft.Json": "13.0.3",
"RestSharp": "106.15.0",
"System.Management": "7.0.1",
"CircleSDK": "1.0.0.0"
},
"runtime": {
"CDPShared.dll": {}
}
},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
},
"RestSharp/106.15.0": {
"runtime": {
"lib/netstandard2.0/RestSharp.dll": {
"assemblyVersion": "106.15.0.0",
"fileVersion": "106.15.0.0"
}
}
},
"System.CodeDom/7.0.0": {
"runtime": {
"lib/net7.0/System.CodeDom.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Management/7.0.1": {
"dependencies": {
"System.CodeDom": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Management.dll": {
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.523.17405"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Management.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.523.17405"
}
}
},
"CircleSDK/1.0.0.0": {
"runtime": {
"CircleSDK.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
}
}
},
"libraries": {
"CDPShared/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
},
"RestSharp/106.15.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HM7ohR6AscxedNenrrl93DSZG6hvdnA7O+NHyCl/6ZKTfn8psQ9rRmUpcb9eWr+140vmfxoVemql0bUoeGEW3A==",
"path": "restsharp/106.15.0",
"hashPath": "restsharp.106.15.0.nupkg.sha512"
},
"System.CodeDom/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-GLltyqEsE5/3IE+zYRP5sNa1l44qKl9v+bfdMcwg+M9qnQf47wK3H0SUR/T+3N4JEQXF3vV4CSuuo0rsg+nq2A==",
"path": "system.codedom/7.0.0",
"hashPath": "system.codedom.7.0.0.nupkg.sha512"
},
"System.Management/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pHg4hGr/dn5wYdJ+kolMY4gkCIzFDRj/HFqoPq7e5h7OGii6BCBmS2/+ysC2SSoB5WvIDS29DMM5DowxxSY/oA==",
"path": "system.management/7.0.1",
"hashPath": "system.management.7.0.1.nupkg.sha512"
},
"CircleSDK/1.0.0.0": {
"type": "reference",
"serviceable": false,
"sha512": ""
}
}
}

BIN
CDPShared/bin/Debug/net7.0/CDPShared.dll

BIN
CDPShared/bin/Debug/net7.0/CDPShared.pdb

BIN
CDPShared/bin/Debug/net7.0/CircleSDK.dll

BIN
CDPShared/bin/Debug/net7.0/CircleSDK.pdb

88
CDPShared/obj/CDPShared.csproj.nuget.dgspec.json

@ -0,0 +1,88 @@
{
"format": 1,
"restore": {
"D:\\test\\CDPShared\\CDPShared.csproj": {}
},
"projects": {
"D:\\test\\CDPShared\\CDPShared.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "D:\\test\\CDPShared\\CDPShared.csproj",
"projectName": "CDPShared",
"projectPath": "D:\\test\\CDPShared\\CDPShared.csproj",
"packagesPath": "C:\\Users\\allengb.BYSTORM\\.nuget\\packages\\",
"outputPath": "D:\\test\\CDPShared\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages",
"C:\\Program Files (x86)\\Microsoft\\Xamarin\\NuGet\\",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\allengb.BYSTORM\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 18.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Xamarin.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\DevExpress 18.2\\Components\\System\\Components\\Packages": {},
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"http://nuget.syncfusion.com/nuget_xamarin/nuget/getsyncfusionpackages/xamarin": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"Newtonsoft.Json": {
"target": "Package",
"version": "[13.0.3, )"
},
"RestSharp": {
"target": "Package",
"version": "[106.15.0, )"
},
"System.Management": {
"target": "Package",
"version": "[7.0.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.203\\RuntimeIdentifierGraph.json"
}
}
}
}
}

18
CDPShared/obj/CDPShared.csproj.nuget.g.props

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\allengb.BYSTORM\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages;C:\Program Files (x86)\Microsoft\Xamarin\NuGet\;C:\Program Files\dotnet\sdk\NuGetFallbackFolder</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\allengb.BYSTORM\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft\Xamarin\NuGet\" />
<SourceRoot Include="C:\Program Files\dotnet\sdk\NuGetFallbackFolder\" />
</ItemGroup>
</Project>

2
CDPShared/obj/CDPShared.csproj.nuget.g.targets

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

4
CDPShared/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

23
CDPShared/obj/Debug/net7.0/CDPShared.AssemblyInfo.cs

@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("CDPShared")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("CDPShared")]
[assembly: System.Reflection.AssemblyTitleAttribute("CDPShared")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

1
CDPShared/obj/Debug/net7.0/CDPShared.AssemblyInfoInputs.cache

@ -0,0 +1 @@
408d0129df1cb88cad05ff3307a4eaa97649a816

11
CDPShared/obj/Debug/net7.0/CDPShared.GeneratedMSBuildEditorConfig.editorconfig

@ -0,0 +1,11 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = CDPShared
build_property.ProjectDir = D:\test\CDPShared\

8
CDPShared/obj/Debug/net7.0/CDPShared.GlobalUsings.g.cs

@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

BIN
CDPShared/obj/Debug/net7.0/CDPShared.assets.cache

BIN
CDPShared/obj/Debug/net7.0/CDPShared.csproj.AssemblyReference.cache

0
CDPShared/obj/Debug/net7.0/CDPShared.csproj.BuildWithSkipAnalyzers

0
CDPShared/obj/Debug/net7.0/CDPShared.csproj.CopyComplete

1
CDPShared/obj/Debug/net7.0/CDPShared.csproj.CoreCompileInputs.cache

@ -0,0 +1 @@
547ad06410e0145f43d14b53d509d952c7bbefce

20
CDPShared/obj/Debug/net7.0/CDPShared.csproj.FileListAbsolute.txt

@ -0,0 +1,20 @@
D:\test\CDP\CDPShared\obj\Debug\net7.0\CDPShared.csproj.AssemblyReference.cache
D:\test\CDP\CDPShared\obj\Debug\net7.0\CDPShared.GeneratedMSBuildEditorConfig.editorconfig
D:\test\CDP\CDPShared\obj\Debug\net7.0\CDPShared.AssemblyInfoInputs.cache
D:\test\CDP\CDPShared\obj\Debug\net7.0\CDPShared.AssemblyInfo.cs
D:\test\CDP\CDPShared\obj\Debug\net7.0\CDPShared.csproj.CoreCompileInputs.cache
D:\test\CDPShared\bin\Debug\net7.0\CDPShared.deps.json
D:\test\CDPShared\bin\Debug\net7.0\CDPShared.dll
D:\test\CDPShared\bin\Debug\net7.0\CDPShared.pdb
D:\test\CDPShared\bin\Debug\net7.0\CircleSDK.dll
D:\test\CDPShared\bin\Debug\net7.0\CircleSDK.pdb
D:\test\CDPShared\obj\Debug\net7.0\CDPShared.csproj.AssemblyReference.cache
D:\test\CDPShared\obj\Debug\net7.0\CDPShared.GeneratedMSBuildEditorConfig.editorconfig
D:\test\CDPShared\obj\Debug\net7.0\CDPShared.AssemblyInfoInputs.cache
D:\test\CDPShared\obj\Debug\net7.0\CDPShared.AssemblyInfo.cs
D:\test\CDPShared\obj\Debug\net7.0\CDPShared.csproj.CoreCompileInputs.cache
D:\test\CDPShared\obj\Debug\net7.0\CDPShared.csproj.CopyComplete
D:\test\CDPShared\obj\Debug\net7.0\CDPShared.dll
D:\test\CDPShared\obj\Debug\net7.0\refint\CDPShared.dll
D:\test\CDPShared\obj\Debug\net7.0\CDPShared.pdb
D:\test\CDPShared\obj\Debug\net7.0\ref\CDPShared.dll

BIN
CDPShared/obj/Debug/net7.0/CDPShared.dll

BIN
CDPShared/obj/Debug/net7.0/CDPShared.pdb

BIN
CDPShared/obj/Debug/net7.0/ref/CDPShared.dll

BIN
CDPShared/obj/Debug/net7.0/refint/CDPShared.dll

278
CDPShared/obj/project.assets.json

@ -0,0 +1,278 @@
{
"version": 3,
"targets": {
"net7.0": {
"Newtonsoft.Json/13.0.3": {
"type": "package",
"compile": {
"lib/net6.0/Newtonsoft.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"related": ".xml"
}
}
},
"RestSharp/106.15.0": {
"type": "package",
"compile": {
"lib/netstandard2.0/RestSharp.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/RestSharp.dll": {
"related": ".xml"
}
}
},
"System.CodeDom/7.0.0": {
"type": "package",
"compile": {
"lib/net7.0/System.CodeDom.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net7.0/System.CodeDom.dll": {
"related": ".xml"
}
},
"build": {
"buildTransitive/net6.0/_._": {}
}
},
"System.Management/7.0.1": {
"type": "package",
"dependencies": {
"System.CodeDom": "7.0.0"
},
"compile": {
"lib/net7.0/System.Management.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net7.0/System.Management.dll": {
"related": ".xml"
}
},
"build": {
"buildTransitive/net6.0/_._": {}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Management.dll": {
"assetType": "runtime",
"rid": "win"
}
}
}
}
},
"libraries": {
"Newtonsoft.Json/13.0.3": {
"sha512": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"type": "package",
"path": "newtonsoft.json/13.0.3",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net20/Newtonsoft.Json.dll",
"lib/net20/Newtonsoft.Json.xml",
"lib/net35/Newtonsoft.Json.dll",
"lib/net35/Newtonsoft.Json.xml",
"lib/net40/Newtonsoft.Json.dll",
"lib/net40/Newtonsoft.Json.xml",
"lib/net45/Newtonsoft.Json.dll",
"lib/net45/Newtonsoft.Json.xml",
"lib/net6.0/Newtonsoft.Json.dll",
"lib/net6.0/Newtonsoft.Json.xml",
"lib/netstandard1.0/Newtonsoft.Json.dll",
"lib/netstandard1.0/Newtonsoft.Json.xml",
"lib/netstandard1.3/Newtonsoft.Json.dll",
"lib/netstandard1.3/Newtonsoft.Json.xml",
"lib/netstandard2.0/Newtonsoft.Json.dll",
"lib/netstandard2.0/Newtonsoft.Json.xml",
"newtonsoft.json.13.0.3.nupkg.sha512",
"newtonsoft.json.nuspec",
"packageIcon.png"
]
},
"RestSharp/106.15.0": {
"sha512": "HM7ohR6AscxedNenrrl93DSZG6hvdnA7O+NHyCl/6ZKTfn8psQ9rRmUpcb9eWr+140vmfxoVemql0bUoeGEW3A==",
"type": "package",
"path": "restsharp/106.15.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net452/RestSharp.dll",
"lib/net452/RestSharp.xml",
"lib/netstandard2.0/RestSharp.dll",
"lib/netstandard2.0/RestSharp.xml",
"restsharp.106.15.0.nupkg.sha512",
"restsharp.nuspec",
"restsharp.png"
]
},
"System.CodeDom/7.0.0": {
"sha512": "GLltyqEsE5/3IE+zYRP5sNa1l44qKl9v+bfdMcwg+M9qnQf47wK3H0SUR/T+3N4JEQXF3vV4CSuuo0rsg+nq2A==",
"type": "package",
"path": "system.codedom/7.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"buildTransitive/net461/System.CodeDom.targets",
"buildTransitive/net462/_._",
"buildTransitive/net6.0/_._",
"buildTransitive/netcoreapp2.0/System.CodeDom.targets",
"lib/net462/System.CodeDom.dll",
"lib/net462/System.CodeDom.xml",
"lib/net6.0/System.CodeDom.dll",
"lib/net6.0/System.CodeDom.xml",
"lib/net7.0/System.CodeDom.dll",
"lib/net7.0/System.CodeDom.xml",
"lib/netstandard2.0/System.CodeDom.dll",
"lib/netstandard2.0/System.CodeDom.xml",
"system.codedom.7.0.0.nupkg.sha512",
"system.codedom.nuspec",
"useSharedDesignerContext.txt"
]
},
"System.Management/7.0.1": {
"sha512": "pHg4hGr/dn5wYdJ+kolMY4gkCIzFDRj/HFqoPq7e5h7OGii6BCBmS2/+ysC2SSoB5WvIDS29DMM5DowxxSY/oA==",
"type": "package",
"path": "system.management/7.0.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"buildTransitive/net6.0/_._",
"buildTransitive/netcoreapp2.0/System.Management.targets",
"lib/net462/_._",
"lib/net6.0/System.Management.dll",
"lib/net6.0/System.Management.xml",
"lib/net7.0/System.Management.dll",
"lib/net7.0/System.Management.xml",
"lib/netstandard2.0/System.Management.dll",
"lib/netstandard2.0/System.Management.xml",
"runtimes/win/lib/net6.0/System.Management.dll",
"runtimes/win/lib/net6.0/System.Management.xml",
"runtimes/win/lib/net7.0/System.Management.dll",
"runtimes/win/lib/net7.0/System.Management.xml",
"system.management.7.0.1.nupkg.sha512",
"system.management.nuspec",
"useSharedDesignerContext.txt"
]
}
},
"projectFileDependencyGroups": {
"net7.0": [
"Newtonsoft.Json >= 13.0.3",
"RestSharp >= 106.15.0",
"System.Management >= 7.0.1"
]
},
"packageFolders": {
"C:\\Users\\allengb.BYSTORM\\.nuget\\packages\\": {},
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {},
"C:\\Program Files (x86)\\Microsoft\\Xamarin\\NuGet\\": {},
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "D:\\test\\CDPShared\\CDPShared.csproj",
"projectName": "CDPShared",
"projectPath": "D:\\test\\CDPShared\\CDPShared.csproj",
"packagesPath": "C:\\Users\\allengb.BYSTORM\\.nuget\\packages\\",
"outputPath": "D:\\test\\CDPShared\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages",
"C:\\Program Files (x86)\\Microsoft\\Xamarin\\NuGet\\",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\allengb.BYSTORM\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 18.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Xamarin.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\DevExpress 18.2\\Components\\System\\Components\\Packages": {},
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"http://nuget.syncfusion.com/nuget_xamarin/nuget/getsyncfusionpackages/xamarin": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"Newtonsoft.Json": {
"target": "Package",
"version": "[13.0.3, )"
},
"RestSharp": {
"target": "Package",
"version": "[106.15.0, )"
},
"System.Management": {
"target": "Package",
"version": "[7.0.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.203\\RuntimeIdentifierGraph.json"
}
}
},
"logs": [
{
"code": "NU1803",
"level": "Warning",
"warningLevel": 1,
"message": "You are running the 'restore' operation with an 'HTTP' source, 'http://nuget.syncfusion.com/nuget_xamarin/nuget/getsyncfusionpackages/xamarin'. Non-HTTPS access will be removed in a future version. Consider migrating to an 'HTTPS' source."
}
]
}

20
CDPShared/obj/project.nuget.cache

@ -0,0 +1,20 @@
{
"version": 2,
"dgSpecHash": "cKNFvYGQ8lylySwxrmBzaMNBOfrf6B2bPMOj/CLhHiWKDAIJM8k+2vz5FTlszh+KtIglO7lTa0946Qp0LfeQbg==",
"success": true,
"projectFilePath": "D:\\test\\CDPShared\\CDPShared.csproj",
"expectedPackageFiles": [
"C:\\Users\\allengb.BYSTORM\\.nuget\\packages\\newtonsoft.json\\13.0.3\\newtonsoft.json.13.0.3.nupkg.sha512",
"C:\\Users\\allengb.BYSTORM\\.nuget\\packages\\restsharp\\106.15.0\\restsharp.106.15.0.nupkg.sha512",
"C:\\Users\\allengb.BYSTORM\\.nuget\\packages\\system.codedom\\7.0.0\\system.codedom.7.0.0.nupkg.sha512",
"C:\\Users\\allengb.BYSTORM\\.nuget\\packages\\system.management\\7.0.1\\system.management.7.0.1.nupkg.sha512"
],
"logs": [
{
"code": "NU1803",
"level": "Warning",
"warningLevel": 1,
"message": "You are running the 'restore' operation with an 'HTTP' source, 'http://nuget.syncfusion.com/nuget_xamarin/nuget/getsyncfusionpackages/xamarin'. Non-HTTPS access will be removed in a future version. Consider migrating to an 'HTTPS' source."
}
]
}

BIN
CircleViewer/.vs/CircleViewer/DesignTimeBuild/.dtbcache.v2

BIN
CircleViewer/.vs/CircleViewer/FileContentIndex/10ed128a-d893-46cb-8aab-d26b54deee44.vsidx

BIN
CircleViewer/.vs/CircleViewer/FileContentIndex/18f06a28-74cf-4f20-8d99-44a6a34145c0.vsidx

BIN
CircleViewer/.vs/CircleViewer/FileContentIndex/5bbed564-64e6-45d0-aa62-25b57de649f3.vsidx

BIN
CircleViewer/.vs/CircleViewer/FileContentIndex/7f0e7f39-6fff-4f66-ab58-d81903bd964f.vsidx

0
CircleViewer/.vs/CircleViewer/FileContentIndex/read.lock

BIN
CircleViewer/.vs/CircleViewer/v16/.suo

BIN
CircleViewer/.vs/CircleViewer/v17/.futdcache.v2

BIN
CircleViewer/.vs/CircleViewer/v17/.suo

BIN
CircleViewer/.vs/CircleViewer/v17/fileList.bin

BIN
CircleViewer/.vs/ProjectEvaluation/circleviewer.metadata.v6.1

BIN
CircleViewer/.vs/ProjectEvaluation/circleviewer.projects.v6.1

29
CircleViewer/App.config

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="CircleViewer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<userSettings>
<CircleViewer.Properties.Settings>
<setting name="DefaultCircleId" serializeAs="String">
<value />
</setting>
<setting name="DefaultTopicId" serializeAs="String">
<value />
</setting>
</CircleViewer.Properties.Settings>
</userSettings>
</configuration>

86
CircleViewer/CircleViewer.csproj

@ -0,0 +1,86 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<OutputType>WinExe</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>LogoCircle.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Content Include="LogoCircle.ico" />
</ItemGroup>
<ItemGroup>
<COMReference Include="AxSHDocVw">
<Guid>{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>1</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>aximp</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
<COMReference Include="AxWMPLib">
<Guid>{6BF52A50-394A-11D3-B153-00C04F79FAA6}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>aximp</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
<COMReference Include="SHDocVw">
<Guid>{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>1</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
<COMReference Include="WMPLib">
<Guid>{6BF52A50-394A-11D3-B153-00C04F79FAA6}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.4.421302">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Syncfusion.Grid.Windows" Version="19.4.0.38" />
<PackageReference Include="Syncfusion.PdfViewer.Windows" Version="19.4.0.38" />
<PackageReference Include="Syncfusion.SfDataGrid.WinForms" Version="19.4.0.38" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\CDPShared\CDPShared.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="CircleSDK">
<HintPath>..\csharp\src\CircleSDK\bin\Debug\netstandard2.0\CircleSDK.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
</Project>

48
CircleViewer/CircleViewer.csproj.user

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<StartArguments>
</StartArguments>
</PropertyGroup>
<ItemGroup>
<Compile Update="Dialogs\ActivityDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\ActivityDlgDefault.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\CreateCircleDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\FilePropertiesDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\InviteMemberDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\JoinCircleDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\LicenseDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\RevokeDeviceDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\RevokeDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\RevokeMemberDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\SecureFileDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\ViewMetaDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Form1.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

39
CircleViewer/CircleViewer.sln

@ -0,0 +1,39 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33530.505
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CircleViewer", "CircleViewer.csproj", "{4CC531F1-7EF4-414D-9434-2DD2C5CEF70E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CDPShared", "..\CDPShared\CDPShared.csproj", "{3379B1E7-A170-40BB-BF82-EAE14B8269C5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CircleViewerMac", "..\CircleViewerMac\CircleViewerMac.csproj", "{D6CDED39-900A-4027-9E57-075956BF1C9A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4CC531F1-7EF4-414D-9434-2DD2C5CEF70E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4CC531F1-7EF4-414D-9434-2DD2C5CEF70E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4CC531F1-7EF4-414D-9434-2DD2C5CEF70E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4CC531F1-7EF4-414D-9434-2DD2C5CEF70E}.Release|Any CPU.Build.0 = Release|Any CPU
{3379B1E7-A170-40BB-BF82-EAE14B8269C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3379B1E7-A170-40BB-BF82-EAE14B8269C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3379B1E7-A170-40BB-BF82-EAE14B8269C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3379B1E7-A170-40BB-BF82-EAE14B8269C5}.Release|Any CPU.Build.0 = Release|Any CPU
{D6CDED39-900A-4027-9E57-075956BF1C9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6CDED39-900A-4027-9E57-075956BF1C9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D6CDED39-900A-4027-9E57-075956BF1C9A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{D6CDED39-900A-4027-9E57-075956BF1C9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6CDED39-900A-4027-9E57-075956BF1C9A}.Release|Any CPU.Build.0 = Release|Any CPU
{D6CDED39-900A-4027-9E57-075956BF1C9A}.Release|Any CPU.Deploy.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EEB47DEC-0A2C-4BD9-8B8C-C314E2110561}
EndGlobalSection
EndGlobal

4
CircleViewer/CircleViewer.sln.DotSettings.user

@ -0,0 +1,4 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue">&lt;AssemblyExplorer&gt;&#xD;
&lt;Assembly Path="C:\Trunk\gocircle\code\API\Libraries\CircleSDK\CircleSDK.dll" /&gt;&#xD;
&lt;/AssemblyExplorer&gt;</s:String></wpf:ResourceDictionary>

63
CircleViewer/Constants.cs

@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CircleViewer
{
public class Constants
{
public static string CircleFolder
{
get
{
var folder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Circle");
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
return folder;
}
}
public static List<string> SupportedFiles
{
get
{
return new List<string>
{
".gif",
".jpeg",
".jpg",
".png",
".pdf"
};
}
}
public const string CustomerCode = "CIRCLE";
public const string AuthCode = "ORAMA";
public const string AppKey = "Dashboard";
public const string EndUserId = "userman";
public const string Secret = "2FDA4588-774B-4FA6-8B3D-6F08F5FA6E90";
public const string CircleViewEventUrl = "https://circlecloudfuncstaging.azurewebsites.net/api/CircleViewEvent";
}
// CircleView Messages
// for circle service to persist these messages, they have to be between 100000 and 1000000
public enum CircleViewMessages
{
FileViewed = 10001,
FileEncrypted = 10002,
InviteGenerated = 10003,
VerificationRequested = 10004,
// CircleCreated = 10005, // can't have this one since this is above the circle
MemberRevoked = 10006,
DeviceRevoked = 10007,
BlockedViewAttempt = 10008,
Unknown = 10009,
LastMessage = 10010 // don't use this one except for looping.
}
}

46
CircleViewer/DetailsCmd.cs

@ -0,0 +1,46 @@
using CircleSDK.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using CircleViewer.Dialogs;
using CDPShared;
namespace CircleViewer
{
public class DetailsCmd
{
private CDPWorker _cdp;
string customerCode = "CIRCLE";
string appKey = "Dashboard";
string endUserId = "userman";
string secret = "2FDA4588-774B-4FA6-8B3D-6F08F5FA6E90";
public DetailsCmd()
{
_cdp = new CDPWorker();
while (!_cdp.Ready)
{
Thread.Sleep(250);
}
}
public void Display(string fileName)
{
using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name + MethodBase.GetCurrentMethod().Name))
{
string ext = Path.GetExtension(fileName).ToLower();
if (ext != ".cir")
return;
FilePropertiesDlg dlg = new FilePropertiesDlg(_cdp, fileName);
dlg.ShowDialog();
}
}
}
}

170
CircleViewer/Dialogs/ActivityDlg.Designer.cs

@ -0,0 +1,170 @@
namespace CircleViewer.Dialogs
{
partial class ActivityDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn1 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn2 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn3 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ActivityDlg));
this.lblTopicDescription = new System.Windows.Forms.Label();
this.lblDescription = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.cbTopics = new System.Windows.Forms.ComboBox();
this.cbCircles = new System.Windows.Forms.ComboBox();
this.sfgActivity = new Syncfusion.WinForms.DataGrid.SfDataGrid();
((System.ComponentModel.ISupportInitialize)(this.sfgActivity)).BeginInit();
this.SuspendLayout();
//
// lblTopicDescription
//
this.lblTopicDescription.BackColor = System.Drawing.SystemColors.Info;
this.lblTopicDescription.Dock = System.Windows.Forms.DockStyle.Top;
this.lblTopicDescription.Location = new System.Drawing.Point(0, 134);
this.lblTopicDescription.Name = "lblTopicDescription";
this.lblTopicDescription.Size = new System.Drawing.Size(800, 54);
this.lblTopicDescription.TabIndex = 13;
//
// lblDescription
//
this.lblDescription.BackColor = System.Drawing.SystemColors.Info;
this.lblDescription.Dock = System.Windows.Forms.DockStyle.Top;
this.lblDescription.Location = new System.Drawing.Point(0, 40);
this.lblDescription.Name = "lblDescription";
this.lblDescription.Size = new System.Drawing.Size(800, 54);
this.lblDescription.TabIndex = 12;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Top;
this.label2.Location = new System.Drawing.Point(0, 94);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(42, 16);
this.label2.TabIndex = 11;
this.label2.Text = "Topic";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Dock = System.Windows.Forms.DockStyle.Top;
this.label1.Location = new System.Drawing.Point(0, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(81, 16);
this.label1.TabIndex = 10;
this.label1.Text = "Circle name:";
//
// cbTopics
//
this.cbTopics.Dock = System.Windows.Forms.DockStyle.Top;
this.cbTopics.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbTopics.FormattingEnabled = true;
this.cbTopics.Location = new System.Drawing.Point(0, 110);
this.cbTopics.Name = "cbTopics";
this.cbTopics.Size = new System.Drawing.Size(800, 24);
this.cbTopics.TabIndex = 9;
this.cbTopics.SelectedIndexChanged += new System.EventHandler(this.cbTopics_SelectedValueChanged);
//
// cbCircles
//
this.cbCircles.Dock = System.Windows.Forms.DockStyle.Top;
this.cbCircles.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbCircles.FormattingEnabled = true;
this.cbCircles.Location = new System.Drawing.Point(0, 16);
this.cbCircles.Name = "cbCircles";
this.cbCircles.Size = new System.Drawing.Size(800, 24);
this.cbCircles.TabIndex = 8;
this.cbCircles.SelectedIndexChanged += new System.EventHandler(this.cbCircles_SelectedValueChanged);
//
// sfgActivity
//
this.sfgActivity.AccessibleName = "Table";
this.sfgActivity.AutoGenerateColumns = false;
this.sfgActivity.AutoSizeColumnsMode = Syncfusion.WinForms.DataGrid.Enums.AutoSizeColumnsMode.LastColumnFill;
gridTextColumn1.AllowEditing = false;
gridTextColumn1.AllowResizing = true;
gridTextColumn1.CellStyle.HorizontalAlignment = System.Windows.Forms.HorizontalAlignment.Center;
gridTextColumn1.Format = "g";
gridTextColumn1.HeaderText = "Time";
gridTextColumn1.MappingName = "EventTime";
gridTextColumn1.Width = 130D;
gridTextColumn2.AllowEditing = false;
gridTextColumn2.CellStyle.HorizontalAlignment = System.Windows.Forms.HorizontalAlignment.Center;
gridTextColumn2.HeaderText = "Event";
gridTextColumn2.MappingName = "Operation";
gridTextColumn2.Width = 60D;
gridTextColumn3.AllowEditing = false;
gridTextColumn3.HeaderText = "Details";
gridTextColumn3.MappingName = "Message";
this.sfgActivity.Columns.Add(gridTextColumn1);
this.sfgActivity.Columns.Add(gridTextColumn2);
this.sfgActivity.Columns.Add(gridTextColumn3);
this.sfgActivity.Dock = System.Windows.Forms.DockStyle.Fill;
this.sfgActivity.Location = new System.Drawing.Point(0, 188);
this.sfgActivity.Name = "sfgActivity";
this.sfgActivity.PreviewRowHeight = 35;
this.sfgActivity.Size = new System.Drawing.Size(800, 501);
this.sfgActivity.TabIndex = 15;
this.sfgActivity.Text = "sfDataGrid1";
this.sfgActivity.CellDoubleClick += new Syncfusion.WinForms.DataGrid.Events.CellClickEventHandler(this.sfgActivity_CellDoubleClick);
//
// ActivityDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 689);
this.Controls.Add(this.sfgActivity);
this.Controls.Add(this.lblTopicDescription);
this.Controls.Add(this.cbTopics);
this.Controls.Add(this.label2);
this.Controls.Add(this.lblDescription);
this.Controls.Add(this.cbCircles);
this.Controls.Add(this.label1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "ActivityDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Secure File Activity";
this.Load += new System.EventHandler(this.ActivityDlg_Load);
((System.ComponentModel.ISupportInitialize)(this.sfgActivity)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lblTopicDescription;
private System.Windows.Forms.Label lblDescription;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ComboBox cbTopics;
private System.Windows.Forms.ComboBox cbCircles;
private Syncfusion.WinForms.DataGrid.SfDataGrid sfgActivity;
}
}

115
CircleViewer/Dialogs/ActivityDlg.cs

@ -0,0 +1,115 @@
using CircleSDK.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CircleViewer.Models;
using Newtonsoft.Json;
using Syncfusion.Windows.Forms;
using System.Net.Http;
using CDPShared;
using WMPLib;
namespace CircleViewer.Dialogs
{
public partial class ActivityDlg : Form
{
private CDPWorker _cdp;
List<CircleInfo> _CircleMeta;
public ActivityDlg(CDPWorker cdp)
{
_cdp = cdp;
InitializeComponent();
}
private async void ActivityDlg_Load(object sender, EventArgs e)
{
_CircleMeta = _cdp.Circles;
cbCircles.DataSource = _CircleMeta;
cbCircles.DisplayMember = "CircleName";
}
private async void cbCircles_SelectedValueChanged(object sender, EventArgs e)
{
CircleInfo ci = (CircleInfo)cbCircles.SelectedItem;
if (ci != null)
{
cbTopics.Enabled = false;
lblDescription.Text = ci.CircleDescription;
List<TopicInfo> topics = await _cdp.EnumTopics(ci.CircleId);
cbTopics.DataSource = topics;
cbTopics.DisplayMember = "TopicName";
cbTopics.Enabled = true;
}
else
lblDescription.Text = "";
}
private async void cbTopics_SelectedValueChanged(object sender, EventArgs e)
{
TopicInfo ti = (TopicInfo)cbTopics.SelectedItem;
if (ti != null)
{
lblTopicDescription.Text = ti.TopicDescription;
LoadActivity();
}
else
lblTopicDescription.Text = "";
}
private async Task<List<ActivityRow>> LoadCircleActivity(string circleId, string topicId)
{
List<ActivityRow> lar = new List<ActivityRow>();
GetMessagesReply gmReply = await _cdp.API.GetCircleViewwMessages(circleId, topicId);
foreach (MessageInfo mi in gmReply.Messages)
lar.Add(new ActivityRow(mi));
return lar;
}
private async Task<List<ActivityRow>> LoadCloudActivity(string circleId)
{
List<ActivityRow> retList = new List<ActivityRow>();
var url = "https://circlecloudfuncstaging.azurewebsites.net/api/GetCircleEvents?circleId=" + circleId;
HttpClient client = new HttpClient();
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string result = await response.Content.ReadAsStringAsync();
List<CircleViewEventRecord> lrecs = JsonConvert.DeserializeObject<List<CircleViewEventRecord>>(result);
foreach (CircleViewEventRecord rec in lrecs)
{
retList.Add(new ActivityRow(rec));
}
return retList;
}
private async void LoadActivity()
{
CircleInfo ci = (CircleInfo)cbCircles.SelectedItem;
TopicInfo ti = (TopicInfo)cbTopics.SelectedItem;
List<ActivityRow> lar = new List<ActivityRow>();
lar.AddRange(await LoadCircleActivity(ci.CircleId, ti.TopicId));
lar.AddRange(await LoadCloudActivity(ci.CircleId));
GetMessagesReply gmReply = await _cdp.API.GetCircleViewwMessages(ci.CircleId, ti.TopicId);
sfgActivity.DataSource = lar;
}
private void sfgActivity_CellDoubleClick(object sender, Syncfusion.WinForms.DataGrid.Events.CellClickEventArgs e)
{
ActivityRow ar = (ActivityRow)e.DataRow.RowData;
ViewMetaDlg dlg = new ViewMetaDlg(ar);
dlg.ShowDialog();
}
}
}

407
CircleViewer/Dialogs/ActivityDlg.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

93
CircleViewer/Dialogs/ActivityDlgDefault.Designer.cs

@ -0,0 +1,93 @@
namespace CircleViewer.Dialogs
{
partial class ActivityDlgDefault
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn1 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn2 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn3 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ActivityDlgDefault));
this.sfgActivity = new Syncfusion.WinForms.DataGrid.SfDataGrid();
((System.ComponentModel.ISupportInitialize)(this.sfgActivity)).BeginInit();
this.SuspendLayout();
//
// sfgActivity
//
this.sfgActivity.AccessibleName = "Table";
this.sfgActivity.AllowResizingColumns = true;
this.sfgActivity.AutoGenerateColumns = false;
this.sfgActivity.AutoSizeColumnsMode = Syncfusion.WinForms.DataGrid.Enums.AutoSizeColumnsMode.LastColumnFill;
gridTextColumn1.AllowEditing = false;
gridTextColumn1.AllowResizing = true;
gridTextColumn1.CellStyle.HorizontalAlignment = System.Windows.Forms.HorizontalAlignment.Center;
gridTextColumn1.Format = "g";
gridTextColumn1.HeaderText = "Time";
gridTextColumn1.MappingName = "EventTime";
gridTextColumn1.Width = 150D;
gridTextColumn2.AllowEditing = false;
gridTextColumn2.AllowResizing = true;
gridTextColumn2.CellStyle.HorizontalAlignment = System.Windows.Forms.HorizontalAlignment.Center;
gridTextColumn2.HeaderText = "Event";
gridTextColumn2.MappingName = "Operation";
gridTextColumn2.Width = 120D;
gridTextColumn3.AllowEditing = false;
gridTextColumn3.AllowResizing = true;
gridTextColumn3.HeaderText = "Details";
gridTextColumn3.MappingName = "Message";
this.sfgActivity.Columns.Add(gridTextColumn1);
this.sfgActivity.Columns.Add(gridTextColumn2);
this.sfgActivity.Columns.Add(gridTextColumn3);
this.sfgActivity.Dock = System.Windows.Forms.DockStyle.Fill;
this.sfgActivity.Location = new System.Drawing.Point(0, 0);
this.sfgActivity.Name = "sfgActivity";
this.sfgActivity.PreviewRowHeight = 35;
this.sfgActivity.Size = new System.Drawing.Size(800, 689);
this.sfgActivity.TabIndex = 15;
this.sfgActivity.Text = "sfDataGrid1";
this.sfgActivity.CellDoubleClick += new Syncfusion.WinForms.DataGrid.Events.CellClickEventHandler(this.sfgActivity_CellDoubleClick);
//
// ActivityDlgDefault
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 689);
this.Controls.Add(this.sfgActivity);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "ActivityDlgDefault";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "User Group Activity";
this.Load += new System.EventHandler(this.ActivityDlg_Load);
((System.ComponentModel.ISupportInitialize)(this.sfgActivity)).EndInit();
this.ResumeLayout(false);
}
#endregion
private Syncfusion.WinForms.DataGrid.SfDataGrid sfgActivity;
}
}

156
CircleViewer/Dialogs/ActivityDlgDefault.cs

@ -0,0 +1,156 @@
using CircleSDK.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CircleViewer.Models;
using Newtonsoft.Json;
using Syncfusion.Windows.Forms;
using System.Net.Http;
using CDPShared;
namespace CircleViewer.Dialogs
{
public partial class ActivityDlgDefault : Form
{
CDPWorker _cdp;
List<CircleInfo> _CircleMeta;
public ActivityDlgDefault(CDPWorker cdp)
{
_cdp = cdp;
InitializeComponent();
}
private async void ActivityDlg_Load(object sender, EventArgs e)
{
LoadActivity();
await Task.Run(async () =>
{
CircleInfo ci = await _cdp.GetCircle(Properties.Settings.Default.DefaultCircleId);
this.BeginInvoke((MethodInvoker)delegate
{
this.Text = $"User Group Activity - {ci.CircleName}";
});
});
}
private async Task<List<ActivityRow>> LoadCircleActivity()
{
List<ActivityRow> lar = new List<ActivityRow>();
GetMessagesReply gmReply = await _cdp.GetCircleViewwMessages();
#if FALSE // I only want to display recent events. (making a video)
foreach (MessageInfo mi in gmReply.Messages)
{
ActivityRow ar = new ActivityRow(mi);
if ((DateTime.Now - ar.EventTime).TotalMinutes < 15)
lar.Add(new ActivityRow(mi));
}
#else
foreach (MessageInfo mi in gmReply.Messages)
lar.Add(new ActivityRow(mi));
#endif
return lar;
}
private async Task<List<ActivityRow>> LoadCloudActivity()
{
List<ActivityRow> retList = new List<ActivityRow>();
var url = "https://circlecloudfuncstaging.azurewebsites.net/api/GetCircleEvents?circleId=" + Properties.Settings.Default.DefaultCircleId;
HttpClient client = new HttpClient();
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string result = await response.Content.ReadAsStringAsync();
List<CircleViewEventRecord> lrecs = JsonConvert.DeserializeObject<List<CircleViewEventRecord>>(result);
foreach (CircleViewEventRecord rec in lrecs)
{
retList.Add(new ActivityRow(rec));
}
return retList;
}
private async void LoadActivity()
{
GetMessagesReply gmReply = await _cdp.GetCircleViewwMessages();
List<ActivityRow> lar = new List<ActivityRow>();
List<ActivityRow> lCircleAR = await LoadCircleActivity();
lar.AddRange(lCircleAR);
Dictionary<string, string> _fileIdToName = new Dictionary<string, string>();
Dictionary<string, string> _userIdToName = new Dictionary<string, string>();
foreach (ActivityRow ar in lar)
{
switch ((CircleViewMessages)ar.MessageType)
{
case CircleViewMessages.FileEncrypted:
{
string fileId = ar.GetValue("File Id");
if (!string.IsNullOrEmpty(fileId))
{
_fileIdToName[fileId] = ar.GetValue("Filename");
}
string viewerId = ar.GetValue("Sender Id");
if (!string.IsNullOrEmpty(viewerId))
{
_userIdToName[viewerId] = ar.GetValue("Sender");
}
break;
}
case CircleViewMessages.FileViewed:
{
string fileId = ar.GetValue("File Id");
if (!string.IsNullOrEmpty(fileId))
{
_fileIdToName[fileId] = ar.GetValue("Filename");
}
string viewerId = ar.GetValue("Viewer Id");
if (!string.IsNullOrEmpty(viewerId))
{
_userIdToName[viewerId] = ar.GetValue("Viewer");
}
break;
}
default:
break;
}
}
List<ActivityRow> lCloudAR = await LoadCloudActivity();
foreach (ActivityRow ar in lCloudAR)
{
string fileId = ar.GetValue("File Id");
if (_fileIdToName.ContainsKey(fileId))
{
ar.AddValue("Filename*", _fileIdToName[fileId]);
}
string senderId = ar.GetValue("Sender Id");
if (_userIdToName.ContainsKey(senderId))
{
ar.AddValue("Sender*", _userIdToName[senderId]);
}
}
lar.AddRange(lCloudAR);
sfgActivity.DataSource = lar.OrderBy(r => r.EventTime).ToList();
}
private void sfgActivity_CellDoubleClick(object sender, Syncfusion.WinForms.DataGrid.Events.CellClickEventArgs e)
{
ActivityRow ar = (ActivityRow)e.DataRow.RowData;
ViewMetaDlg dlg = new ViewMetaDlg(ar);
dlg.ShowDialog();
}
}
}

407
CircleViewer/Dialogs/ActivityDlgDefault.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

144
CircleViewer/Dialogs/CreateCircleDlg.Designer.cs

@ -0,0 +1,144 @@
namespace CircleViewer.Dialogs
{
partial class CreateCircleDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CreateCircleDlg));
this.panel1 = new System.Windows.Forms.Panel();
this.bnCreateCircle = new System.Windows.Forms.Button();
this.bnCancel = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.tbCircleName = new System.Windows.Forms.TextBox();
this.tbDescription = new System.Windows.Forms.TextBox();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.bnCreateCircle);
this.panel1.Controls.Add(this.bnCancel);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 298);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(539, 36);
this.panel1.TabIndex = 2;
//
// bnCreateCircle
//
this.bnCreateCircle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnCreateCircle.Location = new System.Drawing.Point(357, 6);
this.bnCreateCircle.Name = "bnCreateCircle";
this.bnCreateCircle.Size = new System.Drawing.Size(75, 25);
this.bnCreateCircle.TabIndex = 1;
this.bnCreateCircle.Text = "Create";
this.bnCreateCircle.UseVisualStyleBackColor = true;
this.bnCreateCircle.Click += new System.EventHandler(this.bnCreateCircle_Click);
//
// bnCancel
//
this.bnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bnCancel.Location = new System.Drawing.Point(451, 6);
this.bnCancel.Name = "bnCancel";
this.bnCancel.Size = new System.Drawing.Size(75, 25);
this.bnCancel.TabIndex = 0;
this.bnCancel.Text = "Cancel";
this.bnCancel.UseVisualStyleBackColor = true;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(119, 16);
this.label1.TabIndex = 1;
this.label1.Text = "User Group Name:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(12, 62);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(137, 16);
this.label2.TabIndex = 2;
this.label2.Text = "Description (optional):";
//
// tbCircleName
//
this.tbCircleName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbCircleName.Location = new System.Drawing.Point(15, 28);
this.tbCircleName.Name = "tbCircleName";
this.tbCircleName.Size = new System.Drawing.Size(507, 22);
this.tbCircleName.TabIndex = 0;
//
// tbDescription
//
this.tbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbDescription.Location = new System.Drawing.Point(15, 82);
this.tbDescription.Multiline = true;
this.tbDescription.Name = "tbDescription";
this.tbDescription.Size = new System.Drawing.Size(507, 198);
this.tbDescription.TabIndex = 1;
//
// CreateCircleDlg
//
this.AcceptButton = this.bnCreateCircle;
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.bnCancel;
this.ClientSize = new System.Drawing.Size(539, 334);
this.Controls.Add(this.tbDescription);
this.Controls.Add(this.tbCircleName);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.panel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "CreateCircleDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Create User Group";
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button bnCreateCircle;
private System.Windows.Forms.Button bnCancel;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox tbCircleName;
private System.Windows.Forms.TextBox tbDescription;
}
}

37
CircleViewer/Dialogs/CreateCircleDlg.cs

@ -0,0 +1,37 @@
using CDPShared;
using CircleSDK.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CircleViewer.Dialogs
{
public partial class CreateCircleDlg : Form
{
private CDPWorker _cdp;
public CreateCircleDlg(CDPWorker cdp)
{
_cdp = cdp;
InitializeComponent();
}
private async void bnCreateCircle_Click(object sender, EventArgs e)
{
var reply = await _cdp.API.CreateCircle(tbCircleName.Text, tbDescription.Text);
if (reply == null)
MessageBox.Show("Failed to create user group.", "Circle for Data Protection");
else
{
MessageBox.Show($"User Group {tbCircleName.Text} created.", "Circle for Data Protection");
Close();
}
}
}
}

407
CircleViewer/Dialogs/CreateCircleDlg.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

77
CircleViewer/Dialogs/FilePropertiesDlg.Designer.cs

@ -0,0 +1,77 @@
namespace CircleViewer.Dialogs
{
partial class FilePropertiesDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn1 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn2 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FilePropertiesDlg));
this.dgMeta = new Syncfusion.WinForms.DataGrid.SfDataGrid();
((System.ComponentModel.ISupportInitialize)(this.dgMeta)).BeginInit();
this.SuspendLayout();
//
// dgMeta
//
this.dgMeta.AccessibleName = "Table";
this.dgMeta.AutoSizeColumnsMode = Syncfusion.WinForms.DataGrid.Enums.AutoSizeColumnsMode.LastColumnFill;
gridTextColumn1.AllowEditing = false;
gridTextColumn1.HeaderText = "Name";
gridTextColumn1.MappingName = "Str1";
gridTextColumn2.AllowEditing = false;
gridTextColumn2.HeaderText = "Details";
gridTextColumn2.MappingName = "Str2";
this.dgMeta.Columns.Add(gridTextColumn1);
this.dgMeta.Columns.Add(gridTextColumn2);
this.dgMeta.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgMeta.Location = new System.Drawing.Point(0, 0);
this.dgMeta.Name = "dgMeta";
this.dgMeta.PreviewRowHeight = 35;
this.dgMeta.Size = new System.Drawing.Size(691, 813);
this.dgMeta.TabIndex = 2;
this.dgMeta.Text = "sfDataGrid1";
//
// FilePropertiesDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(691, 813);
this.Controls.Add(this.dgMeta);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FilePropertiesDlg";
this.Text = "Secure File Properties";
this.Load += new System.EventHandler(this.FilePropertiesDlg_Load);
((System.ComponentModel.ISupportInitialize)(this.dgMeta)).EndInit();
this.ResumeLayout(false);
}
#endregion
private Syncfusion.WinForms.DataGrid.SfDataGrid dgMeta;
}
}

39
CircleViewer/Dialogs/FilePropertiesDlg.cs

@ -0,0 +1,39 @@
using CDPShared;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace CircleViewer.Dialogs
{
public partial class FilePropertiesDlg : Form
{
private CDPWorker _cdp;
private CircleAPIHelper _apiHelper;
private string _fileName;
public FilePropertiesDlg(CDPWorker cdp, string fileName)
{
_cdp = cdp;
_fileName = fileName;
InitializeComponent();
}
private void FilePropertiesDlg_Load(object sender, EventArgs e)
{
YellowFile yf = new YellowFile(_fileName);
List<TwoStrings> l2s = new List<TwoStrings>();
l2s.Add(new TwoStrings("Circle Id", yf.CircleId));
l2s.Add(new TwoStrings("Topic Id", yf.TopicId));
l2s.Add(new TwoStrings("File Id", yf.FileId));
l2s.Add(new TwoStrings("Owner Id", yf.OwnerId));
l2s.Add(new TwoStrings("Cloud Id", yf.CloudId));
l2s.Add(new TwoStrings("Decryption Id", yf.DecryptionId));
l2s.Add(new TwoStrings("Revision No", Convert.ToString(yf.RevisionNo)));
l2s.Add(new TwoStrings("Encrypted Block Size", Convert.ToString(yf.EncryptedBlockSize)));
l2s.Add(new TwoStrings("File Access Time", yf.FileAccessTime.ToString()));
l2s.Add(new TwoStrings("File Modification Time", yf.FileModificationTime.ToString()));
l2s.Add(new TwoStrings("File Status Time", yf.FileStatusTime.ToString()));
dgMeta.DataSource = l2s;
}
}
}

407
CircleViewer/Dialogs/FilePropertiesDlg.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

141
CircleViewer/Dialogs/InviteMemberDlg.Designer.cs

@ -0,0 +1,141 @@
namespace CircleViewer.Dialogs
{
partial class InviteMemberDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InviteMemberDlg));
this.panel1 = new System.Windows.Forms.Panel();
this.bnClose = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.lblInviteCode = new System.Windows.Forms.Label();
this.lblAuthCode = new System.Windows.Forms.Label();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.bnClose);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 104);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(319, 36);
this.panel1.TabIndex = 1;
//
// bnClose
//
this.bnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bnClose.Location = new System.Drawing.Point(231, 6);
this.bnClose.Name = "bnClose";
this.bnClose.Size = new System.Drawing.Size(75, 23);
this.bnClose.TabIndex = 0;
this.bnClose.Text = "Close";
this.bnClose.UseVisualStyleBackColor = true;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(83, 12);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(94, 20);
this.label1.TabIndex = 2;
this.label1.Text = "Invite code:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label2.Location = new System.Drawing.Point(19, 45);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(158, 20);
this.label2.TabIndex = 3;
this.label2.Text = "Authorization code: ";
//
// lblInviteCode
//
this.lblInviteCode.AutoSize = true;
this.lblInviteCode.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblInviteCode.Location = new System.Drawing.Point(180, 12);
this.lblInviteCode.Name = "lblInviteCode";
this.lblInviteCode.Size = new System.Drawing.Size(97, 20);
this.lblInviteCode.TabIndex = 4;
this.lblInviteCode.Text = "InviteCode";
this.toolTip1.SetToolTip(this.lblInviteCode, "Click to copy invite code to clipboard");
this.lblInviteCode.Click += new System.EventHandler(this.lblInviteCode_Click);
//
// lblAuthCode
//
this.lblAuthCode.AutoSize = true;
this.lblAuthCode.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblAuthCode.Location = new System.Drawing.Point(180, 45);
this.lblAuthCode.Name = "lblAuthCode";
this.lblAuthCode.Size = new System.Drawing.Size(87, 20);
this.lblAuthCode.TabIndex = 5;
this.lblAuthCode.Text = "Authcode";
this.toolTip1.SetToolTip(this.lblAuthCode, "Click to copy authorization code to clipboard");
this.lblAuthCode.Click += new System.EventHandler(this.lblAuthCode_Click);
//
// InviteMemberDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.bnClose;
this.ClientSize = new System.Drawing.Size(319, 140);
this.ControlBox = false;
this.Controls.Add(this.lblAuthCode);
this.Controls.Add(this.lblInviteCode);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "InviteMemberDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Add New User";
this.Load += new System.EventHandler(this.InviteMemberDlg_Load);
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button bnClose;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label lblInviteCode;
private System.Windows.Forms.Label lblAuthCode;
private System.Windows.Forms.ToolTip toolTip1;
}
}

51
CircleViewer/Dialogs/InviteMemberDlg.cs

@ -0,0 +1,51 @@
using CircleSDK.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CDPShared;
namespace CircleViewer.Dialogs
{
public partial class InviteMemberDlg : Form
{
CDPWorker _cdp;
public InviteMemberDlg(CDPWorker cdp)
{
_cdp = cdp;
InitializeComponent();
}
private async void InviteMemberDlg_Load(object sender, EventArgs e)
{
var reply = await _cdp.API.GenInvite(Properties.Settings.Default.DefaultCircleId);
if (reply == null)
{
MessageBox.Show("Failed to Generate Invite.", "Circle for Data Protection");
return;
}
string userName = Environment.UserDomainName + "\\" + Environment.UserName;
await _cdp.AddMessage($"Invite {reply.Invite.InviteId} generated by {userName}", (Int32)CircleViewMessages.InviteGenerated);
lblInviteCode.Text = reply.Invite.InviteId;
lblAuthCode.Text = reply.Invite.AuthCode;
}
private void lblInviteCode_Click(object sender, EventArgs e)
{
Clipboard.SetData(DataFormats.Text, lblInviteCode.Text);
}
private void lblAuthCode_Click(object sender, EventArgs e)
{
Clipboard.SetData(DataFormats.Text, lblAuthCode.Text);
}
}
}

410
CircleViewer/Dialogs/InviteMemberDlg.resx

@ -0,0 +1,410 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

141
CircleViewer/Dialogs/JoinCircleDlg.Designer.cs

@ -0,0 +1,141 @@
namespace CircleViewer.Dialogs
{
partial class JoinCircleDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(JoinCircleDlg));
this.panel1 = new System.Windows.Forms.Panel();
this.bnRequestVerfication = new System.Windows.Forms.Button();
this.bnClose = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.tbInviteCode = new System.Windows.Forms.TextBox();
this.tbAuthCode = new System.Windows.Forms.TextBox();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.bnRequestVerfication);
this.panel1.Controls.Add(this.bnClose);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 93);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(351, 36);
this.panel1.TabIndex = 2;
//
// bnRequestVerfication
//
this.bnRequestVerfication.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnRequestVerfication.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bnRequestVerfication.Location = new System.Drawing.Point(88, 6);
this.bnRequestVerfication.Name = "bnRequestVerfication";
this.bnRequestVerfication.Size = new System.Drawing.Size(160, 23);
this.bnRequestVerfication.TabIndex = 1;
this.bnRequestVerfication.Text = "Request Verification";
this.bnRequestVerfication.UseVisualStyleBackColor = true;
this.bnRequestVerfication.Click += new System.EventHandler(this.bnRequestVerfication_Click);
//
// bnClose
//
this.bnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bnClose.Location = new System.Drawing.Point(263, 6);
this.bnClose.Name = "bnClose";
this.bnClose.Size = new System.Drawing.Size(75, 23);
this.bnClose.TabIndex = 0;
this.bnClose.Text = "Close";
this.bnClose.UseVisualStyleBackColor = true;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label2.Location = new System.Drawing.Point(43, 52);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(144, 20);
this.label2.TabIndex = 7;
this.label2.Text = "Verification code: ";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(70, 19);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(117, 20);
this.label1.TabIndex = 6;
this.label1.Text = "Request code:";
//
// tbInviteCode
//
this.tbInviteCode.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
this.tbInviteCode.Location = new System.Drawing.Point(197, 18);
this.tbInviteCode.Name = "tbInviteCode";
this.tbInviteCode.Size = new System.Drawing.Size(124, 22);
this.tbInviteCode.TabIndex = 0;
//
// tbAuthCode
//
this.tbAuthCode.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
this.tbAuthCode.Location = new System.Drawing.Point(197, 51);
this.tbAuthCode.Name = "tbAuthCode";
this.tbAuthCode.Size = new System.Drawing.Size(124, 22);
this.tbAuthCode.TabIndex = 1;
//
// JoinCircleDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(351, 129);
this.Controls.Add(this.tbAuthCode);
this.Controls.Add(this.tbInviteCode);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.panel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "JoinCircleDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Join User Group";
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button bnClose;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox tbInviteCode;
private System.Windows.Forms.TextBox tbAuthCode;
private System.Windows.Forms.Button bnRequestVerfication;
}
}

30
CircleViewer/Dialogs/JoinCircleDlg.cs

@ -0,0 +1,30 @@
using CDPShared;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CircleViewer.Dialogs
{
public partial class JoinCircleDlg : Form
{
private CDPWorker _cdp;
public JoinCircleDlg(CDPWorker cdp)
{
_cdp = cdp;
InitializeComponent();
}
private void bnRequestVerfication_Click(object sender, EventArgs e)
{
var reply = _cdp.API.ProcessInvite(tbInviteCode.Text, tbAuthCode.Text);
if (reply == null)
MessageBox.Show("Failed to Process Invite.", "Circle for Data Protection");
}
}
}

407
CircleViewer/Dialogs/JoinCircleDlg.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

47
CircleViewer/Dialogs/LicenseDlg.Designer.cs

@ -0,0 +1,47 @@
namespace CircleViewer.Dialogs
{
partial class LicenseDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// LicenseDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Name = "LicenseDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "LicenseDlg";
this.ResumeLayout(false);
}
#endregion
}
}

20
CircleViewer/Dialogs/LicenseDlg.cs

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CircleViewer.Dialogs
{
public partial class LicenseDlg : Form
{
public LicenseDlg()
{
InitializeComponent();
}
}
}

120
CircleViewer/Dialogs/LicenseDlg.resx

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

130
CircleViewer/Dialogs/RevokeDeviceDlg.Designer.cs

@ -0,0 +1,130 @@
namespace CircleViewer.Dialogs
{
partial class RevokeDeviceDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RevokeDeviceDlg));
this.panel1 = new System.Windows.Forms.Panel();
this.bnRevoke = new System.Windows.Forms.Button();
this.bnCancel = new System.Windows.Forms.Button();
this.panel2 = new System.Windows.Forms.Panel();
this.label1 = new System.Windows.Forms.Label();
this.treeView1 = new System.Windows.Forms.TreeView();
this.panel1.SuspendLayout();
this.panel2.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.bnRevoke);
this.panel1.Controls.Add(this.bnCancel);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 712);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(535, 36);
this.panel1.TabIndex = 1;
//
// bnRevoke
//
this.bnRevoke.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnRevoke.Location = new System.Drawing.Point(353, 7);
this.bnRevoke.Name = "bnRevoke";
this.bnRevoke.Size = new System.Drawing.Size(75, 23);
this.bnRevoke.TabIndex = 1;
this.bnRevoke.Text = "Revoke";
this.bnRevoke.UseVisualStyleBackColor = true;
this.bnRevoke.Click += new System.EventHandler(this.bnRevoke_Click);
//
// bnCancel
//
this.bnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bnCancel.Location = new System.Drawing.Point(447, 7);
this.bnCancel.Name = "bnCancel";
this.bnCancel.Size = new System.Drawing.Size(75, 23);
this.bnCancel.TabIndex = 0;
this.bnCancel.Text = "Cancel";
this.bnCancel.UseVisualStyleBackColor = true;
//
// panel2
//
this.panel2.Controls.Add(this.label1);
this.panel2.Dock = System.Windows.Forms.DockStyle.Top;
this.panel2.Location = new System.Drawing.Point(0, 0);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(535, 34);
this.panel2.TabIndex = 4;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(4, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(277, 16);
this.label1.TabIndex = 0;
this.label1.Text = "Select the member, then the device to revoke.";
//
// treeView1
//
this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeView1.Location = new System.Drawing.Point(0, 34);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(535, 678);
this.treeView1.TabIndex = 5;
//
// RevokeDeviceDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.bnCancel;
this.ClientSize = new System.Drawing.Size(535, 748);
this.Controls.Add(this.treeView1);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "RevokeDeviceDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Revoke Device";
this.Load += new System.EventHandler(this.RevokeDeviceDlg_Load);
this.panel1.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button bnRevoke;
private System.Windows.Forms.Button bnCancel;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TreeView treeView1;
}
}

36
CircleViewer/Dialogs/RevokeDeviceDlg.cs

@ -0,0 +1,36 @@
using CDPShared;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
namespace CircleViewer.Dialogs
{
public partial class RevokeDeviceDlg : Form
{
CDPWorker _cdp;
public RevokeDeviceDlg(CDPWorker cdp)
{
_cdp = cdp;
InitializeComponent();
}
private async void bnRevoke_Click(object sender, EventArgs e)
{
string userName = Environment.UserDomainName + "\\" + Environment.UserName;
await _cdp.AddMessage($"{userName} revoked device with Id: ", (Int32)CircleViewMessages.DeviceRevoked);
}
private void RevokeDeviceDlg_Load(object sender, EventArgs e)
{
}
}
}

407
CircleViewer/Dialogs/RevokeDeviceDlg.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

127
CircleViewer/Dialogs/RevokeDlg.Designer.cs

@ -0,0 +1,127 @@
namespace CircleViewer.Dialogs
{
partial class RevokeDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RevokeDlg));
this.lblTopicDescription = new System.Windows.Forms.Label();
this.cbTopics = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.lblDescription = new System.Windows.Forms.Label();
this.cbCircles = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// lblTopicDescription
//
this.lblTopicDescription.BackColor = System.Drawing.SystemColors.Info;
this.lblTopicDescription.Dock = System.Windows.Forms.DockStyle.Top;
this.lblTopicDescription.Location = new System.Drawing.Point(0, 134);
this.lblTopicDescription.Name = "lblTopicDescription";
this.lblTopicDescription.Size = new System.Drawing.Size(800, 54);
this.lblTopicDescription.TabIndex = 19;
//
// cbTopics
//
this.cbTopics.Dock = System.Windows.Forms.DockStyle.Top;
this.cbTopics.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbTopics.FormattingEnabled = true;
this.cbTopics.Location = new System.Drawing.Point(0, 110);
this.cbTopics.Name = "cbTopics";
this.cbTopics.Size = new System.Drawing.Size(800, 24);
this.cbTopics.TabIndex = 15;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Top;
this.label2.Location = new System.Drawing.Point(0, 94);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(42, 16);
this.label2.TabIndex = 17;
this.label2.Text = "Topic";
//
// lblDescription
//
this.lblDescription.BackColor = System.Drawing.SystemColors.Info;
this.lblDescription.Dock = System.Windows.Forms.DockStyle.Top;
this.lblDescription.Location = new System.Drawing.Point(0, 40);
this.lblDescription.Name = "lblDescription";
this.lblDescription.Size = new System.Drawing.Size(800, 54);
this.lblDescription.TabIndex = 18;
//
// cbCircles
//
this.cbCircles.Dock = System.Windows.Forms.DockStyle.Top;
this.cbCircles.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbCircles.FormattingEnabled = true;
this.cbCircles.Location = new System.Drawing.Point(0, 16);
this.cbCircles.Name = "cbCircles";
this.cbCircles.Size = new System.Drawing.Size(800, 24);
this.cbCircles.TabIndex = 14;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Dock = System.Windows.Forms.DockStyle.Top;
this.label1.Location = new System.Drawing.Point(0, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(81, 16);
this.label1.TabIndex = 16;
this.label1.Text = "Circle name:";
//
// RevokeDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.lblTopicDescription);
this.Controls.Add(this.cbTopics);
this.Controls.Add(this.label2);
this.Controls.Add(this.lblDescription);
this.Controls.Add(this.cbCircles);
this.Controls.Add(this.label1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "RevokeDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Revoke";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lblTopicDescription;
private System.Windows.Forms.ComboBox cbTopics;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label lblDescription;
private System.Windows.Forms.ComboBox cbCircles;
private System.Windows.Forms.Label label1;
}
}

20
CircleViewer/Dialogs/RevokeDlg.cs

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CircleViewer.Dialogs
{
public partial class RevokeDlg : Form
{
public RevokeDlg()
{
InitializeComponent();
}
}
}

407
CircleViewer/Dialogs/RevokeDlg.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

133
CircleViewer/Dialogs/RevokeMemberDlg.Designer.cs

@ -0,0 +1,133 @@
namespace CircleViewer.Dialogs
{
partial class RevokeMemberDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RevokeMemberDlg));
this.panel1 = new System.Windows.Forms.Panel();
this.bnRevoke = new System.Windows.Forms.Button();
this.bnCancel = new System.Windows.Forms.Button();
this.panel2 = new System.Windows.Forms.Panel();
this.label1 = new System.Windows.Forms.Label();
this.lbMemberList = new System.Windows.Forms.ListBox();
this.panel1.SuspendLayout();
this.panel2.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.bnRevoke);
this.panel1.Controls.Add(this.bnCancel);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 563);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(384, 36);
this.panel1.TabIndex = 1;
//
// bnRevoke
//
this.bnRevoke.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnRevoke.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bnRevoke.Location = new System.Drawing.Point(202, 6);
this.bnRevoke.Name = "bnRevoke";
this.bnRevoke.Size = new System.Drawing.Size(75, 23);
this.bnRevoke.TabIndex = 1;
this.bnRevoke.Text = "Revoke";
this.bnRevoke.UseVisualStyleBackColor = true;
this.bnRevoke.Click += new System.EventHandler(this.bnRevoke_Click);
//
// bnCancel
//
this.bnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bnCancel.Location = new System.Drawing.Point(296, 6);
this.bnCancel.Name = "bnCancel";
this.bnCancel.Size = new System.Drawing.Size(75, 23);
this.bnCancel.TabIndex = 0;
this.bnCancel.Text = "Cancel";
this.bnCancel.UseVisualStyleBackColor = true;
//
// panel2
//
this.panel2.Controls.Add(this.label1);
this.panel2.Dock = System.Windows.Forms.DockStyle.Top;
this.panel2.Location = new System.Drawing.Point(0, 0);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(384, 34);
this.panel2.TabIndex = 3;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(4, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(181, 16);
this.label1.TabIndex = 0;
this.label1.Text = "Select the member to revoke.";
//
// lbMemberList
//
this.lbMemberList.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbMemberList.FormattingEnabled = true;
this.lbMemberList.ItemHeight = 16;
this.lbMemberList.Location = new System.Drawing.Point(0, 34);
this.lbMemberList.Name = "lbMemberList";
this.lbMemberList.Size = new System.Drawing.Size(384, 529);
this.lbMemberList.TabIndex = 4;
//
// RevokeMemberDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.bnRevoke;
this.ClientSize = new System.Drawing.Size(384, 599);
this.Controls.Add(this.lbMemberList);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "RevokeMemberDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Revoke Member";
this.Load += new System.EventHandler(this.RevokeMemberDlg_Load);
this.panel1.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button bnRevoke;
private System.Windows.Forms.Button bnCancel;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ListBox lbMemberList;
}
}

59
CircleViewer/Dialogs/RevokeMemberDlg.cs

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CDPShared;
using CircleSDK.Model;
namespace CircleViewer.Dialogs
{
public partial class RevokeMemberDlg : Form
{
CDPWorker _cdp;
public RevokeMemberDlg(CDPWorker cdp)
{
_cdp = cdp;
InitializeComponent();
}
private async void RevokeMemberDlg_Load(object sender, EventArgs e)
{
var reply = await _cdp.API.EnumCircleMembers(Properties.Settings.Default.DefaultCircleId);
if (reply == null)
{
MessageBox.Show("Unable to enumerate members.", "Circle for Data Protection");
return;
}
lbMemberList.DataSource = reply;
lbMemberList.DisplayMember = "DisplayName";
}
private async void bnRevoke_Click(object sender, EventArgs e)
{
if (lbMemberList.SelectedItem == null)
return;
ProfileInfo pi = (ProfileInfo)lbMemberList.SelectedItem;
if (MessageBox.Show("Are you sure?", "Circle for Data Protection", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
var reply = await _cdp.API.RemoveMember(Properties.Settings.Default.DefaultCircleId, pi.ProfileId);
if (reply == null)
{
MessageBox.Show("Unable to remove user", "Circle for Data Protection");
return;
}
else
{
string userName = Environment.UserDomainName + "\\" + Environment.UserName;
await _cdp.AddMessage($"{userName} revoked user {pi.DisplayName}", (Int32)CircleViewMessages.MemberRevoked);
}
}
}
}
}

407
CircleViewer/Dialogs/RevokeMemberDlg.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

196
CircleViewer/Dialogs/SecureFileDlg.Designer.cs

@ -0,0 +1,196 @@
namespace CircleViewer
{
partial class SecureFileDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SecureFileDlg));
this.panel1 = new System.Windows.Forms.Panel();
this.lblStatus = new System.Windows.Forms.Label();
this.bnClose = new System.Windows.Forms.Button();
this.cbCircles = new System.Windows.Forms.ComboBox();
this.cbTopics = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.lblDescription = new System.Windows.Forms.Label();
this.lblTopicDescription = new System.Windows.Forms.Label();
this.pnDropArea = new System.Windows.Forms.Panel();
this.bnBrowse = new System.Windows.Forms.Button();
this.panel1.SuspendLayout();
this.pnDropArea.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.lblStatus);
this.panel1.Controls.Add(this.bnClose);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 494);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(541, 42);
this.panel1.TabIndex = 0;
//
// lblStatus
//
this.lblStatus.AutoSize = true;
this.lblStatus.Location = new System.Drawing.Point(10, 10);
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(0, 16);
this.lblStatus.TabIndex = 9;
//
// bnClose
//
this.bnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bnClose.Location = new System.Drawing.Point(454, 10);
this.bnClose.Name = "bnClose";
this.bnClose.Size = new System.Drawing.Size(75, 23);
this.bnClose.TabIndex = 0;
this.bnClose.Text = "Close";
this.bnClose.UseVisualStyleBackColor = true;
//
// cbCircles
//
this.cbCircles.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbCircles.FormattingEnabled = true;
this.cbCircles.Location = new System.Drawing.Point(13, 33);
this.cbCircles.Name = "cbCircles";
this.cbCircles.Size = new System.Drawing.Size(510, 24);
this.cbCircles.TabIndex = 1;
this.cbCircles.SelectedValueChanged += new System.EventHandler(this.cbCircles_SelectedValueChanged);
//
// cbTopics
//
this.cbTopics.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbTopics.FormattingEnabled = true;
this.cbTopics.Location = new System.Drawing.Point(13, 151);
this.cbTopics.Name = "cbTopics";
this.cbTopics.Size = new System.Drawing.Size(510, 24);
this.cbTopics.TabIndex = 2;
this.cbTopics.SelectedValueChanged += new System.EventHandler(this.cbTopics_SelectedValueChanged);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(13, 13);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(81, 16);
this.label1.TabIndex = 3;
this.label1.Text = "Circle name:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(13, 132);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(42, 16);
this.label2.TabIndex = 4;
this.label2.Text = "Topic";
//
// lblDescription
//
this.lblDescription.BackColor = System.Drawing.SystemColors.Info;
this.lblDescription.Location = new System.Drawing.Point(13, 64);
this.lblDescription.Name = "lblDescription";
this.lblDescription.Size = new System.Drawing.Size(510, 54);
this.lblDescription.TabIndex = 6;
//
// lblTopicDescription
//
this.lblTopicDescription.BackColor = System.Drawing.SystemColors.Info;
this.lblTopicDescription.Location = new System.Drawing.Point(10, 178);
this.lblTopicDescription.Name = "lblTopicDescription";
this.lblTopicDescription.Size = new System.Drawing.Size(510, 54);
this.lblTopicDescription.TabIndex = 7;
//
// pnDropArea
//
this.pnDropArea.AllowDrop = true;
this.pnDropArea.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.pnDropArea.Controls.Add(this.bnBrowse);
this.pnDropArea.Location = new System.Drawing.Point(13, 249);
this.pnDropArea.Name = "pnDropArea";
this.pnDropArea.Size = new System.Drawing.Size(510, 234);
this.pnDropArea.TabIndex = 8;
this.pnDropArea.DragDrop += new System.Windows.Forms.DragEventHandler(this.pnDropArea_DragDrop);
this.pnDropArea.DragEnter += new System.Windows.Forms.DragEventHandler(this.pnDropArea_DragEnter);
//
// bnBrowse
//
this.bnBrowse.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.bnBrowse.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.bnBrowse.Location = new System.Drawing.Point(73, 83);
this.bnBrowse.Name = "bnBrowse";
this.bnBrowse.Size = new System.Drawing.Size(357, 77);
this.bnBrowse.TabIndex = 1;
this.bnBrowse.Text = "Drop files here or click to browse";
this.bnBrowse.UseVisualStyleBackColor = true;
this.bnBrowse.Click += new System.EventHandler(this.bnBrowse_Click);
//
// SecureFileDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.bnClose;
this.ClientSize = new System.Drawing.Size(541, 536);
this.Controls.Add(this.pnDropArea);
this.Controls.Add(this.lblTopicDescription);
this.Controls.Add(this.lblDescription);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cbTopics);
this.Controls.Add(this.cbCircles);
this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "SecureFileDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Secure File";
this.Load += new System.EventHandler(this.SecureFileDlg_Load);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.pnDropArea.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button bnClose;
private System.Windows.Forms.ComboBox cbCircles;
private System.Windows.Forms.ComboBox cbTopics;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label lblDescription;
private System.Windows.Forms.Label lblTopicDescription;
private System.Windows.Forms.Panel pnDropArea;
private System.Windows.Forms.Label lblStatus;
private System.Windows.Forms.Button bnBrowse;
}
}

140
CircleViewer/Dialogs/SecureFileDlg.cs

@ -0,0 +1,140 @@
using CircleSDK.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CDPShared;
using static System.Net.Mime.MediaTypeNames;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace CircleViewer
{
public partial class SecureFileDlg : Form
{
private CDPWorker _cdp;
public SecureFileDlg(CDPWorker cdp)
{
_cdp = cdp;
InitializeComponent();
}
async private void SecureFileDlg_Load(object sender, EventArgs e)
{
cbCircles.DataSource = _cdp.Circles;
cbCircles.DisplayMember = "CircleName";
SetStatus("Idle");
}
async private void cbCircles_SelectedValueChanged(object sender, EventArgs e)
{
CircleInfo ci = (CircleInfo) cbCircles.SelectedItem;
if (ci != null)
{
cbTopics.Enabled = false;
lblDescription.Text = ci.CircleDescription;
List<TopicInfo> topics = await _cdp.EnumTopics(ci.CircleId);
cbTopics.DataSource = topics;
cbTopics.DisplayMember = "TopicName";
cbTopics.Enabled = true;
}
else
lblDescription.Text = "";
}
private void cbTopics_SelectedValueChanged(object sender, EventArgs e)
{
TopicInfo ti = (TopicInfo)cbTopics.SelectedItem;
if (ti != null)
lblTopicDescription.Text = ti.TopicDescription;
else
lblTopicDescription.Text = "";
}
private void pnDropArea_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
void SetStatus(string txt)
{
if (lblStatus.InvokeRequired)
lblStatus.Invoke((MethodInvoker)delegate { lblStatus.Text = txt; });
else
lblStatus.Text = txt;
}
private async void pnDropArea_DragDrop(object sender, DragEventArgs e)
{
CircleInfo ci = (CircleInfo)cbCircles.SelectedItem;
TopicInfo ti = (TopicInfo)cbTopics.SelectedItem;
string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
for (int i = 0; i < s.Length; i++)
{
if (File.Exists(s[i]))
await ProcessFile(s[i]);
if (Directory.Exists(s[i]))
await ProcessFolder(s[i]);
}
}
private async Task ProcessFile(string fileName)
{
string ext = Path.GetExtension(fileName);
if (!Constants.SupportedFiles.Contains(ext.ToLower()))
{
SetStatus("File type not supported");
return;
}
CircleInfo ci = (CircleInfo)cbCircles.SelectedItem;
TopicInfo ti = (TopicInfo)cbTopics.SelectedItem;
SetStatus("Securing " + Path.GetFileName(fileName));
byte[] encryptedBuf = await _cdp.EncryptFile(ci.CircleId, ti.TopicId, fileName);
string outPath = fileName + ".cir";
SetStatus("Saving " + Path.GetFileName(fileName));
File.WriteAllBytes(outPath, encryptedBuf);
lblStatus.Invoke((MethodInvoker)delegate { lblStatus.Text = "Idle " + Path.GetFileName(fileName); });
SetStatus("Idle");
}
private async Task ProcessFolder(string folder)
{
string[] lFiles = Directory.GetFiles(folder);
foreach (string fileName in lFiles)
{
await ProcessFile(fileName);
}
}
private async void bnBrowse_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Supported Files(*.jpg; *.jpeg; *.gif; *.bmp; *.png; *.pdf; *.mp4)|*.jpg; *.jpeg; *.gif; *.bmp; *.png; *.pdf; *.mp4";
if (ofd.ShowDialog() == DialogResult.OK)
{
await ProcessFile(ofd.FileName);
}
}
}
}

1828
CircleViewer/Dialogs/SecureFileDlg.resx
File diff suppressed because it is too large
View File

78
CircleViewer/Dialogs/ViewMetaDlg.Designer.cs

@ -0,0 +1,78 @@
namespace CircleViewer.Dialogs
{
partial class ViewMetaDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn1 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
Syncfusion.WinForms.DataGrid.GridTextColumn gridTextColumn2 = new Syncfusion.WinForms.DataGrid.GridTextColumn();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ViewMetaDlg));
this.dgMeta = new Syncfusion.WinForms.DataGrid.SfDataGrid();
((System.ComponentModel.ISupportInitialize)(this.dgMeta)).BeginInit();
this.SuspendLayout();
//
// dgMeta
//
this.dgMeta.AccessibleName = "Table";
this.dgMeta.AutoSizeColumnsMode = Syncfusion.WinForms.DataGrid.Enums.AutoSizeColumnsMode.LastColumnFill;
gridTextColumn1.AllowEditing = false;
gridTextColumn1.HeaderText = "Name";
gridTextColumn1.MappingName = "Str1";
gridTextColumn2.AllowEditing = false;
gridTextColumn2.HeaderText = "Details";
gridTextColumn2.MappingName = "Str2";
this.dgMeta.Columns.Add(gridTextColumn1);
this.dgMeta.Columns.Add(gridTextColumn2);
this.dgMeta.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgMeta.Location = new System.Drawing.Point(0, 0);
this.dgMeta.Name = "dgMeta";
this.dgMeta.PreviewRowHeight = 35;
this.dgMeta.Size = new System.Drawing.Size(867, 639);
this.dgMeta.TabIndex = 1;
this.dgMeta.Text = "sfDataGrid1";
this.dgMeta.Click += new System.EventHandler(this.dgMeta_Click);
//
// ViewMetaDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(867, 639);
this.Controls.Add(this.dgMeta);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "ViewMetaDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Secure File Activity Details";
this.Load += new System.EventHandler(this.ViewMetaDlg_Load);
((System.ComponentModel.ISupportInitialize)(this.dgMeta)).EndInit();
this.ResumeLayout(false);
}
#endregion
private Syncfusion.WinForms.DataGrid.SfDataGrid dgMeta;
}
}

65
CircleViewer/Dialogs/ViewMetaDlg.cs

@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CircleViewer.Models;
namespace CircleViewer.Dialogs
{
public partial class ViewMetaDlg : Form
{
private ActivityRow _ar;
List<string> _details = new List<string>();
public ViewMetaDlg(ActivityRow ar)
{
_ar = ar;
string s = _ar.EventTime.ToString("F");
_details.Add($"Time: {s}");
_details.Add($"Operation: {_ar.Operation}");
_details.Add($"Message: {_ar.Message}");
_details.AddRange(_ar.Meta);
InitializeComponent();
}
private void ViewMetaDlg_Load(object sender, EventArgs e)
{
List<TwoStrings> l2s = new List<TwoStrings>();
foreach (string line in _details)
{
int iPos = line.IndexOf('|');
if (iPos == -1)
iPos = line.IndexOf(':');
string one = line.Substring(0, iPos);
string two = line.Substring(iPos + 1);
l2s.Add(new TwoStrings(){Str1 = one, Str2 = two});
}
dgMeta.DataSource = l2s;
}
private void dgMeta_Click(object sender, EventArgs e)
{
}
}
public class TwoStrings
{
public string Str1 { get; set; }
public string Str2 { get; set; }
public TwoStrings()
{
}
public TwoStrings(string str1, string str2)
{
Str1 = str1;
Str2 = str2;
}
}
}

407
CircleViewer/Dialogs/ViewMetaDlg.resx

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

374
CircleViewer/Form1.Designer.cs

@ -0,0 +1,374 @@

namespace CircleViewer
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
Syncfusion.Windows.Forms.PdfViewer.MessageBoxSettings messageBoxSettings1 = new Syncfusion.Windows.Forms.PdfViewer.MessageBoxSettings();
Syncfusion.Windows.PdfViewer.PdfViewerPrinterSettings pdfViewerPrinterSettings1 = new Syncfusion.Windows.PdfViewer.PdfViewerPrinterSettings();
Syncfusion.Windows.Forms.PdfViewer.TextSearchSettings textSearchSettings1 = new Syncfusion.Windows.Forms.PdfViewer.TextSearchSettings();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.encryptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tssConnectionStatus = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.tssbSettings = new System.Windows.Forms.ToolStripSplitButton();
this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.protectFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.activityToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.circleManagementToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.createNewCircleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.membershipToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.joinCircleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.inviteMemberToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.revokeMemberToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.revokeDeviceToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.registerLicenseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tsddCircle = new System.Windows.Forms.ToolStripDropDownButton();
this.tsddTopic = new System.Windows.Forms.ToolStripDropDownButton();
this.tm_updateStatus = new System.Windows.Forms.Timer(this.components);
this.pdfViewer = new Syncfusion.Windows.Forms.PdfViewer.PdfDocumentView();
this.pbLoading = new System.Windows.Forms.PictureBox();
this.pbImageViewer = new System.Windows.Forms.PictureBox();
this.wmpViewer = new AxWMPLib.AxWindowsMediaPlayer();
this.statusStrip1.SuspendLayout();
this.contextMenuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbLoading)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pbImageViewer)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.wmpViewer)).BeginInit();
this.SuspendLayout();
//
// statusStrip1
//
this.statusStrip1.ContextMenuStrip = this.contextMenuStrip1;
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tssConnectionStatus,
this.toolStripStatusLabel1,
this.tssbSettings,
this.tsddCircle,
this.tsddTopic});
this.statusStrip1.Location = new System.Drawing.Point(0, 518);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(722, 26);
this.statusStrip1.TabIndex = 0;
this.statusStrip1.Text = "statusStrip1";
//
// contextMenuStrip1
//
this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.encryptToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(161, 30);
//
// encryptToolStripMenuItem
//
this.encryptToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("encryptToolStripMenuItem.Image")));
this.encryptToolStripMenuItem.Name = "encryptToolStripMenuItem";
this.encryptToolStripMenuItem.Size = new System.Drawing.Size(160, 26);
this.encryptToolStripMenuItem.Text = "Secure file...";
this.encryptToolStripMenuItem.Click += new System.EventHandler(this.encryptToolStripMenuItem_Click);
//
// tssConnectionStatus
//
this.tssConnectionStatus.Name = "tssConnectionStatus";
this.tssConnectionStatus.Size = new System.Drawing.Size(109, 20);
this.tssConnectionStatus.Text = "Not Connected";
//
// toolStripStatusLabel1
//
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(25, 20);
this.toolStripStatusLabel1.Text = " ";
//
// tssbSettings
//
this.tssbSettings.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.tssbSettings.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.settingsToolStripMenuItem});
this.tssbSettings.Image = ((System.Drawing.Image)(resources.GetObject("tssbSettings.Image")));
this.tssbSettings.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tssbSettings.Name = "tssbSettings";
this.tssbSettings.Size = new System.Drawing.Size(39, 24);
this.tssbSettings.Text = "Settings";
this.tssbSettings.ButtonClick += new System.EventHandler(this.tssbSettings_ButtonClick);
//
// settingsToolStripMenuItem
//
this.settingsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.protectFilesToolStripMenuItem,
this.activityToolStripMenuItem,
this.toolStripSeparator1,
this.circleManagementToolStripMenuItem,
this.registerLicenseToolStripMenuItem});
this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
this.settingsToolStripMenuItem.Size = new System.Drawing.Size(145, 26);
this.settingsToolStripMenuItem.Text = "Settings";
//
// protectFilesToolStripMenuItem
//
this.protectFilesToolStripMenuItem.Name = "protectFilesToolStripMenuItem";
this.protectFilesToolStripMenuItem.Size = new System.Drawing.Size(258, 26);
this.protectFilesToolStripMenuItem.Text = "Protect Files";
this.protectFilesToolStripMenuItem.Visible = false;
this.protectFilesToolStripMenuItem.Click += new System.EventHandler(this.protectFilesToolStripMenuItem_Click);
//
// activityToolStripMenuItem
//
this.activityToolStripMenuItem.Name = "activityToolStripMenuItem";
this.activityToolStripMenuItem.Size = new System.Drawing.Size(258, 26);
this.activityToolStripMenuItem.Text = "Activity";
this.activityToolStripMenuItem.Click += new System.EventHandler(this.activityToolStripMenuItem_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(255, 6);
//
// circleManagementToolStripMenuItem
//
this.circleManagementToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.createNewCircleToolStripMenuItem,
this.membershipToolStripMenuItem});
this.circleManagementToolStripMenuItem.Name = "circleManagementToolStripMenuItem";
this.circleManagementToolStripMenuItem.Size = new System.Drawing.Size(258, 26);
this.circleManagementToolStripMenuItem.Text = "User Group Management";
//
// createNewCircleToolStripMenuItem
//
this.createNewCircleToolStripMenuItem.Name = "createNewCircleToolStripMenuItem";
this.createNewCircleToolStripMenuItem.Size = new System.Drawing.Size(247, 26);
this.createNewCircleToolStripMenuItem.Text = "Create New User Group";
this.createNewCircleToolStripMenuItem.Click += new System.EventHandler(this.createNewCircleToolStripMenuItem_Click);
//
// membershipToolStripMenuItem
//
this.membershipToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.joinCircleToolStripMenuItem,
this.inviteMemberToolStripMenuItem1,
this.revokeMemberToolStripMenuItem1,
this.revokeDeviceToolStripMenuItem1});
this.membershipToolStripMenuItem.Name = "membershipToolStripMenuItem";
this.membershipToolStripMenuItem.Size = new System.Drawing.Size(247, 26);
this.membershipToolStripMenuItem.Text = "User Enrollment";
//
// joinCircleToolStripMenuItem
//
this.joinCircleToolStripMenuItem.Name = "joinCircleToolStripMenuItem";
this.joinCircleToolStripMenuItem.Size = new System.Drawing.Size(196, 26);
this.joinCircleToolStripMenuItem.Text = "Join User Group";
this.joinCircleToolStripMenuItem.Click += new System.EventHandler(this.joinCircleToolStripMenuItem_Click);
//
// inviteMemberToolStripMenuItem1
//
this.inviteMemberToolStripMenuItem1.Name = "inviteMemberToolStripMenuItem1";
this.inviteMemberToolStripMenuItem1.Size = new System.Drawing.Size(196, 26);
this.inviteMemberToolStripMenuItem1.Text = "Add User";
this.inviteMemberToolStripMenuItem1.Click += new System.EventHandler(this.inviteMemberToolStripMenuItem1_Click);
//
// revokeMemberToolStripMenuItem1
//
this.revokeMemberToolStripMenuItem1.Name = "revokeMemberToolStripMenuItem1";
this.revokeMemberToolStripMenuItem1.Size = new System.Drawing.Size(196, 26);
this.revokeMemberToolStripMenuItem1.Text = "Revoke User";
this.revokeMemberToolStripMenuItem1.Click += new System.EventHandler(this.revokeMemberToolStripMenuItem1_Click);
//
// revokeDeviceToolStripMenuItem1
//
this.revokeDeviceToolStripMenuItem1.Name = "revokeDeviceToolStripMenuItem1";
this.revokeDeviceToolStripMenuItem1.Size = new System.Drawing.Size(196, 26);
this.revokeDeviceToolStripMenuItem1.Text = "Revoke Device";
this.revokeDeviceToolStripMenuItem1.Click += new System.EventHandler(this.revokeDeviceToolStripMenuItem1_Click);
//
// registerLicenseToolStripMenuItem
//
this.registerLicenseToolStripMenuItem.Name = "registerLicenseToolStripMenuItem";
this.registerLicenseToolStripMenuItem.Size = new System.Drawing.Size(258, 26);
this.registerLicenseToolStripMenuItem.Text = "License";
this.registerLicenseToolStripMenuItem.Click += new System.EventHandler(this.registerLicenseToolStripMenuItem_Click);
//
// tsddCircle
//
this.tsddCircle.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.tsddCircle.Image = ((System.Drawing.Image)(resources.GetObject("tsddCircle.Image")));
this.tsddCircle.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsddCircle.Name = "tsddCircle";
this.tsddCircle.Size = new System.Drawing.Size(150, 24);
this.tsddCircle.Text = "Default User Group";
this.tsddCircle.Visible = false;
//
// tsddTopic
//
this.tsddTopic.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.tsddTopic.Image = ((System.Drawing.Image)(resources.GetObject("tsddTopic.Image")));
this.tsddTopic.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsddTopic.Name = "tsddTopic";
this.tsddTopic.Size = new System.Drawing.Size(112, 24);
this.tsddTopic.Text = "Default Topic";
this.tsddTopic.Visible = false;
//
// tm_updateStatus
//
this.tm_updateStatus.Enabled = true;
this.tm_updateStatus.Tick += new System.EventHandler(this.tm_updateStatus_Tick);
//
// pdfViewer
//
this.pdfViewer.AllowDrop = true;
this.pdfViewer.AutoScroll = true;
this.pdfViewer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(237)))), ((int)(((byte)(237)))), ((int)(((byte)(237)))));
this.pdfViewer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.pdfViewer.CursorMode = Syncfusion.Windows.Forms.PdfViewer.PdfViewerCursorMode.SelectTool;
this.pdfViewer.EnableContextMenu = true;
this.pdfViewer.HorizontalScrollOffset = 0;
this.pdfViewer.IsTextSearchEnabled = true;
this.pdfViewer.IsTextSelectionEnabled = true;
this.pdfViewer.Location = new System.Drawing.Point(39, 42);
messageBoxSettings1.EnableNotification = true;
this.pdfViewer.MessageBoxSettings = messageBoxSettings1;
this.pdfViewer.MinimumZoomPercentage = 50;
this.pdfViewer.Name = "pdfViewer";
this.pdfViewer.PageBorderThickness = 1;
pdfViewerPrinterSettings1.PageOrientation = Syncfusion.Windows.PdfViewer.PdfViewerPrintOrientation.Auto;
pdfViewerPrinterSettings1.PageSize = Syncfusion.Windows.PdfViewer.PdfViewerPrintSize.ActualSize;
pdfViewerPrinterSettings1.PrintLocation = ((System.Drawing.PointF)(resources.GetObject("pdfViewerPrinterSettings1.PrintLocation")));
pdfViewerPrinterSettings1.ShowPrintStatusDialog = true;
this.pdfViewer.PrinterSettings = pdfViewerPrinterSettings1;
this.pdfViewer.ReferencePath = null;
this.pdfViewer.ScrollDisplacementValue = 0;
this.pdfViewer.ShowHorizontalScrollBar = true;
this.pdfViewer.ShowVerticalScrollBar = true;
this.pdfViewer.Size = new System.Drawing.Size(164, 164);
this.pdfViewer.SpaceBetweenPages = 8;
this.pdfViewer.TabIndex = 1;
textSearchSettings1.CurrentInstanceColor = System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(255)))), ((int)(((byte)(171)))), ((int)(((byte)(64)))));
textSearchSettings1.HighlightAllInstance = true;
textSearchSettings1.OtherInstanceColor = System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(254)))), ((int)(((byte)(255)))), ((int)(((byte)(0)))));
this.pdfViewer.TextSearchSettings = textSearchSettings1;
this.pdfViewer.ThemeName = "Default";
this.pdfViewer.VerticalScrollOffset = 0;
this.pdfViewer.VisualStyle = Syncfusion.Windows.Forms.PdfViewer.VisualStyle.Default;
this.pdfViewer.ZoomMode = Syncfusion.Windows.Forms.PdfViewer.ZoomMode.Default;
this.pdfViewer.DragDrop += new System.Windows.Forms.DragEventHandler(this.pdfViewer_DragDrop);
this.pdfViewer.DragOver += new System.Windows.Forms.DragEventHandler(this.pdfViewer_DragOver);
//
// pbLoading
//
this.pbLoading.Anchor = System.Windows.Forms.AnchorStyles.None;
this.pbLoading.Image = global::CircleViewer.Properties.Resources.C_Loader_V2_small;
this.pbLoading.Location = new System.Drawing.Point(338, 113);
this.pbLoading.Name = "pbLoading";
this.pbLoading.Size = new System.Drawing.Size(150, 150);
this.pbLoading.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbLoading.TabIndex = 3;
this.pbLoading.TabStop = false;
//
// pbImageViewer
//
this.pbImageViewer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.pbImageViewer.Location = new System.Drawing.Point(259, 57);
this.pbImageViewer.Name = "pbImageViewer";
this.pbImageViewer.Size = new System.Drawing.Size(100, 50);
this.pbImageViewer.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbImageViewer.TabIndex = 2;
this.pbImageViewer.TabStop = false;
this.pbImageViewer.DragDrop += new System.Windows.Forms.DragEventHandler(this.pbImageViewer_DragDrop);
this.pbImageViewer.DragOver += new System.Windows.Forms.DragEventHandler(this.pbImageViewer_DragOver);
//
// wmpViewer
//
this.wmpViewer.Enabled = true;
this.wmpViewer.Location = new System.Drawing.Point(515, 138);
this.wmpViewer.Name = "wmpViewer";
this.wmpViewer.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("wmpViewer.OcxState")));
this.wmpViewer.Size = new System.Drawing.Size(148, 68);
this.wmpViewer.TabIndex = 4;
//
// Form1
//
this.AllowDrop = true;
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(722, 544);
this.Controls.Add(this.wmpViewer);
this.Controls.Add(this.pbLoading);
this.Controls.Add(this.pbImageViewer);
this.Controls.Add(this.pdfViewer);
this.Controls.Add(this.statusStrip1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "Form1";
this.Text = "Circle for Data Protection";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
this.Load += new System.EventHandler(this.Form1_Load);
this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop);
this.DragOver += new System.Windows.Forms.DragEventHandler(this.Form1_DragOver);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.contextMenuStrip1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pbLoading)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pbImageViewer)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.wmpViewer)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel tssConnectionStatus;
private System.Windows.Forms.Timer tm_updateStatus;
private Syncfusion.Windows.Forms.PdfViewer.PdfDocumentView pdfViewer;
private System.Windows.Forms.PictureBox pbImageViewer;
private System.Windows.Forms.PictureBox pbLoading;
private AxWMPLib.AxWindowsMediaPlayer wmpViewer;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem encryptToolStripMenuItem;
private System.Windows.Forms.ToolStripSplitButton tssbSettings;
private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem registerLicenseToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem protectFilesToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem circleManagementToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem createNewCircleToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem membershipToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem joinCircleToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem inviteMemberToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem revokeMemberToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem revokeDeviceToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem activityToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.ToolStripDropDownButton tsddCircle;
private System.Windows.Forms.ToolStripDropDownButton tsddTopic;
}
}

521
CircleViewer/Form1.cs

@ -0,0 +1,521 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Management;
using System.Net.Http;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AxSHDocVw;
using CDPShared;
using CircleSDK.Model;
using CircleViewer.Dialogs;
using Newtonsoft.Json;
using Syncfusion.Windows.Forms;
using Syncfusion.Windows.Forms.PdfViewer;
using WMPLib;
namespace CircleViewer
{
public partial class Form1 : Form
{
private CDPWorker _cdp;
private string _circleFile;
private string _viewingFile = "";
private string _outFile = "";
private Boolean _bCurrentStatus = false;
List<string> _toDelete = new List<string>();
public Form1()
{
using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name))
{
_cdp = new CDPWorker();
string[] args = Environment.GetCommandLineArgs();
for (int i = 0; i < args.Length; i++)
MinLogging.LogIt($"args[{i}] == {args[i]}");
if ((args.Length > 1) && (File.Exists(args[1])))
_circleFile = args[1];
InitializeComponent();
// hide the borders on the viewers, they are only there so they show up in design view.
pbImageViewer.BorderStyle = BorderStyle.None;
pdfViewer.BorderStyle = BorderStyle.None;
// the pdfViewer will attempt to build the Pdfium.dll on the fly and Windows isn't going to like that
// switching the SyncFusion render
pdfViewer.RenderingEngine = PdfRenderingEngine.SfPdf;
pbLoading.Visible = true;
//pbLoading.Dock = DockStyle.Fill;
pbLoading.SizeMode = PictureBoxSizeMode.StretchImage;
HideAllViewers();
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
async void OnConnectionStatuChanged(Boolean bNewStatus)
{
if (bNewStatus)
{
tssConnectionStatus.Text = "Connected";
if (string.IsNullOrEmpty(_viewingFile) && (!string.IsNullOrEmpty(_circleFile)))
{
ViewFileAsync(_circleFile);
}
else
{
tssConnectionStatus.Text = "Ready";
pbLoading.Visible = false;
#if DEBUG
tssbSettings.Visible = true;
#endif
}
}
else
tssConnectionStatus.Text = "Not connected";
}
private void tm_updateStatus_Tick(object sender, EventArgs e)
{
if (!_cdp.Ready)
tssConnectionStatus.Text = _cdp.Status;
if (_bCurrentStatus != _cdp.Ready)
{
_bCurrentStatus = _cdp.Ready;
OnConnectionStatuChanged(_bCurrentStatus);
OnReady();
}
}
async void OnReady()
{
await LoadCircleList();
if (string.IsNullOrEmpty(Properties.Settings.Default.DefaultCircleId))
return;
_cdp.DefaultCircleId = Properties.Settings.Default.DefaultCircleId;
CircleInfo ci = await _cdp.GetCircle(Properties.Settings.Default.DefaultCircleId);
if (ci == null)
return;
tsddCircle.Text = ci.CircleName;
TopicInfo ti = await _cdp.GetTopic(ci.CircleId, Properties.Settings.Default.DefaultTopicId);
if (ti == null)
return;
_cdp.DefaultTopicId = Properties.Settings.Default.DefaultTopicId;
tsddTopic.Text = ti.TopicName;
}
private async Task LoadCircleList()
{
tsddCircle.DropDownItems.Clear();
List<CircleInfo> lci = _cdp.Circles;
if (lci == null) return;
if (lci.Count == 0) return;
tsddCircle.Visible = true; // we're a member of at least one circle, show the drop down.
lci = lci.OrderBy(r => r.CircleName).ToList();
foreach (CircleInfo info in lci)
{
ToolStripItem tsi = new ToolStripButton(info.CircleName);
tsi.DisplayStyle = ToolStripItemDisplayStyle.Text;
tsi.Tag = info;
tsi.Click += async (o, args) =>
{
Properties.Settings.Default.DefaultCircleId = info.CircleId;
Properties.Settings.Default.DefaultTopicId = "87654321-a314-4202-b959-c981a6bc3c24"; // default to the general topic on Circle change.
Properties.Settings.Default.Save();
tsddCircle.Text = info.CircleName;
tsddTopic.Text = "General";
LoadTopicList();
// what was I thinking here?!
//await SetDisplayName(info.CircleId, Environment.UserName);
};
tsddCircle.DropDownItems.Add(tsi);
}
}
async void ViewFileAsync(string fileToLoad)
{
using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name))
{
_viewingFile = fileToLoad;
YellowFile yf = new YellowFile(_viewingFile);
DecryptReply result = null;
try
{
tssConnectionStatus.Text = "Decrypting contents";
result = await _cdp.Decrypt(fileToLoad);
if (result.Status.Result.GetValueOrDefault(false))
{
byte[] buf = Convert.FromBase64String(result.DecryptedData);
string ext = Path.GetExtension(result.FileName);
await Task.Run(async () =>
{
await DoTrackingStuff(yf, result.FileName, fileToLoad);
});
switch (ext.ToLower())
{
case ".gif":
case ".jpeg":
case ".jpg":
case ".png":
case ".bmp":
ViewImage(buf);
break;
case ".mp4":
ViewMedia(buf, ext);
break;
case ".pdf":
default: // default to pdf
ViewPdf(buf);
break;
}
tssConnectionStatus.Text = "Ready";
#if DEBUG
tssbSettings.Visible = true;
#endif
}
else
{
if (result.Status.ErrorCode == 2) // CircleConstants.ErrocCodes.CircleNotFound
{
await Task.Run(async () =>
{
await _cdp.TrackUnauthorizedAccess(yf, fileToLoad);
});
MessageBox.Show("You are not authorized to view this file.", "Circle for Data Protection");
}
else
MessageBox.Show(result.Status.Message, "Circle for Data Protection");
tssConnectionStatus.Text = "Unable to view secure contents";
}
}
catch (Exception ex)
{
MessageBox.Show(result.Status.Message, "Circle for Data Protection");
MinLogging.LogIt(ex.Message);
}
pbLoading.Visible = false;
}
}
async Task DoTrackingStuff(YellowFile yf, string fileName, string sourcePath)
{
using (LogMethod.Log(MethodBase.GetCurrentMethod().ReflectedType.Name))
{
try
{
Dictionary<string, string> meta = new Dictionary<string, string>();
meta[$"Full path"] = sourcePath;
await _cdp.TrackAuthorizedAccess(yf, fileName, meta);
}
catch (Exception e)
{
MinLogging.LogIt(e.Message);
}
}
}
void HideAllViewers()
{
// hide the PDF Viewer
pdfViewer.Visible = false;
// hide the image viewer
pbImageViewer.Visible = false;
// hide the webbrowser
wmpViewer.Visible = false;
}
void ViewImage(byte[] buf)
{
HideAllViewers();
// show and configure the image viewer
pbImageViewer.Visible = true;
pbImageViewer.Dock = DockStyle.Fill;
pbImageViewer.Image = Image.FromStream(new MemoryStream(buf));
}
void ViewMedia(byte[] buf, string extention)
{
HideAllViewers();
// show and configure the media viewer
string outPath = Path.GetTempFileName();
outPath = Path.ChangeExtension(outPath, extention);
File.WriteAllBytes(outPath, buf);
wmpViewer.URL = outPath;
wmpViewer.Visible = true;
wmpViewer.Dock = DockStyle.Fill;
}
void ViewPdf(byte[] buf)
{
HideAllViewers();
// show and configure the pdf viewer
pdfViewer.Visible = true;
pdfViewer.Dock = DockStyle.Fill;
pdfViewer.Load(new MemoryStream(buf));
}
async Task<List<string>> GetFileList(string[] files)
{
List<string> retList = new List<string>();
foreach (string f in files)
{
try
{
FileAttributes attr = File.GetAttributes(f);
if (attr.HasFlag(FileAttributes.Directory))
{
retList.AddRange(Directory.GetFiles(f, "*.*", SearchOption.AllDirectories));
}
else
retList.Add(f);
}
catch (Exception e)
{
continue;
}
}
return retList;
}
private List<string> _fList = null;
async void CommonDragOver(DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = e.Data.GetData(DataFormats.FileDrop) as string[]; // get all files dropped
if ((files == null) | (files.Length == 0)) return;
if (Path.GetExtension(files[0]).ToLower() == ".cir")
{
e.Effect = DragDropEffects.Link;
return;
}
_fList = await GetFileList(files);
foreach (string fPath in _fList)
{
string ext = Path.GetExtension(fPath).ToLower();
if (string.IsNullOrEmpty(ext))
continue;
if (Constants.SupportedFiles.Contains(ext))
{
e.Effect = DragDropEffects.Copy;
return;
}
}
}
_fList = null;
e.Effect = DragDropEffects.None;
}
async void CommonDragDrop(DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = e.Data.GetData(DataFormats.FileDrop) as string[]; // get all files dropped
if ((files == null) | (files.Length == 0)) return;
if (Path.GetExtension(files[0].ToLower()) == ".cir")
{
ViewFileAsync(files[0]);
return;
}
// _fList should still be good.
await ProtectFiles(_fList);
}
}
async Task ProtectFiles(List<string> lFiles)
{
List<string> toProcess = new List<string>();
foreach (string f in _fList)
{
string ext = Path.GetExtension(f);
if (Constants.SupportedFiles.Contains(ext.ToLower()))
{
toProcess.Add(f);
}
}
MinLogging.LogIt($"About to protect {toProcess.Count} files.");
ProtectCmd cmd = new ProtectCmd(_cdp);
foreach (string f in toProcess)
{
await cmd.Process(f);
}
}
private void pdfViewer_DragOver(object sender, DragEventArgs e)
{
CommonDragOver(e);
}
private void pbImageViewer_DragOver(object sender, DragEventArgs e)
{
CommonDragOver(e);
}
private void pdfViewer_DragDrop(object sender, DragEventArgs e)
{
CommonDragDrop(e);
}
private void pbImageViewer_DragDrop(object sender, DragEventArgs e)
{
CommonDragDrop(e);
}
private void encryptToolStripMenuItem_Click(object sender, EventArgs e)
{
SecureFileDlg dlg = new SecureFileDlg(_cdp);
dlg.ShowDialog();
}
private void Form1_DragOver(object sender, DragEventArgs e)
{
CommonDragOver(e);
}
private void Form1_DragDrop(object sender, DragEventArgs e)
{
CommonDragDrop(e);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
wmpViewer.URL = "";
foreach (var s in _toDelete)
{
try
{
File.Delete(s);
}
catch (Exception ex)
{
}
}
}
private void protectFilesToolStripMenuItem_Click(object sender, EventArgs e)
{
SecureFileDlg dlg = new SecureFileDlg(_cdp);
dlg.ShowDialog();
}
private void activityToolStripMenuItem_Click(object sender, EventArgs e)
{
ActivityDlgDefault dlg = new ActivityDlgDefault(_cdp);
dlg.ShowDialog();
}
private async void LoadTopicList()
{
tsddTopic.DropDownItems.Clear();
List<TopicInfo> lti = await _cdp.EnumTopics(Properties.Settings.Default.DefaultCircleId);
if (lti == null) return;
foreach (TopicInfo info in lti)
{
if ((info.IsPrivate.GetValueOrDefault(false)) || (info.TopicId == "87654321-a314-4202-b959-c981a6bc3c24"))
{
ToolStripItem tsi = new ToolStripButton(info.TopicName);
tsi.Tag = info;
tsi.DisplayStyle = ToolStripItemDisplayStyle.Text;
tsi.Click += (o, args) =>
{
Properties.Settings.Default.DefaultTopicId = info.TopicId;
Properties.Settings.Default.Save();
tsddTopic.Text = info.TopicName;
};
tsddTopic.DropDownItems.Add(tsi);
}
}
}
private void createNewCircleToolStripMenuItem_Click(object sender, EventArgs e)
{
CreateCircleDlg dlg = new CreateCircleDlg(_cdp);
dlg.ShowDialog();
}
private void joinCircleToolStripMenuItem_Click(object sender, EventArgs e)
{
JoinCircleDlg dlg = new JoinCircleDlg(_cdp);
dlg.ShowDialog();
}
private void inviteMemberToolStripMenuItem1_Click(object sender, EventArgs e)
{
InviteMemberDlg dlg = new InviteMemberDlg(_cdp);
dlg.ShowDialog();
}
private void revokeMemberToolStripMenuItem1_Click(object sender, EventArgs e)
{
RevokeMemberDlg dlg = new RevokeMemberDlg(_cdp);
dlg.ShowDialog();
}
private void revokeDeviceToolStripMenuItem1_Click(object sender, EventArgs e)
{
RevokeDeviceDlg dlg = new RevokeDeviceDlg(_cdp);
dlg.ShowDialog();
}
private void registerLicenseToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void tssbSettings_ButtonClick(object sender, EventArgs e)
{
ActivityDlgDefault dlg = new ActivityDlgDefault(_cdp);
dlg.ShowDialog();
}
}
}

799
CircleViewer/Form1.resx

@ -0,0 +1,799 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>332, 18</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="encryptToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tssbSettings.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
P5BrAAAAAElFTkSuQmCC
</value>
</data>
<data name="tsddCircle.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="tsddTopic.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="tm_updateStatus.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>154, 17</value>
</metadata>
<data name="pdfViewerPrinterSettings1.PrintLocation" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJh
d2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAAAAAAAAAL
</value>
</data>
<data name="wmpViewer.OcxState" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACFTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5BeEhvc3QrU3RhdGUBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAtwAAAAIB
AAAAAQAAAAAAAAAAAAAAAKIAAAABAwAACAAAAAAABQAAAAAAAADwPwMAAAAAAAUAAAAAAAAAAAAIAAIA
AAAAAAMAAQAAAAsA//8DAAAAAAALAP//CAACAAAAAAADADIAAAALAAAACAAKAAAAZgB1AGwAbAAAAAsA
AAALAAAACwD//wsA//8LAAAACAACAAAAAAAIAAIAAAAAAAgAAgAAAAAACAACAAAAAAALAAAANAYAAOcB
AAAL
</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAAAAElFTkSuQmCC
</value>
</data>
</root>

104
CircleViewer/Logging.cs

@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.VisualBasic;
namespace CircleViewer
{
public class MinLogging
{
public string LoggerName = string.Empty;
static string LogFile = @"CircleViewer.txt";
static MinLogging()
{
try
{
LogFile = Path.Combine(Constants.CircleFolder, LogFile);
if (File.Exists(LogFile))
{
System.IO.FileInfo fi = new System.IO.FileInfo(LogFile);
if (fi.Length > 10000000) // don't let the log file get larger than 10MB
{
try
{
File.Delete(LogFile);
}
catch (Exception e)
{
Trace.WriteLine(e);
}
}
}
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
}
public static void LogIt(string str)
{
try
{
// only log to file if THIS is the same or higher level of detail as my desired logging level
str = string.Format("{0}|{1}|{2}", DateTime.Now, Thread.CurrentThread.ManagedThreadId, str);
lock (LogFile)
{
File.AppendAllText(LogFile, str + Environment.NewLine);
if (str.Length < 512)
{
byte[] data = Encoding.ASCII.GetBytes(str);
}
else
{
byte[] data = Encoding.ASCII.GetBytes(string.Format($"String to long. Length: {str.Length}"));
}
}
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
}
}
public class LogMethod : IDisposable
{
private string _methodName;
private Stopwatch _sw;
/// <summary>
/// Ctor now private - just called from the static Log method
/// </summary>
/// <param name="methodName">The name of the method being logged</param>
private LogMethod(string methodName)
{
_methodName = methodName;
_sw = new Stopwatch();
_sw.Start();
string msg = string.Format(">> Entering {0}", _methodName);
MinLogging.LogIt(msg);
}
/// <summary>
/// Tidy up
/// </summary>
public void Dispose()
{
_sw.Stop();
string msg = string.Format("<< Exiting {0}: elapsed Time: {1} ms", _methodName, _sw.ElapsedMilliseconds);
MinLogging.LogIt(msg);
}
public static IDisposable Log(string callingMethodTypeHardcode)
{
return new LogMethod(callingMethodTypeHardcode);
}
}
}

BIN
CircleViewer/LogoCircle.ico

BIN
CircleViewer/LogoCircle.png

After

Width: 256  |  Height: 256  |  Size: 23 KiB

149
CircleViewer/Models/ActivityRow.cs

@ -0,0 +1,149 @@
using CircleSDK.Model;
using CircleViewer.Dialogs;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using Path = System.IO.Path;
namespace CircleViewer.Models
{
public class ActivityRow
{
private MessageInfo _mi;
private CircleViewEventRecord _rec;
// resolved fields
public string Filename { get; set; }
public string Sender { get; set; }
public DateTime EventTime
{
get
{
if (_mi != null)
{
DateTime start = new DateTime(1970, 1, 1, 0, 0, 0);
return start.AddMilliseconds(Convert.ToUInt64(_mi.MessageTimeOffset)).ToLocalTime();
}
if (_rec != null)
return _rec.Event.ToLocalTime();
return DateTime.MinValue;
}
}
public string Operation
{
get
{
CircleViewMessages cvm = CircleViewMessages.Unknown;
if (_mi != null)
cvm = (CircleViewMessages)_mi.MessageType.GetValueOrDefault(10000);
if (_rec != null)
cvm = (CircleViewMessages)_rec.MsgType;
switch (cvm)
{
case CircleViewMessages.FileViewed:
return "View";
case CircleViewMessages.FileEncrypted:
return "Protect";
case CircleViewMessages.InviteGenerated:
return "Invite";
case CircleViewMessages.MemberRevoked:
return "User revoked";
case CircleViewMessages.DeviceRevoked:
return "Device revoked";
case CircleViewMessages.BlockedViewAttempt:
return "Blocked view";
default:
return "Unknown";
}
}
}
public Int32 MessageType
{
get
{
if (_mi != null)
return (Int32) _mi.MessageType;
if (_rec != null)
return (Int32)_rec.MsgType;
return 0;
}
}
public string Message
{
get
{
if (_mi != null)
return _mi.Message;
if (_rec != null)
return _rec.Message;
return "Unknown";
}
}
private List<string> _meta = new List<string>();
private Dictionary<string, string> _dic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
public ActivityRow(MessageInfo mi)
{
_mi = mi;
_meta = JsonConvert.DeserializeObject<List<string>>(_mi.AdditionalJson);
BuildDictionary();
}
void BuildDictionary()
{
List<TwoStrings> l2s = new List<TwoStrings>();
foreach (string line in _meta)
{
int iPos = line.IndexOf('|');
if (iPos == -1)
iPos = line.IndexOf(':');
string one = line.Substring(0, iPos);
string two = line.Substring(iPos + 1);
_dic[one] = two;
}
if (_dic.ContainsKey("Full path"))
{
string fileName = Path.GetFileName(_dic["Full path"]);
_dic["Filename"] = fileName;
}
}
public ActivityRow(CircleViewEventRecord rec)
{
_rec = rec;
_meta = JsonConvert.DeserializeObject<List<string>>(_rec.Meta);
BuildDictionary();
}
public List<string> Meta
{
get
{
return _meta;
}
}
public string GetValue(string name)
{
if (_dic.ContainsKey(name))
return _dic[name];
return null;
}
public void AddValue(string name, string value)
{
_dic[name] = value;
_meta.Add($"{name}|{value}");
}
}
}

26
CircleViewer/Models/CircleViewEventRecord.cs

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CircleViewer.Models
{
public class CircleViewEventRecord
{
public string id // cosmos db require id
{
get
{
return MsgId;
}
}
public string FileId { get; set; }
public string MsgId { get; set; }
public DateTime Event { get; set; }
public Int32 MsgType { get; set; }
public string Message { get; set; }
public string Meta { get; set; }
}
}

54
CircleViewer/Program.cs

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
namespace CircleViewer
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
if (args.Length > 1)
{
if (string.Compare(args[0], "protect", StringComparison.CurrentCultureIgnoreCase) == 0)
{
if (File.Exists(args[1]))
{
ProtectCmd cmd = new ProtectCmd();
Boolean b = cmd.Process(args[1]).Result;
}
}
if (string.Compare(args[0], "details", StringComparison.CurrentCultureIgnoreCase) == 0)
{
if (File.Exists(args[1]))
{
//Register Syncfusion license for WinForm, File formats, asp.net core and Xamarin
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("NTk3ODAxQDMxMzkyZTM0MmUzMGUwSmdnR0h1cEJxajFlUWU2UTkrZ3IwMUwzQlNRaU1FV0dmMmpzQlA3Mms9;NTk3ODAyQDMxMzkyZTM0MmUzMExlNW9vY2xNYWtGTWxpYms0VkNzYS9uNWNoa3pIcU9SOHBENFkxZmdLUW89;NTk3ODAzQDMxMzkyZTM0MmUzMFl2andNWXNiTVBMSDhzZUlBRVZLSWgxOC84Q3lBa0NLNWNGc2FhSE8wYTg9;NTk3ODA0QDMxMzkyZTM0MmUzMGtxeEpnSWZ4RzhFamVaTlBINUhaTERVMWRNczNCQVdXRXVzdEl5S3BHM0k9");
DetailsCmd cmd = new DetailsCmd();
cmd.Display(args[1]);
}
}
}
else
{
//Register Syncfusion license for WinForm, File formats, asp.net core and Xamarin
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("NTk3ODAxQDMxMzkyZTM0MmUzMGUwSmdnR0h1cEJxajFlUWU2UTkrZ3IwMUwzQlNRaU1FV0dmMmpzQlA3Mms9;NTk3ODAyQDMxMzkyZTM0MmUzMExlNW9vY2xNYWtGTWxpYms0VkNzYS9uNWNoa3pIcU9SOHBENFkxZmdLUW89;NTk3ODAzQDMxMzkyZTM0MmUzMFl2andNWXNiTVBMSDhzZUlBRVZLSWgxOC84Q3lBa0NLNWNGc2FhSE8wYTg9;NTk3ODA0QDMxMzkyZTM0MmUzMGtxeEpnSWZ4RzhFamVaTlBINUhaTERVMWRNczNCQVdXRXVzdEl5S3BHM0k9");
Application.EnableVisualStyles();
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
}

36
CircleViewer/Properties/AssemblyInfo.cs

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("CircleViewer")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CircleViewer")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("4cc531f1-7ef4-414d-9434-2dd2c5cef70e")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

103
CircleViewer/Properties/Resources.Designer.cs

@ -0,0 +1,103 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace CircleViewer.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CircleViewer.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap blue_circle {
get {
object obj = ResourceManager.GetObject("blue_circle", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap C_Loader_V2_small {
get {
object obj = ResourceManager.GetObject("C Loader V2_small", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Circle {
get {
object obj = ResourceManager.GetObject("Circle", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap white_circle {
get {
object obj = ResourceManager.GetObject("white_circle", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

133
CircleViewer/Properties/Resources.resx

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Circle.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="white_circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\white circle.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="blue_circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\blue circle.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="C Loader V2_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\C Loader V2_small.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

50
CircleViewer/Properties/Settings.Designer.cs

@ -0,0 +1,50 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace CircleViewer.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string DefaultCircleId {
get {
return ((string)(this["DefaultCircleId"]));
}
set {
this["DefaultCircleId"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string DefaultTopicId {
get {
return ((string)(this["DefaultTopicId"]));
}
set {
this["DefaultTopicId"] = value;
}
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save