Iniziato modifiche x check preliminare ping/rete/cloud...

This commit is contained in:
Samuele E. Locatelli
2019-04-17 14:22:35 +02:00
parent d3904eef45
commit ef623ea076
2 changed files with 260 additions and 210 deletions
+251 -206
View File
@@ -20,6 +20,14 @@ namespace MConnectSDK
{
#region oggetti base ed init
/// <summary>
/// Semaforo ping PRELIMINARE
/// </summary>
protected bool pingOk = false;
/// <summary>
/// Semaforo controllo CLOUD PRELIMINARE
/// </summary>
protected bool cloudOk = false;
/// <summary>
/// Oggetto accesso memoria...
/// {ext}<summary>
@@ -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<tokenResponse>(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<tokenResponse>(taskRes.Result);
waitRecall = 1000 * resp.interval;
tokResp = resp;
}
}
/// <summary>
/// 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<tokenResponse>(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<tokenResponse>(taskRes.Result);
// verifico se esista un errore come risposta...
if (resp != null)
{
var authResp = JsonConvert.DeserializeObject<verificationSuccessResponse>(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<verificationSuccessResponse>(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<clientInfoResponse>(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<clientInfoResponse>(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<verificationSuccessResponse>(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<verificationSuccessResponse>(taskRes.Result);
// se OK salvo e sovrascrivo...
verifResp = authResp;
}
}
/// <summary>
@@ -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;
}
/// <summary>
@@ -862,27 +896,30 @@ namespace MConnectSDK
/// {ext}<summary>
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<enrollResponse>(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<enrollResponse>(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
/// <returns>{ext}<returns>
private List<UserData> userListMConnect(bool getImages = false)
{
// salvo VECCHIO elenco utenti...
List<UserData> 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<UserData> answ = new List<UserData>();
List<UserData> resFilt = new List<UserData>();
// 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<userListResponse>(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<userListResponse>(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<UserData> 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<userListResponse>(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<userListResponse>(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}<summary>
private void updateUserListCacheFromCloud(bool getImages = false)
{
// se NON modalità testing LEGGO davvero da cloud la NUOVA lista
List<UserData> answ = userListMConnect(getImages);
// salvo in cache locale (comunque...)
userListCache = answ;
try
{
// se NON modalità testing LEGGO davvero da cloud la NUOVA lista
List<UserData> answ = userListMConnect(getImages);
// salvo in cache locale (comunque...)
userListCache = answ;
}
catch
{ }
}
/// <summary>
+9 -4
View File
@@ -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;
}
/// <summary>