diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Server/src/CSipCSServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Server/src/CSipCSServer.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,187 @@ +// Copyright (c) 2004-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: +// Name : CSipCSServer.cpp +// Part of : SIPServerCore +// Version : SIP/3.0 +// + + + + +#include "sipclientserver.h" +#include "CSipCSServer.h" +#include "CSipServerCore.h" +#include "CSipCSSession.h" +#include "TSipCSPlatSecPolicy.h" + +// ----------------------------------------------------------------------------- +// CSipCSServer::NewL +// ----------------------------------------------------------------------------- +// +CSipCSServer* CSipCSServer::NewL(CSipServerCore& aServerCore) + { + CSipCSServer* self = CSipCSServer::NewLC(aServerCore); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::NewLC +// ----------------------------------------------------------------------------- +// +CSipCSServer* CSipCSServer::NewLC(CSipServerCore& aServerCore) + { + CSipCSServer* self = new(ELeave)CSipCSServer(EPriorityHigh,aServerCore); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::ConstructL +// ----------------------------------------------------------------------------- +// +void CSipCSServer::ConstructL() + { + StartL(KSipServerName); + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::CSipCSServer +// ----------------------------------------------------------------------------- +// +CSipCSServer::CSipCSServer(TInt aPriority, CSipServerCore& aServerCore) + : CPolicyServer(aPriority, TSipCSPlatSecPolicy), + iServerCore(aServerCore) + { + iSecurityInfo.SetToCurrentInfo(); + iSecurityInfo.iCaps.RemoveCapability(ECapabilityProtServ); + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::~CSipCSServer +// ----------------------------------------------------------------------------- +// +CSipCSServer::~CSipCSServer() + { + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::NewSessionL +// ----------------------------------------------------------------------------- +// +CSession2* CSipCSServer::NewSessionL(const TVersion &aVersion, + const RMessage2& /*aMessage*/) const + { + // check we're the right version + if (!User::QueryVersionSupported (TVersion (KSipServerMajorVersionNumber, + KSipServerMinorVersionNumber, + KSipServerBuildVersionNumber), + aVersion)) + { + User::Leave(KErrNotSupported); + } + return CSipCSSession::NewL(iServerCore); + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::ConnectionStateChangedL +// ----------------------------------------------------------------------------- +// +void CSipCSServer::ConnectionStateChangedL(TUint32 aIapId, + CSIPConnection::TState aState) + { + // inform all the sessions + iSessionIter.SetToFirst(); + CSipCSSession* session = 0; + for (CSession2* s=iSessionIter; s!=0; s=iSessionIter++) + { + session = static_cast(s); + session->ConnectionStateChangedL (aIapId,aState); + } + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::FindOwner +// ----------------------------------------------------------------------------- +// +MTransactionOwner* CSipCSServer::FindOwner(TUint32 aIapId, const TUid& aUid) + { + MTransactionOwner* transactionOwner = NULL; + iSessionIter.SetToFirst(); + CSipCSSession* session = 0; + for (CSession2* s=iSessionIter; s!=0 && !transactionOwner; s=iSessionIter++) + { + session = static_cast(s); + if (session->Uid() == aUid) + { + transactionOwner = &(session->FindOwner(aIapId)); + } + } + return transactionOwner; + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::RunError +// ----------------------------------------------------------------------------- +// +TInt CSipCSServer::RunError(TInt aError) + { + if (aError == KErrBadDescriptor) + { + // A bad descriptor error implies a badly programmed client, + // so panic it; otherwise report the error to the client + Message().Panic(KSipCSServerPanic, EBadDescriptor); + } + else + { + Message().Complete(aError); + } + // + // The leave will result in an early return from CServer::RunL(), skipping + // the call to request another message. So do that now in order to keep the + // server running. + ReStart(); + return KErrNone; // handled the error fully + } + +// ----------------------------------------------------------------------------- +// CSipCSServer::CustomSecurityCheckL +// ----------------------------------------------------------------------------- +// +CPolicyServer::TCustomResult CSipCSServer::CustomSecurityCheckL( + const RMessage2& aMsg, + TInt& /*aAction*/, + TSecurityInfo& /*aMissing*/) + { + // Profile server is allowed to set opts regardless of its capabilities + const TUint32 KProfileServerUidVal = 0x101F413C; + TUid clientUid = aMsg.SecureId(); + + if ( ( aMsg.Function() == ESipItcSetSIPSockOpt || + aMsg.Function() == ESipItcSetSIPSockOptWithDes ) && + clientUid.iUid != KProfileServerUidVal ) + { + TSecurityInfo clientSecurityInfo(aMsg); + TCapabilitySet sipServerCaps; + sipServerCaps.SetEmpty(); + sipServerCaps.Union(iSecurityInfo.iCaps); + sipServerCaps.RemoveCapability(ECapabilityReadUserData); // Maintain SC + if (!clientSecurityInfo.iCaps.HasCapabilities(sipServerCaps)) + { + return CPolicyServer::EFail; + } + } + return CPolicyServer::EPass; + }