sl@0: // Copyright (c) 2002-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 the License "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: #include sl@0: #include "t_property.h" sl@0: sl@0: TSecureId TestSecureId; sl@0: TVendorId TestVendorId; sl@0: TCapability TestCaps[ECapability_Limit]; sl@0: TCapability TestMissingCaps[ECapability_Limit]; sl@0: sl@0: TSecurityPolicy CorrectCapPolicy; sl@0: TSecurityPolicy IncorrectCapPolicy; sl@0: sl@0: TUint TestPolicyCount=0; sl@0: sl@0: #include sl@0: sl@0: TBool MakeTestSecurityPolicy() sl@0: { sl@0: TCapability* c =TestCaps; sl@0: TCapability* m =TestMissingCaps; sl@0: TUint t=++TestPolicyCount; sl@0: RDebug::Print(_L("Test policy %d\n"),t); sl@0: if(t==1) sl@0: { sl@0: _LIT_SECURITY_POLICY_PASS(KSecurityPolicyPass); sl@0: CorrectCapPolicy = KSecurityPolicyPass; sl@0: _LIT_SECURITY_POLICY_FAIL(KSecurityPolicyFail); sl@0: IncorrectCapPolicy = KSecurityPolicyFail; sl@0: return ETrue; sl@0: } sl@0: t -= 1; sl@0: if(t<7) sl@0: { sl@0: switch(t) sl@0: { sl@0: case 0: sl@0: CorrectCapPolicy = TSecurityPolicy(c[0]); sl@0: IncorrectCapPolicy = TSecurityPolicy(m[0]); sl@0: break; sl@0: case 1: sl@0: CorrectCapPolicy = TSecurityPolicy(c[0],c[1]); sl@0: IncorrectCapPolicy = TSecurityPolicy(m[0],c[1]); sl@0: break; sl@0: case 2: sl@0: CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2]); sl@0: IncorrectCapPolicy = TSecurityPolicy(c[0],m[1],c[2]); sl@0: break; sl@0: case 3: sl@0: CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3]); sl@0: IncorrectCapPolicy = TSecurityPolicy(c[0],c[1],m[2],c[3]); sl@0: break; sl@0: case 4: sl@0: CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],c[4]); sl@0: IncorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],m[3],c[4]); sl@0: break; sl@0: case 5: sl@0: CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],c[4],c[5]); sl@0: IncorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],m[4],c[5]); sl@0: break; sl@0: case 6: sl@0: CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],c[4],c[5],c[6]); sl@0: IncorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],c[4],m[5],c[6]); sl@0: break; sl@0: } sl@0: return ETrue; sl@0: } sl@0: t -= 7; sl@0: if(t<4) sl@0: { sl@0: TSecureId id = TestSecureId; sl@0: TSecureId id2 = TSecureId((TUint32)TestVendorId); sl@0: switch(t) sl@0: { sl@0: case 0: sl@0: CorrectCapPolicy = TSecurityPolicy(id); sl@0: IncorrectCapPolicy = TSecurityPolicy(id2); sl@0: break; sl@0: case 1: sl@0: CorrectCapPolicy = TSecurityPolicy(id,c[0]); sl@0: IncorrectCapPolicy = TSecurityPolicy(id2,c[0]); sl@0: break; sl@0: case 2: sl@0: CorrectCapPolicy = TSecurityPolicy(id,c[0],c[1]); sl@0: IncorrectCapPolicy = TSecurityPolicy(id2,c[0],c[1]); sl@0: break; sl@0: case 3: sl@0: CorrectCapPolicy = TSecurityPolicy(id,c[0],c[1],c[2]); sl@0: IncorrectCapPolicy = TSecurityPolicy(id2,c[0],c[1],c[2]); sl@0: break; sl@0: } sl@0: return ETrue; sl@0: } sl@0: t -= 4; sl@0: if(t<4) sl@0: { sl@0: TVendorId id = TestVendorId; sl@0: TVendorId id2 = TVendorId((TUint32)TestSecureId); sl@0: switch(t) sl@0: { sl@0: case 0: sl@0: CorrectCapPolicy = TSecurityPolicy(id); sl@0: IncorrectCapPolicy = TSecurityPolicy(id2); sl@0: break; sl@0: case 1: sl@0: CorrectCapPolicy = TSecurityPolicy(id,c[0]); sl@0: IncorrectCapPolicy = TSecurityPolicy(id2,c[0]); sl@0: break; sl@0: case 2: sl@0: CorrectCapPolicy = TSecurityPolicy(id,c[0],c[1]); sl@0: IncorrectCapPolicy = TSecurityPolicy(id2,c[0],c[1]); sl@0: break; sl@0: case 3: sl@0: CorrectCapPolicy = TSecurityPolicy(id,c[0],c[1],c[2]); sl@0: IncorrectCapPolicy = TSecurityPolicy(id2,c[0],c[1],c[2]); sl@0: break; sl@0: } sl@0: return ETrue; sl@0: } sl@0: t -= 4; sl@0: TestPolicyCount = 0; sl@0: return EFalse; sl@0: } sl@0: sl@0: _LIT(KSecurityReadCapabilityName, "RProperty Security: Read Capability Basics"); sl@0: sl@0: class CPropSecurityReadCapability : public CTestProgram sl@0: { sl@0: public: sl@0: CPropSecurityReadCapability(TUid aCategory, TUint aKey1, TUint aKey2, RProperty::TType aType) : sl@0: CTestProgram(KSecurityReadCapabilityName), iCategory(aCategory), iKey1(aKey1), iKey2(aKey2), iType(aType) sl@0: { sl@0: } sl@0: sl@0: void Run(TUint aCount); sl@0: sl@0: private: sl@0: TUid iCategory; sl@0: TUint iKey1; sl@0: TUint iKey2; sl@0: RProperty::TType iType; sl@0: }; sl@0: sl@0: void CPropSecurityReadCapability::Run(TUint aCount) sl@0: { sl@0: while(MakeTestSecurityPolicy()) sl@0: for (TUint i = 0; i < aCount; ++i) sl@0: { sl@0: RProperty prop1; sl@0: RProperty prop2; sl@0: sl@0: TInt r = prop1.Attach(iCategory, iKey1); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop2.Attach(iCategory, iKey2); sl@0: TF_ERROR(r, r == KErrNone); sl@0: sl@0: // If the property has not been defined, the request will not complete until the property sl@0: // is defined and published. sl@0: // When defined if the caller does not have read capabilities the request completes sl@0: // with KErrPermissionDenied. sl@0: TRequestStatus status1; sl@0: prop1.Subscribe(status1); sl@0: TF_ERROR(status1.Int(), status1.Int() == KRequestPending); sl@0: r = prop1.Define(iCategory, iKey1, iType, IncorrectCapPolicy, CorrectCapPolicy); sl@0: TF_ERROR(r, r == KErrNone); sl@0: User::WaitForRequest(status1); sl@0: TF_ERROR(status1.Int(), status1.Int() == KErrPermissionDenied); sl@0: sl@0: TRequestStatus status2; sl@0: prop2.Subscribe(status2); sl@0: TF_ERROR(status2.Int(), status2.Int() == KRequestPending); sl@0: r = prop2.Define(iCategory, iKey2, iType, CorrectCapPolicy, IncorrectCapPolicy); sl@0: TF_ERROR(r, r == KErrNone); sl@0: TF_ERROR(status2.Int(), status2.Int() == KRequestPending); sl@0: prop2.Cancel(); sl@0: User::WaitForRequest(status2); sl@0: TF_ERROR(status2.Int(), status2.Int() == KErrCancel); sl@0: sl@0: // If the Subscribe() caller does not have the read capabilities the request completes immediately sl@0: // with KErrPermissionDenied. sl@0: prop1.Subscribe(status1); sl@0: User::WaitForRequest(status1); sl@0: TF_ERROR(status1.Int(), status1.Int() == KErrPermissionDenied); sl@0: sl@0: prop2.Subscribe(status2); sl@0: TF_ERROR(status2.Int(), status2.Int() == KRequestPending); sl@0: prop2.Cancel(); sl@0: User::WaitForRequest(status2); sl@0: TF_ERROR(status2.Int(), status2.Int() == KErrCancel); sl@0: sl@0: // If the caller does not have the read capabilities Get() fails with KErrPermissionDenied. sl@0: if (iType == RProperty::EInt) sl@0: { sl@0: TInt value; sl@0: r = prop1.Get(iCategory, iKey1, value); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Get(iCategory, iKey2, value); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop1.Get(value); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Get(value); sl@0: TF_ERROR(r, r == KErrNone); sl@0: } sl@0: else sl@0: { sl@0: TBuf<16> buf; sl@0: TBuf8<16> buf8; sl@0: r = prop1.Get(iCategory, iKey1, buf); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Get(iCategory, iKey2, buf); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop1.Get(iCategory, iKey1, buf8); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Get(iCategory, iKey2, buf8); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop1.Get(buf); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Get(buf); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop1.Get(buf8); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Get(buf8); sl@0: TF_ERROR(r, r == KErrNone); sl@0: } sl@0: sl@0: r = prop1.Delete(iCategory, iKey1); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop2.Delete(iCategory, iKey2); sl@0: TF_ERROR(r, r == KErrNone); sl@0: prop1.Close(); sl@0: prop2.Close(); sl@0: } sl@0: } sl@0: sl@0: _LIT(KSecurityWriteCapabilityName, "RProperty Security: Write Cpability Basics"); sl@0: sl@0: class CPropSecurityWriteCapability : public CTestProgram sl@0: { sl@0: public: sl@0: CPropSecurityWriteCapability(TUid aCategory, TUint aKey1, TUint aKey2, RProperty::TType aType) : sl@0: CTestProgram(KSecurityWriteCapabilityName), iCategory(aCategory), iKey1(aKey1), iKey2(aKey2), iType(aType) sl@0: { sl@0: } sl@0: sl@0: void Run(TUint aCount); sl@0: sl@0: private: sl@0: TUid iCategory; sl@0: TUint iKey1; sl@0: TUint iKey2; sl@0: RProperty::TType iType; sl@0: }; sl@0: sl@0: void CPropSecurityWriteCapability::Run(TUint aCount) sl@0: { sl@0: while(MakeTestSecurityPolicy()) sl@0: for (TUint i = 0; i < aCount; ++i) sl@0: { sl@0: RProperty prop1; sl@0: RProperty prop2; sl@0: sl@0: TInt r = prop1.Attach(iCategory, iKey1); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop2.Attach(iCategory, iKey2); sl@0: TF_ERROR(r, r == KErrNone); sl@0: sl@0: r = prop1.Define(iCategory, iKey1, iType, CorrectCapPolicy, IncorrectCapPolicy); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop2.Define(iCategory, iKey2, iType, IncorrectCapPolicy, CorrectCapPolicy); sl@0: TF_ERROR(r, r == KErrNone); sl@0: sl@0: // If the caller does not have the write capabilities Set() fails with KErrPermissionDenied. sl@0: if (iType == RProperty::EInt) sl@0: { sl@0: TInt value = 1; sl@0: r = prop1.Set(iCategory, iKey1, value); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Set(iCategory, iKey2, value); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop1.Set(value); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Set(value); sl@0: TF_ERROR(r, r == KErrNone); sl@0: } sl@0: else sl@0: { sl@0: TBuf<16> buf(_L("Foo")); sl@0: TBuf8<16> buf8((TUint8*) "Foo"); sl@0: r = prop1.Set(iCategory, iKey1, buf); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Set(iCategory, iKey2, buf); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop1.Set(iCategory, iKey1, buf8); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Set(iCategory, iKey2, buf8); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop1.Set(buf); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Set(buf); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop1.Set(buf8); sl@0: TF_ERROR(r, r == KErrPermissionDenied); sl@0: r = prop2.Set(buf8); sl@0: TF_ERROR(r, r == KErrNone); sl@0: } sl@0: sl@0: r = prop1.Delete(iCategory, iKey1); sl@0: TF_ERROR(r, r == KErrNone); sl@0: r = prop2.Delete(iCategory, iKey2); sl@0: TF_ERROR(r, r == KErrNone); sl@0: prop1.Close(); sl@0: prop2.Close(); sl@0: } sl@0: } sl@0: sl@0: GLDEF_C TInt E32Main() sl@0: { sl@0: sl@0: TSecurityInfo info; sl@0: info.Set(RProcess()); sl@0: TestSecureId = info.iSecureId; sl@0: TestVendorId = info.iVendorId; sl@0: { sl@0: TInt c=0; sl@0: TInt m=0; sl@0: for(TInt i=0; i=7,User::Panic(_L("not enough caps"), 1)); sl@0: __ASSERT_ALWAYS(m>=6,User::Panic(_L("missing caps <6"), 1)); sl@0: } sl@0: sl@0: TInt len = User::CommandLineLength(); sl@0: __ASSERT_ALWAYS(len, User::Panic(_L("t_prop_sec: bad args"), 0)); sl@0: sl@0: // Get arguments for the command line sl@0: TInt size = len * sizeof(TUint16); sl@0: HBufC8* hb = HBufC8::NewMax(size); sl@0: __ASSERT_ALWAYS(hb, User::Panic(_L("t_prop_sec: no memory"), 0)); sl@0: TPtr cmd((TUint16*) hb->Ptr(), len); sl@0: User::CommandLine(cmd); sl@0: CPropSecurity::TArgs* args = (CPropSecurity::TArgs*) hb->Ptr(); sl@0: sl@0: CTestProgram::Start(); sl@0: sl@0: CTestProgram* progs[] = sl@0: { sl@0: new CPropSecurityReadCapability(args->iCategory, args->iSlaveKeySlot + 0, args->iSlaveKeySlot + 1, sl@0: RProperty::EInt), sl@0: new CPropSecurityReadCapability(args->iCategory, args->iSlaveKeySlot + 2, args->iSlaveKeySlot + 3, sl@0: RProperty::EByteArray), sl@0: new CPropSecurityWriteCapability(args->iCategory, args->iSlaveKeySlot + 4, args->iSlaveKeySlot + 5, sl@0: RProperty::EInt), sl@0: new CPropSecurityWriteCapability(args->iCategory, args->iSlaveKeySlot + 6, args->iSlaveKeySlot + 7, sl@0: RProperty::EByteArray), sl@0: NULL sl@0: }; sl@0: sl@0: TInt i; sl@0: TInt n = (sizeof(progs)/sizeof(*progs)) - 1; sl@0: for (i = 0; i < n; ++i) sl@0: { sl@0: __ASSERT_ALWAYS(progs[i], User::Panic(_L("t_property: no memory"), 0)); sl@0: } sl@0: sl@0: CTestProgram::LaunchGroup(progs, 2); sl@0: sl@0: for (i = 0; i < n; ++i) sl@0: { sl@0: delete progs[i]; sl@0: } sl@0: sl@0: CTestProgram::End(); sl@0: sl@0: return KErrNone; sl@0: }