Example #1
0
 public CreateTransaction(ImapConnection connection, ImapCapability createParametersCapabilityRequirement)
     : base(connection)
 {
     this.createParametersCapabilityRequirement = createParametersCapabilityRequirement;
 }
        private void TestMessage(int existMessageCount, ImapCapability[] capabilities, ImapSequenceSet sequenceOrUidSet, Action<ImapPseudoServer, ImapMessageInfoBase, ImapMessageInfo[]> action)
        {
            TestUtils.TestAuthenticated(capabilities, delegate(ImapPseudoServer server, ImapClient client) {
            // LIST
            server.EnqueueTaggedResponse("* LIST () \".\" INBOX\r\n" +
                                     "$tag OK done\r\n");
            // SELECT
            server.EnqueueTaggedResponse(string.Format("* EXISTS {0}\r\n", existMessageCount) +
                                     "* OK [UIDVALIDITY 1]\r\n" +
                                     "$tag OK done\r\n");

            using (var inbox = client.OpenInbox()) {
              server.DequeueRequest(); // LIST
              server.DequeueRequest(); // SELECT

              var messages = new ImapMessageInfo[0];

              if (0 < existMessageCount) {
            // NOOP
            server.EnqueueTaggedResponse("$tag OK done\r\n");
            // FETCH
            var fetchResp = new StringBuilder();

            for (var seq = 1; seq <= existMessageCount; seq++) {
              fetchResp.AppendFormat("* FETCH {0} (UID {0})\r\n", seq);
            }

            fetchResp.Append("$tag OK done\r\n");

            server.EnqueueTaggedResponse(fetchResp.ToString());

            messages = inbox.GetMessages().ToArray();

            server.DequeueRequest(); // NOOP
            server.DequeueRequest(); // FETCH
              }

              try {
            var messageSet = new MessageSet(inbox, sequenceOrUidSet);

            Assert.AreSame(messageSet.Client, client);
            Assert.AreSame(messageSet.Mailbox, inbox);
            Assert.AreEqual(1L, messageSet.UidValidity);

            action(server, messageSet, messages);
              }
              finally {
            if (inbox.IsOpen)
              // CLOSE
              server.EnqueueTaggedResponse("$tag OK done\r\n");
              }
            }
              });
        }
Example #3
0
 public SearchTransaction(ImapConnection connection, bool uid, ImapCapability resultSpecifierCapabilityRequirement)
     : base(connection, uid, resultSpecifierCapabilityRequirement)
 {
 }
Example #4
0
 public ExamineTransaction(ImapConnection connection, ImapMailbox selectingMailbox, ImapCapability selectParametersCapabilityRequirement)
     : base(connection, selectingMailbox, selectParametersCapabilityRequirement)
 {
 }
 protected SelectTransactionBase(ImapConnection connection, ImapMailbox selectingMailbox, ImapCapability selectParametersCapabilityRequirement)
     : base(connection)
 {
     this.selectingMailbox = selectingMailbox;
       this.selectParametersCapabilityRequirement = selectParametersCapabilityRequirement;
 }
