home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / security.tcl < prev    next >
Text File  |  1997-09-02  |  9KB  |  303 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #    (c) Cayenne Software Inc. 1997
  4. #
  5. #    File:        %W%
  6. #    Author:        M. van Leeuwen, E. Rijvordt
  7. #    Description:    Report on security
  8. #    Usage in:    Corporate to Phase Level
  9. #       Options:        <rolenames>
  10. #---------------------------------------------------------------------------
  11. # SccsId = %W%    %G%    Copyright 1997 Cayenne Software Inc.
  12.  
  13. global controlled
  14.  
  15. set controlled(ConfigPhaseLink)        {phaseVersion}
  16. set controlled(ConfigVersion)        {phaseVersionLinkList}
  17. set controlled(ControlledList)        {objects}
  18. set controlled(Corporate)        {corporateGroups modelList projectList}
  19. set controlled(CorporateGroup)        {corporateGroupVersions}
  20. set controlled(CustomFile)        {customFileVersionList}
  21. set controlled(CustomLevel)        {customFileList}
  22. set controlled(CustomLevelVersion)    {customFileVersionLinkList}
  23. set controlled(File)            {fileVersionList}
  24. set controlled(Group)            {groupVersionList}
  25. set controlled(LevelCustomFileLink)    {customFileVersion}
  26. set controlled(Phase)            {systemList}
  27. set controlled(PhaseSystemLink)        {systemVersion}
  28. set controlled(PhaseVersion)        {systemVersionLinkList}
  29. set controlled(Project)            {configList configVersions}
  30. set controlled(System)            {fileList groupList savedGroups}
  31. set controlled(SystemCorporateLink)    {corporateGroupVersion}
  32. set controlled(SystemFileLink)        {fileVersion}
  33. set controlled(SystemGroupLink)        {groupVersion}
  34. set controlled(SystemVersion)        {corporateGroupVersionLinkList
  35.                      externalLinkList 
  36.                      fileVersionLinkList
  37.                      fileVersionReferenceList
  38.                      groupVersionLinkList
  39.                      propertyReferenceList}
  40. set controlled(Version)            {object}
  41.  
  42. #---------------------------------------------------------------------------
  43.  
  44. # Keep these of length n
  45. set ALLOW "+++ "
  46. set DENYD "--- "
  47. set UNDEF "... "
  48. set NOACC "xxx "
  49.  
  50. set TEXTLEN 80
  51. set NOTSPECIFIED "No access rules specified"
  52.  
  53. #---------------------------------------------------------------------------
  54.  
  55. Class ReportSecurity : {ReportBase} {
  56.     constructor
  57.  
  58.     attribute actions
  59.     attribute roles
  60.  
  61.     method findActions
  62.     method printInfo
  63.     method doReport
  64.  
  65.     method controlledObjects
  66.     method control
  67.     method baseClassesOf
  68.  
  69.     method corporateReport
  70.     method projectReport
  71.     method configReport
  72.     method phaseReport
  73.     method systemReport
  74.     method fileReport
  75. }
  76.  
  77.  
  78. constructor ReportSecurity {class this} {
  79.     set this [ReportBase::constructor $class $this]
  80.  
  81.     set allRoles [query -s roles.name [$cc currentCorporate]]
  82.  
  83.     if ![lempty $Options] {
  84.         $this roles $Options
  85.     foreach role [$this roles] {
  86.         if { [lsearch $allRoles $role] == -1 } {
  87.         [$this report] print "** Non existing role '$role' **" line
  88.         exit
  89.         }
  90.         }
  91.     } else {
  92.         $this roles $allRoles
  93.     }
  94.  
  95.     if { [llength [$this roles]] == 1 } {
  96.     $this reportName "Security on Role [$this roles]"
  97.     } else {
  98.     $this reportName "Security"
  99.     }
  100.     $this actions { controlAction  createAction destroyAction readAction \
  101.             modifyAction   insertAction removeAction freezeAction \
  102.             unfreezeAction modifyStatusAction}
  103.     return $this
  104. }
  105.  
  106. method ReportSecurity::findActions {this object roles} {
  107.     set report [$this report]
  108.  
  109.     foreach role [lsort [$this roles]] {
  110.     if { [llength [$this roles]] != 1 } {
  111.             if [$report queued] { $report line }
  112.         $report space 5
  113.             set text "on Role $role:"
  114.             set len  [string length $text]
  115.         $report print $text
  116.             if {[expr $len%2] == 1} {
  117.                 $report space
  118.                 incr len
  119.             }
  120.         incr len 5
  121.         $report print " ." [expr $TEXTLEN - $len] fill
  122.         $report space 5
  123.     }
  124.  
  125.         set rr [$object findRight $role]
  126.  
  127.         if { [$rr isNil] || ![$object hasRights] } {
  128.             $report print $NOTSPECIFIED line
  129.             continue
  130.         }
  131.  
  132.         foreach action [$this actions] {
  133.             switch [$rr access $action] {
  134.                 0 - noAccess    { $report print $NOACC }
  135.                 1 - prohibited  { $report print $DENYD }
  136.                 2 - allowed     { $report print $ALLOW }
  137.                 3 - undefined   { $report print $UNDEF }
  138.         }
  139.         }
  140.     $report line
  141.     }
  142. }
  143.  
  144. method ReportSecurity::printInfo {this} {
  145.     set report [$this report]
  146.     set cnt 0
  147.     $report space 4
  148.     foreach action [$this actions] {
  149.     set act [string range $action 0 2]
  150.     $report print [string toupper $act] 4
  151.     $report print ": "
  152.     $report print $action 24
  153.         incr cnt
  154.         if {$cnt == 4} { set cnt 0; $report line; $report space 4 }
  155.     }
  156.     if {$cnt != 0} { $report line }
  157.  
  158.     $report space 4
  159.     $report print "$ALLOW: Allowed" 30
  160.     $report print "$DENYD: Denied" 30
  161.     $report print "$UNDEF: Undefined" 30
  162.     $report print "$NOACC: No Access" line
  163.     $report line
  164. }
  165.  
  166. method ReportSecurity::doReport {this v_objects} {
  167.     upvar $v_objects objects
  168.     if ![info exists objects] { return 0 }
  169.     set report [$this report]
  170.     
  171.     $report header {
  172.         $report print ControlledObject $TEXTLEN
  173.         $report space 5
  174.         foreach action [$this actions] {
  175.             set act [string range $action 0 2]
  176.             $report print [string toupper $act] 4
  177.         }
  178.         $report line
  179.     $report line
  180.     }
  181.  
  182.     $this printInfo
  183.     foreach obj $objects {
  184.         set text [$obj text]
  185.         set len  [string length $text]
  186.         if { $len <= $TEXTLEN && [llength [$this roles]] == 1 } {
  187.         $report print $text
  188.             if {[expr $len%2] == 1} {
  189.                 $report space
  190.                 incr len
  191.             }
  192.         $report print " ." [expr $TEXTLEN - $len] fill
  193.         } else {
  194.         $report print $text $TEXTLEN 
  195.         }
  196.         $report space 5
  197.         $this findActions $obj [$this roles]
  198.     }
  199.     $report page
  200. }
  201.  
  202. #
  203. # Return all objects of class 'Controlled' that are sub-objects of
  204. # the given object.
  205. #
  206. method ReportSecurity::controlledObjects {this obj} {
  207.     global controlled
  208.  
  209.     set class [$obj ORB_class]
  210.  
  211.     foreach baseClass [$this baseClassesOf $class] {
  212.         if ![info exists controlled($baseClass)] {
  213.             continue
  214.         }
  215.     foreach method $controlled($baseClass) {
  216.         foreach subObj [$obj $method] {
  217.         set result($subObj) 1
  218.         }
  219.     }
  220.     }
  221.     if ![info exists result] {
  222.         return {}
  223.     }
  224.     return [array names result]
  225. }
  226.  
  227. #
  228. # Since Tcl cannot handle recursive routines well, we have to retrieve
  229. # the objects in a somewhat less efficient way.
  230. #
  231. method ReportSecurity::control {this obj} {
  232.     set finished {}
  233.     set newset   {}
  234.     set workset  [$this controlledObjects $obj]
  235.  
  236.     while {[llength $workset] != 0} {
  237.         set finished [concat $finished $workset]
  238.     foreach objpart $workset {
  239.             set result [$this controlledObjects $objpart]
  240.             foreach element $result {
  241.                 if {[lsearch $finished $element] == -1} {
  242.                     lappend newset $element
  243.                 }
  244.         }
  245.     }
  246.         set workset $newset
  247.         set newset {}
  248.     }
  249.     return [osort ORB_class $finished]
  250. }
  251.  
  252.  
  253. #
  254. # Returns all names of classes that are bases of the given class.
  255. # The given class is included in this list.
  256. #
  257. method ReportSecurity::baseClassesOf {this class} {
  258.     foreach base [$class info supers] {
  259.         set bases($base) 1
  260.  
  261.         foreach baseBase [$this baseClassesOf $base] {
  262.             set bases($baseBase) 1
  263.         }
  264.     }
  265.     if ![info exists bases] {
  266.         return [list $class]
  267.     }
  268.     return [concat [list $class] [array names bases]]
  269. }
  270.  
  271.  
  272. method ReportSecurity::corporateReport {this} {
  273.     set objects [$this control [$this corporate]]
  274.     return [$this doReport objects]
  275. }
  276.  
  277. method ReportSecurity::projectReport {this} {
  278.     set objects [$this control [$this project]]
  279.     return [$this doReport objects]
  280. }
  281.  
  282. method ReportSecurity::configReport {this} {
  283.     set objects [$this control [$this configV]]
  284.     return [$this doReport objects]
  285. }
  286.  
  287. method ReportSecurity::phaseReport {this} {
  288.     set objects [$this control [$this phaseV]]
  289.     return [$this doReport objects]
  290. }
  291.  
  292. method ReportSecurity::systemReport {this} {
  293.     set objects [$this control [$this systemV]]
  294.     return [$this doReport objects]
  295. }
  296.  
  297. method ReportSecurity::fileReport {this} {
  298.     set objects [$this control [$this fileV]]
  299.     return [$this doReport objects]
  300. }
  301. # ----------------------------------------------------------------------
  302. set executeMe [ReportSecurity new]
  303.