#!/bin/bash
# 
# This script is used for Administration of RSBAC RC Type entries
#
# Author and (c) 1999 Amon Ott
#
# Last changed on 10/Feb/1999
#
# Make sure we're really running bash.
#
[ -z "$BASH" ] && { echo "This menu requires bash" 1>&2; exit 1; }

#
# Cache function definitions, turn off posix compliance
#
set -h +o posix

ITEMS="type_fd_name type_dev_name type_process_name \
       type_ipc_name type_fd_need_secdel"

# This must be a unique temporary filename
if test -z "$TMPDIR" ; then TMPDIR=/tmp ; fi
TMPFILE=$TMPDIR/rsbac_dialog.$$
TMPFILETWO=$TMPDIR/rsbac_dialog.$$.2

# set this to rsbac bin dir, if not in path (trailing / is mandatory!)
#
#if test -z "$RSBACPATH" ; then RSBACPATH=./ ; fi

# set this to initial dir on script startup
LASTDIR='.'

# test for LINES and COLUMNS (should be exported e.g. in /etc/profile)
if test -z "$LINES" ; then declare -i LINES=25 ; fi
if test -z "$COLUMNS" ; then declare -i COLUMNS=80 ; fi
declare -i BL=$LINES-4
declare -i BC=$COLUMNS-4
declare -i MAXLINES=$LINES-10
gl () {
  if test $1 -gt $MAXLINES
  then echo $MAXLINES
  else echo $1
  fi
}

if test -z "$BACKTITLE"
  then BACKTITLE="RSBAC Administration Tools v1.0.9b" ; fi
TITLE="`whoami`: RSBAC RC Type Administration"
ERRTITLE="RSBAC RC Type Administration - ERROR"

onoff () {
   if test "$1" = "$2"
     then echo on
   else echo off
   fi
}

onoffi () {
   if test $1 -eq $2
     then echo on
   else echo off
   fi
}

onoffb () {
   if test "$1" = "1"
     then echo on
   else echo off
   fi
}

gen_type_list () {
        case $1 in
           FD)
             ${RSBACPATH}rc_get_item list_fd_types
             ;;
           FDSD)
             for i in `${RSBACPATH}rc_get_item list_fd_type_nr`
             do
               echo -n $i ""
               onoffb `${RSBACPATH}rc_get_item TYPE $i type_fd_need_secdel`
             done
             ;;
           DEV)
             ${RSBACPATH}rc_get_item list_dev_types
             ;;
           Process)
             ${RSBACPATH}rc_get_item list_process_types
             ;;
           IPC)
             ${RSBACPATH}rc_get_item list_ipc_types
             ;;
           SCD)
             ${RSBACPATH}rc_get_item list_scd_types
             ;;
           *)
             ;;
        esac
}

gen_used_type_list () {
        case $1 in
           FD)
             ${RSBACPATH}rc_get_item list_used_fd_types
             ;;
           FDSD)
             for i in `${RSBACPATH}rc_get_item list_used_fd_type_nr`
             do
               echo -n $i ""
               onoffb `${RSBACPATH}rc_get_item TYPE $i type_fd_need_secdel`
             done
             ;;
           DEV)
             ${RSBACPATH}rc_get_item list_used_dev_types
             ;;
           Process)
             ${RSBACPATH}rc_get_item list_used_process_types
             ;;
           IPC)
             ${RSBACPATH}rc_get_item list_used_ipc_types
             ;;
           SCD)
             ${RSBACPATH}rc_get_item list_used_scd_types
             ;;
           *)
             ;;
        esac
}

get_target_name () {
  case $1 in
      FD)
        echo File/Dir type name
        ;;
      FDSD)
        echo File/Dir secure delete
        ;;
      DEV)
        echo Device type name
        ;;
      Process)
        echo Process type name
        ;;
      IPC)
        echo IPC type name
        ;;
      SCD)
        echo "SCD type name (read only)"
        ;;
      *)
        echo " "
        ;;
  esac
}

