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:
Miguel Jacq 2021-08-27 15:52:29 +10:00
parent f63e0c37d1
commit 0bf8f53d30
No known key found for this signature in database
GPG Key ID: EEA4341C6D97A0B6
78 changed files with 112 additions and 612 deletions

View File

@ -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")

View File

@ -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": []},

View File

@ -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,

View File

@ -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):

View File

@ -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>

View File

@ -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
View File

@ -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"},

View File

@ -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 = "*"

View File

@ -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),

View File

@ -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")))

View File

@ -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='{}' />",

View File

@ -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": "",

View File

@ -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 في ميعاد مجدول",

View File

@ -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='{}' />",

View File

@ -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": "এই ট্যাব সংরক্ষণ করো, এবং যখন আমি অনিওনশেয়ার খুলব তখন এটি স্বয়ংক্রিয়ভাবে খুলো",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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"
}
}

View File

@ -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": "Προγραμματισμένη εκκίνηση",

View File

@ -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: {}"
}
}

View File

@ -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",

View File

@ -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='{}' />",

View File

@ -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",

View File

@ -159,7 +159,6 @@
"update_error_invalid_latest_version": "Impossible de vérifier la présence dune mise à jour : le site Web dOnionShare indique que la version la plus récente est la « {} » qui nest 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": "Quelquun visite votre site Web",
"gui_website_mode_no_files": "Aucun site Web na 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 lautorisation 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 louvrir automatiquement quand jouvre OnionShare",

View File

@ -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='{}' />",

View File

@ -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",

View File

@ -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": "",

View File

@ -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": "",

View File

@ -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": "",

View File

@ -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",

View File

@ -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": "",

View File

@ -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",

View File

@ -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?",

View File

@ -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",

View File

@ -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サービスを起動する",

View File

@ -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": "",

View File

@ -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": "",

View File

@ -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": "",

View File

@ -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": "",

View File

@ -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",

View File

@ -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": "",

View File

@ -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": "",

View File

@ -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",

View File

@ -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",

View File

@ -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": "",

View File

@ -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",

View File

@ -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",

View File

@ -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?",

View File

@ -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='{}' />",

View File

@ -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 в назначенное время",

View File

@ -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": "",

View File

@ -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ť",

View File

@ -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": "",

View File

@ -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": "",

View File

@ -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",

View File

@ -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",

View File

@ -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": "",

View File

@ -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='{}' />",

View File

@ -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",

View File

@ -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 у запланований час",

View File

@ -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": "",

View File

@ -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": "",

View File

@ -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服务",

View File

@ -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服務",

View File

@ -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

View File

@ -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):
"""

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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

View File

@ -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):

View File

@ -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:

View File

@ -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):

View File

@ -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)

View File

@ -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)

View File

@ -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)