diff options
Diffstat (limited to 'client-compiler/src/com/vaadin/tools/CvalChecker.java')
-rw-r--r-- | client-compiler/src/com/vaadin/tools/CvalChecker.java | 510 |
1 files changed, 0 insertions, 510 deletions
diff --git a/client-compiler/src/com/vaadin/tools/CvalChecker.java b/client-compiler/src/com/vaadin/tools/CvalChecker.java deleted file mode 100644 index 9217781695..0000000000 --- a/client-compiler/src/com/vaadin/tools/CvalChecker.java +++ /dev/null @@ -1,510 +0,0 @@ -/* - * Copyright 2000-2014 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.vaadin.tools; - -import static java.lang.Integer.parseInt; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.text.MessageFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.ResourceBundle; -import java.util.prefs.Preferences; - -import org.apache.commons.io.IOUtils; - -import elemental.json.JsonException; -import elemental.json.JsonNull; -import elemental.json.JsonObject; -import elemental.json.impl.JsonUtil; - -/** - * This class is able to validate the vaadin CVAL license. - * - * It reads the developer license file and asks the server to validate the - * licenseKey. If the license is invalid it throws an exception with the - * information about the problem and the server response. - * - * @since 7.3 - */ -public final class CvalChecker { - - /* - * Class used for binding the JSON gotten from server. - * - * It is not in a separate f le, so as it is easier to copy into any product - * which does not depend on vaadin core. - * - * We are using elemental.json in order not to use additional dependency - * like auto-beans, gson, etc. - */ - public static class CvalInfo { - - public static class Product { - private JsonObject o; - - public Product(JsonObject o) { - this.o = o; - } - - public String getName() { - return get(o, "name", String.class); - } - - public Integer getVersion() { - return get(o, "version", Integer.class); - } - } - - @SuppressWarnings("unchecked") - private static <T> T get(JsonObject o, String k, Class<T> clz) { - Object ret = null; - try { - if (o == null || o.get(k) == null - || o.get(k) instanceof JsonNull) { - return null; - } - if (clz == String.class) { - ret = o.getString(k); - } else if (clz == JsonObject.class) { - ret = o.getObject(k); - } else if (clz == Integer.class) { - ret = Integer.valueOf((int) o.getNumber(k)); - } else if (clz == Date.class) { - ret = new Date((long) o.getNumber(k)); - } else if (clz == Boolean.class) { - ret = o.getBoolean(k); - } - } catch (JsonException e) { - } - return (T) ret; - } - - private JsonObject o; - - private Product product; - - public CvalInfo(JsonObject o) { - this.o = o; - product = new Product(get(o, "product", JsonObject.class)); - } - - public Boolean getExpired() { - return get(o, "expired", Boolean.class); - } - - public Date getExpiredEpoch() { - return get(o, "expiredEpoch", Date.class); - } - - public String getLicensee() { - return get(o, "licensee", String.class); - } - - public String getLicenseKey() { - return get(o, "licenseKey", String.class); - } - - public String getMessage() { - return get(o, "message", String.class); - } - - public Product getProduct() { - return product; - } - - public String getType() { - return get(o, "type", String.class); - } - - public void setExpiredEpoch(Date expiredEpoch) { - o.put("expiredEpoch", expiredEpoch.getTime()); - } - - public void setMessage(String msg) { - o.put("message", msg); - } - - @Override - public String toString() { - return o.toString(); - } - - public boolean isLicenseExpired() { - return (getExpired() != null && getExpired()) - || (getExpiredEpoch() != null && getExpiredEpoch().before( - new Date())); - } - - public boolean isValidVersion(int majorVersion) { - return getProduct().getVersion() == null - || getProduct().getVersion() >= majorVersion; - - } - - private boolean isValidInfo(String name, String key) { - return getProduct() != null && getProduct().getName() != null - && getLicenseKey() != null - && getProduct().getName().equals(name) - && getLicenseKey().equals(key); - } - } - - /* - * The class with the method for getting json from server side. It is here - * and protected just for replacing it in tests. - */ - public static class CvalServer { - protected String licenseUrl = LICENSE_URL_PROD; - - String askServer(String productName, String productKey, int timeoutMs) - throws IOException { - String url = licenseUrl + productKey; - URLConnection con; - try { - // Send some additional info in the User-Agent string. - String ua = "Cval " + productName + " " + productKey + " " - + getFirstLaunch(); - for (String prop : Arrays.asList("java.vendor.url", - "java.version", "os.name", "os.version", "os.arch")) { - ua += " " + System.getProperty(prop, "-").replace(" ", "_"); - } - con = new URL(url).openConnection(); - con.setRequestProperty("User-Agent", ua); - con.setConnectTimeout(timeoutMs); - con.setReadTimeout(timeoutMs); - String r = IOUtils.toString(con.getInputStream()); - return r; - } catch (MalformedURLException e) { - e.printStackTrace(); - return null; - } - } - - /* - * Get the GWT firstLaunch timestamp. - */ - String getFirstLaunch() { - try { - Class<?> clz = Class - .forName("com.google.gwt.dev.shell.CheckForUpdates"); - return Preferences.userNodeForPackage(clz).get("firstLaunch", - "-"); - } catch (ClassNotFoundException e) { - return "-"; - } - } - } - - /** - * Exception thrown when the user does not have a valid cval license. - */ - public static class InvalidCvalException extends Exception { - private static final long serialVersionUID = 1L; - public final CvalInfo info; - public final String name; - public final String key; - public final String version; - public final String title; - - public InvalidCvalException(String name, String version, String title, - String key, CvalInfo info) { - super(composeMessage(title, version, key, info)); - this.info = info; - this.name = name; - this.key = key; - this.version = version; - this.title = title; - } - - static String composeMessage(String title, String version, String key, - CvalInfo info) { - String msg = ""; - int majorVers = computeMajorVersion(version); - - if (info != null && !info.isValidVersion(majorVers)) { - msg = getErrorMessage("invalid", title, majorVers); - } else if (info != null && info.getMessage() != null) { - msg = info.getMessage().replace("\\n", "\n"); - } else if (info != null && info.isLicenseExpired()) { - String type = "evaluation".equals(info.getType()) ? "Evaluation license" - : "License"; - msg = getErrorMessage("expired", title, majorVers, type); - } else if (key == null) { - msg = getErrorMessage("none", title, majorVers); - } else { - msg = getErrorMessage("invalid", title, majorVers); - } - return msg; - } - } - - /** - * Exception thrown when the license server is unreachable - */ - public static class UnreachableCvalServerException extends Exception { - private static final long serialVersionUID = 1L; - public final String name; - - public UnreachableCvalServerException(String name, Exception e) { - super(e); - this.name = name; - } - } - - public static final String LINE = "----------------------------------------------------------------------------------------------------------------------"; - - static final int GRACE_DAYS_MSECS = 2 * 24 * 60 * 60 * 1000; - - private static final String LICENSE_URL_PROD = "https://tools.vaadin.com/vaadin-license-server/licenses/"; - - /* - * used in tests - */ - static void cacheLicenseInfo(CvalInfo info) { - if (info != null) { - Preferences p = Preferences.userNodeForPackage(CvalInfo.class); - if (info.toString().length() > Preferences.MAX_VALUE_LENGTH) { - // This should never happen since MAX_VALUE_LENGTH is big - // enough. - // But server could eventually send a very big message, so we - // discard it in cache and would use hard-coded messages. - info.setMessage(null); - } - p.put(info.getProduct().getName(), info.toString()); - } - } - - /* - * used in tests - */ - static void deleteCache(String productName) { - Preferences p = Preferences.userNodeForPackage(CvalInfo.class); - p.remove(productName); - } - - /** - * Given a product name returns the name of the file with the license key. - * - * Traditionally we have delivered license keys with a name like - * 'vaadin.touchkit.developer.license' but our database product name is - * 'vaadin-touchkit' so we have to replace '-' by '.' to maintain - * compatibility. - */ - static final String computeLicenseName(String productName) { - return productName.replace("-", ".") + ".developer.license"; - } - - static final int computeMajorVersion(String productVersion) { - return productVersion == null || productVersion.isEmpty() ? 0 - : parseInt(productVersion.replaceFirst("[^\\d]+.*$", "")); - } - - /* - * used in tests - */ - static CvalInfo parseJson(String json) { - if (json == null) { - return null; - } - try { - JsonObject o = JsonUtil.parse(json); - return new CvalInfo(o); - } catch (JsonException e) { - return null; - } - } - - private CvalServer provider; - - /** - * The constructor. - */ - public CvalChecker() { - setLicenseProvider(new CvalServer()); - } - - /** - * Validate whether there is a valid license key for a product. - * - * @param productName - * for example vaadin-touchkit - * @param productVersion - * for instance 4.0.1 - * @return CvalInfo Server response or cache response if server is offline - * @throws InvalidCvalException - * when there is no a valid license for the product - * @throws UnreachableCvalServerException - * when we have license key but server is unreachable - */ - public CvalInfo validateProduct(String productName, String productVersion, - String productTitle) throws InvalidCvalException, - UnreachableCvalServerException { - String key = getDeveloperLicenseKey(productName, productVersion, - productTitle); - - CvalInfo info = null; - if (key != null && !key.isEmpty()) { - info = getCachedLicenseInfo(productName); - if (info != null && !info.isValidInfo(productName, key)) { - deleteCache(productName); - info = null; - } - info = askLicenseServer(productName, key, productVersion, info); - if (info != null && info.isValidInfo(productName, key) - && info.isValidVersion(computeMajorVersion(productVersion)) - && !info.isLicenseExpired()) { - return info; - } - } - - throw new InvalidCvalException(productName, productVersion, - productTitle, key, info); - } - - /* - * Change the license provider, only used in tests. - */ - final CvalChecker setLicenseProvider(CvalServer p) { - provider = p; - return this; - } - - private CvalInfo askLicenseServer(String productName, String productKey, - String productVersion, CvalInfo info) - throws UnreachableCvalServerException { - - int majorVersion = computeMajorVersion(productVersion); - - // If we have a valid license info here, it means that we got it from - // cache. - // We add a grace time when so as if the server is unreachable - // we allow the user to use the product. - if (info != null && info.getExpiredEpoch() != null - && !"evaluation".equals(info.getType())) { - long ts = info.getExpiredEpoch().getTime() + GRACE_DAYS_MSECS; - info.setExpiredEpoch(new Date(ts)); - } - - boolean validCache = info != null - && info.isValidInfo(productName, productKey) - && info.isValidVersion(majorVersion) - && !info.isLicenseExpired(); - - // if we have a validCache we set the timeout smaller - int timeout = validCache ? 2000 : 10000; - - try { - CvalInfo srvinfo = parseJson(provider.askServer(productName + "-" - + productVersion, productKey, timeout)); - if (srvinfo != null && srvinfo.isValidInfo(productName, productKey) - && srvinfo.isValidVersion(majorVersion)) { - // We always cache the info if it is valid although it is - // expired - cacheLicenseInfo(srvinfo); - info = srvinfo; - } - } catch (FileNotFoundException e) { - // 404 - return null; - } catch (Exception e) { - if (info == null) { - throw new UnreachableCvalServerException(productName, e); - } - } - return info; - } - - private CvalInfo getCachedLicenseInfo(String productName) { - Preferences p = Preferences.userNodeForPackage(CvalInfo.class); - String json = p.get(productName, ""); - if (!json.isEmpty()) { - CvalInfo info = parseJson(json); - if (info != null) { - return info; - } - } - return null; - } - - private String getDeveloperLicenseKey(String productName, - String productVersion, String productTitle) - throws InvalidCvalException { - String licenseName = computeLicenseName(productName); - - String key = System.getProperty(licenseName); - if (key != null && !key.isEmpty()) { - return key; - } - - try { - String dotLicenseName = "." + licenseName; - String userHome = System.getProperty("user.home"); - for (URL url : new URL[] { - new File(userHome, dotLicenseName).toURI().toURL(), - new File(userHome, licenseName).toURI().toURL(), - URL.class.getResource("/" + dotLicenseName), - URL.class.getResource("/" + licenseName) }) { - if (url != null) { - try { - key = readKeyFromFile(url, - computeMajorVersion(productVersion)); - if (key != null && !(key = key.trim()).isEmpty()) { - return key; - } - } catch (IOException ignored) { - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - throw new InvalidCvalException(productName, productVersion, - productTitle, null, null); - } - - String readKeyFromFile(URL url, int majorVersion) throws IOException { - String majorVersionStr = String.valueOf(majorVersion); - List<String> lines = IOUtils.readLines(url.openStream()); - String defaultKey = null; - for (String line : lines) { - String[] parts = line.split("\\s*=\\s*"); - if (parts.length < 2) { - defaultKey = parts[0].trim(); - } - if (parts[0].equals(majorVersionStr)) { - return parts[1].trim(); - } - } - return defaultKey; - } - - static String getErrorMessage(String key, Object... pars) { - Locale loc = Locale.getDefault(); - ResourceBundle res = ResourceBundle.getBundle( - CvalChecker.class.getName(), loc); - String msg = res.getString(key); - return new MessageFormat(msg, loc).format(pars); - } -} |