1*2d543d20SAndroid Build Coastguard Worker#!/usr/bin/python3 -EsI 2*2d543d20SAndroid Build Coastguard Worker# 3*2d543d20SAndroid Build Coastguard Worker# polgengui.py - GUI for SELinux Config tool in system-config-selinux 4*2d543d20SAndroid Build Coastguard Worker# 5*2d543d20SAndroid Build Coastguard Worker# Dan Walsh <[email protected]> 6*2d543d20SAndroid Build Coastguard Worker# 7*2d543d20SAndroid Build Coastguard Worker# Copyright (C) 2007-2013 Red Hat 8*2d543d20SAndroid Build Coastguard Worker# 9*2d543d20SAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify 10*2d543d20SAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by 11*2d543d20SAndroid Build Coastguard Worker# the Free Software Foundation; either version 2 of the License, or 12*2d543d20SAndroid Build Coastguard Worker# (at your option) any later version. 13*2d543d20SAndroid Build Coastguard Worker# 14*2d543d20SAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful, 15*2d543d20SAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of 16*2d543d20SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*2d543d20SAndroid Build Coastguard Worker# GNU General Public License for more details. 18*2d543d20SAndroid Build Coastguard Worker# 19*2d543d20SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License 20*2d543d20SAndroid Build Coastguard Worker# along with this program; if not, write to the Free Software 21*2d543d20SAndroid Build Coastguard Worker# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22*2d543d20SAndroid Build Coastguard Worker# 23*2d543d20SAndroid Build Coastguard Workerimport signal 24*2d543d20SAndroid Build Coastguard Workerimport string 25*2d543d20SAndroid Build Coastguard Workerimport gi 26*2d543d20SAndroid Build Coastguard Workergi.require_version('Gtk', '3.0') 27*2d543d20SAndroid Build Coastguard Workerfrom gi.repository import Gtk 28*2d543d20SAndroid Build Coastguard Workerimport os 29*2d543d20SAndroid Build Coastguard Workerfrom gi.repository import GObject 30*2d543d20SAndroid Build Coastguard Workerimport sys 31*2d543d20SAndroid Build Coastguard Workertry: 32*2d543d20SAndroid Build Coastguard Worker import sepolicy 33*2d543d20SAndroid Build Coastguard Workerexcept ValueError as e: 34*2d543d20SAndroid Build Coastguard Worker sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e))) 35*2d543d20SAndroid Build Coastguard Worker sys.exit(1) 36*2d543d20SAndroid Build Coastguard Worker 37*2d543d20SAndroid Build Coastguard Workerimport sepolicy.generate 38*2d543d20SAndroid Build Coastguard Workerimport sepolicy.interface 39*2d543d20SAndroid Build Coastguard Worker 40*2d543d20SAndroid Build Coastguard Workertry: 41*2d543d20SAndroid Build Coastguard Worker from subprocess import getstatusoutput 42*2d543d20SAndroid Build Coastguard Workerexcept ImportError: 43*2d543d20SAndroid Build Coastguard Worker from commands import getstatusoutput 44*2d543d20SAndroid Build Coastguard Worker 45*2d543d20SAndroid Build Coastguard Worker 46*2d543d20SAndroid Build Coastguard Workerimport re 47*2d543d20SAndroid Build Coastguard Worker 48*2d543d20SAndroid Build Coastguard Worker 49*2d543d20SAndroid Build Coastguard Workerdef get_all_modules(): 50*2d543d20SAndroid Build Coastguard Worker try: 51*2d543d20SAndroid Build Coastguard Worker all_modules = [] 52*2d543d20SAndroid Build Coastguard Worker rc, output = getstatusoutput("semodule -l 2>/dev/null") 53*2d543d20SAndroid Build Coastguard Worker if rc == 0: 54*2d543d20SAndroid Build Coastguard Worker l = output.split("\n") 55*2d543d20SAndroid Build Coastguard Worker for i in l: 56*2d543d20SAndroid Build Coastguard Worker all_modules.append(i.split()[0]) 57*2d543d20SAndroid Build Coastguard Worker except: 58*2d543d20SAndroid Build Coastguard Worker pass 59*2d543d20SAndroid Build Coastguard Worker 60*2d543d20SAndroid Build Coastguard Worker return all_modules 61*2d543d20SAndroid Build Coastguard Worker 62*2d543d20SAndroid Build Coastguard Worker 63*2d543d20SAndroid Build Coastguard Worker## 64*2d543d20SAndroid Build Coastguard Worker## I18N 65*2d543d20SAndroid Build Coastguard Worker## 66*2d543d20SAndroid Build Coastguard WorkerPROGNAME = "selinux-gui" 67*2d543d20SAndroid Build Coastguard Workertry: 68*2d543d20SAndroid Build Coastguard Worker import gettext 69*2d543d20SAndroid Build Coastguard Worker kwargs = {} 70*2d543d20SAndroid Build Coastguard Worker if sys.version_info < (3,): 71*2d543d20SAndroid Build Coastguard Worker kwargs['unicode'] = True 72*2d543d20SAndroid Build Coastguard Worker t = gettext.translation(PROGNAME, 73*2d543d20SAndroid Build Coastguard Worker localedir="/usr/share/locale", 74*2d543d20SAndroid Build Coastguard Worker **kwargs, 75*2d543d20SAndroid Build Coastguard Worker fallback=True) 76*2d543d20SAndroid Build Coastguard Worker _ = t.gettext 77*2d543d20SAndroid Build Coastguard Workerexcept: 78*2d543d20SAndroid Build Coastguard Worker try: 79*2d543d20SAndroid Build Coastguard Worker import builtins 80*2d543d20SAndroid Build Coastguard Worker builtins.__dict__['_'] = str 81*2d543d20SAndroid Build Coastguard Worker except ImportError: 82*2d543d20SAndroid Build Coastguard Worker import __builtin__ 83*2d543d20SAndroid Build Coastguard Worker __builtin__.__dict__['_'] = unicode 84*2d543d20SAndroid Build Coastguard Worker 85*2d543d20SAndroid Build Coastguard Workerversion = "1.0" 86*2d543d20SAndroid Build Coastguard Worker 87*2d543d20SAndroid Build Coastguard Workersys.path.append('/usr/share/system-config-selinux') 88*2d543d20SAndroid Build Coastguard Workersys.path.append('.') 89*2d543d20SAndroid Build Coastguard Worker 90*2d543d20SAndroid Build Coastguard Worker# From John Hunter http://www.daa.com.au/pipermail/pygtk/2003-February/004454.html 91*2d543d20SAndroid Build Coastguard Worker 92*2d543d20SAndroid Build Coastguard Worker 93*2d543d20SAndroid Build Coastguard Workerdef foreach(model, path, iter, selected): 94*2d543d20SAndroid Build Coastguard Worker selected.append(model.get_value(iter, 0)) 95*2d543d20SAndroid Build Coastguard Worker 96*2d543d20SAndroid Build Coastguard Worker## 97*2d543d20SAndroid Build Coastguard Worker## Pull in the Glade file 98*2d543d20SAndroid Build Coastguard Worker## 99*2d543d20SAndroid Build Coastguard Workerxml = Gtk.Builder() 100*2d543d20SAndroid Build Coastguard Workerxml.set_translation_domain(PROGNAME) 101*2d543d20SAndroid Build Coastguard Workerif os.access("polgen.ui", os.F_OK): 102*2d543d20SAndroid Build Coastguard Worker xml.add_from_file("polgen.ui") 103*2d543d20SAndroid Build Coastguard Workerelse: 104*2d543d20SAndroid Build Coastguard Worker xml.add_from_file("/usr/share/system-config-selinux/polgen.ui") 105*2d543d20SAndroid Build Coastguard Worker 106*2d543d20SAndroid Build Coastguard WorkerFILE = 1 107*2d543d20SAndroid Build Coastguard WorkerDIR = 2 108*2d543d20SAndroid Build Coastguard Worker 109*2d543d20SAndroid Build Coastguard Worker 110*2d543d20SAndroid Build Coastguard Workerclass childWindow: 111*2d543d20SAndroid Build Coastguard Worker START_PAGE = 0 112*2d543d20SAndroid Build Coastguard Worker SELECT_TYPE_PAGE = 0 113*2d543d20SAndroid Build Coastguard Worker APP_PAGE = 1 114*2d543d20SAndroid Build Coastguard Worker EXISTING_USER_PAGE = 2 115*2d543d20SAndroid Build Coastguard Worker TRANSITION_PAGE = 3 116*2d543d20SAndroid Build Coastguard Worker USER_TRANSITION_PAGE = 4 117*2d543d20SAndroid Build Coastguard Worker ADMIN_PAGE = 5 118*2d543d20SAndroid Build Coastguard Worker ROLE_PAGE = 6 119*2d543d20SAndroid Build Coastguard Worker IN_NET_PAGE = 7 120*2d543d20SAndroid Build Coastguard Worker OUT_NET_PAGE = 8 121*2d543d20SAndroid Build Coastguard Worker COMMON_APPS_PAGE = 9 122*2d543d20SAndroid Build Coastguard Worker FILES_PAGE = 10 123*2d543d20SAndroid Build Coastguard Worker BOOLEAN_PAGE = 11 124*2d543d20SAndroid Build Coastguard Worker SELECT_DIR_PAGE = 12 125*2d543d20SAndroid Build Coastguard Worker FINISH_PAGE = 12 126*2d543d20SAndroid Build Coastguard Worker 127*2d543d20SAndroid Build Coastguard Worker def __init__(self): 128*2d543d20SAndroid Build Coastguard Worker self.xml = xml 129*2d543d20SAndroid Build Coastguard Worker self.notebook = xml.get_object("notebook") 130*2d543d20SAndroid Build Coastguard Worker self.label_dict = {} 131*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict = {} 132*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_label") 133*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 134*2d543d20SAndroid Build Coastguard Worker 135*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_user_roles_label") 136*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 137*2d543d20SAndroid Build Coastguard Worker 138*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_dir_label") 139*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 140*2d543d20SAndroid Build Coastguard Worker 141*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_domain_admin_label") 142*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 143*2d543d20SAndroid Build Coastguard Worker 144*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_in_label") 145*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 146*2d543d20SAndroid Build Coastguard Worker 147*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_out_label") 148*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 149*2d543d20SAndroid Build Coastguard Worker 150*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_common_label") 151*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 152*2d543d20SAndroid Build Coastguard Worker 153*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_manages_label") 154*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 155*2d543d20SAndroid Build Coastguard Worker 156*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("select_booleans_label") 157*2d543d20SAndroid Build Coastguard Worker self.label_dict[label] = label.get_text() 158*2d543d20SAndroid Build Coastguard Worker 159*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("existing_user_treeview") 160*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 161*2d543d20SAndroid Build Coastguard Worker 162*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("transition_treeview") 163*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 164*2d543d20SAndroid Build Coastguard Worker 165*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("in_tcp_all_checkbutton") 166*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 167*2d543d20SAndroid Build Coastguard Worker 168*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("in_tcp_reserved_checkbutton") 169*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 170*2d543d20SAndroid Build Coastguard Worker 171*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("in_tcp_unreserved_checkbutton") 172*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 173*2d543d20SAndroid Build Coastguard Worker 174*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("in_tcp_entry") 175*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 176*2d543d20SAndroid Build Coastguard Worker 177*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("in_udp_all_checkbutton") 178*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 179*2d543d20SAndroid Build Coastguard Worker 180*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("in_udp_reserved_checkbutton") 181*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 182*2d543d20SAndroid Build Coastguard Worker 183*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("in_udp_unreserved_checkbutton") 184*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 185*2d543d20SAndroid Build Coastguard Worker 186*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("in_udp_entry") 187*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 188*2d543d20SAndroid Build Coastguard Worker 189*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("out_tcp_entry") 190*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 191*2d543d20SAndroid Build Coastguard Worker 192*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("out_udp_entry") 193*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 194*2d543d20SAndroid Build Coastguard Worker 195*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("out_tcp_all_checkbutton") 196*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 197*2d543d20SAndroid Build Coastguard Worker 198*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("out_udp_all_checkbutton") 199*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 200*2d543d20SAndroid Build Coastguard Worker 201*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("boolean_treeview") 202*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 203*2d543d20SAndroid Build Coastguard Worker 204*2d543d20SAndroid Build Coastguard Worker label = xml.get_object("write_treeview") 205*2d543d20SAndroid Build Coastguard Worker self.tooltip_dict[label] = label.get_tooltip_text() 206*2d543d20SAndroid Build Coastguard Worker 207*2d543d20SAndroid Build Coastguard Worker try: 208*2d543d20SAndroid Build Coastguard Worker self.all_types = sepolicy.generate.get_all_types() 209*2d543d20SAndroid Build Coastguard Worker self.all_modules = get_all_modules() 210*2d543d20SAndroid Build Coastguard Worker self.all_roles = sepolicy.generate.get_all_roles() 211*2d543d20SAndroid Build Coastguard Worker self.all_users = sepolicy.generate.get_all_users() 212*2d543d20SAndroid Build Coastguard Worker except RuntimeError as e: 213*2d543d20SAndroid Build Coastguard Worker self.all_types = [] 214*2d543d20SAndroid Build Coastguard Worker self.all_modules = [] 215*2d543d20SAndroid Build Coastguard Worker self.all_roles = [] 216*2d543d20SAndroid Build Coastguard Worker self.all_users = [] 217*2d543d20SAndroid Build Coastguard Worker self.error(str(e)) 218*2d543d20SAndroid Build Coastguard Worker 219*2d543d20SAndroid Build Coastguard Worker self.name = "" 220*2d543d20SAndroid Build Coastguard Worker handlers = { 221*2d543d20SAndroid Build Coastguard Worker "on_delete_clicked": self.delete, 222*2d543d20SAndroid Build Coastguard Worker "on_delete_boolean_clicked": self.delete_boolean, 223*2d543d20SAndroid Build Coastguard Worker "on_exec_select_clicked": self.exec_select, 224*2d543d20SAndroid Build Coastguard Worker "on_init_script_select_clicked": self.init_script_select, 225*2d543d20SAndroid Build Coastguard Worker "on_add_clicked": self.add, 226*2d543d20SAndroid Build Coastguard Worker "on_add_boolean_clicked": self.add_boolean, 227*2d543d20SAndroid Build Coastguard Worker "on_add_dir_clicked": self.add_dir, 228*2d543d20SAndroid Build Coastguard Worker "on_about_clicked": self.on_about_clicked 229*2d543d20SAndroid Build Coastguard Worker } 230*2d543d20SAndroid Build Coastguard Worker xml.connect_signals(handlers) 231*2d543d20SAndroid Build Coastguard Worker xml.get_object("cancel_button").connect("clicked", self.quit) 232*2d543d20SAndroid Build Coastguard Worker self.forward_button = xml.get_object("forward_button") 233*2d543d20SAndroid Build Coastguard Worker self.forward_button.connect("clicked", self.forward) 234*2d543d20SAndroid Build Coastguard Worker self.back_button = xml.get_object("back_button") 235*2d543d20SAndroid Build Coastguard Worker self.back_button.connect("clicked", self.back) 236*2d543d20SAndroid Build Coastguard Worker 237*2d543d20SAndroid Build Coastguard Worker self.boolean_dialog = xml.get_object("boolean_dialog") 238*2d543d20SAndroid Build Coastguard Worker self.boolean_name_entry = xml.get_object("boolean_name_entry") 239*2d543d20SAndroid Build Coastguard Worker self.boolean_description_entry = xml.get_object("boolean_description_entry") 240*2d543d20SAndroid Build Coastguard Worker 241*2d543d20SAndroid Build Coastguard Worker self.pages = {} 242*2d543d20SAndroid Build Coastguard Worker for i in sepolicy.generate.USERS: 243*2d543d20SAndroid Build Coastguard Worker self.pages[i] = [self.SELECT_TYPE_PAGE, self.APP_PAGE, self.TRANSITION_PAGE, self.ROLE_PAGE, self.IN_NET_PAGE, self.OUT_NET_PAGE, self.BOOLEAN_PAGE, self.SELECT_DIR_PAGE] 244*2d543d20SAndroid Build Coastguard Worker self.pages[sepolicy.generate.RUSER] = [self.SELECT_TYPE_PAGE, self.APP_PAGE, self.ADMIN_PAGE, self.USER_TRANSITION_PAGE, self.BOOLEAN_PAGE, self.SELECT_DIR_PAGE] 245*2d543d20SAndroid Build Coastguard Worker self.pages[sepolicy.generate.LUSER] = [self.SELECT_TYPE_PAGE, self.APP_PAGE, self.TRANSITION_PAGE, self.IN_NET_PAGE, self.OUT_NET_PAGE, self.BOOLEAN_PAGE, self.SELECT_DIR_PAGE] 246*2d543d20SAndroid Build Coastguard Worker self.pages[sepolicy.generate.SANDBOX] = [self.SELECT_TYPE_PAGE, self.APP_PAGE, self.IN_NET_PAGE, self.OUT_NET_PAGE, self.BOOLEAN_PAGE, self.SELECT_DIR_PAGE] 247*2d543d20SAndroid Build Coastguard Worker self.pages[sepolicy.generate.EUSER] = [self.SELECT_TYPE_PAGE, self.EXISTING_USER_PAGE, self.TRANSITION_PAGE, self.ROLE_PAGE, self.IN_NET_PAGE, self.OUT_NET_PAGE, self.BOOLEAN_PAGE, self.SELECT_DIR_PAGE] 248*2d543d20SAndroid Build Coastguard Worker 249*2d543d20SAndroid Build Coastguard Worker for i in sepolicy.generate.APPLICATIONS: 250*2d543d20SAndroid Build Coastguard Worker self.pages[i] = [self.SELECT_TYPE_PAGE, self.APP_PAGE, self.IN_NET_PAGE, self.OUT_NET_PAGE, self.COMMON_APPS_PAGE, self.FILES_PAGE, self.BOOLEAN_PAGE, self.SELECT_DIR_PAGE] 251*2d543d20SAndroid Build Coastguard Worker self.pages[sepolicy.generate.USER] = [self.SELECT_TYPE_PAGE, self.APP_PAGE, self.USER_TRANSITION_PAGE, self.IN_NET_PAGE, self.OUT_NET_PAGE, self.COMMON_APPS_PAGE, self.FILES_PAGE, self.BOOLEAN_PAGE, self.SELECT_DIR_PAGE] 252*2d543d20SAndroid Build Coastguard Worker 253*2d543d20SAndroid Build Coastguard Worker self.current_page = 0 254*2d543d20SAndroid Build Coastguard Worker self.back_button.set_sensitive(0) 255*2d543d20SAndroid Build Coastguard Worker 256*2d543d20SAndroid Build Coastguard Worker self.network_buttons = {} 257*2d543d20SAndroid Build Coastguard Worker 258*2d543d20SAndroid Build Coastguard Worker self.in_tcp_all_checkbutton = xml.get_object("in_tcp_all_checkbutton") 259*2d543d20SAndroid Build Coastguard Worker self.in_tcp_reserved_checkbutton = xml.get_object("in_tcp_reserved_checkbutton") 260*2d543d20SAndroid Build Coastguard Worker self.in_tcp_unreserved_checkbutton = xml.get_object("in_tcp_unreserved_checkbutton") 261*2d543d20SAndroid Build Coastguard Worker self.in_tcp_entry = self.xml.get_object("in_tcp_entry") 262*2d543d20SAndroid Build Coastguard Worker self.network_buttons[self.in_tcp_all_checkbutton] = [self.in_tcp_reserved_checkbutton, self.in_tcp_unreserved_checkbutton, self.in_tcp_entry] 263*2d543d20SAndroid Build Coastguard Worker 264*2d543d20SAndroid Build Coastguard Worker self.out_tcp_all_checkbutton = xml.get_object("out_tcp_all_checkbutton") 265*2d543d20SAndroid Build Coastguard Worker self.out_tcp_reserved_checkbutton = xml.get_object("out_tcp_reserved_checkbutton") 266*2d543d20SAndroid Build Coastguard Worker self.out_tcp_unreserved_checkbutton = xml.get_object("out_tcp_unreserved_checkbutton") 267*2d543d20SAndroid Build Coastguard Worker self.out_tcp_entry = self.xml.get_object("out_tcp_entry") 268*2d543d20SAndroid Build Coastguard Worker 269*2d543d20SAndroid Build Coastguard Worker self.network_buttons[self.out_tcp_all_checkbutton] = [self.out_tcp_entry] 270*2d543d20SAndroid Build Coastguard Worker 271*2d543d20SAndroid Build Coastguard Worker self.in_udp_all_checkbutton = xml.get_object("in_udp_all_checkbutton") 272*2d543d20SAndroid Build Coastguard Worker self.in_udp_reserved_checkbutton = xml.get_object("in_udp_reserved_checkbutton") 273*2d543d20SAndroid Build Coastguard Worker self.in_udp_unreserved_checkbutton = xml.get_object("in_udp_unreserved_checkbutton") 274*2d543d20SAndroid Build Coastguard Worker self.in_udp_entry = self.xml.get_object("in_udp_entry") 275*2d543d20SAndroid Build Coastguard Worker 276*2d543d20SAndroid Build Coastguard Worker self.network_buttons[self.in_udp_all_checkbutton] = [self.in_udp_reserved_checkbutton, self.in_udp_unreserved_checkbutton, self.in_udp_entry] 277*2d543d20SAndroid Build Coastguard Worker 278*2d543d20SAndroid Build Coastguard Worker self.out_udp_all_checkbutton = xml.get_object("out_udp_all_checkbutton") 279*2d543d20SAndroid Build Coastguard Worker self.out_udp_entry = self.xml.get_object("out_udp_entry") 280*2d543d20SAndroid Build Coastguard Worker self.network_buttons[self.out_udp_all_checkbutton] = [self.out_udp_entry] 281*2d543d20SAndroid Build Coastguard Worker 282*2d543d20SAndroid Build Coastguard Worker for b in self.network_buttons.keys(): 283*2d543d20SAndroid Build Coastguard Worker b.connect("clicked", self.network_all_clicked) 284*2d543d20SAndroid Build Coastguard Worker 285*2d543d20SAndroid Build Coastguard Worker self.boolean_treeview = self.xml.get_object("boolean_treeview") 286*2d543d20SAndroid Build Coastguard Worker self.boolean_store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING) 287*2d543d20SAndroid Build Coastguard Worker self.boolean_treeview.set_model(self.boolean_store) 288*2d543d20SAndroid Build Coastguard Worker self.boolean_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 289*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Name"), Gtk.CellRendererText(), text=0) 290*2d543d20SAndroid Build Coastguard Worker self.boolean_treeview.append_column(col) 291*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Description"), Gtk.CellRendererText(), text=1) 292*2d543d20SAndroid Build Coastguard Worker self.boolean_treeview.append_column(col) 293*2d543d20SAndroid Build Coastguard Worker 294*2d543d20SAndroid Build Coastguard Worker self.role_treeview = self.xml.get_object("role_treeview") 295*2d543d20SAndroid Build Coastguard Worker self.role_store = Gtk.ListStore(GObject.TYPE_STRING) 296*2d543d20SAndroid Build Coastguard Worker self.role_treeview.set_model(self.role_store) 297*2d543d20SAndroid Build Coastguard Worker self.role_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) 298*2d543d20SAndroid Build Coastguard Worker self.role_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 299*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Role"), Gtk.CellRendererText(), text=0) 300*2d543d20SAndroid Build Coastguard Worker self.role_treeview.append_column(col) 301*2d543d20SAndroid Build Coastguard Worker 302*2d543d20SAndroid Build Coastguard Worker self.existing_user_treeview = self.xml.get_object("existing_user_treeview") 303*2d543d20SAndroid Build Coastguard Worker self.existing_user_store = Gtk.ListStore(GObject.TYPE_STRING) 304*2d543d20SAndroid Build Coastguard Worker self.existing_user_treeview.set_model(self.existing_user_store) 305*2d543d20SAndroid Build Coastguard Worker self.existing_user_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 306*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Existing_User"), Gtk.CellRendererText(), text=0) 307*2d543d20SAndroid Build Coastguard Worker self.existing_user_treeview.append_column(col) 308*2d543d20SAndroid Build Coastguard Worker 309*2d543d20SAndroid Build Coastguard Worker for i in self.all_roles: 310*2d543d20SAndroid Build Coastguard Worker iter = self.role_store.append() 311*2d543d20SAndroid Build Coastguard Worker self.role_store.set_value(iter, 0, i[:-2]) 312*2d543d20SAndroid Build Coastguard Worker 313*2d543d20SAndroid Build Coastguard Worker self.in_tcp_reserved_checkbutton = xml.get_object("in_tcp_reserved_checkbutton") 314*2d543d20SAndroid Build Coastguard Worker 315*2d543d20SAndroid Build Coastguard Worker self.transition_treeview = self.xml.get_object("transition_treeview") 316*2d543d20SAndroid Build Coastguard Worker self.transition_store = Gtk.ListStore(GObject.TYPE_STRING) 317*2d543d20SAndroid Build Coastguard Worker self.transition_treeview.set_model(self.transition_store) 318*2d543d20SAndroid Build Coastguard Worker self.transition_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) 319*2d543d20SAndroid Build Coastguard Worker self.transition_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 320*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Application"), Gtk.CellRendererText(), text=0) 321*2d543d20SAndroid Build Coastguard Worker self.transition_treeview.append_column(col) 322*2d543d20SAndroid Build Coastguard Worker 323*2d543d20SAndroid Build Coastguard Worker self.user_transition_treeview = self.xml.get_object("user_transition_treeview") 324*2d543d20SAndroid Build Coastguard Worker self.user_transition_store = Gtk.ListStore(GObject.TYPE_STRING) 325*2d543d20SAndroid Build Coastguard Worker self.user_transition_treeview.set_model(self.user_transition_store) 326*2d543d20SAndroid Build Coastguard Worker self.user_transition_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) 327*2d543d20SAndroid Build Coastguard Worker self.user_transition_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 328*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Application"), Gtk.CellRendererText(), text=0) 329*2d543d20SAndroid Build Coastguard Worker self.user_transition_treeview.append_column(col) 330*2d543d20SAndroid Build Coastguard Worker 331*2d543d20SAndroid Build Coastguard Worker for i in self.all_users: 332*2d543d20SAndroid Build Coastguard Worker iter = self.user_transition_store.append() 333*2d543d20SAndroid Build Coastguard Worker self.user_transition_store.set_value(iter, 0, i[:-2]) 334*2d543d20SAndroid Build Coastguard Worker iter = self.existing_user_store.append() 335*2d543d20SAndroid Build Coastguard Worker self.existing_user_store.set_value(iter, 0, i[:-2]) 336*2d543d20SAndroid Build Coastguard Worker 337*2d543d20SAndroid Build Coastguard Worker self.admin_treeview = self.xml.get_object("admin_treeview") 338*2d543d20SAndroid Build Coastguard Worker self.admin_store = Gtk.ListStore(GObject.TYPE_STRING) 339*2d543d20SAndroid Build Coastguard Worker self.admin_treeview.set_model(self.admin_store) 340*2d543d20SAndroid Build Coastguard Worker self.admin_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) 341*2d543d20SAndroid Build Coastguard Worker self.admin_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 342*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Application"), Gtk.CellRendererText(), text=0) 343*2d543d20SAndroid Build Coastguard Worker self.admin_treeview.append_column(col) 344*2d543d20SAndroid Build Coastguard Worker 345*2d543d20SAndroid Build Coastguard Worker try: 346*2d543d20SAndroid Build Coastguard Worker for u in sepolicy.interface.get_user(): 347*2d543d20SAndroid Build Coastguard Worker iter = self.transition_store.append() 348*2d543d20SAndroid Build Coastguard Worker self.transition_store.set_value(iter, 0, u) 349*2d543d20SAndroid Build Coastguard Worker 350*2d543d20SAndroid Build Coastguard Worker for a in sepolicy.interface.get_admin(): 351*2d543d20SAndroid Build Coastguard Worker iter = self.admin_store.append() 352*2d543d20SAndroid Build Coastguard Worker self.admin_store.set_value(iter, 0, a) 353*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 354*2d543d20SAndroid Build Coastguard Worker self.error(e.message) 355*2d543d20SAndroid Build Coastguard Worker 356*2d543d20SAndroid Build Coastguard Worker def confine_application(self): 357*2d543d20SAndroid Build Coastguard Worker return self.get_type() in sepolicy.generate.APPLICATIONS 358*2d543d20SAndroid Build Coastguard Worker 359*2d543d20SAndroid Build Coastguard Worker def forward(self, arg): 360*2d543d20SAndroid Build Coastguard Worker type = self.get_type() 361*2d543d20SAndroid Build Coastguard Worker if self.current_page == self.START_PAGE: 362*2d543d20SAndroid Build Coastguard Worker self.back_button.set_sensitive(1) 363*2d543d20SAndroid Build Coastguard Worker 364*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.SELECT_TYPE_PAGE: 365*2d543d20SAndroid Build Coastguard Worker if self.on_select_type_page_next(): 366*2d543d20SAndroid Build Coastguard Worker return 367*2d543d20SAndroid Build Coastguard Worker 368*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.IN_NET_PAGE: 369*2d543d20SAndroid Build Coastguard Worker if self.on_in_net_page_next(): 370*2d543d20SAndroid Build Coastguard Worker return 371*2d543d20SAndroid Build Coastguard Worker 372*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.OUT_NET_PAGE: 373*2d543d20SAndroid Build Coastguard Worker if self.on_out_net_page_next(): 374*2d543d20SAndroid Build Coastguard Worker return 375*2d543d20SAndroid Build Coastguard Worker 376*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.APP_PAGE: 377*2d543d20SAndroid Build Coastguard Worker if self.on_name_page_next(): 378*2d543d20SAndroid Build Coastguard Worker return 379*2d543d20SAndroid Build Coastguard Worker 380*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.EXISTING_USER_PAGE: 381*2d543d20SAndroid Build Coastguard Worker if self.on_existing_user_page_next(): 382*2d543d20SAndroid Build Coastguard Worker return 383*2d543d20SAndroid Build Coastguard Worker 384*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.SELECT_DIR_PAGE: 385*2d543d20SAndroid Build Coastguard Worker outputdir = self.output_entry.get_text() 386*2d543d20SAndroid Build Coastguard Worker if not os.path.isdir(outputdir): 387*2d543d20SAndroid Build Coastguard Worker self.error(_("%s must be a directory") % outputdir) 388*2d543d20SAndroid Build Coastguard Worker return False 389*2d543d20SAndroid Build Coastguard Worker 390*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.FINISH_PAGE: 391*2d543d20SAndroid Build Coastguard Worker self.generate_policy() 392*2d543d20SAndroid Build Coastguard Worker self.xml.get_object("cancel_button").set_label(Gtk.STOCK_CLOSE) 393*2d543d20SAndroid Build Coastguard Worker else: 394*2d543d20SAndroid Build Coastguard Worker self.current_page = self.current_page + 1 395*2d543d20SAndroid Build Coastguard Worker self.notebook.set_current_page(self.pages[type][self.current_page]) 396*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.FINISH_PAGE: 397*2d543d20SAndroid Build Coastguard Worker self.forward_button.set_label(Gtk.STOCK_APPLY) 398*2d543d20SAndroid Build Coastguard Worker 399*2d543d20SAndroid Build Coastguard Worker def back(self, arg): 400*2d543d20SAndroid Build Coastguard Worker type = self.get_type() 401*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.FINISH_PAGE: 402*2d543d20SAndroid Build Coastguard Worker self.forward_button.set_label(Gtk.STOCK_GO_FORWARD) 403*2d543d20SAndroid Build Coastguard Worker 404*2d543d20SAndroid Build Coastguard Worker self.current_page = self.current_page - 1 405*2d543d20SAndroid Build Coastguard Worker self.notebook.set_current_page(self.pages[type][self.current_page]) 406*2d543d20SAndroid Build Coastguard Worker if self.pages[type][self.current_page] == self.START_PAGE: 407*2d543d20SAndroid Build Coastguard Worker self.back_button.set_sensitive(0) 408*2d543d20SAndroid Build Coastguard Worker 409*2d543d20SAndroid Build Coastguard Worker def network_all_clicked(self, button): 410*2d543d20SAndroid Build Coastguard Worker active = button.get_active() 411*2d543d20SAndroid Build Coastguard Worker for b in self.network_buttons[button]: 412*2d543d20SAndroid Build Coastguard Worker b.set_sensitive(not active) 413*2d543d20SAndroid Build Coastguard Worker 414*2d543d20SAndroid Build Coastguard Worker def verify(self, message, title=""): 415*2d543d20SAndroid Build Coastguard Worker dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO, 416*2d543d20SAndroid Build Coastguard Worker Gtk.ButtonsType.YES_NO, 417*2d543d20SAndroid Build Coastguard Worker message) 418*2d543d20SAndroid Build Coastguard Worker dlg.set_title(title) 419*2d543d20SAndroid Build Coastguard Worker dlg.set_position(Gtk.WindowPosition.MOUSE) 420*2d543d20SAndroid Build Coastguard Worker dlg.show_all() 421*2d543d20SAndroid Build Coastguard Worker rc = dlg.run() 422*2d543d20SAndroid Build Coastguard Worker dlg.destroy() 423*2d543d20SAndroid Build Coastguard Worker return rc 424*2d543d20SAndroid Build Coastguard Worker 425*2d543d20SAndroid Build Coastguard Worker def info(self, message): 426*2d543d20SAndroid Build Coastguard Worker dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO, 427*2d543d20SAndroid Build Coastguard Worker Gtk.ButtonsType.OK, 428*2d543d20SAndroid Build Coastguard Worker message) 429*2d543d20SAndroid Build Coastguard Worker dlg.set_position(Gtk.WindowPosition.MOUSE) 430*2d543d20SAndroid Build Coastguard Worker dlg.show_all() 431*2d543d20SAndroid Build Coastguard Worker dlg.run() 432*2d543d20SAndroid Build Coastguard Worker dlg.destroy() 433*2d543d20SAndroid Build Coastguard Worker 434*2d543d20SAndroid Build Coastguard Worker def error(self, message): 435*2d543d20SAndroid Build Coastguard Worker dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR, 436*2d543d20SAndroid Build Coastguard Worker Gtk.ButtonsType.CLOSE, 437*2d543d20SAndroid Build Coastguard Worker message) 438*2d543d20SAndroid Build Coastguard Worker dlg.set_position(Gtk.WindowPosition.MOUSE) 439*2d543d20SAndroid Build Coastguard Worker dlg.show_all() 440*2d543d20SAndroid Build Coastguard Worker dlg.run() 441*2d543d20SAndroid Build Coastguard Worker dlg.destroy() 442*2d543d20SAndroid Build Coastguard Worker 443*2d543d20SAndroid Build Coastguard Worker def get_name(self): 444*2d543d20SAndroid Build Coastguard Worker if self.existing_user_radiobutton.get_active(): 445*2d543d20SAndroid Build Coastguard Worker store, iter = self.existing_user_treeview.get_selection().get_selected() 446*2d543d20SAndroid Build Coastguard Worker if iter == None: 447*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("You must select a user")) 448*2d543d20SAndroid Build Coastguard Worker return store.get_value(iter, 0) 449*2d543d20SAndroid Build Coastguard Worker else: 450*2d543d20SAndroid Build Coastguard Worker return self.name_entry.get_text() 451*2d543d20SAndroid Build Coastguard Worker 452*2d543d20SAndroid Build Coastguard Worker def get_type(self): 453*2d543d20SAndroid Build Coastguard Worker if self.sandbox_radiobutton.get_active(): 454*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.SANDBOX 455*2d543d20SAndroid Build Coastguard Worker if self.cgi_radiobutton.get_active(): 456*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.CGI 457*2d543d20SAndroid Build Coastguard Worker if self.user_radiobutton.get_active(): 458*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.USER 459*2d543d20SAndroid Build Coastguard Worker if self.init_radiobutton.get_active(): 460*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.DAEMON 461*2d543d20SAndroid Build Coastguard Worker if self.dbus_radiobutton.get_active(): 462*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.DBUS 463*2d543d20SAndroid Build Coastguard Worker if self.inetd_radiobutton.get_active(): 464*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.INETD 465*2d543d20SAndroid Build Coastguard Worker if self.login_user_radiobutton.get_active(): 466*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.LUSER 467*2d543d20SAndroid Build Coastguard Worker if self.admin_user_radiobutton.get_active(): 468*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.AUSER 469*2d543d20SAndroid Build Coastguard Worker if self.xwindows_user_radiobutton.get_active(): 470*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.XUSER 471*2d543d20SAndroid Build Coastguard Worker if self.terminal_user_radiobutton.get_active(): 472*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.TUSER 473*2d543d20SAndroid Build Coastguard Worker if self.root_user_radiobutton.get_active(): 474*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.RUSER 475*2d543d20SAndroid Build Coastguard Worker if self.existing_user_radiobutton.get_active(): 476*2d543d20SAndroid Build Coastguard Worker return sepolicy.generate.EUSER 477*2d543d20SAndroid Build Coastguard Worker 478*2d543d20SAndroid Build Coastguard Worker def generate_policy(self, *args): 479*2d543d20SAndroid Build Coastguard Worker outputdir = self.output_entry.get_text() 480*2d543d20SAndroid Build Coastguard Worker try: 481*2d543d20SAndroid Build Coastguard Worker my_policy = sepolicy.generate.policy(self.get_name(), self.get_type()) 482*2d543d20SAndroid Build Coastguard Worker 483*2d543d20SAndroid Build Coastguard Worker iter = self.boolean_store.get_iter_first() 484*2d543d20SAndroid Build Coastguard Worker while iter: 485*2d543d20SAndroid Build Coastguard Worker my_policy.add_boolean(self.boolean_store.get_value(iter, 0), self.boolean_store.get_value(iter, 1)) 486*2d543d20SAndroid Build Coastguard Worker iter = self.boolean_store.iter_next(iter) 487*2d543d20SAndroid Build Coastguard Worker 488*2d543d20SAndroid Build Coastguard Worker if self.get_type() in sepolicy.generate.APPLICATIONS: 489*2d543d20SAndroid Build Coastguard Worker my_policy.set_program(self.exec_entry.get_text()) 490*2d543d20SAndroid Build Coastguard Worker my_policy.gen_symbols() 491*2d543d20SAndroid Build Coastguard Worker 492*2d543d20SAndroid Build Coastguard Worker my_policy.set_use_syslog(self.syslog_checkbutton.get_active() == 1) 493*2d543d20SAndroid Build Coastguard Worker my_policy.set_use_tmp(self.tmp_checkbutton.get_active() == 1) 494*2d543d20SAndroid Build Coastguard Worker my_policy.set_use_uid(self.uid_checkbutton.get_active() == 1) 495*2d543d20SAndroid Build Coastguard Worker my_policy.set_use_pam(self.pam_checkbutton.get_active() == 1) 496*2d543d20SAndroid Build Coastguard Worker 497*2d543d20SAndroid Build Coastguard Worker my_policy.set_use_dbus(self.dbus_checkbutton.get_active() == 1) 498*2d543d20SAndroid Build Coastguard Worker my_policy.set_use_audit(self.audit_checkbutton.get_active() == 1) 499*2d543d20SAndroid Build Coastguard Worker my_policy.set_use_terminal(self.terminal_checkbutton.get_active() == 1) 500*2d543d20SAndroid Build Coastguard Worker my_policy.set_use_mail(self.mail_checkbutton.get_active() == 1) 501*2d543d20SAndroid Build Coastguard Worker if self.get_type() is sepolicy.generate.DAEMON: 502*2d543d20SAndroid Build Coastguard Worker my_policy.set_init_script(self.init_script_entry.get_text()) 503*2d543d20SAndroid Build Coastguard Worker if self.get_type() == sepolicy.generate.USER: 504*2d543d20SAndroid Build Coastguard Worker selected = [] 505*2d543d20SAndroid Build Coastguard Worker self.user_transition_treeview.get_selection().selected_foreach(foreach, selected) 506*2d543d20SAndroid Build Coastguard Worker my_policy.set_transition_users(selected) 507*2d543d20SAndroid Build Coastguard Worker else: 508*2d543d20SAndroid Build Coastguard Worker if self.get_type() == sepolicy.generate.RUSER: 509*2d543d20SAndroid Build Coastguard Worker selected = [] 510*2d543d20SAndroid Build Coastguard Worker self.admin_treeview.get_selection().selected_foreach(foreach, selected) 511*2d543d20SAndroid Build Coastguard Worker my_policy.set_admin_domains(selected) 512*2d543d20SAndroid Build Coastguard Worker selected = [] 513*2d543d20SAndroid Build Coastguard Worker self.user_transition_treeview.get_selection().selected_foreach(foreach, selected) 514*2d543d20SAndroid Build Coastguard Worker my_policy.set_transition_users(selected) 515*2d543d20SAndroid Build Coastguard Worker else: 516*2d543d20SAndroid Build Coastguard Worker selected = [] 517*2d543d20SAndroid Build Coastguard Worker self.transition_treeview.get_selection().selected_foreach(foreach, selected) 518*2d543d20SAndroid Build Coastguard Worker my_policy.set_transition_domains(selected) 519*2d543d20SAndroid Build Coastguard Worker 520*2d543d20SAndroid Build Coastguard Worker selected = [] 521*2d543d20SAndroid Build Coastguard Worker self.role_treeview.get_selection().selected_foreach(foreach, selected) 522*2d543d20SAndroid Build Coastguard Worker my_policy.set_admin_roles(selected) 523*2d543d20SAndroid Build Coastguard Worker 524*2d543d20SAndroid Build Coastguard Worker my_policy.set_in_tcp(self.in_tcp_all_checkbutton.get_active(), self.in_tcp_reserved_checkbutton.get_active(), self.in_tcp_unreserved_checkbutton.get_active(), self.in_tcp_entry.get_text()) 525*2d543d20SAndroid Build Coastguard Worker my_policy.set_in_udp(self.in_udp_all_checkbutton.get_active(), self.in_udp_reserved_checkbutton.get_active(), self.in_udp_unreserved_checkbutton.get_active(), self.in_udp_entry.get_text()) 526*2d543d20SAndroid Build Coastguard Worker my_policy.set_out_tcp(self.out_tcp_all_checkbutton.get_active(), self.out_tcp_entry.get_text()) 527*2d543d20SAndroid Build Coastguard Worker my_policy.set_out_udp(self.out_udp_all_checkbutton.get_active(), self.out_udp_entry.get_text()) 528*2d543d20SAndroid Build Coastguard Worker 529*2d543d20SAndroid Build Coastguard Worker iter = self.store.get_iter_first() 530*2d543d20SAndroid Build Coastguard Worker while iter: 531*2d543d20SAndroid Build Coastguard Worker if self.store.get_value(iter, 1) == FILE: 532*2d543d20SAndroid Build Coastguard Worker my_policy.add_file(self.store.get_value(iter, 0)) 533*2d543d20SAndroid Build Coastguard Worker else: 534*2d543d20SAndroid Build Coastguard Worker my_policy.add_dir(self.store.get_value(iter, 0)) 535*2d543d20SAndroid Build Coastguard Worker iter = self.store.iter_next(iter) 536*2d543d20SAndroid Build Coastguard Worker 537*2d543d20SAndroid Build Coastguard Worker self.info(my_policy.generate(outputdir)) 538*2d543d20SAndroid Build Coastguard Worker return False 539*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 540*2d543d20SAndroid Build Coastguard Worker self.error(e.message) 541*2d543d20SAndroid Build Coastguard Worker 542*2d543d20SAndroid Build Coastguard Worker def delete(self, args): 543*2d543d20SAndroid Build Coastguard Worker store, iter = self.view.get_selection().get_selected() 544*2d543d20SAndroid Build Coastguard Worker if iter != None: 545*2d543d20SAndroid Build Coastguard Worker store.remove(iter) 546*2d543d20SAndroid Build Coastguard Worker self.view.get_selection().select_path((0,)) 547*2d543d20SAndroid Build Coastguard Worker 548*2d543d20SAndroid Build Coastguard Worker def delete_boolean(self, args): 549*2d543d20SAndroid Build Coastguard Worker store, iter = self.boolean_treeview.get_selection().get_selected() 550*2d543d20SAndroid Build Coastguard Worker if iter != None: 551*2d543d20SAndroid Build Coastguard Worker store.remove(iter) 552*2d543d20SAndroid Build Coastguard Worker self.boolean_treeview.get_selection().select_path((0,)) 553*2d543d20SAndroid Build Coastguard Worker 554*2d543d20SAndroid Build Coastguard Worker def add_boolean(self, type): 555*2d543d20SAndroid Build Coastguard Worker self.boolean_name_entry.set_text("") 556*2d543d20SAndroid Build Coastguard Worker self.boolean_description_entry.set_text("") 557*2d543d20SAndroid Build Coastguard Worker rc = self.boolean_dialog.run() 558*2d543d20SAndroid Build Coastguard Worker self.boolean_dialog.hide() 559*2d543d20SAndroid Build Coastguard Worker if rc == Gtk.ResponseType.CANCEL: 560*2d543d20SAndroid Build Coastguard Worker return 561*2d543d20SAndroid Build Coastguard Worker iter = self.boolean_store.append() 562*2d543d20SAndroid Build Coastguard Worker self.boolean_store.set_value(iter, 0, self.boolean_name_entry.get_text()) 563*2d543d20SAndroid Build Coastguard Worker self.boolean_store.set_value(iter, 1, self.boolean_description_entry.get_text()) 564*2d543d20SAndroid Build Coastguard Worker 565*2d543d20SAndroid Build Coastguard Worker def __add(self, type): 566*2d543d20SAndroid Build Coastguard Worker rc = self.file_dialog.run() 567*2d543d20SAndroid Build Coastguard Worker self.file_dialog.hide() 568*2d543d20SAndroid Build Coastguard Worker if rc == Gtk.ResponseType.CANCEL: 569*2d543d20SAndroid Build Coastguard Worker return 570*2d543d20SAndroid Build Coastguard Worker for i in self.file_dialog.get_filenames(): 571*2d543d20SAndroid Build Coastguard Worker iter = self.store.append() 572*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 0, i) 573*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 1, type) 574*2d543d20SAndroid Build Coastguard Worker 575*2d543d20SAndroid Build Coastguard Worker def exec_select(self, args): 576*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_select_multiple(0) 577*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_title(_("Select executable file to be confined.")) 578*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_action(Gtk.FileChooserAction.OPEN) 579*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_current_folder("/usr/sbin") 580*2d543d20SAndroid Build Coastguard Worker rc = self.file_dialog.run() 581*2d543d20SAndroid Build Coastguard Worker self.file_dialog.hide() 582*2d543d20SAndroid Build Coastguard Worker if rc == Gtk.ResponseType.CANCEL: 583*2d543d20SAndroid Build Coastguard Worker return 584*2d543d20SAndroid Build Coastguard Worker self.exec_entry.set_text(self.file_dialog.get_filename()) 585*2d543d20SAndroid Build Coastguard Worker 586*2d543d20SAndroid Build Coastguard Worker def init_script_select(self, args): 587*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_select_multiple(0) 588*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_title(_("Select init script file to be confined.")) 589*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_action(Gtk.FileChooserAction.OPEN) 590*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_current_folder("/etc/rc.d/init.d") 591*2d543d20SAndroid Build Coastguard Worker rc = self.file_dialog.run() 592*2d543d20SAndroid Build Coastguard Worker self.file_dialog.hide() 593*2d543d20SAndroid Build Coastguard Worker if rc == Gtk.ResponseType.CANCEL: 594*2d543d20SAndroid Build Coastguard Worker return 595*2d543d20SAndroid Build Coastguard Worker self.init_script_entry.set_text(self.file_dialog.get_filename()) 596*2d543d20SAndroid Build Coastguard Worker 597*2d543d20SAndroid Build Coastguard Worker def add(self, args): 598*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_title(_("Select file(s) that confined application creates or writes")) 599*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_current_folder("/") 600*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_action(Gtk.FileChooserAction.OPEN) 601*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_select_multiple(1) 602*2d543d20SAndroid Build Coastguard Worker self.__add(FILE) 603*2d543d20SAndroid Build Coastguard Worker 604*2d543d20SAndroid Build Coastguard Worker def add_dir(self, args): 605*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_title(_("Select directory(s) that the confined application owns and writes into")) 606*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_current_folder("/") 607*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_select_multiple(1) 608*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_action(Gtk.FileChooserAction.SELECT_FOLDER) 609*2d543d20SAndroid Build Coastguard Worker self.__add(DIR) 610*2d543d20SAndroid Build Coastguard Worker 611*2d543d20SAndroid Build Coastguard Worker def on_about_clicked(self, args): 612*2d543d20SAndroid Build Coastguard Worker dlg = xml.get_object("about_dialog") 613*2d543d20SAndroid Build Coastguard Worker dlg.run() 614*2d543d20SAndroid Build Coastguard Worker dlg.hide() 615*2d543d20SAndroid Build Coastguard Worker 616*2d543d20SAndroid Build Coastguard Worker def quit(self, args): 617*2d543d20SAndroid Build Coastguard Worker Gtk.main_quit() 618*2d543d20SAndroid Build Coastguard Worker 619*2d543d20SAndroid Build Coastguard Worker def setupScreen(self): 620*2d543d20SAndroid Build Coastguard Worker # Bring in widgets from glade file. 621*2d543d20SAndroid Build Coastguard Worker self.mainWindow = self.xml.get_object("main_window") 622*2d543d20SAndroid Build Coastguard Worker self.druid = self.xml.get_object("druid") 623*2d543d20SAndroid Build Coastguard Worker self.type = 0 624*2d543d20SAndroid Build Coastguard Worker self.name_entry = self.xml.get_object("name_entry") 625*2d543d20SAndroid Build Coastguard Worker self.name_entry.connect("insert_text", self.on_name_entry_changed) 626*2d543d20SAndroid Build Coastguard Worker self.name_entry.connect("focus_out_event", self.on_focus_out_event) 627*2d543d20SAndroid Build Coastguard Worker self.exec_entry = self.xml.get_object("exec_entry") 628*2d543d20SAndroid Build Coastguard Worker self.exec_button = self.xml.get_object("exec_button") 629*2d543d20SAndroid Build Coastguard Worker self.init_script_entry = self.xml.get_object("init_script_entry") 630*2d543d20SAndroid Build Coastguard Worker self.init_script_button = self.xml.get_object("init_script_button") 631*2d543d20SAndroid Build Coastguard Worker self.output_entry = self.xml.get_object("output_entry") 632*2d543d20SAndroid Build Coastguard Worker self.output_entry.set_text(os.getcwd()) 633*2d543d20SAndroid Build Coastguard Worker self.xml.get_object("output_button").connect("clicked", self.output_button_clicked) 634*2d543d20SAndroid Build Coastguard Worker 635*2d543d20SAndroid Build Coastguard Worker self.xwindows_user_radiobutton = self.xml.get_object("xwindows_user_radiobutton") 636*2d543d20SAndroid Build Coastguard Worker self.terminal_user_radiobutton = self.xml.get_object("terminal_user_radiobutton") 637*2d543d20SAndroid Build Coastguard Worker self.root_user_radiobutton = self.xml.get_object("root_user_radiobutton") 638*2d543d20SAndroid Build Coastguard Worker self.login_user_radiobutton = self.xml.get_object("login_user_radiobutton") 639*2d543d20SAndroid Build Coastguard Worker self.admin_user_radiobutton = self.xml.get_object("admin_user_radiobutton") 640*2d543d20SAndroid Build Coastguard Worker self.existing_user_radiobutton = self.xml.get_object("existing_user_radiobutton") 641*2d543d20SAndroid Build Coastguard Worker 642*2d543d20SAndroid Build Coastguard Worker self.user_radiobutton = self.xml.get_object("user_radiobutton") 643*2d543d20SAndroid Build Coastguard Worker self.init_radiobutton = self.xml.get_object("init_radiobutton") 644*2d543d20SAndroid Build Coastguard Worker self.inetd_radiobutton = self.xml.get_object("inetd_radiobutton") 645*2d543d20SAndroid Build Coastguard Worker self.dbus_radiobutton = self.xml.get_object("dbus_radiobutton") 646*2d543d20SAndroid Build Coastguard Worker self.cgi_radiobutton = self.xml.get_object("cgi_radiobutton") 647*2d543d20SAndroid Build Coastguard Worker self.sandbox_radiobutton = self.xml.get_object("sandbox_radiobutton") 648*2d543d20SAndroid Build Coastguard Worker self.tmp_checkbutton = self.xml.get_object("tmp_checkbutton") 649*2d543d20SAndroid Build Coastguard Worker self.uid_checkbutton = self.xml.get_object("uid_checkbutton") 650*2d543d20SAndroid Build Coastguard Worker self.pam_checkbutton = self.xml.get_object("pam_checkbutton") 651*2d543d20SAndroid Build Coastguard Worker self.dbus_checkbutton = self.xml.get_object("dbus_checkbutton") 652*2d543d20SAndroid Build Coastguard Worker self.audit_checkbutton = self.xml.get_object("audit_checkbutton") 653*2d543d20SAndroid Build Coastguard Worker self.terminal_checkbutton = self.xml.get_object("terminal_checkbutton") 654*2d543d20SAndroid Build Coastguard Worker self.mail_checkbutton = self.xml.get_object("mail_checkbutton") 655*2d543d20SAndroid Build Coastguard Worker self.syslog_checkbutton = self.xml.get_object("syslog_checkbutton") 656*2d543d20SAndroid Build Coastguard Worker self.view = self.xml.get_object("write_treeview") 657*2d543d20SAndroid Build Coastguard Worker self.file_dialog = self.xml.get_object("filechooserdialog") 658*2d543d20SAndroid Build Coastguard Worker 659*2d543d20SAndroid Build Coastguard Worker self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_INT) 660*2d543d20SAndroid Build Coastguard Worker self.view.set_model(self.store) 661*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn("", Gtk.CellRendererText(), text=0) 662*2d543d20SAndroid Build Coastguard Worker col.set_resizable(True) 663*2d543d20SAndroid Build Coastguard Worker self.view.append_column(col) 664*2d543d20SAndroid Build Coastguard Worker self.view.get_selection().select_path((0,)) 665*2d543d20SAndroid Build Coastguard Worker 666*2d543d20SAndroid Build Coastguard Worker def output_button_clicked(self, *args): 667*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_title(_("Select directory to generate policy files in")) 668*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_action(Gtk.FileChooserAction.SELECT_FOLDER) 669*2d543d20SAndroid Build Coastguard Worker self.file_dialog.set_select_multiple(0) 670*2d543d20SAndroid Build Coastguard Worker rc = self.file_dialog.run() 671*2d543d20SAndroid Build Coastguard Worker self.file_dialog.hide() 672*2d543d20SAndroid Build Coastguard Worker if rc == Gtk.ResponseType.CANCEL: 673*2d543d20SAndroid Build Coastguard Worker return 674*2d543d20SAndroid Build Coastguard Worker self.output_entry.set_text(self.file_dialog.get_filename()) 675*2d543d20SAndroid Build Coastguard Worker 676*2d543d20SAndroid Build Coastguard Worker def on_name_entry_changed(self, entry, text, size, position): 677*2d543d20SAndroid Build Coastguard Worker if text.find(" ") >= 0: 678*2d543d20SAndroid Build Coastguard Worker entry.stop_emission_by_name("insert-text") 679*2d543d20SAndroid Build Coastguard Worker 680*2d543d20SAndroid Build Coastguard Worker def on_focus_out_event(self, entry, third): 681*2d543d20SAndroid Build Coastguard Worker name = entry.get_text() 682*2d543d20SAndroid Build Coastguard Worker if self.name != name: 683*2d543d20SAndroid Build Coastguard Worker if name in self.all_types: 684*2d543d20SAndroid Build Coastguard Worker if self.verify(_("Type %s_t already defined in current policy.\nDo you want to continue?") % name, _("Verify Name")) == Gtk.ResponseType.NO: 685*2d543d20SAndroid Build Coastguard Worker entry.set_text("") 686*2d543d20SAndroid Build Coastguard Worker return False 687*2d543d20SAndroid Build Coastguard Worker if name in self.all_modules: 688*2d543d20SAndroid Build Coastguard Worker if self.verify(_("Module %s already loaded in current policy.\nDo you want to continue?") % name, _("Verify Name")) == Gtk.ResponseType.NO: 689*2d543d20SAndroid Build Coastguard Worker entry.set_text("") 690*2d543d20SAndroid Build Coastguard Worker return False 691*2d543d20SAndroid Build Coastguard Worker 692*2d543d20SAndroid Build Coastguard Worker file = "/etc/rc.d/init.d/" + name 693*2d543d20SAndroid Build Coastguard Worker if os.path.isfile(file) and self.init_script_entry.get_text() == "": 694*2d543d20SAndroid Build Coastguard Worker self.init_script_entry.set_text(file) 695*2d543d20SAndroid Build Coastguard Worker 696*2d543d20SAndroid Build Coastguard Worker file = "/usr/sbin/" + name 697*2d543d20SAndroid Build Coastguard Worker if os.path.isfile(file) and self.exec_entry.get_text() == "": 698*2d543d20SAndroid Build Coastguard Worker self.exec_entry.set_text(file) 699*2d543d20SAndroid Build Coastguard Worker 700*2d543d20SAndroid Build Coastguard Worker self.name = name 701*2d543d20SAndroid Build Coastguard Worker return False 702*2d543d20SAndroid Build Coastguard Worker 703*2d543d20SAndroid Build Coastguard Worker def on_in_net_page_next(self, *args): 704*2d543d20SAndroid Build Coastguard Worker try: 705*2d543d20SAndroid Build Coastguard Worker sepolicy.generate.verify_ports(self.in_tcp_entry.get_text()) 706*2d543d20SAndroid Build Coastguard Worker sepolicy.generate.verify_ports(self.in_udp_entry.get_text()) 707*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 708*2d543d20SAndroid Build Coastguard Worker self.error(e.message) 709*2d543d20SAndroid Build Coastguard Worker return True 710*2d543d20SAndroid Build Coastguard Worker 711*2d543d20SAndroid Build Coastguard Worker def on_out_net_page_next(self, *args): 712*2d543d20SAndroid Build Coastguard Worker try: 713*2d543d20SAndroid Build Coastguard Worker sepolicy.generate.verify_ports(self.out_tcp_entry.get_text()) 714*2d543d20SAndroid Build Coastguard Worker sepolicy.generate.verify_ports(self.out_udp_entry.get_text()) 715*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 716*2d543d20SAndroid Build Coastguard Worker self.error(e.message) 717*2d543d20SAndroid Build Coastguard Worker return True 718*2d543d20SAndroid Build Coastguard Worker 719*2d543d20SAndroid Build Coastguard Worker def on_select_type_page_next(self, *args): 720*2d543d20SAndroid Build Coastguard Worker self.exec_entry.set_sensitive(self.confine_application()) 721*2d543d20SAndroid Build Coastguard Worker self.exec_button.set_sensitive(self.confine_application()) 722*2d543d20SAndroid Build Coastguard Worker self.init_script_entry.set_sensitive(self.init_radiobutton.get_active()) 723*2d543d20SAndroid Build Coastguard Worker self.init_script_button.set_sensitive(self.init_radiobutton.get_active()) 724*2d543d20SAndroid Build Coastguard Worker 725*2d543d20SAndroid Build Coastguard Worker def on_existing_user_page_next(self, *args): 726*2d543d20SAndroid Build Coastguard Worker store, iter = self.view.get_selection().get_selected() 727*2d543d20SAndroid Build Coastguard Worker if iter != None: 728*2d543d20SAndroid Build Coastguard Worker self.error(_("You must select a user")) 729*2d543d20SAndroid Build Coastguard Worker return True 730*2d543d20SAndroid Build Coastguard Worker 731*2d543d20SAndroid Build Coastguard Worker def on_name_page_next(self, *args): 732*2d543d20SAndroid Build Coastguard Worker name = self.name_entry.get_text() 733*2d543d20SAndroid Build Coastguard Worker if not name.isalnum(): 734*2d543d20SAndroid Build Coastguard Worker self.error(_("You must add a name made up of letters and numbers and containing no spaces.")) 735*2d543d20SAndroid Build Coastguard Worker return True 736*2d543d20SAndroid Build Coastguard Worker 737*2d543d20SAndroid Build Coastguard Worker for i in self.label_dict: 738*2d543d20SAndroid Build Coastguard Worker text = '<b>%s</b>' % (self.label_dict[i] % ("'" + name + "'")) 739*2d543d20SAndroid Build Coastguard Worker i.set_markup(text) 740*2d543d20SAndroid Build Coastguard Worker 741*2d543d20SAndroid Build Coastguard Worker for i in self.tooltip_dict: 742*2d543d20SAndroid Build Coastguard Worker text = self.tooltip_dict[i] % ("'" + name + "'") 743*2d543d20SAndroid Build Coastguard Worker i.set_tooltip_text(text) 744*2d543d20SAndroid Build Coastguard Worker 745*2d543d20SAndroid Build Coastguard Worker if self.confine_application(): 746*2d543d20SAndroid Build Coastguard Worker exe = self.exec_entry.get_text() 747*2d543d20SAndroid Build Coastguard Worker if exe == "": 748*2d543d20SAndroid Build Coastguard Worker self.error(_("You must enter a executable")) 749*2d543d20SAndroid Build Coastguard Worker return True 750*2d543d20SAndroid Build Coastguard Worker policy = sepolicy.generate.policy(name, self.get_type()) 751*2d543d20SAndroid Build Coastguard Worker policy.set_program(exe) 752*2d543d20SAndroid Build Coastguard Worker policy.gen_writeable() 753*2d543d20SAndroid Build Coastguard Worker policy.gen_symbols() 754*2d543d20SAndroid Build Coastguard Worker for f in policy.files.keys(): 755*2d543d20SAndroid Build Coastguard Worker iter = self.store.append() 756*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 0, f) 757*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 1, FILE) 758*2d543d20SAndroid Build Coastguard Worker 759*2d543d20SAndroid Build Coastguard Worker for f in policy.dirs.keys(): 760*2d543d20SAndroid Build Coastguard Worker iter = self.store.append() 761*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 0, f) 762*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 1, DIR) 763*2d543d20SAndroid Build Coastguard Worker self.tmp_checkbutton.set_active(policy.use_tmp) 764*2d543d20SAndroid Build Coastguard Worker self.uid_checkbutton.set_active(policy.use_uid) 765*2d543d20SAndroid Build Coastguard Worker self.pam_checkbutton.set_active(policy.use_pam) 766*2d543d20SAndroid Build Coastguard Worker self.dbus_checkbutton.set_active(policy.use_dbus) 767*2d543d20SAndroid Build Coastguard Worker self.audit_checkbutton.set_active(policy.use_audit) 768*2d543d20SAndroid Build Coastguard Worker self.terminal_checkbutton.set_active(policy.use_terminal) 769*2d543d20SAndroid Build Coastguard Worker self.mail_checkbutton.set_active(policy.use_mail) 770*2d543d20SAndroid Build Coastguard Worker self.syslog_checkbutton.set_active(policy.use_syslog) 771*2d543d20SAndroid Build Coastguard Worker 772*2d543d20SAndroid Build Coastguard Worker def stand_alone(self): 773*2d543d20SAndroid Build Coastguard Worker desktopName = _("Configure SELinux") 774*2d543d20SAndroid Build Coastguard Worker 775*2d543d20SAndroid Build Coastguard Worker self.setupScreen() 776*2d543d20SAndroid Build Coastguard Worker self.mainWindow.connect("destroy", self.quit) 777*2d543d20SAndroid Build Coastguard Worker 778*2d543d20SAndroid Build Coastguard Worker self.mainWindow.show_all() 779*2d543d20SAndroid Build Coastguard Worker Gtk.main() 780*2d543d20SAndroid Build Coastguard Worker 781*2d543d20SAndroid Build Coastguard Workerif __name__ == "__main__": 782*2d543d20SAndroid Build Coastguard Worker signal.signal(signal.SIGINT, signal.SIG_DFL) 783*2d543d20SAndroid Build Coastguard Worker 784*2d543d20SAndroid Build Coastguard Worker app = childWindow() 785*2d543d20SAndroid Build Coastguard Worker app.stand_alone() 786