Philipp Hörist pushed to branch master at gajim / gajim
Commits:
7b23c100 by Philipp Hörist at 2019-12-21T10:37:51Z
HTTPUpload: Simplify code
- - - - -
1 changed file:
- gajim/common/modules/httpupload.py
Changes:
=====================================
gajim/common/modules/httpupload.py
=====================================
@@ -63,35 +63,22 @@ class HTTPUpload(BaseModule):
# pylint: enable=line-too-long
def pass_disco(self, info):
- if NS_HTTPUPLOAD_0 in info.features:
- self.httpupload_namespace = NS_HTTPUPLOAD_0
- else:
+ if not info.has_httpupload:
return
+ self.available = True
+ self.httpupload_namespace = NS_HTTPUPLOAD_0
self.component = info.jid
- self._log.info('Discovered component: %s', info.jid)
+ self.max_file_size = info.httpupload_max_file_size
- for form in info.dataforms:
- form_type = form.vars.get('FORM_TYPE')
- if (form_type is None or
- form_type.value != self.httpupload_namespace):
- continue
- size = form.vars.get('max-file-size')
- if size is not None:
- try:
- self.max_file_size = float(size.value)
- except Exception:
- self._log.info('Invalid file size: %s', size.value)
- size = None
- break
+ self._log.info('Discovered component: %s', info.jid)
if self.max_file_size is None:
self._log.warning('Component does not provide maximum file size')
else:
- self._log.info('Component has a maximum file size of: %s MiB',
- self.max_file_size / (1024 * 1024))
-
- self.available = True
+ size = GLib.format_size_full(self.max_file_size,
+ GLib.FormatSizeFlags.IEC_UNITS)
+ self._log.info('Component has a maximum file size of: %s', size)
for ctrl in app.interface.msg_win_mgr.get_controls(acct=self._account):
ctrl.update_actions()
View it on GitLab: https://dev.gajim.org/gajim/gajim/commit/7b23c1004fdc28c231c640508df7ebb6f5…
--
View it on GitLab: https://dev.gajim.org/gajim/gajim/commit/7b23c1004fdc28c231c640508df7ebb6f5…
You're receiving this email because of your account on dev.gajim.org.
Philipp Hörist pushed to branch master at gajim / python-nbxmpp
Commits:
c328063f by Philipp Hörist at 2019-12-21T10:35:51Z
DiscoInfo: Add propertys for http upload
- - - - -
1 changed file:
- nbxmpp/structs.py
Changes:
=====================================
nbxmpp/structs.py
=====================================
@@ -27,6 +27,7 @@ from nbxmpp.protocol import NS_MUC
from nbxmpp.protocol import NS_MUC_INFO
from nbxmpp.protocol import NS_CLIENT
from nbxmpp.protocol import NS_XHTML
+from nbxmpp.protocol import NS_HTTPUPLOAD_0
from nbxmpp.protocol import Protocol
from nbxmpp.const import MessageType
from nbxmpp.const import AvatarState
@@ -224,6 +225,10 @@ class DiscoInfo(namedtuple('DiscoInfo', 'stanza identities features dataforms ti
def has_mam(self):
return self.has_mam_1 or self.has_mam_2
+ @property
+ def has_httpupload(self):
+ return NS_HTTPUPLOAD_0 in self.features
+
@property
def is_muc(self):
for identity in self.identities:
@@ -332,6 +337,14 @@ class DiscoInfo(namedtuple('DiscoInfo', 'stanza identities features dataforms ti
def muc_is_unsecured(self):
return 'muc_unsecured' in self.features
+ @property
+ def httpupload_max_file_size(self):
+ size = self.get_field_value(NS_HTTPUPLOAD_0, 'max-file-size')
+ try:
+ return float(size)
+ except Exception:
+ return None
+
class DiscoIdentity(namedtuple('DiscoIdentity', 'category type name lang')):
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/c328063fa1a40884bac7b71f1b…
--
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/c328063fa1a40884bac7b71f1b…
You're receiving this email because of your account on dev.gajim.org.
Philipp Hörist pushed to branch master at gajim / python-nbxmpp
Commits:
0f2fa095 by Philipp Hörist at 2019-12-21T09:55:51Z
Add HTTP Upload (XEP-0363) support
- - - - -
4 changed files:
- nbxmpp/dispatcher.py
- + nbxmpp/modules/http_upload.py
- nbxmpp/structs.py
- nbxmpp/util.py
Changes:
=====================================
nbxmpp/dispatcher.py
=====================================
@@ -79,6 +79,7 @@ from nbxmpp.modules.attention import Attention
from nbxmpp.modules.security_labels import SecurityLabels
from nbxmpp.modules.chatstates import Chatstates
from nbxmpp.modules.register import Register
+from nbxmpp.modules.http_upload import HTTPUpload
from nbxmpp.modules.misc import unwrap_carbon
from nbxmpp.modules.misc import unwrap_mam
from nbxmpp.util import get_properties_struct
@@ -225,6 +226,7 @@ class XMPPDispatcher(PlugIn):
self._modules['SecurityLabels'] = SecurityLabels(self._owner)
self._modules['Chatstates'] = Chatstates(self._owner)
self._modules['Register'] = Register(self._owner)
+ self._modules['HTTPUpload'] = HTTPUpload(self._owner)
for instance in self._modules.values():
for handler in instance.handlers:
=====================================
nbxmpp/modules/http_upload.py
=====================================
@@ -0,0 +1,85 @@
+# Copyright (C) 2019 Philipp Hörist <philipp AT hoerist.com>
+#
+# This file is part of nbxmpp.
+#
+# This program 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.
+#
+# This program 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 this program; If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+
+from nbxmpp.protocol import NS_HTTPUPLOAD_0
+from nbxmpp.protocol import Iq
+from nbxmpp.protocol import isResultNode
+from nbxmpp.structs import HTTPUploadData
+from nbxmpp.util import call_on_response
+from nbxmpp.util import callback
+from nbxmpp.util import raise_error
+
+
+ALLOWED_HEADERS = ['Authorization', 'Cookie', 'Expires']
+
+log = logging.getLogger('nbxmpp.m.http_upload')
+
+
+class HTTPUpload:
+ def __init__(self, client):
+ self._client = client
+ self.handlers = []
+
+ @call_on_response('_received_slot')
+ def request_slot(self, jid, filename, size, content_type):
+ iq = Iq(typ='get', to=jid)
+ attr = {'filename': filename,
+ 'size': size,
+ 'content-type': content_type}
+ iq.setTag(name="request",
+ namespace=NS_HTTPUPLOAD_0,
+ attrs=attr)
+ return iq
+
+ @callback
+ def _received_slot(self, stanza):
+ if not isResultNode(stanza):
+ return raise_error(log.info, stanza)
+
+ slot = stanza.getTag('slot', namespace=NS_HTTPUPLOAD_0)
+ if slot is None:
+ return raise_error(log.warning, stanza, 'stanza-malformed',
+ 'No slot node found')
+
+ put_uri = slot.getTagAttr('put', 'url')
+ if put_uri is None:
+ return raise_error(log.warning, stanza, 'stanza-malformed',
+ 'No put uri found')
+
+ get_uri = slot.getTagAttr('get', 'url')
+ if get_uri is None:
+ return raise_error(log.warning, stanza, 'stanza-malformed',
+ 'No get uri found')
+
+ headers = {}
+ for header in slot.getTag('put').getTags('header'):
+ name = header.getAttr('name')
+ if name not in ALLOWED_HEADERS:
+ return raise_error(log.warning, stanza, 'stanza-malformed',
+ 'Not allowed header found: %s' % name)
+ data = header.getData()
+ if '\n' in data:
+ return raise_error(log.warning, stanza, 'stanza-malformed',
+ 'NNewline in header data found')
+
+ headers[name] = data
+
+ return HTTPUploadData(put_uri=put_uri,
+ get_uri=get_uri,
+ headers=headers)
=====================================
nbxmpp/structs.py
=====================================
@@ -136,6 +136,10 @@ RegisterData = namedtuple('RegisterData', 'instructions form fields_form oob_url
ChangePasswordResult = namedtuple('ChangePasswordResult', 'successful form')
ChangePasswordResult.__new__.__defaults__ = (None,)
+HTTPUploadData = namedtuple('HTTPUploadData', 'put_uri get_uri headers')
+HTTPUploadData.__new__.__defaults__ = (None,)
+
+
class DiscoInfo(namedtuple('DiscoInfo', 'stanza identities features dataforms timestamp')):
__slots__ = []
@@ -449,6 +453,25 @@ class CommonError:
payload=self._error_node))
+class HTTPUploadError(CommonError):
+ def __init__(self, stanza):
+ CommonError.__init__(self, stanza)
+
+ def get_max_file_size(self):
+ if not self.app_condition == 'file-too-large':
+ return None
+ node = self._error_node.getTag(self.app_condition)
+ try:
+ return float(node.getTagData('max-file-size'))
+ except Exception:
+ return None
+
+ def get_retry_date(self):
+ if not self.app_condition == 'retry':
+ return None
+ return self._error_node.getTagAttr('stamp')
+
+
class StanzaMalformedError(CommonError):
def __init__(self, stanza, text):
self._error_node = None
=====================================
nbxmpp/util.py
=====================================
@@ -28,11 +28,13 @@ import precis_i18n.codec
from nbxmpp.protocol import DiscoInfoMalformed
from nbxmpp.protocol import isErrorNode
from nbxmpp.protocol import NS_DATA
+from nbxmpp.protocol import NS_HTTPUPLOAD_0
from nbxmpp.structs import Properties
from nbxmpp.structs import IqProperties
from nbxmpp.structs import MessageProperties
from nbxmpp.structs import PresenceProperties
from nbxmpp.structs import CommonError
+from nbxmpp.structs import HTTPUploadError
from nbxmpp.structs import StanzaMalformedError
from nbxmpp.modules.dataforms import extend_form
from nbxmpp.third_party.hsluv import hsluv_to_rgb
@@ -139,7 +141,9 @@ def to_xs_boolean(value):
'Cant convert %s to xs:boolean' % value)
-error_classes = {}
+error_classes = {
+ NS_HTTPUPLOAD_0: HTTPUploadError
+}
def error_factory(stanza, condition=None, text=None):
if condition == 'stanza-malformed':
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/0f2fa095283bd467ecfc54877f…
--
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/0f2fa095283bd467ecfc54877f…
You're receiving this email because of your account on dev.gajim.org.
Philipp Hörist pushed to branch master at gajim / python-nbxmpp
Commits:
3d6df88c by Philipp Hörist at 2019-12-14T23:02:17Z
Add missing imports
- - - - -
1 changed file:
- nbxmpp/util.py
Changes:
=====================================
nbxmpp/util.py
=====================================
@@ -27,12 +27,14 @@ import precis_i18n.codec
from nbxmpp.protocol import DiscoInfoMalformed
from nbxmpp.protocol import isErrorNode
+from nbxmpp.protocol import NS_DATA
from nbxmpp.structs import Properties
from nbxmpp.structs import IqProperties
from nbxmpp.structs import MessageProperties
from nbxmpp.structs import PresenceProperties
from nbxmpp.structs import CommonError
from nbxmpp.structs import StanzaMalformedError
+from nbxmpp.modules.dataforms import extend_form
from nbxmpp.third_party.hsluv import hsluv_to_rgb
log = logging.getLogger('nbxmpp.util')
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/3d6df88c348a57a96a3ca95746…
--
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/3d6df88c348a57a96a3ca95746…
You're receiving this email because of your account on dev.gajim.org.