pascalabcnet/VisualPlugins/TraningControlPlugin/TeacherControlPlugin.cs
2022-08-14 15:54:41 +03:00

247 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Text;
using System.IO;
using System.Linq;
using PascalABCCompiler.SyntaxTreeConverters;
using PascalABCCompiler.SyntaxTree;
using DBAccessPluginNamespace;
namespace VisualPascalABCPlugins
{
//имя класса *_VisualPascalABCPlugin
public class VisualPascalABCPlugin_TeacherControlPlugin : IExtendedVisualPascalABCPlugin
{
private const string LabelEntered = "Авторизация: ";
private const string LabelNotEntered = "Авторизация: вход не выполнен";
public static string StringsPrefix = "VPP_REGISTER_AND_CONTROL_PLUGIN_";
IVisualEnvironmentCompiler VisualEnvironmentCompiler;
IWorkbench Workbench;
//private TeacherControlForm RegisterForm = new TeacherControlForm(); // старая форма авторизации
//private LoginForm RegisterFormNew = new LoginForm(); // новая форма авторизации
// User
SiteAccessProvider User = new SiteAccessProvider();
private PluginGUIItem Item;
public string Name { get => "Teacher Control Plugin"; }
public string Version { get => "0.1"; }
public string Copyright { get => "Copyright © 2021-2022 by Stanislav Mikhalkovich"; }
public string Login = null;
public string Password = null;
public LoginForm loginForm;
public ToolStripMenuItem menuItem = null;
public ToolStripButton toolStripButton = null;
public string AuthFileFullName = "";
public VisualPascalABCPlugin_TeacherControlPlugin(IWorkbench Workbench)
{
User.ServAddr = "https://air.mmcs.sfedu.ru/pascalabc";
loginForm = new LoginForm(this);
this.Workbench = Workbench;
VisualEnvironmentCompiler = Workbench.VisualEnvironmentCompiler;
//var tbitem = Workbench.MainForm.Controls.Find("", true);
// RegisterForm.VisualEnvironmentCompiler = VisualEnvironmentCompiler; // Пока форма регистрации никак не связана с компилятором
// Регистрация обработчика
this.Workbench.ServiceContainer.RunService.Starting += RunStartingHandler;
//Workbench.ServiceContainer.BuildService.BeforeCompile += BeforeCompileHandler;
}
public void Execute()
{
loginForm.SiteProvider = User;
loginForm.ShowDialog(); // OK никогда не будет
/*if (loginForm.Authorized)
{
toolStripButton.ToolTipText = "Авторизация выполнена";
toolStripButton.Image = loginForm.PluginImageAuthorized.Image;
}
else
{
toolStripButton.ToolTipText = "Авторизация: вход не выполнен";
toolStripButton.Image = loginForm.PluginImage.Image;
}*/
}
public string FullAuthNameFromNETDisk()
{
string authName = "";
try
{
foreach (var drive in System.IO.DriveInfo.GetDrives())
{
if (drive.DriveType != System.IO.DriveType.Network)
continue;
// Проверять, что диск сетевой!!! Для несетевых - нет!
var auth = System.IO.Path.Combine(drive.Name, "auth.dat");
if (System.IO.File.Exists(auth))
authName = auth;
}
}
catch (Exception)
{
}
return authName;
}
public string WorkingDirectory()
{
var FileName = Workbench.ServiceContainer.DocumentService.CurrentCodeFileDocument.FileName;
return System.IO.Path.GetDirectoryName(FileName);
}
public string FullLightPTName()
{
var WorkingDir = WorkingDirectory();
var lightptname = System.IO.Path.Combine(WorkingDir, "lightpt.dat");
if (System.IO.File.Exists(lightptname))
return lightptname;
return "";
}
public /*async*/ void TryLogin(string login, string pass)
{
var answer = User.Login("", login, pass);
if (answer.Result == "Success")
{
loginForm.ChangeControlsAfterLogin(login);
}
}
public bool IsMechmath() => System.Environment.MachineName.ToLower().StartsWith("mil8a-");
public void GetGUI(List<IPluginGUIItem> MenuItems, List<IPluginGUIItem> ToolBarItems)
{
// Для студентов: если в рабочем каталоге нет lightpt.dat, то кнопки не появляются
// На самом деле надо еще проверять диск P: - точнее, сетевой диск с определенной меткой (например, в его корне лежит файл auth.dat
// if (!File.Exists(Path.Combine(WorkingDir,'lightpt.dat'))
// return;
// Scan disks
// Find NET disk with auth.dat in root
// if not - return
//var WorkingDirectory = Workbench.VisualEnvironmentCompiler.Compiler.CompilerOptions.SourceFileDirectory;
var LightPTExists = false;
var AuthExists = false;
try
{
// Только на мехмате - проверяю все диски на предмет существования в корне файла auth.dat
if (IsMechmath())
AuthFileFullName = FullAuthNameFromNETDisk();
LightPTExists = FullLightPTName() != "";
AuthExists = AuthFileFullName != "";
}
catch (Exception)
{
// Погасили исключение
}
// При запуске иконка плагина показывается
// Мехмат: при наличии auth.dat в корне сетевого диска или при наличии lightpt в текущей папке !!!
// Дома: всегда у тех, у кого установлен плагин
// При запуске auth.dat ищется
// Мехмат: в корне сетевого диска (только!). Если находится, делается попытка авторизации
// Дома: в текущей папке. Если нет, ищется в папке на уровень выше. Если находится, делается попытка авторизации
// При ручной авторизации - сохранение
// Мехмат: auth сохраняется в корень сетевого диска
// Дома: auth сохраняется в папке на уровень выше текущей. Если это невозможно, то в текущей папке.
// Если это диск C, то тоже не сохранять и тогда сохранять в текущей
if (
(IsMechmath() && (LightPTExists || AuthExists)) ||
!IsMechmath() // дома - всегда
)
{
Item = new PluginGUIItem(StringsPrefix + "NAME", StringsPrefix + "DESCRIPTION", loginForm.PluginImage.Image, loginForm.PluginImage.BackColor, Execute);
MenuItems.Add(Item);
ToolBarItems.Add(Item);
}
}
string[] ReadLoginPassFromAuth(string AuthFileFullName)
{
var n = 10000;
var arr = new byte[n];
int nbytes;
using (var fs = new FileStream(AuthFileFullName, FileMode.Open))
{
nbytes = fs.Read(arr, 0, n);
}
var data = new byte[nbytes];
System.Array.Copy(arr, data, nbytes);
var lp = LoginUtils.Decrypt(data);
var lparr = lp.Split((char)10);
return lparr;
}
public void AfterAddInGUI()
{
menuItem = (ToolStripMenuItem)Item.menuItem;
toolStripButton = (ToolStripButton)Item.toolStripButton;
// Попытка выполнить автоматический вход из информации в auth.dat
// Прочитать логин и хеш пароля в auth.dat
// По идее в БД надо хранить хеш пароля.
// Авторизоваться по этому паролю через БД
// Непонятно, как сделать эту часть асинхронно
// В AuthFileFullName только auth с сетевого диска. Если он пустой, то для дома попытаться добавить сюда
// текущую папку и потом корневую папку
try {
if (!IsMechmath()) // если дома, то искать auth в текущей папке
{
var WorkingDir = WorkingDirectory();
var auth = System.IO.Path.Combine(WorkingDir,"auth.dat");
// искать auth в текущей папке
if (System.IO.File.Exists(auth))
AuthFileFullName = auth;
else
{
// искать auth в папке на уровень выше
auth = System.IO.Path.Combine(WorkingDir, "..", "auth.dat");
if (System.IO.File.Exists(auth))
{
var fi = new System.IO.FileInfo(auth);
AuthFileFullName = fi.FullName;
}
}
}
// Попытка автоматического входа
if (AuthFileFullName != "")
{
//var ss = System.IO.File.ReadAllLines(AuthFileFullName);
var ss = ReadLoginPassFromAuth(AuthFileFullName);
if (ss.Length >= 2)
{
var login = ss[0];
var pass = ss[1];
System.Threading.Tasks.Task.Run(() => TryLogin(login, pass));
}
}
}
catch (Exception e)
{
e = e;
}
}
private void RunStartingHandler(string filename)
{
/*if (RegisterForm.Registered)
{
System.IO.File.AppendAllText("d:\\runs.txt", filename + " " + DateTime.Now + '\n');
}*/
}
}
}