package org.lttpp.eemory.oauth; import java.net.MalformedURLException; import java.net.URL; import java.util.LinkedHashMap; import org.apache.commons.lang3.StringUtils; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.lttpp.eemory.Constants; import org.lttpp.eemory.Messages; import org.lttpp.eemory.oauth.impl.JettyCallback; import org.lttpp.eemory.util.ClipboardUtil; import org.lttpp.eemory.util.EncryptionUtil; import org.lttpp.eemory.util.EvernoteUtil; import org.lttpp.eemory.util.MapUtil; import org.lttpp.eemory.util.SyncEclipseUtil; import org.scribe.builder.ServiceBuilder; import org.scribe.builder.api.EvernoteApi; import org.scribe.model.Token; import org.scribe.model.Verifier; import org.scribe.oauth.OAuthService; public class OAuth { private static final String CONSUMER_KEY = "eevernote"; private static final String CONSUMER_SECRET = "kmLkG5Z1dFnBAam5oqie9NgHqN2zfojd+lg/00GRroU="; private final CallbackHandler callback; public OAuth() throws Exception { callback = new JettyCallback(); callback.ready(); } public String auth(final Shell shell) throws MalformedURLException, InterruptedException { try { Class<? extends EvernoteApi> apiClass = EvernoteUtil.brand().scribeOAuthApi(); OAuthService service = new ServiceBuilder().provider(apiClass).apiKey(CONSUMER_KEY).apiSecret(EncryptionUtil.decrypt(CONSUMER_SECRET)).callback(callback.getCallbackURL()).build(); Token requestToken = service.getRequestToken(); String authUrl = service.getAuthorizationUrl(requestToken); try { PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(new URL(authUrl)); } catch (PartInitException couldNotOpenBrowser) { LinkedHashMap<String, String> btns = MapUtil.orderedMap(); btns.put(Constants.Plugin_OAuth_Copy, Messages.Plugin_OAuth_Copy); btns.put(Constants.Plugin_OAuth_Cancel, Messages.Plugin_OAuth_Cancel); String opt = new SyncEclipseUtil().openCustomImageTypeWithCustomButtonsSyncly(shell, Messages.Plugin_OAuth_Title, Messages.Plugin_OAuth_DoItManually, new Image(Display.getDefault(), getClass().getClassLoader().getResourceAsStream(Constants.OAUTH_EVERNOTE_TRADEMARK)), btns); if (Constants.Plugin_OAuth_Copy.equals(opt)) { ClipboardUtil.copy(authUrl); } else { return StringUtils.EMPTY; } } // wait for callback handling synchronized (callback) { callback.wait(30 * 60 * 1000);// 30 minutes } String verifierValue = callback.getVerifier(); if (StringUtils.isBlank(verifierValue)) { return StringUtils.EMPTY; } Verifier verifier = new Verifier(verifierValue); Token accessToken = service.getAccessToken(requestToken, verifier); return accessToken.getToken(); } finally { callback.done(); } } }