From 96467b807ef9db78f24745dd8fa6f784003929c4 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Mon, 19 Feb 2018 12:44:11 +0100 Subject: [PATCH] Code cleanup and trying to allow Deluge RPC connetions over properly secured SSL sockets as well as unsecure non-SSl socket. --- app/build.gradle | 2 +- .../daemon/Deluge/DelugeAdapter.java | 192 ++-- .../daemon/Deluge/DelugeCommon.java | 345 +++---- .../daemon/Deluge/DelugeRpcAdapter.java | 950 +++++++++--------- .../daemon/Deluge/DelugeRpcClient.java | 247 ++--- 5 files changed, 839 insertions(+), 897 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f6a5ab40..5e7e0d50 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,7 +42,7 @@ dependencies { compile 'com.android.support:support-annotations:23.4.0' compile 'com.getbase:floatingactionbutton:1.10.1' compile 'com.nispok:snackbar:2.11.0' - compile 'com.github.aegnor:rencode-java:-SNAPSHOT' + compile 'com.github.aegnor:rencode-java:cb628e824e' compile('com.github.afollestad.material-dialogs:core:0.8.5.5@aar') { transitive = true } diff --git a/app/src/main/java/org/transdroid/daemon/Deluge/DelugeAdapter.java b/app/src/main/java/org/transdroid/daemon/Deluge/DelugeAdapter.java index aba430ac..a023e4a7 100644 --- a/app/src/main/java/org/transdroid/daemon/Deluge/DelugeAdapter.java +++ b/app/src/main/java/org/transdroid/daemon/Deluge/DelugeAdapter.java @@ -1,23 +1,83 @@ /* * This file is part of Transdroid - * + * * Transdroid 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 3 of the License, or * (at your option) any later version. - * + * * Transdroid 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 Transdroid. If not, see . - * + * */ package org.transdroid.daemon.Deluge; +import com.android.internalcopy.http.multipart.FilePart; +import com.android.internalcopy.http.multipart.MultipartEntity; +import com.android.internalcopy.http.multipart.Part; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.cookie.Cookie; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.protocol.HTTP; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.transdroid.core.gui.log.Log; +import org.transdroid.daemon.Daemon; +import org.transdroid.daemon.DaemonException; +import org.transdroid.daemon.DaemonException.ExceptionType; +import org.transdroid.daemon.DaemonSettings; +import org.transdroid.daemon.IDaemonAdapter; +import org.transdroid.daemon.Label; +import org.transdroid.daemon.Priority; +import org.transdroid.daemon.Torrent; +import org.transdroid.daemon.TorrentDetails; +import org.transdroid.daemon.TorrentFile; +import org.transdroid.daemon.TorrentStatus; +import org.transdroid.daemon.task.AddByFileTask; +import org.transdroid.daemon.task.AddByMagnetUrlTask; +import org.transdroid.daemon.task.AddByUrlTask; +import org.transdroid.daemon.task.DaemonTask; +import org.transdroid.daemon.task.DaemonTaskFailureResult; +import org.transdroid.daemon.task.DaemonTaskResult; +import org.transdroid.daemon.task.DaemonTaskSuccessResult; +import org.transdroid.daemon.task.GetFileListTask; +import org.transdroid.daemon.task.GetFileListTaskSuccessResult; +import org.transdroid.daemon.task.GetTorrentDetailsTask; +import org.transdroid.daemon.task.GetTorrentDetailsTaskSuccessResult; +import org.transdroid.daemon.task.PauseTask; +import org.transdroid.daemon.task.RemoveTask; +import org.transdroid.daemon.task.ResumeTask; +import org.transdroid.daemon.task.RetrieveTask; +import org.transdroid.daemon.task.RetrieveTaskSuccessResult; +import org.transdroid.daemon.task.SetDownloadLocationTask; +import org.transdroid.daemon.task.SetFilePriorityTask; +import org.transdroid.daemon.task.SetLabelTask; +import org.transdroid.daemon.task.SetTrackersTask; +import org.transdroid.daemon.task.SetTransferRatesTask; +import org.transdroid.daemon.util.HttpHelper; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_DETAILS; +import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_DETAILS_FIELDS_ARRAY; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_DOWNLOADEDEVER; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_ETA; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_FIELDS_ARRAY; @@ -61,7 +121,7 @@ import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_SAVEPATH; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_SESSION_ID; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_SIZE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_STATUS; -import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_DETAILS_FIELDS_ARRAY; +import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TIER; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TIMEADDED; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TORRENTS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TOTALPEERS; @@ -69,66 +129,8 @@ import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TOTALSEEDS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TOTALSIZE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TRACKERS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TRACKER_STATUS; -import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TIER; -import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_URL; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_UPLOADEDEVER; - -import com.android.internalcopy.http.multipart.FilePart; -import com.android.internalcopy.http.multipart.MultipartEntity; -import com.android.internalcopy.http.multipart.Part; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.cookie.Cookie; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.protocol.HTTP; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.transdroid.core.gui.log.Log; -import org.transdroid.daemon.Daemon; -import org.transdroid.daemon.DaemonException; -import org.transdroid.daemon.DaemonException.ExceptionType; -import org.transdroid.daemon.DaemonSettings; -import org.transdroid.daemon.IDaemonAdapter; -import org.transdroid.daemon.Label; -import org.transdroid.daemon.Priority; -import org.transdroid.daemon.Torrent; -import org.transdroid.daemon.TorrentDetails; -import org.transdroid.daemon.TorrentFile; -import org.transdroid.daemon.TorrentStatus; -import org.transdroid.daemon.task.AddByFileTask; -import org.transdroid.daemon.task.AddByMagnetUrlTask; -import org.transdroid.daemon.task.AddByUrlTask; -import org.transdroid.daemon.task.DaemonTask; -import org.transdroid.daemon.task.DaemonTaskFailureResult; -import org.transdroid.daemon.task.DaemonTaskResult; -import org.transdroid.daemon.task.DaemonTaskSuccessResult; -import org.transdroid.daemon.task.GetFileListTask; -import org.transdroid.daemon.task.GetFileListTaskSuccessResult; -import org.transdroid.daemon.task.GetTorrentDetailsTask; -import org.transdroid.daemon.task.GetTorrentDetailsTaskSuccessResult; -import org.transdroid.daemon.task.PauseTask; -import org.transdroid.daemon.task.RemoveTask; -import org.transdroid.daemon.task.ResumeTask; -import org.transdroid.daemon.task.RetrieveTask; -import org.transdroid.daemon.task.RetrieveTaskSuccessResult; -import org.transdroid.daemon.task.SetDownloadLocationTask; -import org.transdroid.daemon.task.SetFilePriorityTask; -import org.transdroid.daemon.task.SetLabelTask; -import org.transdroid.daemon.task.SetTrackersTask; -import org.transdroid.daemon.task.SetTransferRatesTask; -import org.transdroid.daemon.util.HttpHelper; +import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_URL; /** @@ -220,8 +222,7 @@ public class DelugeAdapter implements IDaemonAdapter { // params.put(-1); // cache_id JSONObject result = makeRequest(buildRequest(RPC_METHOD_GET, params), log); - return new RetrieveTaskSuccessResult((RetrieveTask) task, - parseJsonRetrieveTorrents(result.getJSONObject(RPC_RESULT)), + return new RetrieveTaskSuccessResult((RetrieveTask) task, parseJsonRetrieveTorrents(result.getJSONObject(RPC_RESULT)), parseJsonRetrieveLabels(result.getJSONObject(RPC_RESULT))); case GetTorrentDetails: @@ -237,8 +238,8 @@ public class DelugeAdapter implements IDaemonAdapter { params.put(dfields); // keys JSONObject dinfo = makeRequest(buildRequest(RPC_METHOD_STATUS, params), log); - return new GetTorrentDetailsTaskSuccessResult((GetTorrentDetailsTask) task, - parseJsonTorrentDetails(dinfo.getJSONObject(RPC_RESULT))); + return new GetTorrentDetailsTaskSuccessResult((GetTorrentDetailsTask) task, parseJsonTorrentDetails(dinfo.getJSONObject + (RPC_RESULT))); case GetFileList: @@ -247,8 +248,8 @@ public class DelugeAdapter implements IDaemonAdapter { params.put(ffields); // keys JSONObject finfo = makeRequest(buildRequest(RPC_METHOD_STATUS, params), log); - return new GetFileListTaskSuccessResult((GetFileListTask) task, - parseJsonFileListing(finfo.getJSONObject(RPC_RESULT), task.getTargetTorrent())); + return new GetFileListTaskSuccessResult((GetFileListTask) task, parseJsonFileListing(finfo.getJSONObject(RPC_RESULT), task + .getTargetTorrent())); case AddByFile: @@ -290,8 +291,8 @@ public class DelugeAdapter implements IDaemonAdapter { // Pause a torrent PauseTask pauseTask = (PauseTask) task; - makeRequest(buildRequest(RPC_METHOD_PAUSE, ((new JSONArray()) - .put((new JSONArray()).put(pauseTask.getTargetTorrent().getUniqueID())))), log); + makeRequest(buildRequest(RPC_METHOD_PAUSE, ((new JSONArray()).put((new JSONArray()).put(pauseTask.getTargetTorrent().getUniqueID + ())))), log); return new DaemonTaskSuccessResult(task); case PauseAll: @@ -304,8 +305,8 @@ public class DelugeAdapter implements IDaemonAdapter { // Resume a torrent ResumeTask resumeTask = (ResumeTask) task; - makeRequest(buildRequest(RPC_METHOD_RESUME, ((new JSONArray()) - .put((new JSONArray()).put(resumeTask.getTargetTorrent().getUniqueID())))), log); + makeRequest(buildRequest(RPC_METHOD_RESUME, ((new JSONArray()).put((new JSONArray()).put(resumeTask.getTargetTorrent() + .getUniqueID())))), log); return new DaemonTaskSuccessResult(task); case ResumeAll: @@ -323,8 +324,7 @@ public class DelugeAdapter implements IDaemonAdapter { params.put(task.getTargetTorrent().getUniqueID()); // torrent_id params.put(ffields); // keys JSONObject pinfo = makeRequest(buildRequest(RPC_METHOD_STATUS, params), log); - ArrayList pfiles = - parseJsonFileListing(pinfo.getJSONObject(RPC_RESULT), prioTask.getTargetTorrent()); + ArrayList pfiles = parseJsonFileListing(pinfo.getJSONObject(RPC_RESULT), prioTask.getTargetTorrent()); // Now prepare the new list of priorities params = new JSONArray(); @@ -400,14 +400,13 @@ public class DelugeAdapter implements IDaemonAdapter { case ForceRecheck: // Pause a torrent - makeRequest(buildRequest(RPC_METHOD_FORCERECHECK, - ((new JSONArray()).put((new JSONArray()).put(task.getTargetTorrent().getUniqueID())))), - log); + makeRequest(buildRequest(RPC_METHOD_FORCERECHECK, ((new JSONArray()).put((new JSONArray()).put(task.getTargetTorrent() + .getUniqueID())))), log); return new DaemonTaskSuccessResult(task); default: - return new DaemonTaskFailureResult(task, new DaemonException(ExceptionType.MethodUnsupported, - task.getMethod() + " is not supported by " + getType())); + return new DaemonTaskFailureResult(task, new DaemonException(ExceptionType.MethodUnsupported, task.getMethod() + " is not " + + "supported by " + getType())); } } catch (JSONException e) { return new DaemonTaskFailureResult(task, new DaemonException(ExceptionType.ParsingFailed, e.toString())); @@ -518,9 +517,8 @@ public class DelugeAdapter implements IDaemonAdapter { // Still no session cookie? if (sessionCookie == null) { // Set error message and cancel the action that was requested - throw new DaemonException(ExceptionType.AuthenticationFailure, - "Password error? Server time difference? No (valid) cookie in response and JSON was: " + - HttpHelper.convertStreamToString(instream)); + throw new DaemonException(ExceptionType.AuthenticationFailure, "Password error? Server time difference? No (valid) cookie in " + + "response and JSON was: " + HttpHelper.convertStreamToString(instream)); } } @@ -557,9 +555,7 @@ public class DelugeAdapter implements IDaemonAdapter { JSONObject json = new JSONObject(result); instream.close(); - log.d(LOG_NAME, "Success: " + - (result.length() > 300 ? result.substring(0, 300) + "... (" + result.length() + " chars)" : - result)); + log.d(LOG_NAME, "Success: " + (result.length() > 300 ? result.substring(0, 300) + "... (" + result.length() + " chars)" : result)); // Return JSON object return json; @@ -585,8 +581,7 @@ public class DelugeAdapter implements IDaemonAdapter { */ private void initialise() throws DaemonException { - httpclient = HttpHelper.createStandardHttpClient(settings, - settings.getUsername() != null && !settings.getUsername().equals("")); + httpclient = HttpHelper.createStandardHttpClient(settings, settings.getUsername() != null && !settings.getUsername().equals("")); httpclient.addRequestInterceptor(HttpHelper.gzipRequestInterceptor); httpclient.addResponseInterceptor(HttpHelper.gzipResponseInterceptor); @@ -597,18 +592,17 @@ public class DelugeAdapter implements IDaemonAdapter { * @return The URL of the RPC API */ private String buildWebUIUrl() { - return (settings.getSsl() ? "https://" : "http://") + settings.getAddress() + ":" + settings.getPort() + - (settings.getFolder() == null ? "" : settings.getFolder()); + return (settings.getSsl() ? "https://" : "http://") + settings.getAddress() + ":" + settings.getPort() + (settings.getFolder() == null ? "" + : settings.getFolder()); } private ArrayList parseJsonRetrieveTorrents(JSONObject response) throws JSONException, DaemonException { // Parse response - ArrayList torrents = new ArrayList(); + ArrayList torrents = new ArrayList<>(); if (response.isNull(RPC_TORRENTS)) { - throw new DaemonException(ExceptionType.NotConnected, - "Web interface probably not connected to a daemon yet, because 'torrents' is null: " + - response.toString()); + throw new DaemonException(ExceptionType.NotConnected, "Web interface probably not connected to a daemon yet, because 'torrents' is null:" + + " " + response.toString()); } JSONObject objects = response.getJSONObject(RPC_TORRENTS); JSONArray names = objects.names(); @@ -668,7 +662,7 @@ public class DelugeAdapter implements IDaemonAdapter { JSONArray labels = filters.getJSONArray("label"); // Parse response - ArrayList