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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)custsechan.tcl    /main/titanic/4
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)custsechan.tcl    /main/titanic/4   10 Oct 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require custfileut.tcl
  13. # End user added include file section
  14.  
  15.  
  16. Class CustSecHandler : {Object} {
  17.     constructor
  18.     method destructor
  19.     method initialize
  20.     method readFile
  21.     method readRoles
  22.     method readUserRoles
  23.     method addRoles
  24.     method addUsers
  25.     method addUserRoleLinks
  26.     method setAccess
  27.     method updateAccess
  28.     method getAllowedMap
  29.     method setAllowedMap
  30.     method removeAllowedMap
  31.     attribute roleInfo
  32.     attribute userRoleInfo
  33.     attribute roleList
  34.     attribute userList
  35.     attribute showProjectInfo
  36.     attribute corporate
  37.     attribute project
  38.     attribute config
  39.     attribute allowedMap
  40. }
  41.  
  42. constructor CustSecHandler {class this name} {
  43.     set this [Object::constructor $class $this $name]
  44.     $this allowedMap [Dictionary new]
  45.     # Start constructor user section
  46.  
  47.     [$this allowedMap] contents [list \
  48.         M 1 \
  49.         C [expr 2|32] \
  50.         R 8 \
  51.         U [expr 16|128|256|512] \
  52.         D [expr 4|64] \
  53.     ]
  54.  
  55.     set cc [ClientContext::global]
  56.     $this showProjectInfo 1
  57.     $this corporate [$cc currentCorporate]
  58.     $this project [$cc currentProject]
  59.     $this config [$cc currentConfig]
  60.  
  61.     # End constructor user section
  62.     return $this
  63. }
  64.  
  65. method CustSecHandler::destructor {this} {
  66.     # Start destructor user section
  67.     # End destructor user section
  68. }
  69.  
  70. method CustSecHandler::initialize {this} {
  71.     if [$this showProjectInfo] {
  72.     puts "Project      : [[$this project] name]"
  73.     $this showProjectInfo 0
  74.     } else {
  75.     puts ""
  76.     }
  77.     puts "Configuration: [[$this config] text]"
  78.  
  79.     set warning 0
  80.     foreach phaseV [[$this config] phaseVersions] {
  81.     if {! [lempty [$phaseV systemVersions]]} {
  82.         if {! $warning} {
  83.         puts ""
  84.         }
  85.         wmtkwarning "WARNING: Phase '[[$phaseV phase] name]' is not empty"
  86.         set warning 1
  87.     }
  88.     }
  89.     if $warning {
  90.     puts ""
  91.     wmtkwarning "WARNING: Changing the access rights within a non-empty \
  92.         PhaseVersion could make\naccess control for the current users of \
  93.         that PhaseVersion very complicated."
  94.     puts -nonewline "Do you want to Continue ? \[n\]: "
  95.     flush stdout
  96.     set answer [string tolower [gets stdin]]
  97.     puts ""
  98.     if {"$answer" != "y"} {
  99.         return "stop"
  100.     }
  101.     }
  102.  
  103.     set errorMsg "[$this readRoles]"
  104.     if {"$errorMsg" != ""} {
  105.     return "$errorMsg"
  106.     }
  107.  
  108.     set errorMsg "[$this readUserRoles]"
  109.     if {"$errorMsg" != ""} {
  110.     return "$errorMsg"
  111.     }
  112.  
  113.     return "" 
  114. }
  115.  
  116. method CustSecHandler::readFile {this fileName} {
  117.     set contents [CustFileUtilities::contents "" $fileName $fileName]
  118.     if [lindex $contents 0] {
  119.     set contents [lindex $contents 1]
  120.     } else {
  121.     set cc [ClientContext::global]
  122.     if [catch {
  123.         set contents [$cc getCustomFileContents $fileName $fileName etc]
  124.     }] {
  125.         resetErrorVars
  126.         set etcDir [path_name concat [path_name directory [pwd]] etc]
  127.         set file [open [path_name concat $etcDir $fileName $fileName]]
  128.         set contents [read $file]
  129.         close $file
  130.     }
  131.     }
  132.  
  133.     set lines {}
  134.     foreach line [split $contents "\n"] {
  135.     set first [string index $line 0]
  136.     if {$first == "" || $first == "#"} continue
  137.     lappend lines $line
  138.     }
  139.     return $lines
  140. }
  141.  
  142. method CustSecHandler::readRoles {this} {
  143.     set roleInfo {}
  144.     set roleList {}
  145.     foreach line [$this readFile roles] {
  146.     set triple [split $line '|']
  147.     set len [llength $triple]
  148.     if {$len != 3} {
  149.         return "\
  150.         syntax of configuration file 'roles' invalid:\n\
  151.         line '$line' contains $len parts"
  152.     }
  153.     set roleName [string trim [lindex $triple 0]]
  154.     set phaseName [string trim [lindex $triple 1]]
  155.     set accessList [string trim [lindex $triple 2]]
  156.     foreach access $accessList {
  157.         case "$access" in {
  158.         {M m C c R r U u D d} {}
  159.         default {
  160.             return "\
  161.             syntax of configuration file 'roles' invalid:\n\
  162.             line '$line' contains invalid access '$access'"
  163.         }
  164.         }
  165.     }
  166.     if {! [info exists role($roleName)]} {
  167.         set role($roleName) 1
  168.         lappend roleList "$roleName"
  169.     }
  170.     lappend roleInfo [list "$roleName" "$phaseName" "$accessList"]
  171.     }
  172.     $this roleInfo $roleInfo
  173.     $this roleList $roleList
  174.     return ""
  175. }
  176.  
  177. method CustSecHandler::readUserRoles {this} {
  178.     set userRoleInfo {}
  179.     set userList {}
  180.     foreach line [$this readFile userroles] {
  181.     set userInfo {}
  182.     set tuple [split $line '|']
  183.     set len [llength $tuple]
  184.     if {$len != 2} {
  185.         return "\
  186.         syntax of configuration file 'userroles' invalid:\n\
  187.         line '$line' contains $len parts"
  188.     }
  189.     set roleName [string trim [lindex $tuple 0]]
  190.     if {[lsearch -exact "[$this roleList]" "$roleName"] == -1} {
  191.         return "\
  192.         syntax of configuration file 'userroles' invalid:\n\
  193.         line '$line' contains unknown role '$roleName'"
  194.     }
  195.     set userPartList [string trim [lindex $tuple 1]]
  196.     foreach userPart $userPartList {
  197.         set tuple [split $userPart ':']
  198.         set len [llength $tuple]
  199.         if {$len != 2} {
  200.         return "\
  201.             syntax of configuration file 'userroles' invalid:\n\
  202.             line '$line' contains invalid user part '$userPart'"
  203.         }
  204.         set userName [string trim [lindex $tuple 0]]
  205.         set indicator [string trim [lindex $tuple 1]]
  206.         case "$indicator" in {
  207.         {Y y N n} {}
  208.         default {
  209.             return "\
  210.             syntax of configuration file 'userroles' invalid:\n\
  211.             line '$line' contains invalid user part '$userPart'"
  212.         }
  213.         }
  214.         if {! [info exists user($userName)]} {
  215.         set user($userName) 1
  216.         lappend userList "$userName"
  217.         }
  218.         lappend userInfo [list "$userName" "$indicator"]
  219.     }
  220.     lappend userRoleInfo [list "$roleName" "$userInfo"]
  221.     }
  222.     $this userRoleInfo $userRoleInfo
  223.     $this userList $userList
  224.     return ""
  225. }
  226.  
  227. method CustSecHandler::addRoles {this} {
  228.     foreach roleName [$this roleList] {
  229.     if [[[$this corporate] findRole "$roleName"] isNil] {
  230.         puts "Creating Role '$roleName' ..."
  231.         [$this corporate] createRole "$roleName"
  232.     }
  233.     }
  234. }
  235.  
  236. method CustSecHandler::addUsers {this} {
  237.     foreach userName [$this userList] {
  238.     if [[[$this corporate] findUser "$userName"] isNil] {
  239.         puts "Creating User '$userName' ..."
  240.         [$this corporate] createUser "$userName"
  241.     }
  242.     }
  243. }
  244.  
  245. method CustSecHandler::addUserRoleLinks {this} {
  246.     foreach userRoleInfo [$this userRoleInfo] {
  247.     set roleName [lindex $userRoleInfo 0]
  248.     set role [[$this corporate] findRole "$roleName"]
  249.     foreach userInfo [lindex $userRoleInfo 1] {
  250.         set userName [lindex $userInfo 0]
  251.         set user [[$this corporate] findUser "$userName"]
  252.         case "[lindex $userInfo 1]" in {
  253.         {Y y} {
  254.             set use defaultOn
  255.         }
  256.         default {
  257.             set use defaultOff
  258.         }
  259.         }
  260.         set link [[$this project] findUserRoleLink $user $role]
  261.         set msg " link between User '$userName' and Role '$roleName' ..."
  262.         if [$link isNil] {
  263.         puts -nonewline "Creating"
  264.         puts $msg
  265.         [$this project] createUserRoleLink "$userName" $role $use
  266.         } else {
  267.         puts -nonewline "Updating"
  268.         puts $msg
  269.         $link use $use
  270.         }
  271.     }
  272.     }
  273. }
  274.  
  275. method CustSecHandler::setAccess {this obj roleName allowedMap prohibitedMap undefinedMap isList} {
  276.     if $isList {
  277.     $obj modifyNewChildRights \
  278.         "$roleName" $allowedMap $prohibitedMap $undefinedMap
  279.     }
  280.  
  281.     # Mask-out possible unvalid access rights
  282.     set controlledActions [$obj controlledActions]
  283.     set allowedMap [expr $controlledActions & $allowedMap]
  284.     set prohibitedMap [expr $controlledActions & $prohibitedMap]
  285.     set undefinedMap [expr $controlledActions & $undefinedMap]
  286.     $obj modifyPermission "$roleName" $allowedMap $prohibitedMap $undefinedMap
  287. }
  288.  
  289. method CustSecHandler::updateAccess {this} {
  290.     foreach link [[$this config] phaseVersionLinks] {
  291.     set phaseV [$link phaseVersion]
  292.     set phase [$phaseV phase]
  293.     set phaseName [$phase name]
  294.     puts "\tPhase $phaseName"
  295.     foreach roleInfo [$this roleInfo] {
  296.         if {! [string match "[lindex $roleInfo 1]" "$phaseName"]} continue
  297.         set roleName [lindex $roleInfo 0]
  298.         set accessList [lindex $roleInfo 2]
  299.         puts "\t\tSet access rights for Role '$roleName' to $accessList ..."
  300.         set allowedMap 0
  301.         foreach access $accessList {
  302.         set allowedMap \
  303.             [expr $allowedMap|[[$this allowedMap] set $access]]
  304.         }
  305.         set prohibitedMap [expr 1023 - $allowedMap]
  306.         $this setAccess $phaseV \
  307.         "$roleName" $allowedMap $prohibitedMap 0 0
  308.         $this setAccess [$phase phaseVersionList] \
  309.         "$roleName" $allowedMap $prohibitedMap 0 1
  310.         $this setAccess [$phaseV systemVersionLinkList] \
  311.         "$roleName" $allowedMap $prohibitedMap 0 1
  312.         $this setAccess [$phase systemList] \
  313.         "$roleName" $allowedMap $prohibitedMap 0 1
  314.     }
  315.     }
  316. }
  317.  
  318. # Do not delete this line -- regeneration end marker
  319.  
  320. method CustSecHandler::getAllowedMap {this access} {
  321.     return [[$this allowedMap] set $access]
  322. }
  323.  
  324. method CustSecHandler::setAllowedMap {this access newAllowedMap} {
  325.     [$this allowedMap] set $access $newAllowedMap
  326. }
  327.  
  328. method CustSecHandler::removeAllowedMap {this access} {
  329.     [$this allowedMap] unset $access
  330. }
  331.  
  332.