uiacceltk/hitchcock/TokenServer/ClientSrc/ftokenclient.cpp
changeset 0 15bf7259bb7c
--- /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<TInt> buf(serverhandle);
+    TInt rfsHandle = SendReceive(EOpenHandleForToken, TIpcArgs(&buf, &aToken));
+    return aHandle.AdoptFromServer(rfsHandle, serverhandle);
+    }
+
+// end of file