
Tuesday, November 20, 2012
Saturday, September 15, 2012
How to create java project in XCode 4
(1) Download the required file here and unzip it after download. http://www.2shared.com/file/vt3Flvvs/hellojava.html
Please choose the bottom blue download button in the download page.

(2) Create a new project in XCode 4, Choose "Other" -> "External Build System"

(3) Enter the Product Name say "project1". For Build Tool enter /usr/bin/ant

(4) Save the project in your disk
(5) Right click your "project1" in XCode 4 and Choose "Add Files to project1"

(6) Choose the file (build.xml) and folders (lib, resources, resources_macosx and src) in the unzipped file downloaded in step 1
Select "Copy items into destination group's folder (if needed)" and "Create groups for any added folders" and Press "Add" button.
(7) Edit build.xml and change the Project name attribute from "hellojava" to your Product Name say "project1"

(8) Edit Manifest and change the Main-Class from "hellojava" to your Product Name say "project1"

(9) Edit the filename hellojava.icns to Product Name say "project1.icns"

(10) Edit the filename hellojava.java to Product Name say "project1.java"

(11) Edit the class name in "project1.java" and change from "hellojava" to your Product Name say "project1" and then press "Command S" to save

(12) Press "Command B" to build

(13) Right click your "project1" in XCode 4 and Choose "Add Files to project1" again

(14) Choose folders (bin, dist and jars) from your save project location.
Select "Copy items into destination group's folder (if needed)" and "Create folder references for any added folders" and Press "Add" button.

(15) Select "Product" -> "Edit Scheme..." menu

(16) Select the "Run" Scheme and change the Executable "None"

(17) And Choose the "project1" app under the "dist" folder of the saved project location.

(18) Repeat the steps 16 and 17 but for the "Profile" Scheme.
(19) Press "Command R" to run. And a simple Hello World app is created with java source code.

(20) Modify the source code in "project1.java" to proceed further.
Here is the Xcode 4 Template for Java (v2)
http://www.2shared.com/file/hExLjJ1X/Java_Xcode4_template2.html
To install the template in Mac, use Terminal command
To Run after build (Command R), you have to do steps 15 to 18 above.
Please choose the bottom blue download button in the download page.

(2) Create a new project in XCode 4, Choose "Other" -> "External Build System"

(3) Enter the Product Name say "project1". For Build Tool enter /usr/bin/ant

(4) Save the project in your disk
(5) Right click your "project1" in XCode 4 and Choose "Add Files to project1"

(6) Choose the file (build.xml) and folders (lib, resources, resources_macosx and src) in the unzipped file downloaded in step 1
Select "Copy items into destination group's folder (if needed)" and "Create groups for any added folders" and Press "Add" button.

(7) Edit build.xml and change the Project name attribute from "hellojava" to your Product Name say "project1"

(8) Edit Manifest and change the Main-Class from "hellojava" to your Product Name say "project1"

(9) Edit the filename hellojava.icns to Product Name say "project1.icns"

(10) Edit the filename hellojava.java to Product Name say "project1.java"

(11) Edit the class name in "project1.java" and change from "hellojava" to your Product Name say "project1" and then press "Command S" to save

(12) Press "Command B" to build

(13) Right click your "project1" in XCode 4 and Choose "Add Files to project1" again

(14) Choose folders (bin, dist and jars) from your save project location.
Select "Copy items into destination group's folder (if needed)" and "Create folder references for any added folders" and Press "Add" button.

(15) Select "Product" -> "Edit Scheme..." menu

(16) Select the "Run" Scheme and change the Executable "None"

(17) And Choose the "project1" app under the "dist" folder of the saved project location.

(18) Repeat the steps 16 and 17 but for the "Profile" Scheme.
(19) Press "Command R" to run. And a simple Hello World app is created with java source code.

