Exemple #1
0
            public async Task <Exception> LoginAsync(cMethodControl pMC, cAccountId pAccountId, cLogin pLogin, cTrace.cContext pParentContext)
            {
                var lContext = pParentContext.NewMethod(nameof(cSession), nameof(LoginAsync), pMC, pAccountId);

                if (mDisposed)
                {
                    throw new ObjectDisposedException(nameof(cSession));
                }
                if (_ConnectionState != eConnectionState.notauthenticated)
                {
                    throw new InvalidOperationException(kInvalidOperationExceptionMessage.NotUnauthenticated);
                }

                using (var lBuilder = new cCommandDetailsBuilder())
                {
                    //  note the lack of locking - this is only called during connect

                    lBuilder.Add(kLoginCommandPartLogin, cCommandPartFactory.AsASCIILiteral(pLogin.UserId), cCommandPart.Space, cCommandPartFactory.AsASCIILiteral(pLogin.Password));

                    var lHook = new cCommandHookInitial();
                    lBuilder.Add(lHook);

                    var lCapabilities = mPipeline.Capabilities;

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

                    if (lResult.ResultType == eCommandResultType.ok)
                    {
                        lContext.TraceInformation("login success");
                        ZAuthenticated(lCapabilities, lHook, lResult.ResponseText, pAccountId, lContext);
                        return(null);
                    }

                    if (lHook.Capabilities != null)
                    {
                        lContext.TraceError("received capability on a failed login");
                    }

                    if (lResult.ResultType == eCommandResultType.no)
                    {
                        lContext.TraceInformation("login failed: {0}", lResult.ResponseText);

                        if (ZSetHomeServerReferral(lResult.ResponseText, lContext))
                        {
                            return(new cHomeServerReferralException(lResult.ResponseText, lContext));
                        }

                        if (lResult.ResponseText.Code == eResponseTextCode.authenticationfailed || lResult.ResponseText.Code == eResponseTextCode.authorizationfailed || lResult.ResponseText.Code == eResponseTextCode.expired)
                        {
                            return(new cCredentialsException(lResult.ResponseText, lContext));
                        }

                        return(null);
                    }

                    throw new cProtocolErrorException(lResult, 0, lContext);
                }
            }
Exemple #2
0
            private void ZAuthenticated(cStrings pOldPipelineCapabilities, cCommandHookInitial pHook, cResponseText pResponseText, cAccountId pAccountId, cTrace.cContext pParentContext)
            {
                var lContext = pParentContext.NewMethod(nameof(cSession), nameof(ZAuthenticated));

                if (pHook.Capabilities != null)
                {
                    ZSetCapabilities(pHook.Capabilities, pHook.AuthenticationMechanisms, lContext);
                }
                else if (!ReferenceEquals(pOldPipelineCapabilities, mPipeline.Capabilities))
                {
                    ZSetCapabilities(mPipeline.Capabilities, mPipeline.AuthenticationMechanisms, lContext);
                }

                ZSetHomeServerReferral(pResponseText, lContext);
                ZSetConnectedAccountId(pAccountId, lContext);
            }
Exemple #3
0
                public async Task <sGreeting> ConnectAsync(cMethodControl pMC, cServer pServer, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandPipeline), nameof(ConnectAsync), pMC, pServer);

                    if (mDisposed)
                    {
                        throw new ObjectDisposedException(nameof(cCommandPipeline));
                    }

                    if (mState != eState.notconnected)
                    {
                        throw new InvalidOperationException(kInvalidOperationExceptionMessage.NotUnconnected);
                    }
                    mState = eState.connecting;

                    try
                    {
                        await mConnection.ConnectAsync(pMC, pServer, lContext).ConfigureAwait(false);

                        using (var lAwaiter = new cAwaiter(pMC))
                        {
                            while (true)
                            {
                                lContext.TraceVerbose("waiting");
                                await lAwaiter.AwaitAny(mConnection.GetBuildResponseTask(lContext)).ConfigureAwait(false);

                                var lResponse = mConnection.GetResponse(lContext);
                                mSynchroniser.InvokeNetworkReceive(lResponse, lContext);
                                var lCursor = new cBytesCursor(lResponse);

                                if (lCursor.SkipBytes(kGreetingAsteriskSpaceOKSpace))
                                {
                                    var lHook = new cCommandHookInitial();

                                    cResponseText lResponseText = mResponseTextProcessor.Process(eResponseTextContext.greetingok, lCursor, lHook, lContext);
                                    lContext.TraceVerbose("got ok: {0}", lResponseText);

                                    mState          = eState.connected;
                                    mBackgroundTask = ZBackgroundTaskAsync(lContext);

                                    mCapabilities             = lHook.Capabilities;
                                    mAuthenticationMechanisms = lHook.AuthenticationMechanisms;

                                    return(new sGreeting(eGreetingType.ok, null));
                                }

                                if (lCursor.SkipBytes(kGreetingAsteriskSpacePreAuthSpace))
                                {
                                    var lHook = new cCommandHookInitial();

                                    cResponseText lResponseText = mResponseTextProcessor.Process(eResponseTextContext.greetingpreauth, lCursor, lHook, lContext);
                                    lContext.TraceVerbose("got preauth: {0}", lResponseText);

                                    mState          = eState.connected;
                                    mBackgroundTask = ZBackgroundTaskAsync(lContext);

                                    mCapabilities             = lHook.Capabilities;
                                    mAuthenticationMechanisms = lHook.AuthenticationMechanisms;

                                    return(new sGreeting(eGreetingType.preauth, lResponseText));
                                }

                                if (lCursor.SkipBytes(kGreetingAsteriskSpaceBYESpace))
                                {
                                    cResponseText lResponseText = mResponseTextProcessor.Process(eResponseTextContext.greetingbye, lCursor, null, lContext);
                                    lContext.TraceError("got bye: {0}", lResponseText);

                                    mConnection.Disconnect(lContext);

                                    mState = eState.stopped;
                                    return(new sGreeting(eGreetingType.bye, lResponseText));
                                }

                                lContext.TraceError("unrecognised response: {0}", lResponse);
                            }
                        }
                    }
                    catch (Exception)
                    {
                        mConnection.Disconnect(lContext);
                        mState = eState.stopped;
                        throw;
                    }
                }