/// <summary> /// Wait for the client to send its response /// </summary> /// <param name="data"></param> public void Wait(object data) { try { if (data == null) { Exception e = new System.ArgumentNullException("data"); options.LogThrownException(e); throw e; } ClientTransaction client = (ClientTransaction)data; // We will wait until the timeout // During this time, if the client sends its response then the server shall kill this Wait Thread for the client transaction // to prevent removal of the client from the Client database bool timeOut = TimedOut(); // If timed out, remove the client from the database if (timeOut) { log.Debug("Client " + client.ID + " timed out"); ClientDatabase.RemoveTransaction(client); } } catch (Exception e) { if (e.Message.Contains("Thread was being aborted")) { log.Debug("Client Thread was killed. "); } else { log.Debug("ThreadWait: Wait failed. " + e.Message); } } }
public async Task <IHttpActionResult> Msg3() { log.Debug("SpSequenceCheck(.) started."); bool error = false; HttpStatusCode errorCode = System.Net.HttpStatusCode.InternalServerError; M4ResponseMessage m4Response = null; try { m4Response = await ClientDatabase.Message3(this.Request); } catch (WebException we) { error = true; log.Debug("Web Exception in Provisioning Request: " + we.Message); HttpWebResponse webResponse = we.Response as HttpWebResponse; errorCode = (HttpStatusCode)webResponse.StatusCode; } catch (HttpResponseException re) { error = true; log.Debug("HttpResponseException in Message 3/4: " + re.Message); errorCode = (HttpStatusCode)re.Response.StatusCode; } catch (Exception e) { error = true; log.Debug("Error occurred processing Message 3 or 4. " + e.Message); errorCode = System.Net.HttpStatusCode.InternalServerError; } // always cleanup database on Message 4 try { ClientDatabase.RemoveTransaction(this.Request, Constants.msg3Str); } catch (HttpResponseException re) { log.Debug("HttpResponseException in Message 3/4 RemoveTransaction: " + re.Message); if (!error) { error = true; errorCode = (HttpStatusCode)re.Response.StatusCode; } } catch (Exception e) { log.Debug("Error occurred processing Message 3 or 4 RemoveTransaction: " + e.Message); if (!error) { error = true; errorCode = System.Net.HttpStatusCode.InternalServerError; } } if (error) { log.DebugFormat("Msg3(.) returning HTTP status code {0}.", errorCode); return(StatusCode(errorCode)); } else { log.Debug("Msg3(.) returning HTTP status success."); return(Json(m4Response)); } }
/// <summary> /// Create a new Provision/Remote Attestation request /// Processes provision request and creates a Challenge response to send to a client /// </summary> /// <param name="data">Thread Data, input parameter (HttpRequestMessage) from the client</param> public void CreateNewRequest(object data) { challengeResponse = null; log.Debug("CreateNewRequest(.) started."); try { if (data == null) { HttpResponseException e = new HttpResponseException(System.Net.HttpStatusCode.InternalServerError); options.LogThrownException(e); throw e; } HttpRequestMessage request = (HttpRequestMessage)data; var result = request.Content.ReadAsStringAsync(); string jsonMsgRequest = result.Result; ProvisionRequestMessage pReceived = JsonConvert.DeserializeObject <ProvisionRequestMessage>(jsonMsgRequest); // Get client ID so we can track it string clientID = ClientDatabase.GetClientID(request, Constants.ProvisionStr); mClient = new ClientTransaction(clientID); mClient.sigmaSequenceCheck.currentNonce = pReceived.reqHeader.nonce; ProvisionRequest provRequest = new ProvisionRequest(); ChallengeResponse tChallengeResponse = provRequest.ProcessProvisionRequest(request, mClient); // Add new client to request database only if successful if (!ClientDatabase.AddClient(mClient)) { HttpResponseException e = new HttpResponseException(System.Net.HttpStatusCode.Conflict); options.LogThrownException(e); throw e; } log.Info("\n ***** State: Starting Provision request for client: " + mClient.ID + "\n"); // Update client state if (!mClient.sigmaSequenceCheck.UpdateState(Constants.SequenceState.Challenge)) { HttpResponseException e = new HttpResponseException(System.Net.HttpStatusCode.PreconditionFailed); options.LogThrownException(e); throw e; } // Set Client State challengeResponse = tChallengeResponse; } catch (HttpResponseException re) { options.LogCaughtException(re); httpRE = re; } catch (Exception ex) { options.LogCaughtException(ex); threadException = ex; } finally { log.Debug("CreateNewRequest(.) returning."); } }