diff -r 0ba996a9b75d -r 613943a21004 bluetoothengine/btnotif/btnotifsrv/src/btnotifconnectiontracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifconnectiontracker.cpp Tue Aug 31 15:25:10 2010 +0300 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2010 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: Bluetooth connection tracker and manager. +* +*/ + +#include "btnotifconnectiontracker.h" +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#include +#include + +#include "btnotifsession.h" +#include "btnotifclientserver.h" +#include "bluetoothtrace.h" +#include "btnotifsecuritymanager.h" + +/** Time window for determining if there are too many requests. */ +#ifndef __WINS__ +#define KDENYTHRESHOLD TTimeIntervalSeconds(3) +#else //__WINS__ +#define KDENYTHRESHOLD TTimeIntervalSeconds(5) +#endif //__WINS__ + + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor +// --------------------------------------------------------------------------- +// +CBTNotifConnectionTracker::CBTNotifConnectionTracker( CBTNotifServer* aServer ) +: iServer( aServer ) + { + } + + +// --------------------------------------------------------------------------- +// Symbian 2nd-phase constructor +// --------------------------------------------------------------------------- +// +void CBTNotifConnectionTracker::ConstructL() + { + BOstraceFunctionEntry0( DUMMY_DEVLIST ); + // Open a handle to the registry server + User::LeaveIfError( iBTRegistrySession.Connect() ); + // Open a handle to the socket server + User::LeaveIfError( iSockServ.Connect() ); + iPairingManager = CBTNotifSecurityManager::NewL(*this, iServer->DevRepository() ); + BOstraceFunctionExit0( DUMMY_DEVLIST ); + } + + +// --------------------------------------------------------------------------- +// NewL. +// --------------------------------------------------------------------------- +// +CBTNotifConnectionTracker* CBTNotifConnectionTracker::NewL( CBTNotifServer* aServer ) + { + CBTNotifConnectionTracker* self = new( ELeave ) CBTNotifConnectionTracker( aServer ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CBTNotifConnectionTracker::~CBTNotifConnectionTracker() + { + BOstraceFunctionEntry0( DUMMY_DEVLIST ); + iDeniedRequests.Close(); + delete iPairingManager; + iSockServ.Close(); + iBTRegistrySession.Close(); + BOstraceFunctionExit0( DUMMY_DEVLIST ); + } + +// --------------------------------------------------------------------------- +// Process notifier message related to pairing notifiers. +// --------------------------------------------------------------------------- +// +void CBTNotifConnectionTracker::HandleNotifierRequestL( const RMessage2& aMessage ) + { + BOstraceFunctionEntryExt ( DUMMY_LIST, this, aMessage.Function() ); + iPairingManager->HandleNotifierRequestL(aMessage); + BOstraceFunctionExit1( DUMMY_DEVLIST, this ); + } + +// --------------------------------------------------------------------------- +// Handle a request related to pairing. +// --------------------------------------------------------------------------- +// +void CBTNotifConnectionTracker::HandleBondingRequestL( const RMessage2& aMessage ) + { + BOstraceFunctionEntryExt ( DUMMY_LIST, this, aMessage.Function() ); + iPairingManager->HandleBondingRequestL(aMessage); + BOstraceFunctionExit1( DUMMY_DEVLIST, this ); + } + +// --------------------------------------------------------------------------- +// Check if this device has been denied a connection already before. +// Also check if a previous connection attempt has just been rejected. +// --------------------------------------------------------------------------- +// +TBool CBTNotifConnectionTracker::UpdateBlockingHistoryL( const CBTDevice* aDevice, + TBool aAccepted ) + { + BOstraceFunctionEntry0( DUMMY_DEVLIST ); + __ASSERT_ALWAYS( aDevice, PanicServer( EBTNotifPanicBadArgument ) ); + // Check the time since the previous event. + TBool result = RecordConnectionAttempts( aAccepted ); + TInt pos = iDeniedRequests.Find( aDevice->BDAddr() ); + if( !aAccepted ) + { + if( pos == KErrNotFound ) + { + // The user denied the request from a new device, record the device address. + if( aDevice->IsValidPaired() && aDevice->IsPaired() ) + //[MCL]: && iDevice->LinkKeyType() != ELinkKeyUnauthenticatedUpgradable ) + { + // Paired devices are allowed one time rejection without a prompt for blocking. + result = EFalse; + } + iDeniedRequests.AppendL( aDevice->BDAddr() ); + } + // Nothing needed here if the address is already in the array. + } + else if( pos > KErrNotFound ) + { + // The user accepted a request, and it was from a device he/she + // previously rejected. Clear the history for this device from the array. + iDeniedRequests.Remove( pos ); + } + BOstraceFunctionExit0( DUMMY_DEVLIST ); + return result; + } + +// --------------------------------------------------------------------------- +// Record and check the time between connection attempts. +// --------------------------------------------------------------------------- +// +TBool CBTNotifConnectionTracker::RecordConnectionAttempts( TBool aAccepted ) + { + BOstraceFunctionEntry1( DUMMY_DEVLIST, this ); + TBool result = ETrue; + TTime now( 0 ); + if( !aAccepted ) + { + now.UniversalTime(); + if( iLastReject ) + { + // Check the time between denied connections, that it does not go too fast. + TTimeIntervalSeconds prev( 0 ); + if( !now.SecondsFrom( TTime( iLastReject ), prev ) ) + { + if( prev <= KDENYTHRESHOLD ) + { + // We are getting the requests too fast. Present the user with + // an option to turn BT off. + //iServer->SettingsTracker()->SetPower( EFalse ); + result = EFalse; + } + } + } + } + // Record the current timestamp. + // It is reset in case the user accepted the request. + iLastReject = now.Int64(); + BOstraceFunctionExitExt( DUMMY_DEVLIST, this, result ); + return result; + } +