[preview] Use account proxy if available
This commit is contained in:
@@ -35,6 +35,7 @@ from gajim.common.helpers import open_uri
|
|||||||
from gajim.common.helpers import write_file_async
|
from gajim.common.helpers import write_file_async
|
||||||
from gajim.common.helpers import load_file_async
|
from gajim.common.helpers import load_file_async
|
||||||
from gajim.common.helpers import get_tls_error_phrase
|
from gajim.common.helpers import get_tls_error_phrase
|
||||||
|
from gajim.common.helpers import get_user_proxy
|
||||||
from gajim.gtk.dialogs import ErrorDialog
|
from gajim.gtk.dialogs import ErrorDialog
|
||||||
from gajim.gtk.filechoosers import FileSaveDialog
|
from gajim.gtk.filechoosers import FileSaveDialog
|
||||||
from gajim.gtk.util import load_icon
|
from gajim.gtk.util import load_icon
|
||||||
@@ -119,11 +120,7 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
'VERIFY': (True, ''),}
|
'VERIFY': (True, ''),}
|
||||||
|
|
||||||
self._textviews = {}
|
self._textviews = {}
|
||||||
|
self._sessions = {}
|
||||||
self._session = Soup.Session()
|
|
||||||
self._session.add_feature_by_type(Soup.ContentSniffer)
|
|
||||||
self._session.props.https_aliases = ['aesgcm']
|
|
||||||
self._session.props.ssl_strict = False
|
|
||||||
|
|
||||||
self._orig_dir = Path(configpaths.get('MY_DATA')) / 'downloads'
|
self._orig_dir = Path(configpaths.get('MY_DATA')) / 'downloads'
|
||||||
self._thumb_dir = Path(configpaths.get('MY_CACHE')) / 'downloads.thumb'
|
self._thumb_dir = Path(configpaths.get('MY_CACHE')) / 'downloads.thumb'
|
||||||
@@ -142,12 +139,18 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
self.config['LEFTCLICK_ACTION'] = action[:-9]
|
self.config['LEFTCLICK_ACTION'] = action[:-9]
|
||||||
|
|
||||||
def _on_connect_chat_control_base(self, chat_control):
|
def _on_connect_chat_control_base(self, chat_control):
|
||||||
|
account = chat_control.account
|
||||||
|
if account not in self._sessions:
|
||||||
|
self._sessions[account] = self._create_session(account)
|
||||||
self._textviews[chat_control.control_id] = chat_control.conv_textview
|
self._textviews[chat_control.control_id] = chat_control.conv_textview
|
||||||
|
|
||||||
def _on_disconnect_chat_control_base(self, chat_control):
|
def _on_disconnect_chat_control_base(self, chat_control):
|
||||||
self._textviews.pop(chat_control.control_id, None)
|
self._textviews.pop(chat_control.control_id, None)
|
||||||
|
|
||||||
def _on_connect_history_window(self, history_window):
|
def _on_connect_history_window(self, history_window):
|
||||||
|
account = history_window.account
|
||||||
|
if (account is not None and account not in self._sessions):
|
||||||
|
self._sessions[account] = self._create_session(account)
|
||||||
self._textviews[id(history_window)] = history_window.history_textview
|
self._textviews[id(history_window)] = history_window.history_textview
|
||||||
|
|
||||||
def _on_disconnect_history_window(self, history_window):
|
def _on_disconnect_history_window(self, history_window):
|
||||||
@@ -158,6 +161,24 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
if textview == textview_:
|
if textview == textview_:
|
||||||
return control_id
|
return control_id
|
||||||
|
|
||||||
|
def _create_session(self, account):
|
||||||
|
session = Soup.Session()
|
||||||
|
session.add_feature_by_type(Soup.ContentSniffer)
|
||||||
|
session.props.https_aliases = ['aesgcm']
|
||||||
|
session.props.ssl_strict = False
|
||||||
|
|
||||||
|
proxy = get_user_proxy(account)
|
||||||
|
if proxy is None:
|
||||||
|
resolver = None
|
||||||
|
else:
|
||||||
|
resolver = proxy.get_resolver()
|
||||||
|
|
||||||
|
session.props.proxy_resolver = resolver
|
||||||
|
return session, resolver
|
||||||
|
|
||||||
|
def _get_session(self, account):
|
||||||
|
return self._sessions[account][0]
|
||||||
|
|
||||||
def _print_real_text(self, textview, text, _text_tags, _graphics,
|
def _print_real_text(self, textview, text, _text_tags, _graphics,
|
||||||
iter_, additional_data):
|
iter_, additional_data):
|
||||||
|
|
||||||
@@ -182,7 +203,8 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
preview = self._process_geo_uri(uri,
|
preview = self._process_geo_uri(uri,
|
||||||
start_mark,
|
start_mark,
|
||||||
end_mark,
|
end_mark,
|
||||||
control_id)
|
control_id,
|
||||||
|
textview.account)
|
||||||
if preview is None:
|
if preview is None:
|
||||||
return
|
return
|
||||||
pixbuf = load_icon('map',
|
pixbuf = load_icon('map',
|
||||||
@@ -196,7 +218,8 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
urlparts,
|
urlparts,
|
||||||
start_mark,
|
start_mark,
|
||||||
end_mark,
|
end_mark,
|
||||||
control_id)
|
control_id,
|
||||||
|
textview.account)
|
||||||
|
|
||||||
if not preview.orig_exists():
|
if not preview.orig_exists():
|
||||||
self._download_content(preview)
|
self._download_content(preview)
|
||||||
@@ -257,7 +280,11 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _process_geo_uri(uri, start_mark, end_mark, control_id):
|
def _process_geo_uri(uri,
|
||||||
|
start_mark,
|
||||||
|
end_mark,
|
||||||
|
control_id,
|
||||||
|
account):
|
||||||
try:
|
try:
|
||||||
split_geo_uri(uri)
|
split_geo_uri(uri)
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
@@ -272,9 +299,17 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
start_mark,
|
start_mark,
|
||||||
end_mark,
|
end_mark,
|
||||||
96,
|
96,
|
||||||
control_id)
|
control_id,
|
||||||
|
account)
|
||||||
|
|
||||||
|
def _process_web_uri(self,
|
||||||
|
uri,
|
||||||
|
urlparts,
|
||||||
|
start_mark,
|
||||||
|
end_mark,
|
||||||
|
control_id,
|
||||||
|
account):
|
||||||
|
|
||||||
def _process_web_uri(self, uri, urlparts, start_mark, end_mark, control_id):
|
|
||||||
size = self.config['PREVIEW_SIZE']
|
size = self.config['PREVIEW_SIZE']
|
||||||
orig_path, thumb_path = get_image_paths(uri,
|
orig_path, thumb_path = get_image_paths(uri,
|
||||||
urlparts,
|
urlparts,
|
||||||
@@ -288,7 +323,8 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
start_mark,
|
start_mark,
|
||||||
end_mark,
|
end_mark,
|
||||||
size,
|
size,
|
||||||
control_id)
|
control_id,
|
||||||
|
account)
|
||||||
|
|
||||||
def _on_orig_load_finished(self, data, error, preview):
|
def _on_orig_load_finished(self, data, error, preview):
|
||||||
if data is None:
|
if data is None:
|
||||||
@@ -312,13 +348,19 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
self._update_textview(pixbuf, preview)
|
self._update_textview(pixbuf, preview)
|
||||||
|
|
||||||
def _download_content(self, preview):
|
def _download_content(self, preview):
|
||||||
|
if preview.account is None:
|
||||||
|
# History Window can be opened without account context
|
||||||
|
# This means we can not apply proxy settings
|
||||||
|
return
|
||||||
log.info('Start downloading: %s', preview.request_uri)
|
log.info('Start downloading: %s', preview.request_uri)
|
||||||
message = Soup.Message.new('GET', preview.request_uri)
|
message = Soup.Message.new('GET', preview.request_uri)
|
||||||
message.connect('starting', self._check_certificate)
|
message.connect('starting', self._check_certificate, preview)
|
||||||
message.connect('content-sniffed', self._on_content_sniffed)
|
message.connect('content-sniffed', self._on_content_sniffed, preview)
|
||||||
self._session.queue_message(message, self._on_finished, preview)
|
|
||||||
|
|
||||||
def _check_certificate(self, message):
|
session = self._get_session(preview.account)
|
||||||
|
session.queue_message(message, self._on_finished, preview)
|
||||||
|
|
||||||
|
def _check_certificate(self, message, preview):
|
||||||
_https_used, _tls_certificate, tls_errors = message.get_https_status()
|
_https_used, _tls_certificate, tls_errors = message.get_https_status()
|
||||||
|
|
||||||
if not self.config['VERIFY']:
|
if not self.config['VERIFY']:
|
||||||
@@ -327,21 +369,23 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
if tls_errors:
|
if tls_errors:
|
||||||
phrase = get_tls_error_phrase(tls_errors)
|
phrase = get_tls_error_phrase(tls_errors)
|
||||||
log.warning('TLS verification failed: %s', phrase)
|
log.warning('TLS verification failed: %s', phrase)
|
||||||
self._session.cancel_message(message, Soup.Status.CANCELLED)
|
session = self._get_session(preview.account)
|
||||||
|
session.cancel_message(message, Soup.Status.CANCELLED)
|
||||||
return
|
return
|
||||||
|
|
||||||
def _on_content_sniffed(self, message, type_, _params):
|
def _on_content_sniffed(self, message, type_, _params, preview):
|
||||||
size = message.props.response_headers.get_content_length()
|
size = message.props.response_headers.get_content_length()
|
||||||
uri = message.props.uri.to_string(False)
|
uri = message.props.uri.to_string(False)
|
||||||
|
session = self._get_session(preview.account)
|
||||||
if type_ not in ACCEPTED_MIME_TYPES:
|
if type_ not in ACCEPTED_MIME_TYPES:
|
||||||
log.info('Not allowed content type: %s, %s', type_, uri)
|
log.info('Not allowed content type: %s, %s', type_, uri)
|
||||||
self._session.cancel_message(message, Soup.Status.CANCELLED)
|
session.cancel_message(message, Soup.Status.CANCELLED)
|
||||||
return
|
return
|
||||||
|
|
||||||
if size == 0 or size > int(self.config['MAX_FILE_SIZE']):
|
if size == 0 or size > int(self.config['MAX_FILE_SIZE']):
|
||||||
log.info('File size (%s) too big or unknown (zero) for URL: \'%s\'',
|
log.info('File size (%s) too big or unknown (zero) for URL: \'%s\'',
|
||||||
size, uri)
|
size, uri)
|
||||||
self._session.cancel_message(message, Soup.Status.CANCELLED)
|
session.cancel_message(message, Soup.Status.CANCELLED)
|
||||||
return
|
return
|
||||||
|
|
||||||
def _on_finished(self, _session, message, preview):
|
def _on_finished(self, _session, message, preview):
|
||||||
@@ -499,7 +543,7 @@ class UrlImagePreviewPlugin(GajimPlugin):
|
|||||||
|
|
||||||
class Preview:
|
class Preview:
|
||||||
def __init__(self, uri, urlparts, orig_path, thumb_path,
|
def __init__(self, uri, urlparts, orig_path, thumb_path,
|
||||||
start_mark, end_mark, size, control_id):
|
start_mark, end_mark, size, control_id, account):
|
||||||
self._uri = uri
|
self._uri = uri
|
||||||
self._urlparts = urlparts
|
self._urlparts = urlparts
|
||||||
self._filename = filename_from_uri(self._uri)
|
self._filename = filename_from_uri(self._uri)
|
||||||
@@ -510,6 +554,7 @@ class Preview:
|
|||||||
self.start_mark = start_mark
|
self.start_mark = start_mark
|
||||||
self.end_mark = end_mark
|
self.end_mark = end_mark
|
||||||
self.thumbnail = None
|
self.thumbnail = None
|
||||||
|
self.account = account
|
||||||
|
|
||||||
self.key, self.iv = None, None
|
self.key, self.iv = None, None
|
||||||
if self.is_aes_encrypted:
|
if self.is_aes_encrypted:
|
||||||
|
|||||||
Reference in New Issue
Block a user