mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Merge branch 'ipv6' of https://github.com/qykth-git/calibre
This commit is contained in:
commit
725adf696f
@ -17,15 +17,23 @@ from calibre.utils.smtp import config as email_config
|
|||||||
|
|
||||||
def local_url_for_content_server():
|
def local_url_for_content_server():
|
||||||
from calibre.srv.opts import server_config
|
from calibre.srv.opts import server_config
|
||||||
|
from calibre.utils.network import is_ipv6_addr, get_fallback_server_addr
|
||||||
|
|
||||||
opts = server_config()
|
opts = server_config()
|
||||||
interface = opts.listen_on or '0.0.0.0'
|
interface = opts.listen_on or get_fallback_server_addr()
|
||||||
interface = {'0.0.0.0': '127.0.0.1', '::':'::1'}.get(interface)
|
|
||||||
|
addr_map = {'0.0.0.0': '127.0.0.1',
|
||||||
|
'::': '::1'}
|
||||||
|
if interface in addr_map:
|
||||||
|
interface = addr_map[interface]
|
||||||
|
|
||||||
protocol = 'https' if opts.ssl_certfile and opts.ssl_keyfile else 'http'
|
protocol = 'https' if opts.ssl_certfile and opts.ssl_keyfile else 'http'
|
||||||
prefix = opts.url_prefix or ''
|
prefix = opts.url_prefix or ''
|
||||||
|
|
||||||
port = opts.port
|
port = opts.port
|
||||||
if ':' in interface:
|
addr = f'[{interface}]' if is_ipv6_addr(interface) else f'{interface}'
|
||||||
interface = f'[{interface}]'
|
|
||||||
return f'{protocol}://{interface}:{port}{prefix}'
|
return f'{protocol}://{addr}:{port}{prefix}'
|
||||||
|
|
||||||
|
|
||||||
def open_in_browser():
|
def open_in_browser():
|
||||||
|
@ -1299,10 +1299,20 @@ class ConfigWidget(ConfigWidgetBase):
|
|||||||
self.stopping_msg.accept()
|
self.stopping_msg.accept()
|
||||||
|
|
||||||
def test_server(self):
|
def test_server(self):
|
||||||
|
from calibre.utils.network import is_ipv6_addr, get_fallback_server_addr
|
||||||
|
|
||||||
prefix = self.advanced_tab.get('url_prefix') or ''
|
prefix = self.advanced_tab.get('url_prefix') or ''
|
||||||
protocol = 'https' if self.advanced_tab.has_ssl else 'http'
|
protocol = 'https' if self.advanced_tab.has_ssl else 'http'
|
||||||
lo = self.advanced_tab.get('listen_on') or '0.0.0.0'
|
lo = self.advanced_tab.get('listen_on') or get_fallback_server_addr()
|
||||||
lo = {'0.0.0.0': '127.0.0.1', '::':'::1'}.get(lo)
|
|
||||||
|
addr_map = {'0.0.0.0': '127.0.0.1',
|
||||||
|
'::': '::1'}
|
||||||
|
if lo in addr_map:
|
||||||
|
lo = addr_map[lo]
|
||||||
|
|
||||||
|
if is_ipv6_addr(lo):
|
||||||
|
lo = f'[{lo}]'
|
||||||
|
|
||||||
url = '{protocol}://{interface}:{port}{prefix}'.format(
|
url = '{protocol}://{interface}:{port}{prefix}'.format(
|
||||||
protocol=protocol, interface=lo,
|
protocol=protocol, interface=lo,
|
||||||
port=self.main_tab.opt_port.value(), prefix=prefix)
|
port=self.main_tab.opt_port.value(), prefix=prefix)
|
||||||
|
@ -29,6 +29,7 @@ from calibre.utils.localization import _
|
|||||||
from calibre.utils.logging import ThreadSafeLog
|
from calibre.utils.logging import ThreadSafeLog
|
||||||
from calibre.utils.mdns import get_external_ip
|
from calibre.utils.mdns import get_external_ip
|
||||||
from calibre.utils.monotonic import monotonic
|
from calibre.utils.monotonic import monotonic
|
||||||
|
from calibre.utils.network import get_fallback_server_addr
|
||||||
from calibre.utils.socket_inheritance import set_socket_inherit
|
from calibre.utils.socket_inheritance import set_socket_inherit
|
||||||
from polyglot.builtins import iteritems
|
from polyglot.builtins import iteritems
|
||||||
from polyglot.queue import Empty, Full
|
from polyglot.queue import Empty, Full
|
||||||
@ -399,7 +400,7 @@ class ServerLoop:
|
|||||||
ba = (self.opts.listen_on, int(self.opts.port))
|
ba = (self.opts.listen_on, int(self.opts.port))
|
||||||
if not ba[0]:
|
if not ba[0]:
|
||||||
# AI_PASSIVE does not work with host of '' or None
|
# AI_PASSIVE does not work with host of '' or None
|
||||||
ba = ('0.0.0.0', ba[1])
|
ba = (get_fallback_server_addr(), ba[1])
|
||||||
self.bind_address = ba
|
self.bind_address = ba
|
||||||
self.bound_address = None
|
self.bound_address = None
|
||||||
self.connection_map = {}
|
self.connection_map = {}
|
||||||
@ -508,17 +509,23 @@ class ServerLoop:
|
|||||||
self.setup_socket()
|
self.setup_socket()
|
||||||
|
|
||||||
def serve(self):
|
def serve(self):
|
||||||
|
from calibre.utils.network import is_ipv6_addr
|
||||||
|
|
||||||
self.connection_map = {}
|
self.connection_map = {}
|
||||||
if not self.socket_was_preactivated:
|
if not self.socket_was_preactivated:
|
||||||
self.socket.listen(min(socket.SOMAXCONN, 128))
|
self.socket.listen(min(socket.SOMAXCONN, 128))
|
||||||
self.bound_address = ba = self.socket.getsockname()
|
self.bound_address = ba = self.socket.getsockname()
|
||||||
if isinstance(ba, tuple):
|
if isinstance(ba, tuple):
|
||||||
ba = ':'.join(map(str, ba))
|
if is_ipv6_addr(ba[0]):
|
||||||
|
addr = f'[{ba[0]}]'
|
||||||
|
else:
|
||||||
|
addr = f'{ba[0]}'
|
||||||
|
ba_str = f'{addr}:' + ':'.join(map(str, ba[1:]))
|
||||||
self.pool.start()
|
self.pool.start()
|
||||||
with TemporaryDirectory(prefix='srv-') as tdir:
|
with TemporaryDirectory(prefix='srv-') as tdir:
|
||||||
self.tdir = tdir
|
self.tdir = tdir
|
||||||
if self.LISTENING_MSG:
|
if self.LISTENING_MSG:
|
||||||
self.log(self.LISTENING_MSG, ba)
|
self.log(self.LISTENING_MSG, ba_str)
|
||||||
self.plugin_pool.start()
|
self.plugin_pool.start()
|
||||||
self.ready = True
|
self.ready = True
|
||||||
|
|
||||||
|
@ -110,8 +110,8 @@ raw_options = (
|
|||||||
' there are more than this number of items. Set to zero to disable.'),
|
' there are more than this number of items. Set to zero to disable.'),
|
||||||
|
|
||||||
_('The interface on which to listen for connections'),
|
_('The interface on which to listen for connections'),
|
||||||
'listen_on', '0.0.0.0',
|
'listen_on', None,
|
||||||
_('The default is to listen on all available IPv4 interfaces. You can change this to, for'
|
_('The default is to listen on all available IPv6 and IPv4 interfaces. You can change this to, for'
|
||||||
' example, "127.0.0.1" to only listen for connections from the local machine, or'
|
' example, "127.0.0.1" to only listen for connections from the local machine, or'
|
||||||
' to "::" to listen to all incoming IPv6 and IPv4 connections.'),
|
' to "::" to listen to all incoming IPv6 and IPv4 connections.'),
|
||||||
|
|
||||||
|
@ -77,6 +77,9 @@ def _get_external_ip():
|
|||||||
|
|
||||||
|
|
||||||
def verify_ipV4_address(ip_address):
|
def verify_ipV4_address(ip_address):
|
||||||
|
if ip_address == None:
|
||||||
|
return None
|
||||||
|
|
||||||
result = None
|
result = None
|
||||||
if ip_address != '0.0.0.0' and ip_address != '::':
|
if ip_address != '0.0.0.0' and ip_address != '::':
|
||||||
# do some more sanity checks on the address
|
# do some more sanity checks on the address
|
||||||
|
@ -108,3 +108,18 @@ def internet_connected():
|
|||||||
DummyNetworkStatus()
|
DummyNetworkStatus()
|
||||||
|
|
||||||
return internet_connected.checker()
|
return internet_connected.checker()
|
||||||
|
|
||||||
|
def is_ipv6_addr(addr):
|
||||||
|
import socket
|
||||||
|
try:
|
||||||
|
socket.inet_pton(socket.AF_INET6, addr)
|
||||||
|
return True
|
||||||
|
except OSError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_fallback_server_addr():
|
||||||
|
from socket import has_dualstack_ipv6
|
||||||
|
if has_dualstack_ipv6():
|
||||||
|
return '::'
|
||||||
|
else:
|
||||||
|
return '0.0.0.0'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user