1
0
mirror of https://github.com/Ylianst/MeshCentralRouter synced 2025-12-06 00:13:33 +00:00

Initial work on file manager.

This commit is contained in:
Ylian Saint-Hilaire
2020-09-17 19:25:28 -07:00
parent 629ce21336
commit eb1a47c68e
12 changed files with 2194 additions and 42 deletions

295
FileViewer.Designer.cs generated Normal file
View File

@@ -0,0 +1,295 @@
using System.Windows.Forms;
namespace MeshCentralRouter
{
partial class FileViewer
{
/// <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(FileViewer));
this.updateTimer = new System.Windows.Forms.Timer(this.components);
this.consoleTimer = new System.Windows.Forms.Timer(this.components);
this.mainToolTip = new System.Windows.Forms.ToolTip(this.components);
this.statsButton = new System.Windows.Forms.Button();
this.connectButton = new System.Windows.Forms.Button();
this.topPanel = new System.Windows.Forms.Panel();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.mainToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.consoleMessage = new System.Windows.Forms.Label();
this.mainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.panel1 = new System.Windows.Forms.Panel();
this.rightPanel = new System.Windows.Forms.Panel();
this.rightListView = new System.Windows.Forms.ListView();
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.fileIconImageList = new System.Windows.Forms.ImageList(this.components);
this.rightTopPanel = new System.Windows.Forms.Panel();
this.remoteLabel = new System.Windows.Forms.Label();
this.leftPanel = new System.Windows.Forms.Panel();
this.leftListView = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.leftTopPanel = new System.Windows.Forms.Panel();
this.localLabel = new System.Windows.Forms.Label();
this.localUpButton = new System.Windows.Forms.Button();
this.remoteUpButton = new System.Windows.Forms.Button();
this.topPanel.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.mainTableLayoutPanel.SuspendLayout();
this.rightPanel.SuspendLayout();
this.rightTopPanel.SuspendLayout();
this.leftPanel.SuspendLayout();
this.leftTopPanel.SuspendLayout();
this.SuspendLayout();
//
// updateTimer
//
this.updateTimer.Enabled = true;
this.updateTimer.Interval = 1000;
//
// consoleTimer
//
this.consoleTimer.Interval = 5000;
this.consoleTimer.Tick += new System.EventHandler(this.consoleTimer_Tick);
//
// statsButton
//
resources.ApplyResources(this.statsButton, "statsButton");
this.statsButton.Name = "statsButton";
this.statsButton.TabStop = false;
this.mainToolTip.SetToolTip(this.statsButton, resources.GetString("statsButton.ToolTip"));
this.statsButton.UseVisualStyleBackColor = true;
//
// connectButton
//
resources.ApplyResources(this.connectButton, "connectButton");
this.connectButton.Name = "connectButton";
this.connectButton.TabStop = false;
this.mainToolTip.SetToolTip(this.connectButton, resources.GetString("connectButton.ToolTip"));
this.connectButton.UseVisualStyleBackColor = true;
this.connectButton.Click += new System.EventHandler(this.connectButton_Click);
//
// topPanel
//
this.topPanel.BackColor = System.Drawing.SystemColors.Control;
this.topPanel.Controls.Add(this.statsButton);
this.topPanel.Controls.Add(this.connectButton);
resources.ApplyResources(this.topPanel, "topPanel");
this.topPanel.Name = "topPanel";
//
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mainToolStripStatusLabel});
resources.ApplyResources(this.statusStrip1, "statusStrip1");
this.statusStrip1.Name = "statusStrip1";
//
// mainToolStripStatusLabel
//
this.mainToolStripStatusLabel.Name = "mainToolStripStatusLabel";
resources.ApplyResources(this.mainToolStripStatusLabel, "mainToolStripStatusLabel");
this.mainToolStripStatusLabel.Spring = true;
//
// consoleMessage
//
resources.ApplyResources(this.consoleMessage, "consoleMessage");
this.consoleMessage.ForeColor = System.Drawing.Color.Black;
this.consoleMessage.Name = "consoleMessage";
//
// mainTableLayoutPanel
//
resources.ApplyResources(this.mainTableLayoutPanel, "mainTableLayoutPanel");
this.mainTableLayoutPanel.Controls.Add(this.panel1, 0, 0);
this.mainTableLayoutPanel.Controls.Add(this.rightPanel, 1, 0);
this.mainTableLayoutPanel.Controls.Add(this.leftPanel, 0, 0);
this.mainTableLayoutPanel.Name = "mainTableLayoutPanel";
//
// panel1
//
resources.ApplyResources(this.panel1, "panel1");
this.panel1.Name = "panel1";
//
// rightPanel
//
this.rightPanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.rightPanel.Controls.Add(this.rightListView);
this.rightPanel.Controls.Add(this.rightTopPanel);
resources.ApplyResources(this.rightPanel, "rightPanel");
this.rightPanel.Name = "rightPanel";
//
// rightListView
//
this.rightListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader3,
this.columnHeader4});
resources.ApplyResources(this.rightListView, "rightListView");
this.rightListView.FullRowSelect = true;
this.rightListView.Name = "rightListView";
this.rightListView.SmallImageList = this.fileIconImageList;
this.rightListView.UseCompatibleStateImageBehavior = false;
this.rightListView.View = System.Windows.Forms.View.Details;
//
// columnHeader3
//
resources.ApplyResources(this.columnHeader3, "columnHeader3");
//
// columnHeader4
//
resources.ApplyResources(this.columnHeader4, "columnHeader4");
//
// fileIconImageList
//
this.fileIconImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("fileIconImageList.ImageStream")));
this.fileIconImageList.TransparentColor = System.Drawing.Color.Transparent;
this.fileIconImageList.Images.SetKeyName(0, "drive16.png");
this.fileIconImageList.Images.SetKeyName(1, "folder16.png");
this.fileIconImageList.Images.SetKeyName(2, "file16.png");
//
// rightTopPanel
//
this.rightTopPanel.Controls.Add(this.remoteUpButton);
this.rightTopPanel.Controls.Add(this.remoteLabel);
resources.ApplyResources(this.rightTopPanel, "rightTopPanel");
this.rightTopPanel.Name = "rightTopPanel";
//
// remoteLabel
//
resources.ApplyResources(this.remoteLabel, "remoteLabel");
this.remoteLabel.Name = "remoteLabel";
//
// leftPanel
//
this.leftPanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.leftPanel.Controls.Add(this.consoleMessage);
this.leftPanel.Controls.Add(this.leftListView);
this.leftPanel.Controls.Add(this.leftTopPanel);
resources.ApplyResources(this.leftPanel, "leftPanel");
this.leftPanel.Name = "leftPanel";
//
// leftListView
//
this.leftListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2});
resources.ApplyResources(this.leftListView, "leftListView");
this.leftListView.FullRowSelect = true;
this.leftListView.Name = "leftListView";
this.leftListView.SmallImageList = this.fileIconImageList;
this.leftListView.UseCompatibleStateImageBehavior = false;
this.leftListView.View = System.Windows.Forms.View.Details;
this.leftListView.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.leftListView_MouseDoubleClick);
//
// columnHeader1
//
resources.ApplyResources(this.columnHeader1, "columnHeader1");
//
// columnHeader2
//
resources.ApplyResources(this.columnHeader2, "columnHeader2");
//
// leftTopPanel
//
this.leftTopPanel.Controls.Add(this.localUpButton);
this.leftTopPanel.Controls.Add(this.localLabel);
resources.ApplyResources(this.leftTopPanel, "leftTopPanel");
this.leftTopPanel.Name = "leftTopPanel";
//
// localLabel
//
resources.ApplyResources(this.localLabel, "localLabel");
this.localLabel.Name = "localLabel";
//
// localUpButton
//
resources.ApplyResources(this.localUpButton, "localUpButton");
this.localUpButton.Name = "localUpButton";
this.localUpButton.UseVisualStyleBackColor = true;
this.localUpButton.Click += new System.EventHandler(this.localUpButton_Click);
//
// remoteUpButton
//
resources.ApplyResources(this.remoteUpButton, "remoteUpButton");
this.remoteUpButton.Name = "remoteUpButton";
this.remoteUpButton.UseVisualStyleBackColor = true;
//
// FileViewer
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Control;
this.Controls.Add(this.mainTableLayoutPanel);
this.Controls.Add(this.topPanel);
this.Controls.Add(this.statusStrip1);
this.Name = "FileViewer";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Main_FormClosing);
this.Load += new System.EventHandler(this.MainForm_Load);
this.topPanel.ResumeLayout(false);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.mainTableLayoutPanel.ResumeLayout(false);
this.rightPanel.ResumeLayout(false);
this.rightTopPanel.ResumeLayout(false);
this.leftPanel.ResumeLayout(false);
this.leftPanel.PerformLayout();
this.leftTopPanel.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private Timer updateTimer;
private Timer consoleTimer;
private ToolTip mainToolTip;
private Panel topPanel;
private Button statsButton;
private Button connectButton;
private StatusStrip statusStrip1;
private ToolStripStatusLabel mainToolStripStatusLabel;
private Label consoleMessage;
private TableLayoutPanel mainTableLayoutPanel;
private Panel panel1;
private Panel rightPanel;
private ListView rightListView;
private Panel leftPanel;
private ListView leftListView;
private Panel rightTopPanel;
private Label remoteLabel;
private Panel leftTopPanel;
private Label localLabel;
private ColumnHeader columnHeader3;
private ColumnHeader columnHeader4;
private ImageList fileIconImageList;
private ColumnHeader columnHeader1;
private ColumnHeader columnHeader2;
private Button remoteUpButton;
private Button localUpButton;
}
}

