1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
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) &&
41              (acceptEncoding.indexOf("gzip") != -1)) {
42  
43              return true;
44          }
45          else {
46              return false;
47          }
48      }
49  
50      public String getBrowserId(HttpServletRequest request) {
51          if (isIe(request)) {
52              return BROWSER_ID_IE;
53          }
54          else if (isFirefox(request)) {
55              return BROWSER_ID_FIREFOX;
56          }
57          else {
58              return BROWSER_ID_OTHER;
59          }
60      }
61  
62      public float getMajorVersion(HttpServletRequest request) {
63          float majorVersion = 0;
64  
65          String version = getVersion(request);
66  
67          Matcher matcher = _majorVersionPattern.matcher(version);
68  
69          if (matcher.find()) {
70              majorVersion = GetterUtil.getFloat(matcher.group(1));
71          }
72  
73          return majorVersion;
74      }
75  
76      public String getRevision(HttpServletRequest request) {
77          String revision = StringPool.BLANK;
78  
79          String userAgent = getUserAgent(request);
80  
81          Matcher matcher = _revisionPattern.matcher(userAgent);
82  
83          if (matcher.find()) {
84              revision = matcher.group(1);
85          }
86  
87          return revision;
88      }
89  
90      public String getVersion(HttpServletRequest request) {
91          String userAgent = getUserAgent(request);
92  
93          String version = StringPool.BLANK;
94  
95          Matcher matcher = _versionPattern.matcher(userAgent);
96  
97          if (matcher.find()) {
98              version = matcher.group(1);
99          }
100         else if (isFirefox(request)) {
101             Matcher versionFirefoxMatcher = _versionFirefoxPattern.matcher(
102                 userAgent);
103 
104             if (versionFirefoxMatcher.find()) {
105                 version = versionFirefoxMatcher.group(1);
106             }
107         }
108         else if (isChrome(request)) {
109             Matcher versionChromeMatcher = _versionChromePattern.matcher(
110                 userAgent);
111 
112             if (versionChromeMatcher.find()) {
113                 version = versionChromeMatcher.group(1);
114             }
115         }
116         else {
117             version = getRevision(request);
118         }
119 
120         return version;
121     }
122 
123     public boolean isAir(HttpServletRequest request) {
124         String userAgent = getUserAgent(request);
125 
126         if (userAgent.indexOf("adobeair") != -1) {
127             return true;
128         }
129 
130         return false;
131     }
132 
133     public boolean isChrome(HttpServletRequest request) {
134         String userAgent = getUserAgent(request);
135 
136         if (userAgent.indexOf("chrome") != -1) {
137             return true;
138         }
139 
140         return false;
141     }
142 
143     public boolean isFirefox(HttpServletRequest request) {
144         if (!isMozilla(request)) {
145             return false;
146         }
147 
148         String userAgent = getUserAgent(request);
149 
150         Matcher matcher = _firefoxPattern.matcher(userAgent);
151 
152         if (matcher.find()) {
153             return true;
154         }
155 
156         return false;
157     }
158 
159     public boolean isGecko(HttpServletRequest request) {
160         String userAgent = getUserAgent(request);
161 
162         if (userAgent.indexOf("gecko") != -1) {
163             return true;
164         }
165 
166         return false;
167     }
168 
169     public boolean isIe(HttpServletRequest request) {
170         String userAgent = getUserAgent(request);
171 
172         if ((userAgent.indexOf("msie") != -1) &&
173             (userAgent.indexOf("opera") == -1)) {
174 
175             return true;
176         }
177 
178         return false;
179     }
180 
181     public boolean isIphone(HttpServletRequest request) {
182         String userAgent = getUserAgent(request);
183 
184         if (userAgent.indexOf("iphone") != -1) {
185             return true;
186         }
187 
188         return false;
189     }
190 
191     public boolean isLinux(HttpServletRequest request) {
192         String userAgent = getUserAgent(request);
193 
194         if (userAgent.indexOf("linux") != -1) {
195             return true;
196         }
197 
198         return false;
199     }
200 
201     public boolean isMac(HttpServletRequest request) {
202         String userAgent = getUserAgent(request);
203 
204         if (userAgent.indexOf("mac") != -1) {
205             return true;
206         }
207 
208         return false;
209     }
210 
211     public boolean isMobile(HttpServletRequest request) {
212         String userAgent = getUserAgent(request);
213 
214         if (userAgent.indexOf("mobile") != -1) {
215             return true;
216         }
217 
218         return false;
219     }
220 
221     public boolean isMozilla(HttpServletRequest request) {
222         String userAgent = getUserAgent(request);
223 
224         if ((userAgent.indexOf("mozilla") != -1) &&
225             (!userAgent.matches("compatible|webkit"))) {
226 
227             return true;
228         }
229 
230         return false;
231     }
232 
233     public boolean isOpera(HttpServletRequest request) {
234         String userAgent = getUserAgent(request);
235 
236         if (userAgent.indexOf("opera") != -1) {
237             return true;
238         }
239 
240         return false;
241     }
242 
243     public boolean isRtf(HttpServletRequest request) {
244         float majorVersion = getMajorVersion(request);
245 
246         if (isIe(request) && (majorVersion >= 5.5)) {
247             return true;
248         }
249 
250         if (isMozilla(request) && (majorVersion >= 1.3)) {
251             return true;
252         }
253 
254         if (isSafari(request) && (majorVersion >= 3.0) && !isMobile(request)) {
255             return true;
256         }
257 
258         return false;
259     }
260 
261     public boolean isSafari(HttpServletRequest request) {
262         String userAgent = getUserAgent(request);
263 
264         if (isWebKit(request) && (userAgent.indexOf("safari") != -1)) {
265             return true;
266         }
267 
268         return false;
269     }
270 
271     public boolean isSun(HttpServletRequest request) {
272         String userAgent = getUserAgent(request);
273 
274         if (userAgent.indexOf("sunos") != -1) {
275             return true;
276         }
277 
278         return false;
279     }
280 
281     public boolean isWap(HttpServletRequest request) {
282         return isWapXhtml(request);
283     }
284 
285     public boolean isWapXhtml(HttpServletRequest request) {
286         String accept = getAccept(request);
287 
288         if (accept.indexOf("wap.xhtml") != -1) {
289             return true;
290         }
291 
292         return false;
293     }
294 
295     public boolean isWebKit(HttpServletRequest request) {
296         String userAgent = getUserAgent(request);
297 
298         Matcher matcher = _webKitPattern.matcher(userAgent);
299 
300         if (matcher.find()) {
301             return true;
302         }
303 
304         return false;
305     }
306 
307     public boolean isWindows(HttpServletRequest request) {
308         String userAgent = getUserAgent(request);
309 
310         Matcher matcher = _windowsPattern.matcher(userAgent);
311 
312         if (matcher.find()) {
313             return true;
314         }
315 
316         return false;
317     }
318 
319     public boolean isWml(HttpServletRequest request) {
320         String accept = getAccept(request);
321 
322         if (accept.indexOf("wap.wml") != -1) {
323             return true;
324         }
325 
326         return false;
327     }
328 
329     protected String getAccept(HttpServletRequest request) {
330         String accept = StringPool.BLANK;
331 
332         if (request != null) {
333             String acceptHeader = request.getHeader(HttpHeaders.ACCEPT);
334 
335             if (acceptHeader != null) {
336                 accept = acceptHeader.toLowerCase();
337             }
338         }
339 
340         return accept;
341     }
342 
343     protected String getUserAgent(HttpServletRequest request) {
344         String userAgent = StringPool.BLANK;
345 
346         if (request != null) {
347             String userAgentHeader = request.getHeader(HttpHeaders.USER_AGENT);
348 
349             if (userAgentHeader != null) {
350                 userAgent = userAgentHeader.toLowerCase();
351             }
352         }
353 
354         return userAgent;
355     }
356 
357     private static Pattern _firefoxPattern = Pattern.compile(
358         "(firefox|minefield|granparadiso|bonecho|firebird|phoenix|camino)");
359     private static Pattern _majorVersionPattern = Pattern.compile(
360         "(\\d+[.]\\d+)");
361     private static Pattern _revisionPattern = Pattern.compile(
362         "(?:rv|it|ra|ie)[\\/: ]([\\d.]+)");
363     private static Pattern _versionChromePattern = Pattern.compile(
364         "(?:chrome)[\\/]([\\d.]+)");
365     private static Pattern _versionFirefoxPattern = Pattern.compile(
366         "(?:firefox|minefield)[\\/]([\\d.]+)");
367     private static Pattern _versionPattern = Pattern.compile(
368         "(?:version)[\\/]([\\d.]+)");
369     private static Pattern _webKitPattern = Pattern.compile(
370         "(khtml|applewebkit)");
371     private static Pattern _windowsPattern = Pattern.compile(
372         "(windows|win32|16bit)");
373 
374 }