natfw/natfwstunserver/inc/natfwstunsrvimpl.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwstunserver/inc/natfwstunsrvimpl.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,287 @@
+/*
+* Copyright (c) 2007-2008 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:    Implements functionality of NATFW STUN server client session
+*
+*/
+
+
+
+
+#ifndef NATFWSTUNSRVIMPL_H
+#define NATFWSTUNSRVIMPL_H
+
+#include <e32base.h>
+#include <in_sock.h>
+#include "natfwconnectivityapidefs.h"
+
+#include "mncmincomingconnectionobserver.h"
+
+#include "natfwunsaftransactionid.h"
+
+class MNATFWStunSrvObserver;
+class CNATFWCredentials;
+class CNATFWUNSAFMessage;
+class MNcmConnectionMultiplexer;
+
+/**
+ * Implementation class of NATFW STUN server.
+ *
+ * @lib stunserver.lib
+ * @since S60 v3.2
+ */                                                   
+NONSHARABLE_CLASS( CNATFWSTUNSrvImpl ) : public CBase, 
+    public MNcmIncomingConnectionObserver
+    {
+    
+    friend class ut_cnatfwstunsrvimpl;
+    
+public:
+    
+    /**
+     * Two-phased constructor.
+     * @param aObserver    A callback object to receive and handle
+     *                     event notifications from NAT FW STUN server.
+     * @param aObserver    Stun server observer
+     * @param aMultiplexer A multiplexer
+     */
+    static CNATFWSTUNSrvImpl* NewL( MNATFWStunSrvObserver& aObserver,
+        MNcmConnectionMultiplexer& aMultiplexer );
+
+    /**
+     * Destructor.
+     */
+    virtual ~CNATFWSTUNSrvImpl();
+
+    /**
+     * Adds authentication params which are used to authenticate
+     * incoming binding requests.
+     * 
+     * Notifies the client of STUN requests that are valid.
+     *  
+     * @since S60 3.2
+     * @param aIdentifications Identification array.
+     * @return void
+     */
+    void AddAuthenticationParamsL( 
+        const RPointerArray<CNATFWCredentials>& aIdentifications );
+     
+    /**
+     * Removes specified authentication params from STUN server.
+     *  
+     * @since S60 3.2
+     * @param aIdentifications Identification array.
+     * @return void
+     */
+    void RemoveAuthenticationParamsL( 
+        const RPointerArray<CNATFWCredentials>& aIdentifications );
+        
+    /**
+     * Sets role for an agent. 
+     *  
+     * @since S60 3.2
+     * @param aRole       Either controlling or controlled.  
+     * @param aTieBreaker Value for determining which agent will change
+     *                    Role if role conflict is present
+     * @return void
+     */             
+    void SetRoleL( TNATFWIceRole aRole, TUint64 aTieBreaker );
+
+// from base class MNcmIncomingConnectionObserver
+ 
+    void IncomingMessageL( TUint aStreamId, 
+        const TDesC8& aMessage, const TInetAddr& aLocalAddr, 
+        const TInetAddr& aFromAddr, const TInetAddr& aPeerRemoteAddress,
+        TBool& aConsumed );
+
+private: // Constructors
+
+    void ConstructL( MNcmConnectionMultiplexer& aMultiplexer );
+
+    CNATFWSTUNSrvImpl( MNATFWStunSrvObserver& aObserver );
+ 
+private: // private methods
+
+    /**
+     * Function that checks if role conflict is present between agents.
+     *
+     * @since S60 3.2   
+     * @param aRequest UNSAF message.    
+     * return ETrue if chosen role conflicts
+     *        EFalse if not 
+     */    
+    TBool IsRoleConflictPresent( const CNATFWUNSAFMessage& aRequest );
+        
+    /**
+     * Setting function for changing peer remote address.
+     * @since S60 3.2
+     * @param aFromAddr          Address the server saw in request.
+     * @param aPeerRemoteAddress Peer remote address.
+     * return void
+     */
+    void SetPeerRemoteAddress( const TInetAddr& aFromAddr,
+        TInetAddr& aPeerRemoteAddress) const;
+              
+    /**
+     * Decodes a byte stream and return the decoded UNSAF message.
+     *  
+     * @since S60 3.2
+     * @param aData Incoming message data.
+     * @return Decoded message, ownership is transferred.
+     *         NULL if the stream didn't contain an UNSAF message.
+     * @return One of the standard system-wide error codes.
+     */    
+    CNATFWUNSAFMessage* DecodeMessageL( const TDesC8& aData ) const;
+    
+    /**
+     * Encodes an UNSAF message.
+     *
+     * @since S60 3.2
+     * @param aRequest   UNSAF message.
+     * @param aPassword  Key for checking the message integrity.
+     * @param aErrorCode Error code.
+     * @return
+     */
+    HBufC8* EncodeMessageL( const CNATFWUNSAFMessage& aRequest, 
+        const TDesC8& aPassword, const TInt aErrorCode ) const;
+
+    /**
+     * Validates the request. Authenticate and check message integrity.
+     * Sends binding response if everything goes right and error response
+     * if there is missing argument or message integrity check fails.
+     *  
+     * @since S60 3.2
+     * @param aRequest    UNSAF message.
+     * @param aByteStream Same UNSAF message as aRequest, but in undecoded
+     *                    format.
+     * @return ETrue if needed attributes are present in binding request.
+     *         EFalse if any needed attribute is missing.
+     */
+    TBool IsRequestValidL( const CNATFWUNSAFMessage& aRequest,
+                           const TDesC8& aByteStream );
+    
+    /**
+     * Verifies the integrity of a Binding Request.
+     *  
+     * @since S60 3.2
+     * @param aRequest    UNSAF message.
+     * @param aByteStream Same message as aRequest, but in undecoded format
+     * @param aPassword   Key for checking the message integrity.
+     * @return ETrue If integrity check succeeded.
+     *         EFalse Integrity check fails.
+     */    
+    TBool CheckIntegrityL( const CNATFWUNSAFMessage& aRequest,
+                           const TDesC8& aByteStream,
+                           const TDesC8& aPassword );
+
+    /**
+     * Finds the credential which match for the given username and
+     * returns the password.
+     *  
+     * @since S60 3.2
+     * @param aRequest The received UNSAF message.
+     * @param aError Returns error code via reference 
+     * @return Password NUll if password not found.
+     */                                     
+    HBufC8* GetPassword( const CNATFWUNSAFMessage& aRequest, TInt& aError );
+    
+    /**
+     * Creates and sends binding response or binding error response.
+     *  
+     * @since S60 3.2
+     * @param aRequest   The received UNSAF message.
+     * @param aErrorCode Error code.
+     * @param aPassword  Password is used to calculate message integrity.
+     * @return void
+     */
+    void SendResponseL( const CNATFWUNSAFMessage& aRequest, TInt aErrorCode, 
+                        const TDesC8& aPassword );
+    
+    TBool IsRetransmittedRequest( const CNATFWUNSAFMessage& aRequest ) const;
+    
+    void SaveTransactionIdL( const TNATFWUNSAFTransactionID& aId );
+    
+    TInt FindTransactionId( const TNATFWUNSAFTransactionID& aId ) const;
+
+private:
+    
+    /*
+     * Observer for STUN request related notifies.
+     */
+    MNATFWStunSrvObserver& iObserver;
+    
+    /**
+     * Identification array, password for authentication
+     */
+    RPointerArray<CNATFWCredentials> iIdentificationArray;
+    
+    /**
+     * A Stream Id
+     */
+    TUint iStreamId; 
+    
+    /**
+     * Remote address
+     */
+    TInetAddr iFromAddress;
+    
+    /**
+     * Multiplexer instance
+     * Not own.
+     */
+    MNcmConnectionMultiplexer* iMultiplexer;
+    
+    /**
+     * Peer remote address
+     */
+    TInetAddr iPeerAddr;
+    
+    /**
+     * Local address
+     */
+    TInetAddr iLocalAddress;
+    
+    /**
+     * Username
+     * Own.
+     */
+    HBufC8* iUsername;
+    
+    /**
+     * Boolean indicating if data indication includes STUN binding request
+     */
+    TBool iRequestInsideIndication;
+    
+    /**
+     * Current role
+     */
+    TInt iRole;
+    
+    /**
+     * Chosen role conflicts with another agent if true
+     */
+    TBool iRoleConflict;
+    
+    /**
+     * Value for determining which agent will change it's role if role 
+     * conflict is present
+     */
+    TUint64 iTieBreaker;
+    
+    /**
+     * Array containing latest transaction identifiers.
+     */
+    RArray<TNATFWUNSAFTransactionID> iTransactionIds;
+    };
+
+#endif // NATFWSTUNSRVIMPL_H