1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.voting.voters;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.context.WebContext;
39
40 import java.util.ArrayList;
41 import java.util.List;
42
43 import javax.servlet.http.HttpServletRequest;
44
45
46
47
48
49
50
51
52 public class UserAgentVoter extends AbstractBoolVoter {
53 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserAgentVoter.class);
54
55 private final List<String> allowed = new ArrayList<String>();
56 private final List<String> rejected = new ArrayList<String>();
57
58 public List<String> getAllowed() {
59 return allowed;
60 }
61
62 public void setAllowed(List<String> allowed) {
63 this.allowed.addAll(allowed);
64 }
65
66 public void addAllowed(String contentType) {
67 allowed.add(contentType);
68 }
69
70 public List<String> getRejected() {
71 return rejected;
72 }
73
74 public void setRejected(List<String> rejected) {
75 this.rejected.addAll(rejected);
76 }
77
78 public void addRejected(String contentType) {
79 rejected.add(contentType);
80 }
81
82 @Override
83 protected boolean boolVote(Object value) {
84 final HttpServletRequest request;
85 if (value instanceof HttpServletRequest) {
86 request = (HttpServletRequest) value;
87 } else {
88 final Context ctx = MgnlContext.getInstance();
89 if (ctx instanceof WebContext) {
90 request = ((WebContext) ctx).getRequest();
91 } else {
92 return false;
93 }
94 }
95
96 final String userAgent = request.getHeader("User-Agent");
97
98
99 if (userAgent == null) {
100 log.warn("No user agent on the request, can't vote.");
101 return false;
102 }
103 if (allowed.size() > 0 && !matches(allowed, userAgent)) {
104 return false;
105 }
106 if (rejected.size() > 0 && matches(rejected, userAgent)) {
107 return false;
108 }
109 return true;
110 }
111
112
113
114
115
116
117
118 private boolean matches(List patterns, String userAgent) {
119 for (int i = 0; i < patterns.size(); i++) {
120 if (userAgent.matches((String) patterns.get(i))) {
121 return true;
122 }
123 }
124 return false;
125 }
126 }