summaryrefslogtreecommitdiffstats
path: root/apol/fscontexts_tab.tcl
diff options
context:
space:
mode:
authorMiroslav Grepl <mgrepl@redhat.com>2014-04-11 09:37:53 +0200
committerMiroslav Grepl <mgrepl@redhat.com>2014-04-11 09:37:53 +0200
commit47be9ff57e72906660bb62a515222f482131e1fb (patch)
tree2cb0ef0ba48d73b1df7cc0915754a17e19464bb6 /apol/fscontexts_tab.tcl
downloadsetools-47be9ff57e72906660bb62a515222f482131e1fb.tar.gz
setools-47be9ff57e72906660bb62a515222f482131e1fb.tar.xz
setools-47be9ff57e72906660bb62a515222f482131e1fb.zip
Create setools-3.3.7 git repomaster
Diffstat (limited to 'apol/fscontexts_tab.tcl')
-rw-r--r--apol/fscontexts_tab.tcl472
1 files changed, 472 insertions, 0 deletions
diff --git a/apol/fscontexts_tab.tcl b/apol/fscontexts_tab.tcl
new file mode 100644
index 0000000..47522c2
--- /dev/null
+++ b/apol/fscontexts_tab.tcl
@@ -0,0 +1,472 @@
+# Copyright (C) 2001-2007 Tresys Technology, LLC
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace eval Apol_FSContexts {
+ variable widgets
+ variable vals
+}
+
+proc Apol_FSContexts::create {tab_name nb} {
+ variable widgets
+ variable vals
+
+ _initializeVars
+
+ # Layout frames
+ set frame [$nb insert end $tab_name -text "FS Contexts"]
+ set pw [PanedWindow $frame.pw -side top -weights extra]
+ set leftf [$pw add -weight 0]
+ set rightf [$pw add -weight 1]
+ pack $pw -fill both -expand yes
+
+ # build the left column, where one selects a particular type of
+ # context; below it will be a scrolled listbox of keys for that
+ # context
+ set context_box [TitleFrame $leftf.context_f -text "Context Type"]
+ set context_f [$context_box getframe]
+ radiobutton $context_f.genfscon -text "genfscon" -value genfscon \
+ -variable Apol_FSContexts::vals(context_type)
+ radiobutton $context_f.fsuse -text "fs_use" -value fsuse \
+ -variable Apol_FSContexts::vals(context_type)
+ trace add variable Apol_FSContexts::vals(context_type) write \
+ {Apol_FSContexts::_contextTypeChanged}
+ pack $context_f.genfscon $context_f.fsuse \
+ -anchor w -expand 0 -padx 4 -pady 5
+ pack $context_box -expand 0 -fill x
+
+ set widgets(items_tf) [TitleFrame $leftf.items_f -text "GenFS Contexts"]
+ set widgets(items) [Apol_Widget::makeScrolledListbox [$widgets(items_tf) getframe].items \
+ -height 20 -width 20 -listvar Apol_FSContexts::vals(items)]
+ Apol_Widget::setListboxCallbacks $widgets(items) \
+ {{"Show Context Info" {Apol_FSContexts::_popupContextInfo}}}
+ pack $widgets(items) -expand 1 -fill both
+ pack $widgets(items_tf) -expand 1 -fill both
+
+ # build the search options
+ set optsbox [TitleFrame $rightf.optsbox -text "Search Options"]
+ pack $optsbox -side top -expand 0 -fill both -padx 2
+ set widgets(options_pm) [PagesManager [$optsbox getframe].pm]
+
+ _genfscon_create [$widgets(options_pm) add genfscon]
+ _fsuse_create [$widgets(options_pm) add fsuse]
+
+ $widgets(options_pm) compute_size
+ pack $widgets(options_pm) -expand 1 -fill both -side left
+ $widgets(options_pm) raise genfscon
+
+ set ok [button [$optsbox getframe].ok -text "OK" -width 6 \
+ -command Apol_FSContexts::_runSearch]
+ pack $ok -side right -pady 5 -padx 5 -anchor ne
+
+ # build the results box
+ set resultsbox [TitleFrame $rightf.resultsbox -text "Search Results"]
+ pack $resultsbox -expand yes -fill both -padx 2
+ set widgets(results) [Apol_Widget::makeSearchResults [$resultsbox getframe].results]
+ pack $widgets(results) -side top -expand yes -fill both
+
+ return $frame
+}
+
+proc Apol_FSContexts::open {ppath} {
+ variable vals
+
+ _genfscon_open
+ _fsuse_open
+
+ # force a flip to the genfscon page, via a trace on this variable
+ set vals(context_type) genfscon
+}
+
+proc Apol_FSContexts::close {} {
+ variable widgets
+
+ _initializeVars
+ Apol_Widget::clearSearchResults $widgets(results)
+ Apol_Widget::clearContextSelector $widgets(genfscon:context)
+ Apol_Widget::clearContextSelector $widgets(fsuse:context)
+ $widgets(genfscon:fs) configure -values {}
+ $widgets(fsuse:type) configure -values {}
+ $widgets(fsuse:fs) configure -values {}
+}
+
+proc Apol_FSContexts::getTextWidget {} {
+ variable widgets
+ return $widgets(results).tb
+}
+
+#### private functions below ####
+
+proc Apol_FSContexts::_initializeVars {} {
+ variable vals
+ array set vals {
+ genfscon:items {}
+ genfscon:fs_enable 0 genfscon:fs {}
+ genfscon:path_enable 0 genfscon:path {}
+
+ fsuse:items {}
+ fsuse:type_enable 0 fsuse:type {}
+ fsuse:fs_enable 0 fsuse:fs {}
+
+ items {}
+ context_type genfscon
+ }
+}
+
+proc Apol_FSContexts::_contextTypeChanged {name1 name2 op} {
+ variable vals
+ variable widgets
+ Apol_Widget::clearSearchResults $widgets(results)
+ if {$vals(context_type) == "genfscon"} {
+ _genfscon_show
+ } else {
+ _fsuse_show
+ }
+}
+
+proc Apol_FSContexts::_popupContextInfo {value} {
+ variable vals
+ if {$vals(context_type) == "genfscon"} {
+ _genfscon_popup $value
+ } else {
+ _fsuse_popup $value
+ }
+}
+
+proc Apol_FSContexts::_toggleCheckbutton {path name1 name2 op} {
+ variable vals
+ variable widgets
+ if {$vals($name2)} {
+ $path configure -state normal
+ } else {
+ $path configure -state disabled
+ }
+}
+
+proc Apol_FSContexts::_runSearch {} {
+ variable vals
+ variable widgets
+
+ Apol_Widget::clearSearchResults $widgets(results)
+ if {![ApolTop::is_policy_open]} {
+ tk_messageBox -icon error -type ok -title "Error" -message "No current policy file is opened."
+ return
+ }
+ if {$vals(context_type) == "genfscon"} {
+ _genfscon_runSearch
+ } else {
+ _fsuse_runSearch
+ }
+}
+
+#### genfscon private functions below ####
+
+proc Apol_FSContexts::_genfscon_create {p_f} {
+ variable widgets
+ variable vals
+
+ set fs [frame $p_f.fs]
+ set fs_cb [checkbutton $fs.fs_enable -text "Filesystem" \
+ -variable Apol_FSContexts::vals(genfscon:fs_enable)]
+ set widgets(genfscon:fs) [ComboBox $fs.fs -entrybg white -width 12 -state disabled \
+ -textvariable Apol_FSContexts::vals(genfscon:fs) -autopost 1]
+ trace add variable Apol_FSContexts::vals(genfscon:fs_enable) write \
+ [list Apol_FSContexts::_toggleCheckbutton $widgets(genfscon:fs)]
+ pack $fs_cb -side top -anchor w
+ pack $widgets(genfscon:fs) -side top -expand 0 -fill x -padx 4
+
+ set p [frame $p_f.p]
+ set p_cb [checkbutton $p.p_enable -text "Path" \
+ -variable Apol_FSContexts::vals(genfscon:path_enable)]
+ set widgets(genfscon:path) [entry $p.path -bg white -width 24 \
+ -state disabled \
+ -textvariable Apol_FSContexts::vals(genfscon:path)]
+ trace add variable Apol_FSContexts::vals(genfscon:path_enable) write \
+ [list Apol_FSContexts::_toggleCheckbutton $widgets(genfscon:path)]
+ pack $p_cb -side top -anchor w
+ pack $widgets(genfscon:path) -side top -expand 0 -fill x -padx 4
+
+ frame $p_f.c
+ set widgets(genfscon:context) [Apol_Widget::makeContextSelector $p_f.c.context "Contexts"]
+ pack $widgets(genfscon:context)
+
+ pack $fs $p $p_f.c -side left -anchor n -padx 4 -pady 2
+}
+
+proc Apol_FSContexts::_genfscon_open {} {
+ variable vals
+
+ set q [new_apol_genfscon_query_t]
+ set v [$q run $::ApolTop::policy]
+ $q -acquire
+ $q -delete
+ set genfscons [genfscon_vector_to_list $v]
+ set vals(genfscon:items) {}
+ foreach g $genfscons {
+ lappend vals(genfscon:items) [$g get_name $::ApolTop::qpolicy]
+ }
+ set vals(genfscon:items) [lsort -unique $vals(genfscon:items)]
+
+ # because qpol_policy_get_genfscon_iter() returns allocated items,
+ # destroying the vector before using its items will segfault
+ $v -acquire
+ $v -delete
+
+ variable widgets
+ $widgets(genfscon:fs) configure -values $vals(genfscon:items)
+}
+
+proc Apol_FSContexts::_genfscon_show {} {
+ variable vals
+ variable widgets
+ $widgets(items_tf) configure -text "GenFS Contexts"
+ $widgets(options_pm) raise genfscon
+ set vals(items) $vals(genfscon:items)
+}
+
+proc Apol_FSContexts::_genfscon_popup {fstype} {
+ set q [new_apol_genfscon_query_t]
+ $q set_filesystem $::ApolTop::policy $fstype
+ set v [$q run $::ApolTop::policy]
+ $q -acquire
+ $q -delete
+ set genfscons [genfscon_vector_to_list $v]
+ set text "genfs filesystem $fstype ([llength $genfscons] context"
+ if {[llength $genfscons] != 1} {
+ append text s
+ }
+ append text ")"
+ foreach g [lsort -command _genfscon_sort $genfscons] {
+ append text "\n [_genfscon_render $g]"
+ }
+ Apol_Widget::showPopupText "filesystem $fstype" $text
+
+ # because qpol_policy_get_genfscon_iter() returns allocated items,
+ # destroying the vector before using its items will segfault
+ $v -acquire
+ $v -delete
+}
+
+proc Apol_FSContexts::_genfscon_runSearch {} {
+ variable vals
+ variable widgets
+
+ if {$vals(genfscon:fs_enable)} {
+ if {$vals(genfscon:fs) == {}} {
+ tk_messageBox -icon error -type ok -title "Error" -message "No filesystem selected."
+ return
+ }
+ set fstype $vals(genfscon:fs_enable)
+ } else {
+ set fstype {}
+ }
+ if {$vals(genfscon:path_enable)} {
+ if {$vals(genfscon:path) == {}} {
+ tk_messageBox -icon error -type ok -title "Error" -message "No path given."
+ return
+ }
+ set path $vals(genfscon:path)
+ } else {
+ set path {}
+ }
+
+ set q [new_apol_genfscon_query_t]
+ if {[Apol_Widget::getContextSelectorState $widgets(genfscon:context)]} {
+ foreach {context range_match attribute} [Apol_Widget::getContextSelectorValue $widgets(genfscon:context)] {break}
+ $q set_context $::ApolTop::policy $context $range_match
+ }
+ $q set_filesystem $::ApolTop::policy $fstype
+ $q set_path $::ApolTop::policy $path
+
+ set v [$q run $::ApolTop::policy]
+ $q -acquire
+ $q -delete
+ set genfscons [genfscon_vector_to_list $v]
+
+ set results "GENFSCONS:"
+ if {[llength $genfscons] == 0} {
+ append results "\nSearch returned no results."
+ } else {
+ foreach g [lsort -command _genfscon_sort $genfscons] {
+ append results "\n[_genfscon_render $g]"
+ }
+ }
+ Apol_Widget::appendSearchResultText $widgets(results) $results
+
+ # because qpol_policy_get_genfscon_iter() returns allocated items,
+ # destroying the vector before using its items will segfault
+ $v -acquire
+ $v -delete
+}
+
+proc Apol_FSContexts::_genfscon_render {qpol_genfscon_datum} {
+ apol_genfscon_render $::ApolTop::policy $qpol_genfscon_datum
+}
+
+proc Apol_FSContexts::_genfscon_sort {a b} {
+ set name_a [$a get_name $::ApolTop::qpolicy]
+ set name_b [$b get_name $::ApolTop::qpolicy]
+ if {[set z [string compare $name_a $name_b]] != 0} {
+ return $z
+ }
+ set path_a [$a get_path $::ApolTop::qpolicy]
+ set path_b [$b get_path $::ApolTop::qpolicy]
+ if {[set z [string compare $path_a $path_b]] != 0} {
+ return $z
+ }
+ return 0
+}
+
+#### fs_use private functions below ####
+
+proc Apol_FSContexts::_fsuse_create {p_f} {
+ variable widgets
+ variable vals
+
+ set t [frame $p_f.t]
+ set type_cb [checkbutton $t.type_enable -text "Statement type" \
+ -variable Apol_FSContexts::vals(fsuse:type_enable)]
+ set widgets(fsuse:type) [ComboBox $t.type -entrybg white -width 12 -state disabled \
+ -textvariable Apol_FSContexts::vals(fsuse:type) -autopost 1]
+ trace add variable Apol_FSContexts::vals(fsuse:type_enable) write \
+ [list Apol_FSContexts::_toggleCheckbutton $widgets(fsuse:type)]
+ pack $type_cb -side top -anchor w
+ pack $widgets(fsuse:type) -side top -expand 0 -fill x -padx 4
+
+ set fs [frame $p_f.fs]
+ set fs_cb [checkbutton $fs.fs_enable -text "Filesystem" \
+ -variable Apol_FSContexts::vals(fsuse:fs_enable)]
+ set widgets(fsuse:fs) [ComboBox $fs.fs -entrybg white -width 12 -state disabled \
+ -textvariable Apol_FSContexts::vals(fsuse:fs) -autopost 1]
+ trace add variable Apol_FSContexts::vals(fsuse:fs_enable) write \
+ [list Apol_FSContexts::_toggleCheckbutton $widgets(fsuse:fs)]
+ pack $fs_cb -side top -anchor w
+ pack $widgets(fsuse:fs) -side top -expand 0 -fill x -padx 4
+
+ frame $p_f.c
+ set widgets(fsuse:context) [Apol_Widget::makeContextSelector $p_f.c.context "Contexts"]
+ pack $widgets(fsuse:context)
+
+ pack $t $fs $p_f.c -side left -anchor n -padx 4 -pady 2
+}
+
+proc Apol_FSContexts::_fsuse_open {} {
+ variable vals
+
+ set q [new_apol_fs_use_query_t]
+ set v [$q run $::ApolTop::policy]
+ $q -acquire
+ $q -delete
+ set fs_uses [lsort -unique [fs_use_vector_to_list $v]]
+ $v -acquire
+ $v -delete
+
+ # get a list of all behaviors present in this policy
+ set vals(fsuse:items) {}
+ set behavs {}
+ foreach f $fs_uses {
+ lappend vals(fsuse:items) [$f get_name $::ApolTop::qpolicy]
+ lappend behavs [apol_fs_use_behavior_to_str [$f get_behavior $::ApolTop::qpolicy]]
+ }
+
+ variable widgets
+ set vals(fsuse:items) [lsort -unique $vals(fsuse:items)]
+ $widgets(fsuse:type) configure -values [lsort -unique $behavs]
+ $widgets(fsuse:fs) configure -values $vals(fsuse:items)
+}
+
+proc Apol_FSContexts::_fsuse_show {} {
+ variable vals
+ variable widgets
+ $widgets(items_tf) configure -text "fs_use Contexts"
+ $widgets(options_pm) raise fsuse
+ set vals(items) $vals(fsuse:items)
+}
+
+proc Apol_FSContexts::_fsuse_popup {fs} {
+ set qpol_fs_use_datum [new_qpol_fs_use_t $::ApolTop::qpolicy $fs]
+ set text "fs_use $fs\n [_fsuse_render $qpol_fs_use_datum]"
+ Apol_Widget::showPopupText $fs $text
+}
+
+proc Apol_FSContexts::_fsuse_runSearch {} {
+ variable vals
+ variable widgets
+
+ if {$vals(fsuse:type_enable)} {
+ if {$vals(fsuse:type) == {}} {
+ tk_messageBox -icon error -type ok -title "Error" -message "No fs_use statement type selected."
+ return
+ }
+ set behavior [apol_str_to_fs_use_behavior $vals(fsuse:type)]
+ if {$behavior < 0} {
+ tk_messageBox -icon error -type ok -title "Error" -message "$vals(fsuse:type) is not a valid fs_use statement type."
+ return
+ }
+ } else {
+ set behavior -1
+ }
+ if {$vals(fsuse:fs_enable)} {
+ if {$vals(fsuse:fs) == {}} {
+ tk_messageBox -icon error -type ok -title "Error" -message "No filesystem selected."
+ return
+ }
+ set fstype $vals(fsuse:fs)
+ } else {
+ set fstype {}
+ }
+
+ set q [new_apol_fs_use_query_t]
+ if {[Apol_Widget::getContextSelectorState $widgets(fsuse:context)]} {
+ foreach {context range_match attribute} [Apol_Widget::getContextSelectorValue $widgets(fsuse:context)] {break}
+ $q set_context $::ApolTop::policy $context $range_match
+ }
+ $q set_filesystem $::ApolTop::policy $fstype
+ $q set_behavior $::ApolTop::policy $behavior
+
+ set v [$q run $::ApolTop::policy]
+ $q -acquire
+ $q -delete
+ set fsuses [fs_use_vector_to_list $v]
+ $v -acquire
+ $v -delete
+
+ set results "FS_USES:"
+ if {[llength $fsuses] == 0} {
+ append results "\nSearch returned no results."
+ } else {
+ foreach u [lsort -command _fsuse_sort $fsuses] {
+ append results "\n[_fsuse_render $u]"
+ }
+ }
+ Apol_Widget::appendSearchResultText $widgets(results) $results
+}
+
+proc Apol_FSContexts::_fsuse_render {qpol_fs_use_datum} {
+ apol_fs_use_render $::ApolTop::policy $qpol_fs_use_datum
+}
+
+proc Apol_FSContexts::_fsuse_sort {a b} {
+ set behav_a [apol_fs_use_behavior_to_str [$a get_behavior $::ApolTop::qpolicy]]
+ set behav_b [apol_fs_use_behavior_to_str [$b get_behavior $::ApolTop::qpolicy]]
+ if {[set z [string compare $behav_a $behav_b]] != 0} {
+ return $z
+ }
+ set name_a [$a get_name $::ApolTop::qpolicy]
+ set name_b [$b get_name $::ApolTop::qpolicy]
+ if {[set z [string compare $name_a $name_b]] != 0} {
+ return $z
+ }
+ return 0
+}