1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.portal.servlet;
16  
17  import com.liferay.portal.kernel.servlet.BrowserSniffer;
18  import com.liferay.portal.kernel.servlet.HttpHeaders;
19  import com.liferay.portal.kernel.util.GetterUtil;
20  import com.liferay.portal.kernel.util.StringPool;
21  
22  import java.util.regex.Matcher;
23  import java.util.regex.Pattern;
24  
25  import javax.servlet.http.HttpServletRequest;
26  
27  /**
28   * <a href="BrowserSnifferImpl.java.html"><b><i>View Source</i></b></a>
29   *
30   * See http://www.zytrax.com/tech/web/browser_ids.htm for examples.
31   *
32   * @author Eduardo Lundgren
33   * @author Nate Cavanaugh
34   */
35  public class BrowserSnifferImpl implements BrowserSniffer {
36  
37      public boolean acceptsGzip(HttpServletRequest request) {
38          String acceptEncoding = request.getHeader(HttpHeaders.ACCEPT_ENCODING);
39  
40          if ((acceptEncoding != null) && acceptEncoding.contains("gzip")) {
41              return true;
42          }
43          else {
44              return false;
45          }
46      }
47  
48      public String getBrowserId(HttpServletRequest request) {
49          if (isIe(request)) {
50              return BROWSER_ID_IE;
51          }
52          else if (isFirefox(request)) {
53              return BROWSER_ID_FIREFOX;
54          }
55          else {
56              return BROWSER_ID_OTHER;
57          }
58      }
59  
60      public float getMajorVersion(HttpServletRequest request) {
61          float majorVersion = 0;
62  
63          String version = getVersion(request);
64  
65          Matcher matcher = _majorVersionPattern.matcher(version);
66  
67          if (matcher.find()) {
68              majorVersion = GetterUtil.getFloat(matcher.group(1));
69          }
70  
71          return majorVersion;
72      }
73  
74      public String getRevision(HttpServletRequest request) {
75          String revision = StringPool.BLANK;
76  
77          String userAgent = getUserAgent(request);
78  
79          Matcher matcher = _revisionPattern.matcher(userAgent);
80  
81          if (matcher.find()) {
82              revision = matcher.group(1);
83          }
84  
85          return revision;
86      }
87  
88      public String getVersion(HttpServletRequest request) {
89          String userAgent = getUserAgent(request);
90  
91          String version = StringPool.BLANK;
92  
93          Matcher matcher = _versionPattern.matcher(userAgent);
94  
95          if (matcher.find()) {
96              version = matcher.group(1);
97          }
98          else if (isFirefox(request)) {
99              Matcher versionFirefoxMatcher = _versionFirefoxPattern.matcher(
100                 userAgent);
101 
102             if (versionFirefoxMatcher.find()) {
103                 version = versionFirefoxMatcher.group(1);
104             }
105         }
106         else if (isChrome(request)) {
107             Matcher versionChromeMatcher = _versionChromePattern.matcher(
108                 userAgent);
109 
110             if (versionChromeMatcher.find()) {
111                 version = versionChromeMatcher.group(1);
112             }
113         }
114         else {
115             version = getRevision(request);
116         }
117 
118         return version;
119     }
120 
121     public boolean isAir(HttpServletRequest request) {
122         String userAgent = getUserAgent(request);
123 
124         if (userAgent.contains("adobeair")) {
125             return true;
126         }
127 
128         return false;
129     }
130 
131     public boolean isChrome(HttpServletRequest request) {
132         String userAgent = getUserAgent(request);
133 
134         if (userAgent.contains("chrome")) {
135             return true;
136         }
137 
138         return false;
139     }
140 
141     public boolean isFirefox(HttpServletRequest request) {
142         if (!isMozilla(request)) {
143             return false;
144         }
145 
146         String userAgent = getUserAgent(request);
147 
148         for (String firefoxAlias : _FIREFOX_ALIASES) {
149             if (userAgent.contains(firefoxAlias)) {
150                 return true;
151             }
152         }
153 
154         return false;
155     }
156 
157     public boolean isGecko(HttpServletRequest request) {
158         String userAgent = getUserAgent(request);
159 
160         if (userAgent.contains("gecko")) {
161             return true;
162         }
163 
164         return false;
165     }
166 
167     public boolean isIe(HttpServletRequest request) {
168         String userAgent = getUserAgent(request);
169 
170         if (userAgent.contains("msie") && !userAgent.contains("opera")) {
171             return true;
172         }
173 
174         return false;
175     }
176 
177     public boolean isIphone(HttpServletRequest request) {
178         String userAgent = getUserAgent(request);
179 
180         if (userAgent.contains("iphone")) {
181             return true;
182         }
183 
184         return false;
185     }
186 
187     public boolean isLinux(HttpServletRequest request) {
188         String userAgent = getUserAgent(request);
189 
190         if (userAgent.contains("linux")) {
191             return true;
192         }
193 
194         return false;
195     }
196 
197     public boolean isMac(HttpServletRequest request) {
198         String userAgent = getUserAgent(request);
199 
200         if (userAgent.contains("mac")) {
201             return true;
202         }
203 
204         return false;
205     }
206 
207     public boolean isMobile(HttpServletRequest request) {
208         String userAgent = getUserAgent(request);
209 
210         if (userAgent.contains("mobile")) {
211             return true;
212         }
213 
214         return false;
215     }
216 
217     public boolean isMozilla(HttpServletRequest request) {
218         String userAgent = getUserAgent(request);
219 
220         if (userAgent.contains("mozilla") &&
221             !userAgent.matches("compatible|webkit")) {
222 
223             return true;
224         }
225 
226         return false;
227     }
228 
229     public boolean isOpera(HttpServletRequest request) {
230         String userAgent = getUserAgent(request);
231 
232         if (userAgent.contains("opera")) {
233             return true;
234         }
235 
236         return false;
237     }
238 
239     public boolean isRtf(HttpServletRequest request) {
240         float majorVersion = getMajorVersion(request);
241 
242         if (isIe(request) && (majorVersion >= 5.5)) {
243             return true;
244         }
245 
246         if (isMozilla(request) && (majorVersion >= 1.3)) {
247             return true;
248         }
249 
250         if (isSafari(request) && (majorVersion >= 3.0) && !isMobile(request)) {
251             return true;
252         }
253 
254         return false;
255     }
256 
257     public boolean isSafari(HttpServletRequest request) {
258         String userAgent = getUserAgent(request);
259 
260         if (isWebKit(request) && userAgent.contains("safari")) {
261             return true;
262         }
263 
264         return false;
265     }
266 
267     public boolean isSun(HttpServletRequest request) {
268         String userAgent = getUserAgent(request);
269 
270         if (userAgent.contains("sunos")) {
271             return true;
272         }
273 
274         return false;
275     }
276 
277     public boolean isWap(HttpServletRequest request) {
278         return isWapXhtml(request);
279     }
280 
281     public boolean isWapXhtml(HttpServletRequest request) {
282         String accept = getAccept(request);
283 
284         if (accept.contains("wap.xhtml")) {
285             return true;
286         }
287 
288         return false;
289     }
290 
291     public boolean isWebKit(HttpServletRequest request) {
292         String userAgent = getUserAgent(request);
293 
294         for (String webKitAlias : _WEBKIT_ALIASES) {
295             if (userAgent.contains(webKitAlias)) {
296                 return true;
297             }
298         }
299 
300         return false;
301     }
302 
303     public boolean isWindows(HttpServletRequest request) {
304         String userAgent = getUserAgent(request);
305 
306         for (String windowsAlias : _WINDOWS_ALIASES) {
307             if (userAgent.contains(windowsAlias)) {
308                 return true;
309             }
310         }
311 
312         return false;
313     }
314 
315     public boolean isWml(HttpServletRequest request) {
316         String accept = getAccept(request);
317 
318         if (accept.contains("wap.wml")) {
319             return true;
320         }
321 
322         return false;
323     }
324 
325     protected String getAccept(HttpServletRequest request) {
326         String accept = StringPool.BLANK;
327 
328         if (request != null) {
329             accept = (String)request.getAttribute(HttpHeaders.ACCEPT);
330 
331             if (accept == null) {
332                 String acceptHeader = request.getHeader(HttpHeaders.ACCEPT);
333 
334                 if (acceptHeader != null) {
335                     accept = acceptHeader.toLowerCase();
336                 }
337                 else {
338                     accept = StringPool.BLANK;
339                 }
340 
341                 request.setAttribute(HttpHeaders.ACCEPT, accept);
342             }
343         }
344 
345         return accept;
346     }
347 
348     protected String getUserAgent(HttpServletRequest request) {
349         String userAgent = StringPool.BLANK;
350 
351         if (request != null) {
352             userAgent = (String)request.getAttribute(HttpHeaders.USER_AGENT);
353 
354             if (userAgent == null) {
355                 String userAgentHeader = request.getHeader(
356                     HttpHeaders.USER_AGENT);
357 
358                 if (userAgentHeader != null) {
359                     userAgent = userAgentHeader.toLowerCase();
360                 }
361                 else {
362                     userAgent = StringPool.BLANK;
363                 }
364 
365                 request.setAttribute(HttpHeaders.USER_AGENT, userAgent);
366             }
367         }
368 
369         return userAgent;
370     }
371 
372     private static final String[] _FIREFOX_ALIASES = {
373         "firefox", "minefield", "granparadiso", "bonecho", "firebird",
374         "phoenix", "camino"
375     };
376 
377     private static final String[] _WEBKIT_ALIASES = {"khtml", "applewebkit"};
378 
379     private static final String[] _WINDOWS_ALIASES = {
380         "windows", "win32", "16bit"
381     };
382 
383     private static Pattern _majorVersionPattern = Pattern.compile(
384         "(\\d+[.]\\d+)");
385     private static Pattern _revisionPattern = Pattern.compile(
386         "(?:rv|it|ra|ie)[\\/: ]([\\d.]+)");
387     private static Pattern _versionChromePattern = Pattern.compile(
388         "(?:chrome)[\\/]([\\d.]+)");
389     private static Pattern _versionFirefoxPattern = Pattern.compile(
390         "(?:firefox|minefield)[\\/]([\\d.]+)");
391     private static Pattern _versionPattern = Pattern.compile(
392         "(?:version)[\\/]([\\d.]+)");
393 
394 }