/*************************************************************************** Copyright (C) 2007-2009 Robby Stephenson ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2 of * * the License or (at your option) version 3 or any later version * * accepted by the membership of KDE e.V. (or its successor approved * * by the membership of KDE e.V.), which shall act as a proxy * * defined in Section 14 of version 3 of the license. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ***************************************************************************/ #include "amazonrequest.h" #include "hmac_sha2.h" #include "../tellico_debug.h" #include #include using Tellico::Fetch::AmazonRequest; AmazonRequest::AmazonRequest(const KURL& site_, const TQString& key_) : m_siteUrl(site_), m_key(key_) { } KURL AmazonRequest::signedRequest(const TQMap& params_) const { TQMap allParams = params_; allParams.insert(TQString::fromLatin1("Timestamp"), TQDateTime::currentDateTime(TQt::UTC).toString(TQt::ISODate)); TQString query; // has to be a map so that the query elements are sorted TQMap::Iterator it; for ( it = allParams.begin(); it != allParams.end(); ++it ) { query += KURL::encode_string(it.key()); query += '='; query += KURL::encode_string(it.data()); query += '&'; } // remove last '&' query.truncate(query.length()-1); const TQCString toSign = "GET\n" + m_siteUrl.host().utf8() + '\n' + m_siteUrl.path().utf8() + '\n' + query.latin1(); TQByteArray hmac_buffer; hmac_buffer.fill('\0', SHA256_DIGEST_SIZE); // subtract one from string size for toSign, not exactly sure why hmac_sha256(reinterpret_cast(const_cast(m_key.latin1())), m_key.length(), reinterpret_cast(toSign.data()), toSign.size()-1, reinterpret_cast(hmac_buffer.data()), hmac_buffer.size()); const TQString sig = KURL::encode_string(KCodecs::base64Encode(hmac_buffer)); // myDebug() << sig << endl; KURL url = m_siteUrl; url.setQuery(query + "&Signature=" + sig); return url; }