diff -r 6ca72c0fe49a -r a941bc465d9f wvuing/IMPSConnectionUI/ServiceSrc/CnUiIMPSIdValidator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSConnectionUI/ServiceSrc/CnUiIMPSIdValidator.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,229 @@ +/* +* Copyright (c) 2004 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: Validator to check the IMPS id correctness. +* +*/ + + +// INCLUDE FILES +#include +#include "CnUiIMPSIdValidator.h" + + +//CONSTS +/** + * Constants to use in validation. + * + * For future: These could be merged with IMPS Common UI + */ +const TInt KServerWVUserIdMaxLength = 50; +_LIT( KCUImpsId_WhiteSpace, " " ); +_LIT( KCUImpsId_At, "@" ); +_LIT( KCUImpsId_Dot, "." ); +_LIT( KCUImpsId_TwoDots, ".." ); +_LIT( KCUImpsId_Slash, "/" ); +_LIT( KCUImpsId_Plus, "+" ); +_LIT( KCUImpsId_Tabulator, "\t" ); +_LIT( KCUImpsId_WVPrefix, "wv:" ); + +_LIT( KCUImpsId_AtEnc, "%40" ); +_LIT( KCUImpsId_SlashEnc, "%2F" ); +_LIT( KCUImpsId_PlusEnc, "%2B" ); +_LIT( KCUImpsId_TabulatorEnc, "%09" ); +_LIT( KCUImpsId_WhiteSpaceEnc, "%20" ); + +const TInt KCUImpsId_WVPrefixLength = 3; + + + +// ================= MEMBER FUNCTIONS ======================= +// ----------------------------------------------------------------------------- +// CnUiIMPSIdValidator::ValidLoginIdL() +// ----------------------------------------------------------------------------- +// +TBool CnUiIMPSIdValidator::ValidLoginIdL( const TDesC& aPresenceId ) + { + TBool idCorrect( ETrue ); + + HBufC* wvId = aPresenceId.AllocLC(); + TPtr wvIdPtr = wvId->Des(); + + TInt maxLength ( KServerWVUserIdMaxLength ); + + // let's take out the "wv:" from beginning of user id + TInt position( KErrNotFound ); + if ( KCUImpsId_WVPrefix().CompareF( wvId->Left( KCUImpsId_WVPrefixLength ) ) == 0 ) + { + wvIdPtr.Delete( 0, KCUImpsId_WVPrefix().Length() ); + // we just took out 3 characters from the id, we have to adjust the max length + maxLength = maxLength - KCUImpsId_WVPrefixLength; + } + + // where is "@" ? + TInt atIndex( wvId->Find( KCUImpsId_At ) ); + // we want the domain part without the '@' + TPtrC domainPart( wvId->Mid( atIndex + 1 ) ); + + if ( atIndex > 0 ) + { + // check if the domain part is empty + if ( domainPart.Length() == 0 ) + { + idCorrect = EFalse; + } + } + else if ( atIndex == 0 ) + { + // the '@' is the first character + idCorrect = EFalse; + } + + + // check the correctness of the domain part + if ( ( domainPart.Find( KCUImpsId_At() ) ) != KErrNotFound ) + { + // extra @-mark found in the domain part + idCorrect = EFalse; + } + + TInt returnValue ( domainPart.Find( KCUImpsId_Dot() ) ); + if ( returnValue != KErrNotFound ) + { + // the part after the '.' + TPtrC partAfterDot ( domainPart.Mid( returnValue + 1 ) ); + // the part before the '.' + TPtrC partBeforeDot ( domainPart.Left( returnValue ) ); + // if the '.' is the last character or the first character after the '@' + // the domain part is wrong + if ( ( 0 == partAfterDot.Length() ) || ( 0 == partBeforeDot.Length() ) ) + { + idCorrect = EFalse; + } + } + + if ( ( domainPart.Find( KCUImpsId_TwoDots() ) ) != KErrNotFound ) + { + // there are two sequential dots in the domain part + idCorrect = EFalse; + } + + // first we must delete one '@' char if existing + position = wvIdPtr.Find( KCUImpsId_At ); + if ( position != KErrNotFound ) + { + wvIdPtr.Delete( position, KCUImpsId_At().Length() ); + // @-character was removed from the ID, since it should not be encoded + // so the maxlength has to be decreased by it's length + maxLength = maxLength - KCUImpsId_At().Length(); + } + + // check the id for forbidden characters + + if ( CnUiIMPSIdValidator::ForbiddenChars( wvIdPtr ) ) + { + idCorrect = EFalse; + } + + TInt length( wvIdPtr.Length() ); + // no 16bit Unicode chars characters allowed in the user part + for ( TInt index = 0; index < length; index++ ) + { + TUint value = wvIdPtr[index]; + // if the character does not fit into 8 bits, it's forbidden + if ( value > 255 ) + { + idCorrect = EFalse; + } + } + + // check if the user id is too long when encoded, but only if there are no forbidden chars + if ( idCorrect ) + { + HBufC* encodedUserId = EscapeUtils::EscapeEncodeL( *wvId, EscapeUtils::EEscapeUrlEncoded ); + + if ( encodedUserId->Length() > maxLength ) + { + idCorrect = EFalse; + } + delete encodedUserId; + } + + CleanupStack::PopAndDestroy( wvId ); + + return idCorrect; + } + + +// ----------------------------------------------------------------------------- +// CnUiIMPSIdValidator::ValidLoginIdL() +// ----------------------------------------------------------------------------- +// +TBool CnUiIMPSIdValidator::ForbiddenChars( const TDesC& aImpsId ) + { + TBool returnValue( EFalse ); + + // no empty chars allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_WhiteSpace() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + // no encoded empty chars allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_WhiteSpaceEnc() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + + // no '+' allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_Plus() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + // no encoded '+' allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_PlusEnc() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + + // no '\t' allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_Tabulator() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + // no encoded tabulator allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_TabulatorEnc() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + + // no '/' allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_Slash() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + // no encoded '/' allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_SlashEnc() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + + // no encoded '@' chars allowed in the user part + if ( ( aImpsId.Find( KCUImpsId_AtEnc() ) ) != KErrNotFound ) + { + returnValue = ETrue; + } + + return returnValue; + } + +// End of File