/usr/lib/python3/dist-packages/softwareproperties/gtk/DialogAddSourcesList.py is in software-properties-gtk 0.96.24.32.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #!/usr/bin/env python
from __future__ import print_function
import gi
gi.require_version("Gdk", "3.0")
gi.require_version("Gtk", "3.0")
from gi.repository import GObject, Gdk, Gtk
import os
from gettext import gettext as _
import gettext
try:
from urllib.request import url2pathname
except ImportError:
from urllib import url2pathname
from softwareproperties.gtk.utils import (
setup_ui,
)
from aptsources.sourceslist import SourcesList, SourceEntryMatcher
class DialogAddSourcesList:
def __init__(self, parent, sourceslist, source_renderer,
get_comparable, datadir, file):
print(file)
self.parent = parent
self.source_renderer = source_renderer
self.sourceslist = sourceslist
self.get_comparable = get_comparable
self.file = self.format_uri(file)
setup_ui(self, os.path.join(datadir, "gtkbuilder", "dialog-add-sources-list.ui"), domain="software-properties")
self.dialog = self.dialog_add_sources_list
self.label = self.label_sources
self.treeview = self.treeview_sources
self.scrolled = self.scrolled_window
self.image = self.image_sources_list
self.dialog.realize()
if self.parent != None:
self.dialog.set_transient_for(parent)
else:
self.dialog.set_title(_("Add Software Channels"))
self.dialog.get_window().set_functions(Gdk.WMFunction.MOVE)
# Setup the treeview
self.store = Gtk.ListStore(GObject.TYPE_STRING)
self.treeview.set_model(self.store)
cell = Gtk.CellRendererText()
cell.set_property("xpad", 2)
cell.set_property("ypad", 2)
column = Gtk.TreeViewColumn("Software Channel", cell, markup=0)
column.set_max_width(500)
self.treeview.append_column(column)
# Parse the source.list file
try:
self.new_sources = SingleSourcesList(self.file)
except:
self.error()
return
# show the found channels or an error message
if len(self.new_sources.list) > 0:
counter = 0
for source in self.new_sources.list:
if source.invalid or source.disabled:
continue
self.new_sources.matcher.match(source)
# sort the list
self.new_sources.list.sort(key=self.get_comparable)
for source in self.new_sources.list:
if source.invalid or source.disabled:
continue
counter = counter +1
line = self.source_renderer(source)
self.store.append([line])
if counter == 0:
self.error()
return
header = gettext.ngettext("Install software additionally or "
"only from this source?",
"Install software additionally or "
"only from these sources?",
counter)
body = _("You can either add the following sources or replace your "
"current sources by them. Only install software from "
"trusted sources.")
self.label.set_markup("<big><b>%s</b></big>\n\n%s" % (header, body))
else:
self.error()
return
def error(self):
self.button_add.hide()
self.button_cancel.set_use_stock(True)
self.button_cancel.set_label("gtk-close")
self.button_replace.hide()
self.scrolled.hide()
self.image.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.DIALOG)
header = _("There are no sources to install software from")
body = _("The file '%s' does not contain any valid "
"software sources." % self.file)
self.label.set_markup("%s\n\n<small>%s</small>" % (header, body))
def run(self):
res = self.dialog.run()
self.dialog.destroy()
return res, self.new_sources
def format_uri(self, uri):
path = url2pathname(uri) # escape special chars
path = path.strip('\r\n\x00') # remove \r\n and NULL
if path.startswith('file:\\\\\\'): # windows
path = path[8:] # 8 is len('file:///')
elif path.startswith('file://'): #nautilus, rox
path = path[7:] # 7 is len('file://')
elif path.startswith('file:'): # xffm
path = path[5:] # 5 is len('file:')
return path
class SingleSourcesList(SourcesList):
def __init__(self, file):
self.matcher = SourceEntryMatcher("/usr/share/update-manager/channels/")
self.list = []
self.load(file)
|