package net.xmind.verify.internal; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.Reader; import java.io.Writer; import java.lang.Enum; import java.lang.Exception; import java.lang.IllegalStateException; import java.lang.Long; import java.lang.Object; import java.lang.Runnable; import java.lang.String; import java.lang.StringBuffer; import java.lang.System; import java.lang.Thread; import java.lang.Throwable; import java.security.GeneralSecurityException; import java.security.Key; import java.security.KeyFactory; import java.security.MessageDigest; import java.security.PublicKey; import java.security.Signature; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.KeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.UUID; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; import net.xmind.core.AccountManager; import net.xmind.core.IAccount; import net.xmind.signin.IAccountInfo; import net.xmind.signin.IAuthenticationListener; import net.xmind.signin.ILicenseInfo; import net.xmind.signin.IXMindNetCommand; import net.xmind.signin.IXMindNetCommandHandler; import net.xmind.signin.XMindNet; import net.xmind.signin.internal.InternalXMindNet; import net.xmind.signin.internal.LicenseInfo; import net.xmind.signin.internal.XMindLicenseAgent; import net.xmind.ui.internal.auth.AuthenticationDialog; import net.xmind.verify.IValidity; import net.xmind.verify.IVerifyListener; import net.xmind.verify.internal.Base32; import net.xmind.verify.internal.LicenseAgent; import net.xmind.verify.internal.LicenseKeyHeader; import net.xmind.verify.internal.LicenseKeyHeader2; import net.xmind.verify.internal.Messages; import net.xmind.verify.internal.Validity; import net.xmind.verify.internal.VerifyPlugin; import net.xmind.verify.internal.legacy.LegacyLicenseVerifierUtil; import net.xmind.verify.internal.legacy.LegacyValidity; import net.xmind.verify.ui.internal.LicenseInfoDialog2; import net.xmind.verify.ui.internal.LicenseKeyInputDialog2; import net.xmind.verify.ui.internal.SubscriptionInfoDialog; import net.xmind.verify.ui.internal.VerifyingStatusDialog; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Hex; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.window.Window; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.json.JSONObject; import org.json.JSONTokener; import org.osgi.framework.Bundle; import org.xmind.core.licensing.ILicenseKeyHeader; import org.xmind.core.net.IDataStore; import org.xmind.core.net.internal.EncodingUtils; import org.xmind.core.net.internal.XMindNetRequest; import org.xmind.core.net.util.LinkUtils; import org.xmind.core.usagedata.IUsageDataSampler; /* * This class specifies class file version 49.0 but uses Java 6 signatures. Assumed Java 6. */ public class LicenseVerifier implements IAuthenticationListener, IXMindNetCommandHandler { static final String PROP_LICENSE_EMAIL = "license_email"; static final String PROP_LICENSE_KEY = "license_key"; private static final boolean DEBUGGING = VerifyPlugin.getDefault().isDebugging("/debug/verify"); private static final boolean VERBOSE = VerifyPlugin.getDefault().isDebugging("/debug/verify/verbose"); private static final String DEBUG_KEYS = "/debug/keys"; private static final int LICENSE_KEY_LENGTH = 225; private static final int HEADER_LENGTH = 12; private static final int PREFIX_LENGTH = 8; private static LicenseVerifier INSTANCE = null; private static List<String> BLACKLISTED_LICENSE_KEYS = null; private IValidity validity = null; private VerificationJob verifyJob = null; private Object jobLock = new Object(); private static boolean subscriptionVerified = false; private List<ValidityNotifier> listeners = new ArrayList<ValidityNotifier>(); private List<ValidityNotifier> callbacks = new ArrayList<ValidityNotifier>(); private static final String KEY_LICENSE_TYPE = "type"; private static final String KEY_LICENSE_SESSION_ID = "sessionId"; private JSONObject licenseStates = null; private LicenseVerifier() { XMindNet.addAuthenticationListener((IAuthenticationListener)this); XMindNet.addXMindNetCommandHandler((String)"refresh", (IXMindNetCommandHandler)this); } public void verify(String featureKey, String actionName, int requiredStatus, IVerifyListener callback, int style) { this.verify(featureKey, actionName, requiredStatus, callback, style, null); } /* * WARNING - Removed try catching itself - possible behaviour change. */ void verify(String featureKey, String actionName, int requiredStatus, IVerifyListener callback, int style, Properties userInput) { Object object; if ((style & 1) == 0 && LicenseVerifier.checkValid(this.validity, requiredStatus)) { if (callback != null) { callback.notifyValidity(this.validity); } return; } if (callback != null) { object = this.callbacks; // MONITORENTER : object this.callbacks.add(new ValidityNotifier(callback)); // MONITOREXIT : object } object = this.jobLock; // MONITORENTER : object if (this.verifyJob == null) { VerificationJob job = new VerificationJob(featureKey, actionName, requiredStatus, style, userInput); job.addJobChangeListener((IJobChangeListener)new JobChangeAdapter(){ /* * WARNING - Removed try catching itself - possible behaviour change. */ public void done(IJobChangeEvent event) { Object object = LicenseVerifier.this.jobLock; // MONITORENTER : object LicenseVerifier.access$20(LicenseVerifier.this, null); // MONITOREXIT : object if (event.getResult() instanceof IValidity) { LicenseVerifier.this.setValidity((IValidity)event.getResult()); } else { LicenseVerifier.this.setValidity(LicenseVerifier.createValidity(8)); } } }); job.schedule(); this.verifyJob = job; } else { this.verifyJob.updateFeatureKey(featureKey); this.verifyJob.updateActionName(actionName); this.verifyJob.updateRequiredStatus(requiredStatus); this.verifyJob.updateStyle(style); } // MONITOREXIT : object } /* * WARNING - Removed try catching itself - possible behaviour change. */ public void addVerifyListener(IVerifyListener listener) { List<ValidityNotifier> list = this.listeners; // MONITORENTER : list this.listeners.add(new ValidityNotifier(listener)); // MONITOREXIT : list } /* * WARNING - Removed try catching itself - possible behaviour change. */ public void removeVerifyListener(IVerifyListener listener) { List<ValidityNotifier> list = this.listeners; // MONITORENTER : list Object[] array = this.listeners.toArray(); this.listeners.clear(); for (int i = 0; i < array.length; ++i) { ValidityNotifier notifier = (ValidityNotifier)array[i]; if (notifier.listener == listener) continue; this.listeners.add(notifier); } // MONITOREXIT : list } private void setValidity(IValidity newValidity) { newValidity = LicenseVerifier.cloneValidity(newValidity); IValidity publicValidity = LicenseVerifier.cloneValidity(newValidity); this.recordLicenseVerification(publicValidity); if (this.notifyAllCallbacks(publicValidity)) { return; } this.notifyAllListeners(publicValidity); this.notifyLicenseAgent(publicValidity); this.validity = newValidity; if ((newValidity.getCode() & 6) != 0) { this.checkLicenseKeyBlacklisted(); } } private void checkLicenseKeyBlacklisted() { Properties store = LicenseVerifier.loadLocalData(); final String licenseKey = LicenseVerifier.trimLicenseKey(store.getProperty("WalkingInTheMorning")); final String licenseEmail = store.getProperty("TimeSmilesInMyHand"); Thread thread = new Thread(new Runnable(){ @Override public void run() { if (!LicenseVerifier.doCheckLicenseKeyBlacklisted(licenseEmail, licenseKey)) { LicenseVerifier.addBlacklistedLicenseKey(licenseKey, licenseEmail); LicenseVerifier.this.verify(null, null, 7, null, 3); } } }); thread.setDaemon(true); thread.setPriority(1); thread.start(); } /* * WARNING - Removed try catching itself - possible behaviour change. */ private boolean notifyAllCallbacks(IValidity validity) { List<ValidityNotifier> list = this.callbacks; // MONITORENTER : list ArrayList<ValidityNotifier> allCallbacks = new ArrayList<ValidityNotifier>(this.callbacks); this.callbacks.clear(); // MONITOREXIT : list for (ValidityNotifier callback : allCallbacks) { if (!callback.notifyValidityCallback(validity)) continue; return true; } return false; } private void notifyAllListeners(IValidity validity) { Object[] allListeners; for (Object listener : allListeners = this.listeners.toArray()) { ((ValidityNotifier)listener).notifyValidityListener(validity); } } private void notifyLicenseAgent(IValidity validity) { int code = validity.getCode(); Throwable error = validity.getException(); String name = validity.getLicensedTo(); net.xmind.signin.ILicenseKeyHeader header = validity.getLicenseKeyHeader(); InternalXMindNet.getInstance().getLicenseAgent().licenseVerified((ILicenseInfo)new LicenseInfo(code, error, name, header)); LicenseAgent licenseAgent = VerifyPlugin.getDefault().getLicenseAgent(); if (licenseAgent != null) { int licenseType = 1; if ((code & 1) != 0) { licenseType = 2; } else if ((code & 2) != 0) { licenseType = 4; } else if ((code & 4) != 0) { licenseType = 8; } LicenseKeyHeader2 header2 = null; if (header != null) { header2 = LicenseKeyHeader2.decode(header.toEncoded()); } licenseAgent.setLicenseInfo(licenseType, name, header2); } } public void postSignIn(IAccountInfo accountInfo) { subscriptionVerified = false; this.verify(null, null, 7, null, 3); } public void postSignOut(IAccountInfo oldAccountInfo) { if (this.validity != null && (this.validity.getCode() & 1) != 0) { if (!LicenseVerifier.hasValidity(this.validity, 6)) { LicenseVerifier.saveLocalData(null, null, null, null, null); } else { this.saveLocalData(null); } this.setValidity(LicenseVerifier.createValidity(1024)); } subscriptionVerified = false; } public boolean handleXMindNetCommand(IXMindNetCommand command) { this.refreshValidity(command.getContent()); return true; } private void refreshValidity(IDataStore data) { if (data == null) { return; } if (this.validity != null && (this.validity.getCode() & 6) != 0) { return; } String user = data.getString("user"); String uid = data.getString("uid"); if (user == null || uid == null) { return; } IAccountInfo accountInfo = XMindNet.getAccountInfo(); if (accountInfo == null || !user.equals(accountInfo.getUser())) { return; } String expiration = LicenseVerifier.extractExpiration(data, uid); String expireDate = LicenseVerifier.extractExpireDate(data, uid); int status = expiration == null ? 4096 : LicenseVerifier.parseExpiration(expiration, uid); LicenseVerifier.saveLocalData(uid, expiration, null, null, expireDate); this.validity = LicenseVerifier.createValidity(status, user, null); } private static boolean isLicenseKeyBlacklisted(String licenseKey, String licenseEmail) { String line = String.valueOf(licenseEmail) + "|" + licenseKey; return LicenseVerifier.getBlacklistedLicenseKeys().contains(line); } private static synchronized List<String> getBlacklistedLicenseKeys() { if (BLACKLISTED_LICENSE_KEYS == null) { BLACKLISTED_LICENSE_KEYS = new ArrayList<String>(); File blistFile = LicenseVerifier.getBlacklistFile(); if (blistFile != null && blistFile.exists() && blistFile.isFile()) { try { try (BufferedReader reader = new BufferedReader(new FileReader(blistFile));){ String line; while ((line = reader.readLine()) != null) { BLACKLISTED_LICENSE_KEYS.add(line); } } } catch (IOException iOException) {} } } return BLACKLISTED_LICENSE_KEYS; } private static synchronized void addBlacklistedLicenseKey(String licenseKey, String licenseEmail) { List<String> lines = LicenseVerifier.getBlacklistedLicenseKeys(); lines.add(String.valueOf(licenseEmail) + "|" + licenseKey); File blistFile = LicenseVerifier.getBlacklistFile(); if (blistFile != null) { LicenseVerifier.deleteFile(blistFile); try { try (BufferedWriter writer = new BufferedWriter(new FileWriter(blistFile));){ for (String line : lines) { writer.write(line); writer.newLine(); } } } catch (IOException iOException) {} } } private static boolean doCheckLicenseKeyBlacklisted(String email, String key) { XMindNetRequest request = new XMindNetRequest().useHTTPS(); request.path("/_res/verify-license", new Object[0]).addParameter("email", (Object)email).addParameter("key", (Object)key); String uuid = LicenseVerifier.getInstallUUID(); if (uuid != null) { request.addParameter("uuid", (Object)uuid); } request.post(); if (request.isAborted()) { return true; } int code = request.getStatusCode(); IDataStore data = request.getData(); if (code == 200 && data != null) { String licenseStatus = data.getString("status"); return licenseStatus == null || "".equals(licenseStatus) || "valid".equals(licenseStatus); } return true; } private static synchronized String getInstallUUID() { File uuidFile = LicenseVerifier.getUUIDFile(); if (uuidFile != null) { String uuid = null; if (uuidFile.exists() && uuidFile.isFile()) { try { byte[] buffer = new byte[1024]; try (FileInputStream stream = new FileInputStream(uuidFile);){ int read = stream.read(buffer); uuid = new String(buffer, 0, read, "UTF-8"); } } catch (IOException iOException) {} } if (uuid == null) { uuid = UUID.randomUUID().toString(); LicenseVerifier.deleteFile(uuidFile); try { try (FileOutputStream stream = new FileOutputStream(uuidFile);){ stream.write(uuid.getBytes("UTF-8")); } } catch (IOException iOException) { return null; } } return uuid; } return null; } private static void deleteFile(File file) { if (file.isDirectory()) { for (String name : file.list()) { LicenseVerifier.deleteFile(new File(file, name)); } } file.delete(); } private static boolean checkValid(IStatus status, int requiredStatus) { return status != null && LicenseVerifier.hasValidity(status, requiredStatus); } private static boolean hasValidity(IStatus status, int code) { return (status.getCode() & code) != 0; } private static Properties loadLocalData() { File stateFile = LicenseVerifier.getStateFile(); if (stateFile != null && stateFile.exists() && stateFile.isFile()) { Properties store = new Properties(); try { try (BufferedInputStream stream = new BufferedInputStream(new FileInputStream(stateFile), 1024);){ store.load(stream); } String licenseEmail = store.getProperty("TimeSmilesInMyHand"); String licenseKey = store.getProperty("WalkingInTheMorning"); LicenseVerifier.saveState(store, "WalkingInTheMorning", Cryptus.decrypt(licenseKey, licenseEmail)); return store; } catch (IOException iOException) {} } return null; } private static void saveLocalData(String uid, String expiration, String licenseKey, String licenseEmail, String expireDate) { File stateFile = LicenseVerifier.getStateFile(); if (stateFile == null) { return; } licenseKey = Cryptus.encrypt(licenseKey, licenseEmail); Properties store = new Properties(); LicenseVerifier.saveState(store, "TimeSmilesInMyHand", licenseEmail); LicenseVerifier.saveState(store, "WalkingInTheMorning", licenseKey); LicenseVerifier.saveState(store, "ThisDawn", uid); LicenseVerifier.saveState(store, "LastsAllDay", expiration); LicenseVerifier.saveState(store, "LastAllDay", expireDate); try { try (FileOutputStream stream = new FileOutputStream(stateFile);){ store.store(stream, "Awakening Gatha, Deena Metzger"); } } catch (IOException iOException) {} } private static void saveLocalData(String uid, String expiration, String licenseKey, String licenseEmail) { LicenseVerifier.saveLocalData(uid, expiration, licenseKey, licenseEmail, null); } private void saveLocalData(String expiration) { Properties store = LicenseVerifier.loadLocalData(); String licenseKey = null; String licenseEmail = null; String uid = null; if (store != null) { licenseKey = store.getProperty("WalkingInTheMorning"); licenseEmail = store.getProperty("TimeSmilesInMyHand"); uid = store.getProperty("ThisDawn"); } LicenseVerifier.saveLocalData(uid, null, licenseKey, licenseEmail, null); } private static void saveState(Properties store, String name, String value) { if (value != null && !"".equals(value)) { store.setProperty(name, value); } else { store.remove(name); } } private static String extractExpireDate(IDataStore data, String uid) { if (!data.has("expireDate")) { return null; } long exp = data.getLong("expireDate"); if (exp <= 0L) { exp = 0L; } StringBuffer sb = new StringBuffer(64); sb.append('`'); sb.append('\t'); sb.append('\n'); sb.append(Long.toString(exp, 16)); String ex = Cryptus.encrypt(sb.toString(), uid); return ex; } private static String extractExpiration(IDataStore data, String uid) { if (!data.has("expireDate")) { return null; } long exp = data.getLong("expireDate"); if (exp <= 0L) { return null; } if (data.getBoolean("expired")) { exp = 0L; } StringBuffer sb = new StringBuffer(64); sb.append('`'); sb.append('\t'); sb.append('\n'); sb.append(Long.toString(exp, 16)); String ex = Cryptus.encrypt(sb.toString(), uid); return ex; } private static long parseExpireDate(String subscriptionExpireDate, String uid) { String value = Cryptus.decrypt(subscriptionExpireDate, uid); if (value != null && !"".equals(value) && value.startsWith("`\t\n")) { return Long.parseLong(value.substring(3), 16); } return 0L; } private static int parseExpiration(String expiration, String uid) { String value = Cryptus.decrypt(expiration, uid); if (value != null && !"".equals(value) && value.startsWith("`\t\n")) { long expTime = Long.parseLong(value.substring(3), 16); if (System.currentTimeMillis() < expTime) { return 1; } return 2048; } return 1024; } private static File getStateFile() { return LicenseVerifier.getLocalFile(".poem37"); } private static File getUUIDFile() { return LicenseVerifier.getLocalFile(".uuid"); } private static File getBlacklistFile() { return LicenseVerifier.getLocalFile(".blist"); } private static File getLocalFile(String name) { Bundle bundle = Platform.getBundle((String)"net.xmind.verify"); if (bundle != null) { File root = Platform.getStateLocation((Bundle)bundle).toFile(); return new File(root, name); } return null; } private static IValidity cloneValidity(IValidity validity) { return new Validity(validity.getSeverity(), validity.getPlugin(), validity.getCode(), validity.getMessage(), validity.getException(), validity.getLicensedTo(), validity.getLicenseKeyHeader()); } private static IValidity createValidity(int invalidStatus) { return LicenseVerifier.createValidity(invalidStatus, null, null, null, false); } private static IValidity createValidity(int validStatus, String name, net.xmind.signin.ILicenseKeyHeader header) { return LicenseVerifier.createValidity(validStatus, name, header, null, false); } private static IValidity createValidity(int invalidStatus, Throwable error) { return LicenseVerifier.createValidity(invalidStatus, null, null, error, false); } private static IValidity createValidity(int status, String name, net.xmind.signin.ILicenseKeyHeader header, Throwable error, boolean canceled) { if ((status & 7) == 0) { name = null; } if (canceled) { return new Validity(8, "net.xmind.verify", status, null, error, name, header); } return new Validity(0, "net.xmind.verify", status, null, error, name, header); } private static String trimLicenseKey(String key) { if (key == null) { return ""; } int startIndex = (key = key.toUpperCase()).indexOf("---BEGIN LICENSE KEY---"); startIndex = startIndex < 0 ? 0 : (startIndex += 23); int endIndex = key.indexOf("---END LICENSE KEY---"); if (endIndex < 0) { endIndex = key.length(); } key = key.substring(startIndex, endIndex).replaceAll("[^A-Z0-9]", ""); return key; } public static LicenseVerifier getInstance() { if (INSTANCE == null) { INSTANCE = new LicenseVerifier(); } return INSTANCE; } private void recordLicenseVerification(IValidity info) { String newType; if (this.licenseStates == null) { this.licenseStates = LicenseVerifier.readStates(LicenseVerifier.getLicenseStatesFile()); } JSONObject oldStates = this.licenseStates; JSONObject newStates = LicenseVerifier.createLicenseStates(info); String oldType = oldStates == null ? null : oldStates.optString(KEY_LICENSE_TYPE, null); String string = newType = newStates == null ? null : newStates.optString(KEY_LICENSE_TYPE, null); if (!(newType == oldType || newType != null && newType.equals(oldType))) { VerifyPlugin.getDefault().getUsageDataCollector().trackEvent("License", "Deactivate"); if (newType != null) { String sessionId = UUID.randomUUID().toString(); newStates.put(KEY_LICENSE_SESSION_ID, (Object)sessionId); VerifyPlugin.getDefault().getUsageDataCollector().trackEvent("License", "Activate"); } this.licenseStates = newStates; LicenseVerifier.writeStates(this.licenseStates, LicenseVerifier.getLicenseStatesFile()); } } private static JSONObject createLicenseStates(IValidity info) { int type = info.getCode(); String typeId = (type & 2) != 0 ? "pro_license" : ((type & 1) != 0 ? "pro" : ((type & 4) != 0 ? "plus_license" : null)); if (typeId == null) { return null; } return new JSONObject().put(KEY_LICENSE_TYPE, (Object)typeId); } private static File getLicenseStatesFile() { IPath stateLocation; Bundle storageBundle = Platform.getBundle((String)"org.xmind.cathy"); if (storageBundle == null) { return null; } try { stateLocation = Platform.getStateLocation((Bundle)storageBundle); } catch (Exception exception) { return null; } return stateLocation.append("licenseStates.json").toFile(); } private static JSONObject readStates(File statesFile) { JSONObject jSONObject; if (statesFile == null || !statesFile.exists()) { return null; } FileInputStream stream = new FileInputStream(statesFile); try { jSONObject = new JSONObject(new JSONTokener((InputStream)stream)); } catch (Throwable throwable) { try { ((InputStream)stream).close(); throw throwable; } catch (IOException iOException) { return null; } } ((InputStream)stream).close(); return jSONObject; } private static void writeStates(JSONObject object, File statesFile) { if (statesFile == null) { return; } if (object == null) { statesFile.delete(); return; } File dir = statesFile.getParentFile(); if (dir != null) { dir.mkdirs(); } try { try (FileWriter writer = new FileWriter(statesFile);){ object.write((Writer)writer); } } catch (IOException iOException) {} } static /* synthetic */ void access$8(boolean bl) { subscriptionVerified = bl; } static /* synthetic */ void access$20(LicenseVerifier licenseVerifier, VerificationJob verificationJob) { licenseVerifier.verifyJob = verificationJob; } private static class Cryptus { private Cryptus() { } protected static String encrypt(String src, String key) { if (src == null || "".equals(src) || key == null || "".equals(key)) { return src; } try { byte[] keyBytes = key.getBytes(); byte[] srcBytes = src.getBytes(); byte[] destBytes = Cryptus.encdec(keyBytes, srcBytes, 1); return new String(Hex.encodeHex((byte[])destBytes)); } catch (Exception e) { if (DEBUGGING || VERBOSE) { e.printStackTrace(); } return null; } } protected static String decrypt(String dest, String key) { if (dest == null || "".equals(dest) || key == null || "".equals(key)) { return dest; } try { byte[] keyBytes = key.getBytes(); byte[] destBytes = Hex.decodeHex((char[])dest.toCharArray()); byte[] srcBytes = Cryptus.encdec(keyBytes, destBytes, 2); return new String(srcBytes); } catch (Exception e) { if (DEBUGGING || VERBOSE) { e.printStackTrace(); } return null; } } private static byte[] encdec(byte[] key, byte[] data, int cipherMode) throws GeneralSecurityException { MessageDigest hash = MessageDigest.getInstance("MD5"); byte[] keyDigest = hash.digest(key); DESKeySpec keySpec = new DESKeySpec(keyDigest, keyDigest.length - 8); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(keySpec); IvParameterSpec ivParam = new IvParameterSpec(keyDigest, 0, 8); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(cipherMode, (Key)secretKey, ivParam); return cipher.doFinal(data); } } /* * This class specifies class file version 49.0 but uses Java 6 signatures. Assumed Java 6. */ private static enum FreeStartDate { Brooks(3, 6, 1443628800000L), Cage(3, 7, 1475251200000L); private int majorVersion; private int minorVersion; private long startDate; private FreeStartDate(int majorVesion, int minorVersion, long startDate) { this.majorVersion = majorVesion; this.minorVersion = minorVersion; this.startDate = startDate; } public long getStartDate() { return this.startDate; } public static FreeStartDate findByVersion(int majorVersion, int minorVersion) { for (FreeStartDate freeStartDate : FreeStartDate.values()) { if (freeStartDate.majorVersion != majorVersion || freeStartDate.minorVersion != minorVersion) continue; return freeStartDate; } return null; } } private static class ValidityNotifier { private IVerifyListener listener; private Display display; public ValidityNotifier(IVerifyListener listener) { this.listener = listener; this.display = Display.getCurrent(); } public void notifyValidityListener(final IValidity validity) { if (this.display != null) { if (!this.display.isDisposed()) { this.display.syncExec(new Runnable(){ @Override public void run() { SafeRunner.run((ISafeRunnable)new SafeRunnable(){ public void run() throws Exception { ValidityNotifier.this.listener.notifyValidity(validity); } }); } }); } } else { SafeRunner.run((ISafeRunnable)new SafeRunnable(){ public void run() throws Exception { ValidityNotifier.this.listener.notifyValidity(validity); } }); } } public boolean notifyValidityCallback(IValidity validity) { this.notifyValidityListener(validity); return false; } } /* * This class specifies class file version 49.0 but uses Java 6 signatures. Assumed Java 6. */ private static class VerificationJob extends Job { private static final String CLEARED = "cleared"; private List<String> featureKeys = new ArrayList<String>(2); private List<String> actionNames = new ArrayList<String>(2); private int requiredStatus; private int style; private IStatus validity; private String licenseKey = null; private String licenseEmail = null; private String user = null; private String authToken = null; private String subscriptionExpireDate = null; private String uid = null; private String expiration = null; private XMindNetRequest retrieveUIDRequest = new XMindNetRequest(); private XMindNetRequest retrieveSubscriptionRequest = new XMindNetRequest(); private Window currentDialog = null; private Properties userInput; public VerificationJob(String featureKey, String actionName, int requiredStatus, int style, Properties userInput) { super("Verify License"); if (featureKey != null) { this.featureKeys.add(featureKey); } if (actionName != null) { this.actionNames.add(actionName); } this.requiredStatus = requiredStatus; this.style = style; if (userInput == null) { this.userInput = null; } else { this.userInput = new Properties(); this.userInput.putAll(userInput); } this.validity = LicenseVerifier.createValidity(1024); this.setSystem(true); } public void updateFeatureKey(String featureKey) { if (featureKey != null) { this.featureKeys.add(featureKey); } } public void updateActionName(String actionName) { if (actionName != null) { this.actionNames.add(actionName); } } public void updateRequiredStatus(int newStatus) { this.requiredStatus &= newStatus; } public void updateStyle(int newStyle) { this.style = VerificationJob.mergeStyle(this.style, newStyle, 1, true); this.style = VerificationJob.mergeStyle(this.style, newStyle, 2, true); this.style = VerificationJob.mergeStyle(this.style, newStyle, 4, false); this.style = VerificationJob.mergeStyle(this.style, newStyle, 8, false); } private static int mergeStyle(int style, int newStyle, int bit, boolean and) { if (and) { return style & (newStyle & bit | ~bit); } return style | newStyle & bit; } protected IStatus run(IProgressMonitor monitor) { this.verify(monitor); if (monitor.isCanceled() && !LicenseVerifier.checkValid(this.validity, 7)) { this.validity = LicenseVerifier.createValidity(1024, null, null, null, true); } LicenseVerifier.saveLocalData(this.uid, this.expiration, this.licenseKey, this.licenseEmail, this.subscriptionExpireDate); return this.validity; } private boolean isValid() { return LicenseVerifier.checkValid(this.validity, this.requiredStatus); } private void verify(IProgressMonitor monitor) { this.verifyVindy(monitor); if (monitor.isCanceled()) { return; } if (this.isValid()) { return; } this.loadDataFromLocalStorage(monitor); if (monitor.isCanceled()) { return; } this.verifyLoadedData(monitor); if (monitor.isCanceled()) { return; } if (this.userInput == null && (this.style & 8) == 0 && (this.isValid() || (this.style & 2) != 0)) { return; } this.waitForWorkbenchReady(monitor); if (monitor.isCanceled()) { return; } this.showDialog(monitor); } private void loadDataFromLocalStorage(IProgressMonitor monitor) { Properties store = LicenseVerifier.loadLocalData(); if (store != null) { this.licenseKey = store.getProperty("WalkingInTheMorning"); this.licenseEmail = store.getProperty("TimeSmilesInMyHand"); IAccountInfo account = XMindNet.getAccountInfo(); this.user = account == null ? null : account.getUser(); this.authToken = account == null ? null : account.getAuthToken(); this.uid = store.getProperty("ThisDawn"); this.expiration = store.getProperty("LastsAllDay"); this.subscriptionExpireDate = store.getProperty("LastAllDay"); } else { IPreferenceStore pref = VerifyPlugin.getDefault().getPreferenceStore(); this.licenseKey = pref.getString("licenseKey"); this.licenseEmail = pref.getString("licenseEmail"); this.uid = pref.getString("uid"); this.expiration = pref.getString("expiration"); LicenseVerifier.saveLocalData(this.uid, this.expiration, this.licenseKey, this.licenseEmail); pref.setToDefault("licenseKey"); pref.setToDefault("licenseEmail"); pref.setToDefault("uid"); pref.setToDefault("expiration"); } if (this.licenseKey == null || "".equals(this.licenseKey)) { this.licenseKey = System.getProperty("org.xmind.product.license.key", this.licenseKey); } if (this.licenseEmail == null || "".equals(this.licenseEmail)) { this.licenseEmail = System.getProperty("org.xmind.product.license.registeredEmail", this.licenseEmail); } } /* * Exception decompiling */ private void waitForWorkbenchReady(IProgressMonitor monitor) { // This method has failed to decompile. When submitting a bug report, please provide this stack trace, and (if you hold appropriate legal rights) the relevant class file. // org.benf.cfr.reader.util.ConfusedCFRException: Started 2 blocks at once // org.benf.cfr.reader.bytecode.analysis.opgraph.Op04StructuredStatement.getStartingBlocks(Op04StructuredStatement.java:404) // org.benf.cfr.reader.bytecode.analysis.opgraph.Op04StructuredStatement.buildNestedBlocks(Op04StructuredStatement.java:482) // org.benf.cfr.reader.bytecode.analysis.opgraph.Op03SimpleStatement.createInitialStructuredBlock(Op03SimpleStatement.java:619) // org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisInner(CodeAnalyser.java:699) // org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisOrWrapFail(CodeAnalyser.java:188) // org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysis(CodeAnalyser.java:123) // org.benf.cfr.reader.entities.attributes.AttributeCode.analyse(AttributeCode.java:96) // org.benf.cfr.reader.entities.Method.analyse(Method.java:397) // org.benf.cfr.reader.entities.ClassFile.analyseMid(ClassFile.java:906) // org.benf.cfr.reader.entities.ClassFile.analyseInnerClassesPass1(ClassFile.java:778) // org.benf.cfr.reader.entities.ClassFile.analyseMid(ClassFile.java:886) // org.benf.cfr.reader.entities.ClassFile.analyseTop(ClassFile.java:797) // org.benf.cfr.reader.Driver.doClass(Driver.java:58) // org.benf.cfr.reader.CfrDriverImpl.analyse(CfrDriverImpl.java:67) // me.coley.recaf.util.CFRPipeline.decompile(CFRPipeline.java:45) // me.coley.recaf.ui.component.DecompileItem$FxDecompile.<init>(DecompileItem.java:184) // me.coley.recaf.ui.component.DecompileItem.decompile(DecompileItem.java:94) // me.coley.recaf.ui.component.DecompileItem$DecompileButton.lambda$getEditor$0(DecompileItem.java:445) // com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) // com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) // com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) // com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) // com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) // javafx.event.Event.fireEvent(Event.java:198) // javafx.scene.Node.fireEvent(Node.java:8411) // javafx.scene.control.Button.fire(Button.java:185) // com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) // com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) // com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) // com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) // com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) // com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) // com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) // com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) // com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) // com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) // com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) // javafx.event.Event.fireEvent(Event.java:198) // javafx.scene.Scene$MouseHandler.process(Scene.java:3757) // javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) // javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) // javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) // com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394) // com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) // java.security.AccessController.doPrivileged(Native Method) // com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$358(GlassViewEventHandler.java:432) // com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) // com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431) // com.sun.glass.ui.View.handleMouseEvent(View.java:555) // com.sun.glass.ui.View.notifyMouse(View.java:937) throw new IllegalStateException("Decompilation failed"); } private boolean isWorkbenchReady() { return "workbenchReady".equals(System.getProperty("org.xmind.cathy.app.status")); } private void verifyLoadedData(IProgressMonitor monitor) { if (this.hasLicenseKey() && this.hasLicenseEmail()) { net.xmind.signin.ILicenseKeyHeader header; IStatus oldValidity = this.validity; this.verifyLicenseKey(monitor); if ((this.validity.getCode() & 6) != 0 && this.validity instanceof IValidity && (header = ((IValidity)this.validity).getLicenseKeyHeader()) != null && "C".equals(header.getLicenseType())) { if (DEBUGGING || VERBOSE) { System.out.println("VLE license keys are excluded from activating non-VLE products."); } this.validity = oldValidity; if (DEBUGGING || VERBOSE) { System.out.println("Reverted to back to previous validity: " + (Object)oldValidity); } } } if (monitor.isCanceled()) { return; } IStatus licenseValidity = this.validity; if (this.hasUser() && this.hasAuthToken()) { if (this.hasUID() && this.hasExpiration()) { this.verifyLocalSubscriptionInfo(monitor); if (this.isValid()) { this.mergeVeifyInfo(licenseValidity); LicenseVerifier.access$8(true); return; } } if (monitor.isCanceled()) { return; } if (!subscriptionVerified) { this.verifySubscription(monitor); if (this.isValid()) { this.mergeVeifyInfo(licenseValidity); LicenseVerifier.access$8(true); return; } } this.validity = licenseValidity; LicenseVerifier.access$8(true); } } private void mergeVeifyInfo(IStatus licenseValidity) { if (!LicenseVerifier.hasValidity(this.validity, 1) || LicenseVerifier.hasValidity(licenseValidity, 1024)) { return; } if (LicenseVerifier.hasValidity(licenseValidity, 2)) { if (licenseValidity instanceof IValidity) { net.xmind.signin.ILicenseKeyHeader header = ((IValidity)licenseValidity).getLicenseKeyHeader(); this.validity = LicenseVerifier.createValidity(3, ((IValidity)licenseValidity).getLicensedTo(), header); } return; } if (LicenseVerifier.hasValidity(licenseValidity, 4)) { this.validity = LicenseVerifier.createValidity(5, this.user, null); return; } } private void verifyLocalSubscriptionInfo(IProgressMonitor monitor) { this.validity = LicenseVerifier.createValidity(LicenseVerifier.parseExpiration(this.expiration, this.uid), this.user, null); } private void verifyLicenseKey(IProgressMonitor monitor) { String trimmedLicenseEmail; String trimmedLicenseKey = LicenseVerifier.trimLicenseKey(this.licenseKey); String string = trimmedLicenseEmail = this.licenseEmail == null ? this.licenseEmail : this.licenseEmail.trim(); if (LicenseVerifier.isLicenseKeyBlacklisted(trimmedLicenseKey, trimmedLicenseEmail)) { this.validity = LicenseVerifier.createValidity(8192); } else { this.doVerifyLicenseKey(monitor, trimmedLicenseEmail, trimmedLicenseKey, trimmedLicenseEmail); if (!this.isValid()) { IStatus oldValidity = this.validity; this.doVerifyLicenseKey(monitor, "sales+daobansiquanjia@xmind.net", trimmedLicenseKey, trimmedLicenseEmail); if (!this.isValid()) { this.validity = LegacyLicenseVerifierUtil.verifyLicenseKey(trimmedLicenseKey); if (!this.isLegacyValidity()) { this.validity = oldValidity; } } } } } private void doVerifyLicenseKey(IProgressMonitor monitor, String email, String licenseKey, String licensedTo) { email = email.toLowerCase(); if (VERBOSE) { System.out.println("Verifying license key: " + licenseKey); } if (licenseKey.length() != 225) { if (DEBUGGING || VERBOSE) { System.out.println("Invalid license key length: " + licenseKey.length()); } this.validity = LicenseVerifier.createValidity(8192); return; } try { int targetStatus; int minorVersion; FreeStartDate freeStartDate; int majorVersion; Object[] commonParameters; String headerStr = licenseKey.substring(0, 12); LicenseKeyHeader header = LicenseKeyHeader.decode(headerStr); if (VERBOSE) { System.out.println("License key header: " + header.toString()); } if ((freeStartDate = FreeStartDate.findByVersion(majorVersion = header.getMajorVersionNumber(), minorVersion = header.getMinorVersionNumber())) != null) { long startDate = freeStartDate.getStartDate(); long freeMonths = (long)(header.getFreeMonths() * 30 * 24 * 60 * 60) * 1000L; if (freeMonths != 0L && startDate + freeMonths < System.currentTimeMillis()) { this.validity = LicenseVerifier.createValidity(8192, null, header, null, false); return; } } String licenseType = header.getLicenseType(); if (VERBOSE) { System.out.println("License key type: " + licenseType); } if ((commonParameters = VerificationJob.getCommonVerifierParameters(licenseType)) == null) { if (DEBUGGING || VERBOSE) { System.out.println("Unrecognized license key type: " + licenseType); } this.validity = LicenseVerifier.createValidity(8192, null, header, null, false); return; } String suffix = (String)commonParameters[0]; byte[] publicKey = (byte[])commonParameters[1]; if (VERBOSE) { System.out.println("License key base suffix: " + suffix); System.out.println("License key public key: " + Arrays.toString(publicKey)); } if ("B".equals(licenseType)) { targetStatus = 4; if (VERBOSE) { System.out.println("License key is for XMind Plus (" + header.getLicenseeType() + ")."); } } else { targetStatus = 2; if (VERBOSE) { System.out.println("License key is for XMind Pro (" + header.getLicenseeType() + ")."); } } String baseStr = String.valueOf(licenseKey.substring(0, 20)) + email + suffix; String signatureStr = licenseKey.substring(20); if (VERBOSE) { System.out.println("Base (UTF-8): " + baseStr); System.out.println("Signature (Base32): " + signatureStr); } byte[] base = baseStr.getBytes("UTF-8"); byte[] signature = Base32.decode(signatureStr); if (VERBOSE) { System.out.println("Base: " + Arrays.toString(base)); System.out.println("Signature: " + Arrays.toString(signature)); } if (this.checkSignatureValid(base, signature, publicKey)) { if (VERBOSE) { System.out.println("Verified: VALID. Licensed to '" + licensedTo + "'."); } this.validity = LicenseVerifier.createValidity(targetStatus, licensedTo, header); } else { if (DEBUGGING || VERBOSE) { System.out.println("Invalid signature: " + signatureStr); } this.validity = LicenseVerifier.createValidity(8192); } } catch (Throwable e) { if (DEBUGGING) { e.printStackTrace(); } this.validity = LicenseVerifier.createValidity(1073741824, e); } } private boolean checkSignatureValid(byte[] base, byte[] signature, byte[] publicKey) throws Exception { X509EncodedKeySpec ks = new X509EncodedKeySpec(Base64.decodeBase64((byte[])publicKey)); KeyFactory kf = KeyFactory.getInstance("RSA"); PublicKey pub = kf.generatePublic(ks); Signature signer = Signature.getInstance("SHA256withRSA"); signer.initVerify(pub); signer.update(base); return signer.verify(signature); } private void verifyVindy(IProgressMonitor monitor) { String distribId = System.getProperty("org.xmind.product.distribution.id"); if (distribId == null || "".equals(distribId) || !distribId.startsWith("vindy")) { return; } String org = System.getProperty("org.xmind.product.distribution.vindy.org"); if (org == null || "".equals(org)) { return; } String time = System.getProperty("org.xmind.product.distribution.vindy.time"); if (time == null || "".equals(time)) { return; } String signatureStr = System.getProperty("org.xmind.product.distribution.vindy.name"); if (signatureStr == null || "".equals(signatureStr)) { return; } String baseStr = String.valueOf(distribId) + "@" + time; IStatus originalStatus = this.validity; this.doVerifyLicenseKey(monitor, baseStr, LicenseVerifier.trimLicenseKey(signatureStr), org); if (!this.isValid()) { this.validity = originalStatus; } } private void verifySubscription(IProgressMonitor monitor) { this.retrieveUID(monitor); if (monitor.isCanceled()) { return; } if (this.hasUID()) { this.retrieveSubscription(monitor); } } private void showDialog(IProgressMonitor monitor) { if (monitor.isCanceled()) { return; } IWorkbench workbench = PlatformUI.getWorkbench(); while (!monitor.isCanceled()) { int targetStatus; if (this.userInput == null) { targetStatus = LicenseVerifier.hasValidity(this.validity, 2) ? 2 : (LicenseVerifier.hasValidity(this.validity, 1) && !LicenseVerifier.hasValidity(this.validity, 2) ? 1 : (this.isValid() && !LicenseVerifier.hasValidity(this.validity, 1) && LicenseVerifier.hasValidity(this.validity, 4) ? 4 : (LicenseVerifier.hasValidity(this.validity, 4) && !LicenseVerifier.hasValidity(this.validity, 1) && (3 & this.requiredStatus) != 0 ? this.openPlusMessageDialog(monitor, workbench) : this.openLicenseDialog(monitor, workbench)))); if (targetStatus < 0 || monitor.isCanceled()) { return; } } else { targetStatus = 7; } this.openVerifyTargetDialog(monitor, workbench, targetStatus); if (LicenseVerifier.hasValidity(this.validity, this.requiredStatus) && (this.style & 4) == 0 && (this.style & 8) == 0) break; } } private void openVerifyTargetDialog(IProgressMonitor monitor, IWorkbench workbench, int targetStatus) { String errorMessage = null; Properties oldData = this.backupLocalData(); IStatus oldValidity = this.validity; while (!monitor.isCanceled()) { Properties data = this.openInputDialog(monitor, workbench, targetStatus, errorMessage); if (data == null) { this.loadDataFromUserInput(oldData); this.validity = oldValidity; return; } if (monitor.isCanceled()) { return; } this.loadDataFromUserInput(data); this.validity = LicenseVerifier.createValidity(1024); boolean[] verifying = new boolean[]{true}; this.openVerifyingDialog(monitor, workbench, verifying); LicenseVerifier.access$8(false); this.verifyLoadedData(monitor); if (monitor.isCanceled()) { return; } verifying[0] = false; this.closeVerifyingDialog(monitor, workbench); if (this.isValid()) { if (targetStatus == 1 || !LicenseVerifier.hasValidity(oldValidity, 1) && LicenseVerifier.hasValidity(this.validity, 1)) { System.currentTimeMillis(); this.openSubscriptionInfoDialog(monitor, workbench); } else if (targetStatus != 1 && !LicenseVerifier.hasValidity(oldValidity, targetStatus) && LicenseVerifier.hasValidity(this.validity, targetStatus)) { this.openVerifyTargetDialog(monitor, workbench, targetStatus); } else if (targetStatus == 6 && LicenseVerifier.hasValidity(oldValidity, 1) && !LicenseVerifier.hasValidity(this.validity, 6)) { errorMessage = Messages.LicenseInputDialog_InvalidLicenseKeyErrorMessage; continue; } return; } if (data.getProperty(CLEARED) != null) { return; } if (this.hasUser() && this.hasAuthToken()) { this.openSubscriptionInfoDialog(monitor, workbench); return; } errorMessage = this.generateErrorMessage(); } } private void openSubscriptionInfoDialog(final IProgressMonitor monitor, final IWorkbench workbench) { while (!monitor.isCanceled()) { this.runWithUI(monitor, workbench, new Runnable(){ @Override public void run() { int code; SubscriptionInfoDialog dialog; Shell parentShell = VerificationJob.this.getParentShell(workbench); int status = 4096; long expireDate = 0L; if (VerificationJob.this.expiration != null) { status = LicenseVerifier.parseExpiration(VerificationJob.this.expiration, VerificationJob.this.uid); expireDate = LicenseVerifier.parseExpireDate(VerificationJob.this.expiration, VerificationJob.this.uid); } if (VerificationJob.this.subscriptionExpireDate != null) { expireDate = LicenseVerifier.parseExpireDate(VerificationJob.this.subscriptionExpireDate, VerificationJob.this.uid); } if ((code = (dialog = new SubscriptionInfoDialog(parentShell, status, VerificationJob.this.user, expireDate)).open()) == 0 || code == 1) { monitor.setCanceled(true); LicenseVerifier.access$8(true); } } }, false); } } private void openVerifyingDialog(final IProgressMonitor monitor, final IWorkbench workbench, final boolean[] verifying) { this.runWithUI(monitor, workbench, new Runnable(){ @Override public void run() { if (!verifying[0]) { return; } Shell parentShell = VerificationJob.this.getParentShell(workbench); VerifyingStatusDialog dialog = new VerifyingStatusDialog(parentShell); VerificationJob.access$5(VerificationJob.this, (Window)dialog); int code = dialog.open(); VerificationJob.access$5(VerificationJob.this, null); if (code != 0) { VerificationJob.this.cancel(); monitor.setCanceled(true); } } }, true, 200); } private void closeVerifyingDialog(IProgressMonitor monitor, IWorkbench workbench) { this.runWithUI(monitor, workbench, new Runnable(){ @Override public void run() { if (VerificationJob.this.currentDialog != null) { VerificationJob.this.currentDialog.close(); VerificationJob.access$5(VerificationJob.this, null); } } }, false); } private String generateErrorMessage() { if (LicenseVerifier.hasValidity(this.validity, 8192)) { return Messages.LicenseInputDialog_InvalidLicenseKeyErrorMessage; } if (LicenseVerifier.hasValidity(this.validity, 2048)) { return Messages.LicenseInputDialog_SubscriptionExpiredErrorMessage; } if (LicenseVerifier.hasValidity(this.validity, 4096)) { return Messages.LicenseInputDialog_NotSubscribedErrorMessage; } if (LicenseVerifier.hasValidity(this.validity, 1073741824)) { return Messages.LicenseInputDialog_UnexpectedErrorMessage; } if (this.isLegacyValidity()) { return this.getLegacyErrorMessage(); } return null; } private String getLegacyErrorMessage() { if (this.validity instanceof LegacyValidity) { int version = ((LegacyValidity)this.validity).getLegacyVersion(); if (LegacyValidity.LegacyVersion.XMIND_2012.getValue() == version) { return NLS.bind((String)Messages.LicenseInputDialog_LegacyLicenseKeyErrorMessage, (Object)"XMind 2012"); } if (LegacyValidity.LegacyVersion.XMIND_2013_PRO.getValue() == version) { return NLS.bind((String)Messages.LicenseInputDialog_LegacyLicenseKeyErrorMessage, (Object)"XMind 2013 Pro"); } if (LegacyValidity.LegacyVersion.XMIND_2013_PLUS.getValue() == version) { return NLS.bind((String)Messages.LicenseInputDialog_LegacyLicenseKeyErrorMessage, (Object)"XMind 2013 Plus"); } if (LegacyValidity.LegacyVersion.XMIND_6_PRO.getValue() == version) { return NLS.bind((String)Messages.LicenseInputDialog_LegacyLicenseKeyErrorMessage, (Object)"XMind 6 Pro"); } if (LegacyValidity.LegacyVersion.XMIND_6_PLUS.getValue() == version) { return NLS.bind((String)Messages.LicenseInputDialog_LegacyLicenseKeyErrorMessage, (Object)"XMind 6 Plus"); } if (LegacyValidity.LegacyVersion.XMIND_7_PRO.getValue() == version) { return NLS.bind((String)Messages.LicenseInputDialog_LegacyLicenseKeyErrorMessage, (Object)"XMind 7 Pro"); } if (LegacyValidity.LegacyVersion.XMIND_7_PLUS.getValue() == version) { return NLS.bind((String)Messages.LicenseInputDialog_LegacyLicenseKeyErrorMessage, (Object)"XMind 7 Plus"); } } return null; } private Properties backupLocalData() { Properties data = new Properties(); if (this.licenseEmail != null) { data.setProperty("TimeSmilesInMyHand", this.licenseEmail); } if (this.licenseKey != null) { data.setProperty("WalkingInTheMorning", this.licenseKey); } if (this.user != null) { data.setProperty("user", this.user); } if (this.authToken != null) { data.setProperty("token", this.authToken); } if (this.uid != null) { data.setProperty("ThisDawn", this.uid); } if (this.expiration != null) { data.setProperty("LastsAllDay", this.expiration); } if (this.subscriptionExpireDate != null) { data.setProperty("LastAllDay", this.subscriptionExpireDate); } return data; } private int openPlusMessageDialog(IProgressMonitor monitor, IWorkbench workbench) { final Shell parentShell = this.getParentShell(workbench); this.runWithUI(monitor, workbench, new Runnable(){ @Override public void run() { new MessageDialog(parentShell, Messages.LicenseVerifyPlustoPro_Title, null, Messages.LicenseVerifyPlustoPro_Message, 4, new String[]{IDialogConstants.CLOSE_LABEL}, 0).open(); } }, false); return -1; } private int openLicenseDialog(IProgressMonitor monitor, final IWorkbench workbench) { final int[] target = new int[]{-1}; this.runWithUI(monitor, workbench, new Runnable(){ @Override public void run() { Shell parentShell = VerificationJob.this.getParentShell(workbench); LicenseInfoDialog2 dialog = new LicenseInfoDialog2(parentShell, VerificationJob.this.featureKeys, VerificationJob.joinStr(VerificationJob.this.actionNames), VerificationJob.this.requiredStatus, VerificationJob.this.validity.getCode(), (VerificationJob.this.style & 4) != 0, (VerificationJob.this.style & 8) != 0, VerificationJob.this.validity instanceof IValidity && (VerificationJob.this.validity.getCode() & 7) != 0 ? ((IValidity)VerificationJob.this.validity).getLicensedTo() : null); VerificationJob.access$5(VerificationJob.this, (Window)dialog); int code = dialog.open(); VerificationJob.access$5(VerificationJob.this, null); target[0] = code == 0 ? dialog.getTargetStatus() : -1; } }, false); return target[0]; } private boolean hasLicenseOrSubscription() { return LicenseVerifier.hasValidity(this.validity, 4) || LicenseVerifier.hasValidity(this.validity, 2) || LicenseVerifier.hasValidity(this.validity, 1); } private Properties openInputDialog(final IProgressMonitor monitor, final IWorkbench workbench, final int targetStatus, final String errorMessage) { final Properties data = this.backupLocalData(); Properties input = this.userInput; this.userInput = null; if (input != null) { if (input.containsKey(LicenseVerifier.PROP_LICENSE_EMAIL)) { data.setProperty("TimeSmilesInMyHand", input.getProperty(LicenseVerifier.PROP_LICENSE_EMAIL)); } if (input.containsKey(LicenseVerifier.PROP_LICENSE_KEY)) { data.setProperty("WalkingInTheMorning", input.getProperty(LicenseVerifier.PROP_LICENSE_KEY)); } } final boolean[] canceled = new boolean[1]; if ((targetStatus & 6) != 0) { this.runWithUI(monitor, workbench, new Runnable(){ @Override public void run() { Shell parentShell = VerificationJob.this.getParentShell(workbench); LicenseKeyInputDialog2 dialog = new LicenseKeyInputDialog2(parentShell, data, VerificationJob.this.requiredStatus, VerificationJob.this.validity, false, LicenseVerifier.hasValidity(VerificationJob.this.validity, targetStatus)); dialog.setErrorMessage(errorMessage); VerificationJob.access$5(VerificationJob.this, (Window)dialog); int code = dialog.open(); VerificationJob.access$5(VerificationJob.this, null); if (code == 1024) { data.setProperty(VerificationJob.CLEARED, "yes"); } if (code == 0 && LicenseVerifier.hasValidity(VerificationJob.this.validity, 6) && !LicenseVerifier.hasValidity(VerificationJob.this.validity, 1)) { monitor.setCanceled(true); } if (code == 1025) { monitor.setCanceled(true); } if (code == 1 && VerificationJob.this.hasLicenseOrSubscription()) { monitor.setCanceled(true); } canceled[0] = code != 0 && code != 1024; } }, false); } else if (!(targetStatus != 1 || this.hasUser() && this.hasAuthToken())) { this.runWithUI(monitor, workbench, new Runnable(){ @Override public void run() { Shell parentShell = VerificationJob.this.getParentShell(workbench); IAccount account = AccountManager.getPrimaryAccount(); AuthenticationDialog dialog = new AuthenticationDialog(parentShell, account, null); dialog.setErrorMessage(errorMessage); VerificationJob.access$5(VerificationJob.this, (Window)dialog); int code = dialog.open(); VerificationJob.access$5(VerificationJob.this, null); boolean bl = canceled[0] = code != 0; if (code == 0) { data.put("token", account.getProperty("token")); data.put("user", account.getProperty("user")); data.remove("ThisDawn"); data.remove("LastsAllDay"); data.remove("LastAllDay"); LicenseVerifier.access$8(false); } } }, false); } if (canceled[0]) { return null; } return data; } private void runWithUI(IProgressMonitor monitor, IWorkbench workbench, Runnable runnable, boolean async) { this.runWithUI(monitor, workbench, runnable, async, 0); } private void runWithUI(IProgressMonitor monitor, IWorkbench workbench, final Runnable runnable, boolean async, final int delay) { final Display display = workbench.getDisplay(); if (display == null || display.isDisposed()) { this.cancel(); monitor.setCanceled(true); return; } if (monitor.isCanceled()) { return; } final Throwable[] exception = new Throwable[]{null}; final Runnable job = new Runnable(){ @Override public void run() { try { runnable.run(); } catch (Throwable e) { exception[0] = e; } } }; if (async) { if (delay > 0) { display.asyncExec(new Runnable(){ @Override public void run() { display.timerExec(delay, job); } }); } else { display.asyncExec(job); } } else { display.syncExec(job); } if (exception[0] != null) { throw new IllegalStateException(exception[0].getLocalizedMessage(), exception[0]); } } private Shell getParentShell(IWorkbench workbench) { Shell parentShell; IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); Shell shell = parentShell = window == null ? null : window.getShell(); if (parentShell != null && parentShell.isDisposed()) { parentShell = null; } return parentShell; } private static String joinStr(Collection<String> strings) { StringBuffer sb = new StringBuffer(strings.size() * 10); for (String s : strings) { if (sb.length() > 0) { sb.append(", "); } sb.append(s); } return sb.toString(); } private void loadDataFromUserInput(Properties data) { this.licenseEmail = data.getProperty("TimeSmilesInMyHand"); this.licenseKey = data.getProperty("WalkingInTheMorning"); this.user = data.getProperty("user"); this.authToken = data.getProperty("token"); this.uid = data.getProperty("ThisDawn"); this.expiration = data.getProperty("LastsAllDay"); this.subscriptionExpireDate = data.getProperty("LastAllDay"); } private void retrieveSubscription(IProgressMonitor monitor) { boolean isCnUser = AccountManager.getPrimaryAccount().isCnUser(); this.retrieveSubscriptionRequest.uri(LinkUtils.getLinkByUser((boolean)isCnUser, (boolean)true, (boolean)true, (String)EncodingUtils.format((String)"/_res/verify/%s", (Object[])new Object[]{this.user}))).addHeader("UID", this.uid).get(); if (monitor.isCanceled() || this.retrieveSubscriptionRequest.isAborted()) { return; } int code = this.retrieveSubscriptionRequest.getStatusCode(); IDataStore data = this.retrieveSubscriptionRequest.getData(); if (code == 200 && data != null) { this.expiration = LicenseVerifier.extractExpiration(data, this.uid); this.subscriptionExpireDate = LicenseVerifier.extractExpireDate(data, this.uid); this.validity = this.expiration == null ? LicenseVerifier.createValidity(4096) : LicenseVerifier.createValidity(LicenseVerifier.parseExpiration(this.expiration, this.uid), this.user, null); } else if (this.retrieveUIDRequest.getError() != null) { this.validity = LicenseVerifier.createValidity(1073741824, this.retrieveUIDRequest.getError()); } else if (code >= 500 || code < 400) { this.validity = LicenseVerifier.createValidity(1073741824); } } private void retrieveUID(IProgressMonitor monitor) { boolean isCnUser = AccountManager.getPrimaryAccount().isCnUser(); this.retrieveUIDRequest.uri(LinkUtils.getLinkByUser((boolean)isCnUser, (boolean)true, (boolean)true, (String)EncodingUtils.format((String)"/_res/uid/%s", (Object[])new Object[]{this.user}))).setAuthToken(this.authToken).get(); if (monitor.isCanceled() || this.retrieveUIDRequest.isAborted()) { return; } int code = this.retrieveUIDRequest.getStatusCode(); IDataStore data = this.retrieveUIDRequest.getData(); if (code == 200 && data != null) { this.uid = data.getString("uid"); } else if (this.retrieveUIDRequest.getError() != null) { this.validity = LicenseVerifier.createValidity(1073741824, this.retrieveUIDRequest.getError()); } else if (code >= 500 || code < 400) { this.validity = LicenseVerifier.createValidity(1073741824); } } private boolean hasLicenseKey() { return this.licenseKey != null && !"".equals(this.licenseKey); } private boolean hasLicenseEmail() { return this.licenseEmail != null && !"".equals(this.licenseEmail); } private boolean hasUser() { return this.user != null && !"".equals(this.user); } private boolean hasAuthToken() { return this.authToken != null && !"".equals(this.authToken); } private boolean hasSubscriptionExpireDate() { return this.subscriptionExpireDate != null && !"".equals(this.subscriptionExpireDate); } private boolean hasUID() { return this.uid != null && !"".equals(this.uid); } private boolean hasExpiration() { return this.expiration != null && !"".equals(this.expiration); } protected void canceling() { IWorkbench workbench; Display display; this.retrieveUIDRequest.abort(); this.retrieveSubscriptionRequest.abort(); final Window dialog = this.currentDialog; if (dialog != null && (workbench = PlatformUI.getWorkbench()) != null && (display = workbench.getDisplay()) != null && !display.isDisposed()) { display.asyncExec(new Runnable(){ @Override public void run() { if (display.isDisposed()) { return; } dialog.close(); } }); } super.canceling(); } private static Object[] getCommonVerifierParameters(String type) { if (VerifyPlugin.getDefault().isDebugging(LicenseVerifier.DEBUG_KEYS)) { return VerificationJob.getDebuggingCommonVerifierParameters(type); } if ("A".equals(type)) { return new Object[]{"Ae;\t&2}w#n`If5!nu6#{!hBA1IMDx%\n", new byte[]{77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113, 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52, 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 67, 110, 47, 79, 88, 111, 85, 112, 98, 87, 70, 81, 117, 54, 78, 104, 55, 72, 85, 83, 66, 47, 115, 100, 74, 100, 114, 87, 110, 98, 72, 97, 74, 108, 75, 120, 87, 53, 76, 77, 69, 85, 88, 114, 75, 119, 47, 88, 85, 87, 65, 107, 81, 53, 100, 114, 69, 51, 89, 106, 66, 101, 84, 53, 47, 90, 87, 71, 110, 79, 85, 50, 81, 84, 108, 68, 48, 75, 72, 71, 87, 86, 48, 82, 122, 79, 110, 106, 97, 108, 119, 71, 122, 85, 85, 50, 116, 54, 87, 113, 84, 67, 118, 101, 104, 117, 55, 70, 84, 113, 52, 47, 105, 110, 119, 89, 48, 81, 83, 113, 47, 114, 97, 107, 116, 121, 51, 69, 74, 52, 76, 52, 70, 75, 100, 69, 122, 117, 113, 100, 82, 84, 109, 79, 77, 107, 47, 52, 78, 73, 54, 79, 57, 77, 50, 89, 55, 115, 99, 80, 81, 82, 79, 55, 83, 97, 97, 100, 67, 55, 47, 81, 73, 68, 65, 81, 65, 66}}; } if ("B".equals(type)) { return new Object[]{"/[{%R<M$MP\t%6$(hp}Cs=49<JQ\"V4m\n", new byte[]{77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113, 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52, 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 67, 101, 98, 71, 118, 48, 69, 51, 43, 67, 80, 108, 43, 107, 120, 116, 51, 86, 111, 87, 114, 76, 86, 66, 66, 50, 118, 65, 43, 71, 74, 84, 57, 109, 84, 107, 67, 109, 122, 121, 49, 119, 115, 47, 110, 86, 97, 65, 48, 51, 103, 84, 49, 103, 85, 111, 97, 72, 65, 79, 87, 122, 98, 73, 54, 115, 49, 120, 51, 108, 79, 75, 86, 113, 81, 114, 122, 66, 56, 98, 51, 80, 75, 51, 78, 56, 71, 56, 122, 51, 86, 50, 79, 82, 71, 73, 76, 100, 57, 84, 100, 81, 72, 120, 43, 57, 97, 79, 102, 102, 119, 111, 76, 69, 86, 87, 98, 75, 108, 80, 68, 74, 79, 107, 51, 56, 115, 90, 75, 53, 47, 70, 109, 83, 85, 81, 89, 74, 122, 113, 49, 56, 75, 72, 89, 81, 107, 68, 52, 100, 47, 69, 103, 55, 117, 86, 47, 57, 66, 54, 76, 68, 118, 83, 117, 103, 86, 115, 101, 57, 85, 119, 73, 68, 65, 81, 65, 66}}; } if ("C".equals(type)) { return new Object[]{"VqNMK{?5o<8SdD^hNb#.\n\\5}pN4<_L\t", new byte[]{77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113, 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52, 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 68, 80, 114, 81, 112, 81, 43, 101, 71, 65, 49, 49, 83, 102, 48, 82, 100, 43, 68, 102, 74, 115, 80, 72, 81, 81, 110, 71, 79, 43, 99, 89, 87, 72, 120, 90, 82, 84, 102, 114, 50, 121, 106, 54, 86, 79, 97, 97, 100, 49, 98, 119, 68, 74, 90, 110, 67, 83, 65, 90, 69, 75, 97, 115, 52, 48, 122, 102, 114, 84, 47, 117, 43, 70, 80, 71, 86, 71, 113, 107, 120, 76, 121, 76, 88, 66, 74, 113, 99, 111, 72, 79, 69, 66, 104, 116, 55, 100, 87, 113, 108, 117, 112, 120, 85, 85, 72, 54, 108, 55, 78, 122, 107, 100, 118, 117, 122, 71, 108, 114, 106, 67, 119, 103, 77, 65, 71, 100, 98, 73, 115, 77, 78, 115, 114, 111, 65, 57, 116, 119, 82, 76, 104, 79, 99, 43, 56, 89, 85, 65, 97, 97, 87, 115, 57, 67, 84, 122, 55, 122, 54, 85, 77, 80, 57, 67, 66, 119, 111, 102, 112, 119, 73, 68, 65, 81, 65, 66}}; } return null; } private static Object[] getDebuggingCommonVerifierParameters(String type) { if ("A".equals(type)) { return new Object[]{"PRO\n\t1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~-=!@#$%^&*()_+[]\\{}|;':\",./<>?", new byte[]{77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113, 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52, 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 67, 49, 114, 77, 99, 87, 113, 112, 111, 67, 87, 107, 75, 86, 84, 71, 108, 48, 57, 43, 117, 120, 43, 112, 111, 112, 54, 72, 105, 121, 51, 78, 88, 75, 104, 50, 80, 90, 107, 118, 86, 90, 97, 86, 105, 99, 88, 84, 78, 55, 108, 88, 47, 71, 116, 78, 100, 83, 111, 75, 70, 71, 83, 121, 115, 110, 56, 110, 84, 84, 49, 87, 109, 114, 66, 67, 122, 85, 111, 114, 89, 66, 115, 78, 73, 102, 89, 110, 51, 113, 88, 102, 111, 70, 122, 57, 104, 111, 50, 121, 57, 99, 68, 49, 98, 55, 83, 110, 120, 114, 110, 84, 81, 67, 99, 81, 119, 49, 86, 98, 104, 109, 57, 119, 102, 109, 100, 111, 48, 53, 74, 81, 71, 86, 102, 56, 106, 86, 84, 106, 105, 68, 74, 76, 104, 102, 109, 70, 57, 75, 104, 121, 79, 111, 103, 114, 105, 107, 89, 76, 73, 56, 73, 104, 67, 84, 70, 99, 121, 50, 107, 119, 73, 68, 65, 81, 65, 66}}; } //BAQADIwk2ycFTChI8ILYkirgoOyhK9FmfhLJDijTVj8fVGQJ50odmfw9mhbV1wQcCQTnrxnS7b1Dc9y2oh9zFofXq3nYfINsBYroUzCBrmW1TTn8nsySGFKoSdNtG/Xl7NTXciVaZVvkZP2hKXN3yiH6pop+xu+90lGTVKkWCopqWcMr1CQgBKQiBCDANG4AAUQABEQD3bISGqSCG0AMfGIM if ("B".equals(type)) { return new Object[]{"PLUS\n\t1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~-=!@#$%^&*()_+[]\\{}|;':\",./<>?", new byte[]{77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113, 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52, 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 68, 83, 86, 47, 102, 87, 118, 82, 101, 98, 120, 71, 120, 65, 53, 50, 68, 47, 110, 65, 47, 69, 113, 54, 117, 98, 56, 48, 98, 112, 116, 120, 74, 73, 74, 49, 107, 108, 66, 90, 120, 88, 85, 51, 108, 116, 65, 79, 108, 112, 105, 102, 100, 68, 99, 111, 50, 109, 71, 47, 89, 50, 118, 97, 83, 100, 67, 70, 104, 82, 50, 51, 71, 111, 107, 84, 65, 107, 48, 108, 122, 78, 70, 89, 66, 106, 119, 43, 65, 99, 86, 51, 55, 99, 105, 68, 119, 65, 109, 57, 70, 104, 83, 118, 115, 73, 67, 86, 84, 111, 88, 118, 69, 119, 109, 78, 55, 121, 98, 107, 122, 82, 100, 104, 89, 99, 119, 65, 83, 108, 81, 67, 116, 118, 50, 110, 47, 113, 116, 68, 55, 51, 99, 114, 76, 85, 66, 103, 122, 116, 89, 49, 84, 56, 74, 74, 110, 119, 79, 56, 107, 75, 118, 113, 67, 114, 110, 110, 68, 48, 71, 81, 73, 68, 65, 81, 65, 66}}; } if ("C".equals(type)) { return new Object[]{"VINDY\n\t1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~-=!@#$%^&*()_+[]\\{}|;':\",./<>?", new byte[]{77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113, 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52, 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 67, 118, 86, 85, 99, 120, 116, 53, 114, 103, 81, 97, 84, 90, 74, 104, 68, 103, 108, 70, 70, 99, 65, 48, 71, 103, 69, 89, 85, 119, 49, 74, 47, 100, 117, 78, 114, 122, 98, 86, 53, 78, 119, 122, 84, 73, 85, 76, 117, 108, 75, 48, 55, 48, 118, 82, 52, 112, 102, 109, 43, 55, 114, 114, 87, 120, 80, 119, 121, 84, 49, 106, 67, 117, 85, 101, 99, 110, 67, 101, 112, 77, 109, 103, 113, 56, 72, 74, 121, 119, 89, 55, 111, 89, 71, 106, 85, 74, 116, 47, 114, 86, 67, 114, 117, 118, 116, 118, 111, 118, 57, 54, 84, 97, 57, 69, 75, 107, 88, 103, 100, 115, 85, 88, 51, 119, 65, 109, 51, 56, 90, 100, 117, 111, 67, 101, 81, 71, 80, 43, 108, 109, 122, 82, 87, 118, 49, 110, 87, 111, 114, 50, 120, 84, 54, 66, 51, 120, 99, 49, 116, 114, 103, 89, 66, 110, 98, 75, 114, 75, 110, 81, 73, 68, 65, 81, 65, 66}}; } return null; } private boolean isLegacyValidity() { return LicenseVerifier.checkValid(this.validity, 16384); } static /* synthetic */ void access$5(VerificationJob verificationJob, Window window) { verificationJob.currentDialog = window; } } }