Esempio n. 1
0
            // (note for when adding more: they need to be disposed)

            public cSession(cCallbackSynchroniser pSynchroniser, fCapabilities pIgnoreCapabilities, fMailboxCacheDataItems pMailboxCacheDataItems, cBatchSizerConfiguration pNetworkWriteConfiguration, cIdleConfiguration pIdleConfiguration, cBatchSizerConfiguration pFetchCacheItemsConfiguration, cBatchSizerConfiguration pFetchBodyReadConfiguration, Encoding pEncoding, cTrace.cContext pParentContext)
            {
                var lContext = pParentContext.NewObject(nameof(cSession), pIgnoreCapabilities, pMailboxCacheDataItems, pNetworkWriteConfiguration, pIdleConfiguration, pFetchCacheItemsConfiguration, pFetchBodyReadConfiguration);

                mSynchroniser          = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
                mIgnoreCapabilities    = pIgnoreCapabilities;
                mMailboxCacheDataItems = pMailboxCacheDataItems;

                mPipeline = new cCommandPipeline(pSynchroniser, ZDisconnected, pNetworkWriteConfiguration, pIdleConfiguration, lContext);

                mFetchCacheItemsSizer = new cBatchSizer(pFetchCacheItemsConfiguration);
                mFetchBodyReadSizer   = new cBatchSizer(pFetchBodyReadConfiguration);

                mCommandPartFactory = new cCommandPartFactory(false, null);

                if (pEncoding == null)
                {
                    mEncodingPartFactory = mCommandPartFactory;
                }
                else
                {
                    mEncodingPartFactory = new cCommandPartFactory(false, pEncoding);
                }
            }
