mirror of
https://github.com/onionshare/onionshare.git
synced 2024-12-26 15:59:48 -05:00
Merge pull request #1230 from micahflee/1053_website_folders
Allow directory listing work to with or without trailing slash
This commit is contained in:
commit
3b06d0a08a
@ -1,13 +1,15 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
|
||||||
|
<head>
|
||||||
<title>OnionShare</title>
|
<title>OnionShare</title>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon" />
|
<link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon" />
|
||||||
<link href="{{ static_url_path }}/css/style.css" rel="stylesheet" type="text/css" />
|
<link href="{{ static_url_path }}/css/style.css" rel="stylesheet" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
|
||||||
|
<body>
|
||||||
|
|
||||||
<header class="clearfix">
|
<header class="clearfix">
|
||||||
<img class="logo" src="{{ static_url_path }}/img/logo.png" title="OnionShare">
|
<img class="logo" src="{{ static_url_path }}/img/logo.png" title="OnionShare">
|
||||||
@ -16,7 +18,8 @@
|
|||||||
|
|
||||||
{% if breadcrumbs %}
|
{% if breadcrumbs %}
|
||||||
<ul class="breadcrumbs">
|
<ul class="breadcrumbs">
|
||||||
{% for breadcrumb in breadcrumbs %}<li><a href="{{ breadcrumb[1] }}">{{ breadcrumb[0] }}</a> <span class="sep">‣</span></li>{% endfor %}<li>{{ breadcrumbs_leaf }}</li>
|
{% for breadcrumb in breadcrumbs %}<li><a href="{{ breadcrumb[1] }}">{{ breadcrumb[0] }}</a> <span
|
||||||
|
class="sep">‣</span></li>{% endfor %}<li>{{ breadcrumbs_leaf }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
@ -31,7 +34,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<img width="30" height="30" title="" alt="" src="{{ static_url_path }}/img/web_folder.png" />
|
<img width="30" height="30" title="" alt="" src="{{ static_url_path }}/img/web_folder.png" />
|
||||||
<a href="{{ info.basename }}">
|
<a href="{{ info.link }}">
|
||||||
{{ info.basename }}
|
{{ info.basename }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
@ -43,7 +46,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<img width="30" height="30" title="" alt="" src="{{ static_url_path }}/img/web_file.png" />
|
<img width="30" height="30" title="" alt="" src="{{ static_url_path }}/img/web_file.png" />
|
||||||
<a href="{{ info.basename }}">
|
<a href="{{ info.link }}">
|
||||||
{{ info.basename }}
|
{{ info.basename }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
@ -51,5 +54,6 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
@ -85,7 +85,7 @@ class SendBaseModeWeb:
|
|||||||
|
|
||||||
# If it's a directory, add it recursively
|
# If it's a directory, add it recursively
|
||||||
elif os.path.isdir(filename):
|
elif os.path.isdir(filename):
|
||||||
self.root_files[basename + "/"] = filename
|
self.root_files[basename] = filename
|
||||||
|
|
||||||
for root, _, nested_filenames in os.walk(filename):
|
for root, _, nested_filenames in os.walk(filename):
|
||||||
# Normalize the root path. So if the directory name is "/home/user/Documents/some_folder",
|
# Normalize the root path. So if the directory name is "/home/user/Documents/some_folder",
|
||||||
@ -96,7 +96,7 @@ class SendBaseModeWeb:
|
|||||||
).rstrip("/")
|
).rstrip("/")
|
||||||
|
|
||||||
# Add the dir itself
|
# Add the dir itself
|
||||||
self.files[normalized_root + "/"] = root
|
self.files[normalized_root] = root
|
||||||
|
|
||||||
# Add the files in this dir
|
# Add the files in this dir
|
||||||
for nested_filename in nested_filenames:
|
for nested_filename in nested_filenames:
|
||||||
@ -117,19 +117,21 @@ class SendBaseModeWeb:
|
|||||||
)
|
)
|
||||||
|
|
||||||
breadcrumbs = [("☗", "/")]
|
breadcrumbs = [("☗", "/")]
|
||||||
parts = path.split("/")[:-1]
|
parts = path.split("/")
|
||||||
|
if parts[-1] == "":
|
||||||
|
parts = parts[:-1]
|
||||||
for i in range(len(parts)):
|
for i in range(len(parts)):
|
||||||
breadcrumbs.append((parts[i], f"/{'/'.join(parts[0 : i + 1])}/"))
|
breadcrumbs.append((parts[i], f"/{'/'.join(parts[0 : i + 1])}"))
|
||||||
breadcrumbs_leaf = breadcrumbs.pop()[0]
|
breadcrumbs_leaf = breadcrumbs.pop()[0]
|
||||||
|
|
||||||
# If filesystem_path is None, this is the root directory listing
|
# If filesystem_path is None, this is the root directory listing
|
||||||
files, dirs = self.build_directory_listing(filenames, filesystem_path)
|
files, dirs = self.build_directory_listing(path, filenames, filesystem_path)
|
||||||
r = self.directory_listing_template(
|
r = self.directory_listing_template(
|
||||||
path, files, dirs, breadcrumbs, breadcrumbs_leaf
|
path, files, dirs, breadcrumbs, breadcrumbs_leaf
|
||||||
)
|
)
|
||||||
return self.web.add_security_headers(r)
|
return self.web.add_security_headers(r)
|
||||||
|
|
||||||
def build_directory_listing(self, filenames, filesystem_path):
|
def build_directory_listing(self, path, filenames, filesystem_path):
|
||||||
files = []
|
files = []
|
||||||
dirs = []
|
dirs = []
|
||||||
|
|
||||||
@ -142,11 +144,20 @@ class SendBaseModeWeb:
|
|||||||
is_dir = os.path.isdir(this_filesystem_path)
|
is_dir = os.path.isdir(this_filesystem_path)
|
||||||
|
|
||||||
if is_dir:
|
if is_dir:
|
||||||
dirs.append({"basename": filename})
|
dirs.append(
|
||||||
|
{"link": os.path.join(f"/{path}", filename), "basename": filename}
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
size = os.path.getsize(this_filesystem_path)
|
size = os.path.getsize(this_filesystem_path)
|
||||||
size_human = self.common.human_readable_filesize(size)
|
size_human = self.common.human_readable_filesize(size)
|
||||||
files.append({"basename": filename, "size_human": size_human})
|
files.append(
|
||||||
|
{
|
||||||
|
"link": os.path.join(f"/{path}", filename),
|
||||||
|
"basename": filename,
|
||||||
|
"size_human": size_human,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
return files, dirs
|
return files, dirs
|
||||||
|
|
||||||
def stream_individual_file(self, filesystem_path):
|
def stream_individual_file(self, filesystem_path):
|
||||||
|
@ -71,6 +71,9 @@ class WebsiteModeWeb(SendBaseModeWeb):
|
|||||||
self.web.cancel_compression = True
|
self.web.cancel_compression = True
|
||||||
|
|
||||||
def render_logic(self, path=""):
|
def render_logic(self, path=""):
|
||||||
|
# Strip trailing slash
|
||||||
|
path = path.rstrip("/")
|
||||||
|
|
||||||
if path in self.files:
|
if path in self.files:
|
||||||
filesystem_path = self.files[path]
|
filesystem_path = self.files[path]
|
||||||
|
|
||||||
@ -86,9 +89,6 @@ class WebsiteModeWeb(SendBaseModeWeb):
|
|||||||
# Otherwise, render directory listing
|
# Otherwise, render directory listing
|
||||||
filenames = []
|
filenames = []
|
||||||
for filename in os.listdir(filesystem_path):
|
for filename in os.listdir(filesystem_path):
|
||||||
if os.path.isdir(os.path.join(filesystem_path, filename)):
|
|
||||||
filenames.append(filename + "/")
|
|
||||||
else:
|
|
||||||
filenames.append(filename)
|
filenames.append(filename)
|
||||||
filenames.sort()
|
filenames.sort()
|
||||||
return self.directory_listing(filenames, path, filesystem_path)
|
return self.directory_listing(filenames, path, filesystem_path)
|
||||||
|
Loading…
Reference in New Issue
Block a user