diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubOpenInBrowserAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubOpenInBrowserAction.java index f760f7d27ea6..2aa339018bde 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubOpenInBrowserAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubOpenInBrowserAction.java @@ -100,7 +100,7 @@ public class GithubOpenInBrowserAction extends DumbAwareAction { final String pushUrl = githubRemote.pushUrl(); int index = -1; - if (pushUrl.startsWith(GithubUtil.GITHUB_HOST)) { + if (pushUrl.startsWith(GithubUtil.getHttpsUrl())) { index = pushUrl.lastIndexOf('/'); if (index == -1) { Messages.showErrorDialog(project, "Cannot extract info about repository name: " + pushUrl, CANNOT_OPEN_IN_BROWSER); diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java b/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java index 2f500af26957..b58f576dfa66 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java @@ -25,21 +25,25 @@ public class GithubSettings implements PersistentStateComponent { private static final String GITHUB_SETTINGS_TAG = "GithubSettings"; private static final String LOGIN = "Login"; private static final String PASSWORD = "Password"; + private static final String HOST = "Host"; + private static final String GITHUB = "github.com"; private String myLogin; private String myPassword; + private String myHost; public static GithubSettings getInstance(){ return ServiceManager.getService(GithubSettings.class); } public Element getState() { - if (StringUtil.isEmptyOrSpaces(myLogin) && StringUtil.isEmptyOrSpaces(myPassword)) { + if (StringUtil.isEmptyOrSpaces(myLogin) && StringUtil.isEmptyOrSpaces(myPassword) && StringUtil.isEmptyOrSpaces(myHost)) { return null; } final Element element = new Element(GITHUB_SETTINGS_TAG); element.setAttribute(LOGIN, getLogin()); element.setAttribute(PASSWORD, getEncodedPassword()); + element.setAttribute(HOST, getHost()); return element; } @@ -60,6 +64,7 @@ public class GithubSettings implements PersistentStateComponent { try { setLogin(element.getAttributeValue(LOGIN)); setEncodedPassword(element.getAttributeValue(PASSWORD)); + setHost(element.getAttributeValue(HOST)); } catch (Exception e) { // ignore @@ -76,6 +81,10 @@ public class GithubSettings implements PersistentStateComponent { return myPassword != null ? myPassword : ""; } + public String getHost() { + return myHost != null ? myHost : GITHUB; + } + public void setLogin(final String login) { myLogin = login != null ? login : ""; } @@ -83,4 +92,9 @@ public class GithubSettings implements PersistentStateComponent { public void setPassword(final String password) { myPassword = password != null ? password : ""; } + + public void setHost(final String host) { + myHost = host != null ? host : GITHUB; + } + } \ No newline at end of file diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java index a4c6a497a6f9..6cb51c691072 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java @@ -94,7 +94,7 @@ public class GithubShareAction extends DumbAwareAction { @Override public Boolean compute() { ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); - return GithubUtil.isPrivateRepoAllowed(settings.getLogin(), settings.getPassword()); + return GithubUtil.isPrivateRepoAllowed(settings.getHost(), settings.getLogin(), settings.getPassword()); } }); } @@ -112,7 +112,7 @@ public class GithubShareAction extends DumbAwareAction { final String description = shareDialog.getDescription(); try { LOG.info("Creating GitHub repository"); - GithubUtil.doREST(settings.getLogin(), settings.getPassword(), + GithubUtil.doREST(settings.getHost(), settings.getLogin(), settings.getPassword(), "/repos/create?name=" + name + "&description=" + description + "&public=" + (isPrivate ? "0" : "1"), true); LOG.info("Successfully created GitHub repository"); } diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java index 69d56de8af58..030bdb249568 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java @@ -35,12 +35,17 @@ import java.util.List; * @author oleg */ public class GithubUtil { - public static final String GITHUB_HOST = "https://github.com"; - public static final String GITHUB_HOST_GIT = "git@github.com"; - private static final String API_URL = "/api/v2/xml"; private static final Logger LOG = Logger.getInstance(GithubUtil.class.getName()); + public static String getHttpsUrl() { + return "https://" + GithubSettings.getInstance().getHost(); + } + + public static String getHostByUrl(final String url) { + return url.startsWith("https://") ? url.substring(8) : url.startsWith("http://") ? url.substring(7) : url.startsWith("git@") ? url.substring(4) : url; + } + public static T accessToGithubWithModalProgress(final Project project, final Computable computable) throws CancelledException { final Ref result = new Ref(); ProgressManager.getInstance().run(new Task.Modal(project, "Access to GitHub", true) { @@ -69,9 +74,9 @@ public class GithubUtil { }); } - public static boolean testConnection(final String login, final String password) { + public static boolean testConnection(final String url, final String login, final String password) { try { - final HttpMethod method = doREST(login, password, "/user/show/" + login, false); + final HttpMethod method = doREST(url, login, password, "/user/show/" + login, false); final InputStream stream = method.getResponseBodyAsStream(); final Element element = new SAXBuilder(false).build(stream).getRootElement(); if ("error".equals(element.getName())){ @@ -86,10 +91,10 @@ public class GithubUtil { return false; } - public static HttpMethod doREST(final String login, final String password, final String request, final boolean post) throws Exception { + public static HttpMethod doREST(final String url, final String login, final String password, final String request, final boolean post) throws Exception { final HttpClient client = getHttpClient(login, password); client.getParams().setContentCharset("UTF-8"); - final String uri = JDOMUtil.escapeText(getUrl() + request, true, true); + final String uri = JDOMUtil.escapeText("https://" + getHostByUrl(url) + API_URL + request, true, true); final HttpMethod method = post ? new PostMethod(uri) : new GetMethod(uri); client.executeMethod(method); return method; @@ -111,14 +116,10 @@ public class GithubUtil { return client; } - private static String getUrl() { - return GITHUB_HOST + API_URL; - } - - public static List getAvailableRepos(final String login, final String password, final boolean ownOnly) { + public static List getAvailableRepos(final String url, final String login, final String password, final boolean ownOnly) { try { final String request = (ownOnly ? "/repos/show/" : "/repos/watched/") + login; - final HttpMethod method = doREST(login, password, request, false); + final HttpMethod method = doREST(url, login, password, request, false); final InputStream stream = method.getResponseBodyAsStream(); final Element element = new SAXBuilder(false).build(stream).getRootElement(); if ("error".equals(element.getName())){ @@ -140,10 +141,10 @@ public class GithubUtil { } @Nullable - public static RepositoryInfo getDetailedRepoInfo(final String login, final String password, final String name) { + public static RepositoryInfo getDetailedRepoInfo(final String url, final String login, final String password, final String name) { try { final String request = "/repos/show/" + login + "/" + name; - final HttpMethod method = doREST(login, password, request, false); + final HttpMethod method = doREST(url, login, password, request, false); final InputStream stream = method.getResponseBodyAsStream(); final Element element = new SAXBuilder(false).build(stream).getRootElement(); if ("error".equals(element.getName())){ @@ -158,10 +159,10 @@ public class GithubUtil { return null; } - public static boolean isPrivateRepoAllowed(final String login, final String password) { + public static boolean isPrivateRepoAllowed(final String url, final String login, final String password) { try { final String request = "/user/show/" + login; - final HttpMethod method = doREST(login, password, request, false); + final HttpMethod method = doREST(url, login, password, request, false); final InputStream stream = method.getResponseBodyAsStream(); final Element element = new SAXBuilder(false).build(stream).getRootElement(); if ("error".equals(element.getName())){ @@ -180,9 +181,9 @@ public class GithubUtil { } public static boolean checkCredentials(final Project project) { - return checkCredentials(project, null, null); + return checkCredentials(project, null, null, null); } - public static boolean checkCredentials(final Project project, @Nullable final String login, @Nullable final String password) { + public static boolean checkCredentials(final Project project, @Nullable final String url, @Nullable final String login, @Nullable final String password) { if (login == null && password == null && areCredentialsEmpty()){ return false; } @@ -191,11 +192,11 @@ public class GithubUtil { @Override public Boolean compute() { ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); - if (login != null && password != null){ - return testConnection(login, password); + if (url != null && login != null && password != null){ + return testConnection(url, login, password); } final GithubSettings settings = GithubSettings.getInstance(); - return testConnection(settings.getLogin(), settings.getPassword()); + return testConnection(settings.getHost(), settings.getLogin(), settings.getPassword()); } }); } @@ -225,7 +226,7 @@ public class GithubUtil { @Override public Boolean compute() { ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); - return testConnection(settings.getLogin(), settings.getPassword()); + return testConnection(settings.getHost(), settings.getLogin(), settings.getPassword()); } }); } @@ -245,7 +246,7 @@ public class GithubUtil { @Override public List compute() { ProgressManager.getInstance().getProgressIndicator().setText("Extracting info about available repositories"); - return getAvailableRepos(settings.getLogin(), settings.getPassword(), ownOnly); + return getAvailableRepos(settings.getHost(), settings.getLogin(), settings.getPassword(), ownOnly); } }); } @@ -268,7 +269,7 @@ public class GithubUtil { @Override public Boolean compute() { ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); - return testConnection(settings.getLogin(), settings.getPassword()); + return testConnection(settings.getHost(), settings.getLogin(), settings.getPassword()); } }); } @@ -288,7 +289,7 @@ public class GithubUtil { @Override public RepositoryInfo compute() { ProgressManager.getInstance().getProgressIndicator().setText("Extracting detailed info about repository ''" + name + "''"); - return getDetailedRepoInfo(settings.getLogin(), settings.getPassword(), name); + return getDetailedRepoInfo(settings.getHost(), settings.getLogin(), settings.getPassword(), name); } }); } @@ -312,10 +313,11 @@ public class GithubUtil { public static GitRemote findGitHubRemoteBranch(final Project project, final VirtualFile root) { try { // Check that given repository is properly configured git repository + final String host = GithubSettings.getInstance().getHost(); final List gitRemotes = GitRemote.list(project, root); for (GitRemote gitRemote : gitRemotes) { final String pushUrl = gitRemote.pushUrl(); - if (pushUrl.startsWith(GITHUB_HOST) || pushUrl.startsWith(GITHUB_HOST_GIT)) { + if (pushUrl.contains(host)) { return gitRemote; } } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GitHubSettingsConfigurable.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GitHubSettingsConfigurable.java index 334b0b6154bd..8d1319808627 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GitHubSettingsConfigurable.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GitHubSettingsConfigurable.java @@ -42,13 +42,15 @@ public class GitHubSettingsConfigurable implements SearchableConfigurable { public boolean isModified() { return mySettingsPane == null || !mySettings.getLogin().equals(mySettingsPane.getLogin()) || - !mySettings.getPassword().equals(mySettingsPane.getPassword()); + !mySettings.getPassword().equals(mySettingsPane.getPassword()) || + !mySettings.getHost().equals(mySettingsPane.getHost()); } public void apply() throws ConfigurationException { if (mySettingsPane != null) { mySettings.setLogin(mySettingsPane.getLogin()); mySettings.setPassword(mySettingsPane.getPassword()); + mySettings.setHost(mySettingsPane.getHost()); } } @@ -56,6 +58,7 @@ public class GitHubSettingsConfigurable implements SearchableConfigurable { if (mySettingsPane != null) { mySettingsPane.setLogin(mySettings.getLogin()); mySettingsPane.setPassword(mySettings.getPassword()); + mySettingsPane.setHost(mySettings.getHost()); } } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginDialog.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginDialog.java index c21c7577e224..50d364483a7e 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginDialog.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginDialog.java @@ -21,6 +21,7 @@ public class GithubLoginDialog extends DialogWrapper { myProject = project; myGithubLoginPanel = new GithubLoginPanel(this); final GithubSettings settings = GithubSettings.getInstance(); + myGithubLoginPanel.setHost(settings.getHost()); myGithubLoginPanel.setLogin(settings.getLogin()); myGithubLoginPanel.setPassword(settings.getPassword()); setTitle("Login to GitHub"); @@ -51,7 +52,8 @@ public class GithubLoginDialog extends DialogWrapper { protected void doOKAction() { final String login = myGithubLoginPanel.getLogin(); final String password = myGithubLoginPanel.getPassword(); - if (GithubUtil.checkCredentials(myProject, login, password)) { + final String host = myGithubLoginPanel.getHost(); + if (GithubUtil.checkCredentials(myProject, host, login, password)) { final GithubSettings settings = GithubSettings.getInstance(); settings.setLogin(login); settings.setPassword(password); diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.form b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.form index 82e8d8150901..3fc070c35ec8 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.form +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.form @@ -1,16 +1,16 @@
- + - + - + @@ -21,7 +21,7 @@ - + @@ -29,7 +29,7 @@ - + @@ -37,7 +37,7 @@ - + @@ -54,7 +54,7 @@ - + @@ -65,9 +65,28 @@ - + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.java index 9c218088245a..714490cf98a3 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.java @@ -18,7 +18,6 @@ package org.jetbrains.plugins.github.ui; import com.intellij.ide.BrowserUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.HyperlinkAdapter; -import org.jetbrains.plugins.github.GithubUtil; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -34,6 +33,7 @@ public class GithubLoginPanel { private JPasswordField myPasswordField; private JTextPane mySignupTextField; private JPanel myPane; + private JTextField myHostTextField; public GithubLoginPanel(final GithubLoginDialog dialog) { mySignupTextField.addHyperlinkListener(new HyperlinkAdapter() { @@ -43,7 +43,7 @@ public class GithubLoginPanel { } }); mySignupTextField.setText( - "Do not have an account? " + "Sign up" + ""); + "Do not have an account at github.com? " + "Sign up" + ""); mySignupTextField.setBackground(myPane.getBackground()); mySignupTextField.setCursor(new Cursor(Cursor.HAND_CURSOR)); myLoginTextField.getDocument().addDocumentListener(new DocumentAdapter() { @@ -64,6 +64,10 @@ public class GithubLoginPanel { return myPane; } + public void setHost(final String host) { + myHostTextField.setText(host); + } + public void setLogin(final String login) { myLoginTextField.setText(login); } @@ -72,8 +76,12 @@ public class GithubLoginPanel { myPasswordField.setText(password); } + public String getHost() { + return myHostTextField.getText().trim(); + } + public String getLogin() { - return myLoginTextField.getText(); + return myLoginTextField.getText().trim(); } public String getPassword() { diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.form b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.form index fdd82631348d..fdf3087cddd7 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.form +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.form @@ -1,6 +1,6 @@
- + @@ -10,7 +10,7 @@ - + @@ -21,7 +21,7 @@ - + @@ -29,7 +29,7 @@ - + @@ -37,7 +37,7 @@ - + @@ -53,7 +53,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -72,9 +72,28 @@ - + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.java index d027f37bcbf8..a01d35088adf 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.java @@ -37,6 +37,7 @@ public class GithubSettingsPanel { private JTextPane mySignupTextField; private JPanel myPane; private JButton myTestButton; + private JTextField myHostTextField; public GithubSettingsPanel() { mySignupTextField.addHyperlinkListener(new HyperlinkAdapter() { @@ -46,14 +47,14 @@ public class GithubSettingsPanel { } }); mySignupTextField.setText( - "Do not have an account? " + "Sign up" + ""); + "Do not have an account at github.com? " + "Sign up" + ""); mySignupTextField.setBackground(myPane.getBackground()); mySignupTextField.setCursor(new Cursor(Cursor.HAND_CURSOR)); myTestButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final boolean result = GithubUtil.checkCredentials(ProjectManager.getInstance().getDefaultProject(), getLogin(), getPassword()); - Messages.showInfoMessage(result ? "Connection successful" : "Cannot login using given credentials", result ? "Success" : "Fail"); + final boolean result = GithubUtil.checkCredentials(ProjectManager.getInstance().getDefaultProject(), getHost(), getLogin(), getPassword()); + Messages.showInfoMessage(result ? "Connection successful" : "Cannot login to the " + getHost() + " using given credentials", result ? "Success" : "Failure"); } }); } @@ -71,11 +72,19 @@ public class GithubSettingsPanel { } public String getLogin() { - return myLoginTextField.getText(); + return myLoginTextField.getText().trim(); } public String getPassword() { return String.valueOf(myPasswordField.getPassword()); } + + public void setHost(final String host) { + myHostTextField.setText(host); + } + + public String getHost() { + return myHostTextField.getText().trim(); + } }