예제 #1
0
        /// <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));
 }