1 /*
2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
3 * Copyright (C) 2004-2010 Frederico Caldeira Knabben
4 *
5 * == BEGIN LICENSE ==
6 *
7 * Licensed under the terms of any of the following licenses at your
8 * choice:
9 *
10 * - GNU General Public License Version 2 or later (the "GPL")
11 * http://www.gnu.org/licenses/gpl.html
12 *
13 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
14 * http://www.gnu.org/licenses/lgpl.html
15 *
16 * - Mozilla Public License Version 1.1 or later (the "MPL")
17 * http://www.mozilla.org/MPL/MPL-1.1.html
18 *
19 * == END LICENSE ==
20 */
21 package net.fckeditor.tool;
22
23 import java.util.regex.Matcher;
24 import java.util.regex.Pattern;
25
26 import javax.servlet.http.HttpServletRequest;
27
28 import net.fckeditor.FCKeditor;
29
30 /**
31 * Checks browser compatibility with the {@link FCKeditor editor}.
32 *
33 * @version $Id: Compatibility.java 4785 2009-12-21 20:10:28Z mosipov $
34 */
35 public class Compatibility {
36
37 /**
38 * Checks if a browser's user agent string is compatible with the FCKeditor.
39 *
40 * @param userAgentString
41 * the user agent string of a browser
42 * @return <code>true</code> if compatible, else <code>false</code>
43 */
44 public static boolean check(final String userAgentString) {
45 if (Utils.isEmpty(userAgentString))
46 return false;
47
48 String userAgentStr = userAgentString.toLowerCase();
49
50 // IE 5.5+, check special keys like 'Opera' and 'mac', because there are
51 // some
52 // other browsers, containing 'MSIE' in there agent string!
53 if (userAgentStr.indexOf("opera") < 0
54 && userAgentStr.indexOf("mac") < 0
55 && getBrowserVersion(userAgentStr, ".*msie ([\\d]+.[\\d]+).*") >= 5.5f)
56 return true;
57
58 // for all gecko based browsers
59 if (getBrowserVersion(userAgentStr, ".*rv:([\\d]+.[\\d]+).*") > 1.7f)
60 return true;
61
62 // Opera 9.5+
63 if (getBrowserVersion(userAgentStr, "opera/([\\d]+.[\\d]+).*") >= 9.5f
64 || getBrowserVersion(userAgentStr, ".*opera ([\\d]+.[\\d]+)") >= 9.5f)
65 return true;
66
67 // Safari 3+
68 if (getBrowserVersion(userAgentStr, ".*applewebkit/([\\d]+).*") >= 522f)
69 return true;
70
71 return false;
72 }
73
74 /**
75 * Returns <code>true</code> if a browser is compatible by its request
76 * user-agent header.
77 *
78 * @see #check(String)
79 * @param request
80 * current user request instance
81 * @return <code>true</code> if a browser is compatible, else
82 * <code>false</code>
83 */
84 public static boolean isCompatibleBrowser(final HttpServletRequest request) {
85 return (request == null) ? false : check(request
86 .getHeader("user-agent"));
87 }
88
89 /**
90 * Helper method to get the browser version from 'userAgent' with regex. The
91 * first matching group has to be the version number!
92 *
93 * @param userAgentString
94 * the user agent string of a browser
95 * @param regex
96 * the pattern to retrieve the browser version
97 * @return the browser version, or -1f if version can't be determined
98 */
99 private static float getBrowserVersion(final String userAgentString,
100 final String regex) {
101 Pattern pattern = Pattern.compile(regex);
102 Matcher matcher = pattern.matcher(userAgentString);
103 if (matcher.matches()) {
104 try {
105 return Float.parseFloat(matcher.group(1));
106 } catch (NumberFormatException e) {
107 return -1f;
108 }
109 }
110 return -1f;
111 }
112
113 }