Реорганизация
.NET Core Desktop / build (Debug) (push) Has been cancelled

This commit is contained in:
kislovdm
2026-04-27 00:15:02 +03:00
parent 2fb673661f
commit 8467399001
23 changed files with 77 additions and 88 deletions
+258
View File
@@ -0,0 +1,258 @@
using System.Drawing;
using System.Security.Cryptography;
using System.Windows.Forms;
using MonsterMonitor.Models;
namespace MonsterMonitor.UI
{
public sealed class SettingsForm : Form
{
private readonly AppSettings _settings;
private readonly TextBox _txtHost = new TextBox();
private readonly NumericUpDown _numSshPort = new NumericUpDown();
private readonly TextBox _txtUser = new TextBox();
private readonly TextBox _txtPassword = new TextBox();
private readonly CheckBox _chkSavePassword = new CheckBox();
private readonly NumericUpDown _numRemotePort = new NumericUpDown();
private readonly NumericUpDown _numLocalPort = new NumericUpDown();
private readonly NumericUpDown _numMaxFailures = new NumericUpDown();
private readonly NumericUpDown _numReconnectTimeout = new NumericUpDown();
private readonly TextBox _txtSsPath = new TextBox();
private readonly TextBox _txtSsArgs = new TextBox();
private readonly TextBox _txtSystemPassword = new TextBox();
private readonly CheckBox _chkShowSystemPassword = new CheckBox();
private readonly TextBox _txtThreeProxyPassword = new TextBox();
private readonly CheckBox _chkShowThreeProxyPassword = new CheckBox();
private readonly Button _btnGenerateThreeProxyPassword = new Button();
public SettingsForm(AppSettings settings)
{
_settings = settings;
Text = "Настройки";
Width = 560;
Height = 520;
FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false;
MinimizeBox = false;
StartPosition = FormStartPosition.CenterParent;
BuildLayout();
LoadValues();
}
private void BuildLayout()
{
var panel = new TableLayoutPanel
{
Dock = DockStyle.Fill,
Padding = new Padding(10),
ColumnCount = 2,
RowCount = 14
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 44f));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 56f));
Controls.Add(panel);
AddRow(panel, "Сервер:", _txtHost, 0);
AddRow(panel, "Порт:", _numSshPort, 1);
AddRow(panel, "Логин:", _txtUser, 2);
_txtPassword.PasswordChar = '*';
AddRow(panel, "Пароль:", _txtPassword, 3);
_chkSavePassword.Text = "Сохранить пароль";
AddRow(panel, string.Empty, _chkSavePassword, 4);
AddRow(panel, "Удаленный порт:", _numRemotePort, 5);
AddRow(panel, "Локальный порт:", _numLocalPort, 6);
AddRow(panel, "Макс. потерь:", _numMaxFailures, 7);
AddRow(panel, "Таймаут reconnect (сек):", _numReconnectTimeout, 8);
AddRow(panel, "Путь к ss:", _txtSsPath, 9);
AddRow(panel, "Аргументы ss:", _txtSsArgs, 10);
BuildSystemPasswordRow(panel, 11);
BuildThreeProxyPasswordRow(panel, 12);
foreach (var num in new[] { _numSshPort, _numRemotePort, _numLocalPort })
{
num.Minimum = 1;
num.Maximum = 65535;
}
_numMaxFailures.Minimum = 1;
_numMaxFailures.Maximum = 10;
_numReconnectTimeout.Minimum = 5;
_numReconnectTimeout.Maximum = 60;
var buttonsPanel = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.RightToLeft
};
var btnSave = new Button { Text = "Сохранить", Width = 120, Height = 30 };
var btnCancel = new Button { Text = "Отмена", Width = 120, Height = 30 };
btnSave.Click += (_, __) => SaveAndClose();
btnCancel.Click += (_, __) => DialogResult = DialogResult.Cancel;
buttonsPanel.Controls.Add(btnSave);
buttonsPanel.Controls.Add(btnCancel);
panel.Controls.Add(buttonsPanel, 0, 13);
panel.SetColumnSpan(buttonsPanel, 2);
}
private void BuildSystemPasswordRow(TableLayoutPanel panel, int row)
{
panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 34f));
panel.Controls.Add(new Label
{
Text = "Пароль Sterra:",
TextAlign = ContentAlignment.MiddleLeft,
Dock = DockStyle.Fill
}, 0, row);
var passPanel = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.LeftToRight,
WrapContents = false,
AutoSize = false
};
_txtSystemPassword.Width = 170;
_txtSystemPassword.PasswordChar = '*';
_chkShowSystemPassword.Text = "Показать";
_chkShowSystemPassword.AutoSize = true;
_chkShowSystemPassword.CheckedChanged += (_, __) =>
{
_txtSystemPassword.PasswordChar = _chkShowSystemPassword.Checked ? '\0' : '*';
};
passPanel.Controls.Add(_txtSystemPassword);
passPanel.Controls.Add(_chkShowSystemPassword);
panel.Controls.Add(passPanel, 1, row);
}
private void BuildThreeProxyPasswordRow(TableLayoutPanel panel, int row)
{
panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 34f));
panel.Controls.Add(new Label
{
Text = "Пароль прокси:",
TextAlign = ContentAlignment.MiddleLeft,
Dock = DockStyle.Fill
}, 0, row);
var passPanel = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.LeftToRight,
WrapContents = false,
AutoSize = false
};
_txtThreeProxyPassword.Width = 170;
_txtThreeProxyPassword.PasswordChar = '*';
_chkShowThreeProxyPassword.Text = "Показать";
_chkShowThreeProxyPassword.AutoSize = true;
_chkShowThreeProxyPassword.CheckedChanged += (_, __) =>
{
_txtThreeProxyPassword.PasswordChar = _chkShowThreeProxyPassword.Checked ? '\0' : '*';
};
_btnGenerateThreeProxyPassword.Text = "Сгенерировать";
_btnGenerateThreeProxyPassword.AutoSize = true;
_btnGenerateThreeProxyPassword.Click += (_, __) =>
{
_txtThreeProxyPassword.Text = GeneratePassword();
};
passPanel.Controls.Add(_txtThreeProxyPassword);
passPanel.Controls.Add(_chkShowThreeProxyPassword);
passPanel.Controls.Add(_btnGenerateThreeProxyPassword);
panel.Controls.Add(passPanel, 1, row);
}
private static void AddRow(TableLayoutPanel panel, string label, Control control, int row)
{
panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 34f));
if (!string.IsNullOrEmpty(label))
{
panel.Controls.Add(new Label
{
Text = label,
TextAlign = ContentAlignment.MiddleLeft,
Dock = DockStyle.Fill
}, 0, row);
}
control.Dock = DockStyle.Fill;
panel.Controls.Add(control, 1, row);
}
private void LoadValues()
{
_txtHost.Text = _settings.SshHost;
_numSshPort.Value = _settings.SshPort;
_txtUser.Text = _settings.SshUsername;
_txtPassword.Text = _settings.GetPassword();
_chkSavePassword.Checked = _settings.SavePassword;
_numRemotePort.Value = _settings.RemotePort;
_numLocalPort.Value = _settings.LocalPort;
_numMaxFailures.Value = _settings.MaxPingFailures;
_numReconnectTimeout.Value = _settings.ReconnectTimeoutSec;
_txtSsPath.Text = _settings.SsProcessPath;
_txtSsArgs.Text = _settings.SsArguments;
_txtSystemPassword.Text = _settings.GetSystemPassword();
_txtThreeProxyPassword.Text = _settings.GetThreeProxyPassword();
}
private void SaveAndClose()
{
if (string.IsNullOrWhiteSpace(_txtHost.Text))
{
MessageBox.Show(this, "Поле сервера обязательно.", "Валидация", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
_settings.SshHost = _txtHost.Text.Trim();
_settings.SshPort = (int)_numSshPort.Value;
_settings.SshUsername = _txtUser.Text.Trim();
_settings.SavePassword = _chkSavePassword.Checked;
_settings.SetPassword(_txtPassword.Text);
_settings.RemotePort = (int)_numRemotePort.Value;
_settings.LocalPort = (int)_numLocalPort.Value;
_settings.MaxPingFailures = (int)_numMaxFailures.Value;
_settings.ReconnectTimeoutSec = (int)_numReconnectTimeout.Value;
_settings.SsProcessPath = string.IsNullOrWhiteSpace(_txtSsPath.Text)
? System.IO.Path.Combine("App_Data", "ss", "ss.exe")
: _txtSsPath.Text.Trim();
_settings.SsArguments = string.IsNullOrWhiteSpace(_txtSsArgs.Text)
? System.IO.Path.Combine("App_Data", "ss", "ss.cfg")
: _txtSsArgs.Text.Trim();
_settings.SetSystemPassword(_txtSystemPassword.Text.Trim());
_settings.SetThreeProxyPassword(_txtThreeProxyPassword.Text.Trim());
_settings.Save();
DialogResult = DialogResult.OK;
}
private static string GeneratePassword()
{
const string alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const int length = 20;
var bytes = new byte[length];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(bytes);
}
var chars = new char[length];
for (var i = 0; i < length; i++)
{
chars[i] = alphabet[bytes[i] % alphabet.Length];
}
return new string(chars);
}
}
}