RegVM.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using Avalonia;
  2. using Avalonia.Controls.ApplicationLifetimes;
  3. using Avalonia.Platform.Storage;
  4. using AvaloniaApplication2.Models;
  5. using ReactiveUI;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Security.Cryptography;
  10. using System.Text;
  11. using System.Text.RegularExpressions;
  12. using System.Threading.Tasks;
  13. namespace AvaloniaApplication2.ViewModels
  14. {
  15. internal class RegVM : ViewModelBase
  16. {
  17. public void Reg()
  18. {
  19. bool valid = IsPasswordValid(_pass);
  20. if (MainWindowViewModel.myconnection.Users.Any(user => user.Login == NewUser.Login) == false)
  21. {
  22. if (valid)
  23. {
  24. if (_pass != string.Empty)
  25. {
  26. NewUser.Password = MD5.HashData(Encoding.ASCII.GetBytes(_pass));
  27. }
  28. NewUser.Role = 1;
  29. MainWindowViewModel.myconnection.Users.Add(NewUser);
  30. MainWindowViewModel.myconnection.SaveChanges();
  31. MainWindowViewModel.Instance.Page = new AuthAndReg();
  32. }
  33. }
  34. else
  35. {
  36. ErrorMessage = "Логин занят";
  37. }
  38. }
  39. public async Task AddPhoto()
  40. {
  41. if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desctop || desctop.MainWindow?.StorageProvider is not { } provider) throw new NullReferenceException("провайдер отсутствует");
  42. var file = await provider.OpenFilePickerAsync(
  43. new FilePickerOpenOptions()
  44. {
  45. Title = "Выберите изображение",
  46. AllowMultiple = false,
  47. FileTypeFilter = [FilePickerFileTypes.All, FilePickerFileTypes.ImageAll]
  48. }
  49. );
  50. if (file != null)
  51. {
  52. await using var readStream = await file[0].OpenReadAsync();
  53. byte[] buffer = new byte[readStream.Length];
  54. readStream.ReadAtLeast(buffer, 1);
  55. NewUser.Image = buffer;
  56. Addimage = "Изображение выбрано";
  57. }
  58. }
  59. public User NewUser { get => _NewUser; set => this.RaiseAndSetIfChanged(ref _NewUser, value); }
  60. User _NewUser = new User();
  61. string _pass;
  62. string _errorMessage;
  63. string _addimage;
  64. public string Pass { get => _pass; set => _pass = value; }
  65. public string ErrorMessage { get => _errorMessage; set => this.RaiseAndSetIfChanged(ref _errorMessage, value); }
  66. public string Addimage { get => _addimage; set => this.RaiseAndSetIfChanged(ref _addimage, value); }
  67. private bool IsPasswordValid(string password)
  68. {
  69. string pattern = @"^(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z].*[a-z])(?=.*\d.*\d)(?!\d)[A-Za-z\d!""#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~]{8,}$";
  70. Regex regex = new Regex(pattern);
  71. if (string.IsNullOrEmpty(password))
  72. {
  73. ErrorMessage = "Пароль не может быть пустым.";
  74. return false;
  75. }
  76. if (!regex.IsMatch(password))
  77. {
  78. if (password.Length < 8)
  79. {
  80. ErrorMessage = "Пароль должен содержать не менее 8 символов.";
  81. }
  82. else if (password[0] >= '0' && password[0] <= '9')
  83. {
  84. ErrorMessage = "Пароль не должен начинаться с цифры.";
  85. }
  86. else if (Regex.Matches(password, @"[A-Z]").Count < 2)
  87. {
  88. ErrorMessage = "Пароль должен содержать не менее 2 заглавных латинских символов.";
  89. }
  90. else if (Regex.Matches(password, @"[a-z]").Count < 3)
  91. {
  92. ErrorMessage = "Пароль должен содержать не менее 3 строчных латинских символов.";
  93. }
  94. else if (Regex.Matches(password, @"\d").Count < 2)
  95. {
  96. ErrorMessage = "Пароль должен содержать не менее 2 цифр.";
  97. }
  98. return false;
  99. }
  100. return true;
  101. }
  102. }
  103. }