From 7ca563efe01701af2aa6dd1a4bc421ce7db1db2c Mon Sep 17 00:00:00 2001 From: Ilya Lehchylin Date: Mon, 24 Jun 2024 17:32:00 +0300 Subject: [PATCH 1/4] [FIX] Login process issues --- source/EduCATS/App.cs | 5 +- source/EduCATS/Data/DataAccess.cs | 15 +- source/EduCATS/Data/DataAccessCallbacks.cs | 6 +- source/EduCATS/Data/DataAccessHelper.cs | 23 ++- source/EduCATS/Data/DataAccessTools.cs | 12 +- source/EduCATS/Data/Interfaces/IDataAccess.cs | 5 + source/EduCATS/Data/Models/User/UserModel.cs | 2 - source/EduCATS/Data/User/AppUserData.cs | 3 +- .../Helpers/Forms/Settings/AppPrefs.cs | 19 -- .../Forms/Settings/Interfaces/IPreferences.cs | 1 - source/EduCATS/Localization/be.json | 1 + source/EduCATS/Localization/de.json | 1 + source/EduCATS/Localization/en.json | 1 + source/EduCATS/Localization/lt.json | 1 + source/EduCATS/Localization/pl.json | 1 + source/EduCATS/Localization/ru.json | 3 +- .../Networking/AppServices/AppServices.cs | 16 +- source/EduCATS/Networking/Links.cs | 12 +- .../Models/Login/TokenCredentials.cs | 23 +++ .../EduCATS/Networking/RequestController.cs | 38 ++-- .../Login/ViewModels/LoginPageViewModel.cs | 191 ++---------------- .../Base/ViewModels/TodayPageViewModel.cs | 20 +- 22 files changed, 155 insertions(+), 244 deletions(-) create mode 100644 source/EduCATS/Networking/Models/Login/TokenCredentials.cs diff --git a/source/EduCATS/App.cs b/source/EduCATS/App.cs index 235da92a..50def162 100644 --- a/source/EduCATS/App.cs +++ b/source/EduCATS/App.cs @@ -69,14 +69,13 @@ async Task getProfileInfo() } var username = _services.Preferences.UserLogin; - var password = _services.Preferences.UserPassword; if (string.IsNullOrEmpty(username)) { return; } - var profile = await DataAccess.GetProfileInfo(username, password); - AppUserData.SetLoginData(_services, _services.Preferences.UserId, username, password); + var profile = await DataAccess.GetProfileInfo(username); + AppUserData.SetLoginData(_services, _services.Preferences.UserId, username); AppUserData.SetProfileData(_services, profile); _services.Preferences.GroupName = profile?.GroupName; _services.Preferences.Avatar = profile?.Avatar; diff --git a/source/EduCATS/Data/DataAccess.cs b/source/EduCATS/Data/DataAccess.cs index 8bd8b439..cd782587 100644 --- a/source/EduCATS/Data/DataAccess.cs +++ b/source/EduCATS/Data/DataAccess.cs @@ -6,6 +6,7 @@ using EduCATS.Data.Models.Calendar; using EduCATS.Data.Models.User; using EduCATS.Networking; +using EduCATS.Networking.Models.Login; using EduCATS.Networking.Models.SaveMarks; using EduCATS.Networking.Models.SaveMarks.Labs; using EduCATS.Networking.Models.SaveMarks.LabSchedule; @@ -22,7 +23,6 @@ namespace EduCATS.Data /// public static partial class DataAccess { - public static string Password { get; private set; } public static string Username { get; private set; } /// @@ -37,12 +37,18 @@ public async static Task Login(string username, string password) return await GetDataObject(dataAccess, false) as UserModel; } - public async static Task LoginTest(string username, string password) + public async static Task GetAccountData() { - var dataAccess = new DataAccess("login_error", loginCallbackEducatsby(username, password)); + var dataAccess = new DataAccess("login_error", getAccountDataCallback()); return await GetDataObject(dataAccess, false) as SecondUserModel; } + public async static Task GetToken(string username, string password) + { + var dataAccess = new DataAccess("login_error", getTokenCallback(username, password)); + return await GetDataObject(dataAccess, false) as TokenModel; + } + public async static Task DeleteAccount() { var dataAccess = new DataAccess( @@ -56,9 +62,8 @@ public async static Task DeleteAccount() /// Username. /// Password. /// User profile data. - public async static Task GetProfileInfo(string username, string password = "") + public async static Task GetProfileInfo(string username) { - Password = password; Username = username; var dataAccess = new DataAccess( "login_user_profile_error", getProfileCallback(username), GlobalConsts.DataProfileKey); diff --git a/source/EduCATS/Data/DataAccessCallbacks.cs b/source/EduCATS/Data/DataAccessCallbacks.cs index f97f8d03..feaaea51 100644 --- a/source/EduCATS/Data/DataAccessCallbacks.cs +++ b/source/EduCATS/Data/DataAccessCallbacks.cs @@ -15,8 +15,10 @@ public static partial class DataAccess static async Task loginCallback( string username, string password) => await AppServices.Login(username, password); - static async Task loginCallbackEducatsby( - string username, string password) => await AppServices.LoginEducatsBy(username, password); + static async Task getAccountDataCallback() => await AppServices.GetAccountData(); + + static async Task getTokenCallback( + string username, string password) => await AppServices.GetToken(username, password); static async Task getLecturesCallbackTest( int subjectId, int groupId) => await AppServices.GetLecturesEducatsBy(subjectId, groupId); diff --git a/source/EduCATS/Data/DataAccessHelper.cs b/source/EduCATS/Data/DataAccessHelper.cs index a7939cd5..51b618ea 100644 --- a/source/EduCATS/Data/DataAccessHelper.cs +++ b/source/EduCATS/Data/DataAccessHelper.cs @@ -51,6 +51,11 @@ public partial class DataAccess : IDataAccess where T : new() /// public bool IsConnectionError { get; set; } + /// + /// Is session expired issue. + /// + public bool IsSessionExpiredError { get; set; } + /// /// Error message localized key. /// @@ -93,6 +98,13 @@ public async Task GetSingle() } var response = await _callback(); + + if (response.Value == HttpStatusCode.Unauthorized) + { + setError("base_session_expired", sessionExpired: true); + return new T(); + } + singleObject = GetAccess(response); if (singleObject == null) { @@ -116,6 +128,13 @@ public async Task> GetList() } var response = await _callback(); + + if (response.Value == HttpStatusCode.Unauthorized) + { + setError("base_session_expired", sessionExpired: true); + return new List(); + } + list = GetListAccess(response); if (list == null) { @@ -221,12 +240,14 @@ public T GetAccess(KeyValuePair response) /// Set error details. /// /// Error message. + /// Session expired error. /// Is connection error. - void setError(string message, bool isConnectionError = false) + void setError(string message, bool sessionExpired = false, bool isConnectionError = false) { IsError = true; ErrorMessageKey = message; IsConnectionError = isConnectionError; + IsSessionExpiredError = sessionExpired; } /// diff --git a/source/EduCATS/Data/DataAccessTools.cs b/source/EduCATS/Data/DataAccessTools.cs index 17ef0586..5c28c8c0 100644 --- a/source/EduCATS/Data/DataAccessTools.cs +++ b/source/EduCATS/Data/DataAccessTools.cs @@ -20,6 +20,11 @@ public static partial class DataAccess /// public static bool IsConnectionError { get; set; } + /// + /// Is session expired issue. + /// + public static bool IsSessionExpiredError { get; set; } + /// /// Error message. /// @@ -50,7 +55,7 @@ public async static Task GetDataObject(IDataAccess dataAccess, boo objectToGet = await dataAccess.GetSingle(); } - SetError(dataAccess.ErrorMessageKey, dataAccess.IsConnectionError); + SetError(dataAccess.ErrorMessageKey, dataAccess.IsConnectionError, dataAccess.IsSessionExpiredError); return objectToGet; } @@ -82,19 +87,22 @@ public static string GetKey(string key, object id) /// /// Error message. /// Is network connection issue. + /// Is session expired issue. /// /// Can be null (if no error occurred). /// - public static void SetError(string message, bool isConnectionError) + public static void SetError(string message, bool isConnectionError, bool sessionExpired) { if (message == null) { IsError = false; IsConnectionError = false; + IsSessionExpiredError = false; return; } IsError = true; IsConnectionError = isConnectionError; + IsSessionExpiredError = sessionExpired; ErrorMessage = CrossLocalization.Translate(message); } } diff --git a/source/EduCATS/Data/Interfaces/IDataAccess.cs b/source/EduCATS/Data/Interfaces/IDataAccess.cs index 5643a399..027b4548 100644 --- a/source/EduCATS/Data/Interfaces/IDataAccess.cs +++ b/source/EduCATS/Data/Interfaces/IDataAccess.cs @@ -18,6 +18,11 @@ public interface IDataAccess /// bool IsConnectionError { get; set; } + /// + /// Is error referred to expired session. + /// + bool IsSessionExpiredError { get; set; } + /// /// Error message localization key. /// diff --git a/source/EduCATS/Data/Models/User/UserModel.cs b/source/EduCATS/Data/Models/User/UserModel.cs index 6bc0d412..9d5aef65 100644 --- a/source/EduCATS/Data/Models/User/UserModel.cs +++ b/source/EduCATS/Data/Models/User/UserModel.cs @@ -9,7 +9,5 @@ public class UserModel [JsonProperty("UserId")] public int UserId { get; set; } - - public string Password { get; set; } } } diff --git a/source/EduCATS/Data/User/AppUserData.cs b/source/EduCATS/Data/User/AppUserData.cs index 1a532659..902a42fb 100644 --- a/source/EduCATS/Data/User/AppUserData.cs +++ b/source/EduCATS/Data/User/AppUserData.cs @@ -67,11 +67,10 @@ public class AppUserData /// Platfrom services. /// User ID. /// Username. - public static void SetLoginData(IPlatformServices services, int userId, string username, string password) + public static void SetLoginData(IPlatformServices services, int userId, string username) { services.Preferences.UserId = userId; services.Preferences.UserLogin = username; - services.Preferences.UserPassword = password; UserId = userId; Username = username; } diff --git a/source/EduCATS/Helpers/Forms/Settings/AppPrefs.cs b/source/EduCATS/Helpers/Forms/Settings/AppPrefs.cs index 5c6f37a5..218a4138 100644 --- a/source/EduCATS/Helpers/Forms/Settings/AppPrefs.cs +++ b/source/EduCATS/Helpers/Forms/Settings/AppPrefs.cs @@ -93,25 +93,6 @@ public class AppPrefs : IPreferences /// const string _userLoginDefault = null; - /// - /// Password key. - /// - const string _userPassKey = "USER_LOGIN"; - - /// - /// Default password. - /// - const string _userPassDefault = null; - - /// - /// Password. - /// - public string UserPassword - { - get => Preferences.Get(_userPassKey, _userPassDefault); - set => Preferences.Set(_userPassKey, value); - } - /// /// Username. /// diff --git a/source/EduCATS/Helpers/Forms/Settings/Interfaces/IPreferences.cs b/source/EduCATS/Helpers/Forms/Settings/Interfaces/IPreferences.cs index b1306ed6..d9920921 100644 --- a/source/EduCATS/Helpers/Forms/Settings/Interfaces/IPreferences.cs +++ b/source/EduCATS/Helpers/Forms/Settings/Interfaces/IPreferences.cs @@ -7,7 +7,6 @@ public interface IPreferences string Server { get; set; } bool IsLoggedIn { get; set; } string UserLogin { get; set; } - string UserPassword { get; set; } int UserId { get; set; } int ChosenSubjectId { get; set; } int GroupId { get; set; } diff --git a/source/EduCATS/Localization/be.json b/source/EduCATS/Localization/be.json index 1681d9c0..acd2c279 100644 --- a/source/EduCATS/Localization/be.json +++ b/source/EduCATS/Localization/be.json @@ -12,6 +12,7 @@ "base_connection_error": "Адсутнічае злучэнне з інтэрнэтам. Праверце налады ў сетцы і паспрабуйце зноў", "base_no_data": "Адсутнічаюць даныя для адлюстравання", "base_something_went_wrong": "Нешта пайшло не так. Паўтарыце спробу або звярніцеся ў службу падтрымкі.", + "base_session_expired": "Сесія скончылася. Калі ласка, увайдзіце ў рахунак зноў.", "contributor_ilya_lehchylin": "Ілля Легчылін", "contributor_julia_popova": "Юлія Папова", diff --git a/source/EduCATS/Localization/de.json b/source/EduCATS/Localization/de.json index 13d94143..8afc725d 100644 --- a/source/EduCATS/Localization/de.json +++ b/source/EduCATS/Localization/de.json @@ -12,6 +12,7 @@ "base_connection_error": "Keine Internetverbindung. Überprüfen Sie die Netzwerkeinstellungen und versuchen Sie es erneut.", "base_no_data": "Keine Daten angezeigt werden", "base_something_went_wrong": "Etwas ist schief gelaufen. Bitte versuchen Sie es erneut oder wenden Sie sich an den Support.", + "base_session_expired": "Die Sitzung ist abgelaufen. Bitte melden Sie sich erneut bei Ihrem Konto an.", "contributor_ilya_lehchylin": "Ilya Legtschilin", "contributor_julia_popova": "Yuliya Popova", diff --git a/source/EduCATS/Localization/en.json b/source/EduCATS/Localization/en.json index 480db272..f6ab2418 100644 --- a/source/EduCATS/Localization/en.json +++ b/source/EduCATS/Localization/en.json @@ -12,6 +12,7 @@ "base_connection_error": "No internet connection. Check your network settings and try again.", "base_no_data": "No data to display", "base_something_went_wrong": "Something went wrong. Please try again or contact support.", + "base_session_expired": "Session has been expired. Please log into account again.", "contributor_ilya_lehchylin": "Ilya Lehchylin", "contributor_julia_popova": "Julia Popova", diff --git a/source/EduCATS/Localization/lt.json b/source/EduCATS/Localization/lt.json index f5cc4e4c..d4df24f5 100644 --- a/source/EduCATS/Localization/lt.json +++ b/source/EduCATS/Localization/lt.json @@ -12,6 +12,7 @@ "base_connection_error": "Nėra interneto ryšio. Patikrinkite tinklo nustatymus ir bandykite dar kartą.", "base_no_data": "Nėra rodomų duomenų", "base_something_went_wrong": "Kažkas nutiko. Bandykite dar kartą arba susisiekite su palaikymo komanda.", + "base_session_expired": "Sesija ir beigusies. Lūdzu, vēlreiz piesakieties savā kontā.", "contributor_ilya_lehchylin": "Ilya Lehchylin", "contributor_julia_popova": "Julia Popova", diff --git a/source/EduCATS/Localization/pl.json b/source/EduCATS/Localization/pl.json index 31f5e638..ea6395c9 100644 --- a/source/EduCATS/Localization/pl.json +++ b/source/EduCATS/Localization/pl.json @@ -12,6 +12,7 @@ "base_connection_error": "Brak połączenia z Internetem. Sprawdź ustawienia sieci i spróbuj ponownie.", "base_no_data": "Brak danych do wyświetlenia", "base_something_went_wrong": "Coś poszło nie tak. Spróbuj ponownie lub skontaktuj się z pomocą techniczną.", + "base_session_expired": "Sesja wygasła. Proszę zalogować się ponownie na swoje konto.", "contributor_ilya_lehchylin": "Ilja Legczilin", "contributor_julia_popova": "Julia Popowa", diff --git a/source/EduCATS/Localization/ru.json b/source/EduCATS/Localization/ru.json index f12bab38..1a3f8196 100644 --- a/source/EduCATS/Localization/ru.json +++ b/source/EduCATS/Localization/ru.json @@ -12,6 +12,7 @@ "base_connection_error": "Нет соединения с интернетом. Проверьте настройки сети и попробуйте снова.", "base_no_data": "Нет данных для отображения", "base_something_went_wrong": "Что-то пошло не так. Повторите попытку или обратитесь в службу поддержки.", + "base_session_expired": "Сессия истекла. Пожалуйста, войдите в аккаунт снова.", "contributor_ilya_lehchylin": "Илья Легчилин", "contributor_julia_popova": "Юлия Попова", @@ -60,7 +61,6 @@ "today_calendar_error": "Произошла ошибка во время получения списка предметов в календаре. Пожалуйста, обновите страницу или обратитесь в службу поддержки.", "today_account_error": "Произошла ошибка во время получения информацию об аккаунте. Пожалуйста, обновите страницу или обратитесь в службу поддержки.", - "news_details_title": "Новости", "subjects_choose": "Выберите предмет", @@ -246,4 +246,3 @@ "demo_files_download_error": "Загрузка обучающих материалов недоступна для демонстрационного аккаунта.", "demo_delete_account_error": "Удаление демонстрационного аккаунта невозможно." } - diff --git a/source/EduCATS/Networking/AppServices/AppServices.cs b/source/EduCATS/Networking/AppServices/AppServices.cs index 4a0c4562..1de98d4b 100644 --- a/source/EduCATS/Networking/AppServices/AppServices.cs +++ b/source/EduCATS/Networking/AppServices/AppServices.cs @@ -36,9 +36,21 @@ public static async Task Login(string username, string password) return await AppServicesController.Request(Links.Login, body); } - public static async Task LoginEducatsBy(string username, string password) + public static async Task GetAccountData() { - return await AppServicesController.Request(Links.LoginTest); + return await AppServicesController.Request(Links.GetAccountData); + } + + public static async Task GetToken(string username, string password) + { + var credentials = new TokenCredentials + { + Username = username, + Password = password + }; + + var body = JsonController.ConvertObjectToJson(credentials); + return await AppServicesController.Request(Links.GetToken, body); } /// diff --git a/source/EduCATS/Networking/Links.cs b/source/EduCATS/Networking/Links.cs index f9b77be5..c65f5de7 100644 --- a/source/EduCATS/Networking/Links.cs +++ b/source/EduCATS/Networking/Links.cs @@ -6,12 +6,20 @@ public static class Links { /// - /// Authorize URL. + /// Account information URL. /// - public static string LoginTest => $"{Servers.Current}/Account/UserSessionCheck"; + public static string GetAccountData => $"{Servers.Current}/Account/UserSessionCheck"; + /// + /// Authorize URL (for deprecated URLs). + /// public static string Login => $"{Servers.Current}/RemoteApi/Login"; + /// + /// Access token retrieval URL. + /// + public static string GetToken => $"{Servers.Current}/Account/LoginJWT"; + /// /// Authorize URL. /// diff --git a/source/EduCATS/Networking/Models/Login/TokenCredentials.cs b/source/EduCATS/Networking/Models/Login/TokenCredentials.cs new file mode 100644 index 00000000..0429465a --- /dev/null +++ b/source/EduCATS/Networking/Models/Login/TokenCredentials.cs @@ -0,0 +1,23 @@ +using Newtonsoft.Json; + +namespace EduCATS.Networking.Models.Login +{ + /// + /// Token POST model. + /// + public class TokenCredentials + { + /// + /// User login. + /// + [JsonProperty("userName")] + public string Username { get; set; } + + /// + /// Password. + /// + [JsonProperty("password")] + public string Password { get; set; } + } +} + diff --git a/source/EduCATS/Networking/RequestController.cs b/source/EduCATS/Networking/RequestController.cs index d28f3d69..5e366c54 100644 --- a/source/EduCATS/Networking/RequestController.cs +++ b/source/EduCATS/Networking/RequestController.cs @@ -5,6 +5,7 @@ using System; using System.Net; using System.Net.Http; +using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; @@ -111,29 +112,25 @@ async Task get() { try { - if (_services.Preferences.AccessToken != "") + if (!string.IsNullOrEmpty(_services.Preferences.AccessToken)) { - _client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(_services.Preferences.AccessToken); + _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(_services.Preferences.AccessToken); } var response = await _client.GetAsync(Uri); - if (!response.IsSuccessStatusCode) - { - _services.Preferences.AccessToken = await ((LoginPageViewModel)(new LoginPageView().BindingContext)).RefreshToken(); - _client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(_services.Preferences.AccessToken); - return await _client.GetAsync(Uri); - } - else + + if (response.StatusCode == HttpStatusCode.Unauthorized) { - return response; + return errorResponseMessage(HttpStatusCode.Unauthorized); } + return response; } catch (TaskCanceledException) { return errorResponseMessage(HttpStatusCode.RequestTimeout); } - catch (Exception ex) + catch (Exception) { return errorResponseMessage(HttpStatusCode.BadRequest); } @@ -149,24 +146,25 @@ async Task post() { if (_services.Preferences.AccessToken != "") { - _client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(_services.Preferences.AccessToken); + _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(_services.Preferences.AccessToken); } - var response = await _client.PostAsync(Uri, _postContent); - if (!response.IsSuccessStatusCode) + if (_services.Preferences.Server == Servers.EduCatsAddress) { - _services.Preferences.AccessToken = await ((LoginPageViewModel)(new LoginPageView().BindingContext)).RefreshToken(); - _client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(_services.Preferences.AccessToken); - return await _client.PostAsync(Uri, _postContent); + _client.DefaultRequestHeaders.Add("Origin", Servers.EduCatsAddress); } - else + + var response = await _client.PostAsync(Uri, _postContent); + + if (response.StatusCode == HttpStatusCode.Unauthorized) { - return response; + return errorResponseMessage(HttpStatusCode.Unauthorized); } + return response; } catch (TaskCanceledException) { return errorResponseMessage(HttpStatusCode.RequestTimeout); - } catch (Exception ex) { + } catch (Exception) { return errorResponseMessage(HttpStatusCode.BadRequest); } } diff --git a/source/EduCATS/Pages/Login/ViewModels/LoginPageViewModel.cs b/source/EduCATS/Pages/Login/ViewModels/LoginPageViewModel.cs index 68c8c7ae..e12cb078 100644 --- a/source/EduCATS/Pages/Login/ViewModels/LoginPageViewModel.cs +++ b/source/EduCATS/Pages/Login/ViewModels/LoginPageViewModel.cs @@ -1,30 +1,17 @@ using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IdentityModel.Tokens.Jwt; -using System.IO; -using System.Linq; -using System.Net; -using System.Text; using System.Threading.Tasks; -using System.Web; using EduCATS.Data; using EduCATS.Data.Models; -using EduCATS.Data.Models.User; using EduCATS.Data.User; using EduCATS.Demo; using EduCATS.Helpers.Forms; -using EduCATS.Helpers.Json; using EduCATS.Helpers.Logs; using EduCATS.Networking; -using EduCATS.Networking.AppServices; -using EduCATS.Networking.Models.Login; -using Newtonsoft.Json; using Nyxbull.Plugins.CrossLocalization; using Xamarin.Forms; namespace EduCATS.Pages.Login.ViewModels -{ +{ /// /// Login page ViewModel. /// @@ -226,80 +213,6 @@ protected async Task openParental() } } - /// - /// Implements refresh token. - /// - /// Access token string on success, null otherwise. - public async Task RefreshToken() - { - if (_services.Preferences.AccessToken == string.Empty) - { - await loginRequest(); - } - - Username = DataAccess.Username; - Password = DataAccess.Password; - - if (!AppDemo.Instance.IsDemoAccount && _services.Preferences.Server == Servers.EduCatsAddress) - { - var jwt = new - { - userName = Username, - password = Password, - }; - - ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => { return true; }; - - var body = JsonController.ConvertObjectToJson(jwt); - - var httpWebRequest = HttpWebRequest.CreateHttp(Links.LoginTestServer); - - httpWebRequest.Method = "POST"; - httpWebRequest.ContentType = "application/json"; - httpWebRequest.Accept = "application/json, text/plain, */*"; - httpWebRequest.Headers.Add("Origin", Servers.EduCatsAddress); - httpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate, br"); - httpWebRequest.Headers.Add("Sec-Fetch-Dest", "empty"); - httpWebRequest.Headers.Add("Sec-Fetch-Mode", "cors"); - httpWebRequest.Headers.Add("Sec-Fetch-Site", "same-origin"); - - string json = body; - byte[] byte1 = Encoding.UTF8.GetBytes(json); - httpWebRequest.ContentLength = byte1.Length; - - using (var streamWriter = httpWebRequest.GetRequestStream()) - { - streamWriter.Write(byte1, 0, byte1.Length); - streamWriter.Close(); - } - var tok = ""; - - try - { - var httpResponse = httpWebRequest.GetResponse(); - - using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) - { - tok = streamReader.ReadToEnd(); - streamReader.Close(); - } - var token = JsonConvert.DeserializeObject(tok); - return token.Token; - } - catch (WebException ex) - { - - - return null; - } - catch (Exception) { - return null; - } - } - - return null; - } - /// /// Authorization method. /// @@ -337,7 +250,7 @@ async Task loginCompleted(UserModel user) if (user != null && !DataAccess.IsError) { setLoading(true, CrossLocalization.Translate("login_profile_loading")); - var profile = await getProfileData(user.Username, user.Password); + var profile = await getProfileData(user.Username); setLoading(false); profileRetrieved(profile); } @@ -400,90 +313,24 @@ protected async Task openSettings() /// on success, null otherwise. async Task loginRequest() { - var userLogin = await DataAccess.Login(Username, Password); - - if(!AppDemo.Instance.IsDemoAccount && _services.Preferences.Server == Servers.EduCatsAddress) + if (AppDemo.Instance.IsDemoAccount || _services.Preferences.Server != Servers.EduCatsAddress) { - if (userLogin != null) - { - var jwt = new - { - userName = Username, - password = Password, - }; - - ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => { return true; }; - - var body = JsonController.ConvertObjectToJson(jwt); - - var httpWebRequest = HttpWebRequest.CreateHttp(Links.LoginTestServer); - - httpWebRequest.Method = "POST"; - httpWebRequest.ContentType = "application/json"; - httpWebRequest.Accept = "application/json, text/plain, */*"; - httpWebRequest.Headers.Add("Origin", Servers.EduCatsAddress); - httpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate, br"); - httpWebRequest.Headers.Add("Sec-Fetch-Dest", "empty"); - httpWebRequest.Headers.Add("Sec-Fetch-Mode", "cors"); - httpWebRequest.Headers.Add("Sec-Fetch-Site", "same-origin"); - - string json = body; - byte[] byte1 = Encoding.UTF8.GetBytes(json); - httpWebRequest.ContentLength = byte1.Length; - - using (var streamWriter = httpWebRequest.GetRequestStream()) - { - streamWriter.Write(byte1, 0, byte1.Length); - streamWriter.Close(); - } - var tok = ""; - - try - { - var httpResponse = httpWebRequest.GetResponse(); - - using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) - { - tok = streamReader.ReadToEnd(); - streamReader.Close(); - } - var token = JsonConvert.DeserializeObject(tok); - _services.Preferences.AccessToken = token.Token; - SecondUserModel userLoginTest = await DataAccess.LoginTest(Username, Password); - userLogin.UserId = userLoginTest.Id; - userLogin.Username = userLoginTest.Username; - userLogin.Password = Password; - } - catch (WebException ex) - { - HttpWebResponse httpResponse = (HttpWebResponse)ex.Response; - string answer = ""; - if (ex.Response != null) - { - using (Stream stream = ex.Response.GetResponseStream()) - { - StreamReader reader = new StreamReader(stream, Encoding.UTF8); - answer = reader.ReadToEnd(); - } - - var serverError = JsonConvert.DeserializeObject(answer); - - if (serverError.Error == 1) - { - DataAccess.SetError(CrossLocalization.Translate("login_user_profile_not_verify"), false); - } - else - { - DataAccess.SetError(CrossLocalization.Translate("login_error"), false); - } - } - } - catch (Exception) { } - } + var userLogin = await DataAccess.Login(Username, Password); + AppUserData.SetLoginData(_services, userLogin.UserId, userLogin.Username); + return userLogin; } - AppUserData.SetLoginData(_services, userLogin.UserId, userLogin.Username, userLogin.Password); - return userLogin; + var tokenData = await DataAccess.GetToken(Username, Password); + _services.Preferences.AccessToken = tokenData.Token; + var accountData = await DataAccess.GetAccountData(); + AppUserData.SetLoginData(_services, accountData.Id, accountData.Username); + var user = new UserModel + { + UserId = accountData.Id, + Username = accountData.Username + }; + + return user; } /// @@ -492,9 +339,9 @@ async Task loginRequest() /// Username. /// Password. /// Task. - async Task getProfileData(string username, string password) + async Task getProfileData(string username) { - var userProfile = await DataAccess.GetProfileInfo(username, password); + var userProfile = await DataAccess.GetProfileInfo(username); AppUserData.SetProfileData(_services, userProfile); return userProfile; } diff --git a/source/EduCATS/Pages/Today/Base/ViewModels/TodayPageViewModel.cs b/source/EduCATS/Pages/Today/Base/ViewModels/TodayPageViewModel.cs index 1b44c064..c90d6168 100644 --- a/source/EduCATS/Pages/Today/Base/ViewModels/TodayPageViewModel.cs +++ b/source/EduCATS/Pages/Today/Base/ViewModels/TodayPageViewModel.cs @@ -4,19 +4,15 @@ using System.Linq; using System.Net.Http; using System.Text.RegularExpressions; -using System.Threading; using System.Threading.Tasks; -using EduCATS.Controls.RoundedListView; using EduCATS.Data; using EduCATS.Data.Models; -using EduCATS.Data.Models.Calendar; using EduCATS.Helpers.Date; using EduCATS.Helpers.Date.Enums; using EduCATS.Helpers.Forms; using EduCATS.Helpers.Logs; using EduCATS.Networking; using EduCATS.Pages.Today.Base.Models; -using EduCATS.Pages.Today.Base.Views; using EduCATS.Themes; using Newtonsoft.Json.Linq; using Nyxbull.Plugins.CrossLocalization; @@ -31,8 +27,6 @@ public class TodayPageViewModel : ViewModel readonly double _subjectHeight; readonly double _subjectsHeightToSubtract; - readonly double _subjectsFooterHeight; - readonly double _subjectsHeaderHeight = 71; readonly bool _isLargeFont; const int _minimumCalendarPosition = 0; @@ -49,7 +43,6 @@ public TodayPageViewModel(double subjectHeight, double subjectsHeaderHeight, IPl { _subjectHeight = services.Preferences.IsLargeFont ? (subjectHeight + 90) : subjectHeight; _subjectsHeightToSubtract = services.Preferences.IsLargeFont ? 95 : 85; - _subjectsFooterHeight = subjectsHeaderHeight; _isLargeFont = services.Preferences.IsLargeFont; _services = services; Version = _services.Device.GetVersion(); @@ -200,7 +193,6 @@ void update() await getAndSetCalendarNotes(); await getAndSetNews(); await getUpdateMessage(); - //_isCreation = false; IsNewsRefreshing = false; } catch (Exception ex) { AppLogs.Log(ex); @@ -259,10 +251,11 @@ async Task getAndSetNews() NewsList = new List(news); } } + async Task getUpdateMessage() { string version = _version; - string storeUrl; + if (Device.RuntimePlatform == Device.Android) { version = await GetAndroidVersion(); @@ -306,6 +299,7 @@ async Task GetAndroidVersion() return matches[0].Value.Substring(4); } + async Task GetIOSVersion() { using (var httpClient = new HttpClient()) @@ -324,10 +318,18 @@ async Task GetIOSVersion() return appInfo["version"].Value(); } } + async Task> getNews() { var news = await DataAccess.GetNews(_services.Preferences.UserLogin); + if (DataAccess.IsError && DataAccess.IsSessionExpiredError) + { + _services.Dialogs.ShowError(DataAccess.ErrorMessage); + _services.Navigation.OpenLogin(); + return null; + } + if (DataAccess.IsError && !DataAccess.IsConnectionError) { _services.Dialogs.ShowError(DataAccess.ErrorMessage); } From 2a8eab4818f53c0ebe96b566c772c1bdf43a585c Mon Sep 17 00:00:00 2001 From: Ilya Lehchylin Date: Mon, 24 Jun 2024 17:34:13 +0300 Subject: [PATCH 2/4] [UPDATE] Commented out mock for token refresh --- .../Registration/RegistrationTests.cs | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/source/EduCATS.UnitTests/Registration/RegistrationTests.cs b/source/EduCATS.UnitTests/Registration/RegistrationTests.cs index 07513edb..54ab43a4 100644 --- a/source/EduCATS.UnitTests/Registration/RegistrationTests.cs +++ b/source/EduCATS.UnitTests/Registration/RegistrationTests.cs @@ -1,46 +1,46 @@ -using System; -using System.Reflection; -using System.Threading.Tasks; -using EduCATS.Constants; -using EduCATS.Data.Models; -using EduCATS.Helpers.Forms; -using EduCATS.Helpers.Forms.Dialogs; -using EduCATS.Helpers.Forms.Pages; -using EduCATS.Helpers.Forms.Settings; -using EduCATS.Networking; -using EduCATS.Networking.AppServices; -using EduCATS.Pages.ForgotPassword.ViewModels; -using EduCATS.Pages.Login.ViewModels; -using EduCATS.Pages.Login.Views; -using EduCATS.Pages.Registration.ViewModels; -using Moq; -using NUnit.Framework; -using Nyxbull.Plugins.CrossLocalization; +//using System; +//using System.Reflection; +//using System.Threading.Tasks; +//using EduCATS.Constants; +//using EduCATS.Data.Models; +//using EduCATS.Helpers.Forms; +//using EduCATS.Helpers.Forms.Dialogs; +//using EduCATS.Helpers.Forms.Pages; +//using EduCATS.Helpers.Forms.Settings; +//using EduCATS.Networking; +//using EduCATS.Networking.AppServices; +//using EduCATS.Pages.ForgotPassword.ViewModels; +//using EduCATS.Pages.Login.ViewModels; +//using EduCATS.Pages.Login.Views; +//using EduCATS.Pages.Registration.ViewModels; +//using Moq; +//using NUnit.Framework; +//using Nyxbull.Plugins.CrossLocalization; -namespace EduCATS.UnitTests -{ - [TestFixture] - public class RegistrationTests - { - [TestCase("TestLecturer5", "TestLecturer5")] - [Test] - public async Task RefreshToken_Test(string username, string password) - { - try - { - var mockedServices = Mock.Of(); - mockedServices.Preferences = Mock.Of(); - mockedServices.Preferences.Server = Servers.EduCatsAddress; - var mockedLoginPageView = new Mock(mockedServices).Object; - mockedLoginPageView.Username = username; - mockedLoginPageView.Password = password; - var actual = await mockedLoginPageView.RefreshToken(); - Assert.IsNotEmpty(actual); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } - } - } -} \ No newline at end of file +//namespace EduCATS.UnitTests +//{ +// [TestFixture] +// public class RegistrationTests +// { +// [TestCase("TestLecturer5", "TestLecturer5")] +// [Test] +// public async Task RefreshToken_Test(string username, string password) +// { +// try +// { +// var mockedServices = Mock.Of(); +// mockedServices.Preferences = Mock.Of(); +// mockedServices.Preferences.Server = Servers.EduCatsAddress; +// var mockedLoginPageView = new Mock(mockedServices).Object; +// mockedLoginPageView.Username = username; +// mockedLoginPageView.Password = password; +// var actual = await mockedLoginPageView.RefreshToken(); +// Assert.IsNotEmpty(actual); +// } +// catch (Exception ex) +// { +// Assert.Fail(ex.Message); +// } +// } +// } +//} \ No newline at end of file From 5e408397684840454843c4cb505e7ab16b24033d Mon Sep 17 00:00:00 2001 From: Ilya Lehchylin Date: Mon, 24 Jun 2024 17:38:30 +0300 Subject: [PATCH 3/4] [FIX] DataAccess test changes --- source/EduCATS.UnitTests/Data/DataAccessTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/EduCATS.UnitTests/Data/DataAccessTests.cs b/source/EduCATS.UnitTests/Data/DataAccessTests.cs index 61dae96b..dc77055d 100644 --- a/source/EduCATS.UnitTests/Data/DataAccessTests.cs +++ b/source/EduCATS.UnitTests/Data/DataAccessTests.cs @@ -140,11 +140,11 @@ public void GetKeyTest() [Test] public void SetErrorMessageNullTest() { - DataAccess.SetError(null, true); + DataAccess.SetError(null, true, false); Assert.AreEqual(false, DataAccess.IsError); Assert.AreEqual(false, DataAccess.IsConnectionError); - DataAccess.SetError(null, false); + DataAccess.SetError(null, false, false); Assert.AreEqual(false, DataAccess.IsConnectionError); } @@ -152,12 +152,12 @@ public void SetErrorMessageNullTest() public void SetErrorTest() { var message = "Error message"; - DataAccess.SetError(message, true); + DataAccess.SetError(message, true, false); Assert.AreEqual(message, DataAccess.ErrorMessage); Assert.AreEqual(true, DataAccess.IsError); Assert.AreEqual(true, DataAccess.IsConnectionError); - DataAccess.SetError(message, false); + DataAccess.SetError(message, false, false); Assert.AreEqual(false, DataAccess.IsConnectionError); } From 98b2224081e7ba84628eee5fc68ba82ffff27598 Mon Sep 17 00:00:00 2001 From: Ilya Lehchylin Date: Mon, 24 Jun 2024 17:40:53 +0300 Subject: [PATCH 4/4] [FIX] AppUserData test changes --- source/EduCATS.UnitTests/Data/AppUserDataTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/EduCATS.UnitTests/Data/AppUserDataTests.cs b/source/EduCATS.UnitTests/Data/AppUserDataTests.cs index 806e605f..74a71c87 100644 --- a/source/EduCATS.UnitTests/Data/AppUserDataTests.cs +++ b/source/EduCATS.UnitTests/Data/AppUserDataTests.cs @@ -44,7 +44,7 @@ public void SetUp() [Test] public void SetLoginDataTest() { - AppUserData.SetLoginData(_mocked, _userId, _username, _username); + AppUserData.SetLoginData(_mocked, _userId, _username); Assert.AreEqual(_userId, AppUserData.UserId); Assert.AreEqual(_username, AppUserData.Username); }