2021-02-25 04:59:06 +03:00
|
|
|
|
using MahApps.Metro.Controls.Dialogs;
|
2021-03-09 12:52:09 +03:00
|
|
|
|
using Microsoft.Win32;
|
2021-03-04 11:25:36 +03:00
|
|
|
|
using ProxySU_Core.Models;
|
2021-02-25 04:59:06 +03:00
|
|
|
|
using ProxySU_Core.ViewModels;
|
|
|
|
|
using ProxySU_Core.ViewModels.Developers;
|
2021-02-28 13:22:21 +03:00
|
|
|
|
using ProxySU_Core.Views;
|
2021-02-25 04:59:06 +03:00
|
|
|
|
using Renci.SshNet;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2021-03-09 12:52:09 +03:00
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Diagnostics;
|
2021-02-25 04:59:06 +03:00
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows;
|
|
|
|
|
using System.Windows.Controls;
|
|
|
|
|
using System.Windows.Data;
|
|
|
|
|
using System.Windows.Documents;
|
|
|
|
|
using System.Windows.Input;
|
|
|
|
|
using System.Windows.Media;
|
|
|
|
|
using System.Windows.Media.Imaging;
|
|
|
|
|
using System.Windows.Shapes;
|
|
|
|
|
|
|
|
|
|
namespace ProxySU_Core
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// TerminalWindow.xaml 的交互逻辑
|
|
|
|
|
/// </summary>
|
|
|
|
|
public partial class TerminalWindow
|
|
|
|
|
{
|
2021-03-04 13:25:52 +03:00
|
|
|
|
private Record Record { get; set; }
|
2021-02-25 04:59:06 +03:00
|
|
|
|
private readonly Terminal _vm;
|
|
|
|
|
private SshClient _sshClient;
|
|
|
|
|
|
2021-03-09 12:52:09 +03:00
|
|
|
|
XrayProject project;
|
|
|
|
|
|
2021-03-04 13:25:52 +03:00
|
|
|
|
public TerminalWindow(Record record)
|
2021-02-25 04:59:06 +03:00
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
2021-03-04 11:25:36 +03:00
|
|
|
|
ResizeMode = ResizeMode.NoResize;
|
|
|
|
|
WindowStartupLocation = WindowStartupLocation.CenterScreen;
|
2021-02-25 04:59:06 +03:00
|
|
|
|
|
2021-03-04 13:25:52 +03:00
|
|
|
|
this.Record = record;
|
|
|
|
|
_vm = new Terminal(record.Host);
|
2021-02-25 04:59:06 +03:00
|
|
|
|
DataContext = _vm;
|
|
|
|
|
|
|
|
|
|
_vm.AddOutput("Connect ...");
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
OpenConnect(_vm.Host);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show(ex.Message);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnClosed(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnClosed(e);
|
2021-03-09 12:52:09 +03:00
|
|
|
|
_vm.HasConnected = false;
|
2021-02-25 04:59:06 +03:00
|
|
|
|
|
|
|
|
|
if (_sshClient != null)
|
|
|
|
|
_sshClient.Disconnect();
|
|
|
|
|
|
|
|
|
|
if (_sshClient != null)
|
|
|
|
|
_sshClient.Dispose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ConnectionInfo CreateConnectionInfo(Host host)
|
|
|
|
|
{
|
|
|
|
|
AuthenticationMethod auth = null;
|
|
|
|
|
|
|
|
|
|
if (host.SecretType == LoginSecretType.Password)
|
|
|
|
|
{
|
|
|
|
|
auth = new PasswordAuthenticationMethod(host.UserName, host.Password);
|
|
|
|
|
}
|
|
|
|
|
else if (host.SecretType == LoginSecretType.PrivateKey)
|
|
|
|
|
{
|
|
|
|
|
auth = new PrivateKeyAuthenticationMethod(host.UserName, new PrivateKeyFile(host.PrivateKeyPath));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (host.Proxy.Type == LocalProxyType.None)
|
|
|
|
|
{
|
|
|
|
|
return new ConnectionInfo(host.Address, host.Port, host.UserName, auth);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return new ConnectionInfo(
|
|
|
|
|
host: host.Address,
|
|
|
|
|
port: host.Port,
|
|
|
|
|
username: host.UserName,
|
|
|
|
|
proxyType: (ProxyTypes)(int)host.Proxy.Type,
|
|
|
|
|
proxyHost: host.Proxy.Address,
|
|
|
|
|
proxyPort: host.Proxy.Port,
|
|
|
|
|
proxyUsername: host.Proxy.UserName,
|
|
|
|
|
proxyPassword: host.Proxy.Password,
|
|
|
|
|
authenticationMethods: auth);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OpenConnect(Host host)
|
|
|
|
|
{
|
|
|
|
|
var conneInfo = CreateConnectionInfo(host);
|
|
|
|
|
_sshClient = new SshClient(conneInfo);
|
|
|
|
|
_sshClient.Connect();
|
|
|
|
|
_vm.AddOutput("Connected");
|
2021-03-09 12:52:09 +03:00
|
|
|
|
|
|
|
|
|
_vm.HasConnected = true;
|
|
|
|
|
project = new XrayProject(_sshClient, Record.Settings, WriteShell);
|
2021-02-25 04:59:06 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void WriteShell(string outShell)
|
|
|
|
|
{
|
|
|
|
|
_vm.AddOutput(outShell);
|
2021-03-04 13:25:52 +03:00
|
|
|
|
Dispatcher.Invoke(() =>
|
|
|
|
|
{
|
|
|
|
|
OutputTextBox.ScrollToEnd();
|
|
|
|
|
});
|
2021-02-25 04:59:06 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Install(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
2021-03-04 13:25:52 +03:00
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
{
|
|
|
|
|
project.Install();
|
|
|
|
|
});
|
2021-02-25 04:59:06 +03:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-09 12:52:09 +03:00
|
|
|
|
private void InstallCert(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
{
|
|
|
|
|
project.InstallCert();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UploadWeb(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var fileDialog = new OpenFileDialog();
|
|
|
|
|
fileDialog.FileOk += OnFileOk;
|
|
|
|
|
fileDialog.ShowDialog();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnFileOk(object sender, CancelEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
{
|
|
|
|
|
var file = sender as OpenFileDialog;
|
|
|
|
|
using (var stream = file.OpenFile())
|
|
|
|
|
{
|
|
|
|
|
project.UploadWeb(stream);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OpenLink(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Hyperlink link = sender as Hyperlink;
|
|
|
|
|
Process.Start(new ProcessStartInfo(link.NavigateUri.AbsoluteUri));
|
|
|
|
|
}
|
2021-02-25 04:59:06 +03:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|