463
FileViewer.cs Normal file
View File

@@ -0,0 +1,463 @@
/*
Copyright 2009-2020 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
using System;
using System.IO;
using System.Text;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Web.Script.Serialization;
using Microsoft.Win32;
namespace MeshCentralRouter
{
public partial class FileViewer : Form
{
private MeshCentralServer server = null;
private NodeClass node = null;
private int state = 0;
private RandomNumberGenerator rand = RandomNumberGenerator.Create();
private string randomIdHex = null;
public webSocketClient wc = null;
public Dictionary<string, int> userSessions = null;
public bool sessionIsRecorded = false;
public DirectoryInfo localFolder = null;
public string remoteFolder = null;
public ArrayList remoteFolderList = null;
// Stats
public long bytesIn = 0;
public long bytesInCompressed = 0;
public long bytesOut = 0;
public long bytesOutCompressed = 0;
public FileViewer(MeshCentralServer server, NodeClass node)
{
InitializeComponent();
if (node != null) { this.Text += " - " + node.name; }
this.node = node;
this.server = server;
UpdateStatus();
}
public bool updateLocalFileView()
{
leftListView.Items.Clear();
if (localFolder == null)
{
try {
DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
{
ListViewItem x = new ListViewItem(drive.Name, 0);
x.Tag = drive;
leftListView.Items.Add(x);
}
localUpButton.Enabled = false;
localLabel.Text = "Local";
}
catch (Exception) { return false; }
}
else
{
try
{
DirectoryInfo[] directories = localFolder.GetDirectories();
foreach (DirectoryInfo directory in directories)
{
ListViewItem x = new ListViewItem(directory.Name, 1);
x.Tag = directory;
leftListView.Items.Add(x);
}
FileInfo[] files = localFolder.GetFiles();
foreach (FileInfo file in files)
{
if (file.Attributes.HasFlag(System.IO.FileAttributes.Hidden)) continue;
string[] si = new string[2];
si[0] = file.Name;
si[1] = "" + file.Length;
ListViewItem x = new ListViewItem(si, 2);
x.Tag = file;
leftListView.Items.Add(x);
}
localUpButton.Enabled = true;
localLabel.Text = "Local - " + localFolder.FullName;
}
catch (Exception) { return false; }
}
return true;
}
private delegate void updateRemoteFileViewHandler();
public void updateRemoteFileView()
{
if (this.InvokeRequired) { this.Invoke(new updateRemoteFileViewHandler(updateRemoteFileView)); return; }
rightListView.Items.Clear();
if ((remoteFolder == null) || (remoteFolder == "")) {
remoteLabel.Text = "Remote";
} else {
if (node.agentid < 5)
{
remoteLabel.Text = "Remote - " + remoteFolder.Replace("/", "\\");
}
else
{
remoteLabel.Text = "Remote - " + remoteFolder;
}
}
remoteUpButton.Enabled = !((remoteFolder == null) || (remoteFolder == ""));
if (remoteFolderList != null)
{
// Display all folders
for (int i = 0; i < remoteFolderList.Count; i++)
{
Dictionary<string, object> fileItem = (Dictionary<string, object>)remoteFolderList[i];
int fileIcon = 0;
string fileName = null;
string fileDate = null;
int fileSize = -1;
if (fileItem.ContainsKey("t")) { fileIcon = (int)fileItem["t"]; }
if (fileItem.ContainsKey("n")) { fileName = (string)fileItem["n"]; }
if (fileItem.ContainsKey("d")) { fileDate = (string)fileItem["d"]; }
if (fileItem.ContainsKey("s")) { fileSize = (int)fileItem["s"]; }
if (fileIcon == 1) {
// Drive
ListViewItem x = new ListViewItem(fileName, 0);
rightListView.Items.Add(x);
} else if (fileIcon == 2) {
// Folder
ListViewItem x = new ListViewItem(fileName, 1);
rightListView.Items.Add(x);
}
}
// Display all files
for (int i = 0; i < remoteFolderList.Count; i++)
{
Dictionary<string, object> fileItem = (Dictionary<string, object>)remoteFolderList[i];
int fileIcon = 0;
string fileName = null;
string fileDate = null;
int fileSize = -1;
if (fileItem.ContainsKey("t")) { fileIcon = (int)fileItem["t"]; }
if (fileItem.ContainsKey("n")) { fileName = (string)fileItem["n"]; }
if (fileItem.ContainsKey("d")) { fileDate = (string)fileItem["d"]; }
if (fileItem.ContainsKey("s")) { fileSize = (int)fileItem["s"]; }
if (fileIcon == 3)
{
// File
string[] si = new string[2];
si[0] = fileName;
si[1] = "" + fileSize;
ListViewItem x = new ListViewItem(si, 2);
rightListView.Items.Add(x);
}
}
}
}
private void Server_onStateChanged(int state)
{
UpdateStatus();
}
private void MainForm_Load(object sender, EventArgs e)
{
updateLocalFileView();
}
private void MenuItemExit_Click(object sender, EventArgs e)
{
Close();
}
public void MenuItemConnect_Click(object sender, EventArgs e)
{
if ((wc != null) || (node == null)) return;
byte[] randomid = new byte[10];
rand.GetBytes(randomid);
randomIdHex = BitConverter.ToString(randomid).Replace("-", string.Empty);
state = 1;
string ux = server.wsurl.ToString().Replace("/control.ashx", "/");
int i = ux.IndexOf("?");
if (i >= 0) { ux = ux.Substring(0, i); }
Uri u = new Uri(ux + "meshrelay.ashx?browser=1&p=5&nodeid=" + node.nodeid + "&id=" + randomIdHex + "&auth=" + server.authCookie);
wc = new webSocketClient();
wc.onStateChanged += Wc_onStateChanged;
wc.onBinaryData += Wc_onBinaryData;
wc.onStringData += Wc_onStringData;
wc.Start(u, server.wshash);
}
private void Wc_onStateChanged(webSocketClient sender, webSocketClient.ConnectionStates wsstate)
{
switch (wsstate)
{
case webSocketClient.ConnectionStates.Disconnected:
{
// Disconnect
state = 0;
wc.Dispose();
wc = null;
break;
}
case webSocketClient.ConnectionStates.Connecting:
{
state = 1;
displayMessage(null);
break;
}
case webSocketClient.ConnectionStates.Connected:
{
// Reset stats
bytesIn = 0;
bytesInCompressed = 0;
bytesOut = 0;
bytesOutCompressed = 0;
state = 2;
string u = "*/meshrelay.ashx?p=5&nodeid=" + node.nodeid + "&id=" + randomIdHex + "&rauth=" + server.rauthCookie;
server.sendCommand("{ \"action\": \"msg\", \"type\": \"tunnel\", \"nodeid\": \"" + node.nodeid + "\", \"value\": \"" + u.ToString() + "\", \"usage\": 5 }");
displayMessage(null);
break;
}
}
UpdateStatus();
}
private void requestRemoteFolder(string path)
{
// Send initial LS command
string cmd = "{\"action\":\"ls\",\"reqid\":1,\"path\":\"" + path.Replace("\\","/") + "\"}";
byte[] bincmd = UTF8Encoding.UTF8.GetBytes(cmd);
wc.SendBinary(bincmd, 0, bincmd.Length);
}
private void Wc_onStringData(webSocketClient sender, string data, int orglen)
{
bytesIn += data.Length;
bytesInCompressed += orglen;
if ((state == 2) && ((data == "c") || (data == "cr")))
{
if (data == "cr") { sessionIsRecorded = true; }
state = 3;
UpdateStatus();
displayMessage(null);
// Send protocol
string cmd = "5";
byte[] bincmd = UTF8Encoding.UTF8.GetBytes(cmd);
wc.SendBinary(bincmd, 0, bincmd.Length);
requestRemoteFolder("");
//requestRemoteFolder("C:\\");
return;
}
if (state != 3) return;
// Parse the received JSON
Dictionary<string, object> jsonAction = new Dictionary<string, object>();
jsonAction = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(data);
if ((jsonAction == null) || (jsonAction.ContainsKey("type") == false) || (jsonAction["type"].GetType() != typeof(string))) return;
string action = jsonAction["type"].ToString();
switch (action)
{
case "metadata":
{
if ((jsonAction.ContainsKey("users") == false) || (jsonAction["users"] == null)) return;
Dictionary<string, object> usersex = (Dictionary<string, object>)jsonAction["users"];
userSessions = new Dictionary<string, int>();
foreach (string user in usersex.Keys) { userSessions.Add(user, (int)usersex[user]); }
UpdateStatus();
break;
}
case "console":
{
string msg = null;
int msgid = -1;
if ((jsonAction.ContainsKey("msg")) && (jsonAction["msg"] != null)) { msg = jsonAction["msg"].ToString(); }
if (jsonAction.ContainsKey("msgid")) { msgid = (int)jsonAction["msgid"]; }
if (msgid == 1) { msg = "Waiting for user to grant access..."; }
if (msgid == 2) { msg = "Denied"; }
if (msgid == 3) { msg = "Failed to start remote terminal session"; } // , {0} ({1})
if (msgid == 4) { msg = "Timeout"; }
if (msgid == 5) { msg = "Received invalid network data"; }
displayMessage(msg);
break;
}
}
}
private void Wc_onBinaryData(webSocketClient sender, byte[] data, int offset, int length, int orglen)
{
bytesIn += length;
bytesInCompressed += orglen;
if (state != 3) return;
if (data[offset] == 123) {
// Parse the received JSON
Dictionary<string, object> jsonAction = new Dictionary<string, object>();
jsonAction = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(UTF8Encoding.UTF8.GetString(data, offset, length));
if (jsonAction == null) return;
int reqid = 0;
if (jsonAction.ContainsKey("reqid")) { reqid = (int)jsonAction["reqid"]; }
// Result of a LS command
if (reqid == 1)
{
if (jsonAction.ContainsKey("path")) { remoteFolder = (string)jsonAction["path"]; }
if (jsonAction.ContainsKey("dir")) { remoteFolderList = (ArrayList)jsonAction["dir"]; }
updateRemoteFileView();
}
}
}
private void MenuItemDisconnect_Click(object sender, EventArgs e)
{
if (wc != null)
{
// Disconnect
state = 0;
wc.Dispose();
wc = null;
UpdateStatus();
}
else
{
// Connect
MenuItemConnect_Click(null, null);
}
displayMessage(null);
}
public delegate void UpdateStatusHandler();
private void UpdateStatus()
{
if (this.InvokeRequired) { this.Invoke(new UpdateStatusHandler(UpdateStatus)); return; }
//if (kvmControl == null) return;
switch (state)
{
case 0: // Disconnected
mainToolStripStatusLabel.Text = "Disconnected";
connectButton.Text = "Connect";
break;
case 1: // Connecting
mainToolStripStatusLabel.Text = "Connecting...";
connectButton.Text = "Disconnect";
break;
case 2: // Setup
mainToolStripStatusLabel.Text = "Setup...";
connectButton.Text = "Disconnect";
break;
case 3: // Connected
string label = "Connected";
if (sessionIsRecorded) { label += ", Recorded Session"; }
if ((userSessions != null) && (userSessions.Count > 1)) { label += string.Format(", {0} users", userSessions.Count); }
label += ".";
mainToolStripStatusLabel.Text = label;
connectButton.Text = "Disconnect";
break;
}
rightListView.Enabled = (state == 3);
if (state != 3) { rightListView.Items.Clear(); }
}
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
}
public delegate void displayMessageHandler(string msg);
public void displayMessage(string msg)
{
if (this.InvokeRequired) { this.Invoke(new displayMessageHandler(displayMessage), msg); return; }
if (msg == null)
{
consoleMessage.Visible = false;
consoleTimer.Enabled = false;
}
else
{
consoleMessage.Text = msg;
consoleMessage.Visible = true;
consoleTimer.Enabled = true;
}
}
private void consoleTimer_Tick(object sender, EventArgs e)
{
consoleMessage.Visible = false;
consoleTimer.Enabled = false;
}
private void connectButton_Click(object sender, EventArgs e)
{
if (wc != null)
{
// Disconnect
state = 0;
wc.Dispose();
wc = null;
UpdateStatus();
}
else
{
// Connect
MenuItemConnect_Click(null, null);
}
displayMessage(null);
}
private void leftListView_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListViewItem item = leftListView.GetItemAt(e.X, e.Y);
if (item != null)
{
if (item.Tag.GetType() == typeof(DriveInfo)) {
DirectoryInfo old = localFolder;
localFolder = ((DriveInfo)item.Tag).RootDirectory;
if (updateLocalFileView() == false) { localFolder = old; updateLocalFileView(); }
}
else if (item.Tag.GetType() == typeof(DirectoryInfo))
{
DirectoryInfo old = localFolder;
localFolder = (DirectoryInfo)item.Tag;
if (updateLocalFileView() == false) { localFolder = old; updateLocalFileView(); }
}
}
}
private void localUpButton_Click(object sender, EventArgs e)
{
localFolder = localFolder.Parent;
updateLocalFileView();
}
}
}

