You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
521 lines
17 KiB
521 lines
17 KiB
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();
|
|
}
|
|
}
|
|
}
|