(20) Modify the source code in "project1.java" to proceed further.
Here is the Xcode 4 Template for Java (v2)
http://www.2shared.com/file/hExLjJ1X/Java_Xcode4_template2.html
To install the template in Mac, use Terminal command
mkdir -p ~/Library/Developer/Xcode/Templates/
unzip ~/Downloads/Java_Xcode4_template2.zip -d ~/Library/Developer/Xcode/Templates/
To Run after build (Command R), you have to do steps 15 to 18 above.
Saturday, September 8, 2012
How to decompile and recompile java program under Mac OS X
This Tutorial use XMind as an example.
1. Install JAVA SE6 (OS X v10.7/10.8) -> http://support.apple.com/kb/DL1572
JAVA SE6 (OS X v10.6) -> http://support.apple.com/kb/DL1573
JAVA SE5 & SE6 (OS X v10.5) -> http://support.apple.com/kb/DL1359
and install XMind (http://www.xmind.net/download/mac/)
2. Create environment folders and required library jar files for ant build
3. Use Java decompiler JD-GUI http://java.decompiler.free.fr/?q=jdgui to open/decompile the file ~/xmind.verify/lib/net.xmind.verify_3.3.0.201208102038.jar
4. save source code in JD-GUI for net.xmind.verify -> internal -> LicenseVerifier to folder ~/xmind.verify/src/net/xmind/verify/internal/
5. Modify LicenseVerifier.java as below
6. Create build environment for ant with build.xml (build.xml should be created in ~/xmind.verify/ folder) as below
7. ant clean & build
8. Update jar file and install to App folder
P.S. this is how to add line numbers to the source code and then convert the angle brackets for this blog.
1. Install JAVA SE6 (OS X v10.7/10.8) -> http://support.apple.com/kb/DL1572
JAVA SE6 (OS X v10.6) -> http://support.apple.com/kb/DL1573
JAVA SE5 & SE6 (OS X v10.5) -> http://support.apple.com/kb/DL1359
and install XMind (http://www.xmind.net/download/mac/)
2. Create environment folders and required library jar files for ant build
mkdir -p ~/xmind.verify/lib
mkdir -p ~/xmind.verify/src/net/xmind/verify/internal
cd ~/xmind.verify/lib
jar xvf /Applications/XMind.app/Contents/Resources/plugins/org.bouncycastle_1.4.7.jar bcprov-jdk15on-147.jar
cp /Applications/XMind.app/Contents/Resources/plugins/net.xmind.verify_3.3.0.201208102038.jar .
3. Use Java decompiler JD-GUI http://java.decompiler.free.fr/?q=jdgui to open/decompile the file ~/xmind.verify/lib/net.xmind.verify_3.3.0.201208102038.jar
4. save source code in JD-GUI for net.xmind.verify -> internal -> LicenseVerifier to folder ~/xmind.verify/src/net/xmind/verify/internal/
5. Modify LicenseVerifier.java as below
- LicenseVerifier.java Select all
/* 1 */ package net.xmind.verify.internal;
/* 2 */
/* 3 */ import java.util.ArrayList;
/* 4 */ import java.util.Collection;
/* 5 */ import java.util.Iterator;
/* 6 */ import java.util.List;
/* 7 */ import java.util.Properties;
/* 8 */ import java.util.Random;
/* 9 */ import net.xmind.signin.IAccountInfo;
/* 10 */ import net.xmind.signin.IAuthenticationListener;
/* 11 */ import net.xmind.signin.IDataStore;
/* 12 */ import net.xmind.signin.IXMindNetCommand;
/* 13 */ import net.xmind.signin.IXMindNetCommandHandler;
/* 14 */ import net.xmind.signin.XMindNet;
/* 15 */ import net.xmind.signin.internal.InternalXMindNet;
/* 16 */ import net.xmind.signin.internal.LicenseInfo;
/* 17 */ import net.xmind.signin.internal.XMindLicenseAgent;
/* 18 */ import net.xmind.signin.internal.XMindNetAccount;
/* 19 */ import net.xmind.signin.internal.XMindNetRequest;
/* 20 */ import net.xmind.verify.IValidity;
/* 21 */ import net.xmind.verify.IVerifyListener;
/* 22 */ import net.xmind.verify.ui.internal.ActivateProDialog;
/* 23 */ import org.bouncycastle.asn1.ASN1InputStream;
/* 24 */ import org.bouncycastle.asn1.ASN1Sequence;
/* 25 */ import org.bouncycastle.asn1.pkcs.RSAPublicKey;
/* 26 */ import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
/* 27 */ import org.bouncycastle.crypto.CipherParameters;
/* 28 */ import org.bouncycastle.crypto.digests.MD5Digest;
/* 29 */ import org.bouncycastle.crypto.engines.RSAEngine;
/* 30 */ import org.bouncycastle.crypto.params.RSAKeyParameters;
/* 31 */ import org.bouncycastle.crypto.signers.PSSSigner;
/* 32 */ import org.bouncycastle.util.encoders.Base64;
/* 33 */ import org.eclipse.core.runtime.IProgressMonitor;
/* 34 */ import org.eclipse.core.runtime.IStatus;
/* 35 */ import org.eclipse.core.runtime.SafeRunner;
/* 36 */ import org.eclipse.core.runtime.jobs.IJobChangeEvent;
/* 37 */ import org.eclipse.core.runtime.jobs.Job;
/* 38 */ import org.eclipse.core.runtime.jobs.JobChangeAdapter;
/* 39 */ import org.eclipse.core.runtime.preferences.IEclipsePreferences;
/* 40 */ import org.eclipse.core.runtime.preferences.IScopeContext;
/* 41 */ import org.eclipse.core.runtime.preferences.InstanceScope;
/* 42 */ import org.eclipse.jface.preference.IPreferenceStore;
/* 43 */ import org.eclipse.jface.util.SafeRunnable;
/* 44 */ import org.eclipse.swt.widgets.Display;
/* 45 */ import org.eclipse.swt.widgets.Shell;
/* 46 */ import org.eclipse.ui.IWorkbench;
/* 47 */ import org.eclipse.ui.IWorkbenchWindow;
/* 48 */ import org.eclipse.ui.PlatformUI;
/* 49 */
/* 50 */ public class LicenseVerifier
/* 51 */ implements IAuthenticationListener, IXMindNetCommandHandler
/* 52 */ {
/* 53 */ private static LicenseVerifier INSTANCE = null;
/* 54 */ private static final int SALT_LENGTH = 32;
/* 55 */ private static final int PREFIX_LENGTH = 8;
/* 56 */ private static List<String> invalidLicenseKeys = new ArrayList<String>();
/* 57 */ private IValidity validity = null;
/* 58 */ private VerificationJob verifyJob = null;
/* 59 */ private Object jobLock = new Object();
/* 60 */ private List<ValidityNotifier> listeners = new ArrayList<ValidityNotifier>();
/* 61 */ private List<ValidityNotifier> callbacks = new ArrayList<ValidityNotifier>();
/* 62 */
/* 63 */ private LicenseVerifier() {
/* 64 */ XMindNet.addAuthenticationListener(this);
/* 65 */ XMindNet.addXMindNetCommandHandler("refresh", this);
/* 66 */ }
/* 67 */
/* 68 */ public void verify(int paramInt) {
/* 69 */ verify(null, paramInt, null, 0);
/* 70 */ }
/* 71 */
/* 72 */ public void verify(int paramInt, IVerifyListener paramIVerifyListener) {
/* 73 */ verify(null, paramInt, paramIVerifyListener, 0);
/* 74 */ }
/* 75 */
/* 76 */ public void verify(int paramInt1, IVerifyListener paramIVerifyListener, int paramInt2)
/* 77 */ {
/* 78 */ verify(null, paramInt1, paramIVerifyListener, paramInt2);
/* 79 */ }
/* 80 */
/* 81 */ public void verify(String paramString, int paramInt1, IVerifyListener paramIVerifyListener, int paramInt2)
/* 82 */ {
/* 83 */ if (((paramInt2 & 0x1) == 0) && (checkValid(this.validity, paramInt1))) {
/* 84 */ if (paramIVerifyListener != null)
/* 85 */ paramIVerifyListener.notifyValidity(this.validity);
/* 86 */ return;
/* 87 */ }
/* 88 */ if (paramIVerifyListener != null)
/* 89 */ synchronized (this.callbacks) {
/* 90 */ this.callbacks.add(new ValidityNotifier(paramIVerifyListener));
/* 91 */ }
/* 92 */ synchronized (this.jobLock) {
/* 93 */ if (this.verifyJob == null) {
/* 94 */ VerificationJob localVerificationJob = new VerificationJob(
/* 95 */ paramString, paramInt1, paramInt2);
/* 96 */ localVerificationJob
/* 97 */ .addJobChangeListener(new JobChangeAdapter()
/* 98 */ {
/* 99 */ public void done(IJobChangeEvent paramAnonymousIJobChangeEvent) {
/* 100 */ synchronized (LicenseVerifier.this.jobLock) {
/* 101 */ LicenseVerifier.this.verifyJob = null;
/* 102 */ }
/* 103 */ LicenseVerifier.this
/* 104 */ .setValidity((IValidity)paramAnonymousIJobChangeEvent
/* 105 */ .getResult());
/* 106 */ }
/* 107 */ });
/* 108 */ localVerificationJob.schedule();
/* 109 */ this.verifyJob = localVerificationJob;
/* 110 */ } else {
/* 111 */ this.verifyJob.updateActionName(paramString);
/* 112 */ this.verifyJob.updateRequiredStatus(paramInt1);
/* 113 */ this.verifyJob.updateStyle(paramInt2);
/* 114 */ }
/* 115 */ }
/* 116 */ }
/* 117 */
/* 118 */ public void addVerifyListener(IVerifyListener paramIVerifyListener) {
/* 119 */ synchronized (this.listeners) {
/* 120 */ this.listeners.add(new ValidityNotifier(paramIVerifyListener));
/* 121 */ }
/* 122 */ }
/* 123 */
/* 124 */ public void removeVerifyListener(IVerifyListener paramIVerifyListener) {
/* 125 */ synchronized (this.listeners) {
/* 126 */ Object[] arrayOfObject = this.listeners.toArray();
/* 127 */ this.listeners.clear();
/* 128 */ for (int i = 0; i < arrayOfObject.length; i++) {
/* 129 */ ValidityNotifier localValidityNotifier = (ValidityNotifier)arrayOfObject[i];
/* 130 */ if (localValidityNotifier.listener != paramIVerifyListener)
/* 131 */ this.listeners.add(localValidityNotifier);
/* 132 */ }
/* 133 */ }
/* 134 */ }
/* 135 */
/* 136 */ private void setValidity(IValidity paramIValidity) {
/* 137 */ paramIValidity = cloneValidity(paramIValidity);
/* 138 */ IValidity localIValidity = cloneValidity(paramIValidity);
/* 139 */ if (notifyAllCallbacks(localIValidity))
/* 140 */ return;
/* 141 */ notifyAllListeners(localIValidity);
/* 142 */ notifyLicenseAgent(localIValidity);
/* 143 */ this.validity = paramIValidity;
/* 144 */ if ((paramIValidity.getCode() & 0x6) != 0)
/* 145 */ verifyLicenseKeyValidity();
/* 146 */ }
/* 147 */
/* 148 */ private void verifyLicenseKeyValidity() {
/* 149 */ IPreferenceStore localIPreferenceStore = VerifyPlugin.getDefault()
/* 150 */ .getPreferenceStore();
/* 151 */ final String str1 = localIPreferenceStore.getString("licenseKey");
/* 152 */ final String str2 = localIPreferenceStore.getString("licenseEmail");
/* 153 */ Thread localThread = new Thread(new Runnable() {
/* 154 */ public void run() {
/* 155 */ if (!LicenseVerifier.checkLicenseKeyValidity(str2, str1)) {
/* 156 */ LicenseVerifier.invalidLicenseKeys.add(str2 + "|" + str1);
/* 157 */ LicenseVerifier.this.verify(7, null, 3);
/* 158 */ }
/* 159 */ }
/* 160 */ });
/* 161 */ localThread.setDaemon(true);
/* 162 */ localThread.setPriority(1);
/* 163 */ localThread.start();
/* 164 */ }
/* 165 */
/* 166 */ private static boolean checkLicenseKeyValidity(String paramString1, String paramString2)
/* 167 */ {
/* 168 */ return true;
/* 169 */ }
/* 170 */
/* 171 */ private boolean notifyAllCallbacks(IValidity paramIValidity)
/* 172 */ {
/* 173 */ ArrayList localArrayList=null;
/* 174 */ synchronized (this.callbacks) {
/* 175 */ localArrayList = new ArrayList<ValidityNotifier>(this.callbacks);
/* 176 */ this.callbacks.clear();
/* 177 */ }
/* 178 */ Iterator localIterator = localArrayList.iterator();
/* 179 */ while (localIterator.hasNext()) {
/* 180 */ ValidityNotifier vn = (ValidityNotifier)localIterator.next();
/* 181 */ if (vn.notifyValidityCallback(paramIValidity))
/* 182 */ return true;
/* 183 */ }
/* 184 */ return false;
/* 185 */ }
/* 186 */
/* 187 */ private void notifyAllListeners(IValidity paramIValidity) {
/* 188 */ Object[] arrayOfObject1 = this.listeners.toArray();
/* 189 */ for (Object localObject : arrayOfObject1)
/* 190 */ ((ValidityNotifier)localObject)
/* 191 */ .notifyValidityListener(paramIValidity);
/* 192 */ }
/* 193 */
/* 194 */ private void notifyLicenseAgent(IValidity paramIValidity)
/* 195 */ {
/* 196 */ InternalXMindNet.getInstance()
/* 197 */ .getLicenseAgent()
/* 198 */ .licenseVerified(
/* 199 */ new LicenseInfo(paramIValidity.getCode(),
/* 200 */ paramIValidity.getException(), paramIValidity
/* 201 */ .getLicensedTo()));
/* 202 */ }
/* 203 */
/* 204 */ public void postSignIn(IAccountInfo paramIAccountInfo) {
/* 205 */ verify(7, null, 3);
/* 206 */ }
/* 207 */
/* 208 */ public void postSignOut(IAccountInfo paramIAccountInfo) {
/* 209 */ if ((this.validity != null) && ((this.validity.getCode() & 0x1) != 0)) {
/* 210 */ saveLocalData(null, null, null, null);
/* 211 */ setValidity(createValidity(1024));
/* 212 */ }
/* 213 */ }
/* 214 */
/* 215 */ public boolean handleXMindNetCommand(IXMindNetCommand paramIXMindNetCommand) {
/* 216 */ refreshValidity(paramIXMindNetCommand.getContent());
/* 217 */ return true;
/* 218 */ }
/* 219 */
/* 220 */ private void refreshValidity(IDataStore paramIDataStore) {
/* 221 */ if (paramIDataStore == null)
/* 222 */ return;
/* 223 */ if ((this.validity != null) && ((this.validity.getCode() & 0x6) != 0))
/* 224 */ return;
/* 225 */ String str1 = paramIDataStore.getString("user");
/* 226 */ String str2 = paramIDataStore.getString("uid");
/* 227 */ if ((str1 == null) || (str2 == null))
/* 228 */ return;
/* 229 */ IAccountInfo localIAccountInfo = XMindNet.getAccountInfo();
/* 230 */ if ((localIAccountInfo == null) ||
/* 231 */ (!str1.equals(localIAccountInfo.getUser())))
/* 232 */ return;
/* 233 */ String str3 = extractExpiration(paramIDataStore, str2);
/* 234 */ int i;
/* 235 */ //int i;
/* 236 */ if (str3 == null)
/* 237 */ i = 4096;
/* 238 */ else
/* 239 */ i = parseExpiration(str3, str2);
/* 240 */ saveLocalData(str2, str3, null, null);
/* 241 */ this.validity = createValidity(i, str1);
/* 242 */ }
/* 243 */
/* 244 */ private static boolean checkValid(IStatus paramIStatus, int paramInt) {
/* 245 */ return (paramIStatus != null) && (hasValidity(paramIStatus, paramInt));
/* 246 */ }
/* 247 */
/* 248 */ private static boolean hasValidity(IStatus paramIStatus, int paramInt) {
/* 249 */ return (paramIStatus.getCode() & paramInt) != 0;
/* 250 */ }
/* 251 */
/* 252 */ private static void saveLocalData(String paramString1, String paramString2, String paramString3, String paramString4)
/* 253 */ {
/* 254 */ IPreferenceStore localIPreferenceStore = VerifyPlugin.getDefault()
/* 255 */ .getPreferenceStore();
/* 256 */ savePreference(localIPreferenceStore, "licenseEmail", paramString4);
/* 257 */ savePreference(localIPreferenceStore, "licenseKey", paramString3);
/* 258 */ savePreference(localIPreferenceStore, "uid", paramString1);
/* 259 */ savePreference(localIPreferenceStore, "expiration", paramString2);
/* 260 */ flushStore();
/* 261 */ }
/* 262 */
/* 263 */ private static void savePreference(IPreferenceStore paramIPreferenceStore, String paramString1, String paramString2)
/* 264 */ {
/* 265 */ if ((paramString2 != null) && (!"".equals(paramString2)))
/* 266 */ paramIPreferenceStore.setValue(paramString1, paramString2);
/* 267 */ else
/* 268 */ paramIPreferenceStore.setValue(paramString1, "");
/* 269 */ }
/* 270 */
/* 271 */ private static void flushStore() {
/* 272 */ IEclipsePreferences localIEclipsePreferences = InstanceScope.INSTANCE
/* 273 */ .getNode("net.xmind.varify");
/* 274 */ if (localIEclipsePreferences != null)
/* 275 */ try {
/* 276 */ localIEclipsePreferences.flush();
/* 277 */ }
/* 278 */ catch (Throwable localThrowable) {
/* 279 */ }
/* 280 */ }
/* 281 */
/* 282 */ private static String extractExpiration(IDataStore paramIDataStore, String paramString) {
/* 283 */ if (!paramIDataStore.has("expireDate"))
/* 284 */ return null;
/* 285 */ long l = paramIDataStore.getLong("expireDate");
/* 286 */ if (l <= 0L)
/* 287 */ return null;
/* 288 */ if (paramIDataStore.getBoolean("expired"))
/* 289 */ l = 0L;
/* 290 */ StringBuffer localStringBuffer = new StringBuffer(64);
/* 291 */ localStringBuffer.append('`');
/* 292 */ localStringBuffer.append('\t');
/* 293 */ localStringBuffer.append('\n');
/* 294 */ localStringBuffer.append(Long.toString(l, 16));
/* 295 */ String str = Cryptus.encrypt(localStringBuffer.toString(), paramString);
/* 296 */ return str;
/* 297 */ }
/* 298 */
/* 299 */ private static int parseExpiration(String paramString1, String paramString2) {
/* 300 */ String str = Cryptus.decrypt(paramString1, paramString2);
/* 301 */ if ((str != null) && (!"".equals(str)) && (str.startsWith("`\t\n"))) {
/* 302 */ long l = Long.parseLong(str.substring(3), 16);
/* 303 */ if (System.currentTimeMillis() < l)
/* 304 */ return 1;
/* 305 */ return 2048;
/* 306 */ }
/* 307 */ return 1024;
/* 308 */ }
/* 309 */
/* 310 */ private static IValidity cloneValidity(IValidity paramIValidity) {
/* 311 */ return new Validity(paramIValidity.getSeverity(),
/* 312 */ paramIValidity.getPlugin(), paramIValidity.getCode(),
/* 313 */ paramIValidity.getMessage(), paramIValidity.getException(),
/* 314 */ paramIValidity.getLicensedTo());
/* 315 */ }
/* 316 */
/* 317 */ private static IValidity createValidity(int paramInt) {
/* 318 */ return createValidity(paramInt, null, null, false);
/* 319 */ }
/* 320 */
/* 321 */ private static IValidity createValidity(int paramInt, String paramString) {
/* 322 */ return createValidity(paramInt, paramString, null, false);
/* 323 */ }
/* 324 */
/* 325 */ private static IValidity createValidity(int paramInt, Throwable paramThrowable)
/* 326 */ {
/* 327 */ return createValidity(paramInt, null, paramThrowable, false);
/* 328 */ }
/* 329 */
/* 330 */ private static IValidity createValidity(int paramInt, String paramString, Throwable paramThrowable, boolean paramBoolean)
/* 331 */ {
/* 332 */ if (paramBoolean)
/* 333 */ return new Validity(8, "net.xmind.varify", 1, null, paramThrowable,
/* 334 */ paramString);
/* 335 */ return new Validity(0, "net.xmind.varify", 1, null, paramThrowable,
/* 336 */ paramString);
/* 337 */ }
/* 338 */
/* 339 */ public static LicenseVerifier getInstance()
/* 340 */ {
/* 341 */ if (INSTANCE == null)
/* 342 */ INSTANCE = new LicenseVerifier();
/* 343 */ return INSTANCE;
/* 344 */ }
/* 345 */ private static class ValidityNotifier {
/* 346 */ private IVerifyListener listener;
/* 347 */ private Display display;
/* 348 */
/* 349 */ public ValidityNotifier(IVerifyListener paramIVerifyListener) {
/* 350 */ this.listener = paramIVerifyListener;
/* 351 */ this.display = Display.getCurrent();
/* 352 */ }
/* 353 */
/* 354 */ public void notifyValidityListener(final IValidity paramIValidity) {
/* 355 */ if (this.display != null) {
/* 356 */ if (!this.display.isDisposed())
/* 357 */ this.display.syncExec(new Runnable() {
/* 358 */ public void run() {
/* 359 */ SafeRunner.run(new SafeRunnable() {
/* 360 */ public void run() throws Exception {
/* 361 */ LicenseVerifier.ValidityNotifier.this.listener
/* 362 */ .notifyValidity(paramIValidity);
/* 363 */ }
/* 364 */ });
/* 365 */ }
/* 366 */ });
/* 367 */ }
/* 368 */ else SafeRunner.run(new SafeRunnable() {
/* 369 */ public void run() throws Exception {
/* 370 */ LicenseVerifier.ValidityNotifier.this.listener
/* 371 */ .notifyValidity(paramIValidity);
/* 372 */ }
/* 373 */ });
/* 374 */ }
/* 375 */
/* 376 */ public boolean notifyValidityCallback(final IValidity paramIValidity)
/* 377 */ {
/* 378 */ if ((this.listener instanceof IVerifyCallback)) {
/* 379 */ final boolean[] arrayOfBoolean = new boolean[1];
/* 380 */ arrayOfBoolean[0] = false;
/* 381 */ if (this.display != null) {
/* 382 */ if (!this.display.isDisposed())
/* 383 */ this.display.syncExec(new Runnable() {
/* 384 */ public void run() {
/* 385 */ SafeRunner.run(new SafeRunnable() {
/* 386 */ public void run() throws Exception {
/* 387 */ ((IVerifyCallback)LicenseVerifier.ValidityNotifier.this.listener)
/* 388 */ .handleValidity(paramIValidity);
/* 389 */ }
/* 390 */ });
/* 391 */ }
/* 392 */ });
/* 393 */ }
/* 394 */ else SafeRunner.run(new SafeRunnable() {
/* 395 */ public void run() throws Exception {
/* 396 */ arrayOfBoolean[0] = ((IVerifyCallback)LicenseVerifier.ValidityNotifier.this.listener)
/* 397 */ .handleValidity(paramIValidity);
/* 398 */ }
/* 399 */ });
/* 400 */ return arrayOfBoolean[0];
/* 401 */ }
/* 402 */ notifyValidityListener(paramIValidity);
/* 403 */ return false;
/* 404 */ }
/* 405 */ }
/* 406 */
/* 407 */ private static class VerificationJob extends Job {
/* 408 */ private List<String> actionNames = new ArrayList<String>(2);
/* 409 */ private int requiredStatus;
/* 410 */ private int style;
/* 411 */ private IPreferenceStore prefStore;
/* 412 */ private IStatus validity;
/* 413 */ private String licenseKey = null;
/* 414 */ private String licenseEmail = null;
/* 415 */ private String user = null;
/* 416 */ private String authToken = null;
/* 417 */ private String uid = null;
/* 418 */ private String expiration = null;
/* 419 */ private XMindNetRequest retrieveUIDRequest = new XMindNetRequest(true);
/* 420 */ private XMindNetRequest retrieveSubscriptionRequest = new XMindNetRequest(
/* 421 */ true);
/* 422 */
/* 423 */ private ActivateProDialog inputDialog = null;
/* 424 */
/* 425 */ public VerificationJob(String paramString, int paramInt1, int paramInt2) {
/* 426 */ super("");
/* 427 */ if (paramString != null)
/* 428 */ this.actionNames.add(paramString);
/* 429 */ this.requiredStatus = paramInt1;
/* 430 */ this.style = paramInt2;
/* 431 */ this.prefStore = VerifyPlugin.getDefault().getPreferenceStore();
/* 432 */ this.validity = LicenseVerifier.createValidity(1024);
/* 433 */ setSystem(true);
/* 434 */ }
/* 435 */
/* 436 */ public void updateActionName(String paramString) {
/* 437 */ if (paramString != null)
/* 438 */ this.actionNames.add(paramString);
/* 439 */ }
/* 440 */
/* 441 */ public void updateRequiredStatus(int paramInt) {
/* 442 */ this.requiredStatus &= paramInt;
/* 443 */ }
/* 444 */
/* 445 */ public void updateStyle(int paramInt) {
/* 446 */ this.style = mergeStyle(this.style, paramInt, 1, true);
/* 447 */ this.style = mergeStyle(this.style, paramInt, 2, true);
/* 448 */ this.style = mergeStyle(this.style, paramInt, 4, false);
/* 449 */ this.style = mergeStyle(this.style, paramInt, 8, false);
/* 450 */ }
/* 451 */
/* 452 */ private static int mergeStyle(int paramInt1, int paramInt2, int paramInt3, boolean paramBoolean)
/* 453 */ {
/* 454 */ if (paramBoolean)
/* 455 */ return paramInt1 & (
/* 456 */ paramInt2 & paramInt3 | paramInt3 ^ 0xFFFFFFFF);
/* 457 */ return paramInt1 | paramInt2 & paramInt3;
/* 458 */ }
/* 459 */
/* 460 */ protected IStatus run(IProgressMonitor paramIProgressMonitor) {
/* 461 */ verify(paramIProgressMonitor);
/* 462 */ if ((paramIProgressMonitor.isCanceled()) &&
/* 463 */ (!LicenseVerifier.checkValid(this.validity, 7)))
/* 464 */ this.validity = LicenseVerifier.createValidity(1024, null,
/* 465 */ null, true);
/* 466 */ LicenseVerifier.saveLocalData(this.uid, this.expiration,
/* 467 */ this.licenseKey, this.licenseEmail);
/* 468 */ return this.validity;
/* 469 */ }
/* 470 */
/* 471 */ private boolean isValid() {
/* 472 */ return LicenseVerifier.checkValid(this.validity,
/* 473 */ this.requiredStatus);
/* 474 */ }
/* 475 */
/* 476 */ private void verify(IProgressMonitor paramIProgressMonitor) {
/* 477 */ verifyVindy(paramIProgressMonitor);
/* 478 */ if (paramIProgressMonitor.isCanceled())
/* 479 */ return;
/* 480 */ if (isValid())
/* 481 */ return;
/* 482 */ verifyLocalData(paramIProgressMonitor);
/* 483 */ if (paramIProgressMonitor.isCanceled())
/* 484 */ return;
/* 485 */ if (((this.style & 0x8) == 0) && (
/* 486 */ (isValid()) || ((this.style & 0x2) != 0)))
/* 487 */ return;
/* 488 */ waitForWorkbenchReady(paramIProgressMonitor);
/* 489 */ if (paramIProgressMonitor.isCanceled())
/* 490 */ return;
/* 491 */ openInputDialog(paramIProgressMonitor);
/* 492 */ }
/* 493 */
/* 494 */ private void waitForWorkbenchReady(IProgressMonitor paramIProgressMonitor)
/* 495 */ {
/* 496 */ if (System.getProperty("org.xmind.cathy.app.status") == null)
/* 497 */ return;
/* 498 */ try {
/* 499 */ do {
/* 500 */ if (paramIProgressMonitor.isCanceled())
/* 501 */ return;
/* 502 */ Thread.sleep(500L);
/* 503 */ }
/* 504 */ while (!
/* 505 */ isWorkbenchReady());
/* 506 */ } catch (InterruptedException localInterruptedException) {
/* 507 */ }
/* 508 */ }
/* 509 */
/* 510 */ private boolean isWorkbenchReady() {
/* 511 */ return "workbenchReady".equals(
/* 512 */ System.getProperty("org.xmind.cathy.app.status"));
/* 513 */ }
/* 514 */
/* 515 */ private void verifyLocalData(IProgressMonitor paramIProgressMonitor) {
/* 516 */ loadLocalLicenseKey(paramIProgressMonitor);
/* 517 */ if (paramIProgressMonitor.isCanceled())
/* 518 */ return;
/* 519 */ if ((hasLicenseKey()) && (hasLicenseEmail())) {
/* 520 */ verifyProLicenseKey(paramIProgressMonitor);
/* 521 */ if (paramIProgressMonitor.isCanceled())
/* 522 */ return;
/* 523 */ if (!isValid())
/* 524 */ verifyPlusLicenseKey(paramIProgressMonitor);
/* 525 */ }
/* 526 */ if (paramIProgressMonitor.isCanceled())
/* 527 */ return;
/* 528 */ IStatus localIStatus = this.validity;
/* 529 */ boolean bool = LicenseVerifier.checkValid(localIStatus, 2);
/* 530 */ if (bool)
/* 531 */ return;
/* 532 */ loadLocalUserInfo(paramIProgressMonitor);
/* 533 */ if (paramIProgressMonitor.isCanceled())
/* 534 */ return;
/* 535 */ if ((hasUser()) && (hasAuthToken())) {
/* 536 */ loadLocalSubscriptionInfo(paramIProgressMonitor);
/* 537 */ if (paramIProgressMonitor.isCanceled())
/* 538 */ return;
/* 539 */ if ((hasUID()) && (hasExpiration())) {
/* 540 */ verifyLocalSubscriptionInfo(paramIProgressMonitor);
/* 541 */ if (isValid())
/* 542 */ return;
/* 543 */ }
/* 544 */ if (paramIProgressMonitor.isCanceled())
/* 545 */ return;
/* 546 */ verifySubscription(paramIProgressMonitor);
/* 547 */ if (isValid())
/* 548 */ return;
/* 549 */ this.validity = localIStatus;
/* 550 */ }
/* 551 */ }
/* 552 */
/* 553 */ private void loadLocalLicenseKey(IProgressMonitor paramIProgressMonitor) {
/* 554 */ this.licenseKey = this.prefStore.getString("licenseKey");
/* 555 */ this.licenseEmail = this.prefStore.getString("licenseEmail");
/* 556 */ }
/* 557 */
/* 558 */ private void loadLocalUserInfo(IProgressMonitor paramIProgressMonitor) {
/* 559 */ IAccountInfo localIAccountInfo = XMindNet.getAccountInfo();
/* 560 */ this.user = (localIAccountInfo == null ? null : localIAccountInfo
/* 561 */ .getUser());
/* 562 */ this.authToken = (localIAccountInfo == null ? null :
/* 563 */ localIAccountInfo.getAuthToken());
/* 564 */ }
/* 565 */
/* 566 */ private void loadLocalSubscriptionInfo(IProgressMonitor paramIProgressMonitor)
/* 567 */ {
/* 568 */ this.uid = this.prefStore.getString("uid");
/* 569 */ this.expiration = this.prefStore.getString("expiration");
/* 570 */ }
/* 571 */
/* 572 */ private void verifyLocalSubscriptionInfo(IProgressMonitor paramIProgressMonitor)
/* 573 */ {
/* 574 */ this.validity = LicenseVerifier.createValidity(
/* 575 */ LicenseVerifier.parseExpiration(this.expiration, this.uid),
/* 576 */ this.user);
/* 577 */ }
/* 578 */
/* 579 */ private void verifyProLicenseKey(IProgressMonitor paramIProgressMonitor) {
/* 580 */ if (LicenseVerifier.invalidLicenseKeys.contains(this.licenseEmail +
/* 581 */ "|" + this.licenseKey))
/* 582 */ this.validity = LicenseVerifier.createValidity(8192);
/* 583 */ else
/* 584 */ verifySignature(this.licenseEmail, this.licenseKey,
/* 585 */ "`_xmind.org\n9527\t", getProPublicKey(), 2,
/* 586 */ paramIProgressMonitor);
/* 587 */ }
/* 588 */
/* 589 */ private void verifyPlusLicenseKey(IProgressMonitor paramIProgressMonitor) {
/* 590 */ if (LicenseVerifier.invalidLicenseKeys.contains(this.licenseEmail +
/* 591 */ "|" + this.licenseKey))
/* 592 */ this.validity = LicenseVerifier.createValidity(8192);
/* 593 */ else
/* 594 */ verifySignature(this.licenseEmail, this.licenseKey,
/* 595 */ "*#xmind\nnet.3914\t", getPlusPublicKey(), 4,
/* 596 */ paramIProgressMonitor);
/* 597 */ }
/* 598 */
/* 599 */ private void verifySignature(String paramString1, String paramString2, String paramString3, byte[] paramArrayOfByte, int paramInt, IProgressMonitor paramIProgressMonitor)
/* 600 */ {
/* 601 */ if (paramString2.length() < 8) {
/* 602 */ this.validity = LicenseVerifier.createValidity(8192);
/* 603 */ return;
/* 604 */ }
/* 605 */ try {
/* 606 */ paramString1 = paramString2.substring(0, 8) + paramString1;
/* 607 */ paramString2 = paramString2.substring(8);
/* 608 */ byte[] arrayOfByte = Base32.decode(paramString2);
/* 609 */ if (isSignatureValid((paramString1 + paramString3).getBytes(),
/* 610 */ arrayOfByte, paramArrayOfByte))
/* 611 */ this.validity = LicenseVerifier.createValidity(paramInt,
/* 612 */ this.licenseEmail);
/* 613 */ else
/* 614 */ this.validity = LicenseVerifier.createValidity(8192);
/* 615 */ } catch (Exception localException) {
/* 616 */ this.validity = LicenseVerifier.createValidity(1073741824,
/* 617 */ localException);
/* 618 */ }
/* 619 */ }
/* 620 */
/* 621 */ private boolean isSignatureValid(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, byte[] paramArrayOfByte3)
/* 622 */ throws Exception
/* 623 */ {
/* 624 */ RSAEngine localRSAEngine = new RSAEngine();
/* 625 */ MD5Digest localMD5Digest = new MD5Digest();
/* 626 */ PSSSigner localPSSSigner = new PSSSigner(localRSAEngine,
/* 627 */ localMD5Digest, 32);
/* 628 */ localPSSSigner.init(false, parsePublicKey(paramArrayOfByte3));
/* 629 */ localPSSSigner.update(paramArrayOfByte1, 0,
/* 630 */ paramArrayOfByte1.length);
/* 631 */ return localPSSSigner.verifySignature(paramArrayOfByte2);
/* 632 */ }
/* 633 */
/* 634 */ private byte[] getProPublicKey() {
/* 635 */ return new byte[] { 77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113,
/* 636 */ 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52,
/* 637 */ 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 67, 100,
/* 638 */ 54, 74, 99, 100, 109, 118, 100, 85, 83, 84, 112, 66, 78,
/* 639 */ 118, 114, 119, 55, 83, 49, 73, 100, 114, 110, 76, 106, 70,
/* 640 */ 79, 110, 50, 117, 112, 89, 120, 67, 52, 85, 101, 71, 121,
/* 641 */ 112, 101, 43, 68, 119, 85, 122, 52, 83, 113, 54, 115, 100,
/* 642 */ 67, 100, 119, 68, 83, 118, 56, 107, 114, 52, 82, 99, 77,
/* 643 */ 82, 83, 75, 55, 110, 77, 78, 55, 57, 79, 57, 104, 99, 121,
/* 644 */ 106, 90, 69, 103, 105, 119, 120, 57, 101, 75, 69, 74, 85,
/* 645 */ 99, 68, 82, 101, 112, 97, 48, 66, 121, 72, 115, 49, 56,
/* 646 */ 102, 71, 113, 74, 105, 52, 51, 110, 57, 47, 118, 71, 104,
/* 647 */ 99, 78, 84, 86, 120, 85, 109, 53, 109, 112, 74, 115, 103,
/* 648 */ 53, 82, 112, 51, 111, 74, 51, 56, 98, 68, 86, 69, 110, 55,
/* 649 */ 68, 55, 88, 116, 82, 101, 78, 78, 83, 78, 101, 113, 77,
/* 650 */ 111, 121, 112, 120, 105, 69, 114, 43, 113, 55, 110, 119,
/* 651 */ 73, 68, 65, 81, 65, 66 };
/* 652 */ }
/* 653 */
/* 654 */ private byte[] getPlusPublicKey() {
/* 655 */ return new byte[] { 77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113,
/* 656 */ 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52,
/* 657 */ 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 67, 104,
/* 658 */ 105, 71, 48, 119, 72, 104, 43, 115, 68, 57, 49, 52, 54, 65,
/* 659 */ 98, 76, 75, 75, 76, 73, 101, 48, 98, 83, 87, 110, 122, 71,
/* 660 */ 65, 112, 106, 43, 120, 110, 101, 121, 69, 110, 65, 112, 57,
/* 661 */ 111, 116, 118, 83, 52, 105, 101, 48, 78, 77, 75, 72, 122,
/* 662 */ 101, 81, 89, 48, 118, 47, 107, 65, 89, 70, 51, 99, 102, 43,
/* 663 */ 114, 68, 113, 73, 68, 90, 85, 71, 109, 49, 79, 115, 105,
/* 664 */ 72, 75, 116, 57, 50, 112, 57, 72, 106, 119, 81, 48, 48, 89,
/* 665 */ 120, 117, 116, 87, 78, 116, 109, 109, 55, 90, 73, 104, 69,
/* 666 */ 57, 90, 89, 43, 116, 76, 100, 87, 78, 118, 116, 53, 107,
/* 667 */ 55, 52, 82, 47, 48, 100, 51, 75, 81, 69, 90, 76, 68, 82,
/* 668 */ 109, 80, 114, 98, 49, 109, 104, 116, 73, 65, 50, 89, 75,
/* 669 */ 108, 82, 50, 77, 116, 109, 51, 43, 82, 113, 68, 101, 50,
/* 670 */ 115, 90, 78, 109, 112, 71, 111, 102, 119, 73, 68, 65, 81,
/* 671 */ 65, 66 };
/* 672 */ }
/* 673 */
/* 674 */ private byte[] getVindyPublicKey() {
/* 675 */ return new byte[] { 77, 73, 71, 102, 77, 65, 48, 71, 67, 83, 113,
/* 676 */ 71, 83, 73, 98, 51, 68, 81, 69, 66, 65, 81, 85, 65, 65, 52,
/* 677 */ 71, 78, 65, 68, 67, 66, 105, 81, 75, 66, 103, 81, 68, 98,
/* 678 */ 73, 106, 85, 74, 67, 47, 121, 76, 77, 83, 106, 113, 74, 76,
/* 679 */ 99, 48, 116, 81, 43, 98, 54, 97, 69, 97, 103, 66, 68, 70,
/* 680 */ 47, 101, 105, 81, 100, 70, 51, 49, 103, 79, 103, 98, 52,
/* 681 */ 113, 105, 54, 85, 54, 113, 56, 97, 81, 65, 43, 65, 85, 84,
/* 682 */ 56, 67, 101, 87, 68, 102, 108, 83, 119, 100, 85, 53, 118,
/* 683 */ 55, 86, 53, 86, 98, 111, 56, 86, 102, 47, 119, 75, 81, 75,
/* 684 */ 119, 119, 113, 114, 48, 119, 98, 56, 66, 87, 85, 53, 51,
/* 685 */ 85, 121, 120, 121, 65, 73, 115, 121, 68, 118, 77, 110, 77,
/* 686 */ 114, 118, 51, 119, 85, 101, 48, 71, 98, 68, 102, 82, 76,
/* 687 */ 53, 108, 105, 101, 101, 49, 98, 105, 75, 99, 75, 103, 100,
/* 688 */ 104, 107, 73, 121, 53, 88, 89, 114, 109, 77, 86, 49, 74,
/* 689 */ 48, 50, 74, 49, 79, 89, 98, 109, 115, 69, 110, 49, 107, 70,
/* 690 */ 99, 122, 122, 116, 115, 47, 72, 79, 119, 73, 68, 65, 81,
/* 691 */ 65, 66 };
/* 692 */ }
/* 693 */
/* 694 */ private CipherParameters parsePublicKey(byte[] paramArrayOfByte) throws Exception
/* 695 */ {
/* 696 */ byte[] arrayOfByte = Base64.decode(paramArrayOfByte);
/* 697 */ ASN1InputStream localASN1InputStream = new ASN1InputStream(
/* 698 */ arrayOfByte);
/* 699 */ ASN1Sequence localASN1Sequence = (ASN1Sequence)localASN1InputStream
/* 700 */ .readObject();
/* 701 */ SubjectPublicKeyInfo localSubjectPublicKeyInfo = new SubjectPublicKeyInfo(
/* 702 */ localASN1Sequence);
/* 703 */ RSAPublicKey localRSAPublicKey =
/* 704 */ RSAPublicKey.getInstance(localSubjectPublicKeyInfo.parsePublicKey());
/* 705 */ return new RSAKeyParameters(false, localRSAPublicKey.getModulus(),
/* 706 */ localRSAPublicKey.getPublicExponent());
/* 707 */ }
/* 708 */
/* 709 */ private void verifyVindy(IProgressMonitor paramIProgressMonitor) {
/* 710 */ String str = checkValidVindy(paramIProgressMonitor);
/* 711 */ if (str != null)
/* 712 */ this.validity = LicenseVerifier.createValidity(0, str);
/* 713 */ }
/* 714 */
/* 715 */ private String checkValidVindy(IProgressMonitor paramIProgressMonitor) {
/* 716 */ String str1 =
/* 717 */ System.getProperty("org.xmind.product.distribution.id");
/* 718 */ if ((str1 == null) || ("".equals(str1)) ||
/* 719 */ (!str1.startsWith("vindy")))
/* 720 */ return null;
/* 721 */ String str2 =
/* 722 */ System.getProperty("org.xmind.product.distribution.vindy.org");
/* 723 */ if ((str2 == null) || ("".equals(str2)))
/* 724 */ return null;
/* 725 */ String str3 =
/* 726 */ System.getProperty("org.xmind.product.distribution.vindy.time");
/* 727 */ if ((str3 == null) || ("".equals(str3)))
/* 728 */ return null;
/* 729 */ String str4 =
/* 730 */ System.getProperty("org.xmind.product.distribution.vindy.name");
/* 731 */ if ((str4 == null) || ("".equals(str4)))
/* 732 */ return null;
/* 733 */ String str5 = str2 + str3;
/* 734 */ IStatus localIStatus = this.validity;
/* 735 */ verifySignature(str5, str4, "^xmap61\nbg4[d\t",
/* 736 */ getVindyPublicKey(), 2, paramIProgressMonitor);
/* 737 */ if (isValid())
/* 738 */ return str2;
/* 739 */ this.validity = localIStatus;
/* 740 */ return null;
/* 741 */ }
/* 742 */
/* 743 */ private void verifySubscription(IProgressMonitor paramIProgressMonitor) {
/* 744 */ retrieveUID(paramIProgressMonitor);
/* 745 */ if (paramIProgressMonitor.isCanceled())
/* 746 */ return;
/* 747 */ if (hasUID())
/* 748 */ retrieveSubscription(paramIProgressMonitor);
/* 749 */ }
/* 750 */
/* 751 */ private void openInputDialog(final IProgressMonitor paramIProgressMonitor)
/* 752 */ {
/* 753 */ final Properties localProperties = new Properties();
/* 754 */ if (this.licenseEmail != null)
/* 755 */ localProperties.setProperty("licenseEmail", this.licenseEmail);
/* 756 */ if (this.licenseEmail != null)
/* 757 */ localProperties.setProperty("licenseKey", this.licenseKey);
/* 758 */ if (this.user != null)
/* 759 */ localProperties.setProperty("user", this.user);
/* 760 */ final Job local1 = new Job("Verify Pro License Key")
/* 761 */ {
/* 762 */ protected IStatus run(IProgressMonitor paramAnonymousIProgressMonitor) {
/* 763 */ doVerifyLicenseKey(paramAnonymousIProgressMonitor);
/* 764 */ return LicenseVerifier.VerificationJob.this.validity;
/* 765 */ }
/* 766 */
/* 767 */ private void doVerifyLicenseKey(IProgressMonitor paramAnonymousIProgressMonitor)
/* 768 */ {
/* 769 */ paramAnonymousIProgressMonitor.beginTask(null, 1);
/* 770 */ if ((paramIProgressMonitor.isCanceled()) ||
/* 771 */ (paramAnonymousIProgressMonitor.isCanceled()))
/* 772 */ return;
/* 773 */ LicenseVerifier.VerificationJob.this
/* 774 */ .loadInfoFromInput(localProperties);
/* 775 */ if ((paramIProgressMonitor.isCanceled()) ||
/* 776 */ (paramAnonymousIProgressMonitor.isCanceled()))
/* 777 */ return;
/* 778 */ if (LicenseVerifier.VerificationJob.this.hasLicenseKey())
/* 779 */ {
/* 780 */ if (LicenseVerifier.VerificationJob.this
/* 781 */ .hasLicenseEmail())
/* 782 */ LicenseVerifier.VerificationJob.this
/* 783 */ .verifyProLicenseKey(paramAnonymousIProgressMonitor);
/* 784 */ }
/* 785 */ if ((!paramIProgressMonitor.isCanceled()) && (
/* 786 */ paramAnonymousIProgressMonitor.isCanceled()));
/* 787 */ }
/* 788 */ };
/* 789 */ local1.setSystem(true);
/* 790 */ final Job local2 = new Job("Verify Plus License Key")
/* 791 */ {
/* 792 */ protected IStatus run(IProgressMonitor paramAnonymousIProgressMonitor) {
/* 793 */ doVerifyLicenseKey(paramAnonymousIProgressMonitor);
/* 794 */ return LicenseVerifier.VerificationJob.this.validity;
/* 795 */ }
/* 796 */
/* 797 */ private void doVerifyLicenseKey(IProgressMonitor paramAnonymousIProgressMonitor)
/* 798 */ {
/* 799 */ paramAnonymousIProgressMonitor.beginTask(null, 1);
/* 800 */ if ((paramIProgressMonitor.isCanceled()) ||
/* 801 */ (paramAnonymousIProgressMonitor.isCanceled()))
/* 802 */ return;
/* 803 */ LicenseVerifier.VerificationJob.this
/* 804 */ .loadInfoFromInput(localProperties);
/* 805 */ if ((paramIProgressMonitor.isCanceled()) ||
/* 806 */ (paramAnonymousIProgressMonitor.isCanceled()))
/* 807 */ return;
/* 808 */ if (LicenseVerifier.VerificationJob.this.hasLicenseKey())
/* 809 */ {
/* 810 */ if (LicenseVerifier.VerificationJob.this
/* 811 */ .hasLicenseEmail())
/* 812 */ LicenseVerifier.VerificationJob.this
/* 813 */ .verifyPlusLicenseKey(paramAnonymousIProgressMonitor);
/* 814 */ }
/* 815 */ if ((!paramIProgressMonitor.isCanceled()) && (
/* 816 */ paramAnonymousIProgressMonitor.isCanceled()));
/* 817 */ }
/* 818 */ };
/* 819 */ local2.setSystem(true);
/* 820 */ final Job local3 = new Job("Verify License Key")
/* 821 */ {
/* 822 */ protected IStatus run(IProgressMonitor paramAnonymousIProgressMonitor) {
/* 823 */ doVerifySubscription(paramAnonymousIProgressMonitor);
/* 824 */ return LicenseVerifier.VerificationJob.this.validity;
/* 825 */ }
/* 826 */
/* 827 */ private void doVerifySubscription(IProgressMonitor paramAnonymousIProgressMonitor)
/* 828 */ {
/* 829 */ paramAnonymousIProgressMonitor.beginTask(null, 1);
/* 830 */ if ((paramIProgressMonitor.isCanceled()) ||
/* 831 */ (paramAnonymousIProgressMonitor.isCanceled()))
/* 832 */ return;
/* 833 */ LicenseVerifier.VerificationJob.this
/* 834 */ .loadInfoFromInput(localProperties);
/* 835 */ if ((paramIProgressMonitor.isCanceled()) ||
/* 836 */ (paramAnonymousIProgressMonitor.isCanceled()))
/* 837 */ return;
/* 838 */ if (LicenseVerifier.VerificationJob.this.hasUser())
/* 839 */ {
/* 840 */ if (LicenseVerifier.VerificationJob.this
/* 841 */ .hasAuthToken())
/* 842 */ LicenseVerifier.VerificationJob.this
/* 843 */ .verifySubscription(paramAnonymousIProgressMonitor);
/* 844 */ }
/* 845 */ if ((!paramIProgressMonitor.isCanceled()) && (
/* 846 */ paramAnonymousIProgressMonitor.isCanceled()));
/* 847 */ }
/* 848 */
/* 849 */ protected void canceling() {
/* 850 */ LicenseVerifier.VerificationJob.this.retrieveUIDRequest
/* 851 */ .abort();
/* 852 */ LicenseVerifier.VerificationJob.this.retrieveSubscriptionRequest
/* 853 */ .abort();
/* 854 */ super.canceling();
/* 855 */ }
/* 856 */ };
/* 857 */ local3.setSystem(true);
/* 858 */ final IWorkbench localIWorkbench = PlatformUI.getWorkbench();
/* 859 */ Display localDisplay = localIWorkbench.getDisplay();
/* 860 */ if ((localDisplay == null) || (localDisplay.isDisposed()))
/* 861 */ return;
/* 862 */ if (paramIProgressMonitor.isCanceled())
/* 863 */ return;
/* 864 */ localDisplay.syncExec(new Runnable() {
/* 865 */ public void run() {
/* 866 */ IWorkbenchWindow localIWorkbenchWindow = localIWorkbench
/* 867 */ .getActiveWorkbenchWindow();
/* 868 */ Shell localShell = localIWorkbenchWindow == null ? null :
/* 869 */ localIWorkbenchWindow.getShell();
/* 870 */ if ((localShell != null) && (localShell.isDisposed()))
/* 871 */ localShell = null;
/* 872 */ LicenseVerifier.VerificationJob.this.inputDialog = new ActivateProDialog(
/* 873 */ localShell,
/* 874 */ LicenseVerifier.VerificationJob.joinStr(LicenseVerifier.VerificationJob.this.actionNames),
/* 875 */ LicenseVerifier.VerificationJob.this.requiredStatus,
/* 876 */ LicenseVerifier.VerificationJob.this.validity
/* 877 */ .getCode(),
/* 878 */ localProperties,
/* 879 */ (LicenseVerifier.VerificationJob.this.style & 0x4) != 0,
/* 880 */ (LicenseVerifier.VerificationJob.this.style & 0x8) != 0,
/* 881 */ local1, local2, local3);
/* 882 */ int i = LicenseVerifier.VerificationJob.this.inputDialog
/* 883 */ .open();
/* 884 */ if (i == 1) {
/* 885 */ local1.cancel();
/* 886 */ local2.cancel();
/* 887 */ local3.cancel();
/* 888 */ LicenseVerifier.VerificationJob.this.cancel();
/* 889 */ paramIProgressMonitor.setCanceled(true);
/* 890 */ }
/* 891 */ }
/* 892 */ });
/* 893 */ if ((LicenseVerifier.hasValidity(this.validity, 1)) && (hasUser()) &&
/* 894 */ (hasAuthToken())) {
/* 895 */ long l = System.currentTimeMillis() + 604800L;
/* 896 */ InternalXMindNet.getInstance().getAccount()
/* 897 */ .signedIn(this.user, this.authToken, l, true);
/* 898 */ }
/* 899 */ }
/* 900 */
/* 901 */ private static String joinStr(Collection paramCollection) {
/* 902 */ StringBuffer localStringBuffer = new StringBuffer(
/* 903 */ paramCollection.size() * 10);
/* 904 */ Iterator localIterator = paramCollection.iterator();
/* 905 */ while (localIterator.hasNext()) {
/* 906 */ String str = (String)localIterator.next();
/* 907 */ if (localStringBuffer.length() > 0)
/* 908 */ localStringBuffer.append(", ");
/* 909 */ localStringBuffer.append(str);
/* 910 */ }
/* 911 */ return localStringBuffer.toString();
/* 912 */ }
/* 913 */
/* 914 */ private void loadInfoFromInput(Properties paramProperties) {
/* 915 */ this.licenseEmail = paramProperties.getProperty("licenseEmail");
/* 916 */ this.licenseKey = paramProperties.getProperty("licenseKey");
/* 917 */ this.user = paramProperties.getProperty("user");
/* 918 */ this.authToken = paramProperties.getProperty("token");
/* 919 */ }
/* 920 */
/* 921 */ private void retrieveSubscription(IProgressMonitor paramIProgressMonitor) {
/* 922 */ this.retrieveSubscriptionRequest
/* 923 */ .uri("/_res/verify/%s", new Object[] { this.user })
/* 924 */ .addHeader("UID", this.uid).get();
/* 925 */ if ((paramIProgressMonitor.isCanceled()) ||
/* 926 */ (this.retrieveSubscriptionRequest.isAborted()))
/* 927 */ return;
/* 928 */ int i = this.retrieveSubscriptionRequest.getCode();
/* 929 */ IDataStore localIDataStore = this.retrieveSubscriptionRequest
/* 930 */ .getData();
/* 931 */ if ((i == 200) && (localIDataStore != null)) {
/* 932 */ this.expiration = LicenseVerifier.extractExpiration(
/* 933 */ localIDataStore, this.uid);
/* 934 */ if (this.expiration == null)
/* 935 */ this.validity = LicenseVerifier.createValidity(4096);
/* 936 */ else
/* 937 */ this.validity = LicenseVerifier.createValidity(
/* 938 */ LicenseVerifier.parseExpiration(this.expiration,
/* 939 */ this.uid), this.user);
/* 940 */ } else if (this.retrieveUIDRequest.getException() != null) {
/* 941 */ this.validity = LicenseVerifier.createValidity(1073741824,
/* 942 */ this.retrieveUIDRequest.getException());
/* 943 */ } else if ((i >= 500) || (i < 400)) {
/* 944 */ this.validity = LicenseVerifier.createValidity(1073741824);
/* 945 */ }
/* 946 */ }
/* 947 */
/* 948 */ private void retrieveUID(IProgressMonitor paramIProgressMonitor) {
/* 949 */ this.retrieveUIDRequest
/* 950 */ .uri("/_res/uid/%s", new Object[] { this.user })
/* 951 */ .setAuthToken(this.authToken).get();
/* 952 */ if ((paramIProgressMonitor.isCanceled()) ||
/* 953 */ (this.retrieveUIDRequest.isAborted()))
/* 954 */ return;
/* 955 */ int i = this.retrieveUIDRequest.getCode();
/* 956 */ IDataStore localIDataStore = this.retrieveUIDRequest.getData();
/* 957 */ if ((i == 200) && (localIDataStore != null))
/* 958 */ this.uid = localIDataStore.getString("uid");
/* 959 */ else if (this.retrieveUIDRequest.getException() != null)
/* 960 */ this.validity = LicenseVerifier.createValidity(1073741824,
/* 961 */ this.retrieveUIDRequest.getException());
/* 962 */ else if ((i >= 500) || (i < 400))
/* 963 */ this.validity = LicenseVerifier.createValidity(1073741824);
/* 964 */ }
/* 965 */
/* 966 */ private boolean hasLicenseKey() {
/* 967 */ return (this.licenseKey != null) && (!"".equals(this.licenseKey));
/* 968 */ }
/* 969 */
/* 970 */ private boolean hasLicenseEmail()
/* 971 */ {
/* 972 */ return (this.licenseEmail != null) &&
/* 973 */ (!"".equals(this.licenseEmail));
/* 974 */ }
/* 975 */
/* 976 */ private boolean hasUser() {
/* 977 */ return (this.user != null) && (!"".equals(this.user));
/* 978 */ }
/* 979 */
/* 980 */ private boolean hasAuthToken() {
/* 981 */ return (this.authToken != null) && (!"".equals(this.authToken));
/* 982 */ }
/* 983 */
/* 984 */ private boolean hasUID() {
/* 985 */ return (this.uid != null) && (!"".equals(this.uid));
/* 986 */ }
/* 987 */
/* 988 */ private boolean hasExpiration() {
/* 989 */ return (this.expiration != null) && (!"".equals(this.expiration));
/* 990 */ }
/* 991 */
/* 992 */ protected void canceling() {
/* 993 */ this.retrieveUIDRequest.abort();
/* 994 */ this.retrieveSubscriptionRequest.abort();
/* 995 */ final ActivateProDialog localActivateProDialog = this.inputDialog;
/* 996 */ if (localActivateProDialog != null) {
/* 997 */ IWorkbench localIWorkbench = PlatformUI.getWorkbench();
/* 998 */ if (localIWorkbench != null) {
/* 999 */ final Display localDisplay = localIWorkbench.getDisplay();
/* 1000 */ if ((localDisplay != null) && (!localDisplay.isDisposed()))
/* 1001 */ localDisplay.asyncExec(new Runnable() {
/* 1002 */ public void run() {
/* 1003 */ if (localDisplay.isDisposed())
/* 1004 */ return;
/* 1005 */ localActivateProDialog.close();
/* 1006 */ }
/* 1007 */ });
/* 1008 */ }
/* 1009 */ }
/* 1010 */ super.canceling();
/* 1011 */ }
/* 1012 */ }
/* 1013 */ }
6. Create build environment for ant with build.xml (build.xml should be created in ~/xmind.verify/ folder) as below
- ~/xmind.verify/build.xml Select all
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="jar">
<!--ant build file to recompile jar-->
<property environment="env"/>
<property name="project.base.dir" value="."/>
<property name="xmind.class.path" value="/Applications/XMind.app/Contents/Resources/plugins"/>
<property name="name" value="net.xmind.verify_3.3.0.201208102038"/>
<property name="javafilename" value="LicenseVerifier"/>
<property name="app.dir" value="/Applications/XMind.app/Contents/Resources/plugins" />
<property name="src" value="${project.base.dir}/src"/>
<property name="test" value="${project.base.dir}/test"/>
<property name="reference" value="${project.base.dir}/lib"/>
<property name="build" value="${project.base.dir}/build"/>
<property name="classes" value="${build}/classes"/>
<property name="lib" value="${build}/lib"/>
<path id="reference.class.path">
<pathelement path="${java.class.path}" />
<fileset dir="${reference}">
<include name="*.jar" />
</fileset>
<fileset dir="${xmind.class.path}" includes="*.jar"/>
</path>
<target name="init">
<mkdir dir="${build}"/>
<mkdir dir="${classes}"/>
<mkdir dir="${lib}"/>
</target>
<target depends="init" name="pre.compile.test">
</target>
<target depends="pre.compile.test" name="compile.src">
<javac debug="on" memoryMaximumSize="256m" memoryInitialSize="256m" fork="true" includeantruntime="false" destdir="${classes}" srcdir="${src}">
<classpath refid="reference.class.path" />
<compilerarg value="-Xlint:unchecked"/>
</javac>
</target>
<target depends="compile.src" name="compile.test">
<javac debug="on" memoryMaximumSize="256m" memoryInitialSize="256m" fork="true" includeantruntime="false" destdir="${classes}">
<src path="${test}"/>
<classpath refid="reference.class.path" />
<compilerarg value="-Xlint:unchecked"/>
</javac>
</target>
<target depends="compile.src" name="jar">
<echo>=== BUILDING ${name}.jar ===</echo>
<jar destfile="${lib}/${name}.jar">
<zipfileset src="${reference}/${name}.jar" excludes="**/${javafilename}*.class"/>
<fileset dir="${classes}" excludes="**/Test.class"/>
</jar>
</target>
<!-- INSTALL -->
<target name="install" depends="jar">
<echo>=== INSTALLING ${name}.jar ===</echo>
<copy file="${lib}/${name}.jar" tofile="${app.dir}/${name}.jar" overwrite="true" />
</target>
<target name="clean">
<delete dir="${build}"/>
</target>
</project>
7. ant clean & build
cd ~/xmind.verify
ant clean jar
8. Update jar file and install to App folder
cd ~/xmind.verify/
ant install
P.S. this is how to add line numbers to the source code and then convert the angle brackets for this blog.
awk '{printf("/* %3d */ %s\n", NR,$0)}' filename | sed 's/</\</g;s/>/\>/g' > filenamenumbered.txt
Friday, August 31, 2012
Pascal for XCode 4

See here http://www.objectivepascal.com
Free Pascal Compiler -> http://www.freepascal.org/
Direct Link -> http://nchc.dl.sourceforge.net/project/freepascal/Mac%20OS%20X/2.6.0/fpc-2.6.0.intel-macosx.dmg
XCode 4 Template is here http://dl.dropbox.com/u/28343282/ObjP/Xcode_Templates.html
This is the script to add pascal syntax coloring in Xcode 4
- addpascalsyntax.sh Select all
#!/bin/bash
#
# Updates Xcode 4 and to support Pascal language syntax coloring
#
set -e
# Assumes Xcode 4+.
XCODE_MAJOR_VERSION=`xcodebuild -version | awk 'NR == 1 {print substr($2,1,1)}'`
if [ "$XCODE_MAJOR_VERSION" -lt "4" ]; then
echo "Xcode 4.x not found."
exit 1
fi
# Path were this script is located
SCRIPT_PATH="$(dirname "$BASH_SOURCE")"
# Set up path for PlistBuddy helper application which can add elements to Plist files
PLISTBUDDY=/usr/libexec/PlistBuddy
# Filename path private framework we need to modify
#DVTFOUNDATION_PATH="/Developer/Library/PrivateFrameworks/DVTFoundation.framework/Versions/A/Resources/"
#DVTFOUNDATION_PATH="/XCode4.3/Library/PrivateFrameworks/DVTFoundation.framework/Versions/A/Resources/"
# This framework is found withing the Xcode.app package and is used when Xcode is a monolithic
# install (all contained in Xcode.app)
DVTFOUNDATION_PATH="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/"
# Create Plist file of additional languages to add to 'DVTFoundation.xcplugindata'
cat >AdditionalLanguages.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Xcode.SourceCodeLanguage.Pascal</key>
<dict>
<key>languageSpecification</key>
<string>xcode.lang.pascal</string>
<key>fileDataType</key>
<array>
<dict>
<key>identifier</key>
<string>com.apple.xcode.pascal-source</string>
</dict>
</array>
<key>id</key>
<string>Xcode.SourceCodeLanguage.Pascal</string>
<key>point</key>
<string>Xcode.SourceCodeLanguage</string>
<key>languageName</key>
<string>Pascal</string>
<key>version</key>
<string>1.0</string>
<key>documentationAbbreviation</key>
<string>pascal</string>
<key>conformsTo</key>
<array>
<dict>
<key>identifier</key>
<string>Xcode.SourceCodeLanguage.Generic</string>
</dict>
</array>
<key>name</key>
<string>Pascal Language</string>
</dict>
</dict>
</plist>
EOF
# Backup
cp "$DVTFOUNDATION_PATH/DVTFoundation.xcplugindata" "$DVTFOUNDATION_PATH/DVTFoundation.xcplugindata.bak"
# Now merge in the additonal languages to DVTFoundation.xcplugindata
$PLISTBUDDY "$DVTFOUNDATION_PATH/DVTFoundation.xcplugindata" -c 'Merge AdditionalLanguages.plist plug-in:extensions'
# Get rid of the AdditionalLanguages.plist since it was just temporary
rm -f AdditionalLanguages.plist
# Copy in the xclangspecs for the languages (assumes in same directory as this shell script)
#cp "$SCRIPT_PATH/Pascal.xclangspec" "$DVTFOUNDATION_PATH"
# Remove any cached Xcode plugins
rm -f /private/var/folders/*/*/*/com.apple.DeveloperTools/*/Xcode/PlugInCache.xcplugincache
echo "Syntax coloring must be manually selected from the Editor - Syntax Coloring menu in Xcode."
Tuesday, August 28, 2012
How To Migrate Windows 7 to a Solid State Drive

Basically, I follow this guide to migrate windows 7 hard disk to a new SSD hard disk http://www.howtogeek.com/97242/how-to-migrate-windows-7-to-a-solid-state-drive/
The essential steps are
1. Create a system repair disc in a CD/DVD http://windows.microsoft.com/is-IS/windows7/Create-a-system-repair-disc
2. Backup your system hard disk to external HD using Windows 7 Backup Utility. And after backing up, Windows 7 will prompt you with an option to create a system repair disc in case you have forgotten the first step.
3. Find the recovery disk for the PC and download the LAN or WLAN drivers from the support site of the PC Manufacturer and with your Windows 7 Product Key on hand (which is usually a sticker on the PC).
4. Do this before you clone your hard disk in Windows command prompt (Run as Administrator)
slmgr /upk
slmgr /rearm
So that the cloned SDD hard disk will not get "not genuine" warning after boot up and that Windows 7 will prompt you to re-renter the Windows 7 Product Key and activate again.
5. I use Clonezilla using partition to partition clone (as my target hard disk is larger than the source partition), and after cloning, switch the new SSD HD as the second one in boot sequence in the BIOS, while the DVD drive as the first one to boot. Moreover the old Windows 7 hard disk has to be detached from the PC. Make sure you remove the power and/or battery before you add or remove physically parts of the PC.
6. After cloning to SDD, you need to boot up the machine using system repair disc that you created earlier, as the Boot Manager is missing in the cloned SSD hard disk
7. After boot up the system repair disc, you have to use the command prompt to assign the drive letter of the cloned SSD hard disk to C
Diskpart
List disk
Select disk n (where n is your SSD’s number as provided by the previous command)
ASSIGN LETTER=C
Active
Exit
8. You may need to boot up your machine using the system repair disc several rounds in order for repairing the startup.
9. After boot up the machine using the cloned SSD harddisk, the OS will prompt you to enter the Windows 7 Product Key.
10. In case you want to have a clean install of Windows 7 rather than cloning, you must have your recovery disk for the PC Manufacturer and hardware drivers and all the program install disks on hand.
Saturday, August 25, 2012
Friday, August 3, 2012
Windows 7 CD Key
Windows 7 Ultimate Retail Key
Windows 7 Professional Retail Key
Windows 7 Home Premium Retail Key
Windows 7 Home Basic Retail Key
J783Y-JKQWR-677Q8-KCXTF-BHWGC C4M9W-WPRDG-QBB3F-VM9K8-KDQ9Y 2VCGQ-BRVJ4-2HGJ2-K36X9-J66JG MGX79-TPQB9-KQ248-KXR2V-DHRTD FJHWT-KDGHY-K2384-93CT7-323RC THHH2-RKK9T-FX6HM-QXT86-MGBCP KH2J9-PC326-T44D4-39H6V-TVPBY D8BMB-BVGMF-M9PTV-HWDQW-HPCXX TFP9Y-VCY3P-VVH3T-8XXCC-MF4YK
Windows 7 Professional Retail Key
HWRFF-2FFYX-XFXP2-DYFC3-BX3B7 YT9K9-4R938-3TVXX-3Q3QT-9HBXM C3X7Y-R6WWH-BRXRD-FY84C-FXWHK XJBR4-M42Q4-QPJ9C-BRDRJ-KHPVY TF3Q7-YYP8R-D78R7-W9Q9M-DXVBK J8D39-J2WM3-6368H-JV8G9-BYJJQ P3H89-V3P2R-JVBTF-YM2J2-FTMT3 RGM4T-3VT6B-GTYPY-3FHP2-HV2YJ TTY4D-RDKK9-TYB2T-68WJW-M69KJ
Windows 7 Home Premium Retail Key
PPBK3-M92CH-MRR9X-34Y9P-7CH2F Q8JXJ-8HDJR-X4PXM-PW99R-KTJ3H 8489X-THF3D-BDJQR-D27PH-PJ3HC TWF78-W7H8T-KXD8C-YDFCQ-HK4WG BFTWY-X2PJR-VJP8V-KGBPJ-FWBMP RHVHB-VYF67-9FT4M-2WXR8-P3C6R 38CGD-Q6RHB-37BVW-Y3XK7-3CJVC 86GG2-DBVT6-KYQQ6-XFK9R-896MF 4CBPF-W7GXG-J4J8F-GHG79-Q9YT8
Windows 7 Home Basic Retail Key
P4DBR-8YPT6-KHRB8-6T7RW-GMXGV FGTCF-8JBG2-4BK4G-36JWB-PFQXB CW4KD-MK47X-JYQ7Y-DKKTR-86TH7 37X8Q-CJ46F-RB8XP-GJ6RK-RHYT7 GDK6B-87QP9-F9WYK-PP327-BQ622 72C8D-KQ9Y4-FGBCD-WY9WG-BD92C GV7X4-92M4D-6F69V-RFGP9-3FBBD 4JCWB-FVHJJ-XCPKC-CTWDP-QQQ9M WXM3Y-H2GDY-TKFQH-6GQQF-7VG8P
Subscribe to:
Posts (Atom)