View Javadoc

1   /*
2    * FCKeditor - The text editor for Internet - http://www.fckeditor.net
3    * Copyright (C) 2003-2008 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  /**
29   * Compatibility check.
30   * 
31   * @version $Id: Compatibility.java 1763 2008-03-21 14:26:06Z th-schwarz $
32   */
33  public class Compatibility {
34  
35  	/**
36  	 * Checks, if a browser's user agent string is compatible for the FCKeditor. <br>
37  	 * Adapted from: http://dev.fckeditor.net/browser/FCKeditor/releases/stable/fckeditor.php
38  	 * 
39  	 * @param userAgentString
40  	 * @return true, if compatible, otherwise false
41  	 */
42  	public static boolean check(final String userAgentString) {
43  		if (Utils.isEmpty(userAgentString))
44  			return false;
45  
46  		float version;
47  
48  		// IE 5.5+, check special keys like 'Opera' and 'mac', because there are some
49  		// other browsers, containing 'MSIE' in there agent string!
50  		if (userAgentString.indexOf("Opera") < 0 && userAgentString.indexOf("mac") < 0) {
51  			version = getBrowserVersion(userAgentString, ".*MSIE ([\\d]+.[\\d]+).*");
52  			if (version != -1f && version >= 5.5f)
53  				return true;
54  		}
55  
56  		// for mozilla only, because all firefox versions are supported
57  		version = getBrowserVersion(userAgentString, ".*Gecko/([\\d]+).*");
58  		if (version != -1f && version >= 20030210f)
59  			return true;
60  
61  		// Opera 9.5+
62  		version = getBrowserVersion(userAgentString, "Opera/([\\d]+.[\\d]+).*");
63  		if (version != -1f && version >= 9.5f)
64  			return true;
65  		version = getBrowserVersion(userAgentString, ".*Opera ([\\d]+.[\\d]+)");
66  		if (version != -1f && version >= 9.5f)
67  			return true;
68  
69  		// Safari 3+
70  		version = getBrowserVersion(userAgentString, ".*AppleWebKit/([\\d]+).*");
71  		if (version != -1f && version >= 522f)
72  			return true;
73  
74  		return false;
75  	}
76  
77  	/**
78  	 * Just a wrapper to {@link #check(String)}.
79  	 * 
80  	 * @param request
81  	 */
82  	public static boolean isCompatibleBrowser(final HttpServletRequest request) {
83  		return (request == null) ? false : check(request.getHeader("user-agent"));
84  	}
85  
86  	/**
87  	 * Helper method to get the the browser version from 'userAgent' with the regular expression
88  	 * 'regex'. The first group of the matches has to be the version number!
89  	 * 
90  	 * @param userAgent
91  	 * @param regex
92  	 * @return The browser version, or -1f, if version con't find out.
93  	 */
94  	private static float getBrowserVersion(final String userAgent, final String regex) {
95  		Pattern pattern = Pattern.compile(regex);
96  		Matcher matcher = pattern.matcher(userAgent);
97  		if (matcher.matches()) {
98  			try {
99  				return Float.parseFloat(matcher.group(1));
100 			} catch (NumberFormatException e) {
101 				return -1f;
102 			}
103 		}
104 		return -1f;
105 	}
106 
107 }