/*++ * @method: Client::getStringFromOAuthKeyValuePairs * * @description: this method builds a sorted string from key-value pairs * * @input: rawParamMap - key-value pairs map * paramsSeperator - sepearator, either & or , * * @output: rawParams - sorted string of OAuth parameters * * @remarks: internal method * *--*/ bool Client::getStringFromOAuthKeyValuePairs( const KeyValuePairs& rawParamMap, std::string& rawParams, const std::string& paramsSeperator ) { rawParams.assign( "" ); if( rawParamMap.size() ) { KeyValueList keyValueList; std::string dummyStr; /* Push key-value pairs to a list of strings */ keyValueList.clear(); KeyValuePairs::const_iterator itMap = rawParamMap.begin(); for( ; itMap != rawParamMap.end(); itMap++ ) { dummyStr.assign( itMap->first ); dummyStr.append( "=" ); if( paramsSeperator == "," ) { dummyStr.append( "\"" ); } dummyStr.append( itMap->second ); if( paramsSeperator == "," ) { dummyStr.append( "\"" ); } keyValueList.push_back( dummyStr ); } /* Sort key-value pairs based on key name */ keyValueList.sort(); /* Now, form a string */ dummyStr.assign( "" ); KeyValueList::iterator itKeyValue = keyValueList.begin(); for( ; itKeyValue != keyValueList.end(); itKeyValue++ ) { if( dummyStr.length() ) { dummyStr.append( paramsSeperator ); } dummyStr.append( itKeyValue->c_str() ); } rawParams.assign( dummyStr ); } return ( rawParams.length() ) ? true : false; }
/*++ * @method: Client::buildOAuthTokenKeyValuePairs * * @description: this method prepares key-value pairs required for OAuth header * and signature generation. * * @input: includeOAuthVerifierPin - flag to indicate whether oauth_verifer key-value * pair needs to be included. oauth_verifer is only * used during exchanging request token with access token. * rawData - url encoded data. this is used during signature generation. * oauthSignature - base64 and url encoded OAuth signature. * generateTimestamp - If true, then generate new timestamp for nonce. * * @input: urlEncodeValues - if true, URLEncode the values inserted into the * output keyValueMap * @output: keyValueMap - map in which key-value pairs are populated * * @remarks: internal method * *--*/ bool Client::buildOAuthTokenKeyValuePairs( const bool includeOAuthVerifierPin, const std::string& rawData, const std::string& oauthSignature, KeyValuePairs& keyValueMap, const bool urlEncodeValues, const bool generateTimestamp ) { // Encodes value part of key-value pairs depending on type of output (query // string vs. HTTP headers. StringConvertFunction value_encoder = (urlEncodeValues ? HttpEncodeQueryValue : PassThrough); /* Generate nonce and timestamp if required */ if( generateTimestamp ) { generateNonceTimeStamp(); } /* Consumer key and its value */ ReplaceOrInsertKeyValuePair(keyValueMap, Defaults::CONSUMERKEY_KEY, value_encoder(mConsumer->key())); /* Nonce key and its value */ ReplaceOrInsertKeyValuePair(keyValueMap, Defaults::NONCE_KEY, value_encoder(m_nonce)); /* Signature if supplied */ if( oauthSignature.length() ) { // Signature is exempt from encoding. The procedure for // computing it already percent-encodes it as required by the // spec for both query string and Auth header // methods. Therefore, it's pass-through in both cases. ReplaceOrInsertKeyValuePair(keyValueMap, Defaults::SIGNATURE_KEY, oauthSignature); } /* Signature method, only HMAC-SHA1 as of now */ ReplaceOrInsertKeyValuePair(keyValueMap, Defaults::SIGNATUREMETHOD_KEY, std::string( "HMAC-SHA1" )); /* Timestamp */ ReplaceOrInsertKeyValuePair(keyValueMap, Defaults::TIMESTAMP_KEY, value_encoder(m_timeStamp)); /* Token */ if( mToken && mToken->key().length() ) { ReplaceOrInsertKeyValuePair(keyValueMap, Defaults::TOKEN_KEY, value_encoder(mToken->key())); } /* Verifier */ if( includeOAuthVerifierPin && mToken && mToken->pin().length() ) { ReplaceOrInsertKeyValuePair(keyValueMap, Defaults::VERIFIER_KEY, value_encoder(mToken->pin())); } /* Version */ ReplaceOrInsertKeyValuePair(keyValueMap, Defaults::VERSION_KEY, std::string( "1.0" )); /* Data if it's present */ if( rawData.length() ) { /* Data should already be urlencoded once */ std::string dummyStrKey; std::string dummyStrValue; size_t nPos = rawData.find_first_of( "=" ); if( std::string::npos != nPos ) { dummyStrKey = rawData.substr( 0, nPos ); dummyStrValue = rawData.substr( nPos + 1 ); ReplaceOrInsertKeyValuePair(keyValueMap, dummyStrKey, dummyStrValue); } } return ( keyValueMap.size() ) ? true : false; }
/*++ * @method: Client::buildOAuthTokenKeyValuePairs * * @description: this method prepares key-value pairs required for OAuth header * and signature generation. * * @input: includeOAuthVerifierPin - flag to indicate whether oauth_verifer key-value * pair needs to be included. oauth_verifer is only * used during exchanging request token with access token. * rawData - url encoded data. this is used during signature generation. * oauthSignature - base64 and url encoded OAuth signature. * generateTimestamp - If true, then generate new timestamp for nonce. * * @input: urlEncodeValues - if true, URLEncode the values inserted into the * output keyValueMap * @output: keyValueMap - map in which key-value pairs are populated * * @remarks: internal method * *--*/ bool Client::buildOAuthTokenKeyValuePairs( const bool includeOAuthVerifierPin, const std::string& rawData, const std::string& oauthSignature, KeyValuePairs& keyValueMap, const bool urlEncodeValues, const bool generateTimestamp ) { StringConvertFunction encoder = (urlEncodeValues ? URLEncode : PassThrough); /* Generate nonce and timestamp if required */ if( generateTimestamp ) { generateNonceTimeStamp(); } /* Consumer key and its value */ keyValueMap[Defaults::CONSUMERKEY_KEY] = encoder(mConsumer->key()); /* Nonce key and its value */ keyValueMap[Defaults::NONCE_KEY] = encoder(m_nonce); /* Signature if supplied */ if( oauthSignature.length() ) { keyValueMap[Defaults::SIGNATURE_KEY] = encoder(oauthSignature); } /* Signature method, only HMAC-SHA1 as of now */ keyValueMap[Defaults::SIGNATUREMETHOD_KEY] = std::string( "HMAC-SHA1" ); /* Timestamp */ keyValueMap[Defaults::TIMESTAMP_KEY] = encoder(m_timeStamp); /* Token */ if( mToken && mToken->key().length() ) { keyValueMap[Defaults::TOKEN_KEY] = encoder(mToken->key()); } /* Verifier */ if( includeOAuthVerifierPin && mToken && mToken->pin().length() ) { keyValueMap[Defaults::VERIFIER_KEY] = encoder(mToken->pin()); } /* Version */ keyValueMap[Defaults::VERSION_KEY] = std::string( "1.0" ); /* Data if it's present */ if( rawData.length() ) { /* Data should already be urlencoded once */ std::string dummyStrKey; std::string dummyStrValue; size_t nPos = rawData.find_first_of( "=" ); if( std::string::npos != nPos ) { dummyStrKey = rawData.substr( 0, nPos ); dummyStrValue = rawData.substr( nPos + 1 ); keyValueMap[dummyStrKey] = dummyStrValue; } } return ( keyValueMap.size() ) ? true : false; }