1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.security;
21
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import javax.el.ELContext;
26 import javax.el.MethodExpression;
27 import javax.el.MethodInfo;
28 import javax.faces.application.FacesMessage;
29 import javax.faces.component.StateHolder;
30 import javax.faces.component.UIComponentBase;
31 import javax.faces.context.FacesContext;
32
33 public class CheckAuthorisationMethodExpression extends MethodExpression implements StateHolder {
34 private static final Logger LOG = LoggerFactory.getLogger(CheckAuthorisationMethodExpression.class);
35
36 private MethodExpression methodExpression;
37
38 public CheckAuthorisationMethodExpression() {
39 }
40
41 public CheckAuthorisationMethodExpression(MethodExpression methodExpression) {
42 this.methodExpression = methodExpression;
43 }
44
45 @Override
46 public MethodInfo getMethodInfo(ELContext context) {
47 return methodExpression.getMethodInfo(context);
48 }
49
50 @Override
51 public Object invoke(ELContext context, Object[] objects) {
52 if (LOG.isDebugEnabled()) {
53 LOG.debug("MethodBinding invoke " + getExpressionString());
54 }
55
56 if ((objects!=null && objects.length > 0)
57 || AuthorizationUtils.isAuthorized(FacesContext.getCurrentInstance(), getExpressionString())) {
58 return methodExpression.invoke(context, objects);
59 } else {
60
61 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Not authorised"));
62 return null;
63 }
64 }
65
66 @Override
67 public String getExpressionString() {
68 return methodExpression.getExpressionString();
69 }
70
71 @Override
72 public boolean equals(Object obj) {
73 return methodExpression.equals(obj);
74 }
75
76 @Override
77 public int hashCode() {
78 return methodExpression.hashCode();
79 }
80
81 @Override
82 public boolean isLiteralText() {
83 return methodExpression.isLiteralText();
84 }
85
86 public Object saveState(FacesContext facesContext) {
87 Object[] saveState = new Object[1];
88 saveState[0] = UIComponentBase.saveAttachedState(facesContext, methodExpression);
89 return saveState;
90 }
91
92 public void restoreState(FacesContext facesContext, Object savedState) {
93 Object[] values = (Object[]) savedState;
94 methodExpression = (MethodExpression) UIComponentBase.restoreAttachedState(facesContext, values[0]);
95 }
96
97 public boolean isTransient() {
98 return methodExpression instanceof StateHolder && ((StateHolder) methodExpression).isTransient();
99 }
100
101 public void setTransient(boolean bool) {
102 if (methodExpression instanceof StateHolder) {
103 ((StateHolder) methodExpression).setTransient(bool);
104 }
105 }
106
107 public boolean isAuthorized(FacesContext facesContext) {
108 return AuthorizationUtils.isAuthorized(facesContext, getExpressionString());
109 }
110 }