diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-12-12 21:53:15 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2023-12-12 21:59:32 +0100 |
commit | 25368be8e9fec9ab91d45c677c62eb252670b359 (patch) | |
tree | 61a27d8551ecab63d00cefeaa42f5b4867932940 /fshare.py | |
parent | 4db4b6b8477605442c71f768dbb26ee7c659bef2 (diff) |
Share more path handling for GET and DELETE.
Diffstat (limited to 'fshare.py')
-rwxr-xr-x | fshare.py | 54 |
1 files changed, 29 insertions, 25 deletions
@@ -356,8 +356,24 @@ class FShareRequestHandler(hs.BaseHTTPRequestHandler): if not path.startswith('/'): raise PermissionError('Invalid path') - # drop the leading '/' - return path[1:] + # drop the leading '/', take the first path component + path = path[1:].partition('/')[0] + # discard any extension + path = os.path.splitext(path)[0] + + if not path: + raise PermissionError('Empty path') + + if self.server.state.urlmap: + short = path + try: + path = self.server.state.urlmap.short_to_full(short) + except KeyError: + raise PermissionError('No such short URL: ', short) + + self._logger.info('%s->%s', path, short) + + return '/'.join((self.server.data_dir, path)) def _log_request(self): self._logger.info('%s: %s', str(self.client_address), self.requestline) @@ -366,19 +382,13 @@ class FShareRequestHandler(hs.BaseHTTPRequestHandler): def do_GET(self): self._log_request() - # take the first path component, discard any extension - fname = self._process_path(self.path).partition('/')[0] - fname = os.path.splitext(fname)[0] - if self.server.state.urlmap: - try: - short = self.server.state.urlmap.short_to_full(fname) - self._logger.info('%s->%s', fname, short) - fname = short - except KeyError: - return self.send_error(HTTPStatus.NOT_FOUND) + try: + path = self._process_path(self.path) + except PermissionError as e: + self._logger.error('Invalid request: %s', str(e)) + return self.send_error(HTTPStatus.NOT_FOUND) - path = '/'.join((self.server.data_dir, fname)) - self._logger.info('serve file: %s', fname) + self._logger.info('serve file: %s', path) try: infile = open(path, 'rb') @@ -480,18 +490,12 @@ class FShareRequestHandler(hs.BaseHTTPRequestHandler): def do_DELETE(self): self._log_request() - fname = self._process_path(self.path) - - if self.server.state.urlmap: - try: - short = self.server.state.urlmap.short_to_full(fname) - self._logger.info('%s->%s', fname, short) - fname = short - except KeyError: - self._logger.error('DELETE request for non-existing file: %s', fname) - return self.send_error(HTTPStatus.NOT_FOUND) + try: + local_path = self._process_path(self.path) + except PermissionError as e: + self._logger.error('Invalid request: %s', str(e)) + return self.send_error(HTTPStatus.NOT_FOUND) - local_path = '/'.join((self.server.data_dir, fname)) try: os.remove(local_path) except FileNotFoundError: |