blob: f1104442215413ac40dbfa9c7c12c681c59cadd7 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.github.util;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.github.api.GithubApiUtil;
/**
* Container for authentication data:
* * host
* * credentials
* - login/password pair
* or
* - login/password pair/2 factor code
* or
* - OAuth2 access token
*
* @author Aleksey Pivovarov
*/
public class GithubAuthData {
public enum AuthType {BASIC, TOKEN, ANONYMOUS}
@NotNull private final AuthType myAuthType;
@NotNull private final String myHost;
@Nullable private final BasicAuth myBasicAuth;
@Nullable private final TokenAuth myTokenAuth;
private final boolean myUseProxy;
private GithubAuthData(@NotNull AuthType authType,
@NotNull String host,
@Nullable BasicAuth basicAuth,
@Nullable TokenAuth tokenAuth,
boolean useProxy) {
myAuthType = authType;
myHost = host;
myBasicAuth = basicAuth;
myTokenAuth = tokenAuth;
myUseProxy = useProxy;
}
public static GithubAuthData createFromSettings() {
return GithubSettings.getInstance().getAuthData();
}
public static GithubAuthData createAnonymous() {
return createAnonymous(GithubApiUtil.DEFAULT_GITHUB_HOST);
}
public static GithubAuthData createAnonymous(@NotNull String host) {
return new GithubAuthData(AuthType.ANONYMOUS, host, null, null, true);
}
public static GithubAuthData createBasicAuth(@NotNull String host, @NotNull String login, @NotNull String password) {
return new GithubAuthData(AuthType.BASIC, host, new BasicAuth(login, password), null, true);
}
public static GithubAuthData createBasicAuthTF(@NotNull String host,
@NotNull String login,
@NotNull String password,
@NotNull String code) {
return new GithubAuthData(AuthType.BASIC, host, new BasicAuth(login, password, code), null, true);
}
public static GithubAuthData createTokenAuth(@NotNull String host, @NotNull String token) {
return new GithubAuthData(AuthType.TOKEN, host, null, new TokenAuth(token), true);
}
public static GithubAuthData createTokenAuth(@NotNull String host, @NotNull String token, boolean useProxy) {
return new GithubAuthData(AuthType.TOKEN, host, null, new TokenAuth(token), useProxy);
}
@NotNull
public AuthType getAuthType() {
return myAuthType;
}
@NotNull
public String getHost() {
return myHost;
}
@Nullable
public BasicAuth getBasicAuth() {
return myBasicAuth;
}
@Nullable
public TokenAuth getTokenAuth() {
return myTokenAuth;
}
public boolean isUseProxy() {
return myUseProxy;
}
@NotNull
public GithubAuthData copyWithTwoFactorCode(@NotNull String code) {
if (myBasicAuth == null) {
throw new IllegalStateException("Two factor authentication can be used only with Login/Password");
}
return createBasicAuthTF(getHost(), myBasicAuth.getLogin(), myBasicAuth.getPassword(), code);
}
public static class BasicAuth {
@NotNull private final String myLogin;
@NotNull private final String myPassword;
@Nullable private final String myCode;
private BasicAuth(@NotNull String login, @NotNull String password) {
this(login, password, null);
}
private BasicAuth(@NotNull String login, @NotNull String password, @Nullable String code) {
myLogin = login;
myPassword = password;
myCode = code;
}
@NotNull
public String getLogin() {
return myLogin;
}
@NotNull
public String getPassword() {
return myPassword;
}
@Nullable
public String getCode() {
return myCode;
}
}
public static class TokenAuth {
@NotNull private final String myToken;
private TokenAuth(@NotNull String token) {
myToken = token;
}
@NotNull
public String getToken() {
return myToken;
}
}
}