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"); } } }); }
public SearchTransaction(ImapConnection connection, bool uid, ImapCapability resultSpecifierCapabilityRequirement) : base(connection, uid, resultSpecifierCapabilityRequirement) { }
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; }
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; } }
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); }); }
private void TestMailbox(ImapCapability[] capabilities, ImapMailboxFlag[] flags, string name, Action<ImapPseudoServer, ImapMailboxInfo> action) { TestMailbox(capabilities, flags, ".", name, action); }