Compare commits
23 Commits
deluge-2.0
...
deluge-2.0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b711cd258a | ||
![]() |
e1c4069a72 | ||
![]() |
a2dee79439 | ||
![]() |
7a54db3179 | ||
![]() |
03e7952d26 | ||
![]() |
7ee8750be4 | ||
![]() |
f61001a15d | ||
![]() |
86ddadacf7 | ||
![]() |
632089940c | ||
![]() |
5d7db3e727 | ||
![]() |
4dd1f63b8b | ||
![]() |
fc134cdffb | ||
![]() |
36cb4c5a4f | ||
![]() |
676bdb26e0 | ||
![]() |
dff778ceeb | ||
![]() |
bdadd2b515 | ||
![]() |
a34543100c | ||
![]() |
b8b044f451 | ||
![]() |
2d87cde887 | ||
![]() |
212efc4f52 | ||
![]() |
879a397215 | ||
![]() |
957cd5dd9c | ||
![]() |
25087d3f2d |
@@ -1,4 +1,4 @@
|
||||
default_language:
|
||||
default_language_version:
|
||||
python: python3
|
||||
exclude: >
|
||||
(?x)^(
|
||||
|
@@ -21,12 +21,15 @@ matrix:
|
||||
include:
|
||||
- name: Unit tests
|
||||
env: TOX_ENV=py3
|
||||
- name: Unit tests (libtorrent 1.2)
|
||||
- name: Unit tests - libtorrent 1.2
|
||||
env: TOX_ENV=py3
|
||||
addons:
|
||||
apt:
|
||||
sources: [sourceline: "ppa:libtorrent.org/1.2-daily"]
|
||||
packages: [python3-libtorrent, python3-venv]
|
||||
- name: Unit tests - Python 2
|
||||
env: TOX_ENV=py27
|
||||
python: 2.7
|
||||
- if: commit_message =~ SECURITY_TEST
|
||||
env: TOX_ENV=security
|
||||
- name: Code linting
|
||||
@@ -44,6 +47,7 @@ addons:
|
||||
- sourceline: "ppa:libtorrent.org/rc-1.1-daily"
|
||||
- deadsnakes
|
||||
packages:
|
||||
- python-libtorrent
|
||||
- python3-libtorrent
|
||||
# Install py36 specifically for pre-commit to run black formatter.
|
||||
- python3.6
|
||||
|
39
CHANGELOG.md
39
CHANGELOG.md
@@ -1,7 +1,42 @@
|
||||
# Changelog
|
||||
|
||||
## 2.0.3 (2019-06-12)
|
||||
|
||||
### Gtk UI
|
||||
|
||||
- Fix errors running on Wayland (#3265).
|
||||
- Fix Peers Tab tooltip and context menu errors (#3266).
|
||||
|
||||
### Web UI
|
||||
|
||||
- Fix TypeError in Peers Tab setting country flag.
|
||||
- Fix reverse proxy header TypeError (#3260).
|
||||
- Fix request.base 'idna' codec error (#3261).
|
||||
- Fix unable to change password (#3262).
|
||||
|
||||
### Extractor plugin
|
||||
|
||||
- Fix potential error starting plugin.
|
||||
|
||||
### Documentation
|
||||
|
||||
- Fix macOS install typo.
|
||||
- Fix Windows install instructions.
|
||||
|
||||
## 2.0.2 (2019-06-08)
|
||||
|
||||
### Packaging
|
||||
|
||||
- Add systemd deluged and deluge-web service files to package tarball (#2034)
|
||||
|
||||
### Core
|
||||
|
||||
- Fix Python 2 compatiblity issue with SimpleNamespace.
|
||||
|
||||
## 2.0.1 (2019-06-07)
|
||||
|
||||
### Packaging
|
||||
|
||||
- Fix setup.py build error without git installed.
|
||||
|
||||
## 2.0.0 (2019-06-06)
|
||||
@@ -35,7 +70,7 @@
|
||||
- Add Option To Specify Outgoing Connection Interface.
|
||||
- Fix potential for host_id collision when creating hostlist entries.
|
||||
|
||||
### GtkUI
|
||||
### Gtk UI
|
||||
|
||||
- Ported to GTK3 (3rd-party plugins will need updated).
|
||||
- Allow changing ownership of torrents.
|
||||
@@ -50,7 +85,7 @@
|
||||
- Top: Ctrl+Alt+Shift+Up
|
||||
- Bottom: Ctrl+Alt+Shift+Down
|
||||
|
||||
### WebUI
|
||||
### Web UI
|
||||
|
||||
- Server (deluge-web) now daemonizes by default, use '-d' or '--do-not-daemonize' to disable.
|
||||
- Fixed the '--base' option to work for regular use, not just with reverse proxies.
|
||||
|
@@ -8,6 +8,7 @@ include version.py
|
||||
include gen_web_gettext.py
|
||||
|
||||
graft docs/man
|
||||
graft packaging/systemd
|
||||
|
||||
include deluge/i18n/*.po
|
||||
recursive-exclude deluge/i18n *.mo
|
||||
|
@@ -28,6 +28,14 @@ from deluge.common import decode_bytes
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
SimpleNamespace = types.SimpleNamespace # Python 3.3+
|
||||
except AttributeError:
|
||||
|
||||
class SimpleNamespace(object): # Python 2.7
|
||||
def __init__(self, **attr):
|
||||
self.__dict__.update(attr)
|
||||
|
||||
|
||||
class AlertManager(component.Component):
|
||||
"""AlertManager fetches and processes libtorrent alerts"""
|
||||
@@ -126,7 +134,7 @@ class AlertManager(component.Component):
|
||||
if log.isEnabledFor(logging.DEBUG):
|
||||
log.debug('Handling alert: %s', alert_type)
|
||||
# Copy alert attributes
|
||||
alert_copy = types.SimpleNamespace(
|
||||
alert_copy = SimpleNamespace(
|
||||
**{
|
||||
attr: getattr(alert, attr)
|
||||
for attr in dir(alert)
|
||||
|
@@ -119,7 +119,18 @@ def setup_translation():
|
||||
|
||||
libintl = None
|
||||
if deluge.common.windows_check():
|
||||
libintl = ctypes.cdll.LoadLibrary('libintl-8.dll')
|
||||
for intl in ('libintl-8.dll', 'intl.dll'):
|
||||
try:
|
||||
libintl = ctypes.cdll.LoadLibrary(intl)
|
||||
except OSError as ex:
|
||||
exception = ex
|
||||
else:
|
||||
break
|
||||
finally:
|
||||
if not libintl:
|
||||
log.error('Unable to initialize gettext/locale!')
|
||||
log.error(exception)
|
||||
setup_mock_translation()
|
||||
elif deluge.common.osx_check():
|
||||
libintl = ctypes.cdll.LoadLibrary('libintl.dylib')
|
||||
|
||||
|
@@ -89,7 +89,7 @@ else:
|
||||
# Test command exists and if not, remove.
|
||||
for command in required_cmds:
|
||||
if not which(command):
|
||||
for k, v in EXTRACT_COMMANDS.items():
|
||||
for k, v in list(EXTRACT_COMMANDS.items()):
|
||||
if command in v[0]:
|
||||
log.warning('%s not found, disabling support for %s', command, k)
|
||||
del EXTRACT_COMMANDS[k]
|
||||
|
36
deluge/tests/test_web_auth.py
Normal file
36
deluge/tests/test_web_auth.py
Normal file
@@ -0,0 +1,36 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
|
||||
# the additional special exception to link portions of this program with the OpenSSL library.
|
||||
# See LICENSE for more details.
|
||||
#
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from mock import patch
|
||||
from twisted.trial import unittest
|
||||
|
||||
from deluge.ui.web import auth
|
||||
|
||||
|
||||
class MockConfig(object):
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.config[key]
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
self.config[key] = value
|
||||
|
||||
|
||||
class WebAuthTestCase(unittest.TestCase):
|
||||
@patch('deluge.ui.web.auth.JSONComponent.__init__', return_value=None)
|
||||
def test_change_password(self, mock_json):
|
||||
config = MockConfig(
|
||||
{
|
||||
'pwd_sha1': '8d8ff487626141d2b91025901d3ab57211180b48',
|
||||
'pwd_salt': '7555d757710158655bd1646e207dee21a89e9226',
|
||||
}
|
||||
)
|
||||
webauth = auth.Auth(config)
|
||||
self.assertTrue(webauth.change_password('deluge', 'deluge_new'))
|
@@ -34,7 +34,12 @@ from deluge.httpdownloader import download_file
|
||||
from deluge.ui.client import client
|
||||
from deluge.ui.common import TorrentInfo
|
||||
|
||||
from .common import get_clipboard_text, listview_replace_treestore, reparent_iter
|
||||
from .common import (
|
||||
get_clipboard_text,
|
||||
listview_replace_treestore,
|
||||
reparent_iter,
|
||||
windowing,
|
||||
)
|
||||
from .dialogs import ErrorDialog
|
||||
from .edittrackersdialog import trackers_tiers_from_text
|
||||
from .path_chooser import PathChooser
|
||||
@@ -171,14 +176,17 @@ class AddTorrentDialog(component.Component):
|
||||
self.dialog.set_transient_for(None)
|
||||
self.dialog.set_position(Gtk.WindowPosition.CENTER)
|
||||
|
||||
self.dialog.present()
|
||||
if focus:
|
||||
timestamp = main_window.get_timestamp()
|
||||
try:
|
||||
if windowing('X11'):
|
||||
# Use present with X11 set_user_time since
|
||||
# present_with_time is inconsistent.
|
||||
self.dialog.present()
|
||||
self.dialog.get_window().set_user_time(timestamp)
|
||||
except AttributeError:
|
||||
# Not an X11 windowing system
|
||||
pass
|
||||
else:
|
||||
self.dialog.present_with_time(timestamp)
|
||||
else:
|
||||
self.dialog.present()
|
||||
|
||||
def hide(self):
|
||||
self.dialog.hide()
|
||||
|
@@ -16,7 +16,7 @@ import shutil
|
||||
import sys
|
||||
|
||||
import six.moves.cPickle as pickle # noqa: N813
|
||||
from gi.repository.Gdk import SELECTION_CLIPBOARD
|
||||
from gi.repository.Gdk import SELECTION_CLIPBOARD, Display
|
||||
from gi.repository.GdkPixbuf import Colorspace, Pixbuf
|
||||
from gi.repository.GLib import GError
|
||||
from gi.repository.Gtk import (
|
||||
@@ -389,3 +389,7 @@ def get_clipboard_text():
|
||||
)
|
||||
if text:
|
||||
return text.strip()
|
||||
|
||||
|
||||
def windowing(like):
|
||||
return like.lower() in str(type(Display.get_default())).lower()
|
||||
|
@@ -518,7 +518,7 @@ class FilesTab(Tab):
|
||||
return func(event)
|
||||
|
||||
def keypress_menu(self, event):
|
||||
self.file_menu.popup(None, None, None, 3, event.time)
|
||||
self.file_menu.popup(None, None, None, None, 3, event.time)
|
||||
return True
|
||||
|
||||
def keypress_f2(self, event):
|
||||
|
@@ -22,7 +22,6 @@ gi.require_version('Gtk', '3.0') # NOQA: E402
|
||||
gi.require_version('Gdk', '3.0') # NOQA: E402
|
||||
|
||||
# isort:imports-thirdparty
|
||||
from gi.repository.Gdk import Display
|
||||
from gi.repository.GLib import set_prgname
|
||||
from gi.repository.Gtk import Builder, ResponseType
|
||||
from twisted.internet import defer, gtk3reactor
|
||||
@@ -55,7 +54,7 @@ from deluge.ui.tracker_icons import TrackerIcons
|
||||
|
||||
# isort:imports-localfolder
|
||||
from .addtorrentdialog import AddTorrentDialog
|
||||
from .common import associate_magnet_links
|
||||
from .common import associate_magnet_links, windowing
|
||||
from .connectionmanager import ConnectionManager
|
||||
from .dialogs import YesNoDialog
|
||||
from .filtertreeview import FilterTreeView
|
||||
@@ -139,10 +138,6 @@ DEFAULT_PREFS = {
|
||||
}
|
||||
|
||||
|
||||
def windowing(like):
|
||||
return like.lower() in str(type(Display.get_default())).lower()
|
||||
|
||||
|
||||
class GtkUI(object):
|
||||
def __init__(self, args):
|
||||
# Setup gtkbuilder/glade translation
|
||||
|
@@ -13,6 +13,7 @@ import logging
|
||||
import os.path
|
||||
from hashlib import sha1 as sha
|
||||
|
||||
import gi
|
||||
from gi.repository import Gtk
|
||||
from gi.repository.Gdk import DragAction, WindowState
|
||||
from twisted.internet import reactor
|
||||
@@ -23,22 +24,23 @@ from deluge.common import decode_bytes, fspeed, resource_filename
|
||||
from deluge.configmanager import ConfigManager
|
||||
from deluge.ui.client import client
|
||||
|
||||
from .common import get_deluge_icon
|
||||
from .common import get_deluge_icon, windowing
|
||||
from .dialogs import PasswordDialog
|
||||
from .ipcinterface import process_args
|
||||
|
||||
try:
|
||||
import gi
|
||||
GdkX11 = None
|
||||
Wnck = None
|
||||
if windowing('X11'):
|
||||
try:
|
||||
from gi.repository import GdkX11
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
gi.require_version('Wnck', '3.0')
|
||||
from gi.repository import Wnck
|
||||
except ValueError:
|
||||
Wnck = None
|
||||
|
||||
try:
|
||||
from gi.repository import GdkX11
|
||||
except ImportError:
|
||||
GdkX11 = None
|
||||
try:
|
||||
gi.require_version('Wnck', '3.0')
|
||||
from gi.repository import Wnck
|
||||
except (ImportError, ValueError):
|
||||
pass
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -176,9 +178,14 @@ class MainWindow(component.Component):
|
||||
def restore():
|
||||
# Restore the proper x,y coords for the window prior to showing it
|
||||
component.resume(self.child_components)
|
||||
self.window.present()
|
||||
if GdkX11:
|
||||
self.window.get_window().set_user_time(self.get_timestamp())
|
||||
timestamp = self.get_timestamp()
|
||||
if windowing('X11'):
|
||||
# Use present with X11 set_user_time since
|
||||
# present_with_time is inconsistent.
|
||||
self.window.present()
|
||||
self.window.get_window().set_user_time(timestamp)
|
||||
else:
|
||||
self.window.present_with_time(timestamp)
|
||||
self.load_window_state()
|
||||
|
||||
if self.config['lock_tray'] and not self.visible():
|
||||
|
@@ -403,7 +403,7 @@ class StoredValuesList(ValueList):
|
||||
|
||||
menuitem_edit.connect('activate', on_edit_clicked, path)
|
||||
menuitem_remove.connect('activate', on_remove_clicked, path)
|
||||
self.path_list_popup.popup(None, None, None, event.button, time, data=path)
|
||||
self.path_list_popup.popup(None, None, None, path, event.button, time)
|
||||
self.path_list_popup.show_all()
|
||||
|
||||
def remove_selected_path(self):
|
||||
|
@@ -348,14 +348,14 @@ class PeersTab(Tab):
|
||||
log.debug('on_button_press_event')
|
||||
# We only care about right-clicks
|
||||
if self.torrent_id and event.button == 3:
|
||||
self.peer_menu.popup(None, None, None, event.button, event.time)
|
||||
self.peer_menu.popup(None, None, None, None, event.button, event.time)
|
||||
return True
|
||||
|
||||
def _on_query_tooltip(self, widget, x, y, keyboard_tip, tooltip):
|
||||
tooltip, x, y, model, path, _iter = widget.get_tooltip_context(
|
||||
is_tooltip, x, y, model, path, _iter = widget.get_tooltip_context(
|
||||
x, y, keyboard_tip
|
||||
)
|
||||
if tooltip:
|
||||
if is_tooltip:
|
||||
country_code = model.get(_iter, 5)[0]
|
||||
if country_code != ' ' and country_code in COUNTRIES:
|
||||
tooltip.set_text(COUNTRIES[country_code])
|
||||
|
@@ -930,5 +930,5 @@ class TorrentView(ListView, component.Component):
|
||||
return
|
||||
|
||||
torrentmenu = component.get('MenuBar').torrentmenu
|
||||
torrentmenu.popup(None, None, None, 3, event.time)
|
||||
torrentmenu.popup(None, None, None, None, 3, event.time)
|
||||
return True
|
||||
|
@@ -198,7 +198,7 @@ class Auth(JSONComponent):
|
||||
"""
|
||||
log.debug('Changing password')
|
||||
salt = hashlib.sha1(os.urandom(32)).hexdigest()
|
||||
s = hashlib.sha1(salt)
|
||||
s = hashlib.sha1(salt.encode('utf-8'))
|
||||
s.update(new_password.encode('utf8'))
|
||||
self.config['pwd_salt'] = salt
|
||||
self.config['pwd_sha1'] = s.hexdigest()
|
||||
|
@@ -202,7 +202,8 @@ class Flag(resource.Resource):
|
||||
return self
|
||||
|
||||
def render(self, request):
|
||||
path = ('ui', 'data', 'pixmaps', 'flags', request.country.lower() + '.png')
|
||||
flag = request.country.decode('utf-8').lower() + '.png'
|
||||
path = ('ui', 'data', 'pixmaps', 'flags', flag)
|
||||
filename = common.resource_filename('deluge', os.path.join(*path))
|
||||
if os.path.exists(filename):
|
||||
request.setHeader(
|
||||
@@ -570,7 +571,7 @@ class TopLevel(resource.Resource):
|
||||
def getChildWithDefault(self, path, request): # NOQA: N802
|
||||
# Calculate the request base
|
||||
header = request.getHeader(b'x-deluge-base')
|
||||
base = header if header else component.get('DelugeWeb').base
|
||||
base = header.decode('utf-8') if header else component.get('DelugeWeb').base
|
||||
|
||||
# validate the base parameter
|
||||
if not base:
|
||||
@@ -582,7 +583,7 @@ class TopLevel(resource.Resource):
|
||||
if base[-1] != '/':
|
||||
base += '/'
|
||||
|
||||
request.base = base.encode('idna')
|
||||
request.base = base.encode('utf-8')
|
||||
|
||||
return resource.Resource.getChildWithDefault(self, path, request)
|
||||
|
||||
|
@@ -5,3 +5,4 @@ This is a guide to help with developing Deluge.
|
||||
- [Tutorials](tutorials/index.md)
|
||||
- [How-to guides](how-to/index.md)
|
||||
- [Packaging](packaging/index.md)
|
||||
- [Changelog](../changelog.md)
|
||||
|
@@ -4,6 +4,7 @@
|
||||
|
||||
- Update [translation] `po` files from [Launchpad] account.
|
||||
- Changelog is updated with relevant commits and release date is added.
|
||||
- Docs [release notes] are updated.
|
||||
- Tag release in git and push upstream e.g.
|
||||
|
||||
git tag -a deluge-2.0.0 -m "Deluge 2.0.0 Release"
|
||||
@@ -18,7 +19,6 @@
|
||||
|
||||
twine upload dist/deluge-2.0.0.tar.gz dist/deluge-2.0.0-py3-none-any.whl
|
||||
|
||||
- Create packages (Ubuntu, Windows, OSX).
|
||||
- Calculate `sha256sum` for each file e.g.
|
||||
|
||||
cd dist; sha256sum deluge-2.0.0.tar.xz > deluge-2.0.0.tar.xz.sha256
|
||||
@@ -27,16 +27,17 @@
|
||||
- Ensure file permissions are global readable: `0644`
|
||||
- Sub-directories correspond to _major.minor_ version e.g. all `2.0.x` patch
|
||||
releases are stored in `source/2.0`.
|
||||
- Update latest release version in `version` files at `download.deluge-torrent.org`.
|
||||
- Change release version in `version` files.
|
||||
- Run `trigger-deluge` to sync OSUOSL ftp site.
|
||||
- Create packages (Ubuntu, Windows, OSX).
|
||||
- Ubuntu: https://code.launchpad.net/~deluge-team/+recipe/stable-releases
|
||||
|
||||
## Post-Release
|
||||
|
||||
- Update with version, hashes and release notes:
|
||||
- Publish docs on [ReadTheDocs].
|
||||
- ReleaseNotes (Create new version page and add link to this page)
|
||||
- Forum announcement
|
||||
- IRC welcome message
|
||||
- Website homepage version `/var/www/deluge-torrent.org/htdocs/index.php`
|
||||
- Forum announcement.
|
||||
- IRC welcome message.
|
||||
- [Wikipedia]
|
||||
- Close Trac milestone and add new milestone version for future tickets.
|
||||
- Ensure all stable branch commits are also applied to development branch.
|
||||
@@ -44,4 +45,5 @@
|
||||
[readthedocs]: https://deluge.readthedocs.io
|
||||
[wikipedia]: http://en.wikipedia.org/wiki/Deluge_%28software%29
|
||||
[launchpad]: https://translations.launchpad.net/deluge
|
||||
[translation]: ../contributing/translations.md
|
||||
[translation]: ../../contributing/translations.md
|
||||
[release notes]: ../../release/index.md
|
||||
|
@@ -9,7 +9,7 @@ Contents
|
||||
|
||||
Getting started <intro/index.md>
|
||||
How-to guides <how-to/index.md>
|
||||
Changelog <changelog.md>
|
||||
Release notes <releases/index.md>
|
||||
Contributing <contributing/index.md>
|
||||
Developer guide <devguide/index.md>
|
||||
Reference <reference/index.rst>
|
||||
|
@@ -9,7 +9,7 @@ feel free to make suggestions for improvement.
|
||||
|
||||
Until the stable PPA is updated, the development version of Deluge can be used:
|
||||
|
||||
sudo add-apt-repository -u ppa:deluge-team/develop
|
||||
sudo add-apt-repository -u ppa:deluge-team/stable
|
||||
sudo apt install deluge
|
||||
|
||||
### <i class="icon-python"></i> PyPi
|
||||
@@ -24,44 +24,32 @@ Install with pip:
|
||||
|
||||
## <i class="fa fa-windows"></i> Windows
|
||||
|
||||
There is no installer package currently for Windows, but can try Deluge as follows.
|
||||
Unfortuately due to move to GTK3 and Python 3 there is no installer package currently
|
||||
available for Windows.
|
||||
|
||||
1. Download and install [Python 3.6].
|
||||
2. Download and extract [gvsbuild] tarball to `C:\`.
|
||||
3. Open a terminal.
|
||||
4. Run this command to add `gvsbuild` directory to `PATH`:
|
||||
|
||||
set PATH=C:\gvsbuild\release;%PATH%
|
||||
|
||||
5. Install `gvsbuild` Python wheels:
|
||||
|
||||
pip install C:\gvsbuild\release\python\pycairo-1.18.0-cp36-cp36m-win_amd64.whl
|
||||
pip install C:\gvsbuild\release\python\PyGObject-3.32.0-cp36-cp36m-win_amd64.whl
|
||||
|
||||
6. Install Deluge:
|
||||
|
||||
pip install deluge deluge-libtorrent
|
||||
Intrepid users can install Deluge from seperate packages as detailed in [issue #3201].
|
||||
|
||||
## <i class="fa fa-apple"></i> macOS
|
||||
|
||||
There is no `.app` package currently for macOS, but can try Deluge with homebrew.
|
||||
|
||||
1. Install [Homebrew]
|
||||
2. Open a terminal.
|
||||
3. Run the following to install required packages:
|
||||
1. Install [Homebrew]
|
||||
2. Open a terminal.
|
||||
3. Run the following to install required packages:
|
||||
|
||||
brew install pyobject3 gtk+3 adwaita-icon-theme
|
||||
brew install libtorrent-rasterbar
|
||||
brew install pygobject3 gtk+3 adwaita-icon-theme
|
||||
brew install libtorrent-rasterbar
|
||||
|
||||
4. To fix translations:
|
||||
4. To fix translations:
|
||||
|
||||
brew link gettext --force
|
||||
brew link gettext --force
|
||||
|
||||
5. Install Deluge:
|
||||
5. Install Deluge:
|
||||
|
||||
pip3 install deluge
|
||||
pip3 install deluge
|
||||
|
||||
[develop ppa]: https://launchpad.net/~deluge-team/+archive/ubuntu/develop/
|
||||
[homebrew]: https://brew.sh/
|
||||
[python 3.6]: https://www.python.org/downloads/release/python-368/
|
||||
[gvsbuild]: https://ci.appveyor.com/api/buildjobs/b0y2sttcq3t1071q/artifacts/gvsbuild-vs14-x64.tar.gz
|
||||
[issue #3201]: https://dev.deluge-torrent.org/ticket/3201#comment:9
|
||||
|
@@ -1,16 +1,38 @@
|
||||
# Deluge Web UI
|
||||
|
||||
The Deluge web interface is intended to be a full featured interface built using
|
||||
the ExtJS framework, running on top of a Twisted webserver.
|
||||
The Deluge web interface is a full featured interface built using the ExtJS framework,
|
||||
running on top of a Twisted webserver.
|
||||
|
||||
## SSL Configuration
|
||||
|
||||
By default the web interface will use the same private key and certificate as
|
||||
the Deluge daemon. If you wish to use a different certificate/key (see
|
||||
[How to Create a SSL Certificate](http://www.yatblog.com/2007/02/27/how-to-create-a-ssl-certificate/))
|
||||
for information on creating one) you are able to specify which you want to use.
|
||||
the Deluge daemon. You can use a different certificate/key and specify it in the Web UI
|
||||
config, see below for details.
|
||||
|
||||
There are 2 ways to enable SSL encryption in the webserver, 1 is to specify it
|
||||
in your configuration (accessible via the Preferences window). The other is to
|
||||
add '--ssl' when running the webserver, which will override the configuration
|
||||
value and enable SSL.
|
||||
### Create SSL Certificate Examples
|
||||
|
||||
Sample guide: [How to Create a SSL Certificate][ssl cert]
|
||||
|
||||
#### Linux
|
||||
|
||||
openssl req -new -x509 -nodes -out deluge.cert.pem -keyout deluge.key.pem
|
||||
|
||||
#### Windows
|
||||
|
||||
C:\OpenSSL\bin\openssl.exe req -config C:\OpenSSL\bin\openssl.cnf -x509 -days 365 -newkey rsa:1024 -keyout hostkey.pem -nodes -out hostcert.pem
|
||||
|
||||
### Enable Web UI SSL
|
||||
|
||||
There are two ways to enable SSL encryption in the webserver:
|
||||
|
||||
- Specify in your config (accessible via the Preferences window).
|
||||
- Use `--ssl` when running the webserver, overriding the configuration value to enable SSL.
|
||||
|
||||
## Enable Development mode
|
||||
|
||||
Add `?dev=true` to the webui url to enable development mode, uses the source js files
|
||||
(if available) rather than compressed versions:
|
||||
|
||||
http://127.0.0.1:8112/?dev=true
|
||||
|
||||
[ssl cert]: http://www.yatblog.com/2007/02/27/how-to-create-a-ssl-certificate/
|
||||
|
56
docs/source/releases/2.0.md
Normal file
56
docs/source/releases/2.0.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# Deluge 2.0 release notes
|
||||
|
||||
Welcome to the latest release of Deluge, a long time in the making!
|
||||
|
||||
## What's new
|
||||
|
||||
Some of the highlights since the last major release.
|
||||
|
||||
- Migrated to Python 3 with minimal support retained for Python 2.7.
|
||||
- Shiny new logo.
|
||||
- Multi-user support.
|
||||
- Performance updates to handle thousands of torrents with faster loading times.
|
||||
- A New Console UI which emulates GTK/Web UIs.
|
||||
- GTK UI migrated to GTK3 with UI improvements and additions.
|
||||
- Magnet pre-fetching to allow file selection when adding torrent.
|
||||
- Fully support libtorrent 1.2 release.
|
||||
- Language switching support.
|
||||
- Improved documentation hosted on ReadTheDocs.
|
||||
- AutoAdd plugin replaces built-in functionality.
|
||||
- WebUI now daemonizes by default so service scripts will require `-d` option.
|
||||
|
||||
## Packaging
|
||||
|
||||
### PyPi
|
||||
|
||||
As well as the usual source tarball available for [download] we now have published
|
||||
Deluge on the PyPi software repository.
|
||||
|
||||
- https://pypi.org/project/deluge/
|
||||
|
||||
### Windows and MacOS
|
||||
|
||||
Unfortunately there are no packages yet for [Windows] or MacOS but they are being worked
|
||||
on. For now alternative [install] methods are available for testing.
|
||||
|
||||
## Upgrade considerations
|
||||
|
||||
Deluge 2.0 is not compatible with Deluge 1.x clients or daemons so these will require
|
||||
upgrading too. Also third-party Python scripts may not be compatible if they directly
|
||||
connect to the Deluge client and will need migrating.
|
||||
|
||||
Always make a backup of your [config] before a major version upgrade to guard against
|
||||
data loss.
|
||||
|
||||
Translations may not be as up-to date so please help out, see [translations] page.
|
||||
|
||||
Plugins written for Deluge 1.3 will need upgrading for Deluge 2.0, due to the
|
||||
requirement of Python 3 and GTK3 UI. There is a [update plugin] document to help
|
||||
Plugin authors update their plugins.
|
||||
|
||||
[update plugin]: ../devguide/how-to/update-1.3-plugin.md
|
||||
[windows]: https://dev.deluge-torrent.org/ticket/3201
|
||||
[install]: https://deluge.readthedocs.io/en/latest/intro/01-install.html
|
||||
[config]: https://dev.deluge-torrent.org/wiki/Faq#WheredoesDelugestoreitssettingsconfig
|
||||
[translations]: ../contributing/translations.md
|
||||
[download]: http://download.deluge-torrent.org/source/2.0/
|
10
docs/source/releases/index.md
Normal file
10
docs/source/releases/index.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# Release notes
|
||||
|
||||
A summary of the important changes in major releases of Deluge. For more details see
|
||||
the [changelog] or the [git commit log].
|
||||
|
||||
- [Changelog]
|
||||
- [Deluge 2.0 release notes](2.0.md)
|
||||
|
||||
[git commit log]: http://git.deluge-torrent.org/deluge/log/?h=master
|
||||
[changelog]: ../changelog.md
|
29
packaging/osx/launchd/org.deluge-torrent.deluge-web.plist
Normal file
29
packaging/osx/launchd/org.deluge-torrent.deluge-web.plist
Normal file
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>org.deluge-torrent.deluge-web</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/usr/local/bin/deluge-web</string>
|
||||
<string>-d</string>
|
||||
<string>-L</string>
|
||||
<string>error</string>
|
||||
<string>-l</string>
|
||||
<string>/var/log/deluge-web.log</string>
|
||||
</array>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/deluge-web.stdout</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/deluge-web.stderr</string>
|
||||
<!-- To enable running as 'deluge' user remove comments.
|
||||
<key>UserName</key>
|
||||
<string>deluge</string>
|
||||
-->
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
29
packaging/osx/launchd/org.deluge-torrent.deluged.plist
Normal file
29
packaging/osx/launchd/org.deluge-torrent.deluged.plist
Normal file
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>org.deluge-torrent.deluged</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/usr/local/bin/deluged</string>
|
||||
<string>-d</string>
|
||||
<string>-L</string>
|
||||
<string>error</string>
|
||||
<string>-l</string>
|
||||
<string>/var/log/deluged.log</string>
|
||||
</array>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/deluged.stdout</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/deluged.stderr</string>
|
||||
<!-- To enable running as 'deluge' user remove comments.
|
||||
<key>UserName</key>
|
||||
<string>deluge</string>
|
||||
-->
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
@@ -6,9 +6,6 @@ Wants=deluged.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
|
||||
User=deluge
|
||||
Group=deluge
|
||||
UMask=027
|
||||
|
||||
ExecStart=/usr/bin/deluge-web -d
|
||||
|
@@ -5,8 +5,6 @@ After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=deluge
|
||||
Group=deluge
|
||||
UMask=007
|
||||
|
||||
ExecStart=/usr/bin/deluged -d
|
||||
|
4
packaging/systemd/user.conf
Normal file
4
packaging/systemd/user.conf
Normal file
@@ -0,0 +1,4 @@
|
||||
# Override service user
|
||||
[Service]
|
||||
User=deluge
|
||||
Group=deluge
|
Reference in New Issue
Block a user