diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/inc/CSIPSecCredentials.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/inc/CSIPSecCredentials.h Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,222 @@ +/* +* Copyright (c) 2008-2009 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: +* Name : CSIPSecCredentials.h +* Part of : SIPSec/DigestPlugin +* Version : SIP/6.0 +* +*/ + + + + +/** + @internalComponent +*/ + +#ifndef __CSIPSEC_CREDENTIALS_H__ +#define __CSIPSEC_CREDENTIALS_H__ + +// INCLUDES +#include "CSIPSecDigestCacheEntry.h" + +// FORWARD DECLARATIONS +class CSIPAuthorizationHeaderBase; +class CSIPSecChallenge; +class CSIPSecDigest; +class TSIPSecDigestCtxSetup; +class TSIPSecPluginCtxResponse; +class TSIPSecDigestCtxProcess; + +// CLASS DECLARATION +/** + * @brief Class representing credentials created based on challenge received in + * a 401/407 response + * + * @class CSIPSecCredentials CSIPSecCredentials.h "CSIPSecCredentials.h" + * + * This class provides functions to + * - update, because of SIP request sending with these credentials. + * In this case response is calculated. + * - update, because of re-challenge, which causes update of user credentials + * - handle authentication info header + * - handle security verify header + */ +class CSIPSecCredentials : public CSIPSecDigestCacheEntry + { +public: // Constructors and destructor + + /** + * Constructs the object. Leaves on Failure + * @param aChallenge Challenge, ownership is transferred. + * @param aMechanism the mechanism + * @param aContext Response context + * @return Return A new CSIPSecCredentials object, ownership is transferred. + */ + static CSIPSecCredentials* NewL( CSIPSecChallenge* aChallenge, + CSIPSecDigest& aMechanism, + TSIPSecPluginCtxResponse& aContext ); + + /** + * Destructor + */ + ~CSIPSecCredentials(); + +public: // From CSIPSecDigestCacheEntry + + void UpdateL( CSIPSecUserRecord& aUserCredentials ); + + void UpdateL( TSIPSecPluginCtxRequest& aContext ); + + void HandleL( TSIPSecPluginCtxInfo& aAuthenticationInfo ); + + void HandleL( TSIPSecPluginCtxVerify& aSecurityVerifyCtx ); + + CSIPSecDigest::TChallengeType Type() const; + + CSIPSecDigest::TChallengeType + Type( const TSIPSecPluginContext& aContext ) const; + +public: // New functions + + /** + * Returns type of challenge + * @param aChallenge The challenge who's type is requested + * @param aContext Context in which the challenge type is resolved + * @return Type of aChallenge + */ + CSIPSecDigest::TChallengeType + ChallengeType( const CSIPSecChallenge& aChallenge, + const TSIPSecPluginContext* aContext = 0 ) const; + + /** + * Returns content (SIP proxy/WWW authorization header) + * @return Content + */ + CSIPAuthorizationHeaderBase& Content(); + + /** + * Updates entry based on a SIP response + * @param aContext Response context + * @param aAskCredentials OUT: ETrue If the credentials for the challenge(s) + * present in the current SIP response, must be asked now. + * EFalse If there is no need to ask the credentials, and maybe they + * are already being asked for due to some earlier SIP response. + * @return ETrue If credentials must be obtained, EFalse otherwise + */ + TBool DigestUpdateL( TSIPSecDigestCtxSetup& aContext, + TBool& aAskCredentials ); + + /** + * Handles new challenge reception and determines action + * @param aNewChallenge New challenge that has been received + * @return ETrue If this credentials instance must be removed, + * EFalse otherwise + */ + TBool ChallengeReceived( CSIPSecChallenge& aNewChallenge ); + + /** + * Returns challenge + * @return Challenge + */ + CSIPSecChallenge& Challenge(); + + /** + * Returns mechanism + * @return Mechanism + */ + CSIPSecDigest& Mechanism() const; + + /** + * Get the qop value + * @return Qop value, or empty descriptor if qop is undefined + */ + const TPtrC8 Qop() const; + + /** + * Compares aChallenge to the challenge in this CSIPSecCredentials object. + * @param aChallenge Challenge + * @param aUser SIPSec user processing SIP response where the aChallenge is + * received. + * @param aRegistrationId Registration id + * @return ETrue If the challenges match + * EFalse otherwise + */ + TBool DoesMatch( const CSIPSecChallenge& aChallenge, + const MSIPSecUser& aUser, + TRegistrationId aRegistrationId ) const; + +private: // Constructors, for internal use + + /* + * Constructor + * @param aMechanism the mechanism + * @param aUser SIPSec user + */ + CSIPSecCredentials( CSIPSecDigest& aMechanism, const MSIPSecUser& aUser ); + + /* + * Second phase constructor + * @param aChallenge Challenge, ownership is transferred. + * @param aContext Response context + */ + void ConstructL( CSIPSecChallenge* aChallenge, + TSIPSecPluginCtxResponse& aContext ); + +private: // New functions, for internal use + + /* + * Creates the content + */ + void CreateContentL( CSIPSecChallenge& aChallenge ); + + /* + * Updates content + * @param aContext Digest context + */ + void UpdateContentL( TSIPSecDigestCtxSetup& aContext ); + + /* + * Updates content + * @param aContext Digest context + */ + void UpdateContentL( TSIPSecDigestCtxProcess& aContext ); + + /* + * Sets nonce count + * @param aNonceCount Nonce count + */ + void SetNonceCountL( TUint aNonceCount ); + +private: // Data + + // Owned + CSIPSecChallenge* iChallenge; + + // Owned + CSIPAuthorizationHeaderBase* iAuthorizationHeader; + + TUint iNonceCount; + + CSIPSecDigest& iMechanism; + + // For testing purposes +#ifdef CPPUNIT_TEST + friend class CSIPSecCredentialsTest; +#endif + }; + +#endif // end of __CSIPSEC_CREDENTIALS_H__ + +// End of File