diff -r 000000000000 -r af10295192d8 linklayerprotocols/pppnif/SPPP/PPPPAP.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linklayerprotocols/pppnif/SPPP/PPPPAP.CPP Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,229 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Protocol (PAP) - RFC 1334. +// +// + +/** + @file + @brief Source file for the implementation of Password Authentication + @internalComponent +*/ + +#include "ppppap.h" +#include "PppProg.h" +#include "PPPAUTH.H" +#include "PPPConfig.h" + + +// +CPppPap::CPppPap() + { + } + +CPppPap::~CPppPap() + { + if (iPppLcp != 0) + TimerDelete(); + } + +void CPppPap::InitL(CPppLcp* aLcp) + { + CPppAuthentication::InitL(aLcp); + TimerConstructL(KPppFsmTimerPriority); + Register(); + } + +void CPppPap::AuthenticateComplete(TInt aStatus) + { + ASSERT(iPppLcp != 0); + + if (aStatus==KErrNone) + { + //ignore Error, if fails it will time out + //and try again anyway. + TRAP_IGNORE(SendAuthRequestL(ETrue)); + } + else + DoFail(aStatus); + } + +void CPppPap::LowerLayerUp() + { + ASSERT(iPppLcp != 0); + + if (iFlags & KPppApIsClient) + { + if (IsAuthenticateRequestDone()) + { + //ignore Error, if fails it will time out + //and try again anyway. + TRAP_IGNORE(SendAuthRequestL(ETrue)); + } + else + AuthenticateRequest(); + } + } + +void CPppPap::LowerLayerDown(TInt /*aStatus*/) + { + ASSERT(iPppLcp != 0); + + TimerCancel(); + } + +void CPppPap::TimerComplete(TInt /*aStatus*/) + { + ASSERT(iPppLcp != 0); + + if (iTryCount>0) + { + //ignore Error, if fails it will time out + //and try again anyway. + TRAP_IGNORE(SendAuthRequestL()); + } + } + +void CPppPap::SendAuthRequestL(TBool aNewRequest) + { + const CCredentialsConfig* credentials = iPppLcp->GetCredentials(); +#ifdef _UNICODE + const TDesC& username = credentials->GetUserName(); + HBufC8& user = *HBufC8::NewLC(username.Length()); + user.Des().Copy(username); + + const TDesC& password = credentials->GetPassword(); + HBufC8& pass = *HBufC8::NewLC(password.Length()); + pass.Des().Copy(password); +#else + TPtrC8 user(credentials->GetUserName()), pass(credentials->GetPassword()); +#endif + + RMBufPacket pkt; + RMBufPktInfo* info = NULL; + TInt len = 4+user.Length()+1+pass.Length()+1; + TRAPD(err, pkt.AllocL(len)); + if (err!=KErrNone) + return; + TRAP(err, info = pkt.NewInfoL()); + if (err!=KErrNone) + { + pkt.Free(); + return; + } + TUint8* ptr = pkt.First()->Ptr(); + *ptr++ = KPppPapRequest; + if (aNewRequest) + { + iTryCount = KPppPapRetries; + if (++iCurrentId==0) + ++iCurrentId; + } + *ptr++ = iCurrentId; + BigEndian::Put16(ptr, (TUint16)len); + ptr += 2; + *ptr++ = (TUint8)user.Length(); + Mem::Copy(ptr, (TUint8*)user.Ptr(), user.Length()); + ptr += user.Length(); + *ptr++ = (TUint8)pass.Length(); + Mem::Copy(ptr, (TUint8*)pass.Ptr(), pass.Length()); + ptr += pass.Length(); + info->iLength = len; + TPppAddr::Cast((info->iDstAddr)).SetProtocol(iPppId); + pkt.Pack(); + SendFrame(pkt); + TimerCancel(); + TimerAfter(KPppPapWaitTime*1000); + --iTryCount; + +#ifdef _UNICODE + CleanupStack::PopAndDestroy(&pass); + CleanupStack::PopAndDestroy(&user); +#endif + } + + +TBool CPppPap::RecvFrame(RMBufChain& aPacket) + { + ASSERT(iPppLcp != 0); + + RMBufPacket pkt; + pkt.Assign(aPacket); + pkt.Unpack(); + RMBufPktInfo* info = pkt.Info(); + + TUint8 op; + TUint8 id; + TInt len; + + if (IsInactive()) + { + pkt.Free(); + return EFalse; + } + + // Extract and drop LCP header + pkt.Align(4); + TUint8* ptr = pkt.First()->Ptr(); + op = *ptr++; + id = *ptr++; + len = BigEndian::Get16(ptr); + + // Check packet length is OK + if (info->iLengthiLength>len) + pkt.TrimEnd(len); + + pkt.TrimStart(4); + + switch (op) + { + case KPppPapRequest: + { + TInt n; + TPtrC8 user; + TPtrC8 pass; + n = *ptr++; + user.Set(ptr, n); ptr += n; + n = *ptr++; + pass.Set(ptr, n); ptr += n; + } + case KPppPapAck: + if (id==iCurrentId) + { + TimerCancel(); + DoSucceed(); + if(iPppLcp->CallbackEnabled() && iPppLcp->CallbackRequestType() != ECallbackIETFRequestTypeMSCBCP) + { + iPppLcp->CallbackGrantedAndAuthenticated(); + iPppLcp->TerminateLink(MNifIfNotify::ECallBack); // all done, shut it all down + } + } + break; + case KPppPapNak: + if (id==iCurrentId) + { + TimerCancel(); + DoFail(KErrIfAuthenticationFailure); + } + break; + } + pkt.Free(); + return EFalse; + }