using Landmark.OLA.Models.OnlineBanking; using System.Security.Authentication; using System.Xml.Linq; namespace OnlineBankingAuth.Parsers { public class AuthTokenParser : IAuthTokenParser { public AuthTokenResponse ParseAuthTokenResponse(XElement xElement) { try { var accessToken = (string)xElement.Element("access_token"); if (String.IsNullOrEmpty(accessToken)) { return ParseErroneousAuthTokenResponse(xElement); } var authToken = new AuthToken { DiFiid = (string)xElement.Element("di_fiid"), DiFicustomer = (string)xElement.Element("di_ficustomer"), DiMemberNumber = (string)xElement.Element("di_member_number"), AccessToken = (string)xElement.Element("access_token"), ExpiresIn = (string)xElement.Element("expires_in"), RefreshToken = (string)xElement.Element("refresh_token"), RefreshTokenExpiresIn = (string)xElement.Element("refresh_token_expires_in") }; var authTokenResponse = new AuthTokenResponse { Token = authToken, Status = null }; return authTokenResponse; } catch (Exception e) { throw new AuthenticationException($"Could not parse response from IdP vendor. {e.Message}, {e.StackTrace}"); } } private AuthTokenResponse ParseErroneousAuthTokenResponse(XElement xElement) { var messageElement = (XElement)xElement.FirstNode; var errorElement = (XElement)xElement.FirstNode.NextNode; var errorType = (XElement)errorElement.FirstNode; var errorCode = (XElement)errorElement.FirstNode.NextNode; var errorMessage = (XElement)errorElement.FirstNode.NextNode.NextNode; var error = new AuthTokenError { ErrorType = errorType.Value, ErrorCode = errorCode.Value, ErrorMessage = errorMessage.Value }; var authTokenStatus = new AuthTokenStatus { StatusMessage = messageElement.Value, ErrorInfo = error }; return new AuthTokenResponse { Status = authTokenStatus }; } } }