def __init__(self, message, icon=QtWidgets.QMessageBox.NoIcon): super(Alert, self).__init__(None) self.setWindowTitle("OnionShare") self.setWindowIcon(QtGui.QIcon(helpers.get_resource_path("images/logo.png"))) self.setText(message) self.setIcon(icon) self.exec_()
def main(): """ The main() function implements all of the logic that the GUI version of onionshare uses. """ strings.load_strings(helpers) print(strings._('version_string').format(helpers.get_version())) # start the Qt app global qtapp qtapp = Application() # parse arguments parser = argparse.ArgumentParser() parser.add_argument('--local-only', action='store_true', dest='local_only', help=strings._("help_local_only")) parser.add_argument('--stay-open', action='store_true', dest='stay_open', help=strings._("help_stay_open")) parser.add_argument('--debug', action='store_true', dest='debug', help=strings._("help_debug")) parser.add_argument('--transparent', action='store_true', dest='transparent_torification', help=strings._("help_transparent_torification")) parser.add_argument('--filenames', metavar='filenames', nargs='+', help=strings._('help_filename')) args = parser.parse_args() filenames = args.filenames if filenames: for i in range(len(filenames)): filenames[i] = os.path.abspath(filenames[i]) local_only = bool(args.local_only) stay_open = bool(args.stay_open) debug = bool(args.debug) transparent_torification = bool(args.transparent_torification) # create the onionshare icon global window_icon window_icon = QtGui.QIcon(helpers.get_resource_path('images/logo.png')) # validation if filenames: valid = True for filename in filenames: if not os.path.exists(filename): Alert(strings._("not_a_file", True).format(filename)) valid = False if not valid: sys.exit() # start the onionshare app web.set_stay_open(stay_open) web.set_transparent_torification(transparent_torification) app = onionshare.OnionShare(debug, local_only, stay_open, transparent_torification) # clean up when app quits def shutdown(): app.cleanup() qtapp.aboutToQuit.connect(shutdown) # launch the gui gui = OnionShareGui(qtapp, app) gui.send_files(filenames) # all done sys.exit(qtapp.exec_())
def main(): """ The main() function implements all of the logic that the GUI version of onionshare uses. """ strings.load_strings() print(strings._('version_string').format(helpers.get_version())) # start the Qt app global qtapp qtapp = Application() # parse arguments parser = argparse.ArgumentParser() parser.add_argument('--local-only', action='store_true', dest='local_only', help=strings._("help_local_only")) parser.add_argument('--stay-open', action='store_true', dest='stay_open', help=strings._("help_stay_open")) parser.add_argument('--debug', action='store_true', dest='debug', help=strings._("help_debug")) parser.add_argument('--transparent', action='store_true', dest='transparent_torification', help=strings._("help_transparent_torification")) parser.add_argument('--filenames', metavar='filenames', nargs='+', help=strings._('help_filename')) args = parser.parse_args() filenames = args.filenames if filenames: for i in range(len(filenames)): filenames[i] = os.path.abspath(filenames[i]) local_only = bool(args.local_only) stay_open = bool(args.stay_open) debug = bool(args.debug) transparent_torification = bool(args.transparent_torification) # create the onionshare icon global window_icon window_icon = QtGui.QIcon(helpers.get_resource_path('images/logo.png')) # validation if filenames: valid = True for filename in filenames: if not os.path.exists(filename): alert(strings._("not_a_file", True).format(filename)) valid = False if not valid: sys.exit() # start the onionshare app web.set_stay_open(stay_open) web.set_transparent_torification(transparent_torification) app = onionshare.OnionShare(debug, local_only, stay_open, transparent_torification) # clean up when app quits def shutdown(): app.cleanup() qtapp.aboutToQuit.connect(shutdown) # launch the gui gui = OnionShareGui(qtapp, app) gui.send_files(filenames) # all done sys.exit(qtapp.exec_())
def __init__(self, qtapp, app, web, file_selection): super(ServerStatus, self).__init__() self.status = self.STATUS_STOPPED self.qtapp = qtapp self.app = app self.web = web self.file_selection = file_selection # server layout self.status_image_stopped = QtGui.QImage( helpers.get_resource_path('images/server_stopped.png')) self.status_image_working = QtGui.QImage( helpers.get_resource_path('images/server_working.png')) self.status_image_started = QtGui.QImage( helpers.get_resource_path('images/server_started.png')) self.status_image_label = QtWidgets.QLabel() self.status_image_label.setFixedWidth(30) self.server_button = QtWidgets.QPushButton() self.server_button.clicked.connect(self.server_button_clicked) server_layout = QtWidgets.QHBoxLayout() server_layout.addWidget(self.status_image_label) server_layout.addWidget(self.server_button) # url layout url_font = QtGui.QFont() self.url_label = QtWidgets.QLabel() self.url_label.setFont(url_font) self.url_label.setWordWrap(False) self.url_label.setAlignment(QtCore.Qt.AlignCenter) self.copy_url_button = QtWidgets.QPushButton( strings._('gui_copy_url', True)) self.copy_url_button.clicked.connect(self.copy_url) self.copy_hidservauth_button = QtWidgets.QPushButton( strings._('gui_copy_hidservauth', True)) self.copy_hidservauth_button.clicked.connect(self.copy_hidservauth) url_layout = QtWidgets.QHBoxLayout() url_layout.addWidget(self.url_label) url_layout.addWidget(self.copy_url_button) url_layout.addWidget(self.copy_hidservauth_button) # add the widgets self.addLayout(server_layout) self.addLayout(url_layout) self.update()
def __init__(self, message, icon=QtWidgets.QMessageBox.NoIcon): super(Alert, self).__init__(None) self.setWindowTitle("OnionShare") self.setWindowIcon( QtGui.QIcon(helpers.get_resource_path('images/logo.png'))) self.setText(message) self.setIcon(icon) self.exec_()
def __init__(self, parent, image=False): self.parent = parent super(DropHereLabel, self).__init__(parent=parent) self.setAcceptDrops(True) self.setAlignment(QtCore.Qt.AlignCenter) if image: self.setPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(helpers.get_resource_path('images/drop_files.png')))) else: self.setText(strings._('gui_drag_and_drop', True)) self.setStyleSheet('color: #999999;') self.hide()
def __init__(self, qtapp, app, web, file_selection): super(ServerStatus, self).__init__() self.status = self.STATUS_STOPPED self.qtapp = qtapp self.app = app self.web = web self.file_selection = file_selection # server layout self.status_image_stopped = QtGui.QImage(helpers.get_resource_path("images/server_stopped.png")) self.status_image_working = QtGui.QImage(helpers.get_resource_path("images/server_working.png")) self.status_image_started = QtGui.QImage(helpers.get_resource_path("images/server_started.png")) self.status_image_label = QtWidgets.QLabel() self.status_image_label.setFixedWidth(30) self.server_button = QtWidgets.QPushButton() self.server_button.clicked.connect(self.server_button_clicked) server_layout = QtWidgets.QHBoxLayout() server_layout.addWidget(self.status_image_label) server_layout.addWidget(self.server_button) # url layout url_font = QtGui.QFont() self.url_label = QtWidgets.QLabel() self.url_label.setFont(url_font) self.url_label.setWordWrap(False) self.url_label.setAlignment(QtCore.Qt.AlignCenter) self.copy_url_button = QtWidgets.QPushButton(strings._("gui_copy_url", True)) self.copy_url_button.clicked.connect(self.copy_url) url_layout = QtWidgets.QHBoxLayout() url_layout.addWidget(self.url_label) url_layout.addWidget(self.copy_url_button) # add the widgets self.addLayout(server_layout) self.addLayout(url_layout) self.update()
def __init__(self, qtapp): super(SettingsDialog, self).__init__() self.qtapp = qtapp self.setModal(True) self.setWindowTitle(strings._('gui_settings_window_title', True)) self.setWindowIcon( QtGui.QIcon(helpers.get_resource_path('images/logo.png'))) system = platform.system() # Sharing options # Close after first download self.close_after_first_download_checkbox = QtWidgets.QCheckBox() self.close_after_first_download_checkbox.setCheckState( QtCore.Qt.Checked) self.close_after_first_download_checkbox.setText( strings._("gui_settings_close_after_first_download_option", True)) # Sharing options layout sharing_group_layout = QtWidgets.QVBoxLayout() sharing_group_layout.addWidget( self.close_after_first_download_checkbox) sharing_group = QtWidgets.QGroupBox( strings._("gui_settings_sharing_label", True)) sharing_group.setLayout(sharing_group_layout) # Stealth options # Stealth stealth_details = QtWidgets.QLabel( strings._("gui_settings_stealth_option_details", True)) stealth_details.setWordWrap(True) self.stealth_checkbox = QtWidgets.QCheckBox() self.stealth_checkbox.setCheckState(QtCore.Qt.Unchecked) self.stealth_checkbox.setText( strings._("gui_settings_stealth_option", True)) # Stealth options layout stealth_group_layout = QtWidgets.QVBoxLayout() stealth_group_layout.addWidget(stealth_details) stealth_group_layout.addWidget(self.stealth_checkbox) stealth_group = QtWidgets.QGroupBox( strings._("gui_settings_stealth_label", True)) stealth_group.setLayout(stealth_group_layout) # Automatic updates options # Autoupdate self.autoupdate_checkbox = QtWidgets.QCheckBox() self.autoupdate_checkbox.setCheckState(QtCore.Qt.Unchecked) self.autoupdate_checkbox.setText( strings._("gui_settings_autoupdate_option", True)) # Last update time self.autoupdate_timestamp = QtWidgets.QLabel() # Check for updates button self.check_for_updates_button = QtWidgets.QPushButton( strings._('gui_settings_autoupdate_check_button', True)) self.check_for_updates_button.clicked.connect(self.check_for_updates) # Autoupdate options layout autoupdate_group_layout = QtWidgets.QVBoxLayout() autoupdate_group_layout.addWidget(self.autoupdate_checkbox) autoupdate_group_layout.addWidget(self.autoupdate_timestamp) autoupdate_group_layout.addWidget(self.check_for_updates_button) autoupdate_group = QtWidgets.QGroupBox( strings._("gui_settings_autoupdate_label", True)) autoupdate_group.setLayout(autoupdate_group_layout) # Autoupdate is only available for Windows and Mac (Linux updates using package manager) if system != 'Windows' and system != 'Darwin': autoupdate_group.hide() # Connection type: either automatic, control port, or socket file # Bundled Tor self.connection_type_bundled_radio = QtWidgets.QRadioButton( strings._('gui_settings_connection_type_bundled_option', True)) self.connection_type_bundled_radio.toggled.connect( self.connection_type_bundled_toggled) # Bundled Tor doesn't work on dev mode in Windows or Mac if (system == 'Windows' or system == 'Darwin') and getattr( sys, 'onionshare_dev_mode', False): self.connection_type_bundled_radio.setEnabled(False) # Automatic self.connection_type_automatic_radio = QtWidgets.QRadioButton( strings._('gui_settings_connection_type_automatic_option', True)) self.connection_type_automatic_radio.toggled.connect( self.connection_type_automatic_toggled) # Control port self.connection_type_control_port_radio = QtWidgets.QRadioButton( strings._('gui_settings_connection_type_control_port_option', True)) self.connection_type_control_port_radio.toggled.connect( self.connection_type_control_port_toggled) connection_type_control_port_extras_label = QtWidgets.QLabel( strings._('gui_settings_control_port_label', True)) self.connection_type_control_port_extras_address = QtWidgets.QLineEdit( ) self.connection_type_control_port_extras_port = QtWidgets.QLineEdit() connection_type_control_port_extras_layout = QtWidgets.QHBoxLayout() connection_type_control_port_extras_layout.addWidget( connection_type_control_port_extras_label) connection_type_control_port_extras_layout.addWidget( self.connection_type_control_port_extras_address) connection_type_control_port_extras_layout.addWidget( self.connection_type_control_port_extras_port) self.connection_type_control_port_extras = QtWidgets.QWidget() self.connection_type_control_port_extras.setLayout( connection_type_control_port_extras_layout) self.connection_type_control_port_extras.hide() # Socket file self.connection_type_socket_file_radio = QtWidgets.QRadioButton( strings._('gui_settings_connection_type_socket_file_option', True)) self.connection_type_socket_file_radio.toggled.connect( self.connection_type_socket_file_toggled) connection_type_socket_file_extras_label = QtWidgets.QLabel( strings._('gui_settings_socket_file_label', True)) self.connection_type_socket_file_extras_path = QtWidgets.QLineEdit() connection_type_socket_file_extras_layout = QtWidgets.QHBoxLayout() connection_type_socket_file_extras_layout.addWidget( connection_type_socket_file_extras_label) connection_type_socket_file_extras_layout.addWidget( self.connection_type_socket_file_extras_path) self.connection_type_socket_file_extras = QtWidgets.QWidget() self.connection_type_socket_file_extras.setLayout( connection_type_socket_file_extras_layout) self.connection_type_socket_file_extras.hide() # Tor SOCKS address and port gui_settings_socks_label = QtWidgets.QLabel( strings._('gui_settings_socks_label', True)) self.connection_type_socks_address = QtWidgets.QLineEdit() self.connection_type_socks_port = QtWidgets.QLineEdit() connection_type_socks_layout = QtWidgets.QHBoxLayout() connection_type_socks_layout.addWidget(gui_settings_socks_label) connection_type_socks_layout.addWidget( self.connection_type_socks_address) connection_type_socks_layout.addWidget(self.connection_type_socks_port) self.connection_type_socks = QtWidgets.QWidget() self.connection_type_socks.setLayout(connection_type_socks_layout) self.connection_type_socks.hide() # Authentication options # No authentication self.authenticate_no_auth_radio = QtWidgets.QRadioButton( strings._('gui_settings_authenticate_no_auth_option', True)) self.authenticate_no_auth_radio.toggled.connect( self.authenticate_no_auth_toggled) # Password self.authenticate_password_radio = QtWidgets.QRadioButton( strings._('gui_settings_authenticate_password_option', True)) self.authenticate_password_radio.toggled.connect( self.authenticate_password_toggled) authenticate_password_extras_label = QtWidgets.QLabel( strings._('gui_settings_password_label', True)) self.authenticate_password_extras_password = QtWidgets.QLineEdit('') authenticate_password_extras_layout = QtWidgets.QHBoxLayout() authenticate_password_extras_layout.addWidget( authenticate_password_extras_label) authenticate_password_extras_layout.addWidget( self.authenticate_password_extras_password) self.authenticate_password_extras = QtWidgets.QWidget() self.authenticate_password_extras.setLayout( authenticate_password_extras_layout) self.authenticate_password_extras.hide() # Authentication options layout authenticate_group_layout = QtWidgets.QVBoxLayout() authenticate_group_layout.addWidget(self.authenticate_no_auth_radio) authenticate_group_layout.addWidget(self.authenticate_password_radio) authenticate_group_layout.addWidget(self.authenticate_password_extras) self.authenticate_group = QtWidgets.QGroupBox( strings._("gui_settings_authenticate_label", True)) self.authenticate_group.setLayout(authenticate_group_layout) # Test tor settings button self.connection_type_test_button = QtWidgets.QPushButton( strings._('gui_settings_connection_type_test_button', True)) self.connection_type_test_button.clicked.connect(self.test_tor_clicked) # Connection type layout connection_type_group_layout = QtWidgets.QVBoxLayout() connection_type_group_layout.addWidget( self.connection_type_bundled_radio) connection_type_group_layout.addWidget( self.connection_type_automatic_radio) connection_type_group_layout.addWidget( self.connection_type_control_port_radio) connection_type_group_layout.addWidget( self.connection_type_socket_file_radio) connection_type_group_layout.addWidget( self.connection_type_control_port_extras) connection_type_group_layout.addWidget( self.connection_type_socket_file_extras) connection_type_group_layout.addWidget(self.connection_type_socks) connection_type_group_layout.addWidget(self.authenticate_group) connection_type_group_layout.addWidget( self.connection_type_test_button) connection_type_group = QtWidgets.QGroupBox( strings._("gui_settings_connection_type_label", True)) connection_type_group.setLayout(connection_type_group_layout) # Buttons self.save_button = QtWidgets.QPushButton( strings._('gui_settings_button_save', True)) self.save_button.clicked.connect(self.save_clicked) self.cancel_button = QtWidgets.QPushButton( strings._('gui_settings_button_cancel', True)) self.cancel_button.clicked.connect(self.cancel_clicked) buttons_layout = QtWidgets.QHBoxLayout() buttons_layout.addWidget(self.save_button) buttons_layout.addWidget(self.cancel_button) # Tor network connection status self.tor_status = QtWidgets.QLabel() self.tor_status.setStyleSheet( 'background-color: #ffffff; color: #000000; padding: 10px') self.tor_status.hide() # Layout layout = QtWidgets.QVBoxLayout() layout.addWidget(sharing_group) layout.addWidget(stealth_group) layout.addWidget(autoupdate_group) layout.addWidget(connection_type_group) layout.addStretch() layout.addLayout(buttons_layout) layout.addWidget(self.tor_status) self.setLayout(layout) self.cancel_button.setFocus() # Load settings, and fill them in settings = Settings() settings.load() close_after_first_download = settings.get('close_after_first_download') if close_after_first_download: self.close_after_first_download_checkbox.setCheckState( QtCore.Qt.Checked) else: self.close_after_first_download_checkbox.setCheckState( QtCore.Qt.Unchecked) use_stealth = settings.get('use_stealth') if use_stealth: self.stealth_checkbox.setCheckState(QtCore.Qt.Checked) else: self.stealth_checkbox.setCheckState(QtCore.Qt.Unchecked) use_autoupdate = settings.get('use_autoupdate') if use_autoupdate: self.autoupdate_checkbox.setCheckState(QtCore.Qt.Checked) else: self.autoupdate_checkbox.setCheckState(QtCore.Qt.Unchecked) autoupdate_timestamp = settings.get('autoupdate_timestamp') self._update_autoupdate_timestamp(autoupdate_timestamp) connection_type = settings.get('connection_type') if connection_type == 'bundled': if self.connection_type_bundled_radio.isEnabled(): self.connection_type_bundled_radio.setChecked(True) else: # If bundled tor is disabled, fallback to automatic self.connection_type_automatic_radio.setChecked(True) elif connection_type == 'automatic': self.connection_type_automatic_radio.setChecked(True) elif connection_type == 'control_port': self.connection_type_control_port_radio.setChecked(True) elif connection_type == 'socket_file': self.connection_type_socket_file_radio.setChecked(True) self.connection_type_control_port_extras_address.setText( settings.get('control_port_address')) self.connection_type_control_port_extras_port.setText( str(settings.get('control_port_port'))) self.connection_type_socket_file_extras_path.setText( settings.get('socket_file_path')) self.connection_type_socks_address.setText( settings.get('socks_address')) self.connection_type_socks_port.setText(str( settings.get('socks_port'))) auth_type = settings.get('auth_type') if auth_type == 'no_auth': self.authenticate_no_auth_radio.setChecked(True) elif auth_type == 'password': self.authenticate_password_radio.setChecked(True) self.authenticate_password_extras_password.setText( settings.get('auth_password')) # Show the dialog self.exec_()
def __init__(self, qtapp, app, filenames): super(OnionShareGui, self).__init__() self.qtapp = qtapp self.app = app self.setWindowTitle('OnionShare') self.setWindowIcon( QtGui.QIcon(helpers.get_resource_path('images/logo.png'))) # Menu bar self.setMenuBar(Menu(self.qtapp)) # Check for updates in a new thread, if enabled system = platform.system() if system == 'Windows' or system == 'Darwin': settings = Settings() settings.load() if settings.get('use_autoupdate'): def update_available(update_url, installed_version, latest_version): Alert( strings._("update_available", True).format(update_url, installed_version, latest_version)) t = UpdateThread() t.update_available.connect(update_available) t.start() # File selection self.file_selection = FileSelection() if filenames: for filename in filenames: self.file_selection.file_list.add_file(filename) # Server status self.server_status = ServerStatus(self.qtapp, self.app, web, self.file_selection) self.server_status.server_started.connect( self.file_selection.server_started) self.server_status.server_started.connect(self.start_server) self.server_status.server_stopped.connect( self.file_selection.server_stopped) self.server_status.server_stopped.connect(self.stop_server) self.start_server_finished.connect(self.clear_message) self.start_server_finished.connect( self.server_status.start_server_finished) self.stop_server_finished.connect( self.server_status.stop_server_finished) self.file_selection.file_list.files_updated.connect( self.server_status.update) self.server_status.url_copied.connect(self.copy_url) self.server_status.hidservauth_copied.connect(self.copy_hidservauth) self.starting_server_step2.connect(self.start_server_step2) self.starting_server_step3.connect(self.start_server_step3) self.starting_server_error.connect(self.start_server_error) # Filesize warning self.filesize_warning = QtWidgets.QLabel() self.filesize_warning.setStyleSheet( 'padding: 10px 0; font-weight: bold; color: #333333;') self.filesize_warning.hide() # Downloads self.downloads = Downloads() self.downloads_container = QtWidgets.QScrollArea() self.downloads_container.setWidget(self.downloads) self.downloads_container.setWidgetResizable(True) self.downloads_container.setMaximumHeight(200) self.vbar = self.downloads_container.verticalScrollBar() self.downloads_container.hide() # downloads start out hidden self.new_download = False # Status bar self.status_bar = QtWidgets.QStatusBar() self.status_bar.setSizeGripEnabled(False) version_label = QtWidgets.QLabel('v{0:s}'.format( helpers.get_version())) version_label.setStyleSheet('color: #666666; padding: 0 10px;') self.status_bar.addPermanentWidget(version_label) self.setStatusBar(self.status_bar) # Status bar, zip progress bar self._zip_progress_bar = None # Main layout self.layout = QtWidgets.QVBoxLayout() self.layout.addLayout(self.file_selection) self.layout.addLayout(self.server_status) self.layout.addWidget(self.filesize_warning) self.layout.addWidget(self.downloads_container) central_widget = QtWidgets.QWidget() central_widget.setLayout(self.layout) self.setCentralWidget(central_widget) self.show() # check for requests frequently self.timer = QtCore.QTimer() self.timer.timeout.connect(self.check_for_requests) self.timer.start(500)