diff --git a/MConnectSDK/MConnectClient.cs b/MConnectSDK/MConnectClient.cs index 1dbbe8c..3889bb4 100644 --- a/MConnectSDK/MConnectClient.cs +++ b/MConnectSDK/MConnectClient.cs @@ -20,6 +20,14 @@ namespace MConnectSDK { #region oggetti base ed init + /// + /// Semaforo ping PRELIMINARE + /// + protected bool pingOk = false; + /// + /// Semaforo controllo CLOUD PRELIMINARE + /// + protected bool cloudOk = false; /// /// Oggetto accesso memoria... /// {ext} @@ -443,7 +451,8 @@ namespace MConnectSDK // ORA verifica STATO sistema A VALLE... // STEP 1: PING a server (locale/remoto) - bool pingOk = false; + pingOk = false; + cloudOk = false; if (PingTarget != "") { pingOk = Utils.pingAddress(PingTarget); @@ -458,6 +467,7 @@ namespace MConnectSDK { answ.CloudStatusOk = true; answ.Source = SourceType.CLOUD; + cloudOk = true; } } answ.CallResultOk = (answ.CloudStatusOk || answ.LocalStatusOk); @@ -507,14 +517,19 @@ namespace MConnectSDK Uri callUri = new Uri(BaseUrl + "/oauth2/token"); var payload = "{\"client_id\": \"test\"}"; HttpContent callCont = new StringContent(payload, Encoding.UTF8, "application/json"); - // effettuo call effettiva - var taskRes = Task.Run(() => Utils.postUriAsync(callUri, callCont)); - taskRes.Wait(); - // decodifico risposta come tokResp... - var resp = JsonConvert.DeserializeObject(taskRes.Result); - waitRecall = 1000 * resp.interval; - tokResp = resp; + // controllo preliminare ping/cloud.. + if (pingOk && cloudOk) + { + // effettuo call effettiva + var taskRes = Task.Run(() => Utils.postUriAsync(callUri, callCont)); + taskRes.Wait(); + + // decodifico risposta come tokResp... + var resp = JsonConvert.DeserializeObject(taskRes.Result); + waitRecall = 1000 * resp.interval; + tokResp = resp; + } } /// /// Effetuo step 3: /verification @@ -526,36 +541,40 @@ namespace MConnectSDK { // SOLO SE ho un device code... if (tokResp != null && tokResp.device_code != "") - { - // parametri chiamata - Uri callUri = new Uri(BaseUrl + "/oauth2/verification"); - var payload = "{\"client_id\": \"test\", \"device_code\": \"" + tokResp.device_code + "\"}"; - HttpContent callCont = new StringContent(payload, Encoding.UTF8, "application/json"); - // effettuo call effettiva - var taskRes = Task.Run(() => Utils.postUriAsync(callUri, callCont)); - taskRes.Wait(); - - // leggo la rispsota in var temporanea... - var resp = JsonConvert.DeserializeObject(taskRes.Result); - // verifico se esista un errore come risposta... - if (resp != null) + { + // controllo preliminare ping/cloud.. + if (pingOk && cloudOk) { - // se è stato autorizzato... - if (resp.error == "") + // parametri chiamata + Uri callUri = new Uri(BaseUrl + "/oauth2/verification"); + var payload = "{\"client_id\": \"test\", \"device_code\": \"" + tokResp.device_code + "\"}"; + HttpContent callCont = new StringContent(payload, Encoding.UTF8, "application/json"); + // effettuo call effettiva + var taskRes = Task.Run(() => Utils.postUriAsync(callUri, callCont)); + taskRes.Wait(); + + // leggo la rispsota in var temporanea... + var resp = JsonConvert.DeserializeObject(taskRes.Result); + // verifico se esista un errore come risposta... + if (resp != null) { - var authResp = JsonConvert.DeserializeObject(taskRes.Result); - verifResp = authResp; - // blocco richiesta verifica - var currReq = reqStatus; - currReq.IsAuth = true; - answ = true; - reqStatus = currReq; - } - else - { - // resp.error == "slow_down" - // resp.error == "authorization_pending" - Thread.Sleep(waitRecall); + // se è stato autorizzato... + if (resp.error == "") + { + var authResp = JsonConvert.DeserializeObject(taskRes.Result); + verifResp = authResp; + // blocco richiesta verifica + var currReq = reqStatus; + currReq.IsAuth = true; + answ = true; + reqStatus = currReq; + } + else + { + // resp.error == "slow_down" + // resp.error == "authorization_pending" + Thread.Sleep(waitRecall); + } } } } @@ -676,34 +695,37 @@ namespace MConnectSDK { // se ho il TOKEN di accesso procedo if (verifResp.access_token != "") - { - // provo a chiamare clientInfo... - - string pageUrl = $"{BaseUrl}/oauth2/clientinfo?access_token={verifResp.access_token}"; - - var taskRes = Task.Run(() => Utils.getPageAsync(pageUrl)); - taskRes.Wait(); - rawResult = taskRes.Result; - tokenRefreshed = checkFixToken(rawResult); - if (tokenRefreshed) + { + // controllo preliminare ping/cloud.. + if (pingOk && cloudOk) { - taskRes = Task.Run(() => Utils.getPageAsync(pageUrl)); + // provo a chiamare clientInfo... + string pageUrl = $"{BaseUrl}/oauth2/clientinfo?access_token={verifResp.access_token}"; + + var taskRes = Task.Run(() => Utils.getPageAsync(pageUrl)); taskRes.Wait(); rawResult = taskRes.Result; tokenRefreshed = checkFixToken(rawResult); - currReq.CloudStatusOk = true; - } - - // ORA se NON HA + fatto refresh --> procedo! - if (!tokenRefreshed) - { - // salvo il client info... - var cliResp = JsonConvert.DeserializeObject(taskRes.Result); - if (cliResp != null) + if (tokenRefreshed) { - clientInfoResp = cliResp; + taskRes = Task.Run(() => Utils.getPageAsync(pageUrl)); + taskRes.Wait(); + rawResult = taskRes.Result; + tokenRefreshed = checkFixToken(rawResult); currReq.CloudStatusOk = true; } + + // ORA se NON HA + fatto refresh --> procedo! + if (!tokenRefreshed) + { + // salvo il client info... + var cliResp = JsonConvert.DeserializeObject(taskRes.Result); + if (cliResp != null) + { + clientInfoResp = cliResp; + currReq.CloudStatusOk = true; + } + } } } reqStatus = currReq; @@ -747,15 +769,19 @@ namespace MConnectSDK Uri callUri = new Uri(BaseUrl + "/oauth2/refresh"); var payload = "{\"refresh_token\": \"" + verifResp.refresh_token + "\"}"; HttpContent callCont = new StringContent(payload, Encoding.UTF8, "application/json"); - // effettuo call effettiva - var taskRes = Task.Run(() => Utils.postUriAsync(callUri, callCont)); - taskRes.Wait(); - // decodifico risposta come authResp... - var authResp = JsonConvert.DeserializeObject(taskRes.Result); - // se OK salvo e sovrascrivo... - verifResp = authResp; + // controllo preliminare ping/cloud.. + if (pingOk && cloudOk) + { + // effettuo call effettiva + var taskRes = Task.Run(() => Utils.postUriAsync(callUri, callCont)); + taskRes.Wait(); + // decodifico risposta come authResp... + var authResp = JsonConvert.DeserializeObject(taskRes.Result); + // se OK salvo e sovrascrivo... + verifResp = authResp; + } } /// @@ -778,14 +804,17 @@ namespace MConnectSDK // se ho il TOKEN di accesso procedo if (verifResp.access_token != "") { - // provo a chiamare clientInfo... + // controllo preliminare ping/cloud.. + if (pingOk && cloudOk) + { + // provo a chiamare clientInfo... + string pageUrl = $"{BaseUrl}/oauth2/clientinfo?access_token={verifResp.access_token}"; - string pageUrl = $"{BaseUrl}/oauth2/clientinfo?access_token={verifResp.access_token}"; + var taskRes = Task.Run(() => Utils.getPageAsync(pageUrl)); + taskRes.Wait(); - var taskRes = Task.Run(() => Utils.getPageAsync(pageUrl)); - taskRes.Wait(); - - string outVal = taskRes.Result; + string outVal = taskRes.Result; + } } } }); @@ -852,9 +881,14 @@ namespace MConnectSDK Uri callUri = new Uri(pageUrlCheckEnroll); var payload = ""; HttpContent callCont = new StringContent(payload, Encoding.UTF8, "application/json"); - var taskRes = Task.Run(() => Utils.putAsync(callUri, callCont, verifResp.access_token)); - taskRes.Wait(); - answ = taskRes.Result; + + // controllo preliminare ping/cloud.. + if (pingOk && cloudOk) + { + var taskRes = Task.Run(() => Utils.putAsync(callUri, callCont, verifResp.access_token)); + taskRes.Wait(); + answ = taskRes.Result; + } return answ; } /// @@ -862,27 +896,30 @@ namespace MConnectSDK /// {ext} protected bool checkEnroll() { - bool answ = false; - - // controllo con la chiamata della clientInfo... - var taskCliInfo = Task.Run(() => GetClientStatusAsync()); - taskCliInfo.Wait(); - // effettuo lettura verifica... - var taskRes = Task.Run(() => Utils.getPageAsync(pageUrlCheckEnroll, verifResp.access_token)); - taskRes.Wait(); - var rawResult = taskRes.Result; - // leggo la risposta... - var resp = JsonConvert.DeserializeObject(taskRes.Result); - if (resp != null) + bool answ = false; + // controllo preliminare ping/cloud.. + if (pingOk && cloudOk) { - enrollResp = resp; - var currStatus = reqStatus; - if (resp.result != null && (resp.result.OrganizationCode.ToUpper() == organizationCode.ToUpper())) + // controllo con la chiamata della clientInfo... + var taskCliInfo = Task.Run(() => GetClientStatusAsync()); + taskCliInfo.Wait(); + // effettuo lettura verifica... + var taskRes = Task.Run(() => Utils.getPageAsync(pageUrlCheckEnroll, verifResp.access_token)); + taskRes.Wait(); + var rawResult = taskRes.Result; + // leggo la risposta... + var resp = JsonConvert.DeserializeObject(taskRes.Result); + if (resp != null) { - // registro che è OK x AUTH - currStatus.IsHmiEnrolled = true; - answ = true; - reqStatus = currStatus; + enrollResp = resp; + var currStatus = reqStatus; + if (resp.result != null && (resp.result.OrganizationCode.ToUpper() == organizationCode.ToUpper())) + { + // registro che è OK x AUTH + currStatus.IsHmiEnrolled = true; + answ = true; + reqStatus = currStatus; + } } } return answ; @@ -1001,129 +1038,132 @@ namespace MConnectSDK /// {ext} private List userListMConnect(bool getImages = false) { - // salvo VECCHIO elenco utenti... - List userListOld = userListCache; - // gestisco numero utenti precedentemente importati... e trovati nella nuova call da cloud - var elImported = userListOld.FindAll(X => X.LoginStatus == UserStatus.IMPORTED); - int numImp = elImported.Count; - int numFound = 0; // continuo da remoto List answ = new List(); List resFilt = new List(); - // controllo con la chiamata della clientInfo... - var taskCliInfo = Task.Run(() => GetClientStatusAsync()); - taskCliInfo.Wait(); - - // parametri chiamata...SENZA /api... - string shortBaseUrl = BaseUrl.Replace("/api", ""); - - string pageUrl = $"{shortBaseUrl}/clients/{organizationCode}/users?skip=0&limit=5"; - // effettuo call PRELIMINARE - var taskRes = Task.Run(() => Utils.getPageAsync(pageUrl, verifResp.access_token)); - taskRes.Wait(); - var rawResult = taskRes.Result; - // leggo la risposta in var temporanea... - var resp = JsonConvert.DeserializeObject(rawResult); - - // ora che so quanti utenti ho --> chiedo TUTTI! - pageUrl = $"{shortBaseUrl}/clients/{organizationCode}/users?skip=0&limit={resp.total}"; - // effettuo call EFFETTIVA - taskRes = Task.Run(() => Utils.getPageAsync(pageUrl, verifResp.access_token)); - taskRes.Wait(); - rawResult = taskRes.Result; - // leggo la risposta in var temporanea... - resp = JsonConvert.DeserializeObject(rawResult); - // salvo in cache REDIS - usrListResp = resp; - UserData _newUser; - Image userImg = null; - UserStatus currStatus = UserStatus.NOT_IMPORTED; - // recupero effettivi dati utente e restituisco... - foreach (var item in resp.result) + // controllo preliminare ping/cloud.. + if (pingOk && cloudOk) { - // verifica SE FOSSE GIA' esistente --> tengo STATUS... - resFilt = userListOld.FindAll(X => X.Username == item.Username); - if (resFilt.Count > 0) - { - currStatus = resFilt[0].LoginStatus; - if (currStatus == UserStatus.IMPORTED) - { - numFound++; - } - } - else - { - currStatus = UserStatus.NOT_IMPORTED; - } - // creo utente - _newUser = new UserData - { - UserId = item.Id, - IsAdmin = item.IsAdmin, - Username = item.Username, - Email = item.Email, - Cognome = item.Lastname, - Nome = item.Firstname, - LoginStatus = currStatus, - UserImage = userImg - }; - answ.Add(_newUser); - } + // salvo VECCHIO elenco utenti... + List userListOld = userListCache; + // gestisco numero utenti precedentemente importati... e trovati nella nuova call da cloud + var elImported = userListOld.FindAll(X => X.LoginStatus == UserStatus.IMPORTED); + int numImp = elImported.Count; + int numFound = 0; + // controllo con la chiamata della clientInfo... + var taskCliInfo = Task.Run(() => GetClientStatusAsync()); + taskCliInfo.Wait(); - // se ne avessi ricevuti (da cloud) meno di quanti ne avevo --> cerco DELETED... - if (numFound != numImp) - { - // cerco nei "vecchi" imported chi sia stato eliminato... - foreach (var item in elImported) + // parametri chiamata...SENZA /api... + string shortBaseUrl = BaseUrl.Replace("/api", ""); + + string pageUrl = $"{shortBaseUrl}/clients/{organizationCode}/users?skip=0&limit=5"; + // effettuo call PRELIMINARE + var taskRes = Task.Run(() => Utils.getPageAsync(pageUrl, verifResp.access_token)); + taskRes.Wait(); + var rawResult = taskRes.Result; + // leggo la risposta in var temporanea... + var resp = JsonConvert.DeserializeObject(rawResult); + + // ora che so quanti utenti ho --> chiedo TUTTI! + pageUrl = $"{shortBaseUrl}/clients/{organizationCode}/users?skip=0&limit={resp.total}"; + // effettuo call EFFETTIVA + taskRes = Task.Run(() => Utils.getPageAsync(pageUrl, verifResp.access_token)); + taskRes.Wait(); + rawResult = taskRes.Result; + // leggo la risposta in var temporanea... + resp = JsonConvert.DeserializeObject(rawResult); + // salvo in cache REDIS + usrListResp = resp; + UserData _newUser; + Image userImg = null; + UserStatus currStatus = UserStatus.NOT_IMPORTED; + // recupero effettivi dati utente e restituisco... + foreach (var item in resp.result) { - resFilt = answ.FindAll(X => X.Username == item.Username); - if (resFilt.Count == 0) + // verifica SE FOSSE GIA' esistente --> tengo STATUS... + resFilt = userListOld.FindAll(X => X.Username == item.Username); + if (resFilt.Count > 0) { - // creo utente - _newUser = new UserData + currStatus = resFilt[0].LoginStatus; + if (currStatus == UserStatus.IMPORTED) { - UserId = item.UserId, - IsAdmin = item.IsAdmin, - Username = item.Username, - Email = item.Email, - Cognome = item.Cognome, - Nome = item.Nome, - LoginStatus = UserStatus.DELETED, - UserImage = userImg - }; - answ.Add(_newUser); - } - } - } - - // se richiesto aggiungo immagine... - if (getImages) - { - // in modalità parallela TENTO scaricamento imagini... - Parallel.ForEach(resp.result, item => - { - userImg = null; - try - { - // creo obj userData... SE HO immagine... - if (item.Image_Url != "") - { - var imgRes = Task.Run(() => Utils.getImageAsync(pageUrlImgDownload, item.Image_Url)); - imgRes.Wait(); - if (imgRes.Result != null) - { - userImg = imgRes.Result; - } + numFound++; } } - catch + else { + currStatus = UserStatus.NOT_IMPORTED; } - resFilt = answ.FindAll(X => X.Username == item.Username); - if (resFilt.Count == 1) + // creo utente + _newUser = new UserData { - resFilt[0].UserImage = userImg; + UserId = item.Id, + IsAdmin = item.IsAdmin, + Username = item.Username, + Email = item.Email, + Cognome = item.Lastname, + Nome = item.Firstname, + LoginStatus = currStatus, + UserImage = userImg + }; + answ.Add(_newUser); + } + + // se ne avessi ricevuti (da cloud) meno di quanti ne avevo --> cerco DELETED... + if (numFound != numImp) + { + // cerco nei "vecchi" imported chi sia stato eliminato... + foreach (var item in elImported) + { + resFilt = answ.FindAll(X => X.Username == item.Username); + if (resFilt.Count == 0) + { + // creo utente + _newUser = new UserData + { + UserId = item.UserId, + IsAdmin = item.IsAdmin, + Username = item.Username, + Email = item.Email, + Cognome = item.Cognome, + Nome = item.Nome, + LoginStatus = UserStatus.DELETED, + UserImage = userImg + }; + answ.Add(_newUser); + } } + } + + // se richiesto aggiungo immagine... + if (getImages) + { + // in modalità parallela TENTO scaricamento imagini... + Parallel.ForEach(resp.result, item => + { + userImg = null; + try + { + // creo obj userData... SE HO immagine... + if (item.Image_Url != "") + { + var imgRes = Task.Run(() => Utils.getImageAsync(pageUrlImgDownload, item.Image_Url)); + imgRes.Wait(); + if (imgRes.Result != null) + { + userImg = imgRes.Result; + } + } + } + catch + { + } + resFilt = answ.FindAll(X => X.Username == item.Username); + if (resFilt.Count == 1) + { + resFilt[0].UserImage = userImg; + } #if false // verifica SE FOSSE GIA' esistente --> tengo STATUS... @@ -1155,8 +1195,8 @@ namespace MConnectSDK answ.Add(_newUser); #endif }); + } } - return answ; } @@ -1521,10 +1561,15 @@ namespace MConnectSDK /// {ext} private void updateUserListCacheFromCloud(bool getImages = false) { - // se NON modalità testing LEGGO davvero da cloud la NUOVA lista - List answ = userListMConnect(getImages); - // salvo in cache locale (comunque...) - userListCache = answ; + try + { + // se NON modalità testing LEGGO davvero da cloud la NUOVA lista + List answ = userListMConnect(getImages); + // salvo in cache locale (comunque...) + userListCache = answ; + } + catch + { } } /// diff --git a/MConnectSDK/Utils.cs b/MConnectSDK/Utils.cs index 13e1c9f..0bb3982 100644 --- a/MConnectSDK/Utils.cs +++ b/MConnectSDK/Utils.cs @@ -22,12 +22,17 @@ namespace MConnectSDK { bool answ = false; Ping pingSender = new Ping(); - PingReply reply = pingSender.Send(target, 100); - // se passa il ping do OK... - if (reply.Status == IPStatus.Success) + try { - answ = true; + PingReply reply = pingSender.Send(target, 100); + // se passa il ping do OK... + if (reply.Status == IPStatus.Success) + { + answ = true; + } } + catch + { } return answ; } ///