diff options
Diffstat (limited to 'desktop/src/onionshare/tab')
-rw-r--r-- | desktop/src/onionshare/tab/mode/__init__.py | 33 | ||||
-rw-r--r-- | desktop/src/onionshare/tab/mode/chat_mode/__init__.py | 1 | ||||
-rw-r--r-- | desktop/src/onionshare/tab/mode/mode_settings_widget.py | 54 | ||||
-rw-r--r-- | desktop/src/onionshare/tab/mode/receive_mode/__init__.py | 6 | ||||
-rw-r--r-- | desktop/src/onionshare/tab/mode/share_mode/__init__.py | 1 | ||||
-rw-r--r-- | desktop/src/onionshare/tab/mode/website_mode/__init__.py | 1 | ||||
-rw-r--r-- | desktop/src/onionshare/tab/server_status.py | 201 | ||||
-rw-r--r-- | desktop/src/onionshare/tab/tab.py | 31 |
8 files changed, 194 insertions, 134 deletions
diff --git a/desktop/src/onionshare/tab/mode/__init__.py b/desktop/src/onionshare/tab/mode/__init__.py index aeecaf66..d4f2c23a 100644 --- a/desktop/src/onionshare/tab/mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/__init__.py @@ -246,13 +246,23 @@ class Mode(QtWidgets.QWidget): self.start_onion_thread() def start_onion_thread(self, obtain_onion_early=False): - self.common.log("Mode", "start_server", "Starting an onion thread") - self.obtain_onion_early = obtain_onion_early - self.onion_thread = OnionThread(self) - self.onion_thread.success.connect(self.starting_server_step2.emit) - self.onion_thread.success_early.connect(self.starting_server_early.emit) - self.onion_thread.error.connect(self.starting_server_error.emit) - self.onion_thread.start() + # If we tried to start with Client Auth and our Tor is too old to support it, + # bail out early + if ( + not self.server_status.local_only + and not self.app.onion.supports_stealth + and not self.settings.get("general", "public") + ): + self.stop_server() + self.start_server_error(strings._("gui_server_doesnt_support_stealth")) + else: + self.common.log("Mode", "start_server", "Starting an onion thread") + self.obtain_onion_early = obtain_onion_early + self.onion_thread = OnionThread(self) + self.onion_thread.success.connect(self.starting_server_step2.emit) + self.onion_thread.success_early.connect(self.starting_server_early.emit) + self.onion_thread.error.connect(self.starting_server_error.emit) + self.onion_thread.start() def start_scheduled_service(self, obtain_onion_early=False): # We start a new OnionThread with the saved scheduled key from settings @@ -438,15 +448,6 @@ class Mode(QtWidgets.QWidget): """ pass - def handle_request_rate_limit(self, event): - """ - Handle REQUEST_RATE_LIMIT event. - """ - self.stop_server() - Alert( - self.common, strings._("error_rate_limit"), QtWidgets.QMessageBox.Critical - ) - def handle_request_progress(self, event): """ Handle REQUEST_PROGRESS event. diff --git a/desktop/src/onionshare/tab/mode/chat_mode/__init__.py b/desktop/src/onionshare/tab/mode/chat_mode/__init__.py index fe3e69f1..e7a17ce7 100644 --- a/desktop/src/onionshare/tab/mode/chat_mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/chat_mode/__init__.py @@ -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): """ diff --git a/desktop/src/onionshare/tab/mode/mode_settings_widget.py b/desktop/src/onionshare/tab/mode/mode_settings_widget.py index 9f55dbaf..0e80023e 100644 --- a/desktop/src/onionshare/tab/mode/mode_settings_widget.py +++ b/desktop/src/onionshare/tab/mode/mode_settings_widget.py @@ -129,28 +129,6 @@ class ModeSettingsWidget(QtWidgets.QScrollArea): autostop_timer_layout.addWidget(self.autostop_timer_checkbox) autostop_timer_layout.addWidget(self.autostop_timer_widget) - # Legacy address - self.legacy_checkbox = QtWidgets.QCheckBox() - self.legacy_checkbox.clicked.connect(self.legacy_checkbox_clicked) - self.legacy_checkbox.clicked.connect(self.update_ui) - self.legacy_checkbox.setText(strings._("mode_settings_legacy_checkbox")) - if self.settings.get("general", "legacy"): - self.legacy_checkbox.setCheckState(QtCore.Qt.Checked) - else: - self.legacy_checkbox.setCheckState(QtCore.Qt.Unchecked) - - # Client auth - 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) @@ -165,8 +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.legacy_checkbox) - advanced_layout.addWidget(self.client_auth_checkbox) self.advanced_widget = QtWidgets.QWidget() self.advanced_widget.setLayout(advanced_layout) self.advanced_widget.hide() @@ -200,28 +176,6 @@ class ModeSettingsWidget(QtWidgets.QScrollArea): strings._("mode_settings_advanced_toggle_show") ) - # Client auth is only a legacy option - if self.client_auth_checkbox.isChecked(): - self.legacy_checkbox.setChecked(True) - self.legacy_checkbox.setEnabled(False) - else: - self.legacy_checkbox.setEnabled(True) - if self.legacy_checkbox.isChecked(): - self.client_auth_checkbox.show() - else: - self.client_auth_checkbox.hide() - - # If the server has been started in the past, prevent changing legacy option - if self.settings.get("onion", "private_key"): - if self.legacy_checkbox.isChecked(): - # If using legacy, disable legacy and client auth options - self.legacy_checkbox.setEnabled(False) - self.client_auth_checkbox.setEnabled(False) - else: - # If using v3, hide legacy and client auth options - self.legacy_checkbox.hide() - self.client_auth_checkbox.hide() - def title_editing_finished(self): if self.title_lineedit.text().strip() == "": self.title_lineedit.setText("") @@ -283,14 +237,6 @@ class ModeSettingsWidget(QtWidgets.QScrollArea): else: self.autostop_timer_widget.hide() - def legacy_checkbox_clicked(self): - self.settings.set("general", "legacy", self.legacy_checkbox.isChecked()) - - 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() diff --git a/desktop/src/onionshare/tab/mode/receive_mode/__init__.py b/desktop/src/onionshare/tab/mode/receive_mode/__init__.py index d07b5ffc..d5036d1d 100644 --- a/desktop/src/onionshare/tab/mode/receive_mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/receive_mode/__init__.py @@ -183,16 +183,15 @@ class ReceiveMode(Mode): self.main_layout.addWidget(header_label) self.main_layout.addWidget(receive_warning) self.main_layout.addWidget(self.primary_action, stretch=1) - self.main_layout.addWidget(MinimumSizeWidget(525, 0)) + self.main_layout.addWidget(self.server_status) # Row layout content_row = QtWidgets.QHBoxLayout() - content_row.addLayout(self.main_layout) + content_row.addLayout(self.main_layout, stretch=1) content_row.addWidget(self.image) row_layout = QtWidgets.QVBoxLayout() row_layout.addLayout(top_bar_layout) row_layout.addLayout(content_row, stretch=1) - row_layout.addWidget(self.server_status) # Column layout self.column_layout = QtWidgets.QHBoxLayout() @@ -296,7 +295,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() diff --git a/desktop/src/onionshare/tab/mode/share_mode/__init__.py b/desktop/src/onionshare/tab/mode/share_mode/__init__.py index 4056d92e..5d3e3c35 100644 --- a/desktop/src/onionshare/tab/mode/share_mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/share_mode/__init__.py @@ -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() diff --git a/desktop/src/onionshare/tab/mode/website_mode/__init__.py b/desktop/src/onionshare/tab/mode/website_mode/__init__.py index 577ea28e..a50d15b9 100644 --- a/desktop/src/onionshare/tab/mode/website_mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/website_mode/__init__.py @@ -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() diff --git a/desktop/src/onionshare/tab/server_status.py b/desktop/src/onionshare/tab/server_status.py index ba5ff165..115acfd5 100644 --- a/desktop/src/onionshare/tab/server_status.py +++ b/desktop/src/onionshare/tab/server_status.py @@ -38,7 +38,7 @@ class ServerStatus(QtWidgets.QWidget): server_canceled = QtCore.Signal() button_clicked = QtCore.Signal() url_copied = QtCore.Signal() - hidservauth_copied = QtCore.Signal() + client_auth_copied = QtCore.Signal() STATUS_STOPPED = 0 STATUS_WORKING = 1 @@ -81,6 +81,12 @@ class ServerStatus(QtWidgets.QWidget): self.url_description = QtWidgets.QLabel() self.url_description.setWordWrap(True) self.url_description.setMinimumHeight(50) + + # URL sharing instructions, above the URL and Copy Address/QR Code buttons + self.url_instructions = QtWidgets.QLabel() + self.url_instructions.setWordWrap(True) + + # The URL label itself self.url = QtWidgets.QLabel() self.url.setFont(url_font) self.url.setWordWrap(True) @@ -90,16 +96,16 @@ class ServerStatus(QtWidgets.QWidget): Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard ) + # Copy Onion Address button self.copy_url_button = QtWidgets.QPushButton(strings._("gui_copy_url")) self.copy_url_button.setStyleSheet( self.common.gui.css["server_status_url_buttons"] ) self.copy_url_button.clicked.connect(self.copy_url) - self.copy_hidservauth_button = QtWidgets.QPushButton( - strings._("gui_copy_hidservauth") - ) + + # Onion Address QR code button self.show_url_qr_code_button = QtWidgets.QPushButton( - strings._("gui_show_url_qr_code") + strings._("gui_show_qr_code") ) self.show_url_qr_code_button.hide() self.show_url_qr_code_button.clicked.connect( @@ -109,22 +115,78 @@ class ServerStatus(QtWidgets.QWidget): self.common.gui.css["server_status_url_buttons"] ) - self.copy_hidservauth_button.setStyleSheet( + # Client Auth sharing instructions, above the + # Copy Private Key/QR Code buttons + self.client_auth_instructions = QtWidgets.QLabel() + self.client_auth_instructions.setWordWrap(True) + self.client_auth_instructions.setText(strings._("gui_client_auth_instructions")) + + # The private key itself + self.private_key = QtWidgets.QLabel() + self.private_key.setFont(url_font) + self.private_key.setWordWrap(True) + self.private_key.setMinimumSize(self.private_key.sizeHint()) + self.private_key.setStyleSheet(self.common.gui.css["server_status_url"]) + self.private_key.setTextInteractionFlags(Qt.NoTextInteraction) + self.private_key_hidden = True + + # Copy ClientAuth button + self.copy_client_auth_button = QtWidgets.QPushButton( + strings._("gui_copy_client_auth") + ) + self.copy_client_auth_button.setStyleSheet( + self.common.gui.css["server_status_url_buttons"] + ) + self.copy_client_auth_button.clicked.connect(self.copy_client_auth) + + # ClientAuth QR code button + self.show_client_auth_qr_code_button = QtWidgets.QPushButton( + strings._("gui_show_qr_code") + ) + self.show_client_auth_qr_code_button.hide() + self.show_client_auth_qr_code_button.clicked.connect( + self.show_client_auth_qr_code_button_clicked + ) + self.show_client_auth_qr_code_button.setStyleSheet( + self.common.gui.css["server_status_url_buttons"] + ) + + # ClientAuth reveal/hide toggle button + self.client_auth_toggle_button = QtWidgets.QPushButton(strings._("gui_reveal")) + self.client_auth_toggle_button.hide() + self.client_auth_toggle_button.clicked.connect( + self.client_auth_toggle_button_clicked + ) + self.client_auth_toggle_button.setStyleSheet( self.common.gui.css["server_status_url_buttons"] ) - self.copy_hidservauth_button.clicked.connect(self.copy_hidservauth) + + # URL instructions layout 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_hidservauth_button) url_buttons_layout.addStretch() url_layout = QtWidgets.QVBoxLayout() url_layout.addWidget(self.url_description) + url_layout.addWidget(self.url_instructions) url_layout.addWidget(self.url) url_layout.addLayout(url_buttons_layout) - # Add the widgets + # Private key instructions layout + client_auth_buttons_layout = QtWidgets.QHBoxLayout() + client_auth_buttons_layout.addWidget(self.copy_client_auth_button) + client_auth_buttons_layout.addWidget(self.show_client_auth_qr_code_button) + client_auth_buttons_layout.addWidget(self.client_auth_toggle_button) + client_auth_buttons_layout.addStretch() + + client_auth_layout = QtWidgets.QVBoxLayout() + client_auth_layout.addWidget(self.client_auth_instructions) + client_auth_layout.addWidget(self.private_key) + client_auth_layout.addLayout(client_auth_buttons_layout) + + # Add the widgets and URL/ClientAuth layouts + # to the main ServerStatus layout button_layout = QtWidgets.QHBoxLayout() button_layout.addWidget(self.server_button) button_layout.addStretch() @@ -132,6 +194,7 @@ class ServerStatus(QtWidgets.QWidget): layout = QtWidgets.QVBoxLayout() layout.addLayout(button_layout) layout.addLayout(url_layout) + layout.addLayout(client_auth_layout) self.setLayout(layout) def set_mode(self, share_mode, file_selection=None): @@ -173,21 +236,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"): @@ -207,16 +290,35 @@ class ServerStatus(QtWidgets.QWidget): else: self.url_description.setToolTip(strings._("gui_url_label_stay_open")) + if self.settings.get("general", "public"): + self.url_instructions.setText(strings._("gui_url_instructions_public_mode")) + else: + self.url_instructions.setText(strings._("gui_url_instructions")) + self.url_instructions.show() self.url.setText(self.get_url()) self.url.show() self.copy_url_button.show() - self.show_url_qr_code_button.show() - if self.settings.get("general", "client_auth"): - self.copy_hidservauth_button.show() + if self.settings.get("general", "public"): + self.client_auth_instructions.hide() + self.private_key.hide() + self.copy_client_auth_button.hide() + self.show_client_auth_qr_code_button.hide() else: - self.copy_hidservauth_button.hide() + self.client_auth_instructions.show() + if self.private_key_hidden: + self.private_key.setText("*" * len(self.app.auth_string)) + self.private_key.setTextInteractionFlags(Qt.NoTextInteraction) + else: + self.private_key.setText(self.app.auth_string) + self.private_key.setTextInteractionFlags( + Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard + ) + self.private_key.show() + self.copy_client_auth_button.show() + self.show_client_auth_qr_code_button.show() + self.client_auth_toggle_button.show() def update(self): """ @@ -230,10 +332,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( @@ -244,10 +342,15 @@ class ServerStatus(QtWidgets.QWidget): ) else: self.url_description.hide() + self.url_instructions.hide() self.url.hide() self.copy_url_button.hide() - self.copy_hidservauth_button.hide() self.show_url_qr_code_button.hide() + self.private_key.hide() + self.client_auth_instructions.hide() + self.copy_client_auth_button.hide() + self.show_client_auth_qr_code_button.hide() + self.client_auth_toggle_button.hide() self.mode_settings_widget.update_ui() @@ -395,7 +498,32 @@ class ServerStatus(QtWidgets.QWidget): """ Show a QR code of the onion URL. """ - self.qr_code_dialog = QRCodeDialog(self.common, self.get_url()) + self.qr_code_dialog = QRCodeDialog( + self.common, strings._("gui_qr_label_url_title"), self.get_url() + ) + + def show_client_auth_qr_code_button_clicked(self): + """ + Show a QR code of the private key + """ + self.qr_code_dialog = QRCodeDialog( + self.common, + strings._("gui_qr_label_auth_string_title"), + self.app.auth_string, + ) + + def client_auth_toggle_button_clicked(self): + """ + ClientAuth reveal/hide toggle button clicked + """ + if self.private_key_hidden: + self.private_key_hidden = False + self.client_auth_toggle_button.setText(strings._("gui_hide")) + else: + self.private_key_hidden = True + self.client_auth_toggle_button.setText(strings._("gui_reveal")) + + self.show_url() def start_server(self): """ @@ -453,21 +581,18 @@ class ServerStatus(QtWidgets.QWidget): self.url_copied.emit() - def copy_hidservauth(self): + def copy_client_auth(self): """ - Copy the HidServAuth line to the clipboard. + Copy the ClientAuth private key line to the clipboard. """ clipboard = self.qtapp.clipboard() clipboard.setText(self.app.auth_string) - self.hidservauth_copied.emit() + self.client_auth_copied.emit() def get_url(self): """ 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 diff --git a/desktop/src/onionshare/tab/tab.py b/desktop/src/onionshare/tab/tab.py index 09982de9..5d9bb077 100644 --- a/desktop/src/onionshare/tab/tab.py +++ b/desktop/src/onionshare/tab/tab.py @@ -275,7 +275,7 @@ class Tab(QtWidgets.QWidget): self.share_mode.start_server_finished.connect(self.clear_message) self.share_mode.server_status.button_clicked.connect(self.clear_message) self.share_mode.server_status.url_copied.connect(self.copy_url) - self.share_mode.server_status.hidservauth_copied.connect(self.copy_hidservauth) + self.share_mode.server_status.client_auth_copied.connect(self.copy_client_auth) self.change_title.emit(self.tab_id, strings._("gui_tab_name_share")) @@ -310,8 +310,8 @@ class Tab(QtWidgets.QWidget): self.receive_mode.start_server_finished.connect(self.clear_message) self.receive_mode.server_status.button_clicked.connect(self.clear_message) self.receive_mode.server_status.url_copied.connect(self.copy_url) - self.receive_mode.server_status.hidservauth_copied.connect( - self.copy_hidservauth + self.receive_mode.server_status.client_auth_copied.connect( + self.copy_client_auth ) self.change_title.emit(self.tab_id, strings._("gui_tab_name_receive")) @@ -347,8 +347,8 @@ class Tab(QtWidgets.QWidget): self.website_mode.start_server_finished.connect(self.clear_message) self.website_mode.server_status.button_clicked.connect(self.clear_message) self.website_mode.server_status.url_copied.connect(self.copy_url) - self.website_mode.server_status.hidservauth_copied.connect( - self.copy_hidservauth + self.website_mode.server_status.client_auth_copied.connect( + self.copy_client_auth ) self.change_title.emit(self.tab_id, strings._("gui_tab_name_website")) @@ -382,7 +382,7 @@ class Tab(QtWidgets.QWidget): self.chat_mode.start_server_finished.connect(self.clear_message) self.chat_mode.server_status.button_clicked.connect(self.clear_message) self.chat_mode.server_status.url_copied.connect(self.copy_url) - self.chat_mode.server_status.hidservauth_copied.connect(self.copy_hidservauth) + self.chat_mode.server_status.client_auth_copied.connect(self.copy_client_auth) self.change_title.emit(self.tab_id, strings._("gui_tab_name_chat")) @@ -531,9 +531,6 @@ class Tab(QtWidgets.QWidget): elif event["type"] == Web.REQUEST_STARTED: mode.handle_request_started(event) - elif event["type"] == Web.REQUEST_RATE_LIMIT: - mode.handle_request_rate_limit(event) - elif event["type"] == Web.REQUEST_PROGRESS: mode.handle_request_progress(event) @@ -581,11 +578,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): @@ -597,14 +589,15 @@ class Tab(QtWidgets.QWidget): strings._("gui_copied_url_title"), strings._("gui_copied_url") ) - def copy_hidservauth(self): + def copy_client_auth(self): """ - When the stealth onion service HidServAuth gets copied to the clipboard, display this in the status bar. + When the onion service's ClientAuth private key gets copied to + the clipboard, display this in the status bar. """ - self.common.log("Tab", "copy_hidservauth") + self.common.log("Tab", "copy_client_auth") self.system_tray.showMessage( - strings._("gui_copied_hidservauth_title"), - strings._("gui_copied_hidservauth"), + strings._("gui_copied_client_auth_title"), + strings._("gui_copied_client_auth"), ) def clear_message(self): |