Project

General

Profile

Download (5.42 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/ 
9
package eu.etaxonomy.cdm.permission;
10

    
11
import java.io.Serializable;
12
import java.util.Collection;
13
import java.util.UUID;
14

    
15
import org.apache.log4j.Logger;
16
import org.springframework.security.access.PermissionEvaluator;
17
import org.springframework.security.core.Authentication;
18
import org.springframework.security.core.GrantedAuthority;
19

    
20
import eu.etaxonomy.cdm.model.common.CdmBase;
21
import eu.etaxonomy.cdm.model.common.User;
22
import eu.etaxonomy.cdm.model.description.DescriptionBase;
23
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
24
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
25

    
26
/**
27
 * @author k.luther
28
 * @date 06.07.2011
29
 */
30
public class CdmPermissionEvaluator implements PermissionEvaluator {
31
    protected static final Logger logger = Logger.getLogger(CdmPermissionEvaluator.class);
32

    
33
	
34
	
35

    
36
	public boolean hasPermission(Authentication authentication,
37
			Serializable targetId, String targetType, Object permission) {
38
		logger.info("hasPermission returns false");
39
		// TODO Auto-generated method stub
40
		return false;
41
	}
42

    
43

    
44
    public boolean hasPermission(Authentication authentication,
45
            Object targetDomainObject, Object permission) {
46
       
47
        CdmPermission cdmPermission;
48
		if (!(permission instanceof CdmPermission)){
49
			String permissionString = (String)permission;
50
			if (permissionString.equals("changePassword")){
51
				return (targetDomainObject.equals(((User)authentication.getPrincipal()).getUsername()));
52
			}
53
			cdmPermission = CdmPermission.valueOf(permissionString);
54
		}else {
55
			cdmPermission = (CdmPermission)permission;
56
		}
57
        Collection<GrantedAuthority> authorities = ((User)authentication.getPrincipal()).getAuthorities();
58
        AuthorityPermission evalPermission;
59
        try{
60
        	//evalPermission = new AuthorityPermission(targetDomainObject.getClass().getSimpleName().toUpperCase(), cdmPermission, ((CdmBase)targetDomainObject).getUuid());
61
        	evalPermission = new AuthorityPermission(targetDomainObject, cdmPermission, ((CdmBase)targetDomainObject).getUuid());
62
        }catch(NullPointerException e){
63
        	//evalPermission = new AuthorityPermission(targetDomainObject.getClass().getSimpleName().toUpperCase(), cdmPermission, null);
64
        	evalPermission = new AuthorityPermission(targetDomainObject, cdmPermission, null);
65
        }
66
        	//FIXME this is a workaround until the concept of CdmPermissionClass is finally discussed
67
		if (evalPermission.className != null) {
68
			return evalPermission(authorities, evalPermission,
69
					(CdmBase) targetDomainObject);
70
			/*if (evalPermission.className.equals(CdmPermissionClass.USER)) {
71
				return evalPermission(authorities, evalPermission,
72
						(CdmBase) targetDomainObject);
73
			} else {
74
				return true;
75
			}*/
76
		}else{
77
			//FIXME this is a workaround until the concept of CdmPermissionClass is finally discussed
78
			//see also AuthorityPermission constructor
79
			return true;
80
		}
81
        
82
    }
83

    
84
    private TaxonNode findTargetUuidInTree(UUID targetUuid, TaxonNode node){
85
        if (targetUuid.equals(node.getUuid()))
86
            return node;
87
        else if (node.getParent()!= null){
88
             return findTargetUuidInTree(targetUuid, node.getParent());
89
        }
90
        return null;
91
    }
92

    
93

    
94
    public boolean evalPermission(Collection<GrantedAuthority> authorities, AuthorityPermission evalPermission, CdmBase targetDomainObject){
95

    
96
    	if (targetDomainObject instanceof DescriptionElementBase){
97
    		return DescriptionPermissionEvaluator.hasPermission(authorities, (DescriptionElementBase)targetDomainObject, evalPermission);
98
    	}
99
        for (GrantedAuthority authority: authorities){
100
            AuthorityPermission authorityPermission= new AuthorityPermission(authority.getAuthority());
101
            //evaluate authorities
102
            if (authorityPermission.className.equals(evalPermission.className) && (authorityPermission.permission.equals(evalPermission.permission)|| authorityPermission.permission.equals(CdmPermission.ADMIN))){
103
                if (authorityPermission.targetUuid != null){
104
                    //TODO
105

    
106
                }else{
107
                    return true;
108
                }
109

    
110
            }
111

    
112
            if (authorityPermission.targetUuid != null){
113
                if (authorityPermission.targetUuid.equals(((CdmBase)targetDomainObject).getUuid())){
114
                    if (authorityPermission.permission.equals(evalPermission.permission)){
115
                        return true;
116
                    }
117
                }
118
            }
119
            if (authorityPermission.className.equals(CdmPermissionClass.TAXONNODE) && targetDomainObject.getClass().getSimpleName().toUpperCase().equals(CdmPermissionClass.TAXONNODE.toString())){
120
               
121
                TaxonNode node = (TaxonNode)targetDomainObject;
122
                TaxonNode targetNode = findTargetUuidInTree(authorityPermission.targetUuid, node);
123
                if (targetNode != null){
124
                    if (evalPermission.permission.equals(authorityPermission.permission) ){
125
                        return true;
126
                    }
127
                }
128
            }
129
           
130

    
131
        }
132
        return false;
133
    }
134

    
135
}
(4-4/6)