diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/TokenServer/ClientSrc/ftokenclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/TokenServer/ClientSrc/ftokenclient.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,131 @@ +/* +* Copyright (c) 2006 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: Client interface for granting other processes to token to access +* particular files in app directory +* +*/ + + + +#include "alf/ftokenclient.h" +#include "ftokenconsts.h" + +EXPORT_C TInt RFTokenClient::Connect() + { + TInt err = KErrNone; + TFindServer serveFinder(FTOKEN_SERVER_NAME); + TFullName fullName; + if (serveFinder.Next(fullName) != KErrNone) + { + const TUidType serverUid(KNullUid,KNullUid,KServerUid3); + + RProcess server; + err = server.Create(_L("Z:\\sys\\bin\\!ftokenserver.exe"),FTOKEN_SERVER_NAME,serverUid); + if (!err) + { + TRequestStatus stat; + server.Rendezvous(stat); + if (stat!=KRequestPending) + { + server.Kill(0); // abort startup + } + else + { + server.Resume(); // logon OK - start the server + } + User::WaitForRequest(stat); // wait for start or death + err = stat.Int(); + } + } + + if ( !err ) + { + err = CreateSession(FTOKEN_SERVER_NAME,TVersion(1,1,1)); + } + + return err; + } + +EXPORT_C TInt RFTokenClient::GenerateToken(const TDesC& aFileName, const TUid& aConsumerUid, TDes8& aToken) const + { + TSecureId consumerUid(aConsumerUid); + return GenerateToken(aFileName, TSecurityPolicy(consumerUid), aToken); + } + +EXPORT_C TInt RFTokenClient::GenerateToken(const TDesC& aFileName, const TSecurityPolicy& aSecurityPolicy, TDes8& aToken) const + { + // unefficient, but this way we can make _easily_ sure that client is actually allowed to open a file + // Not sure if we were allowed to just change CEikonEnv's file server session to shared, so we could acutally save + // this extra session.. + RFs fs; + TInt err = fs.Connect(); + if (!err) + { + err = fs.ShareProtected(); + if (!err) + { + RFile file; + err = file.Open(fs, aFileName, EFileShareReadersOnly); // Todo: check the correct mode + if (!err) + { + err = GenerateToken(file, aSecurityPolicy, aToken); + } + file.Close(); + } + fs.Close(); + } + + return err; + //return SendReceive(EGenerateTokenBasedOnName, TIpcArgs(&aFileName, aAllowedProcessUid.iUid, &aToken)); + } + +EXPORT_C TInt RFTokenClient::GenerateToken(const RFile& aOpenFile, const TUid& aConsumerUid,TDes8& aToken) const + { + TSecureId consumerUid(aConsumerUid); + return GenerateToken(aOpenFile, TSecurityPolicy(consumerUid), aToken); + } + +EXPORT_C TInt RFTokenClient::GenerateToken(const RFile& aOpenFile, const TSecurityPolicy& aSecurityPolicy,TDes8& aToken) const + { + TPtrC8 ptr = aSecurityPolicy.Package(); + TIpcArgs ipcArgs(&ptr, &aToken, 0, 0); + TInt ret = aOpenFile.TransferToServer(ipcArgs, 2, 3); + if (ret == KErrNone) + { + ret = SendReceive(EGenerateTokenBasedOnOpenHandle, ipcArgs); + } + return ret; + } + +EXPORT_C TInt RFTokenClient::GenerateToken(const TDesC8& aExistingToken, const TUid& aConsumerUid,TDes8& aToken) const + { + TSecureId consumerUid(aConsumerUid); + return GenerateToken(aExistingToken, TSecurityPolicy(consumerUid), aToken); + } + +EXPORT_C TInt RFTokenClient::GenerateToken(const TDesC8& aExistingToken, const TSecurityPolicy& aSecurityPolicy,TDes8& aToken) const + { + TPtrC8 ptr = aSecurityPolicy.Package(); + return SendReceive(EGenerateTokenBasedOnAnotherToken, TIpcArgs(&ptr, &aExistingToken, &aToken)); + } + +EXPORT_C TInt RFTokenClient::OpenFileForToken(RFile& aHandle, const TDesC8& aToken) const + { + TInt serverhandle = 0; + TPckg buf(serverhandle); + TInt rfsHandle = SendReceive(EOpenHandleForToken, TIpcArgs(&buf, &aToken)); + return aHandle.AdoptFromServer(rfsHandle, serverhandle); + } + +// end of file