def _add_file_cb(self, widget=None, event=None): def on_response(filename): self.app.load_torrent(filename) GTKUtils.launch_file_selector(on_response, self.app.settings.torrentFolder, ("Torrent Files", "*.torrent"))
def create_file_menu(self): fileMenu = BaseMenuBar.BaseMenuBar.create_file_menu(self) fileMenu.prepend(gtk.SeparatorMenuItem()) GTKUtils.prepend_menu_item(fileMenu, "Load .torrent", self.display._add_file_cb) GTKUtils.prepend_menu_item(fileMenu, "Open Torrent Folder", self.display._open_folder)
def __init__(self, controller): GeneratorMixin.GeneratorMixin.__init__(self) self.controller = controller self.testUpdateEvent = None self.torApp = Tor.get() self.lastTestResult = None ClientUtil.add_updater(self) self._add_events("failure", "success", "size_changed") #make the components for this GUI instructionBox = self._make_instruction_box() requiredPortsBox = self._make_required_ports_box() optionalPortsBox = self._make_optional_ports_box() buttonBox = self._make_button_box() #pack them into our window: box = gtk.VBox(spacing=PADDING) box.pack_start(instructionBox, False, False, 0) box.pack_start(requiredPortsBox, False, False, 0) box.pack_start(optionalPortsBox, False, False, 0) box.pack_end(buttonBox, False, False, 0) box.show() paddedBox = GTKUtils.add_padding(box, PADDING) paddedBox.show() frame = GTKUtils.add_frame(paddedBox) frame.show() self.container = frame self.label = gtk.Label("Relay Setup") #make pretty: _unify_widget_widths([self.relayBox.label, self.dhtBox.label, self.dirBox.label, self.upnpBox.label]) _unify_widget_widths([self.relayBox.entry.entry, self.dhtBox.entry.entry, self.dirBox.entry.entry, self.upnpBox.entry.entry]) self.container.set_focus_child(self.doneButton)
def create_file_menu(self): self.fileMenu = gtk.Menu() self.fileMenuRoot = gtk.MenuItem("File") def make_toggle_app_entry(app, is_running_func, toggle_func, name, stopEvent, startEvent): menuItem = GTKUtils.append_menu_item(self.fileMenu, " ", toggle_func) def on_toggled(app): if is_running_func(): menuItem.child.set_text("Stop %s" % (name)) else: menuItem.child.set_text("Start %s" % (name)) on_toggled(app) self._start_listening_for_event(startEvent, app, on_toggled) self._start_listening_for_event(stopEvent, app, on_toggled) return menuItem self.serverMenuItem = make_toggle_app_entry(Tor.get(), Tor.get().is_server, self.controller.toggle_relay, "Relay", "server_stopped", "server_started") self.bittorrentMenuItem = make_toggle_app_entry(BitTorrentClient.get(), BitTorrentClient.get().is_running, self.controller.toggle_bittorrent, "BitTorrent", "stopped", "started") firefox = FirefoxPortable.get() if firefox: self.firefoxMenuItem = make_toggle_app_entry(firefox, firefox.is_running, self.controller.toggle_firefox, "Browser", "stopped", "started") self.fileMenu.append(gtk.SeparatorMenuItem()) GTKUtils.append_menu_item(self.fileMenu, "Update", self.controller.update_check) GTKUtils.append_menu_item(self.fileMenu, "Quit", self.controller.quit_cb) self.fileMenuRoot.set_submenu(self.fileMenu) self.fileMenuRoot.show() return self.fileMenu
def _make_instruction_box(self): """Create a box that tells the user what to do in order to set up a relay, with links to get help if they are confused.""" #make the instructions self.instructionLabel = gtk.Label() self.instructionImage = gtk.Image() instructionBox = gtk.HBox(spacing=PADDING) instructionBox.pack_start(self.instructionImage, False, False, 0) instructionBox.pack_start(self.instructionLabel, False, False, 0) descriptionLabel = WrapLabel.WrapLabel( "You must enable UPnP in your router or forward the port manually to be a relay. Otherwise, peers cannot send traffic through your computer.\n\nAlso remember to unblock BitBlinder.exe and Tor.exe in any firewall." ) #make help link row routerAccessLink = GTKUtils.make_html_link("Access your router", "") portForwardingLink = GTKUtils.make_html_link( "How do I forward a port?", "") linkRow = gtk.HBox() linkRow.pack_start(portForwardingLink, True, True, 0) linkRow.pack_start(routerAccessLink, True, True, 0) testingBox = self._make_test_bar() #pack everything together box = gtk.VBox(spacing=PADDING) box.pack_start(instructionBox, False, False, 0) box.pack_start(testingBox, False, False, 0) box.pack_start(descriptionLabel, False, False, 0) box.pack_start(linkRow, False, False, 0) box.show_all() return box
def create_view_menu(self): self.viewMenu = gtk.Menu() self.viewMenuRoot = gtk.MenuItem("View") GTKUtils.append_menu_item(self.viewMenu, "Help", self.show_help) self.viewMenu.append(gtk.SeparatorMenuItem()) def make_toggle_window_entry(window, name): menuItem = GTKUtils.append_menu_item(self.viewMenu, " ", window.toggle_window_state) def on_toggled(window): if window.is_visible(): menuItem.child.set_text("Hide %s" % (name)) else: menuItem.child.set_text("Show %s" % (name)) on_toggled(window) self._start_listening_for_event("shown", window, on_toggled) self._start_listening_for_event("hidden", window, on_toggled) return menuItem make_toggle_window_entry(self.controller.btWindow, "BitTorrent") firefox = FirefoxPortable.get() if firefox: make_toggle_window_entry(self.controller.firefoxWindow, "Firefox") make_toggle_window_entry(self.controller.serverWindow, "Server") make_toggle_window_entry(self.controller.socksClientWindow, "SOCKS Clients") self.viewMenu.append(gtk.SeparatorMenuItem()) GTKUtils.append_menu_item(self.viewMenu, "Preferences", self.controller.show_settings_cb) self.viewMenuRoot.set_submenu(self.viewMenu) self.viewMenuRoot.show() return self.viewMenu
def make_wrapper(self, nameString, helpString=None, helpSize="small"): vbox = gtk.VBox() self.hbox = gtk.HBox() #create a name label: nameLabel = GTKUtils.make_text( "<span size='large' weight='bold'>%s</span>" % (nameString)) self.hbox.pack_start(nameLabel, True, True, 5) #add the actual entry self.hbox.pack_start(self.get_gtk_element(), False, False, 5) vbox.pack_start(self.hbox, True, True, 0) #create a help label: if helpString: helpLabel = GTKUtils.make_text("<span size='%s'>%s</span>" % (helpSize, helpString)) align = gtk.Alignment(xalign=0.0, yalign=0.5, xscale=1.0, yscale=1.0) align.add(helpLabel) align.set_padding(15, 0, 0, 0) vbox.pack_start(align, True, True, 0) #create the error label self.errorLabel = GTKUtils.make_text("") vbox.pack_start(self.errorLabel, True, True, 0) #glue vbox.set_spacing(0) vbox.show_all() self.errorLabel.hide() return vbox
def _make_instruction_box(self): """Create a box that tells the user what to do in order to set up a relay, with links to get help if they are confused.""" #make the instructions self.instructionLabel = gtk.Label() self.instructionImage = gtk.Image() instructionBox = gtk.HBox(spacing=PADDING) instructionBox.pack_start(self.instructionImage, False, False, 0) instructionBox.pack_start(self.instructionLabel, False, False, 0) descriptionLabel = WrapLabel.WrapLabel("You must enable UPnP in your router or forward the port manually to be a relay. Otherwise, peers cannot send traffic through your computer.\n\nAlso remember to unblock BitBlinder.exe and Tor.exe in any firewall.") #make help link row routerAccessLink = GTKUtils.make_html_link("Access your router", "") portForwardingLink = GTKUtils.make_html_link("How do I forward a port?", "") linkRow = gtk.HBox() linkRow.pack_start(portForwardingLink, True, True, 0) linkRow.pack_start(routerAccessLink, True, True, 0) testingBox = self._make_test_bar() #pack everything together box = gtk.VBox(spacing=PADDING) box.pack_start(instructionBox, False, False, 0) box.pack_start(testingBox, False, False, 0) box.pack_start(descriptionLabel, False, False, 0) box.pack_start(linkRow, False, False, 0) box.show_all() return box
def _make_exit_traffic_box(self): def make_exit_row(labelText): #make the widgets label = gtk.Label() label.set_markup("<span size='large'>%s</span>" % (labelText)) entry = SettingsDisplay.make_entry("bool", True) #and pack them together box = gtk.HBox() box.pack_start(label, False, False, 0) box.pack_end(entry.entry, False, False, 0) return (entry, box) #make widgets exitTrafficLabel = gtk.Label() exitTrafficLabel.set_markup("<span size='large' weight='bold'>Exit Traffic Permissions:</span>") exitTrafficLabel.set_alignment(0.0, 0.5) self.webTrafficEntry, webBox = make_exit_row(" Allow Web Traffic") self.btTrafficEntry, btBox = make_exit_row(" Allow BitTorrent Traffic") self.dhtTrafficEntry, dhtBox = make_exit_row(" Allow DHT Traffic") risksLink = GTKUtils.make_html_link("What are the risks?", "") risksLink.label.set_alignment(0.0, 0.5) #pack them together: box = gtk.VBox(spacing=PADDING) box.pack_start(exitTrafficLabel, False, False, 0) box.pack_start(btBox, False, False, 0) box.pack_start(webBox, False, False, 0) box.pack_start(dhtBox, False, False, 0) box.pack_start(risksLink, False, False, 0) box = GTKUtils.add_padding(box, PADDING) frame = GTKUtils.add_frame(box, width=0) frame.show_all() return frame
def _toggle_content_box(self, expander, param_spec): """shows or hides the contents""" if expander.get_expanded(): self.contentBox.show_all() else: self.contentBox.hide() GTKUtils.refit(self)
def _make_slider_box(self, startingValue): if self.allowNonanonymousMode: lowestLimit = 0 else: lowestLimit = 1 adjustment = gtk.Adjustment(value=startingValue, lower=lowestLimit, upper=3, step_incr=1, page_incr=0, page_size=0) anonymityScale = gtk.HScale(adjustment) anonymityScale.set_digits(0) anonymityScale.set_draw_value(True) anonymityScale.set_value_pos(gtk.POS_BOTTOM) anonymityScale.connect("value_changed", self._on_anonymity_slider_changed) self.anonymityScale = anonymityScale anonLabel = gtk.Label() anonLabel.set_markup( '<span weight="bold" size="large">Anonymity</span>') anonLabel.set_alignment(0, 0) anonLabel = GTKUtils.add_padding(anonLabel, 1, 0, 0, 0) speedLabel = gtk.Label() speedLabel.set_markup('<span weight="bold" size="large">Speed</span>') speedLabel.set_alignment(0, 0) speedLabel = GTKUtils.add_padding(speedLabel, 1, 0, 0, 0) sliderBox = gtk.HBox() sliderBox.pack_start(speedLabel, False, False, 0) sliderBox.pack_start(anonymityScale, True, True, 1) sliderBox.pack_start(anonLabel, False, False, 0) vbox = gtk.VBox() vbox.pack_start(sliderBox, True, True, 5) hbox = gtk.HBox() self.AnonymousPerson = gtk.Image() self.AnonymousPerson.set_from_pixbuf( get_path_length_image(startingValue)) hbox.pack_start(self.AnonymousPerson, False, False, 0) self.helperTextLabel = gtk.Label() self.helperTextLabel.set_line_wrap(True) self.helperTextLabel.set_justify(gtk.JUSTIFY_FILL) hbox.pack_start(self.helperTextLabel, True, True, 5) self._normalize_helper_label_height() vbox.pack_start(hbox, True, True, 5) self._update_helper_text(startingValue) return vbox
def create_help_menu(self): self.helpMenu = gtk.Menu() self.helpMenuRoot = gtk.MenuItem("Help") GTKUtils.append_menu_item(self.helpMenu, "Instructions", self.show_help) GTKUtils.append_menu_item(self.helpMenu, "Read Online Help...", self.show_website) GTKUtils.append_menu_item(self.helpMenu, "Visit Forums...", self.show_forums) GTKUtils.append_menu_item(self.helpMenu, "Report an Issue...", self.controller.show_trac) GTKUtils.append_menu_item(self.helpMenu, "About", self.show_about) self.helpMenuRoot.set_submenu(self.helpMenu) self.helpMenuRoot.show() return self.helpMenu
def _make_required_ports_box(self): """Make a box containing the settings and status for all required ports (currently just the Relay port)""" #make entry rows self.relayBox = RelayPortStatusBox("Relay Port (TCP)", "orPort", self) self.upnpBox = UPnPStatusBox("UPnP") #pack them together: box = gtk.VBox(spacing=PADDING) box.pack_start(self.relayBox, False, False, 0) box.pack_start(self.upnpBox, False, False, 0) box = GTKUtils.add_padding(box, PADDING) frame = GTKUtils.add_frame(box, name="Relay Port", width=0) frame.show_all() return frame
def show_msgbox(self, text, title="Notice", cb=None, buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK), args=None, width=200, link=None, makeSafe=False, root=None): """Launches a message box and keeps the main thread going. cb will be called when the messagebox is finished.""" if not args: args = [] log_msg(text, 3) dia = gtk.Dialog(title, root, 0, buttons) #ensure that the dialog is modal if the parent window is, otherwise it's not selectable! if root and root.get_modal(): dia.set_modal(True) label = gtk.Label("") if makeSafe: label.set_text(text) else: label.set_markup(text) label.set_selectable(True) label.set_size_request(width, -1) label.set_line_wrap(True) paddedLabel = GTKUtils.add_padding(label, 5) dia.vbox.pack_start(paddedLabel, True, True, 10) if link: dia.vbox.pack_start(link, True, True, 10) dia.show_all() #have to do a callback if you want to see the result of the dialog: def on_response(dialog, response_id, cb): if cb: cb(dialog, response_id, *args) dialog.destroy() #connect the handler: dia.connect("response", on_response, cb) return dia
def make_popup_menu(self, newMenu): """creates a drop down menu on the system tray icon when right clicked""" submenu = gtk.Menu() if not self.app or not self.app.is_running() or not self.is_visible(): GTKUtils.append_menu_item(submenu, "Show SOCKS Interface", self.toggle_window_state) else: GTKUtils.append_menu_item(submenu, "Hide SOCKS Interface", self.toggle_window_state) header = GTKUtils.make_menu_item_with_picture('SOCKS Interface', "network.png") header.set_submenu(submenu) header.show_all() newMenu.append(header) return submenu
def __init__(self, controller): buttons = (gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, gtk.RESPONSE_NO) dia = gtk.Dialog("Credits Low", None, 0, buttons) self.controller = controller vbox = gtk.VBox() title = gtk.Label() markup = "<span size='large' weight='bold'>You Are Running out of Credits</span>" title.set_markup(markup) title.set_justify(gtk.JUSTIFY_CENTER) vbox.pack_start(title, True, False, 0) #A text entry telling the user what to do: balance = Bank.get().get_expected_balance() balanceGB = Format.convert_to_gb(balance) label = gtk.Label() text = "You only have %s (%s) credits remaining. You must set up a relay to gain more credits. \ This will allow other users to send traffic via your computer.\n\nWould you like to set up a relay now?" % (balance, balanceGB) label.set_markup(text) label.set_line_wrap(True) vbox.pack_start(label, True, True, 5) #if we should always check: self.askAboutRelay = gtk.CheckButton("Always ask about help setting up relay") vbox.pack_start(self.askAboutRelay, True, True, 10) #initialize the checkbox: self.askAboutRelay.set_active(CoreSettings.get().askAboutRelay) vbox = GTKUtils.add_padding(vbox, 5) dia.vbox.pack_start(vbox, True, True, 0) dia.connect("response", self.on_response) self.dia = dia #start the dialog dia.show_all()
def make_wrapper(self, nameString, helpString=None, helpSize="small"): #create a name label: nameLabel = GTKUtils.make_text("<span size='large' weight='bold'>%s</span>" % (nameString)) #create a help label: helpLabel = GTKUtils.make_text("<span size='%s'>%s</span>" % (helpSize, helpString)) self.errorLabel = GTKUtils.make_text("") vbox = gtk.VBox() vbox.pack_start(nameLabel, False, False, 5) vbox.pack_start(self.get_gtk_element(), True, True, 5) vbox.pack_end(self.errorLabel, False, False, 5) align = gtk.Alignment(xalign=0.0, yalign=0.5, xscale=1.0, yscale=1.0) align.add(helpLabel) align.set_padding(15, 0, 0, 0) vbox.pack_start(align, True, True, 0) vbox.set_spacing(0) return vbox
def filename_cb(self, widget, event=None): def on_response(filename): #ensure that the filter is right: if self.fileType not in ("folder", "all files"): if not re.compile("^.*\\.%s$" % (self.fileType)).match(filename): filename += "." + self.fileType if len(filename) > self.filenameEntry.get_width_chars(): self.filenameEntry.set_width_chars(len(filename) + 10) self.filenameEntry.set_text(filename) if self.fileType == "all files": fileTypeFilter = ("All Files", "*.*") elif self.fileType == "folder": fileTypeFilter = None else: fileTypeFilter = ("%s Files" % (self.fileType.upper()), "*.%s" % (self.fileType)) GTKUtils.launch_file_selector(on_response, self.filenameEntry.get_text(), fileTypeFilter, True)
def __init__(self): GeneratorMixin.GeneratorMixin.__init__(self) self.torApp = Tor.get() self._add_events("done") #make the components for this GUI headerBox = self._make_header_box() exitTrafficBox = self._make_exit_traffic_box() buttonBox = self._make_button_box() #pack them into our window: box = gtk.VBox(spacing=PADDING) box.pack_start(headerBox, False, False, 0) box.pack_start(exitTrafficBox, False, False, 0) box.pack_start(gtk.HSeparator(), False, False, 0) box.pack_start(buttonBox, False, False, 0) box.show() paddedBox = GTKUtils.add_padding(box, PADDING) paddedBox.show() self.container = paddedBox self.label = gtk.Label("Exit Traffic Types") self.container.set_focus_child(self.doneButton)
def __init__(self, settings, category): """Create a GUI interface for setting all of our values. @param settings: the Settings class that we should display @type settings: Applications.Settings @param category: what subcategory of the settings should be shown in this box. @type category: str @return: gtk.Box""" self.settings = settings self.category = category self.__entries = {} #create a nice table to put them in: settingsBox = gtk.VBox() for attr in settings.settings_to_save: if not attr in settings.categories[category]: continue #create the appropriate type of Entry: self.__entries[attr] = make_entry(settings.ranges[attr], getattr(settings, attr)) #create some GUI elements to make the Entry presentable: box = self.__entries[attr].make_wrapper(settings.displayNames[attr], settings.helpStrings[attr]) if settings.isVisible[attr]: box.show() sep = gtk.HSeparator() sep.show() #pack it into our box: settingsBox.pack_start(box, False, False, 10) settingsBox.pack_start(sep, False, False, 0) settingsBox.set_spacing(5) scrolled_window = GTKUtils.make_scroll_box(settingsBox) scrolled_window.set_size_request(-1, 300) scrolled_window.show() settingsBox.show() self._hide_error_labels() self.container = scrolled_window
def _make_optional_info_box(self): """shows extra information that will scare away most users""" #make entry rows moreInfos = WrapLabel.WrapLabel(greaterInfoText) moreInfos.set_justify(gtk.JUSTIFY_FILL) #make a box for hiding self.optionalInfosBox = gtk.VBox() self.optionalInfosBox.pack_start(moreInfos, False, False, 0) self.optionalInfosBox = GTKUtils.add_padding(self.optionalInfosBox, 5) #make a frame with a built-in expander for showing and hiding these entry rows frame = GTKUtils.add_frame(self.optionalInfosBox, width=0) frameWidget = gtk.Expander("Learn More") frameWidget.connect("notify::expanded", self._toggle_optional_infos) frame.set_label_widget(frameWidget) return frame
def _make_slider_box(self, startingValue): if self.allowNonanonymousMode: lowestLimit = 0 else: lowestLimit = 1 adjustment = gtk.Adjustment(value=startingValue, lower=lowestLimit, upper=3, step_incr=1, page_incr=0, page_size=0) anonymityScale = gtk.HScale(adjustment) anonymityScale.set_digits(0) anonymityScale.set_draw_value(True) anonymityScale.set_value_pos(gtk.POS_BOTTOM) anonymityScale.connect("value_changed", self._on_anonymity_slider_changed) self.anonymityScale = anonymityScale anonLabel = gtk.Label() anonLabel.set_markup('<span weight="bold" size="large">Anonymity</span>') anonLabel.set_alignment(0, 0) anonLabel = GTKUtils.add_padding(anonLabel, 1, 0, 0, 0) speedLabel = gtk.Label() speedLabel.set_markup('<span weight="bold" size="large">Speed</span>') speedLabel.set_alignment(0, 0) speedLabel = GTKUtils.add_padding(speedLabel, 1, 0, 0, 0) sliderBox = gtk.HBox() sliderBox.pack_start(speedLabel, False, False, 0) sliderBox.pack_start(anonymityScale, True, True, 1) sliderBox.pack_start(anonLabel, False, False, 0) vbox = gtk.VBox() vbox.pack_start(sliderBox, True, True, 5) hbox = gtk.HBox() self.AnonymousPerson = gtk.Image() self.AnonymousPerson.set_from_pixbuf(get_path_length_image(startingValue)) hbox.pack_start(self.AnonymousPerson, False, False, 0) self.helperTextLabel = gtk.Label() self.helperTextLabel.set_line_wrap(True) self.helperTextLabel.set_justify(gtk.JUSTIFY_FILL) hbox.pack_start(self.helperTextLabel, True, True, 5) self._normalize_helper_label_height() vbox.pack_start(hbox, True, True, 5) self._update_helper_text(startingValue) return vbox
def __init__(self, app, allowNonanonymousMode=True): BaseDialog.BaseDialog.__init__(self, "%s Anonymity Selector" % (app.name), ("ok", "cancel"), None) self.app = app self.allowNonanonymousMode = allowNonanonymousMode titleLabel = gtk.Label() titleLabel.set_markup( "<span size='x-large' weight='bold'>%s Anonymity Selector</span>" % (self.app.name)) titleLabel.set_justify(gtk.JUSTIFY_CENTER) vbox = gtk.VBox() vbox.pack_start(titleLabel, False, False, 5) infoTextLabel = WrapLabel.WrapLabel(infoText) infoTextLabel.set_justify(gtk.JUSTIFY_FILL) #keep the label from having no width infoTextLabel.set_size_request(300, -1) infoAndSlider = gtk.VBox() infoAndSlider.pack_start(infoTextLabel, False, False, 0) instructionBox = self._make_instruction_box() infoAndSlider.pack_start(instructionBox, False, False, 0) #get the appropriate path length from the app if not self.allowNonanonymousMode or self.app.useTor: pathLength = self.app.settings.pathLength else: pathLength = 0 anonymityBox = self._make_slider_box(pathLength) infoAndSlider.pack_start(anonymityBox, False, False, 0) infoAndSlider = GTKUtils.add_padding(infoAndSlider, 5) infoAndSlider = GTKUtils.add_frame(infoAndSlider, name='Choose Your Anonymity Level') vbox.pack_start(infoAndSlider, False, False, 0) optionalInfos = self._make_optional_info_box() optionalInfos = GTKUtils.add_padding(optionalInfos, 0, 5, 5, 5) vbox.pack_start(optionalInfos, False, False, 0) self.dia.vbox.pack_start(vbox, False, False, 0) self.dia.vbox.show_all() self.optionalInfosBox.hide() self.dia.window.raise_()
def create_box(self): #create each of the pages: self._mainBox = gtk.HBox() self.vbox.pack_start(self._mainBox, True, True, 0) BORDER_WIDTH = 10 def add_var(name, box, ignoreHBar=None): return self.add_variable(name, Tor.get().settings, Tor.get(), "", box, ignoreHBar) #general settings page: vbox = gtk.VBox() add_var("orPort", vbox) add_var("dirPort", vbox) add_var("dhtPort", vbox) vbox.set_border_width(BORDER_WIDTH) #windows settings, if necessary if System.IS_WINDOWS: startOnBootEntry = self.add_variable("startBitBlinderOnBoot", BitBlinder.get().settings, BitBlinder.get(), "", vbox) #NOTE: change the default to starting on bootup if we're a server now if not Tor.get().settings.wasRelay: startOnBootEntry.set_value(True) self.add_variable("halfOpenConnections", BitBlinder.get().settings, BitBlinder.get(), "", vbox) self._boxes.append(vbox) #exit traffic page: vbox = gtk.VBox() vbox.set_border_width(BORDER_WIDTH) exitTypeEntry = add_var("exitType", vbox, True) exitTypeEntry.set_value("Both") vbox.pack_start( GTKUtils.make_html_link( "Learn more about exit traffic", "%s/overview/" % (ProgramState.Conf.BASE_HTTP)), False, False, 2) self._boxes.append(vbox) #bandwidth page: vbox = gtk.VBox() vbox.set_border_width(BORDER_WIDTH) label = WrapLabel.WrapLabel("") label.set_markup( """<span size='large' weight='bold'>You should run BitBlinder in the background to accumulate credits. </span> """) vbox.pack_start(label, False, False, 0) # vbox.pack_start(gtk.HSeparator(), False, False, 0) add_var("monthlyCap", vbox) add_var("bwRate", vbox) add_var("bwSchedule", vbox) self._boxes.append(vbox) self._mainBox.set_size_request(600, -1) self.set_current_page()
def on_update(self): """updates the gui via pulling infos out of tor and the bank- slow, stupid, and easy""" # don't do updates if we arent visible if not GTKUtils.is_visible(self.container): return configuredAsRelay = self.torApp.is_server() if configuredAsRelay: self.relayRow.update_row_image(True) else: self.relayRow.reset_row_image() relayStatus, relayStateString = self.torApp.get_relay_status() if self.torApp.is_server(): self.statusRow.update_row_image(relayStatus) else: self.statusRow.reset_row_image() self.statusRow.widget.set_markup('<span size="large">%s</span>' % (relayStateString)) # update as appropriate for rows when we are trying to be a relay if configuredAsRelay: boolToStringMapping = {True: "is reachable", False: "is unreachable", None: "testing..."} # do updates where we have the info relayPortsState = self.torApp.get_all_port_status() for row in self.statusRows: updateForGUIPort = row.rowName in relayPortsState if updateForGUIPort: port = relayPortsState[row.rowName] row.update_row_image(port[0]) statusText = boolToStringMapping[port[0]] row.widget.set_markup('<span size="large">%s %s</span>' % (port[1], statusText)) # else, null everything out else: for row in [self.udpRelayPortRow, self.tcpRelayPortRow, self.dirPortRow, self.statusRow]: row.reset_row_image() row.widget.set_markup('<span size="large">offline</span>') # update the balance bank = Bank.get() if not bank: return credits = bank.get_expected_balance() if not credits: return self.creditsRow.widget.set_markup( '<span size="large">%s (%s)</span>' % (credits, Format.convert_to_gb(credits)) ) if credits > 200: creditState = True elif credits > 100: creditState = None else: creditState = False self.creditsRow.update_row_image(creditState)
def make_toggle_app_entry(app, is_running_func, toggle_func, name, stopEvent, startEvent): menuItem = GTKUtils.append_menu_item(self.fileMenu, " ", toggle_func) def on_toggled(app): if is_running_func(): menuItem.child.set_text("Stop %s" % (name)) else: menuItem.child.set_text("Start %s" % (name)) on_toggled(app) self._start_listening_for_event(startEvent, app, on_toggled) self._start_listening_for_event(stopEvent, app, on_toggled) return menuItem
def on_update(self): """updates the gui via pulling infos out of tor and the bank- slow, stupid, and easy""" #don't do updates if we arent visible if not GTKUtils.is_visible(self.container): return configuredAsRelay = self.torApp.is_server() if configuredAsRelay: self.relayRow.update_row_image(True) else: self.relayRow.reset_row_image() relayStatus, relayStateString = self.torApp.get_relay_status() if self.torApp.is_server(): self.statusRow.update_row_image(relayStatus) else: self.statusRow.reset_row_image() self.statusRow.widget.set_markup('<span size="large">%s</span>' % (relayStateString)) #update as appropriate for rows when we are trying to be a relay if configuredAsRelay: boolToStringMapping = {True: 'is reachable', False: 'is unreachable', None: 'testing...'} #do updates where we have the info relayPortsState = self.torApp.get_all_port_status() for row in self.statusRows: updateForGUIPort = row.rowName in relayPortsState if updateForGUIPort: port = relayPortsState[row.rowName] row.update_row_image(port[0]) statusText = boolToStringMapping[port[0]] row.widget.set_markup('<span size="large">%s %s</span>' % (port[1], statusText)) #else, null everything out else: for row in [self.udpRelayPortRow, self.tcpRelayPortRow, self.dirPortRow, self.statusRow]: row.reset_row_image() row.widget.set_markup('<span size="large">offline</span>') #update the balance bank = Bank.get() if not bank: return credits = bank.get_expected_balance() if not credits: return self.creditsRow.widget.set_markup('<span size="large">%s (%s)</span>'%\ (credits, Format.convert_to_gb(credits))) if credits > 200: creditState = True elif credits > 100: creditState = None else: creditState = False self.creditsRow.update_row_image(creditState)
def make_toggle_window_entry(window, name): menuItem = GTKUtils.append_menu_item(self.viewMenu, " ", window.toggle_window_state) def on_toggled(window): if window.is_visible(): menuItem.child.set_text("Hide %s" % (name)) else: menuItem.child.set_text("Show %s" % (name)) on_toggled(window) self._start_listening_for_event("shown", window, on_toggled) self._start_listening_for_event("hidden", window, on_toggled) return menuItem
def __init__(self, controller): GeneratorMixin.GeneratorMixin.__init__(self) self.controller = controller self.testUpdateEvent = None self.torApp = Tor.get() self.lastTestResult = None ClientUtil.add_updater(self) self._add_events("failure", "success", "size_changed") #make the components for this GUI instructionBox = self._make_instruction_box() requiredPortsBox = self._make_required_ports_box() optionalPortsBox = self._make_optional_ports_box() buttonBox = self._make_button_box() #pack them into our window: box = gtk.VBox(spacing=PADDING) box.pack_start(instructionBox, False, False, 0) box.pack_start(requiredPortsBox, False, False, 0) box.pack_start(optionalPortsBox, False, False, 0) box.pack_end(buttonBox, False, False, 0) box.show() paddedBox = GTKUtils.add_padding(box, PADDING) paddedBox.show() frame = GTKUtils.add_frame(paddedBox) frame.show() self.container = frame self.label = gtk.Label("Relay Setup") #make pretty: _unify_widget_widths([ self.relayBox.label, self.dhtBox.label, self.dirBox.label, self.upnpBox.label ]) _unify_widget_widths([ self.relayBox.entry.entry, self.dhtBox.entry.entry, self.dirBox.entry.entry, self.upnpBox.entry.entry ]) self.container.set_focus_child(self.doneButton)
def make_popup_menu(self, newMenu): """creates a drop down menu on the system tray icon when right clicked hopefully""" #make appropriate submenu submenu = gtk.Menu() if not self.torApp.is_running() or not self.torApp.is_server(): GTKUtils.append_menu_item(submenu, "Start Relay", self.controller.toggle_relay) else: GTKUtils.append_menu_item(submenu, "Show Server Window", self._start_cb) GTKUtils.append_menu_item(submenu, "Settings", self.show_server_settings) GTKUtils.append_menu_item(submenu, "Stop Relay", self.controller.toggle_relay) menuItem = GTKUtils.make_menu_item_with_picture("Relay", "network2.png") menuItem.set_submenu(submenu) menuItem.show_all() newMenu.append(menuItem) return submenu
def make_button_row(labelText, callback, imageFile, descriptionText): button = GTKUtils.make_image_button(labelText, callback, imageFile, iconSize=32) button.set_size_request(200, -1) label = WrapLabel.WrapLabel(descriptionText) label.set_size_request(200, -1) box = gtk.HBox(spacing=3 * PADDING) box.pack_start(button, False, False, 0) box.pack_start(label, False, False, 0) return (box, button)
def create_view_menu(self): viewMenu = BaseMenuBar.BaseMenuBar.create_view_menu(self) viewMenu.prepend(gtk.SeparatorMenuItem()) GTKUtils.prepend_menu_item(viewMenu, "Torrent Priorities", self.display._show_pane, self.display.priorityBox) GTKUtils.prepend_menu_item(viewMenu, "Peers", self.display._show_pane, self.display.peerBox) GTKUtils.prepend_menu_item(viewMenu, "Bandwidth", self.display._show_pane, self.display.bwGraph) return viewMenu
def make_popup_menu(self, newMenu): """creates a drop down menu on the system tray icon when right clicked""" submenu = gtk.Menu() if not self.app or not self.app.is_running(): GTKUtils.append_menu_item(submenu, "Start Firefox", self.controller.toggle_firefox) else: GTKUtils.append_menu_item(submenu, "Show Firefox Controls", self._start_cb) GTKUtils.append_menu_item(submenu, "New identity", self._new_circuit_cb) GTKUtils.append_menu_item(submenu, "Change speed", self._anonymity_cb) GTKUtils.append_menu_item(submenu, "Stop Firefox", self.controller.toggle_firefox) image = gtk.Image() iconPath = os.path.join(self.app.appBasePath, self.app.name, "App", "AppInfo", "appicon.ico") if os.path.exists(iconPath): pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(iconPath, 24, 24) image.set_from_pixbuf(pixbuf) else: image.set_from_pixbuf(Images.GREY_CIRCLE) headerLabel = gtk.Label() headerLabel.set_markup("<span weight='bold'>%s</span>" % (self.app.name)) box = gtk.HBox(spacing=10) box.pack_start(image, False, False, 0) box.pack_start(headerLabel, False, False, 0) header = gtk.MenuItem() header.add(box) header.set_submenu(submenu) header.show_all() newMenu.append(header) return submenu
def __init__(self, app, allowNonanonymousMode=True): BaseDialog.BaseDialog.__init__(self, "%s Anonymity Selector" % (app.name), ("ok", "cancel"), None) self.app = app self.allowNonanonymousMode = allowNonanonymousMode titleLabel = gtk.Label() titleLabel.set_markup("<span size='x-large' weight='bold'>%s Anonymity Selector</span>" % (self.app.name)) titleLabel.set_justify(gtk.JUSTIFY_CENTER) vbox = gtk.VBox() vbox.pack_start(titleLabel, False, False, 5) infoTextLabel = WrapLabel.WrapLabel(infoText) infoTextLabel.set_justify(gtk.JUSTIFY_FILL) #keep the label from having no width infoTextLabel.set_size_request(300, -1) infoAndSlider = gtk.VBox() infoAndSlider.pack_start(infoTextLabel, False, False, 0) instructionBox = self._make_instruction_box() infoAndSlider.pack_start(instructionBox, False, False, 0) #get the appropriate path length from the app if not self.allowNonanonymousMode or self.app.useTor: pathLength = self.app.settings.pathLength else: pathLength = 0 anonymityBox = self._make_slider_box(pathLength) infoAndSlider.pack_start(anonymityBox, False, False, 0) infoAndSlider = GTKUtils.add_padding(infoAndSlider, 5) infoAndSlider = GTKUtils.add_frame(infoAndSlider, name='Choose Your Anonymity Level') vbox.pack_start(infoAndSlider, False, False, 0) optionalInfos = self._make_optional_info_box() optionalInfos = GTKUtils.add_padding(optionalInfos, 0, 5, 5, 5) vbox.pack_start(optionalInfos, False, False, 0) self.dia.vbox.pack_start(vbox, False, False, 0) self.dia.vbox.show_all() self.optionalInfosBox.hide() self.dia.window.raise_()
def response(success): if success: GUIController.get().show_msgbox( "The bug report was sent successfully.", title="Success!") else: if not ProgramState.DONE: GUIController.get().show_msgbox( "The bug report failed. You can submit the bug manually at:", title="Too Much Fail", link=GTKUtils.make_html_link( "http://innomi.net/bugs/report/1", 'http://innomi.net/bugs/report/1'))
def create_debug_menu(self): #Debug Menu self.debugMenu = gtk.Menu() self.profileMenuItem = GTKUtils.append_menu_item(self.debugMenu, "Start Profiler", self.toggle_profiler) def on_profiler_started(profiler): self.profileMenuItem.child.set_text("Stop Profiler") self._start_listening_for_event("started", Profiler.get(), on_profiler_started) def on_profiler_stopped(profiler): self.profileMenuItem.child.set_text("Start Profiler") self._start_listening_for_event("stopped", Profiler.get(), on_profiler_stopped) self.debugMenuRoot = gtk.MenuItem("Debug") self.debugMenuRoot.set_submenu(self.debugMenu) self.debugMenuRoot.show() return self.debugMenu
def make_wrapper(self, nameString, helpString=None, helpSize="small"): vbox = gtk.VBox() self.hbox = gtk.HBox() # create a name label: nameLabel = GTKUtils.make_text("<span size='large' weight='bold'>%s</span>" % (nameString)) self.hbox.pack_start(nameLabel, True, True, 5) # add the actual entry self.hbox.pack_start(self.get_gtk_element(), False, False, 5) vbox.pack_start(self.hbox, True, True, 0) # create a help label: if helpString: helpLabel = GTKUtils.make_text("<span size='%s'>%s</span>" % (helpSize, helpString)) align = gtk.Alignment(xalign=0.0, yalign=0.5, xscale=1.0, yscale=1.0) align.add(helpLabel) align.set_padding(15, 0, 0, 0) vbox.pack_start(align, True, True, 0) # create the error label self.errorLabel = GTKUtils.make_text("") vbox.pack_start(self.errorLabel, True, True, 0) # glue vbox.set_spacing(0) vbox.show_all() self.errorLabel.hide() return vbox
def _make_exit_traffic_box(self): def make_exit_row(labelText): #make the widgets label = gtk.Label() label.set_markup("<span size='large'>%s</span>" % (labelText)) entry = SettingsDisplay.make_entry("bool", True) #and pack them together box = gtk.HBox() box.pack_start(label, False, False, 0) box.pack_end(entry.entry, False, False, 0) return (entry, box) #make widgets exitTrafficLabel = gtk.Label() exitTrafficLabel.set_markup( "<span size='large' weight='bold'>Exit Traffic Permissions:</span>" ) exitTrafficLabel.set_alignment(0.0, 0.5) self.webTrafficEntry, webBox = make_exit_row(" Allow Web Traffic") self.btTrafficEntry, btBox = make_exit_row( " Allow BitTorrent Traffic") self.dhtTrafficEntry, dhtBox = make_exit_row(" Allow DHT Traffic") risksLink = GTKUtils.make_html_link("What are the risks?", "") risksLink.label.set_alignment(0.0, 0.5) #pack them together: box = gtk.VBox(spacing=PADDING) box.pack_start(exitTrafficLabel, False, False, 0) box.pack_start(btBox, False, False, 0) box.pack_start(webBox, False, False, 0) box.pack_start(dhtBox, False, False, 0) box.pack_start(risksLink, False, False, 0) box = GTKUtils.add_padding(box, PADDING) frame = GTKUtils.add_frame(box, width=0) frame.show_all() return frame
def _make_optional_ports_box(self): """Make a box containing the settings and status for all optional ports (DHT and Dir)""" #make entry rows instructions = WrapLabel.WrapLabel("These ports perform minor misc functions that are helpful to other BitBlinder users. Set to 0 to disable.") self.dhtBox = PortStatusBox("Relay Port (UDP)", "dhtPort") self.dirBox = PortStatusBox("Dir Port (TCP)", "dirPort") #make a box for hiding these entry rows optionalPortsBox = gtk.VBox(spacing=PADDING) optionalPortsBox.pack_start(instructions, False, False, 0) optionalPortsBox.pack_start(self.dhtBox, False, False, 0) optionalPortsBox.pack_start(self.dirBox, False, False, 0) optionalPortsBox = GTKUtils.add_padding(optionalPortsBox, PADDING) optionalPortsBox.show_all() #make a frame with a built-in expander for showing and hiding these entry rows frame = OptionalToggleFrame.OptionalToggleFrame(optionalPortsBox, "Optional Ports") return frame
def create_box(self): #create each of the pages: self._mainBox = gtk.HBox() self.vbox.pack_start(self._mainBox, True, True, 0) BORDER_WIDTH = 10 def add_var(name, box, ignoreHBar=None): return self.add_variable(name, Tor.get().settings, Tor.get(), "", box, ignoreHBar) #general settings page: vbox = gtk.VBox() add_var("orPort", vbox) add_var("dirPort", vbox) add_var("dhtPort", vbox) vbox.set_border_width(BORDER_WIDTH) #windows settings, if necessary if System.IS_WINDOWS: startOnBootEntry = self.add_variable("startBitBlinderOnBoot", BitBlinder.get().settings, BitBlinder.get(), "", vbox) #NOTE: change the default to starting on bootup if we're a server now if not Tor.get().settings.wasRelay: startOnBootEntry.set_value(True) self.add_variable("halfOpenConnections", BitBlinder.get().settings, BitBlinder.get(), "", vbox) self._boxes.append(vbox) #exit traffic page: vbox = gtk.VBox() vbox.set_border_width(BORDER_WIDTH) exitTypeEntry = add_var("exitType", vbox, True) exitTypeEntry.set_value("Both") vbox.pack_start(GTKUtils.make_html_link("Learn more about exit traffic", "%s/overview/" % (ProgramState.Conf.BASE_HTTP)), False, False, 2) self._boxes.append(vbox) #bandwidth page: vbox = gtk.VBox() vbox.set_border_width(BORDER_WIDTH) label = WrapLabel.WrapLabel("") label.set_markup("""<span size='large' weight='bold'>You should run BitBlinder in the background to accumulate credits. </span> """) vbox.pack_start(label, False, False, 0) # vbox.pack_start(gtk.HSeparator(), False, False, 0) add_var("monthlyCap", vbox) add_var("bwRate", vbox) add_var("bwSchedule", vbox) self._boxes.append(vbox) self._mainBox.set_size_request(600, -1) self.set_current_page()
def _make_optional_ports_box(self): """Make a box containing the settings and status for all optional ports (DHT and Dir)""" #make entry rows instructions = WrapLabel.WrapLabel( "These ports perform minor misc functions that are helpful to other BitBlinder users. Set to 0 to disable." ) self.dhtBox = PortStatusBox("Relay Port (UDP)", "dhtPort") self.dirBox = PortStatusBox("Dir Port (TCP)", "dirPort") #make a box for hiding these entry rows optionalPortsBox = gtk.VBox(spacing=PADDING) optionalPortsBox.pack_start(instructions, False, False, 0) optionalPortsBox.pack_start(self.dhtBox, False, False, 0) optionalPortsBox.pack_start(self.dirBox, False, False, 0) optionalPortsBox = GTKUtils.add_padding(optionalPortsBox, PADDING) optionalPortsBox.show_all() #make a frame with a built-in expander for showing and hiding these entry rows frame = OptionalToggleFrame.OptionalToggleFrame( optionalPortsBox, "Optional Ports") return frame
def on_status_icon_popup(self, statusIcon, newMenu, submenus): """retrieves the correct menu items from the respective apps""" socksMenu = self.socksClientWindow.make_popup_menu(newMenu) submenu = self.serverWindow.make_popup_menu(newMenu) submenus.append(submenu) #don't make this for linux users who don't have a portable ff if self.ffApp: submenu = self.firefoxWindow.make_popup_menu(newMenu) submenus.append(submenu) submenu = self.btWindow.make_popup_menu(newMenu) if submenu: submenus.append(submenu) menuItem = GTKUtils.make_menu_item_with_picture("Quit", "exit.png") #menuItem.set_submenu(submenu) menuItem.connect("activate", self.quit_cb) menuItem.show_all() newMenu.append(menuItem) return submenu
def download_update(self, newVersionData): """Download the latest version of InnomiNet from the web server newVersion=the version to download""" self.newVersion = newVersionData[0] self.trueHash = newVersionData[1] self.updateString = newVersionData[2] if System.IS_WINDOWS: #if we're not already doing the update: if not self.downloadingUpdate: self.downloadingUpdate = True #baseURL += "BitBlinderUpdate-%s-%s.exe" % (Globals.VERSION, self.newVersion) fileName = "BitBlinderInstaller-%s.exe" % (self.newVersion) url = self.baseURL + fileName #TODO: go through a circuit if the user wants to be stealthy: BitBlinder.http_download(url, None, self.request_done, self.request_failed, progressCB=self.progressCB, fileName=Globals.UPDATE_FILE_NAME+".download") GUIController.get().show_msgbox("BitBlinder found a new version (%s)!\n\nDownloading update now... (you can choose whether to restart later)" % (self.newVersion)) else: #url = self.baseURL + "python-bitblinder_%s_%s.deb" % (self.newVersion, platform.machine()) url = "%s/download/" % (ProgramState.Conf.BASE_HTTP) if ProgramState.USE_GTK: link = GTKUtils.make_html_link(url, url) else: link = url GUIController.get().show_msgbox("A new linux package is available! Changes:\n\n%s\n\nGo download and install it from:" % (self.updateString), title="Update Available", link=link)
def draw(self): if self.shouldDraw: if GTKUtils.is_visible(self): self.queue_draw() return True