sl@0: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: //system includes sl@0: #include sl@0: #include sl@0: sl@0: //class signature sl@0: #include "clientrequest.h" sl@0: sl@0: #ifndef __ECOMSERVER_TESTING__ sl@0: sl@0: // sl@0: // TClientRequest sl@0: // sl@0: TClientRequest::TClientRequest(const RMessage2& aMessage) sl@0: : iMessage(aMessage), iSecurityInfo(aMessage) sl@0: { sl@0: } sl@0: sl@0: TBool TClientRequest::IsNull() const sl@0: { sl@0: return iMessage.IsNull(); sl@0: } sl@0: sl@0: TInt TClientRequest::Function() const sl@0: { sl@0: return iMessage.Function(); sl@0: } sl@0: sl@0: void TClientRequest::Complete(TInt aReason) const sl@0: { sl@0: iMessage.Complete(aReason); sl@0: } sl@0: sl@0: void TClientRequest::Panic(const TDesC& aCategory, TInt aReason) const sl@0: { sl@0: iMessage.Panic(aCategory, aReason); sl@0: } sl@0: sl@0: TInt TClientRequest::Int0() const sl@0: { sl@0: return iMessage.Int0(); sl@0: } sl@0: sl@0: TInt TClientRequest::Int1() const sl@0: { sl@0: return iMessage.Int1(); sl@0: } sl@0: sl@0: TInt TClientRequest::Int2() const sl@0: { sl@0: return iMessage.Int2(); sl@0: } sl@0: sl@0: TInt TClientRequest::Int3() const sl@0: { sl@0: return iMessage.Int3(); sl@0: } sl@0: sl@0: TInt TClientRequest::GetDesLength(TInt aParam) const sl@0: { sl@0: return iMessage.GetDesLength(aParam); sl@0: } sl@0: sl@0: TInt TClientRequest::GetDesMaxLength(TInt aParam) const sl@0: { sl@0: return iMessage.GetDesMaxLength(aParam); sl@0: } sl@0: sl@0: void TClientRequest::ReadL(TInt aParam, TDes8& aDes, TInt aOffset) const sl@0: { sl@0: iMessage.ReadL(aParam, aDes, aOffset); sl@0: } sl@0: sl@0: void TClientRequest::ReadL(TInt aParam, TDes& aDes, TInt aOffset) const sl@0: { sl@0: iMessage.ReadL(aParam, aDes, aOffset); sl@0: } sl@0: sl@0: TInt TClientRequest::Write(TInt aParam, const TDesC8& aDes, TInt aOffset) const sl@0: { sl@0: return iMessage.Write(aParam, aDes, aOffset); sl@0: } sl@0: sl@0: void TClientRequest::WriteL(TInt aParam, const TDesC8& aDes) const sl@0: { sl@0: iMessage.WriteL(aParam, aDes); sl@0: } sl@0: sl@0: void TClientRequest::WriteL(TInt aParam, const TDesC& aDes, TInt aOffset) const sl@0: { sl@0: iMessage.WriteL(aParam, aDes, aOffset); sl@0: } sl@0: sl@0: // sl@0: // TCapabilitySet is the low level API used by all other capability APIs. sl@0: // It relies on the caller to observe the PlatSecEnforcement settings. sl@0: // sl@0: TBool TClientRequest::HasCapabilities(const TCapabilitySet& aCapabilities) const sl@0: { sl@0: return aCapabilities.HasCapabilities(iSecurityInfo.iCaps); sl@0: } sl@0: sl@0: #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ sl@0: // sl@0: // This method relies on PlatSec::CapabilityCheckFail sl@0: // to observe the PlatSecDiagnostics flag. sl@0: // sl@0: void TClientRequest::EmitDiagnostic(const TCapabilitySet& aCapabilities, const CImplementationInformation& aImplInfo) const sl@0: { sl@0: TCapabilitySet capsMissing(iSecurityInfo.iCaps); sl@0: capsMissing.Remove(aCapabilities); sl@0: _LIT8(KErrorFormat, "ECOM: Client (%x) may not access plugin implementation (%x_v%d)"); sl@0: TBuf8<128> errorMsg; sl@0: errorMsg.Format(KErrorFormat, iSecurityInfo.iSecureId.iId, aImplInfo.ImplementationUid(), aImplInfo.Version()); sl@0: errorMsg.ZeroTerminate(); sl@0: PlatSec::CapabilityCheckFail( sl@0: iMessage, sl@0: capsMissing, sl@0: __PLATSEC_DIAGNOSTIC_STRING(reinterpret_cast(errorMsg.Ptr()))); sl@0: } sl@0: #endif sl@0: sl@0: // sl@0: // This method serves three purposes: sl@0: // 1. Perform capability check. sl@0: // 2. Emit diagnostic message (if capability check failed and __REMOVE_PLATSEC_DIAGNOSTICS__ is *not* defined.) sl@0: // 3. Observe the PlatSecEnforcement flag and return if capability check has failed. sl@0: // sl@0: // If enforcement is not enabled then the caller should proceed as though the original capability check in fact passed. sl@0: // If enforcement is enabled then the appropriate action for a failed capability check should happen. sl@0: // sl@0: // Two possible return values: sl@0: // 1. ETrue - if capability check passed OR PlatSecEnforcement is Off. sl@0: // 2. EFalse - if capability check failed AND PlatSecEnforcement is On. sl@0: // sl@0: TBool TClientRequest::CheckCapability(const TCapabilitySet& aCapabilities, const CImplementationInformation& sl@0: #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ sl@0: aImplInfo sl@0: #endif sl@0: ) const sl@0: { sl@0: TBool hasCapabilities = HasCapabilities(aCapabilities); sl@0: #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ sl@0: if (!hasCapabilities) sl@0: EmitDiagnostic(aCapabilities, aImplInfo); sl@0: #endif sl@0: return !hasCapabilities && PlatSec::ConfigSetting(PlatSec::EPlatSecEnforcement) ? EFalse : ETrue; sl@0: } sl@0: // sl@0: // sl@0: #else //IF _UNIT_TESTING_ sl@0: sl@0: TClientRequest::TClientRequest() sl@0: : iFunction(KMinTInt), iCapability(0U), iCompletion(KRequestPending), sl@0: iStatusActive(EFalse), iIdentity(KNullUid) sl@0: { sl@0: Mem::FillZ(&iParams, sizeof(TInt) * KMaxMessageArguments); sl@0: } sl@0: sl@0: TBool TClientRequest::IsNull() const sl@0: { sl@0: return iFunction == KMinTInt; sl@0: } sl@0: sl@0: TInt TClientRequest::Function() const sl@0: { sl@0: return iFunction; sl@0: } sl@0: sl@0: TUid TClientRequest::Identity() const sl@0: { sl@0: return iIdentity; sl@0: } sl@0: sl@0: void TClientRequest::Complete(TInt aReason) const sl@0: { sl@0: iCompletion = aReason; sl@0: if(iStatusActive) sl@0: { sl@0: TRequestStatus* stat = iStatus; sl@0: User::RequestComplete(stat, aReason); sl@0: } sl@0: } sl@0: sl@0: void TClientRequest::Panic(const TDesC& aCategory, TInt aReason) const sl@0: { sl@0: User::Panic(aCategory, aReason); sl@0: } sl@0: sl@0: TInt TClientRequest::Int0() const sl@0: { sl@0: return iParams[0]; sl@0: } sl@0: sl@0: TInt TClientRequest::Int1() const sl@0: { sl@0: return iParams[1]; sl@0: } sl@0: sl@0: TInt TClientRequest::Int2() const sl@0: { sl@0: return iParams[2]; sl@0: } sl@0: sl@0: TInt TClientRequest::Int3() const sl@0: { sl@0: return iParams[3]; sl@0: } sl@0: sl@0: TInt TClientRequest::GetDesLength(TInt aParam) const sl@0: { sl@0: const TDesC8* desPtr = (const TDesC8*)iParams[aParam]; sl@0: return desPtr->Length(); sl@0: } sl@0: sl@0: TInt TClientRequest::GetDesMaxLength(TInt aParam) const sl@0: { sl@0: const TDes8* desPtr = (const TDes8*)iParams[aParam]; sl@0: return desPtr->MaxLength(); sl@0: } sl@0: sl@0: void TClientRequest::ReadL(TInt aParam, TDes8& aDes, TInt aOffset) const sl@0: { sl@0: const TDesC8* desPtr = (const TDesC8*)iParams[aParam]; sl@0: aDes.Copy(desPtr->Mid(aOffset)); sl@0: } sl@0: sl@0: void TClientRequest::ReadL(TInt aParam, TDes& aDes, TInt aOffset) const sl@0: { sl@0: const TDesC* desPtr = (const TDesC*)iParams[aParam]; sl@0: aDes.Copy(desPtr->Mid(aOffset)); sl@0: } sl@0: sl@0: TInt TClientRequest::Write(TInt aParam, const TDesC8& aDes, TInt aOffset) const sl@0: { sl@0: TDes8* desPtr = (TDes8*)iParams[aParam]; sl@0: desPtr->Copy(aDes.Mid(aOffset)); sl@0: return KErrNone; sl@0: } sl@0: sl@0: void TClientRequest::WriteL(TInt aParam, const TDesC8& aDes) const sl@0: { sl@0: User::LeaveIfError(Write(aParam, aDes)); sl@0: } sl@0: sl@0: void TClientRequest::WriteL(TInt aParam, const TDesC& aDes, TInt aOffset) const sl@0: { sl@0: TDes* desPtr = (TDes*)iParams[aParam]; sl@0: desPtr->Copy(aDes.Mid(aOffset)); sl@0: } sl@0: sl@0: TBool TClientRequest::HasCapabilities(const TCapabilitySet& aCapabilities) const sl@0: //dummy function here for testing purpose sl@0: { sl@0: TCapabilitySet dummycaps; sl@0: dummycaps.SetEmpty(); sl@0: return aCapabilities.HasCapabilities(dummycaps); sl@0: } sl@0: sl@0: #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ sl@0: void TClientRequest::EmitDiagnostic(const TCapabilitySet& /*aCapabilities*/, const CImplementationInformation& /*aImplInfo*/) const sl@0: // do nothing sl@0: { sl@0: } sl@0: #endif sl@0: sl@0: TBool TClientRequest::CheckCapability(const TCapabilitySet& aCapabilities, const CImplementationInformation& /*aImplInfo*/) const sl@0: { sl@0: return HasCapabilities(aCapabilities); sl@0: } sl@0: #endif //__ECOMSERVER_TESTING__