diff sat/plugins/plugin_xep_0234.py @ 4037:524856bd7b19

massive refactoring to switch from camelCase to snake_case: historically, Libervia (SàT before) was using camelCase as allowed by PEP8 when using a pre-PEP8 code, to use the same coding style as in Twisted. However, snake_case is more readable and it's better to follow PEP8 best practices, so it has been decided to move on full snake_case. Because Libervia has a huge codebase, this ended with a ugly mix of camelCase and snake_case. To fix that, this patch does a big refactoring by renaming every function and method (including bridge) that are not coming from Twisted or Wokkel, to use fully snake_case. This is a massive change, and may result in some bugs.
author Goffi <goffi@goffi.org>
date Sat, 08 Apr 2023 13:54:42 +0200
parents 8e7d5796fb23
children 2ced30f6d5de
line wrap: on
line diff
--- a/sat/plugins/plugin_xep_0234.py	Fri Apr 07 15:18:39 2023 +0200
+++ b/sat/plugins/plugin_xep_0234.py	Sat Apr 08 13:54:42 2023 +0200
@@ -71,33 +71,33 @@
     def __init__(self, host):
         log.info(_("plugin Jingle File Transfer initialization"))
         self.host = host
-        host.registerNamespace("jingle-ft", NS_JINGLE_FT)
+        host.register_namespace("jingle-ft", NS_JINGLE_FT)
         self._j = host.plugins["XEP-0166"]  # shortcut to access jingle
-        self._j.registerApplication(NS_JINGLE_FT, self)
+        self._j.register_application(NS_JINGLE_FT, self)
         self._f = host.plugins["FILE"]
         self._f.register(self, priority=10000)
         self._hash = self.host.plugins["XEP-0300"]
-        host.bridge.addMethod(
-            "fileJingleSend",
+        host.bridge.add_method(
+            "file_jingle_send",
             ".plugin",
             in_sign="ssssa{ss}s",
             out_sign="",
-            method=self._fileSend,
+            method=self._file_send,
             async_=True,
         )
-        host.bridge.addMethod(
-            "fileJingleRequest",
+        host.bridge.add_method(
+            "file_jingle_request",
             ".plugin",
             in_sign="sssssa{ss}s",
             out_sign="s",
-            method=self._fileJingleRequest,
+            method=self._file_jingle_request,
             async_=True,
         )
 
-    def getHandler(self, client):
+    def get_handler(self, client):
         return XEP_0234_handler()
 
-    def getProgressId(self, session, content_name):
+    def get_progress_id(self, session, content_name):
         """Return a unique progress ID
 
         @param session(dict): jingle session
@@ -106,7 +106,7 @@
         """
         return "{}_{}".format(session["id"], content_name)
 
-    async def canHandleFileSend(self, client, peer_jid, filepath):
+    async def can_handle_file_send(self, client, peer_jid, filepath):
         if peer_jid.resource:
             return await self.host.hasFeature(client, NS_JINGLE_FT, peer_jid)
         else:
@@ -115,7 +115,7 @@
 
     # generic methods
 
-    def buildFileElement(
+    def build_file_element(
         self, client, name=None, file_hash=None, hash_algo=None, size=None,
         mime_type=None, desc=None, modified=None, transfer_range=None, path=None,
         namespace=None, file_elt=None, **kwargs):
@@ -168,11 +168,11 @@
                 range_elt["length"] = transfer_range.length
         if file_hash is not None:
             if not file_hash:
-                file_elt.addChild(self._hash.buildHashUsedElt())
+                file_elt.addChild(self._hash.build_hash_used_elt())
             else:
-                file_elt.addChild(self._hash.buildHashElt(file_hash, hash_algo))
+                file_elt.addChild(self._hash.build_hash_elt(file_hash, hash_algo))
         elif hash_algo is not None:
-            file_elt.addChild(self._hash.buildHashUsedElt(hash_algo))
+            file_elt.addChild(self._hash.build_hash_used_elt(hash_algo))
         self.host.trigger.point(
             "XEP-0234_buildFileElement", client, file_elt, extra_args=kwargs)
         if kwargs:
@@ -180,8 +180,8 @@
                 log.debug("ignored keyword: {}".format(kw))
         return file_elt
 
-    def buildFileElementFromDict(self, client, file_data, **kwargs):
-        """like buildFileElement but get values from a file_data dict
+    def build_file_element_from_dict(self, client, file_data, **kwargs):
+        """like build_file_element but get values from a file_data dict
 
         @param file_data(dict): metadata to use
         @param **kwargs: data to override
@@ -195,9 +195,9 @@
             )
         except KeyError:
             pass
-        return self.buildFileElement(client, **file_data)
+        return self.build_file_element(client, **file_data)
 
-    async def parseFileElement(
+    async def parse_file_element(
             self, client, file_elt, file_data=None, given=False, parent_elt=None,
             keep_empty_range=False):
         """Parse a <file> element and file dictionary accordingly
@@ -248,7 +248,7 @@
             name = "--"
             file_data["name"] = name
         elif name is not None and ("/" in name or "\\" in name):
-            file_data["name"] = regex.pathEscape(name)
+            file_data["name"] = regex.path_escape(name)
 
         try:
             file_data["mime_type"] = str(
@@ -284,7 +284,7 @@
         prefix = "given_" if given else ""
         hash_algo_key, hash_key = "hash_algo", prefix + "file_hash"
         try:
-            file_data[hash_algo_key], file_data[hash_key] = self._hash.parseHashElt(
+            file_data[hash_algo_key], file_data[hash_key] = self._hash.parse_hash_elt(
                 file_elt
             )
         except exceptions.NotFound:
@@ -296,7 +296,7 @@
 
     # bridge methods
 
-    def _fileSend(
+    def _file_send(
         self,
         peer_jid,
         filepath,
@@ -305,8 +305,8 @@
         extra=None,
         profile=C.PROF_KEY_NONE,
     ):
-        client = self.host.getClient(profile)
-        return defer.ensureDeferred(self.fileSend(
+        client = self.host.get_client(profile)
+        return defer.ensureDeferred(self.file_send(
             client,
             jid.JID(peer_jid),
             filepath,
@@ -315,7 +315,7 @@
             extra or None,
         ))
 
-    async def fileSend(
+    async def file_send(
         self, client, peer_jid, filepath, name, file_desc=None, extra=None
     ):
         """Send a file using jingle file transfer
@@ -351,11 +351,11 @@
         )
         return await progress_id_d
 
-    def _fileJingleRequest(
+    def _file_jingle_request(
             self, peer_jid, filepath, name="", file_hash="", hash_algo="", extra=None,
             profile=C.PROF_KEY_NONE):
-        client = self.host.getClient(profile)
-        return defer.ensureDeferred(self.fileJingleRequest(
+        client = self.host.get_client(profile)
+        return defer.ensureDeferred(self.file_jingle_request(
             client,
             jid.JID(peer_jid),
             filepath,
@@ -365,7 +365,7 @@
             extra or None,
         ))
 
-    async def fileJingleRequest(
+    async def file_jingle_request(
             self, client, peer_jid, filepath, name=None, file_hash=None, hash_algo=None,
             extra=None):
         """Request a file using jingle file transfer
@@ -407,12 +407,12 @@
 
     # jingle callbacks
 
-    def jingleDescriptionElt(
+    def jingle_description_elt(
         self, client, session, content_name, filepath, name, extra, progress_id_d
     ):
         return domish.Element((NS_JINGLE_FT, "description"))
 
-    def jingleSessionInit(
+    def jingle_session_init(
         self, client, session, content_name, filepath, name, extra, progress_id_d
     ):
         if extra is None:
@@ -424,13 +424,13 @@
                         keys=", ".join(EXTRA_ALLOWED)
                     )
                 )
-        progress_id_d.callback(self.getProgressId(session, content_name))
+        progress_id_d.callback(self.get_progress_id(session, content_name))
         content_data = session["contents"][content_name]
         application_data = content_data["application_data"]
         assert "file_path" not in application_data
         application_data["file_path"] = filepath
         file_data = application_data["file_data"] = {}
-        desc_elt = self.jingleDescriptionElt(
+        desc_elt = self.jingle_description_elt(
             client, session, content_name, filepath, name, extra, progress_id_d)
         file_elt = desc_elt.addElement("file")
 
@@ -449,7 +449,7 @@
                 file_data["namespace"] = extra["namespace"]
             if "path" in extra:
                 file_data["path"] = extra["path"]
-            self.buildFileElementFromDict(
+            self.build_file_element_from_dict(
                 client, file_data, file_elt=file_elt, file_hash="")
         else:
             # we request a file
@@ -462,16 +462,16 @@
                 file_data["file_hash"] = file_hash
                 file_data["hash_algo"] = extra["hash_algo"]
             else:
-                file_data["hash_algo"] = self._hash.getDefaultAlgo()
+                file_data["hash_algo"] = self._hash.get_default_algo()
             if "namespace" in extra:
                 file_data["namespace"] = extra["namespace"]
             if "path" in extra:
                 file_data["path"] = extra["path"]
-            self.buildFileElementFromDict(client, file_data, file_elt=file_elt)
+            self.build_file_element_from_dict(client, file_data, file_elt=file_elt)
 
         return desc_elt
 
-    async def jingleRequestConfirmation(
+    async def jingle_request_confirmation(
         self, client, action, session, content_name, desc_elt
     ):
         """This method request confirmation for a jingle session"""
@@ -485,11 +485,11 @@
             file_elt = next(desc_elt.elements(NS_JINGLE_FT, "file"))
         except StopIteration:
             raise failure.Failure(exceptions.DataError)
-        file_data = {"progress_id": self.getProgressId(session, content_name)}
+        file_data = {"progress_id": self.get_progress_id(session, content_name)}
 
         if senders == self._j.ROLE_RESPONDER:
             # we send the file
-            return await self._fileSendingRequestConf(
+            return await self._file_sending_request_conf(
                 client, session, content_data, content_name, file_data, file_elt
             )
         else:
@@ -498,16 +498,16 @@
                 client, session, content_data, content_name, file_data, file_elt
             )
 
-    async def _fileSendingRequestConf(
+    async def _file_sending_request_conf(
         self, client, session, content_data, content_name, file_data, file_elt
     ):
         """parse file_elt, and handle file retrieving/permission checking"""
-        await self.parseFileElement(client, file_elt, file_data)
+        await self.parse_file_element(client, file_elt, file_data)
         content_data["application_data"]["file_data"] = file_data
         finished_d = content_data["finished_d"] = defer.Deferred()
 
         # confirmed_d is a deferred returning confimed value (only used if cont is False)
-        cont, confirmed_d = self.host.trigger.returnPoint(
+        cont, confirmed_d = self.host.trigger.return_point(
             "XEP-0234_fileSendingRequest",
             client,
             session,
@@ -521,7 +521,7 @@
             if confirmed:
                 args = [client, session, content_name, content_data]
                 finished_d.addCallbacks(
-                    self._finishedCb, self._finishedEb, args, None, args
+                    self._finished_cb, self._finished_eb, args, None, args
                 )
             return confirmed
 
@@ -532,18 +532,18 @@
         self, client, session, content_data, content_name, file_data, file_elt
     ):
         """parse file_elt, and handle user permission/file opening"""
-        await self.parseFileElement(client, file_elt, file_data, given=True)
+        await self.parse_file_element(client, file_elt, file_data, given=True)
         try:
-            hash_algo, file_data["given_file_hash"] = self._hash.parseHashElt(file_elt)
+            hash_algo, file_data["given_file_hash"] = self._hash.parse_hash_elt(file_elt)
         except exceptions.NotFound:
             try:
-                hash_algo = self._hash.parseHashUsedElt(file_elt)
+                hash_algo = self._hash.parse_hash_used_elt(file_elt)
             except exceptions.NotFound:
                 raise failure.Failure(exceptions.DataError)
 
         if hash_algo is not None:
             file_data["hash_algo"] = hash_algo
-            file_data["hash_hasher"] = hasher = self._hash.getHasher(hash_algo)
+            file_data["hash_hasher"] = hasher = self._hash.get_hasher(hash_algo)
             file_data["data_cb"] = lambda data: hasher.update(data)
 
         try:
@@ -564,21 +564,21 @@
 
         # deferred to track end of transfer
         finished_d = content_data["finished_d"] = defer.Deferred()
-        confirmed = await self._f.getDestDir(
+        confirmed = await self._f.get_dest_dir(
             client, session["peer_jid"], content_data, file_data, stream_object=True
         )
         if confirmed:
-            await self.host.trigger.asyncPoint(
+            await self.host.trigger.async_point(
                 "XEP-0234_file_receiving_request_conf",
                 client, session, content_data, file_elt
             )
             args = [client, session, content_name, content_data]
             finished_d.addCallbacks(
-                self._finishedCb, self._finishedEb, args, None, args
+                self._finished_cb, self._finished_eb, args, None, args
             )
         return confirmed
 
-    async def jingleHandler(self, client, action, session, content_name, desc_elt):
+    async def jingle_handler(self, client, action, session, content_name, desc_elt):
         content_data = session["contents"][content_name]
         application_data = content_data["application_data"]
         if action in (self._j.A_ACCEPTED_ACK,):
@@ -608,8 +608,8 @@
                     size = None
                 # XXX: hash security is not critical here, so we just take the higher
                 #      mandatory one
-                hasher = file_data["hash_hasher"] = self._hash.getHasher()
-                progress_id = self.getProgressId(session, content_name)
+                hasher = file_data["hash_hasher"] = self._hash.get_hasher()
+                progress_id = self.get_progress_id(session, content_name)
                 try:
                     content_data["stream_object"] = stream.FileStreamObject(
                         self.host,
@@ -621,7 +621,7 @@
                         data_cb=lambda data: hasher.update(data),
                     )
                 except Exception as e:
-                    self.host.bridge.progressError(
+                    self.host.bridge.progress_error(
                         progress_id, C.PROGRESS_ERROR_FAILED, client.profile
                     )
                     await self._j.terminate(
@@ -632,19 +632,19 @@
                 size = file_data["size"]
                 # XXX: hash security is not critical here, so we just take the higher
                 #      mandatory one
-                hasher = file_data["hash_hasher"] = self._hash.getHasher()
+                hasher = file_data["hash_hasher"] = self._hash.get_hasher()
                 content_data["stream_object"] = stream.FileStreamObject(
                     self.host,
                     client,
                     file_path,
-                    uid=self.getProgressId(session, content_name),
+                    uid=self.get_progress_id(session, content_name),
                     size=size,
                     data_cb=lambda data: hasher.update(data),
                 )
             finished_d = content_data["finished_d"] = defer.Deferred()
             args = [client, session, content_name, content_data]
-            finished_d.addCallbacks(self._finishedCb, self._finishedEb, args, None, args)
-            await self.host.trigger.asyncPoint(
+            finished_d.addCallbacks(self._finished_cb, self._finished_eb, args, None, args)
+            await self.host.trigger.async_point(
                 "XEP-0234_jingle_handler",
                 client, session, content_data, desc_elt
             )
@@ -652,7 +652,7 @@
             log.warning("FIXME: unmanaged action {}".format(action))
         return desc_elt
 
-    def jingleSessionInfo(self, client, action, session, content_name, jingle_elt):
+    def jingle_session_info(self, client, action, session, content_name, jingle_elt):
         """Called on session-info action
 
         manage checksum, and ignore <received/> element
@@ -681,7 +681,7 @@
                     file_elt = next(elt.elements(NS_JINGLE_FT, "file"))
                 except StopIteration:
                     raise exceptions.DataError
-                algo, file_data["given_file_hash"] = self._hash.parseHashElt(file_elt)
+                algo, file_data["given_file_hash"] = self._hash.parse_hash_elt(file_elt)
                 if algo != file_data.get("hash_algo"):
                     log.warning(
                         "Hash algorithm used in given hash ({peer_algo}) doesn't correspond to the one we have used ({our_algo}) [{profile}]".format(
@@ -691,21 +691,21 @@
                         )
                     )
                 else:
-                    self._receiverTryTerminate(
+                    self._receiver_try_terminate(
                         client, session, content_name, content_data
                     )
             else:
                 raise NotImplementedError
 
-    def jingleTerminate(self, client, action, session, content_name, jingle_elt):
+    def jingle_terminate(self, client, action, session, content_name, jingle_elt):
         if jingle_elt.decline:
             # progress is the only way to tell to frontends that session has been declined
-            progress_id = self.getProgressId(session, content_name)
-            self.host.bridge.progressError(
+            progress_id = self.get_progress_id(session, content_name)
+            self.host.bridge.progress_error(
                 progress_id, C.PROGRESS_ERROR_DECLINED, client.profile
             )
         elif not jingle_elt.success:
-            progress_id = self.getProgressId(session, content_name)
+            progress_id = self.get_progress_id(session, content_name)
             first_child = jingle_elt.firstChildElement()
             if first_child is not None:
                 reason = first_child.name
@@ -713,25 +713,25 @@
                     reason = f"{reason} - {jingle_elt.text}"
             else:
                 reason = C.PROGRESS_ERROR_FAILED
-            self.host.bridge.progressError(
+            self.host.bridge.progress_error(
                 progress_id, reason, client.profile
             )
 
-    def _sendCheckSum(self, client, session, content_name, content_data):
+    def _send_check_sum(self, client, session, content_name, content_data):
         """Send the session-info with the hash checksum"""
         file_data = content_data["application_data"]["file_data"]
         hasher = file_data["hash_hasher"]
         hash_ = hasher.hexdigest()
         log.debug("Calculated hash: {}".format(hash_))
-        iq_elt, jingle_elt = self._j.buildSessionInfo(client, session)
+        iq_elt, jingle_elt = self._j.build_session_info(client, session)
         checksum_elt = jingle_elt.addElement((NS_JINGLE_FT, "checksum"))
         checksum_elt["creator"] = content_data["creator"]
         checksum_elt["name"] = content_name
         file_elt = checksum_elt.addElement("file")
-        file_elt.addChild(self._hash.buildHashElt(hash_))
+        file_elt.addChild(self._hash.build_hash_elt(hash_))
         iq_elt.send()
 
-    def _receiverTryTerminate(
+    def _receiver_try_terminate(
         self, client, session, content_name, content_data, last_try=False
     ):
         """Try to terminate the session
@@ -753,7 +753,7 @@
                         profile=client.profile
                     )
                 )
-                self._j.delayedContentTerminate(client, session, content_name)
+                self._j.delayed_content_terminate(client, session, content_name)
                 content_data["stream_object"].close()
                 return True
             return False
@@ -775,7 +775,7 @@
                 algo=file_data["hash_algo"], given=given_hash, our=hash_
             )
 
-        self._j.delayedContentTerminate(client, session, content_name)
+        self._j.delayed_content_terminate(client, session, content_name)
         content_data["stream_object"].close(progress_metadata, error)
         # we may have the last_try timer still active, so we try to cancel it
         try:
@@ -784,19 +784,19 @@
             pass
         return True
 
-    def _finishedCb(self, __, client, session, content_name, content_data):
+    def _finished_cb(self, __, client, session, content_name, content_data):
         log.info("File transfer terminated")
         if content_data["senders"] != session["role"]:
             # we terminate the session only if we are the receiver,
             # as recommanded in XEP-0234 §2 (after example 6)
             content_data["transfer_finished"] = True
-            if not self._receiverTryTerminate(
+            if not self._receiver_try_terminate(
                 client, session, content_name, content_data
             ):
                 # we have not received the hash yet, we wait 5 more seconds
                 content_data["last_try_timer"] = reactor.callLater(
                     5,
-                    self._receiverTryTerminate,
+                    self._receiver_try_terminate,
                     client,
                     session,
                     content_name,
@@ -805,13 +805,13 @@
                 )
         else:
             # we are the sender, we send the checksum
-            self._sendCheckSum(client, session, content_name, content_data)
+            self._send_check_sum(client, session, content_name, content_data)
             content_data["stream_object"].close()
 
-    def _finishedEb(self, failure, client, session, content_name, content_data):
+    def _finished_eb(self, failure, client, session, content_name, content_data):
         log.warning("Error while streaming file: {}".format(failure))
         content_data["stream_object"].close()
-        self._j.contentTerminate(
+        self._j.content_terminate(
             client, session, content_name, reason=self._j.REASON_FAILED_TRANSPORT
         )