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); } }
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); }
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; } }