1245
FileViewer.resx Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -167,10 +167,136 @@
<metadata name="updateTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>264, 17</value>
</metadata>
<data name="&gt;&gt;clipOutboundButton.Name" xml:space="preserve">
<value>clipOutboundButton</value>
</data>
<data name="&gt;&gt;clipOutboundButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;clipOutboundButton.Parent" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;clipOutboundButton.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;clipInboundButton.Name" xml:space="preserve">
<value>clipInboundButton</value>
</data>
<data name="&gt;&gt;clipInboundButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;clipInboundButton.Parent" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;clipInboundButton.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;statsButton.Name" xml:space="preserve">
<value>statsButton</value>
</data>
<data name="&gt;&gt;statsButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;statsButton.Parent" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;statsButton.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;displaySelectComboBox.Name" xml:space="preserve">
<value>displaySelectComboBox</value>
</data>
<data name="&gt;&gt;displaySelectComboBox.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;displaySelectComboBox.Parent" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;displaySelectComboBox.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="&gt;&gt;settingsButton.Name" xml:space="preserve">
<value>settingsButton</value>
</data>
<data name="&gt;&gt;settingsButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;settingsButton.Parent" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;settingsButton.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="&gt;&gt;zoomButton.Name" xml:space="preserve">
<value>zoomButton</value>
</data>
<data name="&gt;&gt;zoomButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;zoomButton.Parent" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;zoomButton.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="&gt;&gt;cadButton.Name" xml:space="preserve">
<value>cadButton</value>
</data>
<data name="&gt;&gt;cadButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;cadButton.Parent" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;cadButton.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;connectButton.Name" xml:space="preserve">
<value>connectButton</value>
</data>
<data name="&gt;&gt;connectButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;connectButton.Parent" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;connectButton.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="topPanel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="topPanel.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="topPanel.Size" type="System.Drawing.Size, System.Drawing">
<value>1044, 32</value>
</data>
<data name="topPanel.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="topPanel.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;topPanel.Name" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;topPanel.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;topPanel.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;topPanel.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<metadata name="mainToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>509, 17</value>
</metadata>
<data name="clipOutboundButton.Enabled" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="clipOutboundButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
@@ -183,9 +309,6 @@
<data name="clipOutboundButton.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<metadata name="mainToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>509, 17</value>
</metadata>
<data name="clipOutboundButton.ToolTip" xml:space="preserve">
<value>Push local clipboard to remote device</value>
</data>
@@ -411,33 +534,6 @@
<data name="&gt;&gt;connectButton.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="topPanel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="topPanel.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="topPanel.Size" type="System.Drawing.Size, System.Drawing">
<value>1044, 32</value>
</data>
<data name="topPanel.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="topPanel.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;topPanel.Name" xml:space="preserve">
<value>topPanel</value>
</data>
<data name="&gt;&gt;topPanel.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;topPanel.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;topPanel.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="consoleMessage.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
@@ -477,6 +573,9 @@
<metadata name="consoleTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>385, 17</value>
</metadata>
<metadata name="mainToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>509, 17</value>
</metadata>
<data name="resizeKvmControl.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
@@ -493,7 +592,7 @@
<value>resizeKvmControl</value>
</data>
<data name="&gt;&gt;resizeKvmControl.Type" xml:space="preserve">
<value>MeshCentralRouter.KVMResizeControl, MeshCentralRouter, Version=1.0.7564.28683, Culture=neutral, PublicKeyToken=null</value>
<value>MeshCentralRouter.KVMResizeControl, MeshCentralRouter, Version=1.0.7565.29854, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;resizeKvmControl.Parent" xml:space="preserve">
<value>$this</value>

