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