allow blocking of security acquisition by option; try to keep current role permission setting on object if any
This commit is contained in:
		
							parent
							
								
									c3b9e1b665
								
							
						
					
					
						commit
						8d66ee3830
					
				
					 2 changed files with 21 additions and 3 deletions
				
			
		|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2013 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2015 Helmut Merz helmutm@cy55.de | ||||||
| # | # | ||||||
| #  This program is free software; you can redistribute it and/or modify | #  This program is free software; you can redistribute it and/or modify | ||||||
| #  it under the terms of the GNU General Public License as published by | #  it under the terms of the GNU General Public License as published by | ||||||
|  | @ -71,6 +71,8 @@ def getOption(obj, option, checkType=True): | ||||||
|     opts = component.queryAdapter(adapted(obj), IOptions) |     opts = component.queryAdapter(adapted(obj), IOptions) | ||||||
|     if opts is not None: |     if opts is not None: | ||||||
|         opt = opts(option, None) |         opt = opts(option, None) | ||||||
|  |         if opt is True: | ||||||
|  |             return opt | ||||||
|         if opt: |         if opt: | ||||||
|             return opt[0] |             return opt[0] | ||||||
|     if not checkType: |     if not checkType: | ||||||
|  | @ -79,7 +81,9 @@ def getOption(obj, option, checkType=True): | ||||||
|     if typeMethod is not None: |     if typeMethod is not None: | ||||||
|         opts = component.queryAdapter(adapted(typeMethod()), IOptions) |         opts = component.queryAdapter(adapted(typeMethod()), IOptions) | ||||||
|         if opts is not None: |         if opts is not None: | ||||||
|             opt = opts(option, [None]) |             opt = opts(option, None) | ||||||
|  |             if opt is True: | ||||||
|  |                 return opt | ||||||
|             if opt: |             if opt: | ||||||
|                 return opt[0] |                 return opt[0] | ||||||
|     return None |     return None | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2013 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2015 Helmut Merz helmutm@cy55.de | ||||||
| # | # | ||||||
| #  This program is free software; you can redistribute it and/or modify | #  This program is free software; you can redistribute it and/or modify | ||||||
| #  it under the terms of the GNU General Public License as published by | #  it under the terms of the GNU General Public License as published by | ||||||
|  | @ -39,6 +39,7 @@ from loops.interfaces import IConceptSchema, IBaseResourceSchema, ILoopsAdapter | ||||||
| from loops.organize.util import getPrincipalFolder, getGroupsFolder, getGroupId | from loops.organize.util import getPrincipalFolder, getGroupsFolder, getGroupId | ||||||
| from loops.security.common import overrides, setRolePermission, setPrincipalRole | from loops.security.common import overrides, setRolePermission, setPrincipalRole | ||||||
| from loops.security.common import allRolesExceptOwner, acquiringPredicateNames | from loops.security.common import allRolesExceptOwner, acquiringPredicateNames | ||||||
|  | from loops.security.common import getOption | ||||||
| from loops.security.interfaces import ISecuritySetter | from loops.security.interfaces import ISecuritySetter | ||||||
| from loops.versioning.interfaces import IVersionable | from loops.versioning.interfaces import IVersionable | ||||||
| 
 | 
 | ||||||
|  | @ -55,10 +56,18 @@ class BaseSecuritySetter(object): | ||||||
|     def baseObject(self): |     def baseObject(self): | ||||||
|         return baseObject(self.context) |         return baseObject(self.context) | ||||||
| 
 | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def adapted(self): | ||||||
|  |         return adapted(self.context) | ||||||
|  | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def conceptManager(self): |     def conceptManager(self): | ||||||
|         return self.baseObject.getLoopsRoot().getConceptManager() |         return self.baseObject.getLoopsRoot().getConceptManager() | ||||||
| 
 | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def options(self): | ||||||
|  |         return IOptions(self.adapted) | ||||||
|  | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def typeOptions(self): |     def typeOptions(self): | ||||||
|         type = self.baseObject.getType() |         type = self.baseObject.getType() | ||||||
|  | @ -133,9 +142,14 @@ class LoopsObjectSecuritySetter(BaseSecuritySetter): | ||||||
| 
 | 
 | ||||||
|     def acquireRolePermissions(self): |     def acquireRolePermissions(self): | ||||||
|         settings = {} |         settings = {} | ||||||
|  |         rpm = self.rolePermissionManager | ||||||
|  |         for p, r, s in rpm.getRolesAndPermissions(): | ||||||
|  |             settings[(p, r)] = s | ||||||
|         for p in self.parents: |         for p in self.parents: | ||||||
|             if p == self.baseObject: |             if p == self.baseObject: | ||||||
|                 continue |                 continue | ||||||
|  |             if getOption(p, 'security.no_propagate', checkType=False): | ||||||
|  |                 continue | ||||||
|             secProvider = p |             secProvider = p | ||||||
|             wi = p.workspaceInformation |             wi = p.workspaceInformation | ||||||
|             if wi: |             if wi: | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue