component file sharing: quotas implementation:

quotas can now be specified using the `quotas_json` option of `component file_sharing`
section in settings. This must be a dict where:
    - `users` key contains default quotas for all users
    - `admins` key contains quotas for administrators (not implemented yet)
    - `jids` contain bare JID to quota mapping, to have user-specific quota

The value can be either a int for quota in bytes, or a case insensitive string with an
optional multiplier symbol (e.g. "500 Mio"). `None` can be used for explicit unlimited
quota (which is the default is `users` is not set).

When a file size is too big for quota, upload is refused with an error message indicating
allowed quota, used space, and the size of the file that user wants to upload.
This commit is contained in:
Goffi 2021-05-05 15:37:33 +02:00
commit ac8f9f7817

View file

@ -266,7 +266,9 @@ class FilePlugin:
)
return True
else:
return self.getDestDir(client, peer_jid, transfer_data, file_data)
return defer.ensureDeferred(
self.getDestDir(client, peer_jid, transfer_data, file_data)
)
exists_d = xml_tools.deferConfirm(
self.host,
@ -286,7 +288,9 @@ class FilePlugin:
self.openFileWrite(client, file_path, transfer_data, file_data, stream_object)
return True
def getDestDir(self, client, peer_jid, transfer_data, file_data, stream_object=False):
async def getDestDir(
self, client, peer_jid, transfer_data, file_data, stream_object=False
):
"""Request confirmation and destination dir to user
Overwrite confirmation is managed.
@ -313,7 +317,7 @@ class FilePlugin:
a stream.FileStreamObject will be used
return (defer.Deferred): True if transfer is accepted
"""
cont, ret_value = self.host.trigger.returnPoint(
cont, ret_value = await self.host.trigger.asyncReturnPoint(
"FILE_getDestDir", client, peer_jid, transfer_data, file_data, stream_object
)
if not cont: