diff -r 30e048a7b597 -r bad0cc58d154 eapol/eapol_framework/eapol_symbian/eap_server/src/EapSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eapol/eapol_framework/eapol_symbian/eap_server/src/EapSession.cpp Tue Aug 31 15:16:37 2010 +0300 @@ -0,0 +1,542 @@ +/* +* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: EAP-session inside EAP-server. +* +*/ + +/* +* %version: 32 % +*/ + + +#define __REFERENCE_CAPABILITY_NAMES__ +#define __INCLUDE_CAPABILITY_NAMES__ + +#include "EapSession.h" +#include "EapServerStrings.h" +#include "EapServer.h" +#include "EapServerProcessHandler.h" +#include "EapServerClientDef.h" +#include "abs_eap_am_tools.h" +#include "EapTraceSymbian.h" + +#include "eap_automatic_variable.h" + +/* + CEapSession +*/ + +const TInt KMaxMessageLength = 1000000; + +// ----------------------------------------------------------------------------------------- + +// construct/destruct + +CEapSession::CEapSession() +: iReceiveActive(EFalse) +, iEapProcessHandler(0) +, iTools(0) + { + EAP_TRACE_DEBUG_SYMBIAN((_L("CEapSession::CEapSession(): this=0x%08x"), + this)); + + EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapSession::CEapSession()")); + + } + +// ----------------------------------------------------------------------------------------- + +void CEapSession::ConstructL(CEapServer& /* aServer */, abs_eap_am_tools_c * const tools) + { + EAP_TRACE_DEBUG( + tools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ConstructL(): this=0x%08x\n"), + this)); + EAP_TRACE_RETURN_STRING(tools, "returns: CEapSession::ConstructL()"); + + iTools = tools; + + iEapProcessHandler = CEapServerProcessHandler::NewL(); + iEapProcessHandler->ConstructL(this, iTools); + CActiveScheduler::Add(iEapProcessHandler); + } + +// ----------------------------------------------------------------------------------------- + +CEapSession::~CEapSession() + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::~CEapSession(): this=0x%08x\n"), + this)); + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::~CEapSession()"); + + // cancel any receive + CancelReceive(); + if (iEapProcessHandler != 0) + { + delete iEapProcessHandler; + iEapProcessHandler = 0; + } + // decrement session count, so server may terminate if no longer needed + Server()->DecrementSessions(); + } + +// ----------------------------------------------------------------------------------------- + +CEapServer* CEapSession::Server() const + /** + Return the EAP-server. + + This deliberately hides the ugly casts around the code. + */ + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::Server(): this=0x%08x\n"), + this)); + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::Server()"); + + return const_cast(static_cast(CSession2::Server())); + } + +// ----------------------------------------------------------------------------------------- + +void CEapSession::CheckCapabilityL( + const RMessage2& aMessage, + const TBool aMustHaveCapabilityWhenTrue, + const TCapability aCapability, + const char *aDiagnostic) +{ + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::CheckCapabilityL(): this=0x%08x: aMessage.Function()=%d=%s\n"), + this, + aMessage.Function(), + EapServerStrings::GetEapRequestsString(aMessage.Function()))); + + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::CheckCapabilityL()"); + + if (aMustHaveCapabilityWhenTrue != aMessage.HasCapability(aCapability, aDiagnostic)) + { + // Capability check failed. + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("ERROR: CEapSession::CheckCapability(): aMessage.Function()=%d=%s, failed capability check: %d=%s, %s\n"), + aMessage.Function(), + EapServerStrings::GetEapRequestsString(aMessage.Function()), + aCapability, + CapabilityNames[aCapability], + aDiagnostic)); + Server()->PanicClient(EBadRequest); + User::Leave(EBadRequest); + } + else + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::CheckCapability(): aMessage.Function()=%d=%s, OK capability check: %d=%s\n"), + aMessage.Function(), + EapServerStrings::GetEapRequestsString(aMessage.Function()), + aCapability, + CapabilityNames[aCapability])); + } +} + +// ----------------------------------------------------------------------------------------- + +// service dispatcher - from CSharableSession + +void CEapSession::ServiceL(const RMessage2& aMessage) + { + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("-start--------------------------------------------------------------------\n"))); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): this=0x%08x: starts, aMessage.Function()=%d=%s\n"), + this, + aMessage.Function(), + EapServerStrings::GetEapRequestsString(aMessage.Function()))); + + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::ServiceL()"); + + + { +#if 0 + // Add this later. + CheckCapabilityL( + aMessage, + ETrue, + ECapabilityNetworkControl, + "EAP-SERVER: Missing ECapabilityNetworkControl"); +#endif + + CheckCapabilityL( + aMessage, + ETrue, + ECapabilityReadDeviceData, + "EAP-SERVER: Missing ECapabilityReadDeviceData"); + + CheckCapabilityL( + aMessage, + ETrue, + ECapabilityWriteDeviceData, + "EAP-SERVER: Missing ECapabilityWriteDeviceData"); + } + + + if (aMessage.Function() == EEapIfCancelReceive) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): aMessage.Function()=%d=%s, calls CancelReceive()\n"), + aMessage.Function(), + EapServerStrings::GetEapRequestsString(aMessage.Function()))); + CancelReceive(); + return; + } + + // length of passed descriptor (1st parameter passed from client) + TInt deslen = aMessage.GetDesLength(0); + + if (deslen > KMaxMessageLength) + { + Server()->PanicClient(EBadRequest); + return; + } + + // Passed data will be saved in this descriptor. + RBuf8 buffer; + + // Max length set to the value of "deslen", but current length is zero + buffer.CreateL(deslen); + + // Do the right cleanup if anything subsequently goes wrong + buffer.CleanupClosePushL(); + + // Copy the client's descriptor data into our buffer. + aMessage.ReadL(0,buffer,0); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): calls buffer.Length()\n"))); + + TUint aLength = buffer.Length(); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): calls buffer.Ptr(): aLength=%d\n"), + aLength)); + + const void * aData = buffer.Ptr(); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): aData=0x%08x, aLength=%d\n"), + aData, + aLength)); + + EAP_TRACE_DATA_DEBUG( + iTools, + EAP_TRACE_FLAGS_NEVER, + (EAPL("CEapSession::ServiceL()"), + aData, + aLength)); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): switch aMessage.Function()=%d=%s, iEapProcessHandler=0x%08x\n"), + aMessage.Function(), + EapServerStrings::GetEapRequestsString(aMessage.Function()), + iEapProcessHandler)); + + + switch (aMessage.Function()) + { + case EEapCoreIfNew: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapCoreIfNew\n"))); + ReceiveAll(); + iEapProcessHandler->SaveMessage(EEapCoreIfNew, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EEapPluginNew: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapPluginNew\n"))); + iEapProcessHandler->SaveMessage(EEapPluginNew, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EEapSettingsNew: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapSettingsNew\n"))); + iEapProcessHandler->SaveMessage(EEapSettingsNew, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EEapPacStoreNew: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapPacStoreNew\n"))); + iEapProcessHandler->SaveMessage(EEapPacStoreNew, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EWapiCoreIfNew: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EWapiCoreIfNew\n"))); + ReceiveAll(); + iEapProcessHandler->SaveMessage(EWapiCoreIfNew, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EWapiSettingsNew: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EWapiSettingsNew\n"))); + ReceiveAll(); + iEapProcessHandler->SaveMessage(EWapiSettingsNew, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EEapCoreProcessData: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapCoreProcessData\n"))); + // Read message + iEapProcessHandler->SaveMessage(EEapCoreProcessData, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EEapPluginProcessData: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapPluginProcessData\n"))); + iEapProcessHandler->SaveMessage(EEapPluginProcessData, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EEapSettingsProcessData: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapSettingsProcessData\n"))); + iEapProcessHandler->SaveMessage(EEapSettingsProcessData, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EEapPacStoreProcessData: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapPacStoreProcessData\n"))); + iEapProcessHandler->SaveMessage(EEapPacStoreProcessData, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EWapiCoreProcessData: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EWapiCoreProcessData\n"))); + iEapProcessHandler->SaveMessage(EWapiCoreProcessData, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EWapiSettingsProcessData: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EWapiSettingsProcessData\n"))); + iEapProcessHandler->SaveMessage(EWapiSettingsProcessData, aData, aLength); + aMessage.Complete(KErrNone); + break; + case EEapIfReqReceive: // TAny& aBuffer - async + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapIfReqReceive\n"))); + __ASSERT_DEBUG(!iReceiveActive, Server()->PanicClient(EReceiveReceiveAlreadyActive)); + // remember receive request + iReceiveMessage = aMessage; + iReceiveActive=ETrue; + iEapProcessHandler->Activate(); + break; + case EEapIfCancelReceive: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): EEapIfCancelReceive\n"))); + CancelReceive(); + break; + default: + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("ERROR: CEapSession::ServiceL(): unknown aMessage.Function()=%d=%s, calls Server()->PanicClient()\n"), + aMessage.Function(), + EapServerStrings::GetEapRequestsString(aMessage.Function()))); + + Server()->PanicClient(EBadRequest); + }; + + CleanupStack::PopAndDestroy(&buffer); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ServiceL(): ends aMessage.Function()=%d=%s\n"), + aMessage.Function(), + EapServerStrings::GetEapRequestsString(aMessage.Function()))); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("-end----------------------------------------------------------------------\n"))); + } + +// ----------------------------------------------------------------------------------------- + +void CEapSession::ReceiveAll() + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::ReceiveAll(): this=0x%08x\n"), + this)); + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::ReceiveAll()"); + + } + +// ----------------------------------------------------------------------------------------- + +void CEapSession::Receive(RMessage2& aBuffer) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::Receive(): this=0x%08x\n"), + this)); + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::Receive()"); + + __ASSERT_DEBUG(!iReceiveActive,Server()->PanicClient(EReceiveReceiveAlreadyActive)); + + // remember receive request + iReceiveMessage = aBuffer; + iReceiveActive=ETrue; + } + +// ----------------------------------------------------------------------------------------- + +void CEapSession::CancelReceive() + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::CancelReceive(): this=0x%08x\n"), + this)); + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::CancelReceive()"); + + if (!iReceiveActive) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::CancelReceive(): No receive active\n"))); + return; + } + + iReceiveMessage.Complete(KErrCancel); + iReceiveActive=EFalse; + } + +// ----------------------------------------------------------------------------------------- + +TBool CEapSession::GetReceiveActive() +{ + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::GetReceiveActive(): this=0x%08x: iReceiveActive=%d\n"), + this, + iReceiveActive)); + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::GetReceiveActive()"); + + return iReceiveActive; +} + +// ----------------------------------------------------------------------------------------- + +eap_status_e CEapSession::SendData(EapMessageBuffer * const message) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::SendData(): this=0x%08x: message->GetRequestType()=%d=%s, message->GetData()->Length()=%d\n"), + this, + message->GetRequestType(), + EapServerStrings::GetEapRequestsString(message->GetRequestType()), + message->GetData()->Length())); + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapSession::SendData()"); + + if (!iReceiveActive) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::SendData(): No receive active\n"))); + return EAP_STATUS_RETURN(iTools, iTools->convert_am_error_to_eapol_error(KErrCancel)); + } + + TInt error(KErrNone); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::SendData(): calls iReceiveMessage.Write()\n"))); + + error = iReceiveMessage.Write(0, message->GetData()->Des()); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapSession::SendData(): calls iReceiveMessage.Complete(): Write() error=%d\n"), + error)); + + iReceiveMessage.Complete(KErrNone); + iReceiveActive=EFalse; + + return EAP_STATUS_RETURN(iTools, iTools->convert_am_error_to_eapol_error(error)); + } + +// ----------------------------------------------------------------------------------------- +// end