From 87fce6dd732bc2e89d033b3627b74e4e0622e1fe Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 7 Jan 2025 12:16:08 +0100 Subject: [PATCH] Update metodi REST x gestione Enroll --- .../Compo/AuthChallengeMan.razor.cs | 4 +- .../EgwControlCenter.App.csproj | 2 +- .../PublishProfiles/ClickOnceProfile.pubxml | 4 +- EgwControlCenter.Core/AppControlService.cs | 89 ++++- EgwControlCenter.Core/DTO/EnrollRequestDTO.cs | 7 +- EgwControlCenter.Core/ReleaseChecker.cs | 335 +++++++++++++----- EgwControlCenter.Core/Utils.cs | 40 +++ README.md | 3 +- README.pdf | Bin 51005 -> 50895 bytes 9 files changed, 382 insertions(+), 102 deletions(-) create mode 100644 EgwControlCenter.Core/Utils.cs diff --git a/EgwControlCenter.App/Components/Compo/AuthChallengeMan.razor.cs b/EgwControlCenter.App/Components/Compo/AuthChallengeMan.razor.cs index 1b0c7f5..63ddd89 100644 --- a/EgwControlCenter.App/Components/Compo/AuthChallengeMan.razor.cs +++ b/EgwControlCenter.App/Components/Compo/AuthChallengeMan.razor.cs @@ -152,10 +152,10 @@ namespace EgwControlCenter.App.Components.Compo ACService.DoReloadConfig(); } - protected override void OnInitialized() + protected override async Task OnInitializedAsync() { // mi faccio staccare un codice di auth da remoto - passcode = ACService.GetAuthPassocde(); + passcode = await ACService.GetAuthPassocde(); tCounter = startCounter; RunTimer(); // aggancio gestione eventi diff --git a/EgwControlCenter.App/EgwControlCenter.App.csproj b/EgwControlCenter.App/EgwControlCenter.App.csproj index 46d413f..c415dbc 100644 --- a/EgwControlCenter.App/EgwControlCenter.App.csproj +++ b/EgwControlCenter.App/EgwControlCenter.App.csproj @@ -5,7 +5,7 @@ enable true enable - 1.1.2501.0709 + 1.1.2501.0712 Debug;Release;DEBUG_Local diff --git a/EgwControlCenter.App/Properties/PublishProfiles/ClickOnceProfile.pubxml b/EgwControlCenter.App/Properties/PublishProfiles/ClickOnceProfile.pubxml index be18a60..1725a06 100644 --- a/EgwControlCenter.App/Properties/PublishProfiles/ClickOnceProfile.pubxml +++ b/EgwControlCenter.App/Properties/PublishProfiles/ClickOnceProfile.pubxml @@ -4,8 +4,8 @@ https://go.microsoft.com/fwlink/?LinkID=208121. --> - 0709 - 1.1.2501.0709 + 0712 + 1.1.2501.0712 True Release True diff --git a/EgwControlCenter.Core/AppControlService.cs b/EgwControlCenter.Core/AppControlService.cs index 4dfd1ce..e4a7885 100644 --- a/EgwControlCenter.Core/AppControlService.cs +++ b/EgwControlCenter.Core/AppControlService.cs @@ -1,4 +1,5 @@ -using EgwControlCenter.Core.DTO; +using DeviceId; +using EgwControlCenter.Core.DTO; using EgwControlCenter.Core.Models; using EgwCoreLib.Utils; using Newtonsoft.Json; @@ -79,14 +80,90 @@ namespace EgwControlCenter.Core private Random rnd = new Random(); /// - /// Restituisce un codice di auth temporaneo da autorizzare + /// Restituisce un codice di auth temporaneo INT da impiegare x autorizzare /// /// - public int GetAuthPassocde() + public async Task GetAuthPassocde() { - // fixme todo !!! implementare da lettura remota oppure gen locale... - int tempCode = rnd.Next(10000000, 99999999); - return tempCode; + int tVal = 0; + //verifico che NON ci sia una richiesta già in corso... + if (CurrEnrollData.IdReq == 0) + { + // in primis preparo dizionario dei dati da allegare alla richiesta + Dictionary reqInfo = new Dictionary(); + // preparo dati DeviceId da allegare in coda + string deviceId = new DeviceIdBuilder() + .AddMachineName() + .AddUserName() + .AddOsVersion() + .OnWindows(windows => windows + .AddMacAddressFromWmi(excludeWireless: true, excludeNonPhysical: true) + .AddProcessorId() + .AddMotherboardSerialNumber() + .AddSystemDriveSerialNumber()) + .ToString(); + // aggiungo dati MachineInfo... + reqInfo = MachineDataValidator.userInfo; + foreach (var item in MachineDataValidator.netInfo) + { + if (!reqInfo.ContainsKey(item.Key)) + { + reqInfo.Add(item.Key, item.Value); + } + } + // raggiungo DevideID + reqInfo.Add("DeviceID", deviceId); + + // faccio la chiamata rest e salvo risposta... + CurrEnrollData = await CurrCheck.GetNewEnroll(reqInfo); + } + + // risposta valida se trovo un id richeista > 0... + if (CurrEnrollData.IdReq > 0) + { + tVal = CurrEnrollData.Passcode; + } + return tVal; + } + + /// + /// Verifica se sia stato assegnato il codice licenza x una richiesta di enroll e nel caso recupera licenza e restituisce il codice da salvare in conf + /// + /// + public async Task CheckAssignIdxLic() + { + string tVal = ""; + // verifico dati richeista enroll, altrimenti faccio refresh richiesta... + if (CurrEnrollData.IdReq == 0) + { + int newCode = await GetAuthPassocde(); + } + // recupero info + EnrollRequestDTO updRec = await CurrCheck.CheckCurrEnroll(); + if (updRec.IdReq > 0) + { + CurrEnrollData = updRec; + // se la licenza è valida --> procedo! + if( updRec.IdxLic>0) + { + LicenzaDTO currLic = await CurrCheck.GetEnrollLic(); + // se licenza valida --> restituisco e salvo! + if(currLic.IsValid && currLic.IsActive) + { + tVal = currLic.Chiave; + } + } + } + return tVal; + } + + /// + /// Richiesta enroll corrente (se presente come file oppure nuova...) + /// + private EnrollRequestDTO CurrEnrollData + { + get => CurrCheck.CurrEnrollData; + set => CurrCheck.CurrEnrollData = value; } /// diff --git a/EgwControlCenter.Core/DTO/EnrollRequestDTO.cs b/EgwControlCenter.Core/DTO/EnrollRequestDTO.cs index af6f53c..166da51 100644 --- a/EgwControlCenter.Core/DTO/EnrollRequestDTO.cs +++ b/EgwControlCenter.Core/DTO/EnrollRequestDTO.cs @@ -14,7 +14,7 @@ namespace EgwControlCenter.Core.DTO /// /// ID univoco richiesta /// - public int IdReq { get; set; } + public int IdReq { get; set; } = 0; /// /// Passcode usato per autorizzare (un valore random NON DUPLICATO con quelli attivi al momento della richiesta) @@ -36,6 +36,11 @@ namespace EgwControlCenter.Core.DTO /// public DateTime? DtAppr { get; set; } = null; + /// + /// Scadenza richiesta + /// + public DateTime DtScadenza { get; set; } = DateTime.Now.AddSeconds(5); + /// /// Username approvatore /// diff --git a/EgwControlCenter.Core/ReleaseChecker.cs b/EgwControlCenter.Core/ReleaseChecker.cs index d4b482d..318b3d4 100644 --- a/EgwControlCenter.Core/ReleaseChecker.cs +++ b/EgwControlCenter.Core/ReleaseChecker.cs @@ -3,16 +3,8 @@ using EgwControlCenter.Core.Models; using Newtonsoft.Json; using NLog; using RestSharp; -using RestSharp.Serializers; -using System; -using System.Collections.Generic; using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Web; -using System.Windows.Markup; namespace EgwControlCenter.Core { @@ -61,6 +53,50 @@ namespace EgwControlCenter.Core get => Path.Combine(AppDir, ConfName); } + /// + /// Richiesta enroll corrente (se presente come file oppure nuova...) + /// + public EnrollRequestDTO CurrEnrollData + { + get + { + DateTime adesso = DateTime.Now; + EnrollRequestDTO answ = new EnrollRequestDTO(); + // cerco se presente il file di enroll request + if (File.Exists(EnrollReqPath)) + { + // leggo il file e verifico sia ancora valido... + var rawData = File.ReadAllText(EnrollReqPath); + if (!string.IsNullOrEmpty(rawData)) + { + answ = JsonConvert.DeserializeObject(rawData) ?? new EnrollRequestDTO(); + // verifico validità scadenza... + if (answ.DtScadenza < adesso) + { + answ = new EnrollRequestDTO(); + // elimino file scaduto... + File.Delete(EnrollReqPath); + } + } + } + return answ; + } + set + { + DateTime adesso = DateTime.Now; + // verifico la scadenza sia valida... + if (value.DtScadenza > adesso) + { + // salvo! + var rawData = JsonConvert.SerializeObject(value, Formatting.Indented); + if (rawData != null && rawData.Length > 2) + { + File.WriteAllText(EnrollReqPath, rawData); + } + } + } + } + /// /// Configurazione degli oggetti da monitorare /// @@ -163,6 +199,50 @@ namespace EgwControlCenter.Core return setUpdated; } + /// + /// Verifica se il server remoto sia in buono stato... + /// + /// + public async Task CheckRemote() + { + // in questo caso la richiesta è per la generica app UpdateManager... + string CodApp = "UpdateManager"; + bool answ = false; + try + { + // client chiamate rest + var client = new RestClient(restOptFast); + // provo cmq ad inizializzare la richiesta + ReleaseReqDTO reqDto = new ReleaseReqDTO() + { + CodApp = CodApp, + CodImp = CurrPatrolCont.CodImpiego, + AppKey = CurrPatrolCont.AppKey + }; + // Chiamo il metodo! + if (useAppKey && reqDto.IsValid) + { + var actReq = new RestRequest($"/api/health", Method.Get); + // effettuo vera chiamata + var currResp = await client.GetAsync(actReq); + if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) + { + var rawData = $"{currResp.Content}"; + answ = rawData.Contains("OK", StringComparison.InvariantCultureIgnoreCase); + } + else + { + Log.Error($"Errore in ricezione info REST CheckRemote | StatusCode: {currResp.StatusCode} | content: {currResp.Content}"); + } + } + } + catch (Exception exc) + { + Log.Error($"Eccezione in fase gestione REST services CheckRemote{Environment.NewLine}{exc}"); + } + return answ; + } + /// /// Esegue verifica remota versioni x i sw tracciati /// @@ -197,6 +277,119 @@ namespace EgwControlCenter.Core return fatto; } + /// + /// Effettua un tentativo di enroll richiedendo info x gestione auth + /// + /// Dizionario info da associare all'enroll + /// + public async Task GetNewEnroll(Dictionary InfoData) + { + EnrollRequestDTO answ = new EnrollRequestDTO(); + try + { + // client chiamate rest + var client = new RestClient(restOptStd); + // Chiamo il metodo! + var actReq = new RestRequest($"/api/enroller/getNewEnrollRec", Method.Post); + string payload = JsonConvert.SerializeObject(InfoData); + actReq.AddJsonBody(payload); + // effettuo vera chiamata + var currResp = await client.PostAsync(actReq); + if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) + { + // mi restituisce info + var recEnroll = JsonConvert.DeserializeObject(currResp.Content); + if (recEnroll != null) + { + // verifico che contenga il dizionario allegato alla richiesta... + if (Utils.CompareDict(recEnroll.DictAttrib, InfoData)) + { + answ = recEnroll; + } + } + } + } + catch (Exception exc) + { + Log.Error($"Eccezione in fase gestione REST services GetNewEnroll{Environment.NewLine}{exc}"); + } + + return answ; + } + + /// + /// Effettua verifica stato record enroll (dato valore EnrollData...) + /// + /// + public async Task CheckCurrEnroll() + { + EnrollRequestDTO answ = new EnrollRequestDTO(); + // procedo se ho valori in CurrEnrollData... + if (CurrEnrollData.IdReq > 0) + { + try + { + // client chiamate rest + var client = new RestClient(restOptStd); + // Chiamo il metodo! + var actReq = new RestRequest($"/api/enroller/{CurrEnrollData.IdReq}?passcode={CurrEnrollData.Passcode}", Method.Get); + // effettuo vera chiamata + var currResp = await client.GetAsync(actReq); + if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) + { + // mi restituisce info + var recEnroll = JsonConvert.DeserializeObject(currResp.Content); + if (recEnroll != null) + { + answ = recEnroll; + } + } + } + catch (Exception exc) + { + Log.Error($"Eccezione in fase gestione REST services CheckCurrEnroll{Environment.NewLine}{exc}"); + } + } + + return answ; + } + + /// + /// Effettua verifica stato record enroll + /// + /// + public async Task GetEnrollLic() + { + LicenzaDTO answ = new LicenzaDTO(); + // procedo se ho valori in CurrEnrollData... + if (CurrEnrollData.IdReq > 0) + { + try + { + // client chiamate rest + var client = new RestClient(restOptStd); + // Chiamo il metodo! + var actReq = new RestRequest($"/api/enroller/getLicense/{CurrEnrollData.IdReq}?passcode={CurrEnrollData.Passcode}&idLic={CurrEnrollData.IdxLic}", Method.Get); + // effettuo vera chiamata + var currResp = await client.GetAsync(actReq); + if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) + { + // mi restituisce info + var recEnroll = JsonConvert.DeserializeObject(currResp.Content); + if (recEnroll != null) + { + answ = recEnroll; + } + } + } + catch (Exception exc) + { + Log.Error($"Eccezione in fase gestione REST services GetEnrollLic{Environment.NewLine}{exc}"); + } + } + return answ; + } + public bool HasUpdate() { bool answ = false; @@ -431,13 +624,6 @@ namespace EgwControlCenter.Core /// private static Logger Log = LogManager.GetCurrentClassLogger(); - /// - /// Conf client RestSharp standard: - /// - base URI al sito - /// - timeout 1 min - /// - private static RestClientOptions restOptStd = new RestClientOptions { Timeout = TimeSpan.FromSeconds(60), BaseUrl = new Uri(Const.apiUrl) }; - /// /// Conf client RestSharp fast (usato x check remote): /// - base URI al sito @@ -445,6 +631,13 @@ namespace EgwControlCenter.Core /// private static RestClientOptions restOptFast = new RestClientOptions { Timeout = TimeSpan.FromSeconds(5), BaseUrl = new Uri(Const.apiUrl) }; + /// + /// Conf client RestSharp standard: + /// - base URI al sito + /// - timeout 1 min + /// + private static RestClientOptions restOptStd = new RestClientOptions { Timeout = TimeSpan.FromSeconds(60), BaseUrl = new Uri(Const.apiUrl) }; + private Random rnd = new Random(); /// @@ -462,6 +655,15 @@ namespace EgwControlCenter.Core private Dictionary CriticalRelCurrent { get; set; } = new Dictionary(); private string DataDir { get; set; } = ""; + /// + /// Path file salvataggio Enroll Request (se presente) + /// + private string EnrollReqPath + { + get => Path.Combine(DataDir, ERName); + } + + private string ERName { get; set; } = "EnrollReq.json"; private string LSName { get; set; } = "LastStatus.json"; /// @@ -587,6 +789,35 @@ namespace EgwControlCenter.Core return answ; } + /// + /// Recupera oggetto releaseDTO da file exe indicato analizzando ver number + /// + /// + /// + private ReleaseDTO? ExeGetRelease(string filePath, bool canInstall) + { + ReleaseDTO? answ = null; + if (File.Exists(filePath)) + { + FileVersionInfo fileVersInfo = FileVersionInfo.GetVersionInfo(filePath); + // string codApp = fileVersInfo.ProductName; + string codApp = Path.GetFileNameWithoutExtension(filePath); + string versNum = $"{fileVersInfo.ProductVersion}"; + string versTxt = $"{fileVersInfo.FileVersion}"; + // creo OBJ e lo restituisco... + answ = new ReleaseDTO() + { + CodApp = codApp, + LocalPath = filePath, + ReleaseDate = DateTime.Now, + VersNum = versNum, + VersText = versTxt, + CanInstall = canInstall + }; + } + return answ; + } + /// /// Recupera elenco applicazioni con ultima release CRITICAL /// @@ -697,51 +928,6 @@ namespace EgwControlCenter.Core return answ; } - - /// - /// Verifica se il server remoto sia in buono stato... - /// - /// - public async Task CheckRemote() - { - // in questo caso la richiesta è per la generica app UpdateManager... - string CodApp = "UpdateManager"; - bool answ = false; - try - { - // client chiamate rest - var client = new RestClient(restOptFast); - // provo cmq ad inizializzare la richiesta - ReleaseReqDTO reqDto = new ReleaseReqDTO() - { - CodApp = CodApp, - CodImp = CurrPatrolCont.CodImpiego, - AppKey = CurrPatrolCont.AppKey - }; - // Chiamo il metodo! - if (useAppKey && reqDto.IsValid) - { - var actReq = new RestRequest($"/api/health", Method.Get); - // effettuo vera chiamata - var currResp = await client.GetAsync(actReq); - if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) - { - var rawData = $"{currResp.Content}"; - answ = rawData.Contains("OK", StringComparison.InvariantCultureIgnoreCase); - } - else - { - Log.Error($"Errore in ricezione info REST CheckRemote | StatusCode: {currResp.StatusCode} | content: {currResp.Content}"); - } - } - } - catch (Exception exc) - { - Log.Error($"Eccezione in fase gestione REST services CheckRemote{Environment.NewLine}{exc}"); - } - return answ; - } - /// /// init privato oggetti /// @@ -829,35 +1015,6 @@ namespace EgwControlCenter.Core return answ; } - /// - /// Recupera oggetto releaseDTO da file exe indicato analizzando ver number - /// - /// - /// - private ReleaseDTO? ExeGetRelease(string filePath, bool canInstall) - { - ReleaseDTO? answ = null; - if (File.Exists(filePath)) - { - FileVersionInfo fileVersInfo = FileVersionInfo.GetVersionInfo(filePath); - // string codApp = fileVersInfo.ProductName; - string codApp = Path.GetFileNameWithoutExtension(filePath); - string versNum = $"{fileVersInfo.ProductVersion}"; - string versTxt = $"{fileVersInfo.FileVersion}"; - // creo OBJ e lo restituisco... - answ = new ReleaseDTO() - { - CodApp = codApp, - LocalPath = filePath, - ReleaseDate = DateTime.Now, - VersNum = versNum, - VersText = versTxt, - CanInstall = canInstall - }; - } - return answ; - } - /// /// Rilegge i dati di configurazione e ultimo stato salvato /// diff --git a/EgwControlCenter.Core/Utils.cs b/EgwControlCenter.Core/Utils.cs new file mode 100644 index 0000000..cbb7440 --- /dev/null +++ b/EgwControlCenter.Core/Utils.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwControlCenter.Core +{ + public class Utils + { + /// + /// Comparazione tra 2 dizionari + /// + /// + /// + /// + public static bool CompareDict(Dictionary dict1, Dictionary dict2) + { + bool areEqual = true; + + if (dict1.Count != dict2.Count) + { + areEqual = false; + } + else + { + // ciclo da dict1 ogni valore che so essere in ugual numero in dict2 + foreach (var kvp in dict1) + { + if (!dict2.TryGetValue(kvp.Key, out string? value) || value != kvp.Value) + { + areEqual = false; + break; + } + } + } + return areEqual; + } + } +} diff --git a/README.md b/README.md index 97b1a0d..215feb5 100644 --- a/README.md +++ b/README.md @@ -51,5 +51,6 @@ In caso di chiave esistente ma piena, si deve procedere modificando la chiave di Date | Vers | Note ---------|----------|--------- 2024.09.01 | 1.0.2409.* | Prima versione WinForm only, NET 8 -2024.09.27 | 1.1.2409.* | Versione NET 8 con WinForm + BLAZOR + integrazione LiMan completa e testata x Macchine +2024.10.02 | 1.1.2410.* | Versione NET 8 con WinForm + BLAZOR + integrazione LiMan completa e testata x Macchine 2024.12.24 | 1.1.2412.* | Inizio gestione applicativi IOB-WIN e IOB-MAN, compreso download + install +2025.01.07 | 1.2.2501.* | Gestione auth TOTP applicativi con LiMan inserita diff --git a/README.pdf b/README.pdf index 050495eda7d68fc87fdf789175c1859070dd652f..9f5cc7e5044655af1cd795d177605ba60c520b25 100644 GIT binary patch delta 18139 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