diff --git a/desktop/onionshare/main_window.py b/desktop/onionshare/main_window.py
index 986f8720..d6f0d914 100644
--- a/desktop/onionshare/main_window.py
+++ b/desktop/onionshare/main_window.py
@@ -81,13 +81,13 @@ class MainWindow(QtWidgets.QMainWindow):
# Server status indicator icons
self.status_bar.server_status_image_stopped = QtGui.QImage(
- GuiCommon.get_resource_path("images/server_stopped.png")
+ GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_server_stopped.svg")
)
self.status_bar.server_status_image_working = QtGui.QImage(
- GuiCommon.get_resource_path("images/server_working.png")
+ GuiCommon.get_resource_path("images/server_working.svg")
)
self.status_bar.server_status_image_started = QtGui.QImage(
- GuiCommon.get_resource_path("images/server_started.png")
+ GuiCommon.get_resource_path("images/server_started.svg")
)
# Server status indicator on the status bar
diff --git a/desktop/onionshare/resources/images/close_tab.png b/desktop/onionshare/resources/images/close_tab.png
deleted file mode 100644
index a7984a6d..00000000
Binary files a/desktop/onionshare/resources/images/close_tab.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/dark_history_completed_none.svg b/desktop/onionshare/resources/images/dark_history_completed_none.svg
new file mode 100644
index 00000000..6a0a1435
--- /dev/null
+++ b/desktop/onionshare/resources/images/dark_history_completed_none.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/dark_history_icon_toggle.svg b/desktop/onionshare/resources/images/dark_history_icon_toggle.svg
new file mode 100644
index 00000000..9166e984
--- /dev/null
+++ b/desktop/onionshare/resources/images/dark_history_icon_toggle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/dark_history_icon_toggle_selected.svg b/desktop/onionshare/resources/images/dark_history_icon_toggle_selected.svg
new file mode 100644
index 00000000..f5f6231a
--- /dev/null
+++ b/desktop/onionshare/resources/images/dark_history_icon_toggle_selected.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/dark_history_in_progress_none.svg b/desktop/onionshare/resources/images/dark_history_in_progress_none.svg
new file mode 100644
index 00000000..d72f4a6a
--- /dev/null
+++ b/desktop/onionshare/resources/images/dark_history_in_progress_none.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/dark_history_requests_none.svg b/desktop/onionshare/resources/images/dark_history_requests_none.svg
new file mode 100644
index 00000000..d5453b75
--- /dev/null
+++ b/desktop/onionshare/resources/images/dark_history_requests_none.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/dark_persistent_enabled.svg b/desktop/onionshare/resources/images/dark_persistent_enabled.svg
new file mode 100644
index 00000000..239d6431
--- /dev/null
+++ b/desktop/onionshare/resources/images/dark_persistent_enabled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/dark_server_stopped.svg b/desktop/onionshare/resources/images/dark_server_stopped.svg
new file mode 100644
index 00000000..0f315177
--- /dev/null
+++ b/desktop/onionshare/resources/images/dark_server_stopped.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/history_completed.png b/desktop/onionshare/resources/images/history_completed.png
deleted file mode 100644
index e68fe5a2..00000000
Binary files a/desktop/onionshare/resources/images/history_completed.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/history_completed.svg b/desktop/onionshare/resources/images/history_completed.svg
new file mode 100644
index 00000000..b59e8f08
--- /dev/null
+++ b/desktop/onionshare/resources/images/history_completed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/history_completed_none.png b/desktop/onionshare/resources/images/history_completed_none.png
deleted file mode 100644
index 8dbd6939..00000000
Binary files a/desktop/onionshare/resources/images/history_completed_none.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/history_in_progress.png b/desktop/onionshare/resources/images/history_in_progress.png
deleted file mode 100644
index 19694659..00000000
Binary files a/desktop/onionshare/resources/images/history_in_progress.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/history_in_progress.svg b/desktop/onionshare/resources/images/history_in_progress.svg
new file mode 100644
index 00000000..137e0533
--- /dev/null
+++ b/desktop/onionshare/resources/images/history_in_progress.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/history_in_progress_none.png b/desktop/onionshare/resources/images/history_in_progress_none.png
deleted file mode 100644
index 2d61dba4..00000000
Binary files a/desktop/onionshare/resources/images/history_in_progress_none.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/history_requests.png b/desktop/onionshare/resources/images/history_requests.png
deleted file mode 100644
index 4965744d..00000000
Binary files a/desktop/onionshare/resources/images/history_requests.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/history_requests.svg b/desktop/onionshare/resources/images/history_requests.svg
new file mode 100644
index 00000000..c19698a3
--- /dev/null
+++ b/desktop/onionshare/resources/images/history_requests.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/history_requests_none.png b/desktop/onionshare/resources/images/history_requests_none.png
deleted file mode 100644
index 93a71ef3..00000000
Binary files a/desktop/onionshare/resources/images/history_requests_none.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/light_history_completed_none.svg b/desktop/onionshare/resources/images/light_history_completed_none.svg
new file mode 100644
index 00000000..8ef9d629
--- /dev/null
+++ b/desktop/onionshare/resources/images/light_history_completed_none.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/light_history_icon_toggle.svg b/desktop/onionshare/resources/images/light_history_icon_toggle.svg
new file mode 100644
index 00000000..ecdb8bb8
--- /dev/null
+++ b/desktop/onionshare/resources/images/light_history_icon_toggle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/light_history_icon_toggle_selected.svg b/desktop/onionshare/resources/images/light_history_icon_toggle_selected.svg
new file mode 100644
index 00000000..18d9db26
--- /dev/null
+++ b/desktop/onionshare/resources/images/light_history_icon_toggle_selected.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/light_history_in_progress_none.svg b/desktop/onionshare/resources/images/light_history_in_progress_none.svg
new file mode 100644
index 00000000..f489d5e7
--- /dev/null
+++ b/desktop/onionshare/resources/images/light_history_in_progress_none.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/light_history_requests_none.svg b/desktop/onionshare/resources/images/light_history_requests_none.svg
new file mode 100644
index 00000000..e89e77fa
--- /dev/null
+++ b/desktop/onionshare/resources/images/light_history_requests_none.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/light_persistent_enabled.svg b/desktop/onionshare/resources/images/light_persistent_enabled.svg
new file mode 100644
index 00000000..77fc5f48
--- /dev/null
+++ b/desktop/onionshare/resources/images/light_persistent_enabled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/light_server_stopped.svg b/desktop/onionshare/resources/images/light_server_stopped.svg
new file mode 100644
index 00000000..8023ea72
--- /dev/null
+++ b/desktop/onionshare/resources/images/light_server_stopped.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/open_folder.png b/desktop/onionshare/resources/images/open_folder.png
deleted file mode 100644
index 0a734c41..00000000
Binary files a/desktop/onionshare/resources/images/open_folder.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/open_folder.svg b/desktop/onionshare/resources/images/open_folder.svg
new file mode 100644
index 00000000..5981597a
--- /dev/null
+++ b/desktop/onionshare/resources/images/open_folder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/persistent_enabled.png b/desktop/onionshare/resources/images/persistent_enabled.png
deleted file mode 100644
index 6c295db5..00000000
Binary files a/desktop/onionshare/resources/images/persistent_enabled.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/server_started.png b/desktop/onionshare/resources/images/server_started.png
deleted file mode 100644
index 9c0c3176..00000000
Binary files a/desktop/onionshare/resources/images/server_started.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/server_started.svg b/desktop/onionshare/resources/images/server_started.svg
new file mode 100644
index 00000000..8358e726
--- /dev/null
+++ b/desktop/onionshare/resources/images/server_started.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/images/server_stopped.png b/desktop/onionshare/resources/images/server_stopped.png
deleted file mode 100644
index 5c5b2ec0..00000000
Binary files a/desktop/onionshare/resources/images/server_stopped.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/server_working.png b/desktop/onionshare/resources/images/server_working.png
deleted file mode 100644
index e5c8b318..00000000
Binary files a/desktop/onionshare/resources/images/server_working.png and /dev/null differ
diff --git a/desktop/onionshare/resources/images/server_working.svg b/desktop/onionshare/resources/images/server_working.svg
new file mode 100644
index 00000000..3717cbff
--- /dev/null
+++ b/desktop/onionshare/resources/images/server_working.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/desktop/onionshare/resources/locale/en.json b/desktop/onionshare/resources/locale/en.json
index 9138707c..79c9a14c 100644
--- a/desktop/onionshare/resources/locale/en.json
+++ b/desktop/onionshare/resources/locale/en.json
@@ -99,6 +99,7 @@
"gui_settings_button_help": "Help",
"gui_settings_version_label": "You are using OnionShare {}",
"gui_settings_help_label": "Need help? See docs.onionshare.org",
+ "gui_settings_license_label": "OnionShare is licensed under the GPL v3. Third-party licenses can be viewed here: https://github.com/onionshare/onionshare/tree/main/licenses",
"settings_test_success": "Connected to the Tor controller.\n\nTor version: {}\nSupports ephemeral onion services: {}.\nSupports client authentication: {}.\nSupports next-gen .onion addresses: {}.",
"connecting_to_tor": "Connecting to the Tor network",
"update_available": "New OnionShare out. Click here to get it.
You are using {} and the latest is {}.",
@@ -131,15 +132,15 @@
"gui_url_instructions": "First, send the OnionShare address below:",
"gui_url_instructions_public_mode": "Send the OnionShare address below:",
"gui_client_auth_instructions": "Next, send the private key to allow access to your OnionShare service:",
- "gui_status_indicator_share_stopped": "Ready to share",
+ "gui_status_indicator_share_stopped": "Stopped",
"gui_status_indicator_share_working": "Starting…",
"gui_status_indicator_share_scheduled": "Scheduled…",
"gui_status_indicator_share_started": "Sharing",
- "gui_status_indicator_receive_stopped": "Ready to receive",
+ "gui_status_indicator_receive_stopped": "Stopped",
"gui_status_indicator_receive_working": "Starting…",
"gui_status_indicator_receive_scheduled": "Scheduled…",
"gui_status_indicator_receive_started": "Receiving",
- "gui_status_indicator_chat_stopped": "Ready to chat",
+ "gui_status_indicator_chat_stopped": "Stopped",
"gui_status_indicator_chat_working": "Starting…",
"gui_status_indicator_chat_scheduled": "Scheduled…",
"gui_status_indicator_chat_started": "Chatting",
diff --git a/desktop/onionshare/settings_tab.py b/desktop/onionshare/settings_tab.py
index ad911412..16bf873e 100644
--- a/desktop/onionshare/settings_tab.py
+++ b/desktop/onionshare/settings_tab.py
@@ -126,6 +126,11 @@ class SettingsTab(QtWidgets.QWidget):
help_label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction)
help_label.setOpenExternalLinks(True)
+ license_label = QtWidgets.QLabel(strings._("gui_settings_license_label"))
+ license_label.setAlignment(QtCore.Qt.AlignHCenter)
+ license_label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction)
+ license_label.setOpenExternalLinks(True)
+
# Buttons
self.save_button = QtWidgets.QPushButton(strings._("gui_settings_button_save"))
self.save_button.clicked.connect(self.save_clicked)
@@ -146,6 +151,8 @@ class SettingsTab(QtWidgets.QWidget):
layout.addWidget(version_label)
layout.addWidget(help_label)
layout.addSpacing(20)
+ layout.addWidget(license_label)
+ layout.addSpacing(20)
layout.addLayout(buttons_layout)
layout.addStretch()
diff --git a/desktop/onionshare/tab/mode/history.py b/desktop/onionshare/tab/mode/history.py
index ad8af099..5e4b0304 100644
--- a/desktop/onionshare/tab/mode/history.py
+++ b/desktop/onionshare/tab/mode/history.py
@@ -201,9 +201,9 @@ class ReceiveHistoryItemFile(QtWidgets.QWidget):
self.filesize_label.hide()
# Folder button
- folder_pixmap = QtGui.QPixmap.fromImage(
- QtGui.QImage(GuiCommon.get_resource_path("images/open_folder.png"))
- )
+ image = QtGui.QImage(GuiCommon.get_resource_path("images/open_folder.svg"))
+ scaled_image = image.scaledToHeight(15, QtCore.Qt.SmoothTransformation)
+ folder_pixmap = QtGui.QPixmap.fromImage(scaled_image)
folder_icon = QtGui.QIcon(folder_pixmap)
self.folder_button = QtWidgets.QPushButton()
self.folder_button.clicked.connect(self.open_folder)
@@ -788,10 +788,10 @@ class History(QtWidgets.QWidget):
Update the 'completed' widget.
"""
if self.completed_count == 0:
- image = GuiCommon.get_resource_path("images/history_completed_none.png")
+ image = GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_completed_none.svg")
else:
- image = GuiCommon.get_resource_path("images/history_completed.png")
- self.completed_label.setText(f' {self.completed_count}')
+ image = GuiCommon.get_resource_path("images/history_completed.svg")
+ self.completed_label.setText(f' {self.completed_count}')
self.completed_label.setToolTip(
strings._("history_completed_tooltip").format(self.completed_count)
)
@@ -801,12 +801,12 @@ class History(QtWidgets.QWidget):
Update the 'in progress' widget.
"""
if self.in_progress_count == 0:
- image = GuiCommon.get_resource_path("images/history_in_progress_none.png")
+ image = GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_in_progress_none.svg")
else:
- image = GuiCommon.get_resource_path("images/history_in_progress.png")
+ image = GuiCommon.get_resource_path("images/history_in_progress.svg")
self.in_progress_label.setText(
- f' {self.in_progress_count}'
+ f' {self.in_progress_count}'
)
self.in_progress_label.setToolTip(
strings._("history_in_progress_tooltip").format(self.in_progress_count)
@@ -817,11 +817,11 @@ class History(QtWidgets.QWidget):
Update the 'web requests' widget.
"""
if self.requests_count == 0:
- image = GuiCommon.get_resource_path("images/history_requests_none.png")
+ image = GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_requests_none.svg")
else:
- image = GuiCommon.get_resource_path("images/history_requests.png")
+ image = GuiCommon.get_resource_path("images/history_requests.svg")
- self.requests_label.setText(f' {self.requests_count}')
+ self.requests_label.setText(f' {self.requests_count}')
self.requests_label.setToolTip(
strings._("history_requests_tooltip").format(self.requests_count)
)
diff --git a/desktop/onionshare/tab/mode/receive_mode/__init__.py b/desktop/onionshare/tab/mode/receive_mode/__init__.py
index bfa85459..45b20c70 100644
--- a/desktop/onionshare/tab/mode/receive_mode/__init__.py
+++ b/desktop/onionshare/tab/mode/receive_mode/__init__.py
@@ -160,9 +160,9 @@ class ReceiveMode(Mode):
self.common,
self,
self.history,
- QtGui.QIcon(GuiCommon.get_resource_path("images/receive_icon_toggle.png")),
+ QtGui.QIcon(GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_icon_toggle.svg")),
QtGui.QIcon(
- GuiCommon.get_resource_path("images/receive_icon_toggle_selected.png")
+ GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_icon_toggle_selected.svg")
),
)
diff --git a/desktop/onionshare/tab/mode/share_mode/__init__.py b/desktop/onionshare/tab/mode/share_mode/__init__.py
index daa35a4d..d8a515dd 100644
--- a/desktop/onionshare/tab/mode/share_mode/__init__.py
+++ b/desktop/onionshare/tab/mode/share_mode/__init__.py
@@ -135,9 +135,9 @@ class ShareMode(Mode):
self.common,
self,
self.history,
- QtGui.QIcon(GuiCommon.get_resource_path("images/share_icon_toggle.png")),
+ QtGui.QIcon(GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_icon_toggle.svg")),
QtGui.QIcon(
- GuiCommon.get_resource_path("images/share_icon_toggle_selected.png")
+ GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_icon_toggle_selected.svg")
),
)
diff --git a/desktop/onionshare/tab/mode/website_mode/__init__.py b/desktop/onionshare/tab/mode/website_mode/__init__.py
index 47614cae..3faab913 100644
--- a/desktop/onionshare/tab/mode/website_mode/__init__.py
+++ b/desktop/onionshare/tab/mode/website_mode/__init__.py
@@ -157,9 +157,9 @@ class WebsiteMode(Mode):
self.common,
self,
self.history,
- QtGui.QIcon(GuiCommon.get_resource_path("images/share_icon_toggle.png")),
+ QtGui.QIcon(GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_icon_toggle.svg")),
QtGui.QIcon(
- GuiCommon.get_resource_path("images/share_icon_toggle_selected.png")
+ GuiCommon.get_resource_path(f"images/{self.common.gui.color_mode}_history_icon_toggle_selected.svg")
),
)
diff --git a/desktop/onionshare/tab/tab.py b/desktop/onionshare/tab/tab.py
index ab6cc3e5..9e5dda20 100644
--- a/desktop/onionshare/tab/tab.py
+++ b/desktop/onionshare/tab/tab.py
@@ -217,14 +217,13 @@ class Tab(QtWidgets.QWidget):
# Persistent image
self.persistent_image_label = QtWidgets.QLabel()
- self.persistent_image_label.setPixmap(
- QtGui.QPixmap.fromImage(
- QtGui.QImage(
- GuiCommon.get_resource_path("images/persistent_enabled.png")
- )
+ image = QtGui.QImage(
+ GuiCommon.get_resource_path(
+ f"images/{self.common.gui.color_mode}_persistent_enabled.svg"
)
)
- self.persistent_image_label.setFixedSize(20, 20)
+ scaled_image = image.scaledToHeight(15, QtCore.Qt.SmoothTransformation)
+ self.persistent_image_label.setPixmap(QtGui.QPixmap.fromImage(scaled_image))
# Create the close warning dialog -- the dialog widget needs to be in the constructor
# in order to test it
@@ -480,23 +479,31 @@ class Tab(QtWidgets.QWidget):
)
def set_server_status_indicator_stopped(self, label_text):
- self.change_icon.emit(self.tab_id, "images/server_stopped.png")
+ self.change_icon.emit(
+ self.tab_id, f"images/{self.common.gui.color_mode}_server_stopped.svg"
+ )
+ image = self.status_bar.server_status_image_stopped
+ scaled_image = image.scaledToHeight(15, QtCore.Qt.SmoothTransformation)
self.status_bar.server_status_image_label.setPixmap(
- QtGui.QPixmap.fromImage(self.status_bar.server_status_image_stopped)
+ QtGui.QPixmap.fromImage(scaled_image)
)
self.status_bar.server_status_label.setText(label_text)
def set_server_status_indicator_working(self, label_text):
- self.change_icon.emit(self.tab_id, "images/server_working.png")
+ self.change_icon.emit(self.tab_id, "images/server_working.svg")
+ image = self.status_bar.server_status_image_working
+ scaled_image = image.scaledToHeight(15, QtCore.Qt.SmoothTransformation)
self.status_bar.server_status_image_label.setPixmap(
- QtGui.QPixmap.fromImage(self.status_bar.server_status_image_working)
+ QtGui.QPixmap.fromImage(scaled_image)
)
self.status_bar.server_status_label.setText(label_text)
def set_server_status_indicator_started(self, label_text):
- self.change_icon.emit(self.tab_id, "images/server_started.png")
+ self.change_icon.emit(self.tab_id, "images/server_started.svg")
+ image = self.status_bar.server_status_image_started
+ scaled_image = image.scaledToHeight(15, QtCore.Qt.SmoothTransformation)
self.status_bar.server_status_image_label.setPixmap(
- QtGui.QPixmap.fromImage(self.status_bar.server_status_image_started)
+ QtGui.QPixmap.fromImage(scaled_image)
)
self.status_bar.server_status_label.setText(label_text)
diff --git a/desktop/setup-freeze.py b/desktop/setup-freeze.py
index d311a942..d6e81e81 100644
--- a/desktop/setup-freeze.py
+++ b/desktop/setup-freeze.py
@@ -35,7 +35,12 @@ with open(os.path.join("..", "cli", "onionshare_cli", "resources", "version.txt"
version = version[0:-5]
# Build
-include_files = [(os.path.join("..", "LICENSE.txt"), "LICENSE.txt")]
+include_files = [
+ (os.path.join("..", "LICENSE.txt"), "LICENSE.txt"),
+ (os.path.join("..", "licenses", "license-obfs4.txt"), "license-obfs4.txt"),
+ (os.path.join("..", "licenses", "license-snowflake.txt"), "license-snowflake.txt"),
+ (os.path.join("..", "licenses", "license-tor.txt"), "license-tor.txt")
+]
if platform.system() == "Windows":
include_msvcr = True
diff --git a/desktop/tests/test_gui_tabs.py b/desktop/tests/test_gui_tabs.py
index b0e24666..72cadca5 100644
--- a/desktop/tests/test_gui_tabs.py
+++ b/desktop/tests/test_gui_tabs.py
@@ -132,7 +132,7 @@ class TestTabs(GuiBaseTest):
self.assertFalse(self.gui.tabs.widget(1).new_tab.isVisible())
self.assertTrue(self.gui.tabs.widget(1).share_mode.isVisible())
self.assertEqual(
- self.gui.status_bar.server_status_label.text(), "Ready to share"
+ self.gui.status_bar.server_status_label.text(), "Stopped"
)
# New tab, receive files
@@ -141,7 +141,7 @@ class TestTabs(GuiBaseTest):
self.assertFalse(self.gui.tabs.widget(2).new_tab.isVisible())
self.assertTrue(self.gui.tabs.widget(2).receive_mode.isVisible())
self.assertEqual(
- self.gui.status_bar.server_status_label.text(), "Ready to receive"
+ self.gui.status_bar.server_status_label.text(), "Stopped"
)
# New tab, publish website
@@ -150,7 +150,7 @@ class TestTabs(GuiBaseTest):
self.assertFalse(self.gui.tabs.widget(3).new_tab.isVisible())
self.assertTrue(self.gui.tabs.widget(3).website_mode.isVisible())
self.assertEqual(
- self.gui.status_bar.server_status_label.text(), "Ready to share"
+ self.gui.status_bar.server_status_label.text(), "Stopped"
)
# New tab, chat mode
@@ -159,7 +159,7 @@ class TestTabs(GuiBaseTest):
self.assertFalse(self.gui.tabs.widget(4).new_tab.isVisible())
self.assertTrue(self.gui.tabs.widget(4).chat_mode.isVisible())
self.assertEqual(
- self.gui.status_bar.server_status_label.text(), "Ready to chat"
+ self.gui.status_bar.server_status_label.text(), "Stopped"
)
# Close tabs
diff --git a/licenses/license-fontawesome-icons.txt b/licenses/license-fontawesome-icons.txt
new file mode 100644
index 00000000..da6ab6cc
--- /dev/null
+++ b/licenses/license-fontawesome-icons.txt
@@ -0,0 +1,396 @@
+Attribution 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution 4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution 4.0 International Public License ("Public License"). To the
+extent this Public License may be interpreted as a contract, You are
+granted the Licensed Rights in consideration of Your acceptance of
+these terms and conditions, and the Licensor grants You such rights in
+consideration of benefits the Licensor receives from making the
+Licensed Material available under these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ d. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ e. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ f. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ g. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ h. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ i. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ j. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ k. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ 4. If You Share Adapted Material You produce, the Adapter's
+ License You apply must not prevent recipients of the Adapted
+ Material from complying with this Public License.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material; and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the “Licensor.” The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
+
diff --git a/licenses/license-meek.txt b/licenses/license-meek.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/licenses/license-meek.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/licenses/license-snowflake.txt b/licenses/license-snowflake.txt
new file mode 100644
index 00000000..42f62969
--- /dev/null
+++ b/licenses/license-snowflake.txt
@@ -0,0 +1,32 @@
+ This file contains the license for "Snowflake"
+ a free software project which provides a WebRTC pluggable transport.
+
+================================================================================
+Copyright (c) 2016, Serene Han, Arlo Breault
+Copyright (c) 2019-2020, The Tor Project, Inc
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+ * Neither the names of the copyright owners nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+================================================================================
diff --git a/licenses/readme.md b/licenses/readme.md
new file mode 100644
index 00000000..44facf69
--- /dev/null
+++ b/licenses/readme.md
@@ -0,0 +1,33 @@
+# Third party licenses and attribution
+
+This folder contains 3rd-party licenses and attribution for software included with OnionShare.
+
+
+## JQuery
+
+JQuery is used in the web interface for Receive and Chat modes.
+
+
+## Tor
+
+The Tor software is what provides Onion Services in OnionShare.
+
+
+## obfs4
+
+The OBFS4 proxy is a Tor 'pluggable transport', which allows the use of obfs4-compatible bridges.
+
+
+## Snowflake
+
+The Snowflake tool is a Tor 'pluggable transport', which allows the use of snowflake-compatible bridges.
+
+
+## Meek
+
+The Meek-lite tool is a Tor 'pluggable transport', which allows the use of meek-compatible bridges.
+
+
+## Font Awesome
+
+Some icons used in the desktop version of the OnionShare application are from the 'free' edition of Font Awesome.
diff --git a/licenses/readme.txt b/licenses/readme.txt
deleted file mode 100644
index 3dd5d2fe..00000000
--- a/licenses/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains 3rd-party licenses for software included with OnionShare.