diff --git a/src/webui/api/serialize/serialize_torrent.cpp b/src/webui/api/serialize/serialize_torrent.cpp
index 82e2a18a4..124d9e1f4 100644
--- a/src/webui/api/serialize/serialize_torrent.cpp
+++ b/src/webui/api/serialize/serialize_torrent.cpp
@@ -121,6 +121,9 @@ QVariantMap serialize(const BitTorrent::TorrentHandle &torrent)
ret[KEY_TORRENT_AMOUNT_LEFT] = torrent.incompletedSize();
ret[KEY_TORRENT_AMOUNT_COMPLETED] = torrent.completedSize();
ret[KEY_TORRENT_MAX_RATIO] = torrent.maxRatio();
+ ret[KEY_TORRENT_MAX_SEEDING_TIME] = torrent.maxSeedingTime();
+ ret[KEY_TORRENT_RATIO_LIMIT] = torrent.ratioLimit();
+ ret[KEY_TORRENT_SEEDING_TIME_LIMIT] = torrent.seedingTimeLimit();
ret[KEY_TORRENT_LAST_SEEN_COMPLETE_TIME] = torrent.lastSeenComplete().toTime_t();
ret[KEY_TORRENT_AUTO_TORRENT_MANAGEMENT] = torrent.isAutoTMMEnabled();
ret[KEY_TORRENT_TIME_ACTIVE] = torrent.activeTime();
diff --git a/src/webui/api/serialize/serialize_torrent.h b/src/webui/api/serialize/serialize_torrent.h
index cbc9a2af2..832e9e252 100644
--- a/src/webui/api/serialize/serialize_torrent.h
+++ b/src/webui/api/serialize/serialize_torrent.h
@@ -70,6 +70,9 @@ const char KEY_TORRENT_AMOUNT_UPLOADED_SESSION[] = "uploaded_session";
const char KEY_TORRENT_AMOUNT_LEFT[] = "amount_left";
const char KEY_TORRENT_AMOUNT_COMPLETED[] = "completed";
const char KEY_TORRENT_MAX_RATIO[] = "max_ratio";
+const char KEY_TORRENT_MAX_SEEDING_TIME[] = "max_seeding_time";
+const char KEY_TORRENT_RATIO_LIMIT[] = "ratio_limit";
+const char KEY_TORRENT_SEEDING_TIME_LIMIT[] = "seeding_time_limit";
const char KEY_TORRENT_LAST_SEEN_COMPLETE_TIME[] = "seen_complete";
const char KEY_TORRENT_LAST_ACTIVITY_TIME[] = "last_activity";
const char KEY_TORRENT_TOTAL_SIZE[] = "total_size";
diff --git a/src/webui/api/synccontroller.cpp b/src/webui/api/synccontroller.cpp
index 19533fdbb..1c2126fd2 100644
--- a/src/webui/api/synccontroller.cpp
+++ b/src/webui/api/synccontroller.cpp
@@ -352,6 +352,9 @@ namespace
// - "save_path": Torrent save path
// - "completed": Amount of data completed
// - "max_ratio": Upload max share ratio
+// - "max_seeding_time": Upload max seeding time
+// - "ratio_limit": Upload share ratio limit
+// - "seeding_time_limit": Upload seeding time limit
// - "seen_complete": Indicates the time when the torrent was last seen complete/whole
// - "last_activity": Last time when a chunk was downloaded/uploaded
// - "total_size": Size including unwanted data
diff --git a/src/webui/api/torrentscontroller.cpp b/src/webui/api/torrentscontroller.cpp
index 8b6f25e76..c8b6813d3 100644
--- a/src/webui/api/torrentscontroller.cpp
+++ b/src/webui/api/torrentscontroller.cpp
@@ -623,6 +623,21 @@ void TorrentsController::setDownloadLimitAction()
applyToTorrents(hashes, [limit](BitTorrent::TorrentHandle *torrent) { torrent->setDownloadLimit(limit); });
}
+void TorrentsController::setShareLimitsAction()
+{
+ checkParams({"hashes", "ratioLimit", "seedingTimeLimit"});
+
+ const qreal ratioLimit = params()["ratioLimit"].toDouble();
+ const qlonglong seedingTimeLimit = params()["seedingTimeLimit"].toLongLong();
+ const QStringList hashes = params()["hashes"].split('|');
+
+ applyToTorrents(hashes, [ratioLimit, seedingTimeLimit](BitTorrent::TorrentHandle *torrent)
+ {
+ torrent->setRatioLimit(ratioLimit);
+ torrent->setSeedingTimeLimit(seedingTimeLimit);
+ });
+}
+
void TorrentsController::toggleSequentialDownloadAction()
{
checkParams({"hashes"});
diff --git a/src/webui/api/torrentscontroller.h b/src/webui/api/torrentscontroller.h
index 0b1814ef2..03d870f93 100644
--- a/src/webui/api/torrentscontroller.h
+++ b/src/webui/api/torrentscontroller.h
@@ -61,6 +61,7 @@ private slots:
void downloadLimitAction();
void setUploadLimitAction();
void setDownloadLimitAction();
+ void setShareLimitsAction();
void increasePrioAction();
void decreasePrioAction();
void topPrioAction();
diff --git a/src/webui/webui.qrc b/src/webui/webui.qrc
index b889c9264..686aea1db 100644
--- a/src/webui/webui.qrc
+++ b/src/webui/webui.qrc
@@ -37,6 +37,7 @@