mirror of
https://github.com/Ylianst/MeshCentralRouter
synced 2025-12-06 00:13:33 +00:00
Version 1.6
This commit is contained in:
86
LocalPipe.cs
Normal file
86
LocalPipe.cs
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO.Pipes;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Principal;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MeshCentralRouter
|
||||||
|
{
|
||||||
|
public class LocalPipeServer
|
||||||
|
{
|
||||||
|
private String name;
|
||||||
|
private byte[] buffer = new byte[4096];
|
||||||
|
private NamedPipeServerStream pipeServer;
|
||||||
|
|
||||||
|
public delegate void onArgsHandler(string args);
|
||||||
|
public event onArgsHandler onArgs;
|
||||||
|
|
||||||
|
public LocalPipeServer(string name)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
pipeServer = new NamedPipeServerStream(name, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
|
||||||
|
pipeServer.BeginWaitForConnection(new AsyncCallback(processConnection), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
try { pipeServer.Close(); } catch (Exception) { }
|
||||||
|
pipeServer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processConnection(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
try { pipeServer.EndWaitForConnection(ar); } catch (Exception) { }
|
||||||
|
try { pipeServer.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(processRead), null); } catch (Exception) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void processRead(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
try { len = pipeServer.EndRead(ar); } catch (Exception) { }
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
string args = UTF8Encoding.UTF8.GetString(buffer, 0, len);
|
||||||
|
pipeServer.Close();
|
||||||
|
onArgs(args);
|
||||||
|
pipeServer = new NamedPipeServerStream(name, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
|
||||||
|
pipeServer.BeginWaitForConnection(new AsyncCallback(processConnection), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class LocalPipeClient
|
||||||
|
{
|
||||||
|
private byte[] buffer = new byte[4096];
|
||||||
|
private NamedPipeClientStream pipeClient;
|
||||||
|
|
||||||
|
public LocalPipeClient(string name)
|
||||||
|
{
|
||||||
|
pipeClient = new NamedPipeClientStream(".", name, PipeDirection.InOut, PipeOptions.Asynchronous, TokenImpersonationLevel.None);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TrySendingArguments(string args)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
byte[] buf = UTF8Encoding.UTF8.GetBytes(args);
|
||||||
|
pipeClient.Connect(10);
|
||||||
|
pipeClient.BeginWrite(buf, 0, buf.Length, new AsyncCallback(processWrite), null);
|
||||||
|
}
|
||||||
|
catch (Exception) { return false; }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processWrite(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
try { pipeClient.EndWrite(ar); } catch (Exception) { }
|
||||||
|
pipeClient.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
61
MainForm.cs
61
MainForm.cs
@@ -28,6 +28,7 @@ using System.Web.Script.Serialization;
|
|||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace MeshCentralRouter
|
namespace MeshCentralRouter
|
||||||
{
|
{
|
||||||
@@ -55,6 +56,7 @@ namespace MeshCentralRouter
|
|||||||
public Process autoExitProc = null;
|
public Process autoExitProc = null;
|
||||||
public int deviceDoubleClickAction = 0;
|
public int deviceDoubleClickAction = 0;
|
||||||
public FileInfo nativeSshPath = null;
|
public FileInfo nativeSshPath = null;
|
||||||
|
public LocalPipeServer localPipeServer = null;
|
||||||
|
|
||||||
public bool isRouterHooked()
|
public bool isRouterHooked()
|
||||||
{
|
{
|
||||||
@@ -835,6 +837,9 @@ namespace MeshCentralRouter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clean up single instance pipe server
|
||||||
|
if (localPipeServer != null) { localPipeServer.Dispose(); localPipeServer = null; }
|
||||||
|
|
||||||
// Clean up the server
|
// Clean up the server
|
||||||
cookieRefreshTimer.Enabled = false;
|
cookieRefreshTimer.Enabled = false;
|
||||||
meshcentral.onStateChanged -= Meshcentral_onStateChanged;
|
meshcentral.onStateChanged -= Meshcentral_onStateChanged;
|
||||||
@@ -868,6 +873,62 @@ namespace MeshCentralRouter
|
|||||||
|
|
||||||
// If we need to remember the 2nd factor, ask for a cookie now.
|
// If we need to remember the 2nd factor, ask for a cookie now.
|
||||||
if (tokenRememberCheckBox.Checked) { meshcentral.sendCommand("{\"action\":\"twoFactorCookie\"}"); }
|
if (tokenRememberCheckBox.Checked) { meshcentral.sendCommand("{\"action\":\"twoFactorCookie\"}"); }
|
||||||
|
|
||||||
|
// Setup single instance pipe server
|
||||||
|
if (authLoginUrl != null) {
|
||||||
|
string urlstring = "wss://" + authLoginUrl.Host + ":" + ((authLoginUrl.Port > 0) ? authLoginUrl.Port : 443) + authLoginUrl.LocalPath;
|
||||||
|
localPipeServer = new LocalPipeServer(Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(urlstring))); // + "" + meshcentral.certHash
|
||||||
|
localPipeServer.onArgs += LocalPipeServer_onArgs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private delegate void LocalPipeServerOnArgsHandler(string args);
|
||||||
|
|
||||||
|
private void LocalPipeServer_onArgs(string args)
|
||||||
|
{
|
||||||
|
if (args.StartsWith("mcrouter://") == false) return;
|
||||||
|
if (this.InvokeRequired) { this.Invoke(new LocalPipeServerOnArgsHandler(LocalPipeServer_onArgs), args); return; }
|
||||||
|
|
||||||
|
Uri authLoginUrl2 = new Uri(args);
|
||||||
|
|
||||||
|
// Set automatic port map values
|
||||||
|
if (authLoginUrl2 != null)
|
||||||
|
{
|
||||||
|
string autoNodeId = null;
|
||||||
|
string autoRemoteIp = null;
|
||||||
|
int autoRemotePort = 0;
|
||||||
|
int autoProtocol = 0;
|
||||||
|
int autoAppId = 0;
|
||||||
|
bool autoExit = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Automatic mappings
|
||||||
|
autoNodeId = getValueFromQueryString(authLoginUrl2.Query, "nodeid");
|
||||||
|
autoRemoteIp = getValueFromQueryString(authLoginUrl2.Query, "remoteip");
|
||||||
|
autoRemotePort = int.Parse(getValueFromQueryString(authLoginUrl2.Query, "remoteport"));
|
||||||
|
autoProtocol = int.Parse(getValueFromQueryString(authLoginUrl2.Query, "protocol"));
|
||||||
|
autoAppId = int.Parse(getValueFromQueryString(authLoginUrl2.Query, "appid"));
|
||||||
|
autoExit = (getValueFromQueryString(authLoginUrl2.Query, "autoexit") == "1");
|
||||||
|
}
|
||||||
|
catch (Exception) { }
|
||||||
|
if ((autoRemotePort != 0) && (autoProtocol != 0) && (autoNodeId != null))
|
||||||
|
{
|
||||||
|
Dictionary<string, object> map = new Dictionary<string, object>();
|
||||||
|
map.Add("nodeId", autoNodeId);
|
||||||
|
if (autoRemoteIp != null) { map.Add("remoteIP", autoRemoteIp); }
|
||||||
|
map.Add("remotePort", autoRemotePort);
|
||||||
|
map.Add("localPort", 0);
|
||||||
|
map.Add("protocol", autoProtocol);
|
||||||
|
map.Add("appId", autoAppId);
|
||||||
|
map.Add("autoExit", autoExit);
|
||||||
|
map.Add("launch", 1);
|
||||||
|
mappingsToSetup = new ArrayList();
|
||||||
|
mappingsToSetup.Add(map);
|
||||||
|
devicesTabControl.SelectedIndex = 1;
|
||||||
|
setupMappings();
|
||||||
|
cancelAutoClose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -94,6 +94,7 @@
|
|||||||
<Compile Include="AddRelayMapForm.designer.cs">
|
<Compile Include="AddRelayMapForm.designer.cs">
|
||||||
<DependentUpon>AddRelayMapForm.cs</DependentUpon>
|
<DependentUpon>AddRelayMapForm.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="LocalPipe.cs" />
|
||||||
<Compile Include="SshUsernameForm.cs">
|
<Compile Include="SshUsernameForm.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|||||||
11
Program.cs
11
Program.cs
@@ -16,6 +16,7 @@ limitations under the License.
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace MeshCentralRouter
|
namespace MeshCentralRouter
|
||||||
@@ -28,6 +29,7 @@ namespace MeshCentralRouter
|
|||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
|
Uri authLoginUrl = null;
|
||||||
|
|
||||||
// Setup settings & visual style
|
// Setup settings & visual style
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
@@ -43,6 +45,15 @@ namespace MeshCentralRouter
|
|||||||
if (arg.Length > 3 && string.Compare(arg.Substring(0, 3), "-l:", true) == 0) {
|
if (arg.Length > 3 && string.Compare(arg.Substring(0, 3), "-l:", true) == 0) {
|
||||||
try { System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(arg.Substring(3)); } catch (ArgumentException) { }
|
try { System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(arg.Substring(3)); } catch (ArgumentException) { }
|
||||||
}
|
}
|
||||||
|
if (arg.Length > 11 && arg.Substring(0, 11).ToLower() == "mcrouter://") { authLoginUrl = new Uri(arg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup single instance pipe client
|
||||||
|
if (authLoginUrl != null)
|
||||||
|
{
|
||||||
|
string urlstring = "wss://" + authLoginUrl.Host + ":" + ((authLoginUrl.Port > 0) ? authLoginUrl.Port : 443) + authLoginUrl.LocalPath;
|
||||||
|
LocalPipeClient localPipeClient = new LocalPipeClient(Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(urlstring))); // + "" + meshcentral.certHash
|
||||||
|
if (localPipeClient.TrySendingArguments(authLoginUrl.ToString()) == true) { Application.Exit(); return; }
|
||||||
}
|
}
|
||||||
|
|
||||||
MainForm main;
|
MainForm main;
|
||||||
|
|||||||
@@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
|
|||||||
//
|
//
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
[assembly: AssemblyVersion("1.5.*")]
|
[assembly: AssemblyVersion("1.6.*")]
|
||||||
//[assembly: AssemblyVersion("1.0.0.0")]
|
//[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
//[assembly: AssemblyFileVersion("1.0.0.0")]
|
//[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
|
|||||||
Reference in New Issue
Block a user