/// <inheritdoc/> public IPamTransaction Start( IPamMessageHandler messageHandler, string?user = null) { var conversationHandler = _configuration.CreateMessaging?.Invoke(messageHandler) ?? new PamConversationHandler(messageHandler); PamStatus ConversationCallback(int messageCount, IntPtr messages, out IntPtr responseArrayPtr, IntPtr appDataPtr) { try { return(conversationHandler.Handle(messageCount, messages, out responseArrayPtr, appDataPtr)); } catch (Exception ex) { _logger?.LogError(ex, "Conversation failed with error message {0}", ex.Message); responseArrayPtr = IntPtr.Zero; return(PamStatus.PAM_CONV_ERR); } } var conversation = new PamConv(ConversationCallback); CheckStatus(_interop.pam_start(_configuration.ServiceName, user, conversation, out var pamHandle)); return(new PamTransaction(_interop, pamHandle, conversation, _logger)); }
/// <summary> /// Sends the messages to the <see cref="IPamMessageHandler"/>. /// </summary> /// <param name="messages">The messages to process.</param> /// <param name="messageHandler">The message handler that gets the messages.</param> /// <returns>The responses for the messages.</returns> private static IEnumerable <IPamResponse> ProcessMessages(IEnumerable <IPamMessage> messages, IPamMessageHandler messageHandler) { foreach (var message in messages) { switch (message) { case PamMessage <string> msg when msg.MessageStyle == PamMessageStyle.PAM_TEXT_INFO: yield return(new PamNoResponse(messageHandler.TextInfo(msg.Payload))); break; case PamMessage <string> msg when msg.MessageStyle == PamMessageStyle.PAM_ERROR_MSG: yield return(new PamNoResponse(messageHandler.ErrorMsg(msg.Payload))); break; case PamMessage <string> msg when msg.MessageStyle == PamMessageStyle.PAM_PROMPT_ECHO_OFF: yield return(new PamTextResponse(messageHandler.PromptEchoOff(msg.Payload))); break; case PamMessage <string> msg when msg.MessageStyle == PamMessageStyle.PAM_PROMPT_ECHO_ON: yield return(new PamTextResponse(messageHandler.PromptEchoOn(msg.Payload))); break; case PamMessage <string> msg when msg.MessageStyle == PamMessageStyle.PAM_RADIO_TYPE: yield return(new PamTextResponse(messageHandler.RadioType(msg.Payload))); break; case PamMessage <PamBinaryData> msg when msg.MessageStyle == PamMessageStyle.PAM_BINARY_PROMPT: yield return(new PamBinaryResponse(messageHandler.BinaryPrompt(msg.Payload))); break; default: throw new NotSupportedException($"Message style {message.MessageStyle.ToString()} not supported."); } } }
/// <summary> /// Initializes a new instance of the <see cref="PamConversationHandler"/> class. /// </summary> /// <param name="messageHandler">The message handler that gets the messages.</param> public PamConversationHandler(IPamMessageHandler messageHandler) { _messageHandler = messageHandler ?? throw new ArgumentNullException(nameof(messageHandler)); }