mirror of
https://git.deluge-torrent.org/deluge
synced 2025-08-09 18:08:39 +00:00
Fix #1281. Show a nice dialog stating that the client is incompatible on the GTK UI.
This commit is contained in:
parent
6151050ad4
commit
e383187796
4 changed files with 25 additions and 15 deletions
|
@ -55,14 +55,15 @@ except ImportError:
|
||||||
|
|
||||||
import deluge.component as component
|
import deluge.component as component
|
||||||
import deluge.configmanager
|
import deluge.configmanager
|
||||||
from deluge.core.authmanager import AUTH_LEVEL_NONE, AUTH_LEVEL_DEFAULT, AUTH_LEVEL_ADMIN
|
from deluge.core.authmanager import (AUTH_LEVEL_NONE, AUTH_LEVEL_DEFAULT,
|
||||||
|
AUTH_LEVEL_ADMIN)
|
||||||
from deluge.error import (DelugeError, NotAuthorizedError, _PassthroughError,
|
from deluge.error import (DelugeError, NotAuthorizedError, _PassthroughError,
|
||||||
IncompatibleClient)
|
IncompatibleClient)
|
||||||
|
|
||||||
RPC_RESPONSE = 1
|
RPC_RESPONSE = 1
|
||||||
RPC_ERROR = 2
|
RPC_ERROR = 2
|
||||||
RPC_EVENT = 3
|
RPC_EVENT = 3
|
||||||
RPC_EVENT_AUTH = 4
|
RPC_EVENT_EXCEPTION = 4
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -177,7 +178,8 @@ class DelugeRPCProtocol(Protocol):
|
||||||
|
|
||||||
for call in request:
|
for call in request:
|
||||||
if len(call) != 4:
|
if len(call) != 4:
|
||||||
log.debug("Received invalid rpc request: number of items in request is %s", len(call))
|
log.debug("Received invalid rpc request: number of items "
|
||||||
|
"in request is %s", len(call))
|
||||||
continue
|
continue
|
||||||
#log.debug("RPCRequest: %s", format_request(call))
|
#log.debug("RPCRequest: %s", format_request(call))
|
||||||
reactor.callLater(0, self.dispatch, *call)
|
reactor.callLater(0, self.dispatch, *call)
|
||||||
|
@ -198,7 +200,8 @@ class DelugeRPCProtocol(Protocol):
|
||||||
This method is called when a new client connects.
|
This method is called when a new client connects.
|
||||||
"""
|
"""
|
||||||
peer = self.transport.getPeer()
|
peer = self.transport.getPeer()
|
||||||
log.info("Deluge Client connection made from: %s:%s", peer.host, peer.port)
|
log.info("Deluge Client connection made from: %s:%s",
|
||||||
|
peer.host, peer.port)
|
||||||
# Set the initial auth level of this session to AUTH_LEVEL_NONE
|
# Set the initial auth level of this session to AUTH_LEVEL_NONE
|
||||||
self.factory.authorized_sessions[self.transport.sessionno] = AUTH_LEVEL_NONE
|
self.factory.authorized_sessions[self.transport.sessionno] = AUTH_LEVEL_NONE
|
||||||
|
|
||||||
|
@ -264,11 +267,7 @@ class DelugeRPCProtocol(Protocol):
|
||||||
try:
|
try:
|
||||||
client_version = kwargs.pop('client_version', None)
|
client_version = kwargs.pop('client_version', None)
|
||||||
if client_version is None:
|
if client_version is None:
|
||||||
raise IncompatibleClient(
|
raise IncompatibleClient(deluge.common.get_version())
|
||||||
"Your deluge client is not compatible with the daemon. "
|
|
||||||
"Please upgrade your client to %s" %
|
|
||||||
deluge.common.get_version()
|
|
||||||
)
|
|
||||||
ret = component.get("AuthManager").authorize(*args, **kwargs)
|
ret = component.get("AuthManager").authorize(*args, **kwargs)
|
||||||
if ret:
|
if ret:
|
||||||
self.factory.authorized_sessions[self.transport.sessionno] = (ret, args[0])
|
self.factory.authorized_sessions[self.transport.sessionno] = (ret, args[0])
|
||||||
|
@ -276,7 +275,7 @@ class DelugeRPCProtocol(Protocol):
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
if isinstance(e, _PassthroughError):
|
if isinstance(e, _PassthroughError):
|
||||||
self.sendData(
|
self.sendData(
|
||||||
(RPC_EVENT_AUTH, request_id,
|
(RPC_EVENT_EXCEPTION, request_id,
|
||||||
e.__class__.__name__,
|
e.__class__.__name__,
|
||||||
e._args, e._kwargs, args[0])
|
e._args, e._kwargs, args[0])
|
||||||
)
|
)
|
||||||
|
|
|
@ -66,7 +66,12 @@ class _PassthroughError(DelugeError):
|
||||||
return inst
|
return inst
|
||||||
|
|
||||||
class IncompatibleClient(_PassthroughError):
|
class IncompatibleClient(_PassthroughError):
|
||||||
pass
|
def __init__(self, daemon_version):
|
||||||
|
self.daemon_version = daemon_version
|
||||||
|
self.message = _(
|
||||||
|
"Your deluge client is not compatible with the daemon. "
|
||||||
|
"Please upgrade your client to %(daemon_version)s"
|
||||||
|
) % {'daemon_version': self.daemon_version}
|
||||||
|
|
||||||
class NotAuthorizedError(_PassthroughError):
|
class NotAuthorizedError(_PassthroughError):
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ else:
|
||||||
RPC_RESPONSE = 1
|
RPC_RESPONSE = 1
|
||||||
RPC_ERROR = 2
|
RPC_ERROR = 2
|
||||||
RPC_EVENT = 3
|
RPC_EVENT = 3
|
||||||
RPC_EVENT_AUTH = 4
|
RPC_EVENT_EXCEPTION = 4
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ class DelugeRPCProtocol(Protocol):
|
||||||
if message_type == RPC_RESPONSE:
|
if message_type == RPC_RESPONSE:
|
||||||
# Run the callbacks registered with this Deferred object
|
# Run the callbacks registered with this Deferred object
|
||||||
d.callback(request[2])
|
d.callback(request[2])
|
||||||
elif message_type == RPC_EVENT_AUTH:
|
elif message_type == RPC_EVENT_EXCEPTION:
|
||||||
# Recreate exception and errback'it
|
# Recreate exception and errback'it
|
||||||
d.errback(getattr(error, request[2])(*request[3], **request[4]))
|
d.errback(getattr(error, request[2])(*request[3], **request[4]))
|
||||||
elif message_type == RPC_ERROR:
|
elif message_type == RPC_ERROR:
|
||||||
|
|
|
@ -48,7 +48,7 @@ from deluge.ui.common import get_localhost_auth
|
||||||
from deluge.ui.client import client
|
from deluge.ui.client import client
|
||||||
import deluge.ui.client
|
import deluge.ui.client
|
||||||
from deluge.configmanager import ConfigManager
|
from deluge.configmanager import ConfigManager
|
||||||
from deluge.error import AuthenticationRequired, BadLoginError
|
from deluge.error import AuthenticationRequired, BadLoginError, IncompatibleClient
|
||||||
import dialogs
|
import dialogs
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
@ -512,7 +512,6 @@ class ConnectionManager(component.Component):
|
||||||
def __on_connected_failed(self, reason, host_id, host, port, user, passwd,
|
def __on_connected_failed(self, reason, host_id, host, port, user, passwd,
|
||||||
try_counter):
|
try_counter):
|
||||||
log.debug("Failed to connect: %s", reason.value)
|
log.debug("Failed to connect: %s", reason.value)
|
||||||
print reason, host_id, host, port, user, passwd, try_counter
|
|
||||||
|
|
||||||
if reason.check(AuthenticationRequired, BadLoginError):
|
if reason.check(AuthenticationRequired, BadLoginError):
|
||||||
log.debug("PasswordRequired exception")
|
log.debug("PasswordRequired exception")
|
||||||
|
@ -527,6 +526,13 @@ class ConnectionManager(component.Component):
|
||||||
d = dialog.run().addCallback(dialog_finished, host, port, user)
|
d = dialog.run().addCallback(dialog_finished, host, port, user)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
elif reason.trap(IncompatibleClient):
|
||||||
|
dialog = dialogs.ErrorDialog(
|
||||||
|
_("Incompatible Client"), reason.value.message
|
||||||
|
)
|
||||||
|
return dialog.run()
|
||||||
|
|
||||||
|
|
||||||
if try_counter:
|
if try_counter:
|
||||||
log.info("Retrying connection.. Retries left: %s", try_counter)
|
log.info("Retrying connection.. Retries left: %s", try_counter)
|
||||||
return reactor.callLater(
|
return reactor.callLater(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue