home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / crud.tcl < prev    next >
Text File  |  1996-08-12  |  8KB  |  247 lines

  1. #
  2. # Default Access SetUp for Default four Phase schema
  3. #
  4.  
  5. # Check if it is a redefinition of the access rights or a 
  6. # new definition of users, roles and access rights
  7. set redef ""
  8. if { [string trim $ucgargv] == "-r" } {
  9.   set redef "True"
  10.   puts "Using -r flag: redefine Access Rights for current roles"
  11. }
  12.  
  13. # source TCL what will readin the setup files into global variables
  14. # userlist - List of User
  15. # roleinfo - Array of Role Access Information indexed on RoleName
  16. # userroleinfo - Array of UserLists indexed on RoleName
  17. # projectconf - Arry of Project configurations indexed on ProjectName
  18.  
  19. source readsetup.tcl
  20.  
  21. # Build the actionsMaps for allowed, prohibited and undefined access rights
  22. # This interface offers a simple CRUD access scheme:
  23. #
  24. # C = Create maps to Insert, ModifyStatus Actions
  25. # R = Read   maps to Read Action
  26. # U = Update maps to Modify, Freeze, Unfreeze and ModifyStatus Actions
  27. # D = Delete maps to Remove, Destroy Actions
  28. # M = Manage maps to Control Action
  29. #
  30. # see page 86 for the explantion of the bitmap built here
  31.  
  32. set AllowedMap(C)            [expr 2|8|32|512]
  33. set AllowedMap(R)             8
  34. set AllowedMap(U)            [expr 16|128|256|512]
  35. set AllowedMap(D)            [expr 4|64]
  36. set AllowedMap(M)            1
  37.  
  38.  
  39. # At securityLevel level active the SuperUser Role in order to undefinedmap 
  40. # control actions. This can only done by the corporate owner (ot4omt?)
  41. # Note: this seems also possible by setting the M4 variable(s)
  42. # M4_corproles_<corpname> (and/or M4_projroles_<projname>)
  43. proc setSuperUser { securityLevel } {
  44.    $securityLevel activate "SuperUser" 
  45. }
  46.  
  47. #
  48. # Add the users from the global userlist to the Corporate Level
  49. #
  50. proc addUsers { corp } {
  51.     global userlist
  52.     foreach user $userlist {
  53.         puts "Addding User Name $user to the Corporate Level"
  54.         $corp createUser $user
  55.     }
  56. }
  57.  
  58. #
  59. # Add Roles on Corporate Level and connect listed users to the roles
  60. #
  61. proc addRolesAndUsers { securityLevel corp } {
  62.    # Users list per role are listed in the userroleinfo Array
  63.    # All Roles are listed as index in the roleinfo list
  64.    global userroleinfo
  65.    global roleinfo
  66.    set createdroles {}
  67.    foreach roleline $roleinfo {
  68.     set role [string trim [lindex $roleline 0]]
  69.     # Check if the role was not created yet, and skip to next role if so.
  70.     if { [lsearch $createdroles $role] != -1 } {
  71.            continue
  72.         } 
  73.         lappend createdroles $role
  74.     puts "Adding role '$role' to Corporate level ..."
  75.     set rolehnd [$corp createRole $role]
  76.     # Now add the Users for this role 
  77.         # It can be that there where no users defined for the Role..
  78.     if { [info exists userroleinfo($role)] == 1 } {
  79.            foreach user $userroleinfo($role) {
  80.           set tmp  [split $user ':']
  81.           set user [string trim [lindex $tmp 0]]
  82.           set def  [string trim [lindex $tmp 1]]
  83.           puts "    Adding user '$user' for Role '$role' ..."
  84.           if { "$def" == "N" } {
  85.              set use "defaultOff"
  86.               }
  87.           if { "$def" == "Y" } {
  88.              set use "defaultOn"
  89.               }
  90.           set urhnd [$securityLevel createUserRoleLink $user $rolehnd $use]
  91.            }
  92.         }
  93.    }
  94.  
  95. #
  96. # Define the access rights on the controlled (list) objects
  97. # maskout invalid actions if needed
  98. #
  99. proc ModifyAccess { obj role am pm um { islist 0 } } {
  100.  
  101.    # In case of a List Childright all the actions are valid
  102.    if { $islist } {
  103.       # Take care of the childrights of the list
  104.       $obj modifyNewChildRights $role $am $pm $um
  105.    }
  106.  
  107.    # Mask-out possible unvalid access rights for the (list) object
  108.    set validactions [$obj controlledActions]
  109.    set am           [expr $validactions & $am]
  110.    set pm           [expr $validactions & $pm]
  111.    set um           [expr $validactions & $um]
  112.    $obj modifyPermission $role $am $pm $um
  113.  
  114. proc setAccessRights { client project config role phasevers crudlist } {
  115.  
  116.    global AllowedMap
  117.    global ProhibitMap
  118.  
  119.    # Derive the allowed/prohibited/undefined maps from the crudlist
  120.     
  121.    # UNRESOLVED 24/02/95 alru/keru
  122.    # There are two ways to do this
  123.    #
  124.    # 1: allow the actions as specified and prohibit the inverse allowed map
  125.    # 2: undefine the actions as specified and prohibit the inverse undef map
  126.    #
  127.    # Some expirimenting is needed to see and check which option provides
  128.    # the best access scheme.
  129.    # One of the problems is that the default role always exists, and
  130.    # could lead to a prohibit, since the right was allowed to another role
  131.    set allowedmap 0
  132.    foreach access $crudlist {
  133.       set allowedmap  [expr $allowedmap|$AllowedMap($access)]
  134.    }
  135.    set prohibitmap  [expr 1023 - $allowedmap]
  136.    set undefinedmap 0
  137.  
  138.  
  139.    # Now we are ready to modify the Permission for this selected PhaseVersion
  140.    puts "\t\t\t>PhaseVersion"
  141.    ModifyAccess $phasevers $role $allowedmap $prohibitmap $undefinedmap
  142.  
  143.    # Besides protecting the phaseverion itself, we need to protect
  144.    # the 'versionable' object Phase
  145.    set phasehdl [$phasevers phase]
  146.    puts "\t\t\t>Phase"
  147.    ModifyAccess $phasehdl $role $allowedmap $prohibitmap $undefinedmap
  148.  
  149.    # Besides modifying access rights on the version itself, we need
  150.    # to modify the access rights for all new versions of the phase 
  151.    puts "\t\t\t>phaseVersionList"
  152.    set pvlhdl [$phasehdl phaseVersionList]
  153.    ModifyAccess $pvlhdl $role $allowedmap $prohibitmap $undefinedmap 1
  154.  
  155.    # The Other Controlled Lists (PhaseSystemLinkList & SystemList) are
  156.    # located in the class PhaseVersion.
  157.  
  158.    # Modify Access on the Controlled List PhaseSystemLinkList
  159.    puts "\t\t\t>PhaseSystemLinkList"
  160.    set psllhdl [$phasevers systemVersionLinkList]
  161.    ModifyAccess $psllhdl $role $allowedmap $prohibitmap $undefinedmap 1
  162.  
  163.    # Modify Access on the Controlled List systemList
  164.    puts "\t\t\t>systemList"
  165.    set systemlist [$phasehdl systemList] 
  166.    ModifyAccess $systemlist $role $allowedmap $prohibitmap $undefinedmap 1
  167. }
  168.  
  169. # Main Program
  170.  
  171. # Access via the ClientContext Class
  172. set client [ClientContext::global]
  173.  
  174. # Get the current security level from the client contect
  175. # used to activate/list the effective roles.
  176. set securityLevel [$client currentSecurityLevel]
  177.  
  178. # Get the Corporate handle from the ClientContext
  179. set corp  [$client currentCorporate]
  180. set cname [$corp name]
  181. setSuperUser $securityLevel
  182.  
  183. # Add the Indicated Users to the Corporate Level
  184. if { "$redef" == "" } {
  185.    addUsers $corp
  186. }
  187.  
  188. # Connect the Users to the defined Roles according the setupfile
  189. if { "$redef" == "" } {
  190.    addRolesAndUsers $securityLevel $corp
  191. }
  192.  
  193. # Define the Access Rights for the defined Roles
  194.  
  195. # Need to get thes from somewhere
  196.  
  197. foreach projconf $projectconf {
  198.  
  199.    set tmp [split $projconf ',']
  200.    set project [lindex $tmp 0]
  201.    set config  [lindex $tmp 1]
  202.  
  203.    # Now locate the current Phases of the Indicated project & configuration
  204.    # Go down to the Configuration Level to see the Phases
  205.    $client downLevel $project
  206.    set projhnd [$client currentProject]
  207.  
  208.    # In order to have access control rights to the Phase 
  209.    # setSuperUser also on the project security Level
  210.    set projectSecurityLevel [$client currentSecurityLevel]
  211.    setSuperUser $projectSecurityLevel
  212.  
  213.    # No go down to the Configuration Level (where the Phases are)
  214.    $client downLevel $config
  215.    set confhnd [$client currentConfig]
  216.    puts ""
  217.    puts "Project       : [$projhnd name]"
  218.    puts "Configuration : [$confhnd text]"
  219.    puts ""
  220.  
  221.    # Wildcards used in phase names, need to loop trough phase names
  222.    # of the current configuration, and expand the wildcard
  223.    foreach phasevers [$confhnd phaseVersions] {
  224.     set phasehdl [$phasevers phase]
  225.     set phasename [$phasehdl name]
  226.     puts "\tPhase $phasename"
  227.           foreach roleline $roleinfo {
  228.      set roleline   [split $roleline '|']
  229.          set role       [string trim [lindex $roleline 0]]
  230.             set phasepat   [string trim [lindex $roleline 1]]
  231.      # Check for string match
  232.      if { [string match "$phasepat" $phasename] } {
  233.             set tmpcrud   [string trim [lindex $roleline 2]]
  234.         set crudlist  [split $tmpcrud '-']
  235.         puts "\t\tSet AccessRights for role '$role' to $crudlist"
  236.             setAccessRights $client $project $config $role $phasevers $crudlist
  237.            }
  238.         }
  239.    }
  240.  
  241.    # go back to the Corporate Level for the next pass in this loop
  242.    $client upLevel
  243.    $client upLevel
  244. }
  245.