mirror of
https://github.com/onionshare/onionshare.git
synced 2025-05-02 22:45:03 -04:00
Merge branch 'develop' of https://github.com/a1346054/onionshare into a1346054-develop
This commit is contained in:
commit
16c6a9f89d
21 changed files with 41 additions and 41 deletions
2
.github/workflows/codeql-analysis.yml
vendored
2
.github/workflows/codeql-analysis.yml
vendored
|
@ -47,7 +47,7 @@ jobs:
|
||||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v1
|
uses: github/codeql-action/autobuild@v1
|
||||||
|
|
|
@ -110,7 +110,7 @@
|
||||||
## 1.3
|
## 1.3
|
||||||
|
|
||||||
* Major UI redesign, introducing many UX improvements
|
* Major UI redesign, introducing many UX improvements
|
||||||
* Client-side web interfact redesigned
|
* Client-side web interface redesigned
|
||||||
* New feature: Support for meek_lite pluggable transports (Amazon and Azure) - not yet ready for Windows or macOS, sorry
|
* New feature: Support for meek_lite pluggable transports (Amazon and Azure) - not yet ready for Windows or macOS, sorry
|
||||||
* New feature: Support for custom obfs4 and meek_lite bridges (again, meek_lite not available on Windows/macOS yet)
|
* New feature: Support for custom obfs4 and meek_lite bridges (again, meek_lite not available on Windows/macOS yet)
|
||||||
* New feature: Ability to cancel share before it starts
|
* New feature: Ability to cancel share before it starts
|
||||||
|
|
8
LICENSE
8
LICENSE
|
@ -6,7 +6,7 @@ Copyright (C) 2014-2021 Micah Lee, et al. <micah@micahflee.com>
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
@ -650,7 +650,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
@ -669,11 +669,11 @@ might be different; for a GUI interface, you would use an "about box".
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
<http://www.gnu.org/licenses/>.
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
The GNU General Public License does not permit incorporating your program
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
may consider it more useful to permit linking proprietary applications with
|
may consider it more useful to permit linking proprietary applications with
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License. But first, please read
|
Public License instead of this License. But first, please read
|
||||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||||
|
|
|
@ -163,7 +163,7 @@ This will create `desktop/macOS/OnionShare.dmg`, signed and notarized.
|
||||||
|
|
||||||
## Source package
|
## Source package
|
||||||
|
|
||||||
To make a source package, run `./build-source.sh $TAG`, where `$TAG` is the the name of the signed git tag, e.g. `v2.1`.
|
To make a source package, run `./build-source.sh $TAG`, where `$TAG` is the name of the signed git tag, e.g. `v2.1`.
|
||||||
|
|
||||||
This will create `dist/onionshare-$VERSION.tar.gz`.
|
This will create `dist/onionshare-$VERSION.tar.gz`.
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
display_usage() {
|
display_usage() {
|
||||||
echo "Usage: $0 [tag]"
|
echo "Usage: $0 [tag]"
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ $# -lt 1 ]
|
if [ $# -lt 1 ]
|
||||||
|
@ -46,13 +46,13 @@ then
|
||||||
echo "Tag does not verify"
|
echo "Tag does not verify"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
cat ../verify.txt |grep "using RSA key 927F419D7EC82C2F149C1BD1403C2657CD994F73"
|
cat ../verify.txt | grep "using RSA key 927F419D7EC82C2F149C1BD1403C2657CD994F73"
|
||||||
if [ $? -ne 0 ]
|
if [ $? -ne 0 ]
|
||||||
then
|
then
|
||||||
echo "Tag signed with wrong key"
|
echo "Tag signed with wrong key"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
cat ../verify.txt |grep "^gpg: Good signature from"
|
cat ../verify.txt | grep "^gpg: Good signature from"
|
||||||
if [ $? -ne 0 ]
|
if [ $? -ne 0 ]
|
||||||
then
|
then
|
||||||
echo "Tag verification missing 'Good signature from'"
|
echo "Tag verification missing 'Good signature from'"
|
||||||
|
|
|
@ -320,15 +320,15 @@ div#uploads .upload .upload-status {
|
||||||
}
|
}
|
||||||
|
|
||||||
div#uploads .upload input.cancel {
|
div#uploads .upload input.cancel {
|
||||||
color: #d0011b;
|
color: #d0011b;
|
||||||
border: 0;
|
border: 0;
|
||||||
background: none;
|
background: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
float:right;
|
float:right;
|
||||||
}
|
}
|
||||||
|
@ -398,4 +398,4 @@ a {
|
||||||
|
|
||||||
a:visited {
|
a:visited {
|
||||||
color: #601ca0;
|
color: #601ca0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ $(function () {
|
||||||
// Store current username received from app context
|
// Store current username received from app context
|
||||||
var current_username = $('#username').val();
|
var current_username = $('#username').val();
|
||||||
|
|
||||||
// On browser connect, emit a socket event to be added to
|
// On browser connect, emit a socket event to be added to
|
||||||
// room and assigned random username
|
// room and assigned random username
|
||||||
socket.on('connect', function () {
|
socket.on('connect', function () {
|
||||||
socket.emit('joined', {});
|
socket.emit('joined', {});
|
||||||
|
@ -148,7 +148,7 @@ var getScrollDiffBefore = function () {
|
||||||
|
|
||||||
var scrollBottomMaybe = function (scrollDiff) {
|
var scrollBottomMaybe = function (scrollDiff) {
|
||||||
// Scrolls to bottom if the user is scrolled at bottom
|
// Scrolls to bottom if the user is scrolled at bottom
|
||||||
// if the user has scrolled upp, it wont scroll at bottom.
|
// if the user has scrolled up, it won't scroll at bottom.
|
||||||
// Note: when a user themselves send a message, it will still
|
// Note: when a user themselves send a message, it will still
|
||||||
// scroll to the bottom even if they had scrolled up before.
|
// scroll to the bottom even if they had scrolled up before.
|
||||||
if (scrollDiff > 0) {
|
if (scrollDiff > 0) {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<head>
|
<head>
|
||||||
<title>OnionShare: 403 Forbidden</title>
|
<title>OnionShare: 403 Forbidden</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 rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
<link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<head>
|
<head>
|
||||||
<title>OnionShare: 404 Not Found</title>
|
<title>OnionShare: 404 Not Found</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 rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
<link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<head>
|
<head>
|
||||||
<title>OnionShare: 405 Method Not Allowed</title>
|
<title>OnionShare: 405 Method Not Allowed</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 rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
<link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<head>
|
<head>
|
||||||
<title>OnionShare: An error occurred</title>
|
<title>OnionShare: An error occurred</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 rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
<link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -49,7 +49,7 @@ These instructions include adding folders to the path in Windows. To do this, go
|
||||||
|
|
||||||
Download Python 3.8.6, 32-bit (x86) from https://www.python.org/downloads/release/python-386/. I downloaded `python-3.8.6.exe`. When installing it, make sure to check the "Add Python 3.8 to PATH" checkbox on the first page of the installer.
|
Download Python 3.8.6, 32-bit (x86) from https://www.python.org/downloads/release/python-386/. I downloaded `python-3.8.6.exe`. When installing it, make sure to check the "Add Python 3.8 to PATH" checkbox on the first page of the installer.
|
||||||
|
|
||||||
Download and install 7-Zip from http://www.7-zip.org/download.html. I downloaded `7z1900.exe`. Add `C:\Program Files (x86)\7-Zip` to your path.
|
Download and install 7-Zip from https://7-zip.org/download.html. I downloaded `7z1900.exe`. Add `C:\Program Files (x86)\7-Zip` to your path.
|
||||||
|
|
||||||
Install python dependencies:
|
Install python dependencies:
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
# Run OnionShare desktop, allowing you to use command-line arguments
|
# Run OnionShare desktop, allowing you to use command-line arguments
|
||||||
|
|
||||||
SCRIPTS_DIR="$( cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )"
|
SCRIPTS_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )
|
||||||
cd $SCRIPTS_DIR
|
cd "$SCRIPTS_DIR"
|
||||||
|
|
||||||
cd ../src
|
cd ../src
|
||||||
python -c "import onionshare; onionshare.main()" $@
|
python -c "import onionshare; onionshare.main()" $@
|
||||||
|
|
|
@ -246,7 +246,7 @@ class ShareMode(Mode):
|
||||||
|
|
||||||
def start_server_step3_custom(self):
|
def start_server_step3_custom(self):
|
||||||
"""
|
"""
|
||||||
Step 3 in starting the server. Remove zip progess bar, and display large filesize
|
Step 3 in starting the server. Remove zip progress bar, and display large filesize
|
||||||
warning, if applicable.
|
warning, if applicable.
|
||||||
"""
|
"""
|
||||||
# Remove zip progress bar
|
# Remove zip progress bar
|
||||||
|
|
|
@ -178,7 +178,7 @@ class GuiBaseTest(unittest.TestCase):
|
||||||
self.assertEqual(tab.get_mode().history.isVisible(), not currently_visible)
|
self.assertEqual(tab.get_mode().history.isVisible(), not currently_visible)
|
||||||
|
|
||||||
def history_indicator(self, tab, indicator_count="1"):
|
def history_indicator(self, tab, indicator_count="1"):
|
||||||
"""Test that we can make sure the history is toggled off, do an action, and the indiciator works"""
|
"""Test that we can make sure the history is toggled off, do an action, and the indicator works"""
|
||||||
# Make sure history is toggled off
|
# Make sure history is toggled off
|
||||||
if tab.get_mode().history.isVisible():
|
if tab.get_mode().history.isVisible():
|
||||||
tab.get_mode().toggle_history.click()
|
tab.get_mode().toggle_history.click()
|
||||||
|
|
|
@ -27,7 +27,7 @@ You will end up with the documentation in all supported locales in `docs/localiz
|
||||||
Here's how preparing translations works:
|
Here's how preparing translations works:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Generate .po files in build/gettext
|
# Generate .po files in build/gettext
|
||||||
make gettext
|
make gettext
|
||||||
|
|
||||||
# Create a new blank German locale in source/locale, based on .po files
|
# Create a new blank German locale in source/locale, based on .po files
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
VERSION=`cat ../cli/onionshare_cli/resources/version.txt`
|
VERSION=$(cat ../cli/onionshare_cli/resources/version.txt)
|
||||||
|
|
||||||
# Supported locales
|
# Supported locales
|
||||||
LOCALES="en fi pl pt_BR ru tr uk"
|
LOCALES="en fi pl pt_BR ru tr uk"
|
||||||
|
|
|
@ -16,7 +16,7 @@ languages = [
|
||||||
("Русский", "ru"), # Russian
|
("Русский", "ru"), # Russian
|
||||||
# ("Español", "es"), # Spanish
|
# ("Español", "es"), # Spanish
|
||||||
("Türkçe", "tr"), # Turkish
|
("Türkçe", "tr"), # Turkish
|
||||||
("Українська", "uk"), # Ukranian
|
("Українська", "uk"), # Ukrainian
|
||||||
]
|
]
|
||||||
|
|
||||||
versions = ["2.3", "2.3.1", "2.3.2", "2.3.3", "2.4", "2.4.1"]
|
versions = ["2.3", "2.3.1", "2.3.2", "2.3.3", "2.4", "2.4.1"]
|
||||||
|
|
|
@ -40,7 +40,7 @@ Verbose mode
|
||||||
When developing, it's convenient to run OnionShare from a terminal and add the ``--verbose`` (or ``-v``) flag to the command.
|
When developing, it's convenient to run OnionShare from a terminal and add the ``--verbose`` (or ``-v``) flag to the command.
|
||||||
This prints a lot of helpful messages to the terminal, such as when certain objects are initialized, when events occur (like buttons clicked, settings saved or reloaded), and other debug info. For example::
|
This prints a lot of helpful messages to the terminal, such as when certain objects are initialized, when events occur (like buttons clicked, settings saved or reloaded), and other debug info. For example::
|
||||||
|
|
||||||
$ $ poetry run onionshare-cli -v ~/Documents/roms/nes/Q-bert\ \(USA\).nes
|
$ poetry run onionshare-cli -v ~/Documents/roms/nes/Q-bert\ \(USA\).nes
|
||||||
╭───────────────────────────────────────────╮
|
╭───────────────────────────────────────────╮
|
||||||
│ * ▄▄█████▄▄ * │
|
│ * ▄▄█████▄▄ * │
|
||||||
│ ▄████▀▀▀████▄ * │
|
│ ▄████▀▀▀████▄ * │
|
||||||
|
|
|
@ -3,7 +3,7 @@ Copyright (C) 2014-2018 Micah Lee <micah@micahflee.com>
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
@ -647,7 +647,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
@ -666,11 +666,11 @@ might be different; for a GUI interface, you would use an "about box".
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
<http://www.gnu.org/licenses/>.
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
The GNU General Public License does not permit incorporating your program
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
may consider it more useful to permit linking proprietary applications with
|
may consider it more useful to permit linking proprietary applications with
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License. But first, please read
|
Public License instead of this License. But first, please read
|
||||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||||
|
|
|
@ -3,9 +3,9 @@ base: core18
|
||||||
version: '2.4.1'
|
version: '2.4.1'
|
||||||
summary: Securely and anonymously share files, host websites, and chat using Tor
|
summary: Securely and anonymously share files, host websites, and chat using Tor
|
||||||
description: |
|
description: |
|
||||||
OnionShare lets you securely and anonymously send and receive files. It works by starting
|
OnionShare lets you securely and anonymously send and receive files. It works by starting
|
||||||
a web server, making it accessible as a Tor onion service, and generating an unguessable
|
a web server, making it accessible as a Tor onion service, and generating an unguessable
|
||||||
web address so others can download files from you, or upload files to you. It does _not_
|
web address so others can download files from you, or upload files to you. It does _not_
|
||||||
require setting up a separate server or using a third party file-sharing service.
|
require setting up a separate server or using a third party file-sharing service.
|
||||||
|
|
||||||
grade: stable # stable or devel
|
grade: stable # stable or devel
|
||||||
|
@ -24,7 +24,7 @@ apps:
|
||||||
- removable-media
|
- removable-media
|
||||||
environment:
|
environment:
|
||||||
LANG: C.UTF-8
|
LANG: C.UTF-8
|
||||||
|
|
||||||
cli:
|
cli:
|
||||||
common-id: org.onionshare.OnionShareCli
|
common-id: org.onionshare.OnionShareCli
|
||||||
command: onionshare-cli
|
command: onionshare-cli
|
||||||
|
@ -147,7 +147,7 @@ parts:
|
||||||
- libssl-dev
|
- libssl-dev
|
||||||
- zlib1g-dev
|
- zlib1g-dev
|
||||||
after: [libevent]
|
after: [libevent]
|
||||||
|
|
||||||
libevent:
|
libevent:
|
||||||
source: https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
|
source: https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
|
||||||
source-checksum: sha256/92e6de1be9ec176428fd2367677e61ceffc2ee1cb119035037a27d346b0403bb
|
source-checksum: sha256/92e6de1be9ec176428fd2367677e61ceffc2ee1cb119035037a27d346b0403bb
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue