mirror of
https://github.com/onionshare/onionshare.git
synced 2024-10-01 01:35:40 -04:00
ClientAuthV3 fixes
* Remove Client Auth as an explicit option (it's on by default). * Update wording about Public mode * Fix tuple error when raising TorTooOldStealth exception in CLI * Move Private Key button next to URL button in GUI * Replace visual references of ClientAuth to Private Key * Remove HTTPAuth Flask dependency and remove a lot of code to do with password generation, 401 auth triggers/invalid password rate limit detection etc * Test updates * Remove obsolete locale keys
This commit is contained in:
parent
f63e0c37d1
commit
0bf8f53d30
@ -38,14 +38,6 @@ from .onionshare import OnionShare
|
||||
from .mode_settings import ModeSettings
|
||||
|
||||
|
||||
def build_url(mode_settings, app, web):
|
||||
# Build the URL
|
||||
if mode_settings.get("general", "public"):
|
||||
return f"http://{app.onion_host}"
|
||||
else:
|
||||
return f"http://onionshare:{web.password}@{app.onion_host}"
|
||||
|
||||
|
||||
def main(cwd=None):
|
||||
"""
|
||||
The main() function implements all of the logic that the command-line version of
|
||||
@ -113,7 +105,7 @@ def main(cwd=None):
|
||||
action="store_true",
|
||||
dest="public",
|
||||
default=False,
|
||||
help="Don't use a password",
|
||||
help="Don't use a private key",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--auto-start-timer",
|
||||
@ -129,13 +121,6 @@ def main(cwd=None):
|
||||
default=0,
|
||||
help="Stop onion service at schedule time (N seconds from now)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--client-auth",
|
||||
action="store_true",
|
||||
dest="client_auth",
|
||||
default=False,
|
||||
help="Use client authorization",
|
||||
)
|
||||
# Share args
|
||||
parser.add_argument(
|
||||
"--no-autostop-sharing",
|
||||
@ -208,7 +193,6 @@ def main(cwd=None):
|
||||
public = bool(args.public)
|
||||
autostart_timer = int(args.autostart_timer)
|
||||
autostop_timer = int(args.autostop_timer)
|
||||
client_auth = bool(args.client_auth)
|
||||
autostop_sharing = not bool(args.no_autostop_sharing)
|
||||
data_dir = args.data_dir
|
||||
webhook_url = args.webhook_url
|
||||
@ -249,7 +233,6 @@ def main(cwd=None):
|
||||
mode_settings.set("general", "public", public)
|
||||
mode_settings.set("general", "autostart_timer", autostart_timer)
|
||||
mode_settings.set("general", "autostop_timer", autostop_timer)
|
||||
mode_settings.set("general", "client_auth", client_auth)
|
||||
if mode == "share":
|
||||
mode_settings.set("share", "autostop_sharing", autostop_sharing)
|
||||
if mode == "receive":
|
||||
@ -336,11 +319,6 @@ def main(cwd=None):
|
||||
try:
|
||||
common.settings.load()
|
||||
|
||||
if mode_settings.get("general", "public"):
|
||||
web.password = None
|
||||
else:
|
||||
web.generate_password(mode_settings.get("onion", "password"))
|
||||
|
||||
# Receive mode needs to know the tor proxy details for webhooks
|
||||
if mode == "receive":
|
||||
if local_only:
|
||||
@ -365,7 +343,7 @@ def main(cwd=None):
|
||||
sys.exit()
|
||||
|
||||
app.start_onion_service(mode, mode_settings, False)
|
||||
url = build_url(mode_settings, app, web)
|
||||
url = f"http://{app.onion_host}"
|
||||
schedule = datetime.now() + timedelta(seconds=autostart_timer)
|
||||
if mode == "receive":
|
||||
print(
|
||||
@ -378,21 +356,21 @@ def main(cwd=None):
|
||||
"what you are doing."
|
||||
)
|
||||
print("")
|
||||
if mode_settings.get("general", "client_auth"):
|
||||
if not mode_settings.get("general", "public"):
|
||||
print(
|
||||
f"Give this address and ClientAuth line to your sender, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
|
||||
f"Give this address and private key to your sender, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
|
||||
)
|
||||
print(f"ClientAuth: {app.auth_string}")
|
||||
print(f"Private key: {app.auth_string}")
|
||||
else:
|
||||
print(
|
||||
f"Give this address to your sender, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
|
||||
)
|
||||
else:
|
||||
if mode_settings.get("general", "client_auth"):
|
||||
if not mode_settings.get("general", "public"):
|
||||
print(
|
||||
f"Give this address and ClientAuth line to your recipient, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
|
||||
f"Give this address and private key to your recipient, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
|
||||
)
|
||||
print(f"ClientAuth: {app.auth_string}")
|
||||
print(f"Private key: {app.auth_string}")
|
||||
else:
|
||||
print(
|
||||
f"Give this address to your recipient, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
|
||||
@ -410,7 +388,6 @@ def main(cwd=None):
|
||||
sys.exit()
|
||||
except (TorTooOldEphemeral, TorTooOldStealth, TorErrorProtocolError) as e:
|
||||
print("")
|
||||
print(e.args[0])
|
||||
sys.exit()
|
||||
|
||||
if mode == "website":
|
||||
@ -442,21 +419,14 @@ def main(cwd=None):
|
||||
t.start()
|
||||
|
||||
try: # Trap Ctrl-C
|
||||
# Wait for web.generate_password() to finish running
|
||||
time.sleep(0.2)
|
||||
|
||||
# start auto-stop timer thread
|
||||
if app.autostop_timer > 0:
|
||||
app.autostop_timer_thread.start()
|
||||
|
||||
# Save the web password if we are using a persistent private key
|
||||
if mode_settings.get("persistent", "enabled"):
|
||||
if not mode_settings.get("onion", "password"):
|
||||
mode_settings.set("onion", "password", web.password)
|
||||
# mode_settings.save()
|
||||
|
||||
# Build the URL
|
||||
url = build_url(mode_settings, app, web)
|
||||
url = f"http://{app.onion_host}"
|
||||
|
||||
print("")
|
||||
if autostart_timer > 0:
|
||||
@ -474,21 +444,21 @@ def main(cwd=None):
|
||||
)
|
||||
print("")
|
||||
|
||||
if mode_settings.get("general", "client_auth"):
|
||||
print("Give this address and ClientAuth to the sender:")
|
||||
print(url)
|
||||
print(f"ClientAuth: {app.auth_string}")
|
||||
else:
|
||||
if mode_settings.get("general", "public"):
|
||||
print("Give this address to the sender:")
|
||||
print(url)
|
||||
else:
|
||||
if mode_settings.get("general", "client_auth"):
|
||||
print("Give this address and ClientAuth line to the recipient:")
|
||||
print(url)
|
||||
print(f"ClientAuth: {app.auth_string}")
|
||||
else:
|
||||
print("Give this address and private key to the sender:")
|
||||
print(url)
|
||||
print(f"Private key: {app.auth_string}")
|
||||
else:
|
||||
if mode_settings.get("general", "public"):
|
||||
print("Give this address to the recipient:")
|
||||
print(url)
|
||||
else:
|
||||
print("Give this address and private key to the recipient:")
|
||||
print(url)
|
||||
print(f"Private key: {app.auth_string}")
|
||||
print("")
|
||||
print("Press Ctrl+C to stop the server")
|
||||
|
||||
|
@ -37,8 +37,6 @@ class ModeSettings:
|
||||
self.default_settings = {
|
||||
"onion": {
|
||||
"private_key": None,
|
||||
"hidservauth_string": None,
|
||||
"password": None,
|
||||
"client_auth_priv_key": None,
|
||||
"client_auth_pub_key": None,
|
||||
},
|
||||
@ -48,7 +46,6 @@ class ModeSettings:
|
||||
"public": False,
|
||||
"autostart_timer": False,
|
||||
"autostop_timer": False,
|
||||
"client_auth": False,
|
||||
"service_id": None,
|
||||
},
|
||||
"share": {"autostop_sharing": True, "filenames": []},
|
||||
|
@ -640,7 +640,10 @@ class Onion(object):
|
||||
debug_message += f", key_content={key_content}"
|
||||
self.common.log("Onion", "start_onion_service", debug_message)
|
||||
|
||||
if mode_settings.get("general", "client_auth"):
|
||||
if mode_settings.get("general", "public"):
|
||||
client_auth_priv_key = None
|
||||
client_auth_pub_key = None
|
||||
else:
|
||||
if not self.supports_stealth:
|
||||
print(
|
||||
"Your version of Tor is too old, stealth onion services are not supported"
|
||||
@ -657,9 +660,6 @@ class Onion(object):
|
||||
# These should have been saved in settings from the previous run of a persistent onion
|
||||
client_auth_priv_key = mode_settings.get("onion", "client_auth_priv_key")
|
||||
client_auth_pub_key = mode_settings.get("onion", "client_auth_pub_key")
|
||||
else:
|
||||
client_auth_priv_key = None
|
||||
client_auth_pub_key = None
|
||||
|
||||
try:
|
||||
if not self.supports_stealth:
|
||||
@ -701,7 +701,7 @@ class Onion(object):
|
||||
# because we need to send the public key to ADD_ONION (if we restart this
|
||||
# same share at a later date), and the private key to the other user for
|
||||
# their Tor Browser.
|
||||
if mode_settings.get("general", "client_auth"):
|
||||
if not mode_settings.get("general", "public"):
|
||||
mode_settings.set("onion", "client_auth_priv_key", client_auth_priv_key)
|
||||
mode_settings.set("onion", "client_auth_pub_key", client_auth_pub_key)
|
||||
# If we were pasting the client auth directly into the filesystem behind a Tor client,
|
||||
|
@ -74,7 +74,7 @@ class OnionShare(object):
|
||||
|
||||
if self.local_only:
|
||||
self.onion_host = f"127.0.0.1:{self.port}"
|
||||
if mode_settings.get("general", "client_auth"):
|
||||
if not mode_settings.get("general", "public"):
|
||||
self.auth_string = "E2GOT5LTUTP3OAMRCRXO4GSH6VKJEUOXZQUC336SRKAHTTT5OVSA"
|
||||
return
|
||||
|
||||
@ -82,7 +82,7 @@ class OnionShare(object):
|
||||
mode, mode_settings, self.port, await_publication
|
||||
)
|
||||
|
||||
if mode_settings.get("general", "client_auth"):
|
||||
if not mode_settings.get("general", "public"):
|
||||
self.auth_string = self.onion.auth_string
|
||||
|
||||
def stop_onion_service(self, mode_settings):
|
||||
|
@ -1,21 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>OnionShare: 401 Unauthorized Access</title>
|
||||
<meta charset="utf-8" />
|
||||
<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 rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="info-wrapper">
|
||||
<div class="info">
|
||||
<p><img class="logo" src="{{ static_url_path }}/img/logo_large.png" title="OnionShare"></p>
|
||||
<p class="info-header">401 Unauthorized Access</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
@ -34,7 +34,6 @@ from flask import (
|
||||
send_file,
|
||||
__version__ as flask_version,
|
||||
)
|
||||
from flask_httpauth import HTTPBasicAuth
|
||||
from flask_socketio import SocketIO
|
||||
|
||||
from .share_mode import ShareModeWeb
|
||||
@ -75,7 +74,6 @@ class Web:
|
||||
REQUEST_INDIVIDUAL_FILE_CANCELED = 12
|
||||
REQUEST_ERROR_DATA_DIR_CANNOT_CREATE = 13
|
||||
REQUEST_OTHER = 14
|
||||
REQUEST_INVALID_PASSWORD = 15
|
||||
|
||||
def __init__(self, common, is_gui, mode_settings, mode="share"):
|
||||
self.common = common
|
||||
@ -92,8 +90,6 @@ class Web:
|
||||
)
|
||||
self.app.secret_key = self.common.random_string(8)
|
||||
self.generate_static_url_path()
|
||||
self.auth = HTTPBasicAuth()
|
||||
self.auth.error_handler(self.error401)
|
||||
|
||||
# Verbose mode?
|
||||
if self.common.verbose:
|
||||
@ -132,9 +128,6 @@ class Web:
|
||||
]
|
||||
|
||||
self.q = queue.Queue()
|
||||
self.password = None
|
||||
|
||||
self.reset_invalid_passwords()
|
||||
|
||||
self.done = False
|
||||
|
||||
@ -199,28 +192,6 @@ class Web:
|
||||
Common web app routes between all modes.
|
||||
"""
|
||||
|
||||
@self.auth.get_password
|
||||
def get_pw(username):
|
||||
if username == "onionshare":
|
||||
return self.password
|
||||
else:
|
||||
return None
|
||||
|
||||
@self.app.before_request
|
||||
def conditional_auth_check():
|
||||
# Allow static files without basic authentication
|
||||
if request.path.startswith(self.static_url_path + "/"):
|
||||
return None
|
||||
|
||||
# If public mode is disabled, require authentication
|
||||
if not self.settings.get("general", "public"):
|
||||
|
||||
@self.auth.login_required
|
||||
def _check_login():
|
||||
return None
|
||||
|
||||
return _check_login()
|
||||
|
||||
@self.app.errorhandler(404)
|
||||
def not_found(e):
|
||||
mode = self.get_mode()
|
||||
@ -260,31 +231,6 @@ class Web:
|
||||
f"{self.common.get_resource_path('static')}/img/favicon.ico"
|
||||
)
|
||||
|
||||
def error401(self):
|
||||
auth = request.authorization
|
||||
if auth:
|
||||
if (
|
||||
auth["username"] == "onionshare"
|
||||
and auth["password"] not in self.invalid_passwords
|
||||
):
|
||||
print(f"Invalid password guess: {auth['password']}")
|
||||
self.add_request(Web.REQUEST_INVALID_PASSWORD, data=auth["password"])
|
||||
|
||||
self.invalid_passwords.append(auth["password"])
|
||||
self.invalid_passwords_count += 1
|
||||
|
||||
if self.invalid_passwords_count == 20:
|
||||
self.add_request(Web.REQUEST_RATE_LIMIT)
|
||||
self.force_shutdown()
|
||||
print(
|
||||
"Someone has made too many wrong attempts to guess your password, so OnionShare has stopped the server. Start sharing again and send the recipient a new address to share."
|
||||
)
|
||||
|
||||
r = make_response(
|
||||
render_template("401.html", static_url_path=self.static_url_path), 401
|
||||
)
|
||||
return self.add_security_headers(r)
|
||||
|
||||
def error403(self):
|
||||
self.add_request(Web.REQUEST_OTHER, request.path)
|
||||
r = make_response(
|
||||
@ -362,21 +308,6 @@ class Web:
|
||||
"""
|
||||
self.q.put({"type": request_type, "path": path, "data": data})
|
||||
|
||||
def generate_password(self, saved_password=None):
|
||||
self.common.log("Web", "generate_password", f"saved_password={saved_password}")
|
||||
if saved_password is not None and saved_password != "":
|
||||
self.password = saved_password
|
||||
self.common.log(
|
||||
"Web",
|
||||
"generate_password",
|
||||
f'saved_password sent, so password is: "{self.password}"',
|
||||
)
|
||||
else:
|
||||
self.password = self.common.build_password()
|
||||
self.common.log(
|
||||
"Web", "generate_password", f'built random password: "{self.password}"'
|
||||
)
|
||||
|
||||
def verbose_mode(self):
|
||||
"""
|
||||
Turn on verbose mode, which will log flask errors to a file.
|
||||
@ -386,10 +317,6 @@ class Web:
|
||||
log_handler.setLevel(logging.WARNING)
|
||||
self.app.logger.addHandler(log_handler)
|
||||
|
||||
def reset_invalid_passwords(self):
|
||||
self.invalid_passwords_count = 0
|
||||
self.invalid_passwords = []
|
||||
|
||||
def force_shutdown(self):
|
||||
"""
|
||||
Stop the flask web server, from the context of the flask app.
|
||||
@ -446,18 +373,9 @@ class Web:
|
||||
# To stop flask, load http://shutdown:[shutdown_password]@127.0.0.1/[shutdown_password]/shutdown
|
||||
# (We're putting the shutdown_password in the path as well to make routing simpler)
|
||||
if self.running:
|
||||
if self.password:
|
||||
requests.get(
|
||||
f"http://127.0.0.1:{port}/{self.shutdown_password}/shutdown",
|
||||
auth=requests.auth.HTTPBasicAuth("onionshare", self.password),
|
||||
)
|
||||
else:
|
||||
requests.get(
|
||||
f"http://127.0.0.1:{port}/{self.shutdown_password}/shutdown"
|
||||
)
|
||||
|
||||
# Reset any password that was in use
|
||||
self.password = None
|
||||
requests.get(
|
||||
f"http://127.0.0.1:{port}/{self.shutdown_password}/shutdown"
|
||||
)
|
||||
|
||||
def cleanup(self):
|
||||
"""
|
||||
|
18
cli/poetry.lock
generated
18
cli/poetry.lock
generated
@ -123,17 +123,6 @@ dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxco
|
||||
docs = ["sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"]
|
||||
dotenv = ["python-dotenv"]
|
||||
|
||||
[[package]]
|
||||
category = "main"
|
||||
description = "Basic and Digest HTTP authentication for Flask routes"
|
||||
name = "flask-httpauth"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
version = "4.4.0"
|
||||
|
||||
[package.dependencies]
|
||||
Flask = "*"
|
||||
|
||||
[[package]]
|
||||
category = "main"
|
||||
description = "Socket.IO integration for Flask applications"
|
||||
@ -404,6 +393,7 @@ version = "1.8.1"
|
||||
reference = "de3d03a03c7ee57c74c80e9c63cb88072d833717"
|
||||
type = "git"
|
||||
url = "https://github.com/onionshare/stem.git"
|
||||
|
||||
[[package]]
|
||||
category = "dev"
|
||||
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||
@ -468,7 +458,7 @@ docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
||||
testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
|
||||
|
||||
[metadata]
|
||||
content-hash = "ff0a546f5801be6b68336dfe7ade607ec2dd8c456fe17938be964f36bbe7d193"
|
||||
content-hash = "181891640e59dac730905019444d42ef8e99da0c34c96fb8a616781661bae537"
|
||||
python-versions = "^3.6"
|
||||
|
||||
[metadata.files]
|
||||
@ -559,10 +549,6 @@ flask = [
|
||||
{file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"},
|
||||
{file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"},
|
||||
]
|
||||
flask-httpauth = [
|
||||
{file = "Flask-HTTPAuth-4.4.0.tar.gz", hash = "sha256:bcaaa7a35a3cba0b2eafd4f113b3016bf70eb78087456d96484c3c18928b813a"},
|
||||
{file = "Flask_HTTPAuth-4.4.0-py2.py3-none-any.whl", hash = "sha256:d9131122cdc5709dda63790f6e9b3142d8101447d424b0b95ffd4ee279f49539"},
|
||||
]
|
||||
flask-socketio = [
|
||||
{file = "Flask-SocketIO-5.0.1.tar.gz", hash = "sha256:5c4319f5214ada20807857dc8fdf3dc7d2afe8d6dd38f5c516c72e2be47d2227"},
|
||||
{file = "Flask_SocketIO-5.0.1-py2.py3-none-any.whl", hash = "sha256:5d9a4438bafd806c5a3b832e74b69758781a8ee26fb6c9b1dbdda9b4fced432e"},
|
||||
|
@ -19,7 +19,6 @@ classifiers = [
|
||||
python = "^3.6"
|
||||
click = "*"
|
||||
flask = "1.1.4"
|
||||
flask-httpauth = "*"
|
||||
flask-socketio = "5.0.1"
|
||||
psutil = "*"
|
||||
pysocks = "*"
|
||||
@ -30,7 +29,7 @@ eventlet = "*"
|
||||
setuptools = "*"
|
||||
pynacl = "^1.4.0"
|
||||
colorama = "*"
|
||||
stem = {git = "https://github.com/onionshare/stem.git", rev = "maint"}
|
||||
stem = {git = "https://github.com/onionshare/stem.git", rev = "1.8.1"}
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
pytest = "*"
|
||||
|
@ -48,7 +48,6 @@ def web_obj(temp_dir, common_obj, mode, num_files=0):
|
||||
common_obj.settings = Settings(common_obj)
|
||||
mode_settings = ModeSettings(common_obj)
|
||||
web = Web(common_obj, False, mode_settings, mode)
|
||||
web.generate_password()
|
||||
web.running = True
|
||||
|
||||
web.cleanup_filenames == []
|
||||
@ -75,23 +74,13 @@ class TestWeb:
|
||||
web = web_obj(temp_dir, common_obj, "share", 3)
|
||||
assert web.mode == "share"
|
||||
with web.app.test_client() as c:
|
||||
# Load / without auth
|
||||
# Load /
|
||||
res = c.get("/")
|
||||
res.get_data()
|
||||
assert res.status_code == 401
|
||||
|
||||
# Load / with invalid auth
|
||||
res = c.get("/", headers=self._make_auth_headers("invalid"))
|
||||
res.get_data()
|
||||
assert res.status_code == 401
|
||||
|
||||
# Load / with valid auth
|
||||
res = c.get("/", headers=self._make_auth_headers(web.password))
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
|
||||
# Download
|
||||
res = c.get("/download", headers=self._make_auth_headers(web.password))
|
||||
res = c.get("/download")
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
assert (
|
||||
@ -107,7 +96,7 @@ class TestWeb:
|
||||
|
||||
with web.app.test_client() as c:
|
||||
# Download the first time
|
||||
res = c.get("/download", headers=self._make_auth_headers(web.password))
|
||||
res = c.get("/download")
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
assert (
|
||||
@ -127,7 +116,7 @@ class TestWeb:
|
||||
|
||||
with web.app.test_client() as c:
|
||||
# Download the first time
|
||||
res = c.get("/download", headers=self._make_auth_headers(web.password))
|
||||
res = c.get("/download")
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
assert (
|
||||
@ -141,18 +130,8 @@ class TestWeb:
|
||||
assert web.mode == "receive"
|
||||
|
||||
with web.app.test_client() as c:
|
||||
# Load / without auth
|
||||
res = c.get("/")
|
||||
res.get_data()
|
||||
assert res.status_code == 401
|
||||
|
||||
# Load / with invalid auth
|
||||
res = c.get("/", headers=self._make_auth_headers("invalid"))
|
||||
res.get_data()
|
||||
assert res.status_code == 401
|
||||
|
||||
# Load / with valid auth
|
||||
res = c.get("/", headers=self._make_auth_headers(web.password))
|
||||
res = c.get("/",)
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
|
||||
@ -171,7 +150,7 @@ class TestWeb:
|
||||
)
|
||||
|
||||
with web.app.test_client() as c:
|
||||
res = c.get("/", headers=self._make_auth_headers(web.password))
|
||||
res = c.get("/")
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
|
||||
@ -180,7 +159,6 @@ class TestWeb:
|
||||
buffered=True,
|
||||
content_type="multipart/form-data",
|
||||
data={"file[]": (BytesIO(b"THIS IS A TEST FILE"), "new_york.jpg")},
|
||||
headers=self._make_auth_headers(web.password),
|
||||
)
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
@ -202,7 +180,6 @@ class TestWeb:
|
||||
buffered=True,
|
||||
content_type="multipart/form-data",
|
||||
data={"text": "you know just sending an anonymous message"},
|
||||
headers=self._make_auth_headers(web.password),
|
||||
)
|
||||
content = res.get_data()
|
||||
assert res.status_code == 200
|
||||
@ -237,7 +214,6 @@ class TestWeb:
|
||||
"file[]": (BytesIO(b"THIS IS A TEST FILE"), "new_york.jpg"),
|
||||
"text": "you know just sending an anonymous message",
|
||||
},
|
||||
headers=self._make_auth_headers(web.password),
|
||||
)
|
||||
content = res.get_data()
|
||||
assert res.status_code == 200
|
||||
@ -270,7 +246,6 @@ class TestWeb:
|
||||
buffered=True,
|
||||
content_type="multipart/form-data",
|
||||
data={"file[]": (BytesIO(b"THIS IS A TEST FILE"), "new_york.jpg")},
|
||||
headers=self._make_auth_headers(web.password),
|
||||
)
|
||||
content = res.get_data()
|
||||
assert res.status_code == 200
|
||||
@ -303,7 +278,6 @@ class TestWeb:
|
||||
buffered=True,
|
||||
content_type="multipart/form-data",
|
||||
data={},
|
||||
headers=self._make_auth_headers(web.password),
|
||||
)
|
||||
content = res.get_data()
|
||||
assert res.status_code == 200
|
||||
@ -326,26 +300,6 @@ class TestWeb:
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
|
||||
def test_public_mode_off(self, temp_dir, common_obj):
|
||||
web = web_obj(temp_dir, common_obj, "receive")
|
||||
web.settings.set("general", "public", False)
|
||||
|
||||
with web.app.test_client() as c:
|
||||
# Load / without auth
|
||||
res = c.get("/")
|
||||
res.get_data()
|
||||
assert res.status_code == 401
|
||||
|
||||
# But static resources should work without auth
|
||||
res = c.get(f"{web.static_url_path}/css/style.css")
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
|
||||
# Load / with valid auth
|
||||
res = c.get("/", headers=self._make_auth_headers(web.password))
|
||||
res.get_data()
|
||||
assert res.status_code == 200
|
||||
|
||||
def test_cleanup(self, common_obj, temp_dir_1024, temp_file_1024):
|
||||
web = web_obj(temp_dir_1024, common_obj, "share", 3)
|
||||
|
||||
@ -356,12 +310,6 @@ class TestWeb:
|
||||
assert os.path.exists(temp_dir_1024) is False
|
||||
assert web.cleanup_filenames == []
|
||||
|
||||
def _make_auth_headers(self, password):
|
||||
auth = base64.b64encode(b"onionshare:" + password.encode()).decode()
|
||||
h = Headers()
|
||||
h.add("Authorization", "Basic " + auth)
|
||||
return h
|
||||
|
||||
|
||||
class TestZipWriterDefault:
|
||||
@pytest.mark.parametrize(
|
||||
@ -450,8 +398,7 @@ def live_server(web):
|
||||
proc.start()
|
||||
|
||||
url = "http://127.0.0.1:{}".format(port)
|
||||
auth = base64.b64encode(b"onionshare:" + web.password.encode()).decode()
|
||||
req = Request(url, headers={"Authorization": "Basic {}".format(auth)})
|
||||
req = Request(url)
|
||||
|
||||
attempts = 20
|
||||
while True:
|
||||
@ -509,7 +456,7 @@ class TestRangeRequests:
|
||||
url = "/download"
|
||||
|
||||
with web.app.test_client() as client:
|
||||
resp = client.get(url, headers=self._make_auth_headers(web.password))
|
||||
resp = client.get(url)
|
||||
assert resp.headers["ETag"].startswith('"sha256:')
|
||||
assert resp.headers["Accept-Ranges"] == "bytes"
|
||||
assert resp.headers.get("Last-Modified") is not None
|
||||
@ -524,7 +471,7 @@ class TestRangeRequests:
|
||||
contents = f.read()
|
||||
|
||||
with web.app.test_client() as client:
|
||||
resp = client.get(url, headers=self._make_auth_headers(web.password))
|
||||
resp = client.get(url)
|
||||
assert resp.status_code == 200
|
||||
assert resp.data == contents
|
||||
|
||||
@ -536,7 +483,7 @@ class TestRangeRequests:
|
||||
contents = f.read()
|
||||
|
||||
with web.app.test_client() as client:
|
||||
headers = self._make_auth_headers(web.password)
|
||||
headers = Headers()
|
||||
headers.extend({"Range": "bytes=0-10"})
|
||||
resp = client.get(url, headers=headers)
|
||||
assert resp.status_code == 206
|
||||
@ -572,7 +519,7 @@ class TestRangeRequests:
|
||||
contents = f.read()
|
||||
|
||||
with web.app.test_client() as client:
|
||||
headers = self._make_auth_headers(web.password)
|
||||
headers = Headers()
|
||||
resp = client.get(url, headers=headers)
|
||||
assert resp.status_code == 200
|
||||
|
||||
@ -587,7 +534,7 @@ class TestRangeRequests:
|
||||
url = "/download"
|
||||
|
||||
with web.app.test_client() as client:
|
||||
headers = self._make_auth_headers(web.password)
|
||||
headers = Headers()
|
||||
resp = client.get(url, headers=headers)
|
||||
assert resp.status_code == 200
|
||||
last_mod = resp.headers["Last-Modified"]
|
||||
@ -602,7 +549,7 @@ class TestRangeRequests:
|
||||
url = "/download"
|
||||
|
||||
with web.app.test_client() as client:
|
||||
headers = self._make_auth_headers(web.password)
|
||||
headers = Headers()
|
||||
resp = client.get(url, headers=headers)
|
||||
assert resp.status_code == 200
|
||||
|
||||
@ -621,11 +568,6 @@ class TestRangeRequests:
|
||||
resp = client.get(url, headers=headers)
|
||||
assert resp.status_code == 206
|
||||
|
||||
def _make_auth_headers(self, password):
|
||||
auth = base64.b64encode(b"onionshare:" + password.encode()).decode()
|
||||
h = Headers()
|
||||
h.add("Authorization", "Basic " + auth)
|
||||
return h
|
||||
|
||||
@pytest.mark.skipif(sys.platform != "Linux", reason="requires Linux")
|
||||
@check_unsupported("curl", ["--version"])
|
||||
@ -638,12 +580,9 @@ class TestRangeRequests:
|
||||
with live_server(web) as url:
|
||||
# Debugging help from `man curl`, on error 33
|
||||
# 33 HTTP range error. The range "command" didn't work.
|
||||
auth_header = self._make_auth_headers(web.password)
|
||||
subprocess.check_call(
|
||||
[
|
||||
"curl",
|
||||
"-H",
|
||||
str(auth_header).strip(),
|
||||
"--output",
|
||||
str(download),
|
||||
"--continue-at",
|
||||
@ -663,12 +602,9 @@ class TestRangeRequests:
|
||||
download.write("x" * 10)
|
||||
|
||||
with live_server(web) as url:
|
||||
auth_header = self._make_auth_headers(web.password)
|
||||
subprocess.check_call(
|
||||
[
|
||||
"wget",
|
||||
"--header",
|
||||
str(auth_header).strip(),
|
||||
"--continue",
|
||||
"-O",
|
||||
str(download),
|
||||
|
@ -44,7 +44,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
# Initialize the window
|
||||
self.setMinimumWidth(1040)
|
||||
self.setMinimumHeight(710)
|
||||
self.setMinimumHeight(700)
|
||||
self.setWindowTitle("OnionShare")
|
||||
self.setWindowIcon(QtGui.QIcon(GuiCommon.get_resource_path("images/logo.png")))
|
||||
|
||||
|
@ -110,7 +110,6 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Die outo-stoptyd kan nie dieselfde of vroeër as die outo-begintyd wees nie. Pas dit aan om te begin deel.",
|
||||
"share_via_onionshare": "Deel d.m.v. OnionShare",
|
||||
"gui_connect_to_tor_for_onion_settings": "Koppel aan Tor om uidiensinstellings te sien",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Gebruik argaïese adresse",
|
||||
"gui_save_private_key_checkbox": "Gebruik ’n blywende adres",
|
||||
"gui_share_url_description": "<b>Enigeen</b> met hierdie OnionShare-adres kan u lêers d.m.v. die <b>Tor Browser aflaai</b>: <img src=\"{}\"/>",
|
||||
"gui_website_url_description": "<b>Enigeen</b> met hierdie OnionShare-adres kan u webwerf d.m.v. die <b>Tor Browser besoek</b>: <img src='{}' />",
|
||||
|
@ -131,7 +131,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "بلغ مؤقِّت الإيقاف أجله قبل اشتغال الخادوم. أنشئ مشاركة جديدة.",
|
||||
"gui_server_autostop_timer_expired": "انتهى وقت الايقاف التلقائي للمشاركة. من فضلك عدّله للبدء بالمشاركة.",
|
||||
"share_via_onionshare": "شارك باستعمال OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "استخدم صيغة العناوين التاريخية",
|
||||
"gui_save_private_key_checkbox": "استخدم عنوانًا دائمًا",
|
||||
"gui_share_url_description": "<b>أيّ شخص</b> لديه مسار OnionShare هذا سيكون بوسعه <b>تنزيل</b> تلك الملفات باستعمال <b>متصفّح تور</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>أيّ شخص</b> لديه مسار OnionShare هذا سيكون بوسعه <b>رفع</b> ملفات إلى حاسوبك باستعمال <b>متصفّح تور</b>: <img src='{}' />",
|
||||
@ -244,7 +243,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "تصفح",
|
||||
"mode_settings_receive_data_dir_label": "حفظ الملفات إلى",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "إيقاف المشاركة بعد إرسال الملفات ( قم بإلغاء التحديد للسماح بتنزيل الملفات الفردية)",
|
||||
"mode_settings_client_auth_checkbox": "استخدم ترخيص العميل",
|
||||
"mode_settings_legacy_checkbox": "استخدم عنوانًا قديمًا (النسخة الثانية من خدمة onion، لا ينصح بها)",
|
||||
"mode_settings_autostop_timer_checkbox": "إيقاف خدمة Onion في ميعاد مجدول",
|
||||
"mode_settings_autostart_timer_checkbox": "بدء خدمة Onion في ميعاد مجدول",
|
||||
|
@ -131,7 +131,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Автоматично спиращият таймер спря преди сървърът да стартира.\nМоля направете нов дял.",
|
||||
"gui_server_autostop_timer_expired": "Автоматично спиращият таймер спря.\nМоля актуализирайте за да започнете споделяне.",
|
||||
"share_via_onionshare": "Споделете го чрез OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Използвайте стари адреси",
|
||||
"gui_save_private_key_checkbox": "Използвайте постоянни адреси (стари)",
|
||||
"gui_share_url_description": "<b>Всеки</b> с този OnionShare адрес може да <b>свали</b> Вашите файлове използвайки <b>Тор браузера</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Всеки</b> с този OnionShare адрес може да <b>качи</b> файлове на Вашия компютър, използвайки <b>Тор браузера</b>: <img src='{}' />",
|
||||
|
@ -132,7 +132,6 @@
|
||||
"gui_server_started_after_autostop_timer": "সার্ভার শুরু হওয়ার আগেই স্বয়ংক্রিয়-বন্ধ ঘড়ির সময় শেষ হয়ে গেছে। অনুগ্রহ করে আবার নতুনভাবে শেয়ার করো।",
|
||||
"gui_server_autostop_timer_expired": "অটো-স্টপ টাইমারের সময় ইতিমধ্যেই শেষ হয়ে গিয়েছে। দয়া করে, শেয়ারিং শুরু করতে নতুনভাবে সময় সেট করো।",
|
||||
"share_via_onionshare": "OnionShare এর মাধমে শেয়ার করো",
|
||||
"gui_use_legacy_v2_onions_checkbox": "লেগাসি ঠিকানা ব্যবহার করো",
|
||||
"gui_save_private_key_checkbox": "একটি স্থায়ী ঠিকানা ব্যবহার করো",
|
||||
"gui_share_url_description": "যার কাছেই এই ঠিকানা থাকবে সে ই <b>টর ব্রাউজার</b> ব্যবহার করে এই OnionShare ঠিকানায় গিয়ে <b>যে কেউ</b> আপনার ফাইল(গুলি) <b>ডাউনলোড</b> করতে পারবে:<img src='{}' />",
|
||||
"gui_receive_url_description": "যার কাছেই এই ঠিকানা থাকবে সে ই <b>টর ব্রাউজার</b> ব্যবহার করে এই OnionShare ঠিকানায় গিয়ে <b>যে কেউ</b> আপনার কম্পিউটারে ফাইল <b>আপলোড</b> করতে পারবে:<img src='{}' />",
|
||||
@ -240,7 +239,6 @@
|
||||
"gui_new_tab_receive_description": "তোমার কম্পিউটারকে একটি অনলাইন ড্রপবক্স বানাও। অন্যরা টর ব্রাউজার ব্যবহার করে তোমার কম্পিউটারে ফাইল পাঠাতে পারবে।",
|
||||
"gui_new_tab_share_description": "অন্য কাউকে পাঠাতে তোমার কম্পিউটারের ফাইল নির্বাচন করো. তুমি যাকে বা যাদের কাছে ফাইল পাঠাতে চাও তাকে বা তাদেরকে তোমার কাছ থেকে ফাইল ডাউনলোড করতে টর ব্রাউজার ব্যবহার করতে হবে।",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "ফাইল পাঠানোর পর শেয়ার করা বন্ধ করো (স্বতন্ত্র ফাইল ডাউনলোড এর মঞ্জুরি দিতে টিক চিহ্ন তুলে দাও)",
|
||||
"mode_settings_client_auth_checkbox": "ক্লায়েন্ট অথোরাইজেশন ব্যবহার করো",
|
||||
"mode_settings_autostop_timer_checkbox": "নির্ধারিত সময়ে অনিওন সেবা বন্ধ করো",
|
||||
"mode_settings_autostart_timer_checkbox": "নির্ধারিত সময়ে অনিওন সেবা শুরু করো",
|
||||
"mode_settings_persistent_checkbox": "এই ট্যাব সংরক্ষণ করো, এবং যখন আমি অনিওনশেয়ার খুলব তখন এটি স্বয়ংক্রিয়ভাবে খুলো",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "El temporitzador de finalització automàtica ha acabat abans que s'iniciés el servidor. Torneu a compartir-ho.",
|
||||
"gui_server_autostop_timer_expired": "El temporitzador de finalització automàtica ja s'ha acabat. Ajusteu-lo per a poder compartir.",
|
||||
"share_via_onionshare": "Comparteix-ho amb l'OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Fes servir adreces amb un format antic",
|
||||
"gui_save_private_key_checkbox": "Fes servir una adreça persistent",
|
||||
"gui_share_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>baixar</b> els vostres fitxers fent servir el <b>Navegador Tor</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>pujar</b> fitxers al vostre ordinador fent servir el <b>Navegador Tor</b>: <img src='{}' />",
|
||||
@ -223,7 +222,6 @@
|
||||
"hours_first_letter": "h",
|
||||
"minutes_first_letter": "min",
|
||||
"seconds_first_letter": "s",
|
||||
"invalid_password_guess": "Intent de contrasenya incorrecte",
|
||||
"gui_website_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>visitar</b> el vostre lloc web fent servir el <b>Navegador Tor</b>: <img src='{}' />",
|
||||
"gui_mode_website_button": "Publica el lloc web",
|
||||
"systray_site_loaded_title": "S'ha carregat el lloc web",
|
||||
@ -246,7 +244,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Navega",
|
||||
"mode_settings_receive_data_dir_label": "Desa els fitxers a",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Atura la compartició després que s'hagin enviat els fitxers (desmarqueu-ho per a permetre baixar fitxers individuals)",
|
||||
"mode_settings_client_auth_checkbox": "Usa autorització del client",
|
||||
"mode_settings_legacy_checkbox": "Usa una adreça antiga (servei ceba v2, no recomanat)",
|
||||
"mode_settings_autostop_timer_checkbox": "Atura el servei ceba a una hora programada",
|
||||
"mode_settings_autostart_timer_checkbox": "Inicia el servei ceba a una hora programada",
|
||||
|
@ -165,7 +165,6 @@
|
||||
"mode_settings_autostart_timer_checkbox": "Servîsa onion di wextekî ayarkirî despê bike",
|
||||
"mode_settings_autostop_timer_checkbox": "Servîsa onion di wextekî ayarkirî biseknîne",
|
||||
"mode_settings_legacy_checkbox": "Malperekî kêrhatî bişxulîne(servîsa onion v2 nayê pêsniyar kirin)",
|
||||
"mode_settings_client_auth_checkbox": "Rastbûyîna muşterî kontrol bike",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Parvekirin piştî name haitn şandin biseknîne (Ji bo destûra berjêrkirina nameyên yekane tikandin derbixe)",
|
||||
"mode_settings_receive_data_dir_label": "Nameyan li qeyd bike",
|
||||
"mode_settings_receive_data_dir_browse_button": "Bigere",
|
||||
|
@ -141,7 +141,6 @@
|
||||
"gui_no_downloads": "Ingen downloads endnu",
|
||||
"error_tor_protocol_error_unknown": "Der opstod en ukendt fejl med Tor",
|
||||
"error_invalid_private_key": "Den private nøgletype understøttes ikke",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Brug udgåede adresser",
|
||||
"gui_status_indicator_share_stopped": "Klar til at dele",
|
||||
"gui_status_indicator_share_working": "Starter …",
|
||||
"gui_status_indicator_share_started": "Deler",
|
||||
@ -226,7 +225,6 @@
|
||||
"hours_first_letter": "t",
|
||||
"minutes_first_letter": "m",
|
||||
"seconds_first_letter": "s",
|
||||
"invalid_password_guess": "Ugyldigt adgangskodegæt",
|
||||
"gui_website_url_description": "<b>Alle</b> med OnionShare-adressen kan <b>besøge</b> dit websted med <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_mode_website_button": "Udgiv websted",
|
||||
"gui_website_mode_no_files": "Der er endnu ikke delt noget websted",
|
||||
@ -240,7 +238,6 @@
|
||||
"gui_new_tab_receive_description": "Brug din computer som en online-dropbox. Andre vil kunne bruge Tor Browser til at sende filer til din computer.",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Stop deling efter filerne er blevet sendt (fravælg for at gøre det muligt at downloade individuelle filer)",
|
||||
"mode_settings_legacy_checkbox": "Brug en udgået adresse (v2 oniontjeneste, anbefales ikke)",
|
||||
"mode_settings_client_auth_checkbox": "Brug klientautentifikation",
|
||||
"mode_settings_autostop_timer_checkbox": "Stop oniontjeneste på det planlagte tidspunkt",
|
||||
"mode_settings_autostart_timer_checkbox": "Start oniontjeneste på det planlagte tidspunkt",
|
||||
"mode_settings_persistent_checkbox": "Gem fanebladet og åbn det automatisk når jeg åbner OnionShare",
|
||||
|
@ -125,7 +125,6 @@
|
||||
"gui_tor_connection_error_settings": "Versuche in den Einstellungen zu ändern, wie sich OnionShare mit dem Tor-Netzwerk verbindet.",
|
||||
"gui_tor_connection_canceled": "Konnte keine Verbindung zu Tor herstellen.\n\nStelle sicher, dass du mit dem Internet verbunden bist, öffne OnionShare erneut und richte die Verbindung zu Tor ein.",
|
||||
"share_via_onionshare": "Teilen über OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Nutze das alte Adressformat",
|
||||
"gui_save_private_key_checkbox": "Nutze eine gleichbleibende Adresse",
|
||||
"gui_share_url_description": "<b>Jeder</b> mit dieser OnionShare-Adresse kann deine Dateien mit dem <b>Tor Browser</b> <b>herunterladen</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Jeder</b> mit dieser OnionShare-Adresse kann mit dem <b>Tor Browser</b> Dateien auf deinen Computer <b>hochladen</b>: <img src='{}' />",
|
||||
@ -223,7 +222,6 @@
|
||||
"hours_first_letter": "h",
|
||||
"minutes_first_letter": "m",
|
||||
"seconds_first_letter": "s",
|
||||
"invalid_password_guess": "Ungültige Passwortratschläge",
|
||||
"gui_website_url_description": "<b>Jeder</b> mit dieser OnionShare-Adresse kann deine Webseite mit dem <b>Tor Browser</b> <b>ansehen</b>: <img src='{}' />",
|
||||
"gui_mode_website_button": "Webseite veröffentlichen",
|
||||
"systray_site_loaded_title": "Webseite geladen",
|
||||
@ -241,7 +239,6 @@
|
||||
"mode_settings_website_disable_csp_checkbox": "Content-Security-Policy-Header deaktivieren (ermöglicht es, Ressourcen von Drittanbietern auf deiner Onion-Webseite einzubinden)",
|
||||
"mode_settings_receive_data_dir_browse_button": "Durchsuchen",
|
||||
"mode_settings_receive_data_dir_label": "Dateien speichern unter",
|
||||
"mode_settings_client_auth_checkbox": "Benutze Client-Authorisierung",
|
||||
"mode_settings_legacy_checkbox": "Benutze ein veraltetes Adressformat (Onion-Dienste-Adressformat v2, nicht empfohlen)",
|
||||
"mode_settings_autostop_timer_checkbox": "Onion-Dienst zu einem festgelegten Zeitpunkt stoppen",
|
||||
"mode_settings_autostart_timer_checkbox": "Onion-Dienst zu einem festgelegten Zeitpunkt starten",
|
||||
@ -301,4 +298,4 @@
|
||||
"gui_status_indicator_chat_scheduled": "Geplant…",
|
||||
"gui_status_indicator_chat_working": "Startet…",
|
||||
"gui_status_indicator_chat_stopped": "Bereit zum Chatten"
|
||||
}
|
||||
}
|
||||
|
@ -134,7 +134,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Το χρονόμετρο αυτόματης διακοπής τελείωσε πριν την εκκίνηση του server. Παρακαλώ κάντε ένα νέο διαμοιρασμό.",
|
||||
"gui_server_autostop_timer_expired": "Το χρονόμετρο αυτόματης διακοπής έχει ήδη τελειώσει. Παρακαλώ ρυθμίστε το για να ξεκινήσετε το διαμοιρασμό.",
|
||||
"share_via_onionshare": "Μοιραστείτε μέσω OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Χρήση \"παραδοσιακών\" διευθύνσεων",
|
||||
"gui_save_private_key_checkbox": "Χρήση μόνιμης διεύθυνσης",
|
||||
"gui_share_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση OnionShare μπορεί να <b>κατεβάσει</b> τα αρχεία σας χρησιμοποιώντας το <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση OnionShare, μπορεί να <b>ανεβάσει</b> αρχεία στον υπολογιστή σας χρησιμοποιώντας το <b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -243,7 +242,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Επιλογή",
|
||||
"mode_settings_receive_data_dir_label": "Αποθήκευση αρχείων σε",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Τερματισμός κοινής χρήσης με την ολοκλήρωση αρχείων (αποεπιλέξτε για λήψη μεμονωμένων αρχείων)",
|
||||
"mode_settings_client_auth_checkbox": "Χρήση εξουσιοδότησης πελάτη",
|
||||
"mode_settings_legacy_checkbox": "Χρήση παλαιάς διεύθυνσης (δεν προτείνεται η χρήση υπηρεσία v2 onion)",
|
||||
"mode_settings_autostop_timer_checkbox": "Προγραμματισμένος τερματισμός",
|
||||
"mode_settings_autostart_timer_checkbox": "Προγραμματισμένη εκκίνηση",
|
||||
|
@ -24,12 +24,12 @@
|
||||
"gui_receive_stop_server_autostop_timer": "Stop Receive Mode ({} remaining)",
|
||||
"gui_receive_flatpak_data_dir": "Because you installed OnionShare using Flatpak, you must save files to a folder in ~/OnionShare.",
|
||||
"gui_copy_url": "Copy Address",
|
||||
"gui_copy_client_auth": "Copy ClientAuth",
|
||||
"gui_copy_client_auth": "Copy Private Key",
|
||||
"gui_canceled": "Canceled",
|
||||
"gui_copied_url_title": "Copied OnionShare Address",
|
||||
"gui_copied_url": "OnionShare address copied to clipboard",
|
||||
"gui_copied_client_auth_title": "Copied ClientAuth",
|
||||
"gui_copied_client_auth": "ClientAuth private key copied to clipboard",
|
||||
"gui_copied_client_auth_title": "Copied Private Key",
|
||||
"gui_copied_client_auth": "Private Key copied to clipboard",
|
||||
"gui_show_url_qr_code": "Show QR Code",
|
||||
"gui_qr_code_dialog_title": "OnionShare QR Code",
|
||||
"gui_waiting_to_start": "Scheduled to start in {}. Click to cancel.",
|
||||
@ -87,9 +87,12 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "The auto-stop time can't be the same or earlier than the auto-start time. Please adjust it to start sharing.",
|
||||
"gui_server_doesnt_support_stealth": "Sorry, this version of Tor doesn't support stealth (Client Authorization). Please try with a newer version of Tor.",
|
||||
"share_via_onionshare": "Share via OnionShare",
|
||||
"gui_share_url_description": "<b>Anyone</b> with this OnionShare address can <b>download</b> your files using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_website_url_description": "<b>Anyone</b> with this OnionShare address can <b>visit</b> your website using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Anyone</b> with this OnionShare address can <b>upload</b> files to your computer using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_share_url_description": "<b>Anyone</b> with this OnionShare address and private key can <b>download</b> your files using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_share_url_public_description": "<b>Anyone</b> with this OnionShare address can <b>download</b> your files using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_website_url_description": "<b>Anyone</b> with this OnionShare address and private key can <b>visit</b> your website using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_website_url_public_description": "<b>Anyone</b> with this OnionShare address can <b>visit</b> your website using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Anyone</b> with this OnionShare address and private key can <b>upload</b> files to your computer using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_public_description": "<b>Anyone</b> with this OnionShare address can <b>upload</b> files to your computer using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_chat_url_description": "<b>Anyone</b> with this OnionShare address can <b>join this chat room</b> using the <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_url_label_persistent": "This share will not auto-stop.<br><br>Every subsequent share reuses the address. (To use one-time addresses, turn off \"Use persistent address\" in the settings.)",
|
||||
"gui_url_label_stay_open": "This share will not auto-stop.",
|
||||
@ -177,10 +180,9 @@
|
||||
"mode_settings_advanced_toggle_hide": "Hide advanced settings",
|
||||
"mode_settings_title_label": "Custom title",
|
||||
"mode_settings_persistent_checkbox": "Save this tab, and automatically open it when I open OnionShare",
|
||||
"mode_settings_public_checkbox": "Don't use a password",
|
||||
"mode_settings_public_checkbox": "This is a public OnionShare service (disables client authentication)",
|
||||
"mode_settings_autostart_timer_checkbox": "Start onion service at scheduled time",
|
||||
"mode_settings_autostop_timer_checkbox": "Stop onion service at scheduled time",
|
||||
"mode_settings_client_auth_checkbox": "Use client authorization",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Stop sharing after files have been sent (uncheck to allow downloading individual files)",
|
||||
"mode_settings_receive_data_dir_label": "Save files to",
|
||||
"mode_settings_receive_data_dir_browse_button": "Browse",
|
||||
@ -207,4 +209,4 @@
|
||||
"error_port_not_available": "OnionShare port not available",
|
||||
"history_receive_read_message_button": "Read Message",
|
||||
"error_tor_protocol_error": "There was an error with Tor: {}"
|
||||
}
|
||||
}
|
||||
|
@ -94,7 +94,6 @@
|
||||
"gui_server_started_after_autostop_timer": "El temporizador de parada automática expiró antes de que se iniciara el servidor. Por favor crea un recurso compartido nuevo.",
|
||||
"gui_server_autostop_timer_expired": "El temporizador de parada automática ya expiró. Por favor ajústalo para comenzar a compartir.",
|
||||
"share_via_onionshare": "Compartir con OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Usar direcciones obsoletas",
|
||||
"gui_save_private_key_checkbox": "Usar una dirección persistente",
|
||||
"gui_share_url_description": "<b>Cualquiera</b> con esta dirección OnionShare puede <b>descargar</b> tus archivos usando el <b>Navegador Tor</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Cualquiera</b> con esta dirección OnionShare puede <b>cargar</b> archivos a tu equipo usando el <b>Navegador Tor</b>: <img src='{}' />",
|
||||
@ -227,7 +226,6 @@
|
||||
"hours_first_letter": "h",
|
||||
"minutes_first_letter": "m",
|
||||
"seconds_first_letter": "s",
|
||||
"invalid_password_guess": "Intento de contraseña incorrecto",
|
||||
"gui_website_url_description": "<b>Cualquiera</b> con esta dirección OnionShare puede <b>visitar</b> tu sitio web usando el <b>Navegador Tor</b>: <img src='{}' />",
|
||||
"gui_mode_website_button": "Publicar sitio web",
|
||||
"systray_site_loaded_title": "Sitio web cargado",
|
||||
@ -243,7 +241,6 @@
|
||||
"systray_individual_file_downloaded_message": "Archivo individual {} visto",
|
||||
"gui_settings_csp_header_disabled_option": "Deshabilitar encabezado de Política de Seguridad de Contenido",
|
||||
"gui_settings_website_label": "Configuración de sitio web",
|
||||
"mode_settings_client_auth_checkbox": "Utilizar autorización de cliente",
|
||||
"mode_settings_legacy_checkbox": "Usar una dirección obsoleta (servicio cebolla v2, no recomendado)",
|
||||
"mode_settings_autostop_timer_checkbox": "Detener el servicio cebolla a una hora determinada",
|
||||
"mode_settings_autostart_timer_checkbox": "Iniciar el servicio cebolla a una hora determinada",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "زمانسنج توقف خودکار، قبل از آغاز کارساز به پایان رسید. لطفا یک همرسانی جدید درست کنید.",
|
||||
"gui_server_autostop_timer_expired": "زمانسنج توقف خودکار به پایان رسید. لطفا برای آغاز همرسانی آن را تنظیم کنید.",
|
||||
"share_via_onionshare": "همرسانی با OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "استفاده از آدرسهای بازمانده",
|
||||
"gui_save_private_key_checkbox": "استفاده از یک آدرس پایا",
|
||||
"gui_share_url_description": "<b>هرکس</b> با این آدرس OnionShare میتواند روی کامپیوتر شما پرونده <b>بارگیری</b> کند از طریق <b>مرورگر تور</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>هرکس</b> با این آدرس OnionShare میتواند روی کامپیوتر شما پرونده <b>بارگذاری</b> کند از طریق <b>مرورگر تور</b>: <img src='{}' />",
|
||||
|
@ -120,7 +120,6 @@
|
||||
"gui_server_autostop_timer_expired": "Automaattinen pysäytysajastin päättyi jo.\nSäädä se jaon aloittamiseksi.",
|
||||
"share_via_onionshare": "Jaa OnionSharella",
|
||||
"gui_connect_to_tor_for_onion_settings": "Yhdistä Tor-verkkoon nähdäksesi onion palvelun asetukset",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Käytä vanhoja osoitteita",
|
||||
"gui_save_private_key_checkbox": "Käytä pysyviä osoitteita",
|
||||
"gui_share_url_description": "<b>Kaikki</b> joilla on tämä OnionShare-osoite voivat <b>ladata</b> tiedostojasi käyttämällä <b>Tor-selainta</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Kaikki</b> joilla on tämä OnionShare-osoite voivat <b>lähettää</b>tiedostoja tietokoneellesi käyttämällä <b>Tor-selainta</b>: <img src='{}' />",
|
||||
@ -218,7 +217,6 @@
|
||||
"gui_new_tab_tooltip": "Avaa uusi välilehti",
|
||||
"gui_new_tab": "Uusi välilehti",
|
||||
"mode_settings_website_disable_csp_checkbox": "Poista 'Sisällön suojauskäytännön' otsikko käytöstä (mahdollistaa kolmansien osapuolien resurssien käytön nettisivussasi)",
|
||||
"mode_settings_client_auth_checkbox": "Käytä asiakkaan valtuutusta",
|
||||
"mode_settings_legacy_checkbox": "Käytä vanhaa osoitetta (v2 onion-palvelu, ei suositella)",
|
||||
"mode_settings_autostop_timer_checkbox": "Lopeta onion-palvelu tiettyyn kellon aikaan",
|
||||
"mode_settings_autostart_timer_checkbox": "Aloita onion-palvelu tiettyyn kellon aikaan",
|
||||
|
@ -159,7 +159,6 @@
|
||||
"update_error_invalid_latest_version": "Impossible de vérifier la présence d’une mise à jour : le site Web d’OnionShare indique que la version la plus récente est la « {} » qui n’est pas reconnue…",
|
||||
"gui_tor_connection_ask": "Ouvrir les paramètres pour résoudre le problème de connexion à Tor ?",
|
||||
"gui_tor_connection_canceled": "Impossible de se connecter à Tor.\n\nAssurez-vous d’être connecté à Internet, puis rouvrez OnionShare et configurez sa connexion à Tor.",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Utiliser les adresses héritées",
|
||||
"info_in_progress_uploads_tooltip": "{} envoi(s) en cours",
|
||||
"info_completed_uploads_tooltip": "{} envoi(s) terminé(s)",
|
||||
"error_cannot_create_downloads_dir": "Impossible de créer le dossier du mode réception : {}",
|
||||
@ -229,7 +228,6 @@
|
||||
"systray_website_started_title": "Début du partage du site Web",
|
||||
"systray_website_started_message": "Quelqu’un visite votre site Web",
|
||||
"gui_website_mode_no_files": "Aucun site Web n’a encore été partagé",
|
||||
"invalid_password_guess": "La tentative de mot de passe est invalide",
|
||||
"gui_mode_website_button": "Publier un site Web",
|
||||
"incorrect_password": "Le mot de passe est erroné",
|
||||
"gui_settings_individual_downloads_label": "Décocher pour permettre le téléchargement de fichiers individuels",
|
||||
@ -254,7 +252,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Parcourir",
|
||||
"mode_settings_receive_data_dir_label": "Enregistrer les fichiers dans",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Cesser le partage une fois que les fichiers ont été envoyés (décocher afin de permettre le téléchargement de fichiers individuels)",
|
||||
"mode_settings_client_auth_checkbox": "Utiliser l’autorisation du client",
|
||||
"mode_settings_legacy_checkbox": "Utiliser une ancienne adresse (service onion v2, non recommandée)",
|
||||
"mode_settings_public_checkbox": "Ne pas utiliser un mot de passe",
|
||||
"mode_settings_persistent_checkbox": "Enregistrer cet onglet et l’ouvrir automatiquement quand j’ouvre OnionShare",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Bhí an t-amadóir uathstoptha caite sular thosaigh an freastalaí. Caithfidh tú comhroinnt nua a chruthú.",
|
||||
"gui_server_autostop_timer_expired": "Tá an t-amadóir uathstoptha caite cheana. Caithfidh tú é a athshocrú sular féidir leat comhaid a chomhroinnt.",
|
||||
"share_via_onionshare": "Comhroinn trí OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Úsáid seoltaí sean-nóis",
|
||||
"gui_save_private_key_checkbox": "Úsáid seoladh seasmhach",
|
||||
"gui_share_url_description": "Tá <b>aon duine</b> a bhfuil an seoladh OnionShare aige/aici in ann do chuid comhad a <b>íoslódáil</b> le <b>Brabhsálaí Tor</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "Tá <b>aon duine</b> a bhfuil an seoladh OnionShare aige/aici in ann comhaid a <b>uaslódáil</b> go dtí do ríomhaire le <b>Brabhsálaí Tor</b>: <img src='{}' />",
|
||||
|
@ -166,7 +166,6 @@
|
||||
"mode_settings_autostart_timer_checkbox": "Iniciar o servizo onion na hora programada",
|
||||
"mode_settings_autostop_timer_checkbox": "Deter o servizo onion na hora programada",
|
||||
"mode_settings_legacy_checkbox": "Usar enderezos antigos (servizo onion v2, non recomendado)",
|
||||
"mode_settings_client_auth_checkbox": "Usar autorización do cliente",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Deixar de compartir unha vez enviado o ficheiro (desmarca para permitir a descarga de ficheiros individuais)",
|
||||
"mode_settings_receive_data_dir_label": "Gardar ficheiros en",
|
||||
"mode_settings_receive_data_dir_browse_button": "Navegar",
|
||||
|
@ -131,7 +131,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -134,7 +134,6 @@
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_connect_to_tor_for_onion_settings": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -119,7 +119,6 @@
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_connect_to_tor_for_onion_settings": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -110,7 +110,6 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Vrijeme za automatsko prekidanje ne može biti isto kao vrijeme za automatsko pokretanje ili ranije. Za pokretanje dijeljenja, podesi vrijeme.",
|
||||
"share_via_onionshare": "Dijeli putem OnionSharea",
|
||||
"gui_connect_to_tor_for_onion_settings": "Poveži se s Torom za prikaz postavki Onion usluge",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Koristi stare adrese",
|
||||
"gui_save_private_key_checkbox": "Koristi trajnu adresu",
|
||||
"gui_share_url_description": "<b>Svatko</b> s ovom OnionShare adresom može <b>preuzeti</b> tvoje datoteke koristeći <b>Tor preglednik</b>: <img src='{}' />",
|
||||
"gui_website_url_description": "<b>Svatko</b> s ovom OnionShare adresom može <b>posjetiti</b> tvoju web-stranicu koristeći <b>Tor preglednik</b>: <img src='{}' />",
|
||||
@ -180,7 +179,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Pregledaj",
|
||||
"mode_settings_receive_data_dir_label": "Spremi datoteke u",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Prekini dijeljenje nakon što se datoteke pošalju (deaktiviraj za preuzimanje pojedinačnih datoteka)",
|
||||
"mode_settings_client_auth_checkbox": "Koristi autorizaciju klijenta",
|
||||
"mode_settings_legacy_checkbox": "Koristi stare adrese (v2 onion usluge, ne preporučuje se)",
|
||||
"mode_settings_autostop_timer_checkbox": "Prekini onion uslugu u planirano vrijeme",
|
||||
"mode_settings_autostart_timer_checkbox": "Pokreni onion uslugu u planirano vrijeme",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Timer berhenti otomatis habis sebelum server dimulai. Silakan buat pembagian baru.",
|
||||
"gui_server_autostop_timer_expired": "Timer berhenti otomatis sudah habis. Silakan sesuaikan untuk mulai berbagi.",
|
||||
"share_via_onionshare": "Bagikan via OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "<b>Siapa saja</b> dengan alamat OnionShare ini dapat <b>mengunduh</b> berkas Anda menggunakan <b>Tor Browser</b>:<img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Siapa saja</b> dengan alamat OnionShare ini dapat <b>mengunggah</b> berkas ke komputer Anda menggunakan <b>Tor Browser</b>:<img src='{}' />",
|
||||
@ -213,7 +212,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Telusur",
|
||||
"mode_settings_receive_data_dir_label": "Simpan file ke",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Berhenti berbagi setelah file dikirim (hapus centang untuk memperbolehkan mengunduh file individual)",
|
||||
"mode_settings_client_auth_checkbox": "Gunakan otorisasi klien",
|
||||
"mode_settings_legacy_checkbox": "Gunakan alamat legacy (layanan onion v2, tidak disarankan)",
|
||||
"mode_settings_autostop_timer_checkbox": "Hentikan layanan onion pada waktu yang dijadwalkan",
|
||||
"mode_settings_autostart_timer_checkbox": "Mulai layanan onion pada waktu yang dijadwalkan",
|
||||
|
@ -129,7 +129,6 @@
|
||||
"gui_tor_connection_lost": "Aftengt frá Tor.",
|
||||
"gui_server_autostop_timer_expired": "Sjálfvirkri niðurtalningu er þegar lokið. Lagaðu hana til að hefja deilingu.",
|
||||
"share_via_onionshare": "Deila með OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Nota eldri vistföng",
|
||||
"gui_save_private_key_checkbox": "Nota viðvarandi vistföng",
|
||||
"gui_share_url_description": "<b>Hver sem er</b> með þetta OnionShare vistfang getur <b>sótt</b> skrárnar þínar með því að nota <b>Tor-vafrann</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Hver sem er</b> með þetta OnionShare vistfang getur <b>sent skrár inn</b> á tölvuna þína með því að nota <b>Tor-vafrann</b>: <img src='{}' />",
|
||||
@ -222,7 +221,6 @@
|
||||
"hours_first_letter": "klst",
|
||||
"minutes_first_letter": "mín",
|
||||
"seconds_first_letter": "sek",
|
||||
"invalid_password_guess": "Ógilt lykilorð",
|
||||
"gui_website_url_description": "<b>Hver sem er</b> með þetta OnionShare vistfang getur <b>skoðað</b> vefsvæðið þitt með því að nota <b>Tor-vafrann</b>: <img src='{}' />",
|
||||
"gui_mode_website_button": "Birta vefsvæði",
|
||||
"gui_website_mode_no_files": "Ennþá hefur engu vefsvæði verið deilt",
|
||||
@ -252,7 +250,6 @@
|
||||
"mode_settings_advanced_toggle_show": "Birta ítarlegar stillingar",
|
||||
"gui_new_tab_tooltip": "Opna nýjan flipa",
|
||||
"gui_new_tab_receive_button": "Taka á móti skrám",
|
||||
"mode_settings_client_auth_checkbox": "Nota auðkenningu biðlaraforrits",
|
||||
"mode_settings_advanced_toggle_hide": "Fela ítarlegar stillingar",
|
||||
"gui_quit_warning_cancel": "Hætta við",
|
||||
"gui_close_tab_warning_title": "Ertu viss?",
|
||||
|
@ -136,7 +136,6 @@
|
||||
"gui_server_autostop_timer_expired": "Il timer di arresto automatico è già scaduto. Si prega di modificarlo per iniziare la condivisione.",
|
||||
"share_via_onionshare": "Condividi via OnionShare",
|
||||
"gui_connect_to_tor_for_onion_settings": "Connetti a Tor per vedere le impostazioni del servizio onion",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Usa gli indirizzi legacy",
|
||||
"gui_save_private_key_checkbox": "Usa un indirizzo persistente",
|
||||
"gui_share_url_description": "<b>1 Tutti</b>2 con questo l'indirizzo di OnionShare possono <b>3 scaricare</b>4 i tuoi file usando <b>5 il Browser Tor</b>6: <img src='{}' />7",
|
||||
"gui_receive_url_description": "<b>1 Tutti</b>2 con questo indirizzo OnionShare possono <b>3 caricare</b>4 file nel tuo computer usando <b>5 Tor Browser</b>6: <img src='{}' />7",
|
||||
@ -262,7 +261,6 @@
|
||||
"gui_close_tab_warning_website_description": "Stai ospitando un sito web. Sei sicuro di voler chiudere questa scheda?",
|
||||
"mode_settings_website_disable_csp_checkbox": "Non inviare l'intestazione della Politica sulla Sicurezza dei Contenuti (consente al sito web di utilizzare risorse di terze parti)",
|
||||
"mode_settings_receive_data_dir_browse_button": "Naviga",
|
||||
"mode_settings_client_auth_checkbox": "Usa l'autorizzazione del client",
|
||||
"mode_settings_autostop_timer_checkbox": "Interrompere il servizio onion all'ora pianificata",
|
||||
"mode_settings_autostart_timer_checkbox": "Avviare il servizio onion all'ora pianificata",
|
||||
"mode_settings_persistent_checkbox": "Salva questa scheda e aprirla automaticamente quando apro OnionShare",
|
||||
|
@ -134,7 +134,6 @@
|
||||
"gui_server_autostop_timer_expired": "自動停止タイマーはすでにタイムアウトしています。共有し始めるにはタイマーを調整して下さい。",
|
||||
"share_via_onionshare": "OnionShareで共有する",
|
||||
"gui_connect_to_tor_for_onion_settings": "onionサービス設定を見るのにTorと接続して下さい",
|
||||
"gui_use_legacy_v2_onions_checkbox": "レガシーアドレスを使用する",
|
||||
"gui_save_private_key_checkbox": "永続的アドレスを使用する",
|
||||
"gui_share_url_description": "このOnionShareアドレスを持つ限り<b>誰でも</b>は<b>Tor Browser</b>を利用してこのファイルを<b>ダウンロードできます</b>:<img src='{}' />",
|
||||
"gui_receive_url_description": "このOnionShareアドレスを持つ限り<b>誰でも</b>は<b>Tor Browser</b>を利用してこのPCにファイルを<b>アップロードできます</b>:<img src='{}' />",
|
||||
@ -234,7 +233,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "閲覧",
|
||||
"mode_settings_receive_data_dir_label": "保存するファイルの位置",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "ファイル送信が終了したら共有を停止(個別ファイルのダウンロードを許可するにはチェックマークを消す)",
|
||||
"mode_settings_client_auth_checkbox": "クライアント認証を利用",
|
||||
"mode_settings_legacy_checkbox": "レガシーアドレスを利用する(v2 onionサービス、非推奨)",
|
||||
"mode_settings_autostop_timer_checkbox": "指定の日時にonionサービスを停止する",
|
||||
"mode_settings_autostart_timer_checkbox": "指定の日時にonionサービスを起動する",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -107,7 +107,6 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_connect_to_tor_for_onion_settings": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -131,7 +131,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -131,7 +131,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -109,7 +109,6 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Automatinio sustabdymo laikas negali būti toks pat arba ankstesnis už automatinio paleidimo laiką. Sureguliuokite jį, kad galėtumėte pradėti dalytis.",
|
||||
"share_via_onionshare": "Bendrinti per OnionShare",
|
||||
"gui_connect_to_tor_for_onion_settings": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "<b>Visi</b>, turintys šį OnionShare adresą gali <b>atsisiųsti</b> jūsų failus, naudodamiesi <b>Tor Naršykle</b>: <img src='{}' />",
|
||||
"gui_website_url_description": "<b>Kiekvienas</b>, turintis šį „OnionShare“ adresą, gali <b>apsilankyti</b> jūsų svetainėje naudodamas <b>„Tor“ naršyklę</b>: <img src='{}' />",
|
||||
@ -200,7 +199,6 @@
|
||||
"mode_settings_autostart_timer_checkbox": "Pradėti onion paslaugos paleidimą suplanuotu laiku",
|
||||
"mode_settings_autostop_timer_checkbox": "Sustabdyti onion paslaugos paleidimą suplanuotu laiku",
|
||||
"mode_settings_legacy_checkbox": "Naudoti senąjį adresą (nerekomenduojama naudoti v2 onion paslaugos)",
|
||||
"mode_settings_client_auth_checkbox": "Naudoti kliento autorizavimą",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Sustabdyti dalijimąsi po to, kai failai buvo išsiųsti (atžymėkite, jei norite leisti atsisiųsti atskirus failus)",
|
||||
"mode_settings_receive_data_dir_label": "Įrašyti failus į",
|
||||
"mode_settings_receive_data_dir_browse_button": "Naršyti",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -119,7 +119,6 @@
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_connect_to_tor_for_onion_settings": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -131,7 +131,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Tidsavbruddsuret gikk ut før tjeneren startet. Lag en ny deling.",
|
||||
"gui_server_autostop_timer_expired": "Tidsavbruddsuret har gått ut allerede. Juster det for å starte deling.",
|
||||
"share_via_onionshare": "Del via OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Bruk gammeldagse adresser",
|
||||
"gui_save_private_key_checkbox": "Bruk en vedvarende adresse",
|
||||
"gui_share_url_description": "<b>Alle</b> som har denne OnionShare-adressen kan <b>Laste ned</b> filene dine ved bruk av <b>Tor-Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Alle</b> som har denne OnionShare-adressen kan <b>Laste opp</b> filer til din datamaskin ved bruk av <b>Tor-Browser</b>: <img src='{}' />",
|
||||
@ -234,7 +233,6 @@
|
||||
"systray_website_started_title": "Starter deling av nettside",
|
||||
"systray_website_started_message": "Noen besøker din nettside",
|
||||
"gui_website_mode_no_files": "Ingen nettside delt enda",
|
||||
"invalid_password_guess": "Feil passord",
|
||||
"incorrect_password": "Feil passord",
|
||||
"gui_settings_individual_downloads_label": "Forby nedlasting av enkeltfiler",
|
||||
"history_requests_tooltip": "{} vevforespørsler",
|
||||
@ -274,7 +272,6 @@
|
||||
"gui_open_folder_error": "Klarte ikke å åpne mappe med xdg-open. Filen er her: {}",
|
||||
"gui_receive_flatpak_data_dir": "Fordi du har installert OnionShare som Flatpak må du lagre filer til en mappe i ~/OnionShare.",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Stopp deling etter at filer er sendt (fravelg for å tillate nedlasting av individuelle filer)",
|
||||
"mode_settings_client_auth_checkbox": "Bruk klient-identitetsgodkjennelse",
|
||||
"gui_close_tab_warning_persistent_description": "Denne fanen er vedvarende. Hvis du lukker den vil du miste onion-adressen den bruker. Er du sikker på at du vil lukke den?",
|
||||
"gui_tab_name_chat": "Prat",
|
||||
"gui_tab_name_website": "Nettside",
|
||||
|
@ -132,7 +132,6 @@
|
||||
"error_tor_protocol_error_unknown": "Er was een onbekende fout met Tor",
|
||||
"error_invalid_private_key": "Dit type privésleutel wordt niet ondersteund",
|
||||
"gui_tor_connection_lost": "De verbinding met Tor is verbroken.",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Gebruik ouderwetse adressen",
|
||||
"gui_save_private_key_checkbox": "Gebruik een vast adres",
|
||||
"gui_share_url_description": "<b>1Iedereen</b>2 met dit OnionShare-adres kan je bestanden <b>3binnenhalen</b>4 met de <b>5Tor Browser</b>6: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Iedereen</b> met dit OnionShare adres kan bestanden op je computer <b>plaatsen</b> met de <b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -255,7 +254,6 @@
|
||||
"mode_settings_website_disable_csp_checkbox": "Stuur geen Content Security Policy header (hiermee kan uw website bronnen van derden gebruiken)",
|
||||
"mode_settings_receive_data_dir_browse_button": "Blader",
|
||||
"mode_settings_receive_data_dir_label": "Bewaar bestanden in",
|
||||
"mode_settings_client_auth_checkbox": "Gebruik client authorisatie",
|
||||
"mode_settings_autostop_timer_checkbox": "Stop onion service op een geplande tijd",
|
||||
"mode_settings_autostart_timer_checkbox": "Start onion service op een geplande tijd",
|
||||
"mode_settings_persistent_checkbox": "Bewaar dit tabblad en open het automatisch wanneer ik OnionShare open",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Czasomierz automatycznego rozpoczęcia wygasł przed uruchomieniem serwera. Utwórz nowy udział.",
|
||||
"gui_server_autostop_timer_expired": "Czasomierz automatycznego rozpoczęcia wygasł. Dostosuj go, aby rozpocząć udostępnianie.",
|
||||
"share_via_onionshare": "Udostępniaj przez OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Użyj starszych adresów",
|
||||
"gui_save_private_key_checkbox": "Użyj stałego adresu",
|
||||
"gui_share_url_description": "<b>Każdy</b> z tym adresem OnionShare może <b> pobrać</b> Twoje pliki za pomocą przeglądarki <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Każdy</b> z tym adresem OnionShare może <b>przesyłać</b> pliki na komputer za pomocą przeglądarki <b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -261,7 +260,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Przeglądaj",
|
||||
"mode_settings_receive_data_dir_label": "Zapisz pliki do",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Zatrzymaj udostępnianie po wysłaniu plików (usuń zaznaczenie, aby umożliwić pobieranie pojedynczych plików)",
|
||||
"mode_settings_client_auth_checkbox": "Użyj autoryzacji klienta",
|
||||
"mode_settings_legacy_checkbox": "Użyj starszego adresu (onion service v2, niezalecane)",
|
||||
"mode_settings_autostop_timer_checkbox": "Zatrzymaj usługę cebulową w zaplanowanym czasie",
|
||||
"mode_settings_autostart_timer_checkbox": "Uruchomienie usługi cebulowej w zaplanowanym czasie",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "O cronômetro de parada automática acabou antes que o servidor fosse iniciado. Por favor, faça um novo compartilhamento.",
|
||||
"gui_server_autostop_timer_expired": "O cronômetro já esgotou. Por favor, ajuste-o para começar a compartilhar.",
|
||||
"share_via_onionshare": "Compartilhar via OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Usar endereços do tipo antigo",
|
||||
"gui_save_private_key_checkbox": "Usar o mesmo endereço",
|
||||
"gui_share_url_description": "<b>Qualquer pessoa</b> com este endereço do OnionShare pode <b>baixar</b> seus arquivos usando o <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Qualquer pessoa</b> com este endereço do OnionShare pode <b>carregar</b> arquivos no seu computador usando o <b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -235,7 +234,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Navegar",
|
||||
"mode_settings_receive_data_dir_label": "Salvar arquivos em",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Interrompa o compartilhamento após o envio dos arquivos (desmarque para permitir o download de arquivos individuais)",
|
||||
"mode_settings_client_auth_checkbox": "Usar autorização de cliente",
|
||||
"mode_settings_legacy_checkbox": "Usar um endereço herdado (serviço de onion v2, não recomendado)",
|
||||
"mode_settings_autostop_timer_checkbox": "Interromper o serviço de onion na hora programada",
|
||||
"mode_settings_autostart_timer_checkbox": "Iniciar serviço de onion na hora programada",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "O cronómetro de paragem automática atingiu o tempo limite antes do servidor iniciar. Crie uma nova partilha.",
|
||||
"gui_server_autostop_timer_expired": "O cronómetro de paragem automática expirou. Por favor, ajuste-o para começar a partilhar.",
|
||||
"share_via_onionshare": "Partilhar via OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Usar endereços antigos",
|
||||
"gui_save_private_key_checkbox": "Usar um endereço persistente",
|
||||
"gui_share_url_description": "<b>Qualquer pessoa</b> com este endereço do OnionShare pode <b>descarregar</b> os seus ficheiros utilizando o <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Qualquer pessoa</b> com este endereço do OnionShare pode <b>enviar</b> ficheiros para o seu computador utilizando o <b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -251,7 +250,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Navegar",
|
||||
"mode_settings_receive_data_dir_label": "Guardar ficheiros para",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Parar a partilha de ficheiros após terem sido enviados (desmarque para permitir o descarregamento de ficheiros individuais)",
|
||||
"mode_settings_client_auth_checkbox": "Utilizar autorização do cliente",
|
||||
"mode_settings_legacy_checkbox": "Utilize um endereço de herança (serviço onion v2, não é recomendado)",
|
||||
"mode_settings_persistent_checkbox": "Guarda esta aba e abre-a automaticamente quando eu inicio o OnionShare",
|
||||
"gui_quit_warning_description": "A partilha está ativa em algumas das suas abas. Se sair, todas as abas serão fechadas. Tem a certeza que pretende sair?",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Cronometrul de oprire automată a expirat înainte de pornirea serverului. Vă rugăm să faceți o nouă partajare.",
|
||||
"gui_server_autostop_timer_expired": "Timpul pentru cronometrul auto-stop a expirat deja. Vă rugăm să îl modificați pentru a începe distribuirea.",
|
||||
"share_via_onionshare": "Partajați prin OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Folosire adrese moștenite",
|
||||
"gui_save_private_key_checkbox": "Folosiți o adresă persistentă",
|
||||
"gui_share_url_description": "<b>Oricine</b> are această adresă OnionShare poate <b>descărca</b> fișierele dvs. folosind <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Oricine</b> are această adresă OnionShare poate <b>încărca</b> fișiere pe computerul dvs. folosind <b>Tor Browser</b>: <img src='{}' />",
|
||||
|
@ -137,7 +137,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Время стоп-таймера истекло до того, как сервер был запущен. Пожалуйста, отправьте файлы заново.",
|
||||
"gui_server_autostop_timer_expired": "Время стоп-таймера истекло. Пожалуйста, отрегулируйте его для начала отправки.",
|
||||
"share_via_onionshare": "Поделиться через OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Используйте устаревшие адреса",
|
||||
"gui_save_private_key_checkbox": "Используйте постоянный адрес",
|
||||
"gui_share_url_description": "<b>Кто угодно</b> c этим адресом OnionShare может <b>скачать</b> Ваши файлы при помощи <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Кто угодно</b> c этим адресом OnionShare может <b>загрузить</b> файлы на ваш компьютер с помощью<b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -236,7 +235,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Обзор файлов",
|
||||
"mode_settings_receive_data_dir_label": "Сохранять файлы в",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Закрыть доступ к файлам после их отправки (отмените чтобы разрешить скачивание отдельных файлов)",
|
||||
"mode_settings_client_auth_checkbox": "Использовать авторизацию клиента",
|
||||
"mode_settings_legacy_checkbox": "Использовать устаревшую версию адресов (версия 2 сервиса Тор, не рукомендуем)",
|
||||
"mode_settings_autostop_timer_checkbox": "Отключить сервис onion в назначенное время",
|
||||
"mode_settings_autostart_timer_checkbox": "Запустить сервис onion в назначенное время",
|
||||
|
@ -167,7 +167,6 @@
|
||||
"mode_settings_autostart_timer_checkbox": "",
|
||||
"mode_settings_autostop_timer_checkbox": "",
|
||||
"mode_settings_legacy_checkbox": "",
|
||||
"mode_settings_client_auth_checkbox": "",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "",
|
||||
"mode_settings_receive_data_dir_label": "",
|
||||
"mode_settings_receive_data_dir_browse_button": "",
|
||||
|
@ -166,7 +166,6 @@
|
||||
"mode_settings_autostart_timer_checkbox": "Spustiť onion službu v plánovanom čase",
|
||||
"mode_settings_autostop_timer_checkbox": "Zastaviť onion službu v plánovanom čase",
|
||||
"mode_settings_legacy_checkbox": "Použiť staršiu adresu (v2 onion služba, neodporúča sa)",
|
||||
"mode_settings_client_auth_checkbox": "Použiť autorizáciu klienta",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Po odoslaní súborov zastaviť zdieľanie (zrušením začiarknutia povolíte sťahovanie jednotlivých súborov)",
|
||||
"mode_settings_receive_data_dir_label": "Uložiť súbory do",
|
||||
"mode_settings_receive_data_dir_browse_button": "Prechádzať",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -134,7 +134,6 @@
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_connect_to_tor_for_onion_settings": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -110,7 +110,6 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Vreme automatskog zaustavljanja ne može biti isto ili ranije od vremena početka automatskog pokretanja. Podesi ga da bi započelo deljenje.",
|
||||
"share_via_onionshare": "Deljenje pomoću OnionShare",
|
||||
"gui_connect_to_tor_for_onion_settings": "Poveži se sa Torom da bi video postavke onion servisa",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Koristi nasleđene adrese",
|
||||
"gui_save_private_key_checkbox": "Koristi trajnu adresu",
|
||||
"gui_share_url_description": "<b>Svako</b> sa ovom OnionShare sdresom može <b>preuzeti</b> tvoje datoteke koristeći <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_website_url_description": "<b>Svako</b> sa ovom OnionShare adresom može <b>posetiti</b> tvoju veb-stranicu koristeći <b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -188,7 +187,6 @@
|
||||
"gui_close_tab_warning_persistent_description": "Ovaj jezičak je postojan. Ako ga zatvorite, izgubićete onion adresu koju koristite. Da li ste sigurni da želite zatvoriti?",
|
||||
"mode_settings_receive_data_dir_browse_button": "Pronađi",
|
||||
"mode_settings_receive_data_dir_label": "Sačuvaj fajlove u",
|
||||
"mode_settings_client_auth_checkbox": "Koristi klijentsku autorizaciju",
|
||||
"mode_settings_legacy_checkbox": "Koristite zastarelu adresu (v2 onion servis, nije preporučeno)",
|
||||
"mode_settings_autostop_timer_checkbox": "Zaustavi onion servis u planirano vreme",
|
||||
"mode_settings_autostart_timer_checkbox": "Pokreni onion servis u planirano vreme",
|
||||
|
@ -131,7 +131,6 @@
|
||||
"gui_server_started_after_autostop_timer": "Tiden för den automatiska stopp-tidtagaren löpte ut innan servern startades.\nVänligen gör en ny delning.",
|
||||
"gui_server_autostop_timer_expired": "Den automatiska stopp-tidtagaren har redan löpt ut. Vänligen justera den för att starta delning.",
|
||||
"share_via_onionshare": "Dela med OnionShare",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Använd äldre adresser",
|
||||
"gui_save_private_key_checkbox": "Använd en beständig adress",
|
||||
"gui_share_url_description": "<b>Alla</b> med denna OnionShare-adress kan <b>hämta</b> dina filer med <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Alla</b> med denna OnionShare-adress kan <b>ladda upp</b> filer till din dator med <b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -222,7 +221,6 @@
|
||||
"hours_first_letter": "t",
|
||||
"minutes_first_letter": "m",
|
||||
"seconds_first_letter": "s",
|
||||
"invalid_password_guess": "Ogiltig lösenordsgissning",
|
||||
"gui_website_url_description": "<b>Alla</b> med denna OnionShare-adress kan <b>besöka</b> din webbplats med <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_mode_website_button": "Publicera webbplats",
|
||||
"systray_site_loaded_title": "Webbplats inläst",
|
||||
@ -243,7 +241,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Bläddra",
|
||||
"mode_settings_receive_data_dir_label": "Spara filer till",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Stoppa delning efter att filer har skickats (avmarkera för att tillåta hämtning av enskilda filer)",
|
||||
"mode_settings_client_auth_checkbox": "Använd klientauktorisering",
|
||||
"mode_settings_legacy_checkbox": "Använd en äldre adress (v2-oniontjänst, rekommenderas inte)",
|
||||
"mode_settings_autostart_timer_checkbox": "Starta oniontjänsten vid schemalagd tid",
|
||||
"mode_settings_autostop_timer_checkbox": "Stoppa oniontjänsten vid schemalagd tid",
|
||||
|
@ -107,7 +107,6 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_connect_to_tor_for_onion_settings": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -107,7 +107,6 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "స్వయంచాలక ఆగు సమయం అనేది స్వయంచాలక ప్రారంభ సమయంతో సమానంగా లేదా అంతకు ముందు ఉండకూడదు. పంచుకోవడం ప్రారంభించడం కొరకు దయచేసి దానిని నవీకరించండి.",
|
||||
"share_via_onionshare": "OnionShare చేయి",
|
||||
"gui_connect_to_tor_for_onion_settings": "Onion సేవా అమరికలను చూచుటకు Torతో అనుసంధానించు",
|
||||
"gui_use_legacy_v2_onions_checkbox": "పాత చిరునామాలు వాడు",
|
||||
"gui_save_private_key_checkbox": "ఒక నిరంతర చిరునామాను వాడు",
|
||||
"gui_share_url_description": "ఈOnionShare చిరునామా గల <b>ఎవరైనా</b> మీ దస్త్రాలను <b>Tor విహారిణి</b>తో <b>దింపుకోవచ్చు</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "ఈOnionShare చిరునామా గల <b>ఎవరైనా</b> మీ దస్త్రాలను <b>Tor విహారిణి</b>తో <b>ఎక్కించుకోవచ్చు</b>:<img src='{}' />",
|
||||
|
@ -120,7 +120,6 @@
|
||||
"gui_server_autostop_timer_expired": "Otomatik durma sayacı zaten sona ermiş. Paylaşmaya başlamak için sayacı ayarlayın.",
|
||||
"share_via_onionshare": "OnionShare ile paylaş",
|
||||
"gui_connect_to_tor_for_onion_settings": "Onion hizmet ayarlarını görmek için Tor bağlantısı kurun",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Eski adresler kullanılsın",
|
||||
"gui_save_private_key_checkbox": "Kalıcı bir adres kullanılsın",
|
||||
"gui_share_url_description": "Bu OnionShare adresine sahip olan <b>herkes</b> <b>Tor Browser</b> kullanarak dosyalarınızı <b>indirebilir</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "Bu OnionShare adresine sahip olan <b>herkes</b> <b>Tor Browser</b> kullanarak dosyaları bilgisayarınıza <b>yükleyebilir</b>: <img src='{}' />",
|
||||
@ -193,7 +192,6 @@
|
||||
"hours_first_letter": "s",
|
||||
"minutes_first_letter": "d",
|
||||
"seconds_first_letter": "sn",
|
||||
"invalid_password_guess": "Geçersiz parola tahmini",
|
||||
"gui_website_url_description": "Bu OnionShare adresine sahip olan <b>herkes</b> <b>Tor Browser</b> kullanarak web sitenizi <b>ziyaret edebilir</b>: <img src='{}' />",
|
||||
"gui_mode_website_button": "Web Sitesini Yayınla",
|
||||
"gui_website_mode_no_files": "Henüz Bir Web Sitesi Paylaşılmadı",
|
||||
@ -206,7 +204,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "Göz at",
|
||||
"mode_settings_receive_data_dir_label": "Dosyaları şuraya kaydet",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Dosyalar gönderildikten sonra paylaşmayı durdur (dosyaların tek tek indirilmesine izin vermek için işareti kaldırın)",
|
||||
"mode_settings_client_auth_checkbox": "İstemci kimlik doğrulaması kullan",
|
||||
"mode_settings_legacy_checkbox": "Eski bir adres kullan (v2 onion hizmeti, tavsiye edilmez)",
|
||||
"mode_settings_autostop_timer_checkbox": "Onion hizmetini zamanlanan saatte durdur",
|
||||
"mode_settings_autostart_timer_checkbox": "Onion hizmetini zamanlanan saatte başlat",
|
||||
|
@ -107,7 +107,6 @@
|
||||
"gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Час автоспину не може бути однаковим або ранішим за час автоматичного запуску. Налаштуйте його, щоб почати надсилання.",
|
||||
"share_via_onionshare": "Поділитися через OnionShare",
|
||||
"gui_connect_to_tor_for_onion_settings": "З'єднайтеся з Tor, щоб побачити параметри служби onion",
|
||||
"gui_use_legacy_v2_onions_checkbox": "Використовувати застарілі адреси",
|
||||
"gui_save_private_key_checkbox": "Використовувати постійну адресу",
|
||||
"gui_share_url_description": "<b>Будь-хто</b>, за допомогою цієї адреси, може <b>завантажити</b> ваші файли, через <b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>Будь-хто</b>, за допомогою цієї адреси, може <b>завантажити</b> файли до вашого комп'ютера через <b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -183,7 +182,6 @@
|
||||
"mode_settings_website_disable_csp_checkbox": "Не надсилати заголовок політики безпеки вмісту (дозволяє вебсайту застосовувати сторонні ресурси)",
|
||||
"mode_settings_receive_data_dir_label": "Зберігати файли до",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "Закрити доступ, коли файли надіслано (приберіть позначку, щоб дозволити завантаження окремих файлів)",
|
||||
"mode_settings_client_auth_checkbox": "Застосовувати авторизацію клієнта",
|
||||
"mode_settings_legacy_checkbox": "Користуватися застарілою адресою (служба onion v2, не рекомендовано)",
|
||||
"mode_settings_autostop_timer_checkbox": "Зупинити службу onion у запланований час",
|
||||
"mode_settings_autostart_timer_checkbox": "Запускати службу onion у запланований час",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -131,7 +131,6 @@
|
||||
"gui_server_started_after_autostop_timer": "",
|
||||
"gui_server_autostop_timer_expired": "",
|
||||
"share_via_onionshare": "",
|
||||
"gui_use_legacy_v2_onions_checkbox": "",
|
||||
"gui_save_private_key_checkbox": "",
|
||||
"gui_share_url_description": "",
|
||||
"gui_receive_url_description": "",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "在服务器启动之前,自动停止的定时器的计时已到。请建立一个新的共享。",
|
||||
"gui_server_autostop_timer_expired": "自动停止的定时器计时已到。请对其调整以开始共享。",
|
||||
"share_via_onionshare": "通过 OnionShare 共享",
|
||||
"gui_use_legacy_v2_onions_checkbox": "使用老式地址",
|
||||
"gui_save_private_key_checkbox": "使用长期地址",
|
||||
"gui_share_url_description": "<b>任何人</b>只要有这个 OnionShare 地址,都可以用<b> Tor Browser </b>来<b>下载</b>您的文件:<img src='{}' />",
|
||||
"gui_receive_url_description": "<b>任何人</b>只要有这个 OnionShare 地址,都可以用<b> Tor Browser </b>向您的电脑<b>上传</b>文件:<img src='{}' />",
|
||||
@ -234,7 +233,6 @@
|
||||
"mode_settings_receive_data_dir_browse_button": "浏览",
|
||||
"mode_settings_receive_data_dir_label": "保存文件到",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "文件传送完后停止共享(取消选中可允许下载单个文件)",
|
||||
"mode_settings_client_auth_checkbox": "使用客户端认证",
|
||||
"mode_settings_legacy_checkbox": "使用旧地址(v2 onion服务,不推荐)",
|
||||
"mode_settings_autostop_timer_checkbox": "定时停止onion服务",
|
||||
"mode_settings_autostart_timer_checkbox": "定时起动onion服务",
|
||||
|
@ -130,7 +130,6 @@
|
||||
"gui_server_started_after_autostop_timer": "在服務器啓動之前,自動停止的定時器的計時已到。請建立一個新的共享。",
|
||||
"gui_server_autostop_timer_expired": "自動停止計時器時間已到。請調整它來開始分享。",
|
||||
"share_via_onionshare": "使用OnionShare分享",
|
||||
"gui_use_legacy_v2_onions_checkbox": "使用傳統地址",
|
||||
"gui_save_private_key_checkbox": "使用永久地址",
|
||||
"gui_share_url_description": "<b>任何人</b>只要擁有這個地址就可以<b>下載</b>你的檔案經由<b>Tor Browser</b>: <img src='{}' />",
|
||||
"gui_receive_url_description": "<b>任何人</b>只要擁有這個地址就可以<b>上傳</b>檔案到你的電腦經由<b>Tor Browser</b>: <img src='{}' />",
|
||||
@ -266,7 +265,6 @@
|
||||
"gui_rendezvous_cleanup": "等待Tor电路关闭,以确保文檔传输成功。\n\n這可能需要幾分鐘。",
|
||||
"mode_settings_website_disable_csp_checkbox": "取消內容安全政策(Content Security Policy)信頭(允許您的網站使用三方資源)",
|
||||
"mode_settings_share_autostop_sharing_checkbox": "檔案傳送完後停止共享(取消選中可允許下載單個檔案)",
|
||||
"mode_settings_client_auth_checkbox": "使用者端認證",
|
||||
"mode_settings_legacy_checkbox": "使用舊地址(v2 onion服務,不推薦)",
|
||||
"mode_settings_autostop_timer_checkbox": "定時停止onion服務",
|
||||
"mode_settings_autostart_timer_checkbox": "定時起動onion服務",
|
||||
|
@ -252,7 +252,7 @@ class Mode(QtWidgets.QWidget):
|
||||
if (
|
||||
not self.server_status.local_only
|
||||
and not self.app.onion.supports_stealth
|
||||
and self.settings.get("general", "client_auth")
|
||||
and not self.settings.get("general", "public")
|
||||
):
|
||||
can_start = False
|
||||
|
||||
|
@ -130,7 +130,6 @@ class ChatMode(Mode):
|
||||
"""
|
||||
# Reset web counters
|
||||
self.web.chat_mode.cur_history_id = 0
|
||||
self.web.reset_invalid_passwords()
|
||||
|
||||
def start_server_step2_custom(self):
|
||||
"""
|
||||
|
@ -129,18 +129,6 @@ class ModeSettingsWidget(QtWidgets.QScrollArea):
|
||||
autostop_timer_layout.addWidget(self.autostop_timer_checkbox)
|
||||
autostop_timer_layout.addWidget(self.autostop_timer_widget)
|
||||
|
||||
# Client auth (v3)
|
||||
self.client_auth_checkbox = QtWidgets.QCheckBox()
|
||||
self.client_auth_checkbox.clicked.connect(self.client_auth_checkbox_clicked)
|
||||
self.client_auth_checkbox.clicked.connect(self.update_ui)
|
||||
self.client_auth_checkbox.setText(
|
||||
strings._("mode_settings_client_auth_checkbox")
|
||||
)
|
||||
if self.settings.get("general", "client_auth"):
|
||||
self.client_auth_checkbox.setCheckState(QtCore.Qt.Checked)
|
||||
else:
|
||||
self.client_auth_checkbox.setCheckState(QtCore.Qt.Unchecked)
|
||||
|
||||
# Toggle advanced settings
|
||||
self.toggle_advanced_button = QtWidgets.QPushButton()
|
||||
self.toggle_advanced_button.clicked.connect(self.toggle_advanced_clicked)
|
||||
@ -155,7 +143,6 @@ class ModeSettingsWidget(QtWidgets.QScrollArea):
|
||||
advanced_layout.addLayout(title_layout)
|
||||
advanced_layout.addLayout(autostart_timer_layout)
|
||||
advanced_layout.addLayout(autostop_timer_layout)
|
||||
advanced_layout.addWidget(self.client_auth_checkbox)
|
||||
self.advanced_widget = QtWidgets.QWidget()
|
||||
self.advanced_widget.setLayout(advanced_layout)
|
||||
self.advanced_widget.hide()
|
||||
@ -250,11 +237,6 @@ class ModeSettingsWidget(QtWidgets.QScrollArea):
|
||||
else:
|
||||
self.autostop_timer_widget.hide()
|
||||
|
||||
def client_auth_checkbox_clicked(self):
|
||||
self.settings.set(
|
||||
"general", "client_auth", self.client_auth_checkbox.isChecked()
|
||||
)
|
||||
|
||||
def toggle_advanced_clicked(self):
|
||||
if self.advanced_widget.isVisible():
|
||||
self.advanced_widget.hide()
|
||||
|
@ -296,7 +296,6 @@ class ReceiveMode(Mode):
|
||||
"""
|
||||
# Reset web counters
|
||||
self.web.receive_mode.cur_history_id = 0
|
||||
self.web.reset_invalid_passwords()
|
||||
|
||||
# Hide and reset the uploads if we have previously shared
|
||||
self.reset_info_counters()
|
||||
|
@ -219,7 +219,6 @@ class ShareMode(Mode):
|
||||
"""
|
||||
# Reset web counters
|
||||
self.web.share_mode.cur_history_id = 0
|
||||
self.web.reset_invalid_passwords()
|
||||
|
||||
# Hide and reset the downloads if we have previously shared
|
||||
self.reset_info_counters()
|
||||
|
@ -210,7 +210,6 @@ class WebsiteMode(Mode):
|
||||
"""
|
||||
# Reset web counters
|
||||
self.web.website_mode.visit_count = 0
|
||||
self.web.reset_invalid_passwords()
|
||||
|
||||
# Hide and reset the downloads if we have previously shared
|
||||
self.reset_info_counters()
|
||||
|
@ -115,8 +115,8 @@ class ServerStatus(QtWidgets.QWidget):
|
||||
self.copy_client_auth_button.clicked.connect(self.copy_client_auth)
|
||||
url_buttons_layout = QtWidgets.QHBoxLayout()
|
||||
url_buttons_layout.addWidget(self.copy_url_button)
|
||||
url_buttons_layout.addWidget(self.show_url_qr_code_button)
|
||||
url_buttons_layout.addWidget(self.copy_client_auth_button)
|
||||
url_buttons_layout.addWidget(self.show_url_qr_code_button)
|
||||
url_buttons_layout.addStretch()
|
||||
|
||||
url_layout = QtWidgets.QVBoxLayout()
|
||||
@ -173,21 +173,41 @@ class ServerStatus(QtWidgets.QWidget):
|
||||
info_image = GuiCommon.get_resource_path("images/info.png")
|
||||
|
||||
if self.mode == self.common.gui.MODE_SHARE:
|
||||
self.url_description.setText(
|
||||
strings._("gui_share_url_description").format(info_image)
|
||||
)
|
||||
if self.settings.get("general", "public"):
|
||||
self.url_description.setText(
|
||||
strings._("gui_share_url_public_description").format(info_image)
|
||||
)
|
||||
else:
|
||||
self.url_description.setText(
|
||||
strings._("gui_share_url_description").format(info_image)
|
||||
)
|
||||
elif self.mode == self.common.gui.MODE_WEBSITE:
|
||||
self.url_description.setText(
|
||||
strings._("gui_website_url_description").format(info_image)
|
||||
)
|
||||
if self.settings.get("general", "public"):
|
||||
self.url_description.setText(
|
||||
strings._("gui_website_url_public_description").format(info_image)
|
||||
)
|
||||
else:
|
||||
self.url_description.setText(
|
||||
strings._("gui_website_url_description").format(info_image)
|
||||
)
|
||||
elif self.mode == self.common.gui.MODE_RECEIVE:
|
||||
self.url_description.setText(
|
||||
strings._("gui_receive_url_description").format(info_image)
|
||||
)
|
||||
if self.settings.get("general", "public"):
|
||||
self.url_description.setText(
|
||||
strings._("gui_receive_url_public_description").format(info_image)
|
||||
)
|
||||
else:
|
||||
self.url_description.setText(
|
||||
strings._("gui_receive_url_description").format(info_image)
|
||||
)
|
||||
elif self.mode == self.common.gui.MODE_CHAT:
|
||||
self.url_description.setText(
|
||||
strings._("gui_chat_url_description").format(info_image)
|
||||
)
|
||||
if self.settings.get("general", "public"):
|
||||
self.url_description.setText(
|
||||
strings._("gui_chat_url_public_description").format(info_image)
|
||||
)
|
||||
else:
|
||||
self.url_description.setText(
|
||||
strings._("gui_chat_url_description").format(info_image)
|
||||
)
|
||||
|
||||
# Show a Tool Tip explaining the lifecycle of this URL
|
||||
if self.settings.get("persistent", "enabled"):
|
||||
@ -213,10 +233,10 @@ class ServerStatus(QtWidgets.QWidget):
|
||||
|
||||
self.show_url_qr_code_button.show()
|
||||
|
||||
if self.settings.get("general", "client_auth"):
|
||||
self.copy_client_auth_button.show()
|
||||
else:
|
||||
if self.settings.get("general", "public"):
|
||||
self.copy_client_auth_button.hide()
|
||||
else:
|
||||
self.copy_client_auth_button.show()
|
||||
|
||||
def update(self):
|
||||
"""
|
||||
@ -230,10 +250,6 @@ class ServerStatus(QtWidgets.QWidget):
|
||||
self.common.settings.load()
|
||||
self.show_url()
|
||||
|
||||
if not self.settings.get("onion", "password"):
|
||||
self.settings.set("onion", "password", self.web.password)
|
||||
self.settings.save()
|
||||
|
||||
if self.settings.get("general", "autostop_timer"):
|
||||
self.server_button.setToolTip(
|
||||
strings._("gui_stop_server_autostop_timer_tooltip").format(
|
||||
@ -466,8 +482,5 @@ class ServerStatus(QtWidgets.QWidget):
|
||||
"""
|
||||
Returns the OnionShare URL.
|
||||
"""
|
||||
if self.settings.get("general", "public"):
|
||||
url = f"http://{self.app.onion_host}"
|
||||
else:
|
||||
url = f"http://onionshare:{self.web.password}@{self.app.onion_host}"
|
||||
url = f"http://{self.app.onion_host}"
|
||||
return url
|
||||
|
@ -581,11 +581,6 @@ class Tab(QtWidgets.QWidget):
|
||||
f"{strings._('other_page_loaded')}: {event['path']}"
|
||||
)
|
||||
|
||||
if event["type"] == Web.REQUEST_INVALID_PASSWORD:
|
||||
self.status_bar.showMessage(
|
||||
f"[#{mode.web.invalid_passwords_count}] {strings._('incorrect_password')}: {event['data']}"
|
||||
)
|
||||
|
||||
mode.timer_callback()
|
||||
|
||||
def copy_url(self):
|
||||
|
@ -65,14 +65,9 @@ class OnionThread(QtCore.QThread):
|
||||
# Make a new static URL path for each new share
|
||||
self.mode.web.generate_static_url_path()
|
||||
|
||||
# Choose port and password early, because we need them to exist in advance for scheduled shares
|
||||
# Choose port early, because we need them to exist in advance for scheduled shares
|
||||
if not self.mode.app.port:
|
||||
self.mode.app.choose_port()
|
||||
if not self.mode.settings.get("general", "public"):
|
||||
if not self.mode.web.password:
|
||||
self.mode.web.generate_password(
|
||||
self.mode.settings.get("onion", "password")
|
||||
)
|
||||
|
||||
try:
|
||||
if self.mode.obtain_onion_early:
|
||||
|
@ -191,30 +191,13 @@ class GuiBaseTest(unittest.TestCase):
|
||||
# Upload a file
|
||||
files = {"file[]": open(self.tmpfiles[0], "rb")}
|
||||
url = f"http://127.0.0.1:{tab.app.port}/upload"
|
||||
if tab.settings.get("general", "public"):
|
||||
requests.post(url, files=files)
|
||||
else:
|
||||
requests.post(
|
||||
url,
|
||||
files=files,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().web.password
|
||||
),
|
||||
)
|
||||
requests.post(url, files=files)
|
||||
QtTest.QTest.qWait(2000, self.gui.qtapp)
|
||||
|
||||
if type(tab.get_mode()) == ShareMode:
|
||||
# Download files
|
||||
url = f"http://127.0.0.1:{tab.app.port}/download"
|
||||
if tab.settings.get("general", "public"):
|
||||
requests.get(url)
|
||||
else:
|
||||
requests.get(
|
||||
url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().web.password
|
||||
),
|
||||
)
|
||||
requests.get(url)
|
||||
QtTest.QTest.qWait(2000, self.gui.qtapp)
|
||||
|
||||
# Indicator should be visible, have a value of "1"
|
||||
@ -273,13 +256,6 @@ class GuiBaseTest(unittest.TestCase):
|
||||
except requests.exceptions.ConnectionError:
|
||||
self.assertTrue(False)
|
||||
|
||||
def have_a_password(self, tab):
|
||||
"""Test that we have a valid password"""
|
||||
if not tab.settings.get("general", "public"):
|
||||
self.assertRegex(tab.get_mode().server_status.web.password, r"(\w+)-(\w+)")
|
||||
else:
|
||||
self.assertIsNone(tab.get_mode().server_status.web.password, r"(\w+)-(\w+)")
|
||||
|
||||
def add_button_visible(self, tab):
|
||||
"""Test that the add button should be visible"""
|
||||
if platform.system() == "Darwin":
|
||||
@ -304,13 +280,7 @@ class GuiBaseTest(unittest.TestCase):
|
||||
|
||||
tab.get_mode().server_status.copy_url_button.click()
|
||||
clipboard = tab.common.gui.qtapp.clipboard()
|
||||
if tab.settings.get("general", "public"):
|
||||
self.assertEqual(clipboard.text(), f"http://127.0.0.1:{tab.app.port}")
|
||||
else:
|
||||
self.assertEqual(
|
||||
clipboard.text(),
|
||||
f"http://onionshare:{tab.get_mode().server_status.web.password}@127.0.0.1:{tab.app.port}",
|
||||
)
|
||||
self.assertEqual(clipboard.text(), f"http://127.0.0.1:{tab.app.port}")
|
||||
|
||||
def have_show_qr_code_button(self, tab):
|
||||
"""Test that the Show QR Code URL button is shown and that it loads a QR Code Dialog"""
|
||||
@ -343,16 +313,7 @@ class GuiBaseTest(unittest.TestCase):
|
||||
"""Test that the web page contains a string"""
|
||||
|
||||
url = f"http://127.0.0.1:{tab.app.port}/"
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.get(url)
|
||||
else:
|
||||
r = requests.get(
|
||||
url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().web.password
|
||||
),
|
||||
)
|
||||
|
||||
r = requests.get(url)
|
||||
self.assertTrue(string in r.text)
|
||||
|
||||
def history_widgets_present(self, tab):
|
||||
|
@ -11,15 +11,7 @@ class TestChat(GuiBaseTest):
|
||||
def view_chat(self, tab):
|
||||
"""Test that we can view the chat room"""
|
||||
url = f"http://127.0.0.1:{tab.app.port}/"
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.get(url)
|
||||
else:
|
||||
r = requests.get(
|
||||
url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().server_status.web.password
|
||||
),
|
||||
)
|
||||
r = requests.get(url)
|
||||
|
||||
QtTest.QTest.qWait(500, self.gui.qtapp)
|
||||
self.assertTrue("Chat <b>requires JavaScript</b>" in r.text)
|
||||
@ -31,16 +23,7 @@ class TestChat(GuiBaseTest):
|
||||
"""Test that we can change our username"""
|
||||
url = f"http://127.0.0.1:{tab.app.port}/update-session-username"
|
||||
data = {"username": "oniontest"}
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.post(url, json=data)
|
||||
else:
|
||||
r = requests.post(
|
||||
url,
|
||||
json=data,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().server_status.web.password
|
||||
),
|
||||
)
|
||||
r = requests.post(url, json=data)
|
||||
|
||||
QtTest.QTest.qWait(500, self.gui.qtapp)
|
||||
jsonResponse = r.json()
|
||||
@ -53,7 +36,6 @@ class TestChat(GuiBaseTest):
|
||||
self.server_status_indicator_says_starting(tab)
|
||||
self.server_is_started(tab, startup_time=500)
|
||||
self.web_server_is_running(tab)
|
||||
self.have_a_password(tab)
|
||||
self.url_description_shown(tab)
|
||||
self.have_copy_url_button(tab)
|
||||
self.have_show_qr_code_button(tab)
|
||||
|
@ -72,15 +72,7 @@ class TestShare(GuiBaseTest):
|
||||
def download_share(self, tab):
|
||||
"""Test that we can download the share"""
|
||||
url = f"http://127.0.0.1:{tab.app.port}/download"
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.get(url)
|
||||
else:
|
||||
r = requests.get(
|
||||
url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().server_status.web.password
|
||||
),
|
||||
)
|
||||
r = requests.get(url)
|
||||
|
||||
tmp_file = tempfile.NamedTemporaryFile("wb", delete=False)
|
||||
tmp_file.write(r.content)
|
||||
@ -99,40 +91,16 @@ class TestShare(GuiBaseTest):
|
||||
"""
|
||||
url = f"http://127.0.0.1:{tab.app.port}"
|
||||
download_file_url = f"http://127.0.0.1:{tab.app.port}/test.txt"
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.get(url)
|
||||
else:
|
||||
r = requests.get(
|
||||
url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().server_status.web.password
|
||||
),
|
||||
)
|
||||
r = requests.get(url)
|
||||
|
||||
if tab.settings.get("share", "autostop_sharing"):
|
||||
self.assertFalse('a href="/test.txt"' in r.text)
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.get(download_file_url)
|
||||
else:
|
||||
r = requests.get(
|
||||
download_file_url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().server_status.web.password
|
||||
),
|
||||
)
|
||||
r = requests.get(download_file_url)
|
||||
self.assertEqual(r.status_code, 404)
|
||||
self.download_share(tab)
|
||||
else:
|
||||
self.assertTrue('a href="test.txt"' in r.text)
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.get(download_file_url)
|
||||
else:
|
||||
r = requests.get(
|
||||
download_file_url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().server_status.web.password
|
||||
),
|
||||
)
|
||||
r = requests.get(download_file_url)
|
||||
|
||||
tmp_file = tempfile.NamedTemporaryFile("wb", delete=False)
|
||||
tmp_file.write(r.content)
|
||||
@ -144,34 +112,6 @@ class TestShare(GuiBaseTest):
|
||||
|
||||
QtTest.QTest.qWait(500, self.gui.qtapp)
|
||||
|
||||
def hit_401(self, tab):
|
||||
"""Test that the server stops after too many 401s, or doesn't when in public mode"""
|
||||
# In non-public mode, get ready to accept the dialog
|
||||
if not tab.settings.get("general", "public"):
|
||||
|
||||
def accept_dialog():
|
||||
window = tab.common.gui.qtapp.activeWindow()
|
||||
if window:
|
||||
window.close()
|
||||
|
||||
QtCore.QTimer.singleShot(1000, accept_dialog)
|
||||
|
||||
# Make 20 requests with guessed passwords
|
||||
url = f"http://127.0.0.1:{tab.app.port}/"
|
||||
for _ in range(20):
|
||||
password_guess = self.gui.common.build_password()
|
||||
requests.get(
|
||||
url, auth=requests.auth.HTTPBasicAuth("onionshare", password_guess)
|
||||
)
|
||||
|
||||
# In public mode, we should still be running (no rate-limiting)
|
||||
if tab.settings.get("general", "public"):
|
||||
self.web_server_is_running(tab)
|
||||
|
||||
# In non-public mode, we should be shut down (rate-limiting)
|
||||
else:
|
||||
self.web_server_is_stopped(tab)
|
||||
|
||||
def set_autostart_timer(self, tab, timer):
|
||||
"""Test that the timer can be set"""
|
||||
schedule = QtCore.QDateTime.currentDateTime().addSecs(timer)
|
||||
@ -241,7 +181,6 @@ class TestShare(GuiBaseTest):
|
||||
self.mode_settings_widget_is_hidden(tab)
|
||||
self.server_is_started(tab, startup_time)
|
||||
self.web_server_is_running(tab)
|
||||
self.have_a_password(tab)
|
||||
self.url_description_shown(tab)
|
||||
self.have_copy_url_button(tab)
|
||||
self.have_show_qr_code_button(tab)
|
||||
@ -490,9 +429,9 @@ class TestShare(GuiBaseTest):
|
||||
|
||||
self.close_all_tabs()
|
||||
|
||||
def test_persistent_password(self):
|
||||
def test_persistent_mode(self):
|
||||
"""
|
||||
Test a large download
|
||||
Test persistent mode
|
||||
"""
|
||||
tab = self.new_share_tab()
|
||||
tab.get_mode().mode_settings_widget.persistent_checkbox.click()
|
||||
@ -500,10 +439,9 @@ class TestShare(GuiBaseTest):
|
||||
self.run_all_common_setup_tests()
|
||||
self.run_all_share_mode_setup_tests(tab)
|
||||
self.run_all_share_mode_started_tests(tab)
|
||||
password = tab.get_mode().server_status.web.password
|
||||
self.run_all_share_mode_download_tests(tab)
|
||||
self.run_all_share_mode_started_tests(tab)
|
||||
self.assertEqual(tab.get_mode().server_status.web.password, password)
|
||||
self.assertTrue("Every subsequent share reuses the address" in tab.get_mode().server_status.url_description.toolTip())
|
||||
self.run_all_share_mode_download_tests(tab)
|
||||
|
||||
self.close_all_tabs()
|
||||
@ -570,45 +508,6 @@ class TestShare(GuiBaseTest):
|
||||
|
||||
self.close_all_tabs()
|
||||
|
||||
def test_401_triggers_ratelimit(self):
|
||||
"""
|
||||
Rate limit should be triggered
|
||||
"""
|
||||
tab = self.new_share_tab()
|
||||
|
||||
def accept_dialog():
|
||||
window = tab.common.gui.qtapp.activeWindow()
|
||||
if window:
|
||||
window.close()
|
||||
|
||||
tab.get_mode().autostop_sharing_checkbox.click()
|
||||
|
||||
self.run_all_common_setup_tests()
|
||||
self.run_all_share_mode_tests(tab)
|
||||
self.hit_401(tab)
|
||||
|
||||
self.close_all_tabs()
|
||||
|
||||
def test_401_public_skips_ratelimit(self):
|
||||
"""
|
||||
Public mode should skip the rate limit
|
||||
"""
|
||||
tab = self.new_share_tab()
|
||||
|
||||
def accept_dialog():
|
||||
window = tab.common.gui.qtapp.activeWindow()
|
||||
if window:
|
||||
window.close()
|
||||
|
||||
tab.get_mode().autostop_sharing_checkbox.click()
|
||||
tab.get_mode().mode_settings_widget.public_checkbox.click()
|
||||
|
||||
self.run_all_common_setup_tests()
|
||||
self.run_all_share_mode_tests(tab)
|
||||
self.hit_401(tab)
|
||||
|
||||
self.close_all_tabs()
|
||||
|
||||
def test_client_auth(self):
|
||||
"""
|
||||
Test the ClientAuth is received from the backend,
|
||||
@ -617,7 +516,6 @@ class TestShare(GuiBaseTest):
|
||||
"""
|
||||
tab = self.new_share_tab()
|
||||
tab.get_mode().mode_settings_widget.toggle_advanced_button.click()
|
||||
tab.get_mode().mode_settings_widget.client_auth_checkbox.click()
|
||||
|
||||
self.run_all_common_setup_tests()
|
||||
self.run_all_share_mode_setup_tests(tab)
|
||||
|
@ -11,32 +11,14 @@ class TestWebsite(GuiBaseTest):
|
||||
def view_website(self, tab):
|
||||
"""Test that we can download the share"""
|
||||
url = f"http://127.0.0.1:{tab.app.port}/"
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.get(url)
|
||||
else:
|
||||
r = requests.get(
|
||||
url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().server_status.web.password
|
||||
),
|
||||
)
|
||||
|
||||
r = requests.get(url)
|
||||
QtTest.QTest.qWait(500, self.gui.qtapp)
|
||||
self.assertTrue("This is a test website hosted by OnionShare" in r.text)
|
||||
|
||||
def check_csp_header(self, tab):
|
||||
"""Test that the CSP header is present when enabled or vice versa"""
|
||||
url = f"http://127.0.0.1:{tab.app.port}/"
|
||||
if tab.settings.get("general", "public"):
|
||||
r = requests.get(url)
|
||||
else:
|
||||
r = requests.get(
|
||||
url,
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
"onionshare", tab.get_mode().server_status.web.password
|
||||
),
|
||||
)
|
||||
|
||||
r = requests.get(url)
|
||||
QtTest.QTest.qWait(500, self.gui.qtapp)
|
||||
if tab.settings.get("website", "disable_csp"):
|
||||
self.assertFalse("Content-Security-Policy" in r.headers)
|
||||
@ -63,7 +45,6 @@ class TestWebsite(GuiBaseTest):
|
||||
self.add_remove_buttons_hidden(tab)
|
||||
self.server_is_started(tab, startup_time)
|
||||
self.web_server_is_running(tab)
|
||||
self.have_a_password(tab)
|
||||
self.url_description_shown(tab)
|
||||
self.have_copy_url_button(tab)
|
||||
self.have_show_qr_code_button(tab)
|
||||
|
Loading…
Reference in New Issue
Block a user