private (string, PairingSession) IsValidPairingSession(string pairingId, [JsonConverter(typeof(StringEnumConverter))] HandshakeResourceType handshakeResourceType = HandshakeResourceType.None) { var pairingSession = _sessions.FirstOrDefault(a => a.Id.Equals(pairingId, StringComparison.InvariantCultureIgnoreCase)); if (pairingSession == null) { return("pairing session not found", null); } else if (handshakeResourceType != HandshakeResourceType.None) { if (pairingSession.Step != handshakeResourceType) { return("the pairing session has not reached a valid state to do that", pairingSession); } else { return("OK", pairingSession); } } return("OK", pairingSession); }
public IActionResult Handle([FromQuery] string pairingId, [FromQuery][JsonConverter(typeof(StringEnumConverter))] HandshakeResourceType resource, [FromBody] string data) { (string, PairingSession)pairingSession; switch (resource) { case HandshakeResourceType.None: return(BadRequest("no resource given")); case HandshakeResourceType.ServerHello: pairingSession = IsValidPairingSession(pairingId); if (pairingSession.Item2 == null) { pairingSession.Item1 = "OK"; pairingSession.Item2 = new PairingSession(pairingId); _sessions.Add(pairingSession.Item2); } if (pairingSession.Item2.Step != HandshakeResourceType.None) { return(BadRequest("the pairing session has not reached a valid state to do that")); } if (pairingSession.Item1 == "OK") { var returnData = pairingSession.Item2.GenerateServerHello(data); var apiCallResponse = new ApiCallResponse(ApiCallMethod.POST, Constants.Step1Url, JsonConvert.SerializeObject(returnData)); return(Ok(apiCallResponse)); } else { return(BadRequest(pairingSession.Item1)); } case HandshakeResourceType.ClientHello: pairingSession = IsValidPairingSession(pairingId, HandshakeResourceType.ClientHello); if (pairingSession.Item1 == "OK") { var returnAckData = pairingSession.Item2.ParseClientHello(data); return(Accepted(returnAckData)); } else { return(BadRequest(pairingSession.Item1)); } case HandshakeResourceType.ServerAck: pairingSession = IsValidPairingSession(pairingId, HandshakeResourceType.ServerAck); if (pairingSession.Item1 == "OK") { var ackData = pairingSession.Item2.GenerateServerAck(); var ackCallResponse = new ApiCallResponse(ApiCallMethod.POST, Constants.Step2Url, JsonConvert.SerializeObject(ackData)); return(Ok(ackCallResponse)); } else { return(BadRequest(pairingSession.Item1)); } case HandshakeResourceType.ClientAck: pairingSession = IsValidPairingSession(pairingId, HandshakeResourceType.ClientAck); if (pairingSession.Item1 == "OK") { var returnAckData = pairingSession.Item2.ParseClientAck(data); return(Accepted(returnAckData)); } else { return(BadRequest(pairingSession.Item1)); } case HandshakeResourceType.Session: pairingSession = IsValidPairingSession(pairingId, HandshakeResourceType.Session); if (pairingSession.Item1 == "OK") { var returnSessionData = pairingSession.Item2.GetKey(); return(Accepted(new KeyWrapper(Convert.ToBase64String(returnSessionData)))); } else { return(BadRequest(pairingSession.Item1)); } default: return(BadRequest("no resource given")); } }