Esempio n. 2
0
        internal cCapabilities(cStrings pCapabilities, cStrings pAuthenticationMechanisms, fCapabilities pIgnoreCapabilities)
        {
            Capabilities             = pCapabilities ?? throw new ArgumentNullException(nameof(pCapabilities));
            AuthenticationMechanisms = pAuthenticationMechanisms ?? throw new ArgumentNullException(nameof(pAuthenticationMechanisms));

            fCapabilities lCapabilities = 0;

            if (pCapabilities.Contains("LoginDisabled", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.logindisabled;
            }
            if (pCapabilities.Contains("StartTLS", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.starttls;
            }
            if (pCapabilities.Contains("Idle", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.idle;
            }
            if (pCapabilities.Contains("Literal+", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.literalplus;
            }
            if (pCapabilities.Contains("Literal-", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.literalminus;
            }
            if (pCapabilities.Contains("Enable", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.enable;
            }
            if (pCapabilities.Contains("UTF8=Accept", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.utf8accept;
            }
            if (pCapabilities.Contains("UTF8=Only", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.utf8only;
            }
            if (pCapabilities.Contains("List-Extended", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.listextended;
            }
            if (pCapabilities.Contains("Children", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.children;
            }
            if (pCapabilities.Contains("SASL-IR", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.sasl_ir;
            }
            if (pCapabilities.Contains("Login-Referrals", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.loginreferrals;
            }
            if (pCapabilities.Contains("Mailbox-Referrals", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.mailboxreferrals;
            }
            if (pCapabilities.Contains("Id", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.id;
            }
            if (pCapabilities.Contains("Binary", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.binary;
            }
            if (pCapabilities.Contains("Namespace", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.namespaces;
            }
            if (pCapabilities.Contains("List-Status", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.liststatus;
            }
            if (pCapabilities.Contains("Special-Use", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.specialuse;
            }
            if (pCapabilities.Contains("ESearch", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.esearch;
            }
            if (pCapabilities.Contains("Sort", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.sort;
            }
            if (pCapabilities.Contains("Sort=Display", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.sortdisplay;
            }
            if (pCapabilities.Contains("ESort", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.esort;
            }
            //if (pCapabilities.Contains("Thread=OrderedSubject", StringComparer.InvariantCultureIgnoreCase)) lCapabilities |= fCapabilities.threadorderedsubject;
            //if (pCapabilities.Contains("Thread=References", StringComparer.InvariantCultureIgnoreCase)) lCapabilities |= fCapabilities.threadreferences;
            if (pCapabilities.Contains("CondStore", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.condstore;
            }
            if (pCapabilities.Contains("QResync", StringComparer.InvariantCultureIgnoreCase))
            {
                lCapabilities |= fCapabilities.qresync | fCapabilities.condstore;
            }

            EffectiveCapabilities = lCapabilities & ~pIgnoreCapabilities;
        }
Esempio n. 3
0
        private async void cmdConnect_Click(object sender, EventArgs e)
        {
            if (!ValidateChildren(ValidationConstraints.Enabled))
            {
                return;
            }

            try
            {
                mClient.SetServer(txtHost.Text.Trim(), int.Parse(txtPort.Text), chkSSL.Checked);

                if (rdoCredNone.Checked)
                {
                    mClient.SetNoCredentials();
                }
                else
                {
                    eTLSRequirement lTLSRequirement;
                    if (rdoTLSIndifferent.Checked)
                    {
                        lTLSRequirement = eTLSRequirement.indifferent;
                    }
                    else if (rdoTLSRequired.Checked)
                    {
                        lTLSRequirement = eTLSRequirement.required;
                    }
                    else
                    {
                        lTLSRequirement = eTLSRequirement.disallowed;
                    }

                    if (rdoCredAnon.Checked)
                    {
                        mClient.SetAnonymousCredentials(txtTrace.Text.Trim(), lTLSRequirement, chkTryIfNotAdvertised.Checked);
                    }
                    else
                    {
                        mClient.SetPlainCredentials(txtUserId.Text.Trim(), txtPassword.Text.Trim(), lTLSRequirement, chkTryIfNotAdvertised.Checked);
                    }
                }

                fMailboxCacheDataItems lMailboxCacheData = 0;
                if (chkCacheSubscribed.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.subscribed;
                }
                if (chkCacheChildren.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.children;
                }
                if (chkCacheSpecialUse.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.specialuse;
                }
                if (chkCacheMessageCount.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.messagecount;
                }
                if (chkCacheRecentCount.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.recentcount;
                }
                if (chkCacheUIDNext.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.uidnext;
                }
                if (chkCacheUIDValidity.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.uidvalidity;
                }
                if (chkCacheUnseenCount.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.unseencount;
                }
                if (chkCacheHighestModSeq.Checked)
                {
                    lMailboxCacheData |= fMailboxCacheDataItems.highestmodseq;
                }

                mClient.MailboxCacheDataItems = lMailboxCacheData;

                fCapabilities lKnownCapabilities = 0;

                if (chkIgnoreStartTLS.Checked)
                {
                    lKnownCapabilities |= fCapabilities.starttls;
                }
                if (chkIgnoreEnable.Checked)
                {
                    lKnownCapabilities |= fCapabilities.enable;
                }
                if (chkIgnoreUTF8.Checked)
                {
                    lKnownCapabilities |= fCapabilities.utf8accept | fCapabilities.utf8only;
                }
                if (chkIgnoreId.Checked)
                {
                    lKnownCapabilities |= fCapabilities.id;
                }
                if (chkIgnoreNamespace.Checked)
                {
                    lKnownCapabilities |= fCapabilities.namespaces;
                }

                if (chkIgnoreMailboxReferrals.Checked)
                {
                    lKnownCapabilities |= fCapabilities.mailboxreferrals;
                }
                if (chkIgnoreListExtended.Checked)
                {
                    lKnownCapabilities |= fCapabilities.listextended;
                }
                if (chkIgnoreListStatus.Checked)
                {
                    lKnownCapabilities |= fCapabilities.liststatus;
                }
                if (chkIgnoreSpecialUse.Checked)
                {
                    lKnownCapabilities |= fCapabilities.specialuse;
                }

                if (chkIgnoreCondStore.Checked)
                {
                    lKnownCapabilities |= fCapabilities.condstore;
                }
                if (chkIgnoreQResync.Checked)
                {
                    lKnownCapabilities |= fCapabilities.qresync;
                }

                if (chkIgnoreLiteralPlus.Checked)
                {
                    lKnownCapabilities |= fCapabilities.literalplus | fCapabilities.literalminus;
                }
                if (chkIgnoreBinary.Checked)
                {
                    lKnownCapabilities |= fCapabilities.binary;
                }
                if (chkIgnoreIdle.Checked)
                {
                    lKnownCapabilities |= fCapabilities.idle;
                }
                if (chkIgnoreSASLIR.Checked)
                {
                    lKnownCapabilities |= fCapabilities.sasl_ir;
                }

                if (chkIgnoreESearch.Checked)
                {
                    lKnownCapabilities |= fCapabilities.esearch;
                }
                if (chkIgnoreSort.Checked)
                {
                    lKnownCapabilities |= fCapabilities.sort;
                }
                if (chkIgnoreSortDisplay.Checked)
                {
                    lKnownCapabilities |= fCapabilities.sortdisplay;
                }
                //if (chkIgnoreThreadOrderedSubject.Checked) lKnownCapabilities |= fCapabilities.threadorderedsubject;
                //if (chkIgnoreThreadReferences.Checked) lKnownCapabilities |= fCapabilities.threadreferences;
                if (chkIgnoreESort.Checked)
                {
                    lKnownCapabilities |= fCapabilities.esort;
                }

                mClient.IgnoreCapabilities = lKnownCapabilities;

                mClient.MailboxReferrals = chkMailboxReferrals.Checked;

                mClient.NetworkWriteConfiguration = new cBatchSizerConfiguration(int.Parse(txtNWMin.Text), int.Parse(txtNWMax.Text), int.Parse(txtNWMaxTime.Text), int.Parse(txtNWInitial.Text));

                await mClient.ConnectAsync();
            }
            catch (Exception ex)
            {
                if (!IsDisposed)
                {
                    MessageBox.Show(this, $"Connect error\n{ex}");
                }
            }
        }
Esempio n. 4
0
            public async Task <List <iMailboxHandle> > ListExtendedAsync(cMethodControl pMC, eListExtendedSelect pSelect, bool pRemote, string pListMailbox, char?pDelimiter, cMailboxPathPattern pPattern, bool pStatus, cTrace.cContext pParentContext)
            {
                var lContext = pParentContext.NewMethod(nameof(cSession), nameof(ListExtendedAsync), pMC, pSelect, pRemote, pListMailbox, pDelimiter, pPattern, pStatus);

                // caller needs to determine if list status is supported

                if (mDisposed)
                {
                    throw new ObjectDisposedException(nameof(cSession));
                }
                if (_ConnectionState != eConnectionState.notselected && _ConnectionState != eConnectionState.selected)
                {
                    throw new InvalidOperationException(kInvalidOperationExceptionMessage.NotConnected);
                }

                if (pListMailbox == null)
                {
                    throw new ArgumentNullException(nameof(pListMailbox));
                }
                if (pPattern == null)
                {
                    throw new ArgumentNullException(nameof(pPattern));
                }

                if (!mCommandPartFactory.TryAsListMailbox(pListMailbox, pDelimiter, out var lListMailboxCommandPart))
                {
                    throw new ArgumentOutOfRangeException(nameof(pListMailbox));
                }

                using (var lBuilder = new cCommandDetailsBuilder())
                {
                    if (!_Capabilities.QResync)
                    {
                        lBuilder.Add(await mSelectExclusiveAccess.GetBlockAsync(pMC, lContext).ConfigureAwait(false)); // block select if mailbox-data delivered during the command would be ambiguous
                    }
                    lBuilder.Add(await mMSNUnsafeBlock.GetBlockAsync(pMC, lContext).ConfigureAwait(false));            // this command is msnunsafe

                    lBuilder.BeginList(eListBracketing.none);

                    lBuilder.Add(kListExtendedCommandPartList);

                    lBuilder.BeginList(eListBracketing.ifany);

                    if (pSelect == eListExtendedSelect.subscribed)
                    {
                        lBuilder.Add(kListExtendedCommandPartSubscribed);
                    }
                    else if (pSelect == eListExtendedSelect.subscribedrecursive)
                    {
                        lBuilder.Add(kListExtendedCommandPartSubscribed);
                        lBuilder.Add(kListExtendedCommandPartRecursiveMatch);
                    }

                    if (pRemote)
                    {
                        lBuilder.Add(kListExtendedCommandPartRemote);
                    }

                    lBuilder.EndList();

                    lBuilder.Add(kListExtendedCommandPartMailbox);
                    lBuilder.Add(lListMailboxCommandPart);

                    // return options

                    lBuilder.BeginList(eListBracketing.ifany, kListExtendedCommandPartReturnSpace);

                    if ((mMailboxCacheDataItems & fMailboxCacheDataItems.subscribed) != 0)
                    {
                        lBuilder.Add(kListExtendedCommandPartSubscribed);
                    }
                    if ((mMailboxCacheDataItems & fMailboxCacheDataItems.children) != 0)
                    {
                        lBuilder.Add(kListExtendedCommandPartChildren);
                    }
                    if ((mMailboxCacheDataItems & fMailboxCacheDataItems.specialuse) != 0 && _Capabilities.SpecialUse)
                    {
                        lBuilder.Add(kListExtendedCommandPartSpecialUse);
                    }

                    if (pStatus)
                    {
                        lBuilder.Add(kListExtendedCommandPartStatus);
                        lBuilder.AddStatusAttributes(mStatusAttributes);
                    }

                    lBuilder.EndList();
                    lBuilder.EndList();

                    var lHook = new cListExtendedCommandHook(mMailboxCache, pSelect, pPattern, pStatus);
                    lBuilder.Add(lHook);

                    var lResult = await mPipeline.ExecuteAsync(pMC, lBuilder.EmitCommandDetails(), lContext).ConfigureAwait(false);

                    if (lResult.ResultType == eCommandResultType.ok)
                    {
                        lContext.TraceInformation("listextended success");
                        return(lHook.MailboxHandles);
                    }

                    fCapabilities lTryIgnoring = 0;

                    if ((mMailboxCacheDataItems & fMailboxCacheDataItems.specialuse) != 0 && _Capabilities.SpecialUse)
                    {
                        lTryIgnoring |= fCapabilities.specialuse;
                    }
                    if (pStatus)
                    {
                        lTryIgnoring |= fCapabilities.liststatus;
                    }
                    if (lTryIgnoring == 0)
                    {
                        lTryIgnoring |= fCapabilities.listextended;
                    }

                    if (lResult.ResultType == eCommandResultType.no)
                    {
                        throw new cUnsuccessfulCompletionException(lResult.ResponseText, lTryIgnoring, lContext);
                    }
                    throw new cProtocolErrorException(lResult, lTryIgnoring, lContext);
                }
            }
Esempio n. 5
0
 internal cUnsuccessfulCompletionException(cResponseText pResponseText, fCapabilities pTryIgnoring, cTrace.cContext pContext)
 {
     ResponseText = pResponseText;
     TryIgnoring  = pTryIgnoring;
     pContext.TraceError("{0}: {1}", nameof(cUnsuccessfulCompletionException), pResponseText);
 }
Esempio n. 6
0
 internal cUnexpectedServerActionException(fCapabilities pTryIgnoring, string pMessage, cTrace.cContext pContext) : base(pMessage)
 {
     TryIgnoring = pTryIgnoring;
     pContext.TraceError("{0}: {1}", nameof(cUnexpectedServerActionException), pMessage);
 }
Esempio n. 7
0
 internal cUnexpectedServerActionException(string pMessage) : base(pMessage)
 {
     TryIgnoring = 0;
 }
Esempio n. 8
0
 internal cProtocolErrorException(cCommandResult pCommandResult, fCapabilities pTryIgnoring, cTrace.cContext pContext)
 {
     CommandResult = pCommandResult;
     TryIgnoring   = pTryIgnoring;
     pContext.TraceError("{0}: {1}", nameof(cProtocolErrorException), pCommandResult);
 }