summaryrefslogtreecommitdiff
path: root/extra/libktorrent
diff options
context:
space:
mode:
authorroot <root@rshg054.dnsready.net>2012-07-29 00:03:59 +0000
committerroot <root@rshg054.dnsready.net>2012-07-29 00:03:59 +0000
commitddab05fd84b7fa1d67fcd18b532f0427189d8df1 (patch)
tree3a7175c54dfa9c4ae09f2b009b209134af81ba63 /extra/libktorrent
parent4704d1255f08718ed432ba919b4087d0a52ce5a7 (diff)
Sun Jul 29 00:03:59 UTC 2012
Diffstat (limited to 'extra/libktorrent')
-rw-r--r--extra/libktorrent/PKGBUILD15
-rw-r--r--extra/libktorrent/magnet.patch226
2 files changed, 237 insertions, 4 deletions
diff --git a/extra/libktorrent/PKGBUILD b/extra/libktorrent/PKGBUILD
index 1f288045d..62fe72ae8 100644
--- a/extra/libktorrent/PKGBUILD
+++ b/extra/libktorrent/PKGBUILD
@@ -1,21 +1,28 @@
-# $Id: PKGBUILD 161992 2012-06-18 07:10:44Z ronald $
+# $Id: PKGBUILD 164220 2012-07-27 18:35:04Z ronald $
# Maintainer: Ronald van Haren <ronald.archlinux.org>
# Maintainer: Andrea Scarpino <andrea@archlinux.org>
pkgname=libktorrent
pkgver=1.2.1
-pkgrel=1
+pkgrel=2
pkgdesc="A BitTorrent protocol implementation"
arch=('i686' 'x86_64')
url="http://ktorrent.org/"
license=('GPL2')
depends=('kdelibs')
makedepends=('automoc4' 'cmake' 'boost' 'doxygen')
-source=("http://ktorrent.org/downloads/4.2.1/${pkgname}-${pkgver}-2.tar.bz2")
-sha1sums=('857e4227c4bba685755d66581d881f893f6311ae')
+source=("http://ktorrent.org/downloads/4.2.1/${pkgname}-${pkgver}-2.tar.bz2"
+ "magnet.patch")
+sha1sums=('857e4227c4bba685755d66581d881f893f6311ae'
+ 'f0156489364e5590b0b539cfe2abc929c1922ef8')
build() {
cd "${srcdir}"
+
+ pushd ${pkgname}-${pkgver}-2
+ patch -Np1 -i ${srcdir}/magnet.patch
+ popd
+
mkdir build
cd build
cmake ../${pkgname}-${pkgver}-2 \
diff --git a/extra/libktorrent/magnet.patch b/extra/libktorrent/magnet.patch
new file mode 100644
index 000000000..5db76c101
--- /dev/null
+++ b/extra/libktorrent/magnet.patch
@@ -0,0 +1,226 @@
+commit 5107e4b7a050d7533f44801f5f5f5694203fd3b5
+Author: Joris Guisson <joris.guisson@gmail.com>
+Date: Wed Jul 11 20:16:43 2012 +0200
+
+ Make sure all trackers are used of a magnet link
+
+ BUG: 302997
+ BUG: 303269
+
+diff --git a/src/magnet/magnetlink.cpp b/src/magnet/magnetlink.cpp
+index 525bfa5..43168dc 100644
+--- a/src/magnet/magnetlink.cpp
++++ b/src/magnet/magnetlink.cpp
+@@ -19,13 +19,14 @@
+ ***************************************************************************/
+
+ #include "magnetlink.h"
++#include <QUrl>
+ #include <QStringList>
+ #include <util/log.h>
+ #include <util/error.h>
+
+ namespace bt
+ {
+-
++
+ MagnetLink::MagnetLink()
+ {
+ }
+@@ -44,7 +45,7 @@ namespace bt
+ {
+ parse(mlink);
+ }
+-
++
+ MagnetLink::~MagnetLink()
+ {
+ }
+@@ -64,83 +65,114 @@ namespace bt
+ {
+ return info_hash == mlink.infoHash();
+ }
+-
++
++ static KUrl::List GetTrackers(const KUrl & url)
++ {
++ KUrl::List result;
++ const QString encoded_query = QString::fromLatin1(url.encodedQuery());
++ const QString item = QLatin1String("tr=");
++ if(encoded_query.length() <= 1)
++ return result;
++
++ const QStringList items = encoded_query.split(QString(QLatin1Char('&')), QString::SkipEmptyParts);
++ const int len = item.length();
++ for(QStringList::ConstIterator it = items.begin(); it != items.end(); ++it)
++ {
++ if((*it).startsWith(item))
++ {
++ if((*it).length() > len)
++ {
++ QString str = (*it).mid(len);
++ str.replace(QLatin1Char('+'), QLatin1Char(' ')); // + in queries means space.
++ result.push_back(QUrl::fromPercentEncoding(str.toLatin1()));
++ }
++ }
++ }
++
++ return result;
++ }
++
+ void MagnetLink::parse(const QString& mlink)
+ {
+ KUrl url(mlink);
+- if (url.protocol() != "magnet")
++ if(url.protocol() != "magnet")
+ {
+- Out(SYS_GEN|LOG_NOTICE) << "Invalid protocol of magnet link "
+- << mlink << endl;
++ Out(SYS_GEN | LOG_NOTICE) << "Invalid protocol of magnet link "
++ << mlink << endl;
+ return;
+ }
+-
++
+ torrent_url = url.queryItem("to");
+ //magnet://description-of-content.btih.HASH(-HASH)*.dht/path/file?x.pt=&x.to=
+
+ // TODO automatically select these files and prefetches from here
+ path = url.queryItem("pt");
+- if ( path.isEmpty() && url.hasPath() && url.path() != "/" ) {
++ if(path.isEmpty() && url.hasPath() && url.path() != "/")
++ {
+ // TODO find out why RemoveTrailingSlash does not work
+ path = url.path(KUrl::RemoveTrailingSlash).remove(QRegExp("^/"));
+ }
+
+ QString xt = url.queryItem("xt");
+- if ( xt.isEmpty()
+- || !xt.startsWith("urn:btih:") ) {
++ if(xt.isEmpty()
++ || !xt.startsWith("urn:btih:"))
++ {
+ QRegExp btihHash("([^\\.]+).btih");
+- if ( btihHash.indexIn(url.host()) != -1 ) {
++ if(btihHash.indexIn(url.host()) != -1)
++ {
+ QString primaryHash = btihHash.cap(1).split("-")[0];
+- xt = "urn:btih:"+primaryHash;
+- } else {
+- Out(SYS_GEN|LOG_NOTICE) << "No hash found in magnet link "
+- << mlink << endl;
++ xt = "urn:btih:" + primaryHash;
++ }
++ else
++ {
++ Out(SYS_GEN | LOG_NOTICE) << "No hash found in magnet link "
++ << mlink << endl;
+ return;
+ }
+ }
+-
++
+ QString ih = xt.mid(9);
+- if (ih.length() != 40 && ih.length() != 32)
++ if(ih.length() != 40 && ih.length() != 32)
+ {
+- Out(SYS_GEN|LOG_NOTICE) << "Hash has not valid length in magnet link "
+- << mlink << endl;
++ Out(SYS_GEN | LOG_NOTICE) << "Hash has not valid length in magnet link "
++ << mlink << endl;
+ return;
+ }
+-
++
+ try
+ {
+- if (ih.length() == 32)
++ if(ih.length() == 32)
+ ih = base32ToHexString(ih);
+
+ Uint8 hash[20];
+- memset(hash,0,20);
+- for (int i = 0;i < 20;i++)
++ memset(hash, 0, 20);
++ for(int i = 0; i < 20; i++)
+ {
+- Uint8 low = charToHex(ih[2*i + 1]);
+- Uint8 high = charToHex(ih[2*i]);
++ Uint8 low = charToHex(ih[2 * i + 1]);
++ Uint8 high = charToHex(ih[2 * i]);
+ hash[i] = (high << 4) | low;
+ }
+-
++
+ info_hash = SHA1Hash(hash);
+- tracker_urls = url.queryItem("tr").split(",");
++ tracker_urls = GetTrackers(url);
+ name = url.queryItem("dn");
+ magnet_string = mlink;
+ }
+- catch (...)
++ catch(...)
+ {
+- Out(SYS_GEN|LOG_NOTICE) << "Invalid magnet link " << mlink << endl;
++ Out(SYS_GEN | LOG_NOTICE) << "Invalid magnet link " << mlink << endl;
+ }
+ }
+-
++
+ Uint8 MagnetLink::charToHex(const QChar& ch)
+ {
+- if (ch.isDigit())
++ if(ch.isDigit())
+ return ch.digitValue();
+-
+- if (!ch.isLetter())
++
++ if(!ch.isLetter())
+ throw bt::Error("Invalid char");
+-
+- if (ch.isLower())
++
++ if(ch.isLower())
+ return 10 + ch.toAscii() - 'a';
+ else
+ return 10 + ch.toAscii() - 'A';
+@@ -155,28 +187,28 @@ namespace bt
+ QString str = s.toUpper();
+ // 32 base32 chars -> 40 hex chars
+ // 4 base32 chars -> 5 hex chars
+- for (int i = 0; i < 8; i++)
++ for(int i = 0; i < 8; i++)
+ {
+ part = 0;
+- for (int j = 0; j < 4; j++)
++ for(int j = 0; j < 4; j++)
+ {
+- ch = str[i*4 + j];
+- if (ch.isDigit() && (ch.digitValue() < 2 || ch.digitValue() > 7))
++ ch = str[i * 4 + j];
++ if(ch.isDigit() && (ch.digitValue() < 2 || ch.digitValue() > 7))
+ throw bt::Error("Invalid char");
+
+- if (ch.isDigit())
+- tmp = ch.digitValue() + 24;
++ if(ch.isDigit())
++ tmp = ch.digitValue() + 24;
+ else
+ tmp = ch.toAscii() - 'A';
+- part = part + (tmp << 5*(3-j));
++ part = part + (tmp << 5 * (3 - j));
+ }
+
+ // part is a Uint32 with 20 bits (5 hex)
+- for (int j = 0; j < 5; j++)
++ for(int j = 0; j < 5; j++)
+ {
+- tmp = (part >> 4*(4-j)) & 0xf;
+- if (tmp >= 10)
+- ret.append(QChar((tmp-10) + 'a'));
++ tmp = (part >> 4 * (4 - j)) & 0xf;
++ if(tmp >= 10)
++ ret.append(QChar((tmp - 10) + 'a'));
+ else
+ ret.append(QChar(tmp + '0'));
+ }