; 1d?Z)d@Z*ddAZ+eidBdCZ,ei dDdEZ-RS(Fsz Base class for all GRUF-catched User objects. There's, alas, many copy/paste from AccessControl.BasicUser... s_setUnderlyingcCsX|i|_|i|_|i|_|i|_ |i |_ ||_ dS(s _setUnderlying(self, user) => Set the GRUFUser properties to the underlying user's one. Be careful that any change to the underlying user won't be reported here. $$$ We don't know yet if User object are transaction-persistant or not... N( susers getUserNamesselfs_original_names _getPasswords_original_passwordsgetRoless_original_roless getDomainss_original_domainssgetIds _original_ids__underlying__(sselfsuser((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys_setUnderlying>ss__init__cCsB|i|||_||_||_|i |_ |i dS(N( sselfs_setUnderlyingsunderlying_usersisGroups_isGroupsGRUFs_GRUFs source_ids _source_ids _original_idsidsclearCachedGroupsAndRoles(sselfsunderlying_usersGRUFsisGroups source_id((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys__init__^s      sclearCachedGroupsAndRolescCsIt|_t|_t|_t|_|o|i|nt|_dS(N( sNonesselfs_groupss _user_roless _group_roless _all_rolessunderlying_users_setUnderlyings_original_user_roles(sselfsunderlying_user((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysclearCachedGroupsAndRolesks    sisGroupcCs |iSdS(s,Return 1 if this user is a group abstractionN(sselfs_isGroup(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysisGroupussgetUserSourceIdcCs |iSdS(sv getUserSourceId(self,) => string Return the GRUF's GRUFUsers folder used to fetch this user. N(sselfs _source_id(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetUserSourceIdzss getGroupNamescCs&|idd}td|SdS(s...s no_recurseicCs|tS(N(sxsGROUP_PREFIX_LEN(sx((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pyssN(sselfs _getGroupssretsmap(sselfsret((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getGroupNamesss getGroupIdscCst|iddSdS(s...s no_recurseiN(slistsselfs _getGroups(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getGroupIdsss getAllGroupscCs|iSdS(sSame as getAllGroupNames()N(sselfsgetAllGroupIds(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getAllGroupsssgetAllGroupNamescCs |i}td|SdS(s...cCs|tS(N(sxsGROUP_PREFIX_LEN(sx((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pyssN(sselfs _getGroupssretsmap(sselfsret((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetAllGroupNamess sgetAllGroupIdscCst|iSdS(s...N(slistsselfs _getGroups(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetAllGroupIdsss getGroupscOs |i||}t|SdS(s...N(sselfs _getGroupssargsskwsretslist(sselfsargsskwsret((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getGroupsssgetImmediateGroupscCs |idd}t|SdS(s. Return NON-TRANSITIVE groups s no_recurseiN(sselfs _getGroupssretslist(sselfsret((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetImmediateGroupssicCs3|itj o |iSn|itjo|ii|_ng}x|iD]}|i|o|i o ||joqQn|i i |}| oqQn||joqQn|i||oqQnx=|id|D]%}||j o|i|qqWqQqQWt||_|iSdS(s getGroups(self, no_recurse = 0, already_done = [], prefix = GROUP_PREFIX) => list of strings If this user is a user (uh, uh), get its groups. THIS METHODS NOW SUPPORTS NESTED GROUPS ! :-) The already_done parameter prevents infite recursions. Keep it as it is, never give it a value. If no_recurse is true, return only first level groups This method is private and should remain so. s already_doneN(sselfs_groupssNones_original_user_roless__underlying__sgetRolessretsroles startswithsprefixs_isGroups already_dones aq_parentsgetUsersgrpsappends no_recurses getGroupssextendstuple(sselfs no_recurses already_donesprefixsextendsgrpsretsrole((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys _getGroupss2     sgetGroupsWithoutPrefixcKsSg}xB|i|D]1}|ito|i|ttqqW|SdS(sE Same as getGroups but return them without a prefix. N( sretsselfs getGroupsskwsgroups startswiths GROUP_PREFIXsappendslen(sselfskwsgroupsret((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetGroupsWithoutPrefixssgetUserNameWithoutGroupPrefixcCsG|io|itt tjo|ittSn|iSdS(s4Return the username of a user without a group prefixN(sselfsisGroups_original_nameslens GROUP_PREFIX(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetUserNameWithoutGroupPrefixs's getUserIdcCsH|io|itt tj odt|ifSn|iSdS(sReturn the user id of a users%s%sN(sselfsisGroups_original_nameslens GROUP_PREFIX(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getUserIds(sgetNamecCs|iSdS(sGet user's or group's name. For a user, the name can be set by the underlying user folder but usually id == name. For a group, the ID is prefixed, but the NAME is NOT prefixed by 'group_'. N(sselfsgetUserNameWithoutGroupPrefix(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetNamess getUserNamecCs|iSdS(sAlias for getName()N(sselfsgetUserNameWithoutGroupPrefix(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getUserNamessgetIdcCsI|io|iit o| odt|ifSn|iSdS(sGet the ID of the user. The ID can be used, at least from Python, to get the user from the user's UserDatabase s%s%sN(sselfsisGroups_original_names startswiths GROUP_PREFIXs unprefixed(sselfs unprefixed((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetId s)sgetRolescCsH|itj o |iSnti|i|i|_|iSdS(st Return the list (tuple) of roles assigned to a user. THIS IS WHERE THE ATHENIANS REACHED ! N(sselfs _all_rolessNonesGroupUserFoldersuniques getUserRoless getGroupRoles(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysgetRoless  "s getUserRolescCs|itj o |iSnt}|itjo|ii|_ntgi }|iD]%}|i | o||q[q[~|_|iSdS(sP returns the roles defined for the user without the group roles N( sselfs _user_rolessNones GROUP_PREFIXsprefixs_original_user_roless__underlying__sgetRolesstuplesappends_[1]srs startswith(sselfs_[1]sprefixsr((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getUserRoles!s Hs getGroupRolescCs|itj o |iSng}|ii}|i}xU|iD]G}||j ot d|dqFn|i |i |i qFWti||_|iSdS(sM Return the tuple of roles belonging to this user's group(s) sGroupsis invalid. Ignoring.N(sselfs _group_rolessNonesrets_GRUFs acl_userss getGroupIdssgroupss getGroupssgroupsLogsextendsgetGroups getUserRolessGroupUserFoldersunique(sselfsgroupsrets acl_userssgroups((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getGroupRoles.s     sgetRolesInContextc Cs| o|i}nh}x|iD]}d|| return property value or raise AttributeError N(sgetattrsselfs__underlying__snames_markersvsAttributeError(sselfsnamesdefaultsv((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getPropertys   s hasPropertycCst|i|SdS(s hasPropertyN(shasattrsselfs__underlying__sname(sselfsname((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys hasPropertyss setPropertycCs|ii|i}| otd|ifnt|dot}xY|i i D]E}|d|jo|d}n|d|jo|d}PqcqcW|tjotd|fn|i|i}|i||||i|i|_|i otd|ifq6n|i| otd|fn|ii|ii|}||j o7ttd||i||ftd|fnd S( sisetProperty => Try to set the property... By now, it's available only for LDAPUserFolder s(Invalid or missing user source for '%s'.smanage_setUserPropertys ldap_names public_namesInvalid LDAP attribute: '%s'.s%Error while setting property of '%s'.s+Property setting is not supported for '%s'.s7Property '%s' for user '%s' should be '%s' and not '%s'N(sselfs_GRUFs getUserSourcesgetUserSourceIdssrcs RuntimeErrorsgetIdshasattrsNonesldapnamesgetSchemaConfigsvaluessschemasnamesKeyErrors _find_user_dns getUserNamesuser_dnsmanage_setUserPropertysvaluesgetUsers__underlying__s hasPropertysNotImplementedErrors getUserByIds getPropertysvsLogs LOG_DEBUG(sselfsnamesvaluessrcsuser_dnsldapnamesvsschema((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys setPropertys4    !#s authenticatecCs)|iotSn|ii||SdS(N(sselfs_isGroupsNones__underlying__s authenticatespasswordsrequest(sselfspasswordsrequest((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys authenticates sallowedcCs|tjodSn|tjp d|jodSnd|jo|idjodSnd|jo5|i|}|tjp d|jodSqnh} x|D]}d| | HTML string Used to generate homogeneous links for management screens sGroupsUsersL%(name)sscolorshrefs%s/%s/manage_workspacesnamesalts%s (%s)s %sN( sselfs acl_userssisGroups group_colorscolorskinds user_colors absolute_urlsgetIdsgetUserNameWithoutGroupPrefixsretsimplicit(sselfsimplicitskindscolorsrets acl_users((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysasHTMLJs     Z s isInGroupcCs||ijSdS(saReturn true if the user is member of the specified group id (including transitive groups)N(sgroupidsselfsgetAllGroupIds(sselfsgroupid((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys isInGroupcss getRealIdcCs tddS(s'Return id WITHOUT group prefix sMust be derived in subclassesN(sNotImplementedError(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getRealIdis(.s__name__s __module__s__doc__sClassSecurityInfossecuritysdeclarePrivates_setUnderlyings__init__sNonesclearCachedGroupsAndRoless declarePublicsisGroupsgetUserSourceIds getGroupNamess getGroupIdss getAllGroupssgetAllGroupNamessgetAllGroupIdss getGroupssgetImmediateGroupss GROUP_PREFIXs _getGroupssgetGroupsWithoutPrefixsgetUserNameWithoutGroupPrefixs getUserIdsgetNames getUserNamesgetIdsgetRoless getUserRoless getGroupRolessgetRolesInContexts getDomainss_markers getPropertys hasPropertys setPropertys authenticatesallowedshasRoles __getattr__sgetUnwrappedUsers __getitem__sasHTMLs isInGroups getRealId(((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys GRUFUserAtom6s                        7                4       /    Z         sGRUFUsercBs>tZdZefZeZeiddZei ddZ ei ddZ ei ddZ ei d d Z ei d d Zei d dZei ddZei ddZei ddZei ddZei ddZeiddZRS(s3 This is the class for actual user objects schangePasswordcCsti}|iti|i oK|ii djo ddn|i |i j o ddqtn|i |ii |i |SdS(sESet the user's password. This method performs its own security checkssGRUFUsers Unauthorizeds*You cannot change someone else's password.N(sgetSecurityManagersgetUsersusershas_permissions Permissionss manage_userssselfs_GRUFs __class__s__name__sgetIdsclearCachedGroupsAndRolessuserSetPasswordspassword(sselfspasswordsuser((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pyschangePassword|s  ssetRolescCs'|i|ii|i|SdS(s)Change the roles of a user atom. N(sselfsclearCachedGroupsAndRoless_GRUFs userSetRolessgetIdsroles(sselfsroles((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pyssetRoless saddRolecCs'|i|ii|i|SdS(s&Append a role for a user atom N(sselfsclearCachedGroupsAndRoless_GRUFs userAddRolesgetIdsrole(sselfsrole((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysaddRoles s removeRolecCs'|i|ii|i|SdS(s'Remove the role of a user atom N(sselfsclearCachedGroupsAndRoless_GRUFsuserRemoveRolesgetIdsrole(sselfsrole((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys removeRoles s setPasswordcCs'|i|ii|i|SdS(s#Set the password of a user N(sselfsclearCachedGroupsAndRoless_GRUFsuserSetPasswordsgetIds newPassword(sselfs newPassword((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys setPasswords s setDomainscCsB|i|ii|i||ii|i|_dS(sSet domains for a user N(sselfsclearCachedGroupsAndRoless_GRUFsuserSetDomainssgetIdsdomainssuserGetDomainss_original_domains(sselfsdomains((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys setDomainss s addDomaincCsB|i|ii|i||ii|i|_dS(s"Append a domain to a user N(sselfsclearCachedGroupsAndRoless_GRUFs userAddDomainsgetIdsdomainsuserGetDomainss_original_domains(sselfsdomain((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys addDomains s removeDomaincCsB|i|ii|i||ii|i|_dS(s$Remove a domain from a user N(sselfsclearCachedGroupsAndRoless_GRUFsuserRemoveDomainsgetIdsdomainsuserGetDomainss_original_domains(sselfsdomain((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys removeDomains s setGroupscCs'|i|ii|i|SdS(s!Set the groups of a user N(sselfsclearCachedGroupsAndRoless_GRUFs userSetGroupssgetIds groupnames(sselfs groupnames((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys setGroupss saddGroupcCs'|i|ii|i|SdS(s#add a group to a user atom N(sselfsclearCachedGroupsAndRoless_GRUFs userAddGroupsgetIds groupname(sselfs groupname((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysaddGroups s removeGroupcCs'|i|ii|i|SdS(s)remove a group from a user atom. N(sselfsclearCachedGroupsAndRoless_GRUFsuserRemoveGroupsgetIds groupname(sselfs groupname((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys removeGroups s _getPasswordcCs |iSdS(s Return the password of the user.N(sselfs_original_password(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys _getPasswordss getRealIdcCs|iSdS(s'Return id WITHOUT group prefix N(sselfsgetId(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getRealIds(s__name__s __module__s__doc__sIUsers__implements__sClassSecurityInfossecuritys declarePublicschangePasswordsdeclarePrivatessetRolessaddRoles removeRoles setPasswords setDomainss addDomains removeDomains setGroupssaddGroups removeGroups _getPasswords getRealId(((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pysGRUFUseros:                            s GRUFGroupcBstZdZefZeZeiddZddddZ ei dddZ ei dddZ ei d dd Z ei d d Zei d dZei ddZei ddZRS(s4 This is the class for actual group objects s getRealIdcCs|ittSdS(s-Return group id WITHOUT group prefix N(sselfsgetIdslens GROUP_PREFIX(sself((sL/mnt/gmirror/ports/www/zope-groupuserfolder/work/GroupUserFolder/GRUFUser.pys getRealIdsic Cs|i}|o d} nd} |o| o|i}n,|o| o|i }n |i }|i }h}xY|D]Q} |i| } | og||