19
MainForm.Designer.cs generated
View File

@@ -51,6 +51,7 @@
this.pictureBox2 = new System.Windows.Forms.PictureBox();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.panel2 = new System.Windows.Forms.Panel();
this.tokenRememberCheckBox = new System.Windows.Forms.CheckBox();
this.emailTokenButton = new System.Windows.Forms.Button();
this.smsTokenButton = new System.Windows.Forms.Button();
this.tokenEmailSentLabel = new System.Windows.Forms.Label();
@@ -125,7 +126,7 @@
this.saveMappingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openMapFileDialog = new System.Windows.Forms.OpenFileDialog();
this.saveMapFileDialog = new System.Windows.Forms.SaveFileDialog();
this.tokenRememberCheckBox = new System.Windows.Forms.CheckBox();
this.remoteFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.panel5.SuspendLayout();
this.mainPanel.SuspendLayout();
this.mainTabControl.SuspendLayout();
@@ -323,6 +324,12 @@
resources.ApplyResources(this.panel2, "panel2");
this.panel2.Name = "panel2";
//
// tokenRememberCheckBox
//
resources.ApplyResources(this.tokenRememberCheckBox, "tokenRememberCheckBox");
this.tokenRememberCheckBox.Name = "tokenRememberCheckBox";
this.tokenRememberCheckBox.UseVisualStyleBackColor = true;
//
// emailTokenButton
//
resources.ApplyResources(this.emailTokenButton, "emailTokenButton");
@@ -600,6 +607,7 @@
this.addRelayMapToolStripMenuItem,
this.toolStripMenuItem3,
this.remoteDesktopToolStripMenuItem,
this.remoteFilesToolStripMenuItem,
this.httpToolStripMenuItem,
this.httpsToolStripMenuItem,
this.rdpToolStripMenuItem,
@@ -863,11 +871,11 @@
this.saveMapFileDialog.DefaultExt = "mcrouter";
resources.ApplyResources(this.saveMapFileDialog, "saveMapFileDialog");
//
// tokenRememberCheckBox
// remoteFilesToolStripMenuItem
//
resources.ApplyResources(this.tokenRememberCheckBox, "tokenRememberCheckBox");
this.tokenRememberCheckBox.Name = "tokenRememberCheckBox";
this.tokenRememberCheckBox.UseVisualStyleBackColor = true;
this.remoteFilesToolStripMenuItem.Name = "remoteFilesToolStripMenuItem";
resources.ApplyResources(this.remoteFilesToolStripMenuItem, "remoteFilesToolStripMenuItem");
this.remoteFilesToolStripMenuItem.Click += new System.EventHandler(this.remoteFilesToolStripMenuItem_Click);
//
// MainForm
//
@@ -1014,6 +1022,7 @@
private System.Windows.Forms.ToolStripMenuItem remoteDesktopToolStripMenuItem;
private System.Windows.Forms.CheckBox rememberCertCheckBox;
private System.Windows.Forms.CheckBox tokenRememberCheckBox;
private System.Windows.Forms.ToolStripMenuItem remoteFilesToolStripMenuItem;
}
}

