package org.kie.eclipse.navigator.view.actions.repository; import java.util.concurrent.atomic.AtomicReference; import org.eclipse.egit.core.securestorage.UserPasswordCredentials; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jgit.errors.UnsupportedCredentialItem; import org.eclipse.jgit.transport.CredentialItem; import org.eclipse.jgit.transport.CredentialsProvider; import org.eclipse.jgit.transport.URIish; import org.eclipse.swt.widgets.Display; import org.kie.eclipse.IKieConstants; import org.kie.eclipse.server.IKieServerHandler; public class KieCredentialsProvider extends CredentialsProvider { private IKieServerHandler server; private String user; private String password; public KieCredentialsProvider(IKieServerHandler server, String username, String password) { this.server = server; this.user = username; this.password = password; } @Override public boolean isInteractive() { return false; } @Override public boolean supports(CredentialItem... items) { for (CredentialItem i : items) { if (i instanceof CredentialItem.Username) continue; else if (i instanceof CredentialItem.Password) continue; else return false; } return true; } @Override public boolean get(URIish uri, CredentialItem... items) throws UnsupportedCredentialItem { if (items.length == 0) { return true; } CredentialItem.Username userItem = null; CredentialItem.Password passwordItem = null; for (final CredentialItem item : items) { // System.out.println("Credentials.get: " + item.getPromptText()); if (item instanceof CredentialItem.Username) userItem = (CredentialItem.Username) item; else if (item instanceof CredentialItem.Password) passwordItem = (CredentialItem.Password) item; else if (item instanceof CredentialItem.YesNoType) { // The "Trusted Server Connection" preference is a string // with values of either "always" or "never". String trustedConnection = server.getPreference( IKieConstants.PREF_SERVER_TRUSTED_CONNECTION, MessageDialogWithToggle.NEVER); final AtomicReference<Boolean> ar = new AtomicReference<Boolean>(); if (MessageDialogWithToggle.ALWAYS.equals(trustedConnection)) { ar.set(true); } else { Display.getDefault().syncExec(new Runnable() { @Override public void run() { MessageDialogWithToggle dlg = MessageDialogWithToggle.openYesNoQuestion( Display.getDefault().getActiveShell(), "Connect to Server", item.getPromptText(), "Don't ask me again", false, org.kie.eclipse.Activator.getDefault().getPreferenceStore(), server.getPreferenceName(IKieConstants.PREF_SERVER_TRUSTED_CONNECTION)); ar.set(dlg.getReturnCode() == IDialogConstants.YES_ID); if (ar.get()) { // if user said "Yes" then save the "Trusted Server Connection" // preference - remember to convert the boolean toggle state // to an "always" or "never" string! server.putPreference( IKieConstants.PREF_SERVER_TRUSTED_CONNECTION, dlg.getToggleState() ? MessageDialogWithToggle.ALWAYS : MessageDialogWithToggle.NEVER); } } }); } ((CredentialItem.YesNoType) item).setValue(ar.get()); return true; } else { throw new UnsupportedCredentialItem(uri, "Credential Item not supported : " + item.getPromptText()); } } if ((userItem != null || passwordItem != null)) { UserPasswordCredentials credentials = null; if ((user != null) && (password != null)) credentials = new UserPasswordCredentials(user, password); if (credentials == null) { return false; } if (userItem != null) userItem.setValue(credentials.getUser()); if (passwordItem != null) passwordItem.setValue(credentials.getPassword().toCharArray()); return true; } return false; } }