item_name () {
  case $1 in
      FD)
        echo type_fd_name
        ;;
      FDSD)
        echo type_fd_need_secdel
        ;;
      DEV)
        echo type_dev_name
        ;;
      Process)
        echo type_process_name
        ;;
      IPC)
        echo type_ipc_name
        ;;
      SCD)
        echo type_scd_name
        ;;
      *)
        echo " "
        ;;
  esac
}

choose_target () {
    if ! dialog --title "$TITLE" \
              --backtitle "$BACKTITLE" \
              --menu "$1" $BL $BC 6 \
              FD "`get_target_name FD`" \
              FDSD "`get_target_name FDSD`" \
              DEV "`get_target_name DEV`" \
              Process "`get_target_name Process`" \
              IPC "`get_target_name IPC`" \
              SCD "`get_target_name SCD`" \
           2>$TMPFILE
    then
       rm $TMPFILE
    fi
}

case $1 in
    FD)
      TARGET=$1
      ;;
    FDSD)
      TARGET=$1
      ;;
    DEV)
      TARGET=$1
      ;;
    Process)
      TARGET=$1
      ;;
    IPC)
      TARGET=$1
      ;;
    SCD)
      TARGET=$1
      ;;
    *)
      choose_target "Startup: Choose initial type target" ""
      if test -f $TMPFILE
      then TARGET=`cat $TMPFILE`
      fi
esac

