import com.intellij.util.ThrowableConvertor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.github.api.GithubUser;
+import org.jetbrains.plugins.github.util.GithubAuthData;
import org.jetbrains.plugins.github.util.GithubAuthDataHolder;
import org.jetbrains.plugins.github.util.GithubSettings;
import org.jetbrains.plugins.github.util.GithubUtil;
protected final GithubLoginPanel myGithubLoginPanel;
protected final GithubSettings mySettings;
- protected final GithubAuthDataHolder myAuthHolder;
protected final Project myProject;
- public GithubLoginDialog(@NotNull final Project project, @NotNull GithubAuthDataHolder authHolder) {
+ protected GithubAuthData myAuthData;
+
+ public GithubLoginDialog(@NotNull final Project project, @NotNull GithubAuthData oldAuthData) {
super(project, true);
myProject = project;
- myAuthHolder = authHolder;
myGithubLoginPanel = new GithubLoginPanel(this);
- mySettings = GithubSettings.getInstance();
- myGithubLoginPanel.setHost(mySettings.getHost());
- myGithubLoginPanel.setLogin(mySettings.getLogin());
- myGithubLoginPanel.setAuthType(mySettings.getAuthType());
+ myGithubLoginPanel.setHost(oldAuthData.getHost());
+ myGithubLoginPanel.setAuthType(oldAuthData.getAuthType());
+ GithubAuthData.BasicAuth basicAuth = oldAuthData.getBasicAuth();
+ if (basicAuth != null) {
+ myGithubLoginPanel.setLogin(basicAuth.getLogin());
+ }
+ mySettings = GithubSettings.getInstance();
if (mySettings.isSavePasswordMakesSense()) {
myGithubLoginPanel.setSavePasswordSelected(mySettings.isSavePassword());
}
@Override
protected void doOKAction() {
- // aware of recursive synchronization in getTwoFactorAuthData from modal thread
final GithubAuthDataHolder authHolder = new GithubAuthDataHolder(myGithubLoginPanel.getAuthData());
try {
GithubUtil.computeValueInModal(myProject, "Access to GitHub", new ThrowableConvertor<ProgressIndicator, GithubUser, IOException>() {
}
});
- myAuthHolder.setAuthData(authHolder.getAuthData());
+ myAuthData = authHolder.getAuthData();
if (mySettings.isSavePasswordMakesSense()) {
mySettings.setSavePassword(myGithubLoginPanel.isSavePasswordSelected());
return myGithubLoginPanel.isSavePasswordSelected();
}
+ @NotNull
+ public GithubAuthData getAuthData() {
+ if (myAuthData == null) {
+ throw new IllegalStateException("AuthData is not set");
+ }
+ return myAuthData;
+ }
+
public void clearErrors() {
setErrorText(null);
}
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.util.ThrowableComputable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vfs.VirtualFile;
}
}
- public static void getValidAuthData(@NotNull Project project,
- @NotNull GithubAuthDataHolder authHolder,
- @NotNull ProgressIndicator indicator,
- @NotNull GithubAuthData oldAuth) throws GithubOperationCanceledException {
- synchronized (authHolder.myLock) {
- if (authHolder.getAuthData() != oldAuth) {
- return;
- }
-
- final GithubLoginDialog dialog = new GithubLoginDialog(project, authHolder);
- ApplicationManager.getApplication().invokeAndWait(new Runnable() {
- @Override
- public void run() {
- DialogManager.show(dialog);
+ public static void getValidAuthData(@NotNull final Project project,
+ @NotNull final GithubAuthDataHolder authHolder,
+ @NotNull final ProgressIndicator indicator,
+ @NotNull final GithubAuthData oldAuth) throws GithubOperationCanceledException {
+ authHolder.runTransaction(oldAuth, new ThrowableComputable<GithubAuthData, GithubOperationCanceledException>() {
+ @Override
+ @NotNull
+ public GithubAuthData compute() throws GithubOperationCanceledException {
+ final GithubLoginDialog dialog = new GithubLoginDialog(project, oldAuth);
+ ApplicationManager.getApplication().invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ DialogManager.show(dialog);
+ }
+ }, indicator.getModalityState());
+ if (!dialog.isOK()) {
+ throw new GithubOperationCanceledException("Can't get valid credentials");
}
- }, indicator.getModalityState());
- if (!dialog.isOK()) {
- throw new GithubOperationCanceledException("Can't get valid credentials");
- }
-
- GithubSettings.getInstance().setAuthData(authHolder.getAuthData(), dialog.isSavePasswordSelected());
- }
- }
+ GithubAuthData authData = dialog.getAuthData();
- public static void getValidBasicAuthDataForHost(@NotNull Project project,
- @NotNull GithubAuthDataHolder authHolder,
- @NotNull ProgressIndicator indicator,
- @NotNull GithubAuthData oldAuth,
- @NotNull String host) throws GithubOperationCanceledException {
- synchronized (authHolder.myLock) {
- if (authHolder.getAuthData() != oldAuth) {
- return;
+ GithubSettings.getInstance().setAuthData(authData, dialog.isSavePasswordSelected());
+ return authData;
}
+ });
+ }
- final GithubLoginDialog dialog = new GithubBasicLoginDialog(project, authHolder, host);
- ApplicationManager.getApplication().invokeAndWait(new Runnable() {
- @Override
- public void run() {
- DialogManager.show(dialog);
+ public static void getValidBasicAuthDataForHost(@NotNull final Project project,
+ @NotNull final GithubAuthDataHolder authHolder,
+ @NotNull final ProgressIndicator indicator,
+ @NotNull final GithubAuthData oldAuth,
+ @NotNull final String host) throws GithubOperationCanceledException {
+ authHolder.runTransaction(oldAuth, new ThrowableComputable<GithubAuthData, GithubOperationCanceledException>() {
+ @Override
+ @NotNull
+ public GithubAuthData compute() throws GithubOperationCanceledException {
+ final GithubLoginDialog dialog = new GithubBasicLoginDialog(project, oldAuth, host);
+ ApplicationManager.getApplication().invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ DialogManager.show(dialog);
+ }
+ }, indicator.getModalityState());
+ if (!dialog.isOK()) {
+ throw new GithubOperationCanceledException("Can't get valid credentials");
}
- }, indicator.getModalityState());
- if (!dialog.isOK()) {
- throw new GithubOperationCanceledException("Can't get valid credentials");
- }
+ GithubAuthData authData = dialog.getAuthData();
- final GithubSettings settings = GithubSettings.getInstance();
- if (settings.getAuthType() != GithubAuthData.AuthType.TOKEN) {
- GithubSettings.getInstance().setAuthData(authHolder.getAuthData(), dialog.isSavePasswordSelected());
+ final GithubSettings settings = GithubSettings.getInstance();
+ if (settings.getAuthType() != GithubAuthData.AuthType.TOKEN) {
+ GithubSettings.getInstance().setAuthData(authData, dialog.isSavePasswordSelected());
+ }
+ return authData;
}
- }
+ });
}
- private static void getTwoFactorAuthData(@NotNull Project project,
- @NotNull GithubAuthDataHolder authHolder,
- @NotNull ProgressIndicator indicator,
- @NotNull GithubAuthData oldAuth) throws GithubOperationCanceledException {
- synchronized (authHolder.myLock) {
- if (authHolder.getAuthData() != oldAuth) {
- return;
- }
-
- if (authHolder.getAuthData().getAuthType() != GithubAuthData.AuthType.BASIC) {
- throw new GithubOperationCanceledException("Two factor authentication can be used only with Login/Password");
- }
+ private static void getTwoFactorAuthData(@NotNull final Project project,
+ @NotNull final GithubAuthDataHolder authHolder,
+ @NotNull final ProgressIndicator indicator,
+ @NotNull final GithubAuthData oldAuth) throws GithubOperationCanceledException {
+ authHolder.runTransaction(oldAuth, new ThrowableComputable<GithubAuthData, GithubOperationCanceledException>() {
+ @Override
+ @NotNull
+ public GithubAuthData compute() throws GithubOperationCanceledException {
+ if (authHolder.getAuthData().getAuthType() != GithubAuthData.AuthType.BASIC) {
+ throw new GithubOperationCanceledException("Two factor authentication can be used only with Login/Password");
+ }
- GithubApiUtil.askForTwoFactorCodeSMS(oldAuth);
+ GithubApiUtil.askForTwoFactorCodeSMS(oldAuth);
- final GithubTwoFactorDialog dialog = new GithubTwoFactorDialog(project);
- ApplicationManager.getApplication().invokeAndWait(new Runnable() {
- @Override
- public void run() {
- DialogManager.show(dialog);
+ final GithubTwoFactorDialog dialog = new GithubTwoFactorDialog(project);
+ ApplicationManager.getApplication().invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ DialogManager.show(dialog);
+ }
+ }, indicator.getModalityState());
+ if (!dialog.isOK()) {
+ throw new GithubOperationCanceledException("Can't get two factor authentication code");
}
- }, indicator.getModalityState());
- if (!dialog.isOK()) {
- throw new GithubOperationCanceledException("Can't get two factor authentication code");
- }
- authHolder.setTwoFactorCode(dialog.getCode());
- }
+ return oldAuth.copyWithTwoFactorCode(dialog.getCode());
+ }
+ });
}
@NotNull
- public static GithubAuthDataHolder getValidAuthDataHolderFromConfig(@NotNull Project project,
- @NotNull ProgressIndicator indicator) throws IOException {
+ public static GithubAuthDataHolder getValidAuthDataHolderFromConfig(@NotNull Project project, @NotNull ProgressIndicator indicator)
+ throws IOException {
GithubAuthData auth = GithubAuthData.createFromSettings();
GithubAuthDataHolder authHolder = new GithubAuthDataHolder(auth);
try {