Example #6
0
 private void CheckServerCapability(ImapCapability capability)
 {
     if (capability != null && !serverCapabilities.Has(capability))
     throw new ImapIncapableException(capability);
 }
 internal void ThrowIfIncapable(ImapCapability requiredCapability)
 {
     if (!ServerCapabilities.Has(requiredCapability))
     throw new ImapIncapableException(requiredCapability);
 }
 /*
  * utilities
  */
 internal bool IsCapable(ImapCapability capability)
 {
     return ServerCapabilities.Has(capability);
 }
        private ImapCommandResult SelectExamineInternal(bool selectAsReadOnly,
                                                    string mailboxName,
                                                    ImapParenthesizedString selectParameters,
                                                    ImapCapability selectParametersCapabilityRequirement)
        {
            RejectNonAuthenticatedState();

              RejectInvalidMailboxNameArgument(mailboxName);

              var selectingMailbox = mailboxManager.GetExist(mailboxName);
              var selectingMailboxExists = (selectingMailbox != null);

              if (selectingMailboxExists) {
            if (selectedMailbox == selectingMailbox)
              return new ImapCommandResult(ImapCommandResultCode.RequestDone,
                                       "mailbox has already been selected");
            else if (selectingMailbox.IsUnselectable)
              throw new ImapProtocolViolationException("mailbox is not selectable or not existent");
              }
              else {
            selectingMailbox = new ImapMailbox(mailboxName);
              }

              using (var t = selectAsReadOnly
             ? (SelectTransactionBase)new ExamineTransaction(connection, selectingMailbox, selectParametersCapabilityRequirement)
             : (SelectTransactionBase)new SelectTransaction (connection, selectingMailbox, selectParametersCapabilityRequirement)) {
            /*
             * RFC 4466 - Collected Extensions to IMAP4 ABNF
             * http://tools.ietf.org/html/rfc4466
             *
             *    examine         = "EXAMINE" SP mailbox [select-params]
             *                      ;; modifies the original IMAP EXAMINE command
             *                      ;; to accept optional parameters
             *    select          = "SELECT" SP mailbox [select-params]
             *                      ;; modifies the original IMAP SELECT command to
             *                      ;; accept optional parameters
             *    select-params   = SP "(" select-param *(SP select-param) ")"
             *    select-param    = select-param-name [SP select-param-value]
             *                      ;; a parameter to SELECT may contain one or
             *                      ;; more atoms and/or strings and/or lists.
             *    select-param-name= tagged-ext-label
             *    select-param-value= tagged-ext-val
             *                      ;; This non-terminal shows recommended syntax
             *                      ;; for future extensions
             */
            t.RequestArguments["mailbox name"] = new ImapMailboxNameString(mailboxName);

            // select-params
            if (selectParameters != null)
              t.RequestArguments["select parameters"] = selectParameters;

            if (ProcessTransaction(t).Succeeded) {
              if (selectingMailboxExists)
            selectedMailbox = selectingMailbox;
              else
            selectedMailbox = mailboxManager.Add(selectingMailbox);

              TransitStateTo(ImapSessionState.Selected);
            }
            else {
              selectedMailbox = null;

              if (state != ImapSessionState.NotConnected)
            TransitStateTo(ImapSessionState.Authenticated);

              ProcessMailboxRefferalResponse(t.Result.TaggedStatusResponse);
            }

            return t.Result;
              }
        }
Example #10
0
        private void TestMailbox(ImapCapability[] capabilities,
                             ImapMailboxFlag[] flags,
                             string hierarchyDelimiter,
                             string name,
                             Action<ImapPseudoServer, ImapMailboxInfo> action)
        {
            capabilities = capabilities ?? new ImapCapability[0];

              TestUtils.TestAuthenticated(capabilities, delegate(ImapPseudoServer server, ImapClient client) {
            var joinedFlags = string.Join(" ", Array.ConvertAll(flags ?? new ImapMailboxFlag[0], delegate(ImapMailboxFlag f) {
              return f.ToString();
            }).ToArray());

            // LIST
            server.EnqueueTaggedResponse(string.Format("* LIST ({0}) \"{1}\" {2}\r\n", joinedFlags, hierarchyDelimiter, name) +
                                     "$tag OK done\r\n");

            var mailbox = client.GetMailbox(name);

            Assert.IsNotNull(mailbox);
            Assert.AreEqual(name, mailbox.FullName);
            Assert.AreEqual(hierarchyDelimiter, mailbox.MailboxSeparator);

            var requested = server.DequeueRequest();

            if (Array.Exists(capabilities, delegate(ImapCapability capa) { return capa == ImapCapability.ListExtended; })) {
              Assert.That(requested, Text.Contains("LIST ("));
              Assert.That(requested, Text.Contains(string.Format(") \"\" \"{0}\"", name)));
            }
            else {
              Assert.That(requested, Text.EndsWith(string.Format("LIST \"\" \"{0}\"\r\n", name)));
            }

            action(server, mailbox);
              });
        }
Example #11
0
 private void TestMailbox(ImapCapability[] capabilities,
                      ImapMailboxFlag[] flags,
                      string name,
                      Action<ImapPseudoServer, ImapMailboxInfo> action)
 {
     TestMailbox(capabilities, flags, ".", name, action);
 }