View File

@@ -178,6 +178,7 @@ namespace MeshCentralRouter
if (arg.Length > 8 && arg.Substring(0, 8).ToLower() == "-search:") { searchTextBox.Text = arg.Substring(8); }
if (arg.Length > 11 && arg.Substring(0, 11).ToLower() == "mcrouter://") { authLoginUrl = new Uri(arg); }
if ((arg.Length > 1) && (arg[0] != '-') && (arg.ToLower().EndsWith(".mcrouter"))) { try { argflags |= loadMappingFile(File.ReadAllText(arg), 1); } catch (Exception) { } }
if (arg.ToLower() == "-localfiles") { FileViewer fileViewer = new FileViewer(meshcentral, null); fileViewer.Show(); }
}
autoLogin = (argflags == 7);
@@ -1476,6 +1477,24 @@ namespace MeshCentralRouter
}
}
private void remoteFilesToolStripMenuItem_Click(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
if (node.fileViewer == null)
{
node.fileViewer = new FileViewer(meshcentral, node);
node.fileViewer.Show();
node.fileViewer.MenuItemConnect_Click(null, null);
}
else
{
node.fileViewer.Focus();
}
}
/*
private delegate void displayMessageHandler(string msg, int buttons, string extra, int progress);
private void displayMessage(string msg, int buttons = 0, string extra = "", int progress = 0)

View File

@@ -1425,6 +1425,12 @@
<data name="remoteDesktopToolStripMenuItem.Text" xml:space="preserve">
<value>Remote Desktop...</value>
</data>
<data name="remoteFilesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>170, 22</value>
</data>
<data name="remoteFilesToolStripMenuItem.Text" xml:space="preserve">
<value>Remote Files...</value>
</data>
<data name="httpToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>170, 22</value>
</data>
@@ -1456,7 +1462,7 @@
<value>SCP</value>
</data>
<data name="devicesContextMenuStrip.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 186</value>
<value>171, 230</value>
</data>
<data name="&gt;&gt;devicesContextMenuStrip.Name" xml:space="preserve">
<value>devicesContextMenuStrip</value>
@@ -1472,7 +1478,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADg
HQAAAk1TRnQBSQFMAgEBEAEAASABAAEgAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
HQAAAk1TRnQBSQFMAgEBEAEAASgBAAEoAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABUAMAAQEBAAEYBgABPP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AJYAA/0D+AP3A/sD/yEAA/0D+gP5
A/wD/xgAAfoB+wH6A/4qAAP9A/8tAAP7A88D1QPbA88D1AO+A9QYAAP8A90D4APjA90D4APUA+MSAAP8
AZEBjwF9AU4BaAEhAfQB9QH0JAAD/gPRA8YD+ioAAcYCxwHPAtAB2ALZA90DywPBA68DmgP3FQAD2APd
@@ -1639,7 +1645,7 @@
<value>2, 88</value>
</data>
<data name="noSearchResultsLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>442, 52</value>
<value>438, 52</value>
</data>
<data name="noSearchResultsLabel.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
@@ -1678,7 +1684,7 @@
<value>2, 88</value>
</data>
<data name="noDevicesLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>442, 52</value>
<value>438, 52</value>
</data>
<data name="noDevicesLabel.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
@@ -1768,7 +1774,7 @@
<value>2, 79</value>
</data>
<data name="noMapLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>442, 52</value>
<value>438, 52</value>
</data>
<data name="noMapLabel.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
@@ -5910,6 +5916,12 @@ Click "Add" to get started.</value>
<data name="&gt;&gt;saveMapFileDialog.Type" xml:space="preserve">
<value>System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;remoteFilesToolStripMenuItem.Name" xml:space="preserve">
<value>remoteFilesToolStripMenuItem</value>
</data>
<data name="&gt;&gt;remoteFilesToolStripMenuItem.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>MainForm</value>
</data>

View File

@@ -100,6 +100,12 @@
<Compile Include="AppLaunchForm.Designer.cs">
<DependentUpon>AppLaunchForm.cs</DependentUpon>
</Compile>
<Compile Include="FileViewer.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FileViewer.Designer.cs">
<DependentUpon>FileViewer.cs</DependentUpon>
</Compile>
<Compile Include="InstallForm.cs">
<SubType>Form</SubType>
</Compile>
@@ -392,6 +398,9 @@
<EmbeddedResource Include="DeviceUserControl.zh-chs.resx">
<DependentUpon>DeviceUserControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FileViewer.resx">
<DependentUpon>FileViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="InstallForm.cs.resx">
<DependentUpon>InstallForm.cs</DependentUpon>
</EmbeddedResource>

View File

@@ -22,6 +22,7 @@ namespace MeshCentralRouter
public ListViewItem listitem;
public DeviceUserControl control;
public KVMViewer desktopViewer;
public FileViewer fileViewer;
public Dictionary<string, ulong> links;
public override string ToString() { return name; }

BIN
Resources/drive16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

BIN
Resources/file16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

BIN
Resources/folder16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B