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