/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.docker.ext.client.manage;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import org.eclipse.che.api.user.gwt.client.UserProfileServiceClient;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.preferences.AbstractPreferencePagePresenter;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.rest.AsyncRequestCallback;
import org.eclipse.che.ide.rest.StringMapUnmarshaller;
import org.eclipse.che.ide.ui.dialogs.ConfirmCallback;
import org.eclipse.che.ide.ui.dialogs.DialogFactory;
import org.eclipse.che.ide.util.Base64;
import org.eclipse.che.plugin.docker.client.dto.AuthConfig;
import org.eclipse.che.plugin.docker.client.dto.AuthConfigs;
import org.eclipse.che.plugin.docker.ext.client.DockerLocalizationConstant;
import org.eclipse.che.plugin.docker.ext.client.manage.input.InputDialog;
import org.eclipse.che.plugin.docker.ext.client.manage.input.callback.InputCallback;
import javax.inject.Inject;
import java.util.HashMap;
import java.util.Map;
import static org.eclipse.che.plugin.docker.ext.client.manage.input.InputDialogPresenter.InputMode;
/**
* Presenter for displaying and work with docker registry credentials
*
* @author Sergii Leschenko
*/
public class CredentialsPreferencesPresenter extends AbstractPreferencePagePresenter implements CredentialsPreferencesView.ActionDelegate {
private static final String AUTH_PREFERENCE_NAME = "codenvy:dockerCredentials";
private static final String DEFAULT_SERVER = "https://index.docker.io/v1/";
private final CredentialsPreferencesView view;
private final UserProfileServiceClient userProfileServiceClient;
private final DtoFactory dtoFactory;
private final CredentialsDialogFactory inputDialogFactory;
private final AppContext appContext;
private final DialogFactory dialogFactory;
private final DockerLocalizationConstant locale;
@Inject
public CredentialsPreferencesPresenter(DockerLocalizationConstant locale,
CredentialsPreferencesView view,
UserProfileServiceClient userProfileServiceClient,
DtoFactory dtoFactory,
CredentialsDialogFactory credentialsDialogFactory,
AppContext appContext,
DialogFactory dialogFactory) {
super(locale.dockerPreferencesTitle(), locale.dockerPreferencesCategory(), null);
this.view = view;
this.view.setDelegate(this);
this.userProfileServiceClient = userProfileServiceClient;
this.dtoFactory = dtoFactory;
this.inputDialogFactory = credentialsDialogFactory;
this.appContext = appContext;
this.dialogFactory = dialogFactory;
this.locale = locale;
}
@Override
public boolean isDirty() {
return false;
}
@Override
public void storeChanges() {
}
@Override
public void revertChanges() {
}
@Override
public void go(AcceptsOneWidget container) {
refreshCredentials();
container.setWidget(view);
}
@Override
public void onAddClicked() {
inputDialogFactory.createInputDialog(InputMode.CREATE, new InputCallback() {
@Override
public void saved(AuthConfig authConfig) {
addAuthConfig(authConfig);
}
}).show();
}
@Override
public void onAddAccountClicked() {
inputDialogFactory.createInputDialog(InputMode.CREATE_DOCKERHUB, new InputCallback() {
@Override
public void saved(AuthConfig authConfig) {
addAuthConfig(authConfig);
}
}).show();
}
@Override
public void onEditClicked(AuthConfig authConfig) {
final InputDialog inputDialog = inputDialogFactory
.createInputDialog(authConfig.getServeraddress().equals(DEFAULT_SERVER) ? InputMode.EDIT_DOCKERHUB : InputMode.EDIT,
new InputCallback() {
@Override
public void saved(AuthConfig authConfig) {
addAuthConfig(authConfig);
}
});
inputDialog.setData(authConfig);
inputDialog.show();
}
@Override
public void onDeleteClicked(final AuthConfig authConfig) {
dialogFactory.createConfirmDialog(locale.removeCredentialsConfirmTitle(),
locale.removeCredentialsConfirmText(authConfig.getServeraddress()), new ConfirmCallback() {
@Override
public void accepted() {
removeAuthConfig(authConfig.getServeraddress());
}
}, null).show();
}
private void refreshCredentials() {
view.setKeys(getUserCredentials().getConfigs().values());
}
private void addAuthConfig(AuthConfig authConfig) {
if (authConfig.getServeraddress().isEmpty()) {
authConfig.setServeraddress(DEFAULT_SERVER);
}
AuthConfigs authConfigs = getUserCredentials();
authConfigs.getConfigs().put(authConfig.getServeraddress(), authConfig);
updateAuthConfigs(authConfigs);
}
private void removeAuthConfig(String remoteAddress) {
AuthConfigs authConfigs = getUserCredentials();
authConfigs.getConfigs().remove(remoteAddress);
updateAuthConfigs(authConfigs);
}
private void updateAuthConfigs(AuthConfigs authConfigs) {
HashMap<String, String> preferences = new HashMap<>();
preferences.put(AUTH_PREFERENCE_NAME, Base64.encode(dtoFactory.toJson(authConfigs)));
userProfileServiceClient.updatePreferences(preferences, new AsyncRequestCallback<Map<String, String>>(new StringMapUnmarshaller()) {
@Override
protected void onSuccess(Map<String, String> result) {
appContext.getCurrentUser().setPreferences(result);
refreshCredentials();
}
@Override
protected void onFailure(Throwable exception) {
}
});
}
private AuthConfigs getUserCredentials() {
AuthConfigs authConfigs;
String authConfigsJson = appContext.getCurrentUser().getPreferences().get(AUTH_PREFERENCE_NAME);
if (authConfigsJson != null) {
final String decrypt = Base64.decode(authConfigsJson);
authConfigs = dtoFactory.createDtoFromJson(decrypt, AuthConfigs.class);
} else {
authConfigs = dtoFactory.createDto(AuthConfigs.class);
}
return authConfigs;
}
}