while true ; do \
  if ! \
    dialog --title "$TITLE" \
           --backtitle "$BACKTITLE" \
           --menu "Main Menu" $BL $BC $MAXLINES \
                  "Choose Type Target:" "$TARGET / `get_target_name $TARGET`" \
                  "New Type" ""\
                  "Drop Type" ""\
                  "---------------" ""\
                  `gen_used_type_list $TARGET` \
                  "---------------" ""\
                  "Quit" "" \
         2>$TMPFILE
  then rm $TMPFILE ; exit
  fi

  TYPE="`cat $TMPFILE`"
  case "$TYPE" in
    "Choose Type Target:")
      choose_target "Choose target" $TARGET
      if test -f $TMPFILE
      then TARGET=`cat $TMPFILE`
      fi
      ;;

    "New Type")
      if test -z "$TARGET"
      then  dialog --title "$ERRTITLE" \
                   --backtitle "$BACKTITLE" \
                   --msgbox "New Type: target is invalid!" 5 $BC
            continue
      fi
      if test "$TARGET" = "FDSD"
      then TMPTGT=FD
      else TMPTGT=$TARGET
      fi
      if ! \
      dialog --title "$TITLE" \
           --backtitle "$BACKTITLE" \
           --menu "Choose type to activate" $BL $BC $MAXLINES \
                  `gen_type_list $TMPTGT` \
            2>$TMPFILE
      then rm $TMPFILE ; continue
      fi
      TMP=`cat $TMPFILE`
      if test -n "`${RSBACPATH}rc_get_item TYPE $TMP \`item_name $TMPTGT\``"
      then continue
      fi
      if ! $RSBACPATH""rc_set_item TYPE $TMP `item_name $TMPTGT` "$TMP" &>$TMPFILE
      then \
        dialog --title "$ERRTITLE" \
               --backtitle "$BACKTITLE" \
               --msgbox "`head $TMPFILE`" $BL $BC
      fi
      ;;

    "Drop Type")
      if test -z "$TARGET"
      then  dialog --title "$ERRTITLE" \
                   --backtitle "$BACKTITLE" \
                   --msgbox "Drop Type: target is invalid!" 5 $BC
            continue
      fi
      if test "$TARGET" = "FDSD"
      then TMPTGT=FD
      else TMPTGT=$TARGET
      fi
      if ! \
      dialog --title "$TITLE" \
           --backtitle "$BACKTITLE" \
           --menu "Choose type to drop" $BL $BC $MAXLINES \
                  `gen_used_type_list $TMPTGT` \
            2>$TMPFILE
      then rm $TMPFILE ; continue
      fi
      TMP=`cat $TMPFILE`
      OLDNAME="`${RSBACPATH}rc_get_item TYPE $TMP \`item_name $TMPTGT\``"
      if test -n "$OLDNAME"
      then if ! dialog --title "$TITLE" \
                       --backtitle "$BACKTITLE" \
                       --yesno "Drop $TMPTGT type $TMP ($OLDNAME)?" $BL $BC \
                  2>/dev/null
           then continue
           fi
      fi
      
      if ! ${RSBACPATH}rc_set_item TYPE $TMP `item_name $TMPTGT` "" &>$TMPFILE
      then \
        dialog --title "$ERRTITLE" \
               --backtitle "$BACKTITLE" \
               --msgbox "`head $TMPFILE`" $BL $BC
      fi
      ;;

    Quit)
      rm $TMPFILE ; exit
      ;;

    "---------------")
      dialog --title "$ERRTITLE" \
             --backtitle "$BACKTITLE" \
             --msgbox "Main Menu: Selection Error!" 5 $BC
      ;;

    *)
        case $TARGET in
          FD)
            if dialog --title "$TITLE" \
                      --backtitle "$BACKTITLE" \
                      --inputbox "Name for FD Type $TYPE (maxlen = 15)" $BL $BC "`${RSBACPATH}rc_get_item TYPE $TYPE type_fd_name`" \
              2>$TMPFILE
            then TMP=`cat $TMPFILE`
                 if ! $RSBACPATH""rc_set_item TYPE $TYPE type_fd_name "$TMP" &>$TMPFILE
                 then \
                   dialog --title "$ERRTITLE" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "`head $TMPFILE`" $BL $BC
                 fi
            fi
            ;;
          FDSD)
            if test "`${RSBACPATH}rc_get_item TYPE $TYPE type_fd_need_secdel`" = "1"
            then TMPVAL=0
            else TMPVAL=1
            fi
            if ! $RSBACPATH""rc_set_item TYPE $TYPE type_fd_need_secdel $TMPVAL &>$TMPFILE
            then \
              dialog --title "$ERRTITLE" \
                     --backtitle "$BACKTITLE" \
                     --msgbox "`head -n 1 $TMPFILE`" $BL $BC
            fi
            ;;
          DEV)
            if dialog --title "$TITLE" \
                      --backtitle "$BACKTITLE" \
                      --inputbox "Name for DEV Type $TYPE (maxlen = 15)" $BL $BC "`${RSBACPATH}rc_get_item TYPE $TYPE type_dev_name`" \
              2>$TMPFILE
            then TMP=`cat $TMPFILE`
                 if ! $RSBACPATH""rc_set_item TYPE $TYPE type_dev_name "$TMP" &>$TMPFILE
                 then \
                   dialog --title "$ERRTITLE" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "`head $TMPFILE`" $BL $BC
                 fi
            fi
            ;;
          Process)
            if dialog --title "$TITLE" \
                      --backtitle "$BACKTITLE" \
                      --inputbox "Name for Process Type $TYPE (maxlen = 15)" $BL $BC "`${RSBACPATH}rc_get_item TYPE $TYPE type_process_name`" \
              2>$TMPFILE
            then TMP=`cat $TMPFILE`
                 if ! $RSBACPATH""rc_set_item TYPE $TYPE type_process_name "$TMP" &>$TMPFILE
                 then \
                   dialog --title "$ERRTITLE" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "`head $TMPFILE`" $BL $BC
                 fi
            fi
            ;;
          IPC)
            if dialog --title "$TITLE" \
                      --backtitle "$BACKTITLE" \
                      --inputbox "Name for IPC Type $TYPE (maxlen = 15)" $BL $BC "`${RSBACPATH}rc_get_item TYPE $TYPE type_ipc_name`" \
              2>$TMPFILE
            then TMP=`cat $TMPFILE`
                 if ! $RSBACPATH""rc_set_item TYPE $TYPE type_ipc_name "$TMP" &>$TMPFILE
                 then \
                   dialog --title "$ERRTITLE" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "`head $TMPFILE`" $BL $BC
                 fi
            fi
            ;;
          SCD)
            dialog --title "$ERRTITLE" \
                   --backtitle "$BACKTITLE" \
                   --msgbox "Main Menu: target SCD is read only!" 5 $BC
            ;;
          *)
            dialog --title "$ERRTITLE" \
                   --backtitle "$BACKTITLE" \
                   --msgbox "Main Menu: target is invalid!" 5 $BC
            ;;
        esac
        ;;

  esac
# sleep 2
done
