blob: 81a59ea485584ef727667f0f62cc034cc5e2db40 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2013 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.commons.repositories.ui.auth;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.mylyn.commons.repositories.core.auth.AuthenticationRequest;
import org.eclipse.mylyn.commons.repositories.core.auth.AuthenticationType;
import org.eclipse.mylyn.commons.repositories.core.auth.OpenIdAuthenticationRequest;
import org.eclipse.mylyn.commons.repositories.core.auth.OpenIdCredentials;
import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
import org.eclipse.mylyn.commons.workbench.browser.WebBrowserDialog;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.LocationAdapter;
import org.eclipse.swt.browser.LocationEvent;
import org.eclipse.swt.widgets.Shell;
/**
* @author Steffen Pingel
*/
public class OpenIdCredentialsProviderUi extends AbstractCredentialsProviderUi<OpenIdCredentials> {
protected OpenIdCredentials credentials;
@Override
public IStatus open(Shell parentShell, AuthenticationRequest<AuthenticationType<OpenIdCredentials>> authRequest) {
if (!(authRequest instanceof OpenIdAuthenticationRequest)) {
throw new IllegalArgumentException(
"Extected instanceof OpenIdAuthenticationRequest, got " + authRequest.getClass()); //$NON-NLS-1$
}
final OpenIdAuthenticationRequest request = (OpenIdAuthenticationRequest) authRequest;
final WebBrowserDialog dialog = new WebBrowserDialog(WorkbenchUtil.getShell(),
Messages.OpenIdCredentialsProviderUi_Login, null,
Messages.OpenIdCredentialsProviderUi_Login_to_OpenID_Provider, MessageDialog.NONE,
new String[] { IDialogConstants.CANCEL_LABEL }, 0);
dialog.create();
dialog.getBrowser().addLocationListener(new LocationAdapter() {
@Override
public void changing(LocationEvent event) {
if (event.location != null && event.location.startsWith(request.getReturnUrl())) {
credentials = new OpenIdCredentials(event.location, null);
}
// alternatively check cookies since IE does not notify listeners of redirects
String value = Browser.getCookie(request.getCookie(), request.getCookieUrl());
if (value != null) {
credentials = new OpenIdCredentials(event.location, value);
}
if (credentials != null) {
event.doit = false;
// delay execution to avoid IE crash
dialog.getBrowser().getDisplay().asyncExec(new Runnable() {
public void run() {
if (dialog.getShell() != null && !dialog.getShell().isDisposed()) {
dialog.close();
}
}
});
}
}
});
// navigate to login page
dialog.getBrowser().setUrl(request.getRequestUrl() + "?" + getRequestParameters(request)); //$NON-NLS-1$
if (dialog.open() == Window.OK) {
return Status.OK_STATUS;
} else {
return Status.CANCEL_STATUS;
}
}
private String getRequestParameters(final OpenIdAuthenticationRequest request) {
final StringBuilder sb = new StringBuilder();
try {
for (Map.Entry<String, String> entry : request.getProviderArgs().entrySet()) {
if (sb.length() > 0) {
sb.append("&"); //$NON-NLS-1$
}
sb.append(URLEncoder.encode(entry.getKey(), "UTF-8")); //$NON-NLS-1$
sb.append("="); //$NON-NLS-1$
sb.append(URLEncoder.encode(entry.getValue(), "UTF-8")); //$NON-NLS-1$
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return sb.toString();
}
@Override
public OpenIdCredentials getCredentials() {
return credentials;
}
}