Merge branch 'master' of https://github.com/pascalabcnet/pascalabcnet
This commit is contained in:
commit
5356d2913c
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
|||
public const string Major = "3";
|
||||
public const string Minor = "8";
|
||||
public const string Build = "3";
|
||||
public const string Revision = "3154";
|
||||
public const string Revision = "3159";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=3
|
||||
%REVISION%=3154
|
||||
%MINOR%=8
|
||||
%REVISION%=3159
|
||||
%COREVERSION%=3
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -485,6 +485,7 @@ namespace VisualPascalABCPlugins
|
|||
|
||||
public interface ICompilerConsoleWindow
|
||||
{
|
||||
void AddTextToCompilerMessages(string text);
|
||||
void ClearConsole();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -477,6 +477,7 @@ namespace VisualPascalABCPlugins
|
|||
|
||||
public interface ICompilerConsoleWindow
|
||||
{
|
||||
void AddTextToCompilerMessages(string text);
|
||||
void ClearConsole();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.8.3.3154
|
||||
3.8.3.3159
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.8.3.3154'
|
||||
!define VERSION '3.8.3.3159'
|
||||
|
|
|
|||
|
|
@ -29,14 +29,16 @@ namespace DBAccessPluginNamespace
|
|||
var res = true;
|
||||
try
|
||||
{
|
||||
using (var sw = new System.IO.StreamWriter(filename))
|
||||
var encryptedstring = login + (char)10 + pass;
|
||||
var encr = TeacherPluginUtils.Encrypt(encryptedstring); // Здесь м.б. исключение
|
||||
using (var fs = new FileStream(filename, FileMode.Create)) // Здесь м.б. исключение
|
||||
{
|
||||
sw.WriteLine(login);
|
||||
sw.WriteLine(pass);
|
||||
fs.Write(encr, 0, encr.Length);
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception e)
|
||||
{
|
||||
Plugin.AddMessage(e);
|
||||
res = false;
|
||||
}
|
||||
return res;
|
||||
|
|
@ -44,7 +46,7 @@ namespace DBAccessPluginNamespace
|
|||
|
||||
public bool IsRootDirectory(string path)
|
||||
{
|
||||
var isroot = false;
|
||||
/*var isroot = false;
|
||||
try
|
||||
{
|
||||
var full = Path.GetFullPath(path);
|
||||
|
|
@ -52,8 +54,12 @@ namespace DBAccessPluginNamespace
|
|||
if (full == root)
|
||||
isroot = true;
|
||||
}
|
||||
catch { }
|
||||
return isroot;
|
||||
catch (Exception e)
|
||||
{
|
||||
Plugin.AddMessage(e);
|
||||
}
|
||||
return isroot;*/
|
||||
return Directory.GetParent(path) == null;
|
||||
}
|
||||
|
||||
public bool CalcParentDirectory(string path, out string parent)
|
||||
|
|
@ -62,13 +68,14 @@ namespace DBAccessPluginNamespace
|
|||
if (IsRootDirectory(path))
|
||||
return false;
|
||||
var hasparent = false;
|
||||
try
|
||||
{
|
||||
var full = Path.GetFullPath(path);
|
||||
parent = Directory.GetParent(full).FullName;
|
||||
hasparent = true;
|
||||
}
|
||||
catch { }
|
||||
|
||||
var full = Path.GetFullPath(path);
|
||||
|
||||
var di = Directory.GetParent(full);
|
||||
if (di != null)
|
||||
parent = di.FullName;
|
||||
|
||||
hasparent = true;
|
||||
return hasparent;
|
||||
}
|
||||
|
||||
|
|
@ -82,7 +89,7 @@ namespace DBAccessPluginNamespace
|
|||
// После этого перейти в корень диска и там создать этот файл
|
||||
|
||||
// SSM 11.08.22 При ручной авторизации - сохранение
|
||||
// Мехмат: auth сохраняется в корень сетевого диска
|
||||
// Мехмат: auth сохраняется в корень сетевого диска. Думаю, достаточно того же алгоритма что и дома!!!
|
||||
// Дома: auth сохраняется в папке на уровень выше текущей. Если это невозможно, то в текущей папке.
|
||||
// Если это диск C, то тоже не сохранять и тогда сохранять в текущей
|
||||
|
||||
|
|
@ -92,8 +99,11 @@ namespace DBAccessPluginNamespace
|
|||
// это происходит тогда когда школьник смонтировал сетевой диск, но зашел в Паскаль по кнопке Пуск или с рабочего стола
|
||||
// можно попробовать поискать сетевой диск
|
||||
|
||||
var AuthFileFullName = "";
|
||||
if (Plugin.IsMechmath())
|
||||
// Упрощаем. Дома сохраняем на уровень выше, а если нельзя или это корень, то в текущий
|
||||
// На мехмате если в текущем есть lightpt.dat - сохраняем на уровень выше, а если нельзя или это корень, то в текущий
|
||||
// Если в текущем нет lightpt.dat - сохраняем в корень первого сетевого диска
|
||||
|
||||
/*if (Plugin.IsMechmath)
|
||||
{
|
||||
// Найти корень сетевого диска
|
||||
// Если сетевой - текущий, то в него (это как правило)
|
||||
|
|
@ -103,7 +113,7 @@ namespace DBAccessPluginNamespace
|
|||
bool b = false;
|
||||
if (di.DriveType == System.IO.DriveType.Network)
|
||||
{
|
||||
var auth = System.IO.Path.Combine(root, "auth.dat");
|
||||
var auth = Path.Combine(root, "auth.dat");
|
||||
b = TryCreateAuthFile(auth, login, pass);
|
||||
}
|
||||
|
||||
|
|
@ -111,13 +121,13 @@ namespace DBAccessPluginNamespace
|
|||
if (!b) // Если не удалось записать
|
||||
{
|
||||
string authName = "";
|
||||
foreach (var drive in System.IO.DriveInfo.GetDrives())
|
||||
foreach (var drive in DriveInfo.GetDrives())
|
||||
{
|
||||
if (drive.DriveType != System.IO.DriveType.Network)
|
||||
if (drive.DriveType != DriveType.Network)
|
||||
continue;
|
||||
// Проверять, что диск сетевой!!! Для несетевых - нет!
|
||||
var auth = System.IO.Path.Combine(drive.Name, "auth.dat");
|
||||
if (System.IO.File.Exists(auth))
|
||||
var auth = Path.Combine(drive.Name, "auth.dat");
|
||||
if (File.Exists(auth))
|
||||
authName = auth;
|
||||
}
|
||||
b = TryCreateAuthFile(authName, login, pass);
|
||||
|
|
@ -131,7 +141,7 @@ namespace DBAccessPluginNamespace
|
|||
if (drive.DriveType != System.IO.DriveType.Network)
|
||||
continue;
|
||||
// Найти первый сетевой куда можно записать
|
||||
b = TryCreateAuthFile(authName, login, pass);
|
||||
b = TryCreateAuthFile(authName, login, pass); // тут ошибка!!!
|
||||
if (b)
|
||||
break;
|
||||
}
|
||||
|
|
@ -140,21 +150,17 @@ namespace DBAccessPluginNamespace
|
|||
}
|
||||
else // это домашний компьютер
|
||||
{
|
||||
//System.IO.Directory.GetParent
|
||||
|
||||
var workDir = Plugin.WorkingDirectory();
|
||||
//Path.GetFullPath
|
||||
|
||||
///
|
||||
// сохранить пароль в каталоге на уровень выше WorkingDir. Если это корни дисков или уровнем выше нельзя, то в текущем
|
||||
//
|
||||
//var auth = System.IO.Path.Combine(workDir, "auth.dat");
|
||||
var b1 = CalcParentDirectory(workDir, out string parent);
|
||||
bool b = false;
|
||||
if (b1 && !IsRootDirectory(parent))
|
||||
if (b1 && !IsRootDirectory(parent)) // IsRootDirectory - parent = null !!
|
||||
{
|
||||
// пытаемся в родительском
|
||||
var auth = System.IO.Path.Combine(parent, "auth.dat");
|
||||
var auth = Path.Combine(parent, "auth.dat");
|
||||
b = TryCreateAuthFile(auth, login, pass);
|
||||
if (b)
|
||||
AuthFileFullName = auth; // Эта информация нигде не используется - только для тестирования
|
||||
|
|
@ -162,11 +168,73 @@ namespace DBAccessPluginNamespace
|
|||
if (!b)
|
||||
{
|
||||
// пытаемся в текущем. Если он корень - ну, человек так хотел
|
||||
var auth = System.IO.Path.Combine(workDir, "auth.dat");
|
||||
var auth = Path.Combine(workDir, "auth.dat");
|
||||
b = TryCreateAuthFile(auth, login, pass);
|
||||
if (b)
|
||||
AuthFileFullName = auth; // Эта информация нигде не используется - только для тестирования
|
||||
}
|
||||
}*/
|
||||
|
||||
// ПО НОВОМУ SSM 19.08.22
|
||||
var AuthFileFullName = "";
|
||||
var workDir = Plugin.WorkingDirectory();
|
||||
var parentDir = "";
|
||||
var parentDirExists = false;
|
||||
var parentIsRoot = true;
|
||||
|
||||
var fullworkDir = Path.GetFullPath(workDir);
|
||||
|
||||
var di = Directory.GetParent(fullworkDir);
|
||||
if (di != null)
|
||||
{
|
||||
parentDir = di.FullName;
|
||||
parentDirExists = true;
|
||||
parentIsRoot = Directory.GetParent(parentDir) != null;
|
||||
}
|
||||
|
||||
// На мехмате проверяем lightPT
|
||||
var isLightPT = Plugin.IsLightPTInWorkingDirectiry();
|
||||
// Первый вариант - в родительский или текущий
|
||||
var authCreated = false;
|
||||
|
||||
// Если в текущем есть lightpt.dat то мехмат или не мехмат - пытаемся создать файл авторизации в родительском или в текущем
|
||||
if (isLightPT)
|
||||
{
|
||||
// пытаемся создать в родительском
|
||||
if (parentDirExists)
|
||||
{
|
||||
var auth = Path.Combine(parentDir, "auth.dat");
|
||||
authCreated = TryCreateAuthFile(auth, login, pass);
|
||||
if (authCreated)
|
||||
AuthFileFullName = auth; // Эта информация нигде не используется - только для тестирования
|
||||
}
|
||||
// если не получилось, пытаемся создать в текущем
|
||||
if (!authCreated)
|
||||
{
|
||||
var auth = Path.Combine(workDir, "auth.dat");
|
||||
authCreated = TryCreateAuthFile(auth, login, pass);
|
||||
if (authCreated)
|
||||
AuthFileFullName = auth; // Эта информация нигде не используется - только для тестирования
|
||||
}
|
||||
}
|
||||
// Бывает так, что auth файл не создался. Обычно это означает, что в текущем нет lightPT.
|
||||
// Но может записать нельзя
|
||||
// Тогда остается последняя возможность. Если это мехмат, то ищем сетевой диск и пишем в корень туда
|
||||
if (!authCreated && Plugin.IsMechmath)
|
||||
{
|
||||
foreach (var drive in DriveInfo.GetDrives())
|
||||
{
|
||||
if (drive.DriveType != System.IO.DriveType.Network)
|
||||
continue;
|
||||
var auth = Path.Combine(drive.Name, "auth.dat");
|
||||
// Найти первый сетевой куда можно записать
|
||||
authCreated = TryCreateAuthFile(auth, login, pass);
|
||||
if (authCreated)
|
||||
{
|
||||
AuthFileFullName = auth; // Эта информация нигде не используется - только для тестирования
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -195,8 +263,7 @@ namespace DBAccessPluginNamespace
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageBox.Show(e.ToString());
|
||||
e = e;
|
||||
Plugin.AddMessage(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -234,6 +301,7 @@ namespace DBAccessPluginNamespace
|
|||
if (Text.StartsWith("Авторизация: нет связи с сервером"))
|
||||
Text = "Авторизация";
|
||||
|
||||
|
||||
var answer = await SiteProvider.Login("", usersNamesBox.Text, passwordBox.Text);
|
||||
if (answer == "Success")
|
||||
{
|
||||
|
|
@ -249,7 +317,7 @@ namespace DBAccessPluginNamespace
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.ToString());
|
||||
Plugin.AddMessage(ex);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -284,7 +352,7 @@ namespace DBAccessPluginNamespace
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.ToString());
|
||||
Plugin.AddMessage(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -314,7 +382,7 @@ namespace DBAccessPluginNamespace
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.ToString());
|
||||
Plugin.AddMessage(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,8 +43,11 @@ namespace DBAccessPluginNamespace
|
|||
if (UserType != UserTypeEnum.Student) return "Cannot write activity, because you're teacher!";
|
||||
|
||||
// Если клиент ещё не создан был, пересоздаём
|
||||
if (client == null) client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
if (client == null)
|
||||
{
|
||||
client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
}
|
||||
// Словарик для параметров запроса
|
||||
var values = new Dictionary<string, string>
|
||||
{
|
||||
|
|
@ -79,8 +82,11 @@ namespace DBAccessPluginNamespace
|
|||
async public Task<string> GetContents()
|
||||
{
|
||||
// Если клиент ещё не создан был, пересоздаём
|
||||
if (client == null) client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
if (client == null)
|
||||
{
|
||||
client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
}
|
||||
// Тут не столь важно что отправлять, можно и пустой список параметров
|
||||
var values = new Dictionary<string, string>
|
||||
{
|
||||
|
|
@ -103,8 +109,11 @@ namespace DBAccessPluginNamespace
|
|||
if (ServAddr == "") return "Error";
|
||||
|
||||
// Если клиент ещё не создан был, пересоздаём
|
||||
if (client == null) client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
if (client == null)
|
||||
{
|
||||
client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
}
|
||||
var values = new Dictionary<string, string>();
|
||||
var content = new FormUrlEncodedContent(values);
|
||||
var response = await client.PostAsync(ServAddr + "/groupslist.php", content);
|
||||
|
|
@ -122,8 +131,11 @@ namespace DBAccessPluginNamespace
|
|||
ServAddr = ServerAddr;
|
||||
if (ServAddr == "") return "Error";
|
||||
// Если клиент ещё не создан был, пересоздаём
|
||||
if (client == null) client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
if (client == null)
|
||||
{
|
||||
client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
}
|
||||
Group = GroupName;
|
||||
var values = new Dictionary<string, string>
|
||||
{
|
||||
|
|
@ -148,8 +160,11 @@ namespace DBAccessPluginNamespace
|
|||
ShortFIO = shortFIO;
|
||||
FullFIO = fullFIO;
|
||||
Password = password;
|
||||
if (client == null) client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
if (client == null)
|
||||
{
|
||||
client = new HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(10);
|
||||
}
|
||||
|
||||
// Словарик для параметров запроса
|
||||
var values = new Dictionary<string, string>
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ 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;
|
||||
|
|
@ -36,7 +37,9 @@ namespace VisualPascalABCPlugins
|
|||
public ToolStripMenuItem menuItem = null;
|
||||
public ToolStripButton toolStripButton = null;
|
||||
|
||||
public string AuthFileFullName = "";
|
||||
// public string AuthFileFullName = "";
|
||||
|
||||
public bool IsMechmath = System.Environment.MachineName.ToLower().StartsWith("mil8a-");
|
||||
|
||||
public VisualPascalABCPlugin_TeacherControlPlugin(IWorkbench Workbench)
|
||||
{
|
||||
|
|
@ -44,7 +47,6 @@ namespace VisualPascalABCPlugins
|
|||
loginForm = new LoginForm(this);
|
||||
this.Workbench = Workbench;
|
||||
VisualEnvironmentCompiler = Workbench.VisualEnvironmentCompiler;
|
||||
//var tbitem = Workbench.MainForm.Controls.Find("", true);
|
||||
// RegisterForm.VisualEnvironmentCompiler = VisualEnvironmentCompiler; // Пока форма регистрации никак не связана с компилятором
|
||||
|
||||
// Регистрация обработчика
|
||||
|
|
@ -54,40 +56,14 @@ namespace VisualPascalABCPlugins
|
|||
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()
|
||||
public void AddMessage(string text)
|
||||
{
|
||||
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;
|
||||
Workbench.CompilerConsoleWindow.AddTextToCompilerMessages(text + Environment.NewLine);
|
||||
}
|
||||
public void AddMessage(Exception e) => AddMessage(e.ToString());
|
||||
|
||||
public string WorkingDirectory()
|
||||
{
|
||||
|
|
@ -98,22 +74,104 @@ namespace VisualPascalABCPlugins
|
|||
public string FullLightPTName()
|
||||
{
|
||||
var WorkingDir = WorkingDirectory();
|
||||
var lightptname = System.IO.Path.Combine(WorkingDir, "lightpt.dat");
|
||||
if (System.IO.File.Exists(lightptname))
|
||||
var lightptname = Path.Combine(WorkingDir, "lightpt.dat");
|
||||
if (File.Exists(lightptname))
|
||||
return lightptname;
|
||||
return "";
|
||||
}
|
||||
|
||||
public bool IsLightPTInWorkingDirectiry()
|
||||
{
|
||||
var WorkingDir = WorkingDirectory();
|
||||
var lightptname = Path.Combine(WorkingDir, "lightpt.dat");
|
||||
return File.Exists(lightptname);
|
||||
}
|
||||
|
||||
public /*async*/ void TryLogin(string login, string pass)
|
||||
{
|
||||
var answer = User.Login("", login, pass);
|
||||
if (answer.Result == "Success")
|
||||
// Гасим все исключения
|
||||
try
|
||||
{
|
||||
loginForm.ChangeControlsAfterLogin(login);
|
||||
var answer = User.Login("", login, pass);
|
||||
if (answer.Result == "Success")
|
||||
{
|
||||
loginForm.ChangeControlsAfterLogin(login);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
AddMessage(e);
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsMechmath() => System.Environment.MachineName.ToLower().StartsWith("mil8a-");
|
||||
public string FullAuthNameFromNETDisk()
|
||||
{
|
||||
var AuthFileFullName = "";
|
||||
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))
|
||||
AuthFileFullName = auth;
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{ } // Тут исключение быть не может и даже если, то неинформативно
|
||||
|
||||
return AuthFileFullName;
|
||||
}
|
||||
|
||||
public string FullAuthNameFromWorkingDirOrParent()
|
||||
{
|
||||
var AuthFileFullName = "";
|
||||
try
|
||||
{
|
||||
var WorkingDir = WorkingDirectory();
|
||||
var auth = Path.Combine(WorkingDir, "auth.dat");
|
||||
var exists = false;
|
||||
if (File.Exists(auth)) // искать auth в текущей папке. Если нет, то
|
||||
exists = true;
|
||||
else
|
||||
{
|
||||
auth = Path.Combine(WorkingDir, "..", "auth.dat"); // искать auth в папке на уровень выше
|
||||
if (File.Exists(auth))
|
||||
exists = true;
|
||||
}
|
||||
if (exists) // то в auth - его путь Преобразуем его в полный путь
|
||||
{
|
||||
var fi = new System.IO.FileInfo(auth);
|
||||
AuthFileFullName = fi.FullName;
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{ }
|
||||
|
||||
return AuthFileFullName;
|
||||
}
|
||||
|
||||
public string CalcAuthFullName()
|
||||
{
|
||||
var AuthFileFullName = "";
|
||||
|
||||
// На мехмате - проверяю все диски на предмет существования в корне файла auth.dat
|
||||
if (IsMechmath)
|
||||
AuthFileFullName = FullAuthNameFromNETDisk();
|
||||
else // Это домашний компьютер
|
||||
AuthFileFullName = FullAuthNameFromWorkingDirOrParent();
|
||||
|
||||
return AuthFileFullName;
|
||||
}
|
||||
|
||||
public void InitItems(List<IPluginGUIItem> MenuItems, List<IPluginGUIItem> ToolBarItems)
|
||||
{
|
||||
Item = new PluginGUIItem(StringsPrefix + "NAME", StringsPrefix + "DESCRIPTION", loginForm.PluginImage.Image, loginForm.PluginImage.BackColor, Execute);
|
||||
MenuItems.Add(Item);
|
||||
ToolBarItems.Add(Item);
|
||||
}
|
||||
|
||||
public void GetGUI(List<IPluginGUIItem> MenuItems, List<IPluginGUIItem> ToolBarItems)
|
||||
{
|
||||
|
|
@ -125,96 +183,86 @@ namespace VisualPascalABCPlugins
|
|||
// 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, то тоже не сохранять и тогда сохранять в текущей
|
||||
// Мехмат: auth сохраняется в корень сетевого диска
|
||||
// Дома: auth сохраняется в папке на уровень выше текущей. Если это невозможно, то в текущей папке.
|
||||
// Если это диск C, то тоже не сохранять и тогда сохранять в текущей
|
||||
|
||||
if (
|
||||
(IsMechmath() && (LightPTExists || AuthExists)) ||
|
||||
!IsMechmath() // дома - всегда
|
||||
)
|
||||
// При запуске кнопки плагина показываются
|
||||
// Дома: всегда у тех, у кого установлен плагин
|
||||
// Мехмат: при наличии lightpt в текущей папке или при наличии auth.dat в корне сетевого диска !!!
|
||||
if (!IsMechmath) // дома - всегда
|
||||
InitItems(MenuItems, ToolBarItems);
|
||||
else // это мехмат
|
||||
{
|
||||
Item = new PluginGUIItem(StringsPrefix + "NAME", StringsPrefix + "DESCRIPTION", loginForm.PluginImage.Image, loginForm.PluginImage.BackColor, Execute);
|
||||
MenuItems.Add(Item);
|
||||
ToolBarItems.Add(Item);
|
||||
if (IsLightPTInWorkingDirectiry()) // если lightpt.dat существует в текущем
|
||||
InitItems(MenuItems, ToolBarItems);
|
||||
else
|
||||
{
|
||||
var AuthFileFullName = FullAuthNameFromNETDisk();
|
||||
if (AuthFileFullName != "") // если auth.dat существует в корне сетевого диска
|
||||
InitItems(MenuItems, ToolBarItems);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AfterAddInGUI()
|
||||
{
|
||||
if (Item == null) // Если не показали кнопки, то нет смысла в дальнейших действиях - плагин неактивен
|
||||
{
|
||||
AddMessage("Плагин Teacher Control отключён. Не выполнено условие LightPTExists || AuthExists");
|
||||
return;
|
||||
}
|
||||
menuItem = (ToolStripMenuItem)Item.menuItem;
|
||||
toolStripButton = (ToolStripButton)Item.toolStripButton;
|
||||
// Попытка выполнить автоматический вход из информации в auth.dat
|
||||
// Прочитать логин и хеш пароля в auth.dat
|
||||
// По идее в БД надо хранить хеш пароля.
|
||||
// Авторизоваться по этому паролю через БД
|
||||
// Непонятно, как сделать эту часть асинхронно
|
||||
|
||||
// В AuthFileFullName только auth с сетевого диска. Если он пустой, то для дома попытаться добавить сюда
|
||||
// текущую папку и потом корневую папку
|
||||
try {
|
||||
if (!IsMechmath()) // если дома, то искать auth в текущей папке
|
||||
// При запуске auth.dat ищется и делается попытка авторизации:
|
||||
// Мехмат: в корне сетевого диска (только!). Если находится, делается попытка авторизации
|
||||
// Дома: в текущей папке. Если нет, ищется в папке на уровень выше. Если находится, делается попытка авторизации
|
||||
// При этом на мехмате не ищется lightpt.dat в текущем
|
||||
|
||||
// Версия. Разрешить на мехмате автоматически авторизоваться если заходим из папки с lightpt.dat
|
||||
// А если его нет, то ищем auth в корне сетевого
|
||||
// Последовательность поиска auth.dat на мехмате:
|
||||
// В текущем, на уровень выше (только если в текущем есть lightpt) и на сетевом
|
||||
try
|
||||
{
|
||||
// Попытка автоматического входа
|
||||
// AuthFileFullName для мехмата был запомнен в GetGUI
|
||||
// Нет - только на мехмате. Заполнить если дома!!!
|
||||
// Думаю, здесь всё надо перевычислить. Начать с текущего, потом на уровень выше и потом в корень сетевого диска
|
||||
|
||||
// !!! НАДО ТУТ ИСКАТЬ lightpt.dat в текущем!!!
|
||||
var AuthFileFullName = "";
|
||||
if (IsLightPTInWorkingDirectiry()) // Только если lightPT.dat в текущем, ищем auth.dat в текущем или выше
|
||||
AuthFileFullName = FullAuthNameFromWorkingDirOrParent();
|
||||
if (AuthFileFullName == "" && IsMechmath)
|
||||
{
|
||||
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))
|
||||
AuthFileFullName = auth;
|
||||
}
|
||||
AuthFileFullName = FullAuthNameFromNETDisk();
|
||||
}
|
||||
|
||||
if (AuthFileFullName != "")
|
||||
{
|
||||
var ss = System.IO.File.ReadAllLines(AuthFileFullName);
|
||||
//var ss = File.ReadAllLines(AuthFileFullName);
|
||||
var ss = TeacherPluginUtils.ReadLoginPassFromAuth(AuthFileFullName);
|
||||
if (ss.Length >= 2)
|
||||
{
|
||||
var login = ss[0];
|
||||
var pass = ss[1];
|
||||
// В TryLogin может быть исключение, которое не перехватывается этим кодом, т.к.в другом потоке
|
||||
System.Threading.Tasks.Task.Run(() => TryLogin(login, pass));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{ }
|
||||
catch (Exception e)
|
||||
{
|
||||
AddMessage(e); // И тут уже вывести причину. Она только в ReadLoginPassFromAuth может быть
|
||||
}
|
||||
}
|
||||
|
||||
private void RunStartingHandler(string filename)
|
||||
{
|
||||
/*if (RegisterForm.Registered)
|
||||
{
|
||||
System.IO.File.AppendAllText("d:\\runs.txt", filename + " " + DateTime.Now + '\n');
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,7 +59,9 @@
|
|||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Management" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Security" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
|
|
@ -70,6 +72,7 @@
|
|||
<Compile Include="LoginForm.designer.cs">
|
||||
<DependentUpon>LoginForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="TeacherPluginUtils.cs" />
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ using System.IO;
|
|||
|
||||
namespace VisualPascalABCPlugins
|
||||
{
|
||||
public static class LoginUtils
|
||||
public static class TeacherPluginUtils
|
||||
{
|
||||
public static string ProcessorId()
|
||||
{
|
||||
|
|
@ -16,7 +16,7 @@ namespace VisualPascalABCPlugins
|
|||
var mbsList = mbs.Get();
|
||||
foreach (ManagementObject mo in mbsList)
|
||||
{
|
||||
return mo['ProcessorId'].ToString();
|
||||
return mo["ProcessorId"].ToString();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
|
@ -55,5 +55,25 @@ namespace VisualPascalABCPlugins
|
|||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
public static string[] ReadLoginPassFromAuth(string AuthFileFullName)
|
||||
{
|
||||
// Исключения обрабатываются уровнем выше
|
||||
string[] lparr = new string[0];
|
||||
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 = Decrypt(data);
|
||||
lparr = lp.Split((char)10);
|
||||
return lparr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -63,14 +63,15 @@ type
|
|||
client.Timeout := TimeSpan.FromSeconds(10);
|
||||
end;
|
||||
|
||||
function SendPostRequest(FullFIO, Password, LessonName, TaskName, TaskStatus: string): Task<string>;
|
||||
function SendPostRequest(FullFIO, Password, LessonName, TaskName, TaskResult, TaskResultInfo: string): Task<string>;
|
||||
begin
|
||||
var values := Dict(
|
||||
( 'shortFIO', '' ),
|
||||
( 'FIO', FullFIO ),
|
||||
( 'taskName', TaskName ),
|
||||
( 'lessonName', LessonName ),
|
||||
( 'type', TaskStatus ),
|
||||
( 'taskResult', TaskResult ),
|
||||
( 'taskResultInfo', TaskResultInfo ),
|
||||
( 'content', '' ),
|
||||
( 'password', Password )
|
||||
);
|
||||
|
|
@ -233,7 +234,6 @@ function Encrypt(src: string): array of byte; // записать в файл
|
|||
begin
|
||||
var ae := Aes.Create();
|
||||
var key := Encoding.UTF8.GetBytes(ProcessorId);
|
||||
var encrypted: array of byte;
|
||||
var crypt := ae.CreateEncryptor(key, key);
|
||||
var ms := new MemoryStream();
|
||||
var cs := new CryptoStream(ms, crypt, CryptoStreamMode.Write);
|
||||
|
|
@ -254,7 +254,6 @@ begin
|
|||
end;
|
||||
var ae := Aes.Create();
|
||||
var key := Encoding.UTF8.GetBytes(ProcessorId);
|
||||
var encrypted: array of byte;
|
||||
var crypt := ae.CreateDecryptor(key, key);
|
||||
var ms := new MemoryStream(data);
|
||||
var cs := new CryptoStream(ms, crypt, CryptoStreamMode.Read);
|
||||
|
|
@ -1102,12 +1101,34 @@ begin
|
|||
WriteInfoCallBack(LessonName,TName, TaskResult, TaskResultInfo);
|
||||
end;
|
||||
|
||||
procedure WriteInfoToLocalDatabase(LessonName,TaskName: string; result: TaskStatus; AdditionalInfo: string := '');
|
||||
procedure WriteInfoToRemoteDatabase(auth: string; LessonName, TaskName, TaskResult, AdditionalInfo: string);
|
||||
begin
|
||||
// Считать логин пароль из auth
|
||||
var f: file of byte;
|
||||
Reset(f,auth);
|
||||
var data := f.Elements.ToArray;
|
||||
var arr := Decrypt(data).Split(#10);
|
||||
var login,pass: string;
|
||||
if arr.Length >= 2 then
|
||||
begin
|
||||
login := arr[0];
|
||||
pass := arr[1];
|
||||
// Теперь как-то записать в БД информацию
|
||||
var User := new ServerAccessProvider(ServerAddr);
|
||||
var t2 := User.SendPostRequest(login, pass, LessonName, TaskName, TaskResult, AdditionalInfo);
|
||||
var v := t2.Result;
|
||||
//Console.WriteLine(v);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure WriteInfoToDatabases(LessonName,TaskName: string; TaskResult: TaskStatus; AdditionalInfo: string := '');
|
||||
begin
|
||||
try
|
||||
System.IO.File.AppendAllText('db.txt', $'{LessonName} {TaskName} {dateTime.Now.ToString(''u'')} {Result.ToString} {AdditionalInfo}' + #10);
|
||||
var auth := FindAuthDat;
|
||||
// Console.WriteLine(auth);
|
||||
System.IO.File.AppendAllText('db.txt', $'{LessonName} {TaskName} {dateTime.Now.ToString(''u'')} {TaskResult.ToString} {AdditionalInfo}' + #10);
|
||||
var auth := FindAuthDat();
|
||||
if auth<>'' then
|
||||
// Есть проблема паузы при плохой сети
|
||||
WriteInfoToRemoteDatabase(auth,LessonName,TaskName,TaskResult.ToString, AdditionalInfo);
|
||||
except
|
||||
on e: Exception do
|
||||
Console.WriteLine(e.Message);
|
||||
|
|
@ -1132,7 +1153,8 @@ begin
|
|||
if LessonName = '' then
|
||||
begin
|
||||
// Имя текущей папки. Плохо - в lightpt забыли написать имя урока
|
||||
var ttt := ExtractFileDir(System.Environment.GetCommandLineArgs[0]);
|
||||
//var ttt := ExtractFileDir(System.Environment.GetCommandLineArgs[0]);
|
||||
var ttt := ExpandFileName('.');
|
||||
var LastDir := ttt.ToWords(System.IO.Path.DirectorySeparatorChar).LastOrDefault;
|
||||
// Каталог может содержать пробелы. Брать первое слово
|
||||
if LastDir<>nil then
|
||||
|
|
@ -1150,7 +1172,7 @@ initialization
|
|||
var tn := TypeName(CurrentIOSystem);
|
||||
if (tn = 'IOStandardSystem') or (tn = '__ReadSignalOISystem') or (tn = 'IOGraphABCSystem') then
|
||||
CurrentIOSystem := new IOLightSystem;
|
||||
WriteInfoCallBack := WriteInfoToLocalDatabase;
|
||||
WriteInfoCallBack := WriteInfoToDatabases;
|
||||
// Расшифровка LightPT.dat
|
||||
LoadLightPTInfo;
|
||||
finalization
|
||||
|
|
|
|||
Loading…